diff --git a/assets/test.png b/assets/test.png deleted file mode 100644 index 5fcad46f3f..0000000000 Binary files a/assets/test.png and /dev/null differ diff --git a/dimos/models/Detic/.gitignore b/dimos/models/Detic/.gitignore deleted file mode 100644 index b794d988fb..0000000000 --- a/dimos/models/Detic/.gitignore +++ /dev/null @@ -1,62 +0,0 @@ -third_party/detectron2 -./models -configs-experimental -experiments -# output dir -index.html -data/* -slurm/ -slurm -slurm-output -slurm-output/ -output -instant_test_output -inference_test_output - - -*.png -*.diff -*.jpg -!/projects/DensePose/doc/images/*.jpg - -# compilation and distribution -__pycache__ -_ext -*.pyc -*.pyd -*.so -*.dll -*.egg-info/ -build/ -dist/ -wheels/ - -# pytorch/python/numpy formats -*.pth -*.pkl -*.ts -model_ts*.txt - -# ipython/jupyter notebooks -*.ipynb -**/.ipynb_checkpoints/ - -# Editor temporaries -*.swn -*.swo -*.swp -*~ - -# editor settings -.idea -.vscode -_darcs - -# project dirs -/detectron2/model_zoo/configs -/datasets/* -!/datasets/*.* -!/datasets/metadata -/projects/*/datasets -/models -/snippet diff --git a/dimos/models/Detic/.gitmodules b/dimos/models/Detic/.gitmodules deleted file mode 100644 index d945b4731e..0000000000 --- a/dimos/models/Detic/.gitmodules +++ /dev/null @@ -1,6 +0,0 @@ -[submodule "third_party/Deformable-DETR"] - path = third_party/Deformable-DETR - url = https://github.com/fundamentalvision/Deformable-DETR.git -[submodule "third_party/CenterNet2"] - path = third_party/CenterNet2 - url = https://github.com/xingyizhou/CenterNet2.git diff --git a/dimos/models/Detic/CODE_OF_CONDUCT.md b/dimos/models/Detic/CODE_OF_CONDUCT.md deleted file mode 100644 index 0f7ad8bfc1..0000000000 --- a/dimos/models/Detic/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,5 +0,0 @@ -# Code of Conduct - -Facebook has adopted a Code of Conduct that we expect project participants to adhere to. -Please read the [full text](https://code.fb.com/codeofconduct/) -so that you can understand what actions will and will not be tolerated. diff --git a/dimos/models/Detic/CONTRIBUTING.md b/dimos/models/Detic/CONTRIBUTING.md deleted file mode 100644 index 282a20270b..0000000000 --- a/dimos/models/Detic/CONTRIBUTING.md +++ /dev/null @@ -1,39 +0,0 @@ -# Contributing to Detic -We want to make contributing to this project as easy and transparent as -possible. - -## Our Development Process -Minor changes and improvements will be released on an ongoing basis. Larger changes (e.g., changesets implementing a new paper) will be released on a more periodic basis. - -## Pull Requests -We actively welcome your pull requests. - -1. Fork the repo and create your branch from `main`. -2. If you've added code that should be tested, add tests. -3. If you've changed APIs, update the documentation. -4. Ensure the test suite passes. -5. Make sure your code lints. -6. If you haven't already, complete the Contributor License Agreement ("CLA"). - -## Contributor License Agreement ("CLA") -In order to accept your pull request, we need you to submit a CLA. You only need -to do this once to work on any of Facebook's open source projects. - -Complete your CLA here: - -## Issues -We use GitHub issues to track public bugs. Please ensure your description is -clear and has sufficient instructions to be able to reproduce the issue. - -Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe -disclosure of security bugs. In those cases, please go through the process -outlined on that page and do not file a public issue. - -## Coding Style -* 4 spaces for indentation rather than tabs -* 80 character line length -* PEP8 formatting following [Black](https://black.readthedocs.io/en/stable/) - -## License -By contributing to Detic, you agree that your contributions will be licensed -under the LICENSE file in the root directory of this source tree. diff --git a/dimos/models/Detic/LICENSE b/dimos/models/Detic/LICENSE deleted file mode 100644 index cd1b070674..0000000000 --- a/dimos/models/Detic/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by -the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all -other entities that control, are controlled by, or are under common -control with that entity. For the purposes of this definition, -"control" means (i) the power, direct or indirect, to cause the -direction or management of such entity, whether by contract or -otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity -exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation -source, and configuration files. - -"Object" form shall mean any form resulting from mechanical -transformation or translation of a Source form, including but -not limited to compiled object code, generated documentation, -and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a -copyright notice that is included in or attached to the work -(an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object -form, that is based on (or derived from) the Work and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. For the purposes -of this License, Derivative Works shall not include works that remain -separable from, or merely link (or bind by name) to the interfaces of, -the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including -the original version of the Work and any modifications or additions -to that Work or Derivative Works thereof, that is intentionally -submitted to Licensor for inclusion in the Work by the copyright owner -or by an individual or Legal Entity authorized to submit on behalf of -the copyright owner. For the purposes of this definition, "submitted" -means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, -and issue tracking systems that are managed by, or on behalf of, the -Licensor for the purpose of discussing and improving the Work, but -excluding communication that is conspicuously marked or otherwise -designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the -Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -(except as stated in this section) patent license to make, have made, -use, offer to sell, sell, import, and otherwise transfer the Work, -where such license applies only to those patent claims licensable -by such Contributor that are necessarily infringed by their -Contribution(s) alone or by combination of their Contribution(s) -with the Work to which such Contribution(s) was submitted. If You -institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work -or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses -granted to You under this License for that Work shall terminate -as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the -Work or Derivative Works thereof in any medium, with or without -modifications, and in Source or Object form, provided that You -meet the following conditions: - -(a) You must give any other recipients of the Work or -Derivative Works a copy of this License; and - -(b) You must cause any modified files to carry prominent notices -stating that You changed the files; and - -(c) You must retain, in the Source form of any Derivative Works -that You distribute, all copyright, patent, trademark, and -attribution notices from the Source form of the Work, -excluding those notices that do not pertain to any part of -the Derivative Works; and - -(d) If the Work includes a "NOTICE" text file as part of its -distribution, then any Derivative Works that You distribute must -include a readable copy of the attribution notices contained -within such NOTICE file, excluding those notices that do not -pertain to any part of the Derivative Works, in at least one -of the following places: within a NOTICE text file distributed -as part of the Derivative Works; within the Source form or -documentation, if provided along with the Derivative Works; or, -within a display generated by the Derivative Works, if and -wherever such third-party notices normally appear. The contents -of the NOTICE file are for informational purposes only and -do not modify the License. You may add Your own attribution -notices within Derivative Works that You distribute, alongside -or as an addendum to the NOTICE text from the Work, provided -that such additional attribution notices cannot be construed -as modifying the License. - -You may add Your own copyright statement to Your modifications and -may provide additional or different license terms and conditions -for use, reproduction, or distribution of Your modifications, or -for any such Derivative Works as a whole, provided Your use, -reproduction, and distribution of the Work otherwise complies with -the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, -any Contribution intentionally submitted for inclusion in the Work -by You to the Licensor shall be under the terms and conditions of -this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify -the terms of any separate license agreement you may have executed -with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade -names, trademarks, service marks, or product names of the Licensor, -except as required for reasonable and customary use in describing the -origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or -agreed to in writing, Licensor provides the Work (and each -Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -implied, including, without limitation, any warranties or conditions -of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any -risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, -whether in tort (including negligence), contract, or otherwise, -unless required by applicable law (such as deliberate and grossly -negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, -incidental, or consequential damages of any character arising as a -result of this License or out of the use or inability to use the -Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all -other commercial damages or losses), even if such Contributor -has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing -the Work or Derivative Works thereof, You may choose to offer, -and charge a fee for, acceptance of support, warranty, indemnity, -or other liability obligations and/or rights consistent with this -License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf -of any other Contributor, and only if You agree to indemnify, -defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason -of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following -boilerplate notice, with the fields enclosed by brackets "[]" -replaced with your own identifying information. (Don't include -the brackets!) The text should be enclosed in the appropriate -comment syntax for the file format. We also recommend that a -file or class name and description of purpose be included on the -same "printed page" as the copyright notice for easier -identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/dimos/models/Detic/README.md b/dimos/models/Detic/README.md deleted file mode 100644 index 3a1285cbc9..0000000000 --- a/dimos/models/Detic/README.md +++ /dev/null @@ -1,116 +0,0 @@ -# Detecting Twenty-thousand Classes using Image-level Supervision - -**Detic**: A **Det**ector with **i**mage **c**lasses that can use image-level labels to easily train detectors. - -

- -> [**Detecting Twenty-thousand Classes using Image-level Supervision**](http://arxiv.org/abs/2201.02605), -> Xingyi Zhou, Rohit Girdhar, Armand Joulin, Philipp Krähenbühl, Ishan Misra, -> *ECCV 2022 ([arXiv 2201.02605](http://arxiv.org/abs/2201.02605))* - - -## Features - -- Detects **any** class given class names (using [CLIP](https://github.com/openai/CLIP)). - -- We train the detector on ImageNet-21K dataset with 21K classes. - -- Cross-dataset generalization to OpenImages and Objects365 **without finetuning**. - -- State-of-the-art results on Open-vocabulary LVIS and Open-vocabulary COCO. - -- Works for DETR-style detectors. - - -## Installation - -See [installation instructions](docs/INSTALL.md). - -## Demo - -**Update April 2022**: we released more real-time models [here](docs/MODEL_ZOO.md#real-time-models). - -Replicate web demo and docker image: [![Replicate](https://replicate.com/facebookresearch/detic/badge)](https://replicate.com/facebookresearch/detic) - - -Integrated into [Huggingface Spaces šŸ¤—](https://huggingface.co/spaces) using [Gradio](https://github.com/gradio-app/gradio). Try out the web demo: [![Hugging Face Spaces](https://img.shields.io/badge/%F0%9F%A4%97%20Hugging%20Face-Spaces-blue)](https://huggingface.co/spaces/akhaliq/Detic) - -Run our demo using Colab (no GPU needed): [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/drive/1QtTW9-ukX2HKZGvt0QvVGqjuqEykoZKI) - -We use the default detectron2 [demo interface](https://github.com/facebookresearch/detectron2/blob/main/GETTING_STARTED.md). -For example, to run our [21K model](docs/MODEL_ZOO.md#cross-dataset-evaluation) on a [messy desk image](https://web.eecs.umich.edu/~fouhey/fun/desk/desk.jpg) (image credit [David Fouhey](https://web.eecs.umich.edu/~fouhey)) with the lvis vocabulary, run - -~~~ -mkdir models -wget https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth -O models/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth -wget https://eecs.engin.umich.edu/~fouhey/fun/desk/desk.jpg -python demo.py --config-file configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml --input desk.jpg --output out.jpg --vocabulary lvis --opts MODEL.WEIGHTS models/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth -~~~ - -If setup correctly, the output should look like: - -

- -The same model can run with other vocabularies (COCO, OpenImages, or Objects365), or a **custom vocabulary**. For example: - -~~~ -python demo.py --config-file configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml --input desk.jpg --output out2.jpg --vocabulary custom --custom_vocabulary headphone,webcam,paper,coffe --confidence-threshold 0.3 --opts MODEL.WEIGHTS models/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth -~~~ - -The output should look like: - -

- -Note that `headphone`, `paper` and `coffe` (typo intended) are **not** LVIS classes. Despite the misspelled class name, our detector can produce a reasonable detection for `coffe`. - -## Benchmark evaluation and training - -Please first [prepare datasets](datasets/README.md), then check our [MODEL ZOO](docs/MODEL_ZOO.md) to reproduce results in our paper. We highlight key results below: - -- Open-vocabulary LVIS - - | | mask mAP | mask mAP_novel | - |-----------------------|-----------|-----------------| - |Box-Supervised | 30.2 | 16.4 | - |Detic | 32.4 | 24.9 | - -- Standard LVIS - - | | Detector/ Backbone | mask mAP | mask mAP_rare | - |-----------------------|----------|-----------|-----------------| - |Box-Supervised | CenterNet2-ResNet50 | 31.5 | 25.6 | - |Detic | CenterNet2-ResNet50 | 33.2 | 29.7 | - |Box-Supervised | CenterNet2-SwinB | 40.7 | 35.9 | - |Detic | CenterNet2-SwinB | 41.7 | 41.7 | - - | | Detector/ Backbone | box mAP | box mAP_rare | - |-----------------------|----------|-----------|-----------------| - |Box-Supervised | DeformableDETR-ResNet50 | 31.7 | 21.4 | - |Detic | DeformableDETR-ResNet50 | 32.5 | 26.2 | - -- Cross-dataset generalization - - | | Backbone | Objects365 box mAP | OpenImages box mAP50 | - |-----------------------|----------|-----------|-----------------| - |Box-Supervised | SwinB | 19.1 | 46.2 | - |Detic | SwinB | 21.4 | 55.2 | - - -## License - -The majority of Detic is licensed under the [Apache 2.0 license](LICENSE), however portions of the project are available under separate license terms: SWIN-Transformer, CLIP, and TensorFlow Object Detection API are licensed under the MIT license; UniDet is licensed under the Apache 2.0 license; and the LVIS API is licensed under a [custom license](https://github.com/lvis-dataset/lvis-api/blob/master/LICENSE). If you later add other third party code, please keep this license info updated, and please let us know if that component is licensed under something other than CC-BY-NC, MIT, or CC0 - -## Ethical Considerations -Detic's wide range of detection capabilities may introduce similar challenges to many other visual recognition and open-set recognition methods. -As the user can define arbitrary detection classes, class design and semantics may impact the model output. - -## Citation - -If you find this project useful for your research, please use the following BibTeX entry. - - @inproceedings{zhou2022detecting, - title={Detecting Twenty-thousand Classes using Image-level Supervision}, - author={Zhou, Xingyi and Girdhar, Rohit and Joulin, Armand and Kr{\"a}henb{\"u}hl, Philipp and Misra, Ishan}, - booktitle={ECCV}, - year={2022} - } diff --git a/dimos/models/Detic/cog.yaml b/dimos/models/Detic/cog.yaml deleted file mode 100644 index 3c8a94941e..0000000000 --- a/dimos/models/Detic/cog.yaml +++ /dev/null @@ -1,28 +0,0 @@ -build: - gpu: true - cuda: "10.1" - python_version: "3.8" - system_packages: - - "libgl1-mesa-glx" - - "libglib2.0-0" - python_packages: - - "ipython==7.30.1" - - "numpy==1.21.4" - - "torch==1.8.1" - - "torchvision==0.9.1" - - "dataclasses==0.6" - - "opencv-python==4.5.5.62" - - "imageio==2.9.0" - - "ftfy==6.0.3" - - "regex==2021.10.8" - - "tqdm==4.62.3" - - "timm==0.4.12" - - "fasttext==0.9.2" - - "scikit-learn==1.0.2" - - "lvis==0.5.3" - - "nltk==3.6.7" - - "git+https://github.com/openai/CLIP.git" - run: - - pip install detectron2 -f https://dl.fbaipublicfiles.com/detectron2/wheels/cu101/torch1.8/index.html - -predict: "predict.py:Predictor" diff --git a/dimos/models/Detic/configs/Base-C2_L_R5021k_640b64_4x.yaml b/dimos/models/Detic/configs/Base-C2_L_R5021k_640b64_4x.yaml deleted file mode 100644 index eb3c3c0f3b..0000000000 --- a/dimos/models/Detic/configs/Base-C2_L_R5021k_640b64_4x.yaml +++ /dev/null @@ -1,82 +0,0 @@ -MODEL: - META_ARCHITECTURE: "CustomRCNN" - MASK_ON: True - PROPOSAL_GENERATOR: - NAME: "CenterNet" - WEIGHTS: "models/resnet50_miil_21k.pkl" - BACKBONE: - NAME: build_p67_timm_fpn_backbone - TIMM: - BASE_NAME: resnet50_in21k - FPN: - IN_FEATURES: ["layer3", "layer4", "layer5"] - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.12, 57.375] - ROI_HEADS: - NAME: DeticCascadeROIHeads - IN_FEATURES: ["p3", "p4", "p5"] - IOU_THRESHOLDS: [0.6] - NUM_CLASSES: 1203 - SCORE_THRESH_TEST: 0.02 - NMS_THRESH_TEST: 0.5 - ROI_BOX_CASCADE_HEAD: - IOUS: [0.6, 0.7, 0.8] - ROI_BOX_HEAD: - NAME: "FastRCNNConvFCHead" - NUM_FC: 2 - POOLER_RESOLUTION: 7 - CLS_AGNOSTIC_BBOX_REG: True - MULT_PROPOSAL_SCORE: True - - USE_SIGMOID_CE: True - USE_FED_LOSS: True - ROI_MASK_HEAD: - NAME: "MaskRCNNConvUpsampleHead" - NUM_CONV: 4 - POOLER_RESOLUTION: 14 - CLS_AGNOSTIC_MASK: True - CENTERNET: - NUM_CLASSES: 1203 - REG_WEIGHT: 1. - NOT_NORM_REG: True - ONLY_PROPOSAL: True - WITH_AGN_HM: True - INFERENCE_TH: 0.0001 - PRE_NMS_TOPK_TRAIN: 4000 - POST_NMS_TOPK_TRAIN: 2000 - PRE_NMS_TOPK_TEST: 1000 - POST_NMS_TOPK_TEST: 256 - NMS_TH_TRAIN: 0.9 - NMS_TH_TEST: 0.9 - POS_WEIGHT: 0.5 - NEG_WEIGHT: 0.5 - IGNORE_HIGH_FP: 0.85 -DATASETS: - TRAIN: ("lvis_v1_train",) - TEST: ("lvis_v1_val",) -DATALOADER: - SAMPLER_TRAIN: "RepeatFactorTrainingSampler" - REPEAT_THRESHOLD: 0.001 - NUM_WORKERS: 8 -TEST: - DETECTIONS_PER_IMAGE: 300 -SOLVER: - LR_SCHEDULER_NAME: "WarmupCosineLR" - CHECKPOINT_PERIOD: 1000000000 - WARMUP_ITERS: 10000 - WARMUP_FACTOR: 0.0001 - USE_CUSTOM_SOLVER: True - OPTIMIZER: "ADAMW" - MAX_ITER: 90000 - IMS_PER_BATCH: 64 - BASE_LR: 0.0002 - CLIP_GRADIENTS: - ENABLED: True -INPUT: - FORMAT: RGB - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 640 -OUTPUT_DIR: "./output/Detic/auto" -EVAL_PROPOSAL_AR: False -VERSION: 2 -FP16: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Base-DeformDETR_L_R50_4x.yaml b/dimos/models/Detic/configs/Base-DeformDETR_L_R50_4x.yaml deleted file mode 100644 index a689ee5bf3..0000000000 --- a/dimos/models/Detic/configs/Base-DeformDETR_L_R50_4x.yaml +++ /dev/null @@ -1,59 +0,0 @@ -MODEL: - META_ARCHITECTURE: "DeformableDetr" - WEIGHTS: "detectron2://ImageNetPretrained/torchvision/R-50.pkl" - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.120, 57.375] - MASK_ON: False - RESNETS: - DEPTH: 50 - STRIDE_IN_1X1: False - OUT_FEATURES: ["res3", "res4", "res5"] - DETR: - CLS_WEIGHT: 2.0 - GIOU_WEIGHT: 2.0 - L1_WEIGHT: 5.0 - NUM_OBJECT_QUERIES: 300 - DIM_FEEDFORWARD: 1024 - WITH_BOX_REFINE: True - TWO_STAGE: True - NUM_CLASSES: 1203 - USE_FED_LOSS: True -DATASETS: - TRAIN: ("lvis_v1_train",) - TEST: ("lvis_v1_val",) -SOLVER: - CHECKPOINT_PERIOD: 10000000 - USE_CUSTOM_SOLVER: True - IMS_PER_BATCH: 32 - BASE_LR: 0.0002 - STEPS: (150000,) - MAX_ITER: 180000 - WARMUP_FACTOR: 1.0 - WARMUP_ITERS: 10 - WEIGHT_DECAY: 0.0001 - OPTIMIZER: "ADAMW" - BACKBONE_MULTIPLIER: 0.1 - CLIP_GRADIENTS: - ENABLED: True - CLIP_TYPE: "full_model" - CLIP_VALUE: 0.01 - NORM_TYPE: 2.0 - CUSTOM_MULTIPLIER: 0.1 - CUSTOM_MULTIPLIER_NAME: ['reference_points', 'sampling_offsets'] -INPUT: - FORMAT: "RGB" - MIN_SIZE_TRAIN: (480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800) - CROP: - ENABLED: True - TYPE: "absolute_range" - SIZE: (384, 600) - CUSTOM_AUG: "DETR" -TEST: - DETECTIONS_PER_IMAGE: 300 -DATALOADER: - FILTER_EMPTY_ANNOTATIONS: False - NUM_WORKERS: 4 - SAMPLER_TRAIN: "RepeatFactorTrainingSampler" - REPEAT_THRESHOLD: 0.001 -OUTPUT_DIR: "output/Detic/auto" -VERSION: 2 \ No newline at end of file diff --git a/dimos/models/Detic/configs/Base_OVCOCO_C4_1x.yaml b/dimos/models/Detic/configs/Base_OVCOCO_C4_1x.yaml deleted file mode 100644 index 189d03cf58..0000000000 --- a/dimos/models/Detic/configs/Base_OVCOCO_C4_1x.yaml +++ /dev/null @@ -1,31 +0,0 @@ -MODEL: - META_ARCHITECTURE: "CustomRCNN" - RPN: - PRE_NMS_TOPK_TEST: 6000 - POST_NMS_TOPK_TEST: 1000 - ROI_HEADS: - NAME: "CustomRes5ROIHeads" - WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" - RESNETS: - DEPTH: 50 - ROI_BOX_HEAD: - CLS_AGNOSTIC_BBOX_REG: True - USE_SIGMOID_CE: True - USE_ZEROSHOT_CLS: True - ZEROSHOT_WEIGHT_PATH: 'datasets/metadata/coco_clip_a+cname.npy' - IGNORE_ZERO_CATS: True - CAT_FREQ_PATH: 'datasets/coco/zero-shot/instances_train2017_seen_2_oriorder_cat_info.json' -DATASETS: - TRAIN: ("coco_zeroshot_train_oriorder",) - TEST: ("coco_generalized_zeroshot_val",) -SOLVER: - IMS_PER_BATCH: 16 - BASE_LR: 0.02 - STEPS: (60000, 80000) - MAX_ITER: 90000 - CHECKPOINT_PERIOD: 1000000000 -INPUT: - MIN_SIZE_TRAIN: (800,) -VERSION: 2 -OUTPUT_DIR: output/Detic-COCO/auto -FP16: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_CXT21k_640b32_4x.yaml b/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_CXT21k_640b32_4x.yaml deleted file mode 100644 index 7064a02100..0000000000 --- a/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_CXT21k_640b32_4x.yaml +++ /dev/null @@ -1,17 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - WEIGHTS: '' - TIMM: - BASE_NAME: convnext_tiny_21k - OUT_LEVELS: [2, 3, 4] - PRETRAINED: True - FPN: - IN_FEATURES: ["layer2", "layer3", "layer4"] -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 -DATASETS: - TRAIN: ("lvis_v1_train+coco",) \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_R18_640b32_4x.yaml b/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_R18_640b32_4x.yaml deleted file mode 100644 index 07535ee960..0000000000 --- a/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_R18_640b32_4x.yaml +++ /dev/null @@ -1,14 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - WEIGHTS: '' - TIMM: - BASE_NAME: resnet18 - PRETRAINED: True -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 -DATASETS: - TRAIN: ("lvis_v1_train+coco",) \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_R5021k_640b64_4x.yaml b/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_R5021k_640b64_4x.yaml deleted file mode 100644 index 8b5ae72d95..0000000000 --- a/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_R5021k_640b64_4x.yaml +++ /dev/null @@ -1,6 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True -DATASETS: - TRAIN: ("lvis_v1_train+coco",) \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_SwinB_896b32_4x.yaml b/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_SwinB_896b32_4x.yaml deleted file mode 100644 index 39ee45ac96..0000000000 --- a/dimos/models/Detic/configs/BoxSup-C2_LCOCO_CLIP_SwinB_896b32_4x.yaml +++ /dev/null @@ -1,19 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - WEIGHTS: "models/swin_base_patch4_window7_224_22k.pkl" - BACKBONE: - NAME: build_swintransformer_fpn_backbone - SWIN: - SIZE: B-22k - FPN: - IN_FEATURES: ["swin1", "swin2", "swin3"] -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 -INPUT: - TRAIN_SIZE: 896 -DATASETS: - TRAIN: ("lvis_v1_train+coco",) \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-C2_L_CLIP_R5021k_640b64_4x.yaml b/dimos/models/Detic/configs/BoxSup-C2_L_CLIP_R5021k_640b64_4x.yaml deleted file mode 100644 index 91a25ee2ad..0000000000 --- a/dimos/models/Detic/configs/BoxSup-C2_L_CLIP_R5021k_640b64_4x.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-C2_L_CLIP_SwinB_896b32_4x.yaml b/dimos/models/Detic/configs/BoxSup-C2_L_CLIP_SwinB_896b32_4x.yaml deleted file mode 100644 index bf6e93a830..0000000000 --- a/dimos/models/Detic/configs/BoxSup-C2_L_CLIP_SwinB_896b32_4x.yaml +++ /dev/null @@ -1,17 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - WEIGHTS: "models/swin_base_patch4_window7_224_22k.pkl" - BACKBONE: - NAME: build_swintransformer_fpn_backbone - SWIN: - SIZE: B-22k - FPN: - IN_FEATURES: ["swin1", "swin2", "swin3"] -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 -INPUT: - TRAIN_SIZE: 896 \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.yaml b/dimos/models/Detic/configs/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.yaml deleted file mode 100644 index a4d73a060f..0000000000 --- a/dimos/models/Detic/configs/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.yaml +++ /dev/null @@ -1,6 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True -DATASETS: - TRAIN: ("lvis_v1_train_norare",) \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-C2_Lbase_CLIP_SwinB_896b32_4x.yaml b/dimos/models/Detic/configs/BoxSup-C2_Lbase_CLIP_SwinB_896b32_4x.yaml deleted file mode 100644 index f271ac558c..0000000000 --- a/dimos/models/Detic/configs/BoxSup-C2_Lbase_CLIP_SwinB_896b32_4x.yaml +++ /dev/null @@ -1,19 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - WEIGHTS: "models/swin_base_patch4_window7_224_22k.pkl" - BACKBONE: - NAME: build_swintransformer_fpn_backbone - SWIN: - SIZE: B-22k - FPN: - IN_FEATURES: ["swin1", "swin2", "swin3"] -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 -INPUT: - TRAIN_SIZE: 896 -DATASETS: - TRAIN: ("lvis_v1_train_norare",) \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-DeformDETR_L_R50_2x.yaml b/dimos/models/Detic/configs/BoxSup-DeformDETR_L_R50_2x.yaml deleted file mode 100644 index aed66e1fba..0000000000 --- a/dimos/models/Detic/configs/BoxSup-DeformDETR_L_R50_2x.yaml +++ /dev/null @@ -1,3 +0,0 @@ -_BASE_: "Base-DeformDETR_L_R50_4x.yaml" -SOLVER: - IMS_PER_BATCH: 16 \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup-DeformDETR_L_R50_4x.yaml b/dimos/models/Detic/configs/BoxSup-DeformDETR_L_R50_4x.yaml deleted file mode 100644 index a5ee4566ff..0000000000 --- a/dimos/models/Detic/configs/BoxSup-DeformDETR_L_R50_4x.yaml +++ /dev/null @@ -1 +0,0 @@ -_BASE_: "Base-DeformDETR_L_R50_4x.yaml" \ No newline at end of file diff --git a/dimos/models/Detic/configs/BoxSup_OVCOCO_CLIP_R50_1x.yaml b/dimos/models/Detic/configs/BoxSup_OVCOCO_CLIP_R50_1x.yaml deleted file mode 100644 index b6c977fbac..0000000000 --- a/dimos/models/Detic/configs/BoxSup_OVCOCO_CLIP_R50_1x.yaml +++ /dev/null @@ -1 +0,0 @@ -_BASE_: "Base_OVCOCO_C4_1x.yaml" diff --git a/dimos/models/Detic/configs/BoxSup_ViLD_200e.py b/dimos/models/Detic/configs/BoxSup_ViLD_200e.py deleted file mode 100644 index b189c7b54f..0000000000 --- a/dimos/models/Detic/configs/BoxSup_ViLD_200e.py +++ /dev/null @@ -1,108 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import os - -from detectron2.config import LazyCall as L -from detectron2.data.samplers import RepeatFactorTrainingSampler -import detectron2.data.transforms as T -from detectron2.evaluation.lvis_evaluation import LVISEvaluator -from detectron2.layers import ShapeSpec -from detectron2.layers.batch_norm import NaiveSyncBatchNorm -from detectron2.model_zoo import get_config -from detectron2.modeling.box_regression import Box2BoxTransform -from detectron2.modeling.matcher import Matcher -from detectron2.modeling.roi_heads import FastRCNNConvFCHead -from detectron2.solver import WarmupParamScheduler -from detectron2.solver.build import get_default_optimizer_params -from detic.modeling.roi_heads.detic_fast_rcnn import DeticFastRCNNOutputLayers -from detic.modeling.roi_heads.detic_roi_heads import DeticCascadeROIHeads -from detic.modeling.roi_heads.zero_shot_classifier import ZeroShotClassifier -from fvcore.common.param_scheduler import CosineParamScheduler -import torch - -default_configs = get_config("new_baselines/mask_rcnn_R_50_FPN_100ep_LSJ.py") -dataloader = default_configs["dataloader"] -model = default_configs["model"] -train = default_configs["train"] - -[model.roi_heads.pop(k) for k in ["box_head", "box_predictor", "proposal_matcher"]] - -model.roi_heads.update( - _target_=DeticCascadeROIHeads, - num_classes=1203, - box_heads=[ - L(FastRCNNConvFCHead)( - input_shape=ShapeSpec(channels=256, height=7, width=7), - conv_dims=[256, 256, 256, 256], - fc_dims=[1024], - conv_norm=lambda c: NaiveSyncBatchNorm(c, stats_mode="N"), - ) - for _ in range(1) - ], - box_predictors=[ - L(DeticFastRCNNOutputLayers)( - input_shape=ShapeSpec(channels=1024), - test_score_thresh=0.0001, - test_topk_per_image=300, - box2box_transform=L(Box2BoxTransform)(weights=(w1, w1, w2, w2)), - cls_agnostic_bbox_reg=True, - num_classes="${...num_classes}", - cls_score=L(ZeroShotClassifier)( - input_shape=ShapeSpec(channels=1024), - num_classes=1203, - zs_weight_path="datasets/metadata/lvis_v1_clip_a+cname.npy", - norm_weight=True, - # use_bias=-4.6, - ), - use_zeroshot_cls=True, - use_sigmoid_ce=True, - ignore_zero_cats=True, - cat_freq_path="datasets/lvis/lvis_v1_train_norare_cat_info.json", - ) - for (w1, w2) in [(10, 5)] - ], - proposal_matchers=[ - L(Matcher)(thresholds=[th], labels=[0, 1], allow_low_quality_matches=False) for th in [0.5] - ], -) -model.roi_heads.mask_head.num_classes = 1 - -dataloader.train.dataset.names = "lvis_v1_train_norare" -dataloader.train.sampler = L(RepeatFactorTrainingSampler)( - repeat_factors=L(RepeatFactorTrainingSampler.repeat_factors_from_category_frequency)( - dataset_dicts="${dataloader.train.dataset}", repeat_thresh=0.001 - ) -) -image_size = 896 -dataloader.train.mapper.augmentations = [ - L(T.ResizeScale)( - min_scale=0.1, max_scale=2.0, target_height=image_size, target_width=image_size - ), - L(T.FixedSizeCrop)(crop_size=(image_size, image_size)), - L(T.RandomFlip)(horizontal=True), -] -dataloader.train.num_workers = 32 - -dataloader.test.dataset.names = "lvis_v1_val" -dataloader.evaluator = L(LVISEvaluator)( - dataset_name="${..test.dataset.names}", -) - -num_nodes = 4 - -dataloader.train.total_batch_size = 64 * num_nodes -train.max_iter = 184375 * 2 // num_nodes - -lr_multiplier = L(WarmupParamScheduler)( - scheduler=CosineParamScheduler(1.0, 0.0), - warmup_length=500 / train.max_iter, - warmup_factor=0.067, -) - -optimizer = L(torch.optim.AdamW)( - params=L(get_default_optimizer_params)(weight_decay_norm=0.0), - lr=0.0002 * num_nodes, - weight_decay=1e-4, -) - -train.checkpointer.period = 20000 // num_nodes -train.output_dir = f"./output/Lazy/{os.path.basename(__file__)[:-3]}" diff --git a/dimos/models/Detic/configs/Detic_DeformDETR_LI_R50_4x_ft4x.yaml b/dimos/models/Detic/configs/Detic_DeformDETR_LI_R50_4x_ft4x.yaml deleted file mode 100644 index 2da679cd4a..0000000000 --- a/dimos/models/Detic/configs/Detic_DeformDETR_LI_R50_4x_ft4x.yaml +++ /dev/null @@ -1,22 +0,0 @@ -_BASE_: "Base-DeformDETR_L_R50_4x.yaml" -MODEL: - WEIGHTS: "models/BoxSup-DeformDETR_L_R50_4x.pth" -INPUT: - CUSTOM_AUG: ResizeShortestEdge - MIN_SIZE_TRAIN_SAMPLING: range - MIN_SIZE_TRAIN: [480, 800] -DATASETS: - TRAIN: ("lvis_v1_train","imagenet_lvis_v1") - TEST: ("lvis_v1_val",) -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [4, 16] - USE_RFS: [True, False] - DATASET_MIN_SIZES: [[480, 800], [240, 400]] - DATASET_MAX_SIZES: [1333, 667] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] -WITH_IMAGE_LABELS: True diff --git a/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_CXT21k_640b32_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_CXT21k_640b32_4x_ft4x_max-size.yaml deleted file mode 100644 index 8c5befdbdc..0000000000 --- a/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_CXT21k_640b32_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,39 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - DYNAMIC_CLASSIFIER: True - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - ZEROSHOT_WEIGHT_PATH: 'datasets/metadata/lvis-21k_clip_a+cname.npy' - USE_FED_LOSS: False # Federated loss is enabled when DYNAMIC_CLASSIFIER is on - ROI_HEADS: - NUM_CLASSES: 22047 - WEIGHTS: "output/Detic/BoxSup-C2_LCOCO_CLIP_CXT21k_640b32_4x/model_final.pth" - TIMM: - BASE_NAME: convnext_tiny_21k - OUT_LEVELS: [2, 3, 4] - PRETRAINED: True - FPN: - IN_FEATURES: ["layer2", "layer3", "layer4"] -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train+coco","imagenet_lvis-22k") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [4, 16] - DATASET_INPUT_SIZE: [640, 320] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 2 - USE_TAR_DATASET: True -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_R18_640b32_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_R18_640b32_4x_ft4x_max-size.yaml deleted file mode 100644 index e57e579dfd..0000000000 --- a/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_R18_640b32_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,36 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - DYNAMIC_CLASSIFIER: True - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - ZEROSHOT_WEIGHT_PATH: 'datasets/metadata/lvis-21k_clip_a+cname.npy' - USE_FED_LOSS: False # Federated loss is enabled when DYNAMIC_CLASSIFIER is on - ROI_HEADS: - NUM_CLASSES: 22047 - WEIGHTS: "output/Detic/BoxSup-C2_LCOCO_CLIP_R18_640b64_4x/model_final.pth" - TIMM: - BASE_NAME: resnet18 - PRETRAINED: True -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train+coco","imagenet_lvis-22k") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [4, 16] - DATASET_INPUT_SIZE: [640, 320] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 2 - USE_TAR_DATASET: True -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_R5021k_640b32_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_R5021k_640b32_4x_ft4x_max-size.yaml deleted file mode 100644 index 3d71d29c2f..0000000000 --- a/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_R5021k_640b32_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,33 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - DYNAMIC_CLASSIFIER: True - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - ZEROSHOT_WEIGHT_PATH: 'datasets/metadata/lvis-21k_clip_a+cname.npy' - USE_FED_LOSS: False # Federated loss is enabled when DYNAMIC_CLASSIFIER is on - ROI_HEADS: - NUM_CLASSES: 22047 - WEIGHTS: "output/Detic/BoxSup-C2_LCOCO_CLIP_R5021k_640b64_4x/model_final.pth" -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train+coco","imagenet_lvis-22k") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [4, 16] - DATASET_INPUT_SIZE: [640, 320] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 2 - USE_TAR_DATASET: True -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml deleted file mode 100644 index a3dba8d072..0000000000 --- a/dimos/models/Detic/configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,43 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - WEIGHTS: "models/BoxSup-C2_LCOCO_CLIP_SwinB_896b32_4x.pth" - DYNAMIC_CLASSIFIER: True - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - ZEROSHOT_WEIGHT_PATH: 'datasets/metadata/lvis-21k_clip_a+cname.npy' - USE_FED_LOSS: False # Federated loss is enabled when DYNAMIC_CLASSIFIER is on - ROI_HEADS: - NUM_CLASSES: 22047 - BACKBONE: - NAME: build_swintransformer_fpn_backbone - SWIN: - SIZE: B-22k - FPN: - IN_FEATURES: ["swin1", "swin2", "swin3"] - RESET_CLS_TESTS: True - TEST_CLASSIFIERS: ("datasets/metadata/oid_clip_a+cname.npy","datasets/metadata/o365_clip_a+cnamefix.npy") - TEST_NUM_CLASSES: [500, 365] -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train+coco","imagenet_lvis-22k") - TEST: ('oid_val_expanded', 'objects365_v2_val') -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 16] - USE_DIFF_BS_SIZE: True - DATASET_BS: [4, 16] - DATASET_INPUT_SIZE: [896, 448] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 4 - USE_TAR_DATASET: True -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml deleted file mode 100644 index 3b8633caac..0000000000 --- a/dimos/models/Detic/configs/Detic_LI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,43 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - WEIGHTS: "models/BoxSup-C2_L_CLIP_SwinB_896b32_4x.pth" - DYNAMIC_CLASSIFIER: True - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - ZEROSHOT_WEIGHT_PATH: 'datasets/metadata/lvis-21k_clip_a+cname.npy' - USE_FED_LOSS: False # Federated loss is enabled when DYNAMIC_CLASSIFIER is on - ROI_HEADS: - NUM_CLASSES: 22047 - BACKBONE: - NAME: build_swintransformer_fpn_backbone - SWIN: - SIZE: B-22k - FPN: - IN_FEATURES: ["swin1", "swin2", "swin3"] - RESET_CLS_TESTS: True - TEST_CLASSIFIERS: ("datasets/metadata/oid_clip_a+cname.npy","datasets/metadata/o365_clip_a+cnamefix.npy") - TEST_NUM_CLASSES: [500, 365] -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train","imagenet_lvis-22k") - TEST: ('oid_val_expanded', 'objects365_v2_val') -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 16] - USE_DIFF_BS_SIZE: True - DATASET_BS: [4, 16] - DATASET_INPUT_SIZE: [896, 448] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 4 - USE_TAR_DATASET: True -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LI_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LI_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml deleted file mode 100644 index ca93318e64..0000000000 --- a/dimos/models/Detic/configs/Detic_LI_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,27 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - WEIGHTS: "models/BoxSup-C2_L_CLIP_R5021k_640b64_4x.pth" -SOLVER: - MAX_ITER: 90000 - IMS_PER_BATCH: 64 - BASE_LR: 0.0002 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train","imagenet_lvis_v1") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [8, 32] - DATASET_INPUT_SIZE: [640, 320] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml deleted file mode 100644 index 57ffa48ce6..0000000000 --- a/dimos/models/Detic/configs/Detic_LI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,33 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - BACKBONE: - NAME: build_swintransformer_fpn_backbone - SWIN: - SIZE: B-22k - FPN: - IN_FEATURES: ["swin1", "swin2", "swin3"] - WEIGHTS: "models/BoxSup-C2_L_CLIP_SwinB_896b32_4x.pth" -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train","imagenet_lvis_v1") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [4, 16] - DATASET_INPUT_SIZE: [896, 448] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LbaseCCcapimg_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LbaseCCcapimg_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml deleted file mode 100644 index ada6ffed06..0000000000 --- a/dimos/models/Detic/configs/Detic_LbaseCCcapimg_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,30 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - WITH_CAPTION: True - SYNC_CAPTION_BATCH: True - ROI_BOX_HEAD: - ADD_IMAGE_BOX: True # caption loss is added to the image-box - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - WEIGHTS: "models/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.pth" -SOLVER: - MAX_ITER: 90000 - IMS_PER_BATCH: 64 - BASE_LR: 0.0002 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train_norare","cc3m_v1_train_tags") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [8, 32] - DATASET_INPUT_SIZE: [640, 320] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'captiontag'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LbaseCCimg_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LbaseCCimg_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml deleted file mode 100644 index aadcbc0ccd..0000000000 --- a/dimos/models/Detic/configs/Detic_LbaseCCimg_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,27 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - WEIGHTS: "models/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.pth" -SOLVER: - MAX_ITER: 90000 - IMS_PER_BATCH: 64 - BASE_LR: 0.0002 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train_norare","cc3m_v1_train_tags") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [8, 32] - DATASET_INPUT_SIZE: [640, 320] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LbaseI_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LbaseI_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml deleted file mode 100644 index 3ef1e9a02a..0000000000 --- a/dimos/models/Detic/configs/Detic_LbaseI_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,27 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - WEIGHTS: "models/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.pth" -SOLVER: - MAX_ITER: 90000 - IMS_PER_BATCH: 64 - BASE_LR: 0.0002 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train_norare","imagenet_lvis_v1") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [8, 32] - DATASET_INPUT_SIZE: [640, 320] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LbaseI_CLIP_R5021k_640b64_4x_ft4x_predicted.yaml b/dimos/models/Detic/configs/Detic_LbaseI_CLIP_R5021k_640b64_4x_ft4x_predicted.yaml deleted file mode 100644 index 9d6f1b350f..0000000000 --- a/dimos/models/Detic/configs/Detic_LbaseI_CLIP_R5021k_640b64_4x_ft4x_predicted.yaml +++ /dev/null @@ -1,27 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_score' - WEIGHTS: "models/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.pth" -SOLVER: - MAX_ITER: 90000 - IMS_PER_BATCH: 64 - BASE_LR: 0.0002 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train_norare","imagenet_lvis_v1") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [8, 32] - DATASET_INPUT_SIZE: [640, 320] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_LbaseI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml b/dimos/models/Detic/configs/Detic_LbaseI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml deleted file mode 100644 index b25e2b6651..0000000000 --- a/dimos/models/Detic/configs/Detic_LbaseI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml +++ /dev/null @@ -1,33 +0,0 @@ -_BASE_: "Base-C2_L_R5021k_640b64_4x.yaml" -MODEL: - ROI_BOX_HEAD: - USE_ZEROSHOT_CLS: True - IMAGE_LABEL_LOSS: 'max_size' - BACKBONE: - NAME: build_swintransformer_fpn_backbone - SWIN: - SIZE: B-22k - FPN: - IN_FEATURES: ["swin1", "swin2", "swin3"] - WEIGHTS: "models/BoxSup-C2_Lbase_CLIP_SwinB_896b32_4x.pth" -SOLVER: - MAX_ITER: 180000 - IMS_PER_BATCH: 32 - BASE_LR: 0.0001 - WARMUP_ITERS: 1000 - WARMUP_FACTOR: 0.001 -DATASETS: - TRAIN: ("lvis_v1_train_norare","imagenet_lvis_v1") -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [4, 16] - DATASET_INPUT_SIZE: [896, 448] - USE_RFS: [True, False] - DATASET_INPUT_SCALE: [[0.1, 2.0], [0.5, 1.5]] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_caption.yaml b/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_caption.yaml deleted file mode 100644 index aeafd50d7c..0000000000 --- a/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_caption.yaml +++ /dev/null @@ -1,33 +0,0 @@ -_BASE_: "Base_OVCOCO_C4_1x.yaml" -MODEL: - WEIGHTS: "models/BoxSup_OVCOCO_CLIP_R50_1x.pth" - WITH_CAPTION: True - SYNC_CAPTION_BATCH: True - ROI_BOX_HEAD: - WS_NUM_PROPS: 1 - ADD_IMAGE_BOX: True - NEG_CAP_WEIGHT: 1.0 -SOLVER: - IMS_PER_BATCH: 16 - BASE_LR: 0.02 - STEPS: (60000, 80000) - MAX_ITER: 90000 -DATASETS: - TRAIN: ("coco_zeroshot_train_oriorder", "coco_caption_train_tags") -INPUT: - CUSTOM_AUG: ResizeShortestEdge - MIN_SIZE_TRAIN_SAMPLING: range - MIN_SIZE_TRAIN: (800, 800) -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [2, 8] - USE_RFS: [False, False] - DATASET_MIN_SIZES: [[800, 800], [400, 400]] - DATASET_MAX_SIZES: [1333, 667] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'caption'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_max-size.yaml b/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_max-size.yaml deleted file mode 100644 index 8daa4be6bb..0000000000 --- a/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_max-size.yaml +++ /dev/null @@ -1,30 +0,0 @@ -_BASE_: "Base_OVCOCO_C4_1x.yaml" -MODEL: - WEIGHTS: "models/BoxSup_OVCOCO_CLIP_R50_1x.pth" - ROI_BOX_HEAD: - WS_NUM_PROPS: 32 - IMAGE_LABEL_LOSS: 'max_size' -SOLVER: - IMS_PER_BATCH: 16 - BASE_LR: 0.02 - STEPS: (60000, 80000) - MAX_ITER: 90000 -DATASETS: - TRAIN: ("coco_zeroshot_train_oriorder", "coco_caption_train_tags") -INPUT: - CUSTOM_AUG: ResizeShortestEdge - MIN_SIZE_TRAIN_SAMPLING: range - MIN_SIZE_TRAIN: (800, 800) -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [2, 8] - USE_RFS: [False, False] - DATASET_MIN_SIZES: [[800, 800], [400, 400]] - DATASET_MAX_SIZES: [1333, 667] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'image'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_max-size_caption.yaml b/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_max-size_caption.yaml deleted file mode 100644 index 3ba0a20a18..0000000000 --- a/dimos/models/Detic/configs/Detic_OVCOCO_CLIP_R50_1x_max-size_caption.yaml +++ /dev/null @@ -1,35 +0,0 @@ -_BASE_: "Base_OVCOCO_C4_1x.yaml" -MODEL: - WEIGHTS: "models/BoxSup_OVCOCO_CLIP_R50_1x.pth" - WITH_CAPTION: True - SYNC_CAPTION_BATCH: True - ROI_BOX_HEAD: - WS_NUM_PROPS: 32 - ADD_IMAGE_BOX: True # caption loss is added to the image-box - IMAGE_LABEL_LOSS: 'max_size' - - NEG_CAP_WEIGHT: 1.0 -SOLVER: - IMS_PER_BATCH: 16 - BASE_LR: 0.02 - STEPS: (60000, 80000) - MAX_ITER: 90000 -DATASETS: - TRAIN: ("coco_zeroshot_train_oriorder", "coco_caption_train_tags") -INPUT: - CUSTOM_AUG: ResizeShortestEdge - MIN_SIZE_TRAIN_SAMPLING: range - MIN_SIZE_TRAIN: (800, 800) -DATALOADER: - SAMPLER_TRAIN: "MultiDatasetSampler" - DATASET_RATIO: [1, 4] - USE_DIFF_BS_SIZE: True - DATASET_BS: [2, 8] - USE_RFS: [False, False] - DATASET_MIN_SIZES: [[800, 800], [400, 400]] - DATASET_MAX_SIZES: [1333, 667] - FILTER_EMPTY_ANNOTATIONS: False - MULTI_DATASET_GROUPING: True - DATASET_ANN: ['box', 'captiontag'] - NUM_WORKERS: 8 -WITH_IMAGE_LABELS: True \ No newline at end of file diff --git a/dimos/models/Detic/configs/Detic_ViLD_200e.py b/dimos/models/Detic/configs/Detic_ViLD_200e.py deleted file mode 100644 index 470124a109..0000000000 --- a/dimos/models/Detic/configs/Detic_ViLD_200e.py +++ /dev/null @@ -1,157 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import os - -from detectron2.config import LazyCall as L -import detectron2.data.transforms as T -from detectron2.evaluation.lvis_evaluation import LVISEvaluator -from detectron2.layers import ShapeSpec -from detectron2.layers.batch_norm import NaiveSyncBatchNorm -from detectron2.model_zoo import get_config -from detectron2.modeling.box_regression import Box2BoxTransform -from detectron2.modeling.matcher import Matcher -from detectron2.modeling.roi_heads import FastRCNNConvFCHead -from detectron2.solver import WarmupParamScheduler -from detectron2.solver.build import get_default_optimizer_params -from detic.data.custom_dataset_dataloader import ( - MultiDatasetSampler, - build_custom_train_loader, - get_detection_dataset_dicts_with_source, -) -from detic.data.custom_dataset_mapper import CustomDatasetMapper -from detic.modeling.meta_arch.custom_rcnn import CustomRCNN -from detic.modeling.roi_heads.detic_fast_rcnn import DeticFastRCNNOutputLayers -from detic.modeling.roi_heads.detic_roi_heads import DeticCascadeROIHeads -from detic.modeling.roi_heads.zero_shot_classifier import ZeroShotClassifier -from fvcore.common.param_scheduler import CosineParamScheduler -import torch - -default_configs = get_config("new_baselines/mask_rcnn_R_50_FPN_100ep_LSJ.py") -dataloader = default_configs["dataloader"] -model = default_configs["model"] -train = default_configs["train"] - -train.init_checkpoint = "models/BoxSup_ViLD_200e.pth" - -[model.roi_heads.pop(k) for k in ["box_head", "box_predictor", "proposal_matcher"]] - -model.roi_heads.update( - _target_=DeticCascadeROIHeads, - num_classes=1203, - box_heads=[ - L(FastRCNNConvFCHead)( - input_shape=ShapeSpec(channels=256, height=7, width=7), - conv_dims=[256, 256, 256, 256], - fc_dims=[1024], - conv_norm=lambda c: NaiveSyncBatchNorm(c, stats_mode="N"), - ) - for _ in range(1) - ], - box_predictors=[ - L(DeticFastRCNNOutputLayers)( - input_shape=ShapeSpec(channels=1024), - test_score_thresh=0.0001, - test_topk_per_image=300, - box2box_transform=L(Box2BoxTransform)(weights=(w1, w1, w2, w2)), - cls_agnostic_bbox_reg=True, - num_classes="${...num_classes}", - cls_score=L(ZeroShotClassifier)( - input_shape=ShapeSpec(channels=1024), - num_classes=1203, - zs_weight_path="datasets/metadata/lvis_v1_clip_a+cname.npy", - norm_weight=True, - # use_bias=-4.6, - ), - use_zeroshot_cls=True, - use_sigmoid_ce=True, - ignore_zero_cats=True, - cat_freq_path="datasets/lvis/lvis_v1_train_norare_cat_info.json", - image_label_loss="max_size", - image_loss_weight=0.1, - ) - for (w1, w2) in [(10, 5)] - ], - proposal_matchers=[ - L(Matcher)(thresholds=[th], labels=[0, 1], allow_low_quality_matches=False) for th in [0.5] - ], - with_image_labels=True, - ws_num_props=128, -) -model.update( - _target_=CustomRCNN, - with_image_labels=True, -) -model.roi_heads.mask_head.num_classes = 1 - -train.ddp.find_unused_parameters = True - -num_nodes = 4 -image_size = 896 -image_size_weak = 448 -dataloader.train = L(build_custom_train_loader)( - dataset=L(get_detection_dataset_dicts_with_source)( - dataset_names=["lvis_v1_train_norare", "imagenet_lvis_v1"], - filter_empty=False, - ), - mapper=L(CustomDatasetMapper)( - is_train=True, - augmentations=[], - with_ann_type=True, - dataset_ann=["box", "image"], - use_diff_bs_size=True, - dataset_augs=[ - [ - L(T.ResizeScale)( - min_scale=0.1, max_scale=2.0, target_height=image_size, target_width=image_size - ), - L(T.FixedSizeCrop)(crop_size=(image_size, image_size)), - L(T.RandomFlip)(horizontal=True), - ], - [ - L(T.ResizeScale)( - min_scale=0.5, - max_scale=1.5, - target_height=image_size_weak, - target_width=image_size_weak, - ), - L(T.FixedSizeCrop)(crop_size=(image_size_weak, image_size_weak)), - L(T.RandomFlip)(horizontal=True), - ], - ], - image_format="BGR", - use_instance_mask=True, - ), - sampler=L(MultiDatasetSampler)( - dataset_dicts="${dataloader.train.dataset}", - dataset_ratio=[1, 4], - use_rfs=[True, False], - dataset_ann="${dataloader.train.mapper.dataset_ann}", - repeat_threshold=0.001, - ), - total_batch_size=64 * num_nodes, - multi_dataset_grouping=True, - use_diff_bs_size=True, - dataset_bs=[8, 8 * 4], - num_datasets=2, - num_workers=8, -) - -dataloader.test.dataset.names = "lvis_v1_val" -dataloader.evaluator = L(LVISEvaluator)( - dataset_name="${..test.dataset.names}", -) - -train.max_iter = 184375 * 2 // num_nodes -lr_multiplier = L(WarmupParamScheduler)( - scheduler=CosineParamScheduler(1.0, 0.0), - warmup_length=500 / train.max_iter, - warmup_factor=0.067, -) - -optimizer = L(torch.optim.AdamW)( - params=L(get_default_optimizer_params)(weight_decay_norm=0.0), - lr=0.0002 * num_nodes, - weight_decay=1e-4, -) - -train.checkpointer.period = 20000 // num_nodes -train.output_dir = f"./output/Lazy/{os.path.basename(__file__)[:-3]}" diff --git a/dimos/models/Detic/datasets/README.md b/dimos/models/Detic/datasets/README.md deleted file mode 100644 index e9f4a0b3fb..0000000000 --- a/dimos/models/Detic/datasets/README.md +++ /dev/null @@ -1,207 +0,0 @@ -# Prepare datasets for Detic - -The basic training of our model uses [LVIS](https://www.lvisdataset.org/) (which uses [COCO](https://cocodataset.org/) images) and [ImageNet-21K](https://www.image-net.org/download.php). -Some models are trained on [Conceptual Caption (CC3M)](https://ai.google.com/research/ConceptualCaptions/). -Optionally, we use [Objects365](https://www.objects365.org/) and [OpenImages (Challenge 2019 version)](https://storage.googleapis.com/openimages/web/challenge2019.html) for cross-dataset evaluation. -Before starting processing, please download the (selected) datasets from the official websites and place or sim-link them under `$Detic_ROOT/datasets/`. - -``` -$Detic_ROOT/datasets/ - metadata/ - lvis/ - coco/ - imagenet/ - cc3m/ - objects365/ - oid/ -``` -`metadata/` is our preprocessed meta-data (included in the repo). See the below [section](#Metadata) for details. -Please follow the following instruction to pre-process individual datasets. - -### COCO and LVIS - -First, download COCO and LVIS data place them in the following way: - -``` -lvis/ - lvis_v1_train.json - lvis_v1_val.json -coco/ - train2017/ - val2017/ - annotations/ - captions_train2017.json - instances_train2017.json - instances_val2017.json -``` - -Next, prepare the open-vocabulary LVIS training set using - -``` -python tools/remove_lvis_rare.py --ann datasets/lvis/lvis_v1_train.json -``` - -This will generate `datasets/lvis/lvis_v1_train_norare.json`. - -### ImageNet-21K - -The ImageNet-21K folder should look like: -``` -imagenet/ - ImageNet-21K/ - n01593028.tar - n01593282.tar - ... -``` - -We first unzip the overlapping classes of LVIS (we will directly work with the .tar file for the rest classes) and convert them into LVIS annotation format. - -~~~ -mkdir imagenet/annotations -python tools/unzip_imagenet_lvis.py --dst_path datasets/imagenet/ImageNet-LVIS -python tools/create_imagenetlvis_json.py --imagenet_path datasets/imagenet/ImageNet-LVIS --out_path datasets/imagenet/annotations/imagenet_lvis_image_info.json -~~~ -This creates `datasets/imagenet/annotations/imagenet_lvis_image_info.json`. - -[Optional] To train with all the 21K classes, run - -~~~ -python tools/get_imagenet_21k_full_tar_json.py -python tools/create_lvis_21k.py -~~~ -This creates `datasets/imagenet/annotations/imagenet-21k_image_info_lvis-21k.json` and `datasets/lvis/lvis_v1_train_lvis-21k.json` (combined LVIS and ImageNet-21K classes in `categories`). - -[Optional] To train on combined LVIS and COCO, run - -~~~ -python tools/merge_lvis_coco.py -~~~ -This creates `datasets/lvis/lvis_v1_train+coco_mask.json` - -### Conceptual Caption - - -Download the dataset from [this](https://ai.google.com/research/ConceptualCaptions/download) page and place them as: -``` -cc3m/ - GCC-training.tsv -``` - -Run the following command to download the images and convert the annotations to LVIS format (Note: download images takes long). - -~~~ -python tools/download_cc.py --ann datasets/cc3m/GCC-training.tsv --save_image_path datasets/cc3m/training/ --out_path datasets/cc3m/train_image_info.json -python tools/get_cc_tags.py -~~~ - -This creates `datasets/cc3m/train_image_info_tags.json`. - -### Objects365 -Download Objects365 (v2) from the website. We only need the validation set in this project: -``` -objects365/ - annotations/ - zhiyuan_objv2_val.json - val/ - images/ - v1/ - patch0/ - ... - patch15/ - v2/ - patch16/ - ... - patch49/ - -``` - -The original annotation has typos in the class names, we first fix them for our following use of language embeddings. - -``` -python tools/fix_o365_names.py --ann datasets/objects365/annotations/zhiyuan_objv2_val.json -``` -This creates `datasets/objects365/zhiyuan_objv2_val_fixname.json`. - -To train on Objects365, download the training images and use the command above. We note some images in the training annotation do not exist. -We use the following command to filter the missing images. -~~~ -python tools/fix_0365_path.py -~~~ -This creates `datasets/objects365/zhiyuan_objv2_train_fixname_fixmiss.json`. - -### OpenImages - -We followed the instructions in [UniDet](https://github.com/xingyizhou/UniDet/blob/master/docs/DATASETS.md#openimages) to convert the metadata for OpenImages. - -The converted folder should look like - -``` -oid/ - annotations/ - oid_challenge_2019_train_bbox.json - oid_challenge_2019_val_expanded.json - images/ - 0/ - 1/ - 2/ - ... -``` - -### Open-vocabulary COCO - -We first follow [OVR-CNN](https://github.com/alirezazareian/ovr-cnn/blob/master/ipynb/003.ipynb) to create the open-vocabulary COCO split. The converted files should be like - -``` -coco/ - zero-shot/ - instances_train2017_seen_2.json - instances_val2017_all_2.json -``` - -We further pre-process the annotation format for easier evaluation: - -``` -python tools/get_coco_zeroshot_oriorder.py --data_path datasets/coco/zero-shot/instances_train2017_seen_2.json -python tools/get_coco_zeroshot_oriorder.py --data_path datasets/coco/zero-shot/instances_val2017_all_2.json -``` - -Next, we preprocess the COCO caption data: - -``` -python tools/get_cc_tags.py --cc_ann datasets/coco/annotations/captions_train2017.json --out_path datasets/coco/captions_train2017_tags_allcaps.json --allcaps --convert_caption --cat_path datasets/coco/annotations/instances_val2017.json -``` -This creates `datasets/coco/captions_train2017_tags_allcaps.json`. - -### Metadata - -``` -metadata/ - lvis_v1_train_cat_info.json - coco_clip_a+cname.npy - lvis_v1_clip_a+cname.npy - o365_clip_a+cnamefix.npy - oid_clip_a+cname.npy - imagenet_lvis_wnid.txt - Objects365_names_fix.csv -``` - -`lvis_v1_train_cat_info.json` is used by the Federated loss. -This is created by -~~~ -python tools/get_lvis_cat_info.py --ann datasets/lvis/lvis_v1_train.json -~~~ - -`*_clip_a+cname.npy` is the pre-computed CLIP embeddings for each datasets. -They are created by (taking LVIS as an example) -~~~ -python tools/dump_clip_features.py --ann datasets/lvis/lvis_v1_val.json --out_path metadata/lvis_v1_clip_a+cname.npy -~~~ -Note we do not include the 21K class embeddings due to the large file size. -To create it, run -~~~ -python tools/dump_clip_features.py --ann datasets/lvis/lvis_v1_val_lvis-21k.json --out_path datasets/metadata/lvis-21k_clip_a+cname.npy -~~~ - -`imagenet_lvis_wnid.txt` is the list of matched classes between ImageNet-21K and LVIS. - -`Objects365_names_fix.csv` is our manual fix of the Objects365 names. \ No newline at end of file diff --git a/dimos/models/Detic/datasets/metadata/Objects365_names_fix.csv b/dimos/models/Detic/datasets/metadata/Objects365_names_fix.csv deleted file mode 100644 index c274707cc3..0000000000 --- a/dimos/models/Detic/datasets/metadata/Objects365_names_fix.csv +++ /dev/null @@ -1,365 +0,0 @@ -1,Person,Person -2,Sneakers,Sneakers -3,Chair,Chair -4,Other Shoes,Other Shoes -5,Hat,Hat -6,Car,Car -7,Lamp,Lamp -8,Glasses,Glasses -9,Bottle,Bottle -10,Desk,Desk -11,Cup,Cup -12,Street Lights,Street Lights -13,Cabinet/shelf,Cabinet/shelf -14,Handbag/Satchel,Handbag/Satchel -15,Bracelet,Bracelet -16,Plate,Plate -17,Picture/Frame,Picture/Frame -18,Helmet,Helmet -19,Book,Book -20,Gloves,Gloves -21,Storage box,Storage box -22,Boat,Boat -23,Leather Shoes,Leather Shoes -24,Flower,Flower -25,Bench,Bench -26,Potted Plant,Potted Plant -27,Bowl/Basin,Bowl/Basin -28,Flag,Flag -29,Pillow,Pillow -30,Boots,Boots -31,Vase,Vase -32,Microphone,Microphone -33,Necklace,Necklace -34,Ring,Ring -35,SUV,SUV -36,Wine Glass,Wine Glass -37,Belt,Belt -38,Moniter/TV,Monitor/TV -39,Backpack,Backpack -40,Umbrella,Umbrella -41,Traffic Light,Traffic Light -42,Speaker,Speaker -43,Watch,Watch -44,Tie,Tie -45,Trash bin Can,Trash bin Can -46,Slippers,Slippers -47,Bicycle,Bicycle -48,Stool,Stool -49,Barrel/bucket,Barrel/bucket -50,Van,Van -51,Couch,Couch -52,Sandals,Sandals -53,Bakset,Basket -54,Drum,Drum -55,Pen/Pencil,Pen/Pencil -56,Bus,Bus -57,Wild Bird,Wild Bird -58,High Heels,High Heels -59,Motorcycle,Motorcycle -60,Guitar,Guitar -61,Carpet,Carpet -62,Cell Phone,Cell Phone -63,Bread,Bread -64,Camera,Camera -65,Canned,Canned -66,Truck,Truck -67,Traffic cone,Traffic cone -68,Cymbal,Cymbal -69,Lifesaver,Lifesaver -70,Towel,Towel -71,Stuffed Toy,Stuffed Toy -72,Candle,Candle -73,Sailboat,Sailboat -74,Laptop,Laptop -75,Awning,Awning -76,Bed,Bed -77,Faucet,Faucet -78,Tent,Tent -79,Horse,Horse -80,Mirror,Mirror -81,Power outlet,Power outlet -82,Sink,Sink -83,Apple,Apple -84,Air Conditioner,Air Conditioner -85,Knife,Knife -86,Hockey Stick,Hockey Stick -87,Paddle,Paddle -88,Pickup Truck,Pickup Truck -89,Fork,Fork -90,Traffic Sign,Traffic Sign -91,Ballon,Ballon -92,Tripod,Tripod -93,Dog,Dog -94,Spoon,Spoon -95,Clock,Clock -96,Pot,Pot -97,Cow,Cow -98,Cake,Cake -99,Dinning Table,Dining Table -100,Sheep,Sheep -101,Hanger,Hanger -102,Blackboard/Whiteboard,Blackboard/Whiteboard -103,Napkin,Napkin -104,Other Fish,Other Fish -105,Orange/Tangerine,Orange/Tangerine -106,Toiletry,Toiletry -107,Keyboard,Keyboard -108,Tomato,Tomato -109,Lantern,Lantern -110,Machinery Vehicle,Machinery Vehicle -111,Fan,Fan -112,Green Vegetables,Green Vegetables -113,Banana,Banana -114,Baseball Glove,Baseball Glove -115,Airplane,Airplane -116,Mouse,Mouse -117,Train,Train -118,Pumpkin,Pumpkin -119,Soccer,Soccer -120,Skiboard,Skiboard -121,Luggage,Luggage -122,Nightstand,Nightstand -123,Tea pot,Teapot -124,Telephone,Telephone -125,Trolley,Trolley -126,Head Phone,Head Phone -127,Sports Car,Sports Car -128,Stop Sign,Stop Sign -129,Dessert,Dessert -130,Scooter,Scooter -131,Stroller,Stroller -132,Crane,Crane -133,Remote,Remote -134,Refrigerator,Refrigerator -135,Oven,Oven -136,Lemon,Lemon -137,Duck,Duck -138,Baseball Bat,Baseball Bat -139,Surveillance Camera,Surveillance Camera -140,Cat,Cat -141,Jug,Jug -142,Broccoli,Broccoli -143,Piano,Piano -144,Pizza,Pizza -145,Elephant,Elephant -146,Skateboard,Skateboard -147,Surfboard,Surfboard -148,Gun,Gun -149,Skating and Skiing shoes,Skating and Skiing shoes -150,Gas stove,Gas stove -151,Donut,Donut -152,Bow Tie,Bow Tie -153,Carrot,Carrot -154,Toilet,Toilet -155,Kite,Kite -156,Strawberry,Strawberry -157,Other Balls,Other Balls -158,Shovel,Shovel -159,Pepper,Pepper -160,Computer Box,Computer Box -161,Toilet Paper,Toilet Paper -162,Cleaning Products,Cleaning Products -163,Chopsticks,Chopsticks -164,Microwave,Microwave -165,Pigeon,Pigeon -166,Baseball,Baseball -167,Cutting/chopping Board,Cutting/chopping Board -168,Coffee Table,Coffee Table -169,Side Table,Side Table -170,Scissors,Scissors -171,Marker,Marker -172,Pie,Pie -173,Ladder,Ladder -174,Snowboard,Snowboard -175,Cookies,Cookies -176,Radiator,Radiator -177,Fire Hydrant,Fire Hydrant -178,Basketball,Basketball -179,Zebra,Zebra -180,Grape,Grape -181,Giraffe,Giraffe -182,Potato,Potato -183,Sausage,Sausage -184,Tricycle,Tricycle -185,Violin,Violin -186,Egg,Egg -187,Fire Extinguisher,Fire Extinguisher -188,Candy,Candy -189,Fire Truck,Fire Truck -190,Billards,Billards -191,Converter,Converter -192,Bathtub,Bathtub -193,Wheelchair,Wheelchair -194,Golf Club,Golf Club -195,Briefcase,Briefcase -196,Cucumber,Cucumber -197,Cigar/Cigarette,Cigar/Cigarette -198,Paint Brush,Paint Brush -199,Pear,Pear -200,Heavy Truck,Heavy Truck -201,Hamburger,Hamburger -202,Extractor,Extractor -203,Extention Cord,Extension Cord -204,Tong,Tong -205,Tennis Racket,Tennis Racket -206,Folder,Folder -207,American Football,American Football -208,earphone,earphone -209,Mask,Mask -210,Kettle,Kettle -211,Tennis,Tennis -212,Ship,Ship -213,Swing,Swing -214,Coffee Machine,Coffee Machine -215,Slide,Slide -216,Carriage,Carriage -217,Onion,Onion -218,Green beans,Green beans -219,Projector,Projector -220,Frisbee,Frisbee -221,Washing Machine/Drying Machine,Washing Machine/Drying Machine -222,Chicken,Chicken -223,Printer,Printer -224,Watermelon,Watermelon -225,Saxophone,Saxophone -226,Tissue,Tissue -227,Toothbrush,Toothbrush -228,Ice cream,Ice cream -229,Hotair ballon,Hot air balloon -230,Cello,Cello -231,French Fries,French Fries -232,Scale,Scale -233,Trophy,Trophy -234,Cabbage,Cabbage -235,Hot dog,Hot dog -236,Blender,Blender -237,Peach,Peach -238,Rice,Rice -239,Wallet/Purse,Wallet/Purse -240,Volleyball,Volleyball -241,Deer,Deer -242,Goose,Goose -243,Tape,Tape -244,Tablet,Tablet -245,Cosmetics,Cosmetics -246,Trumpet,Trumpet -247,Pineapple,Pineapple -248,Golf Ball,Golf Ball -249,Ambulance,Ambulance -250,Parking meter,Parking meter -251,Mango,Mango -252,Key,Key -253,Hurdle,Hurdle -254,Fishing Rod,Fishing Rod -255,Medal,Medal -256,Flute,Flute -257,Brush,Brush -258,Penguin,Penguin -259,Megaphone,Megaphone -260,Corn,Corn -261,Lettuce,Lettuce -262,Garlic,Garlic -263,Swan,Swan -264,Helicopter,Helicopter -265,Green Onion,Green Onion -266,Sandwich,Sandwich -267,Nuts,Nuts -268,Speed Limit Sign,Speed Limit Sign -269,Induction Cooker,Induction Cooker -270,Broom,Broom -271,Trombone,Trombone -272,Plum,Plum -273,Rickshaw,Rickshaw -274,Goldfish,Goldfish -275,Kiwi fruit,Kiwi fruit -276,Router/modem,Router/modem -277,Poker Card,Poker Card -278,Toaster,Toaster -279,Shrimp,Shrimp -280,Sushi,Sushi -281,Cheese,Cheese -282,Notepaper,Notepaper -283,Cherry,Cherry -284,Pliers,Pliers -285,CD,CD -286,Pasta,Pasta -287,Hammer,Hammer -288,Cue,Cue -289,Avocado,Avocado -290,Hamimelon,Hami melon -291,Flask,Flask -292,Mushroon,Mushroom -293,Screwdriver,Screwdriver -294,Soap,Soap -295,Recorder,Recorder -296,Bear,Bear -297,Eggplant,Eggplant -298,Board Eraser,Board Eraser -299,Coconut,Coconut -300,Tape Measur/ Ruler,Tape Measure/ Ruler -301,Pig,Pig -302,Showerhead,Showerhead -303,Globe,Globe -304,Chips,Chips -305,Steak,Steak -306,Crosswalk Sign,Crosswalk Sign -307,Stapler,Stapler -308,Campel,Camel -309,Formula 1,Formula 1 -310,Pomegranate,Pomegranate -311,Dishwasher,Dishwasher -312,Crab,Crab -313,Hoverboard,Hoverboard -314,Meat ball,Meatball -315,Rice Cooker,Rice Cooker -316,Tuba,Tuba -317,Calculator,Calculator -318,Papaya,Papaya -319,Antelope,Antelope -320,Parrot,Parrot -321,Seal,Seal -322,Buttefly,Butterfly -323,Dumbbell,Dumbbell -324,Donkey,Donkey -325,Lion,Lion -326,Urinal,Urinal -327,Dolphin,Dolphin -328,Electric Drill,Electric Drill -329,Hair Dryer,Hair Dryer -330,Egg tart,Egg tart -331,Jellyfish,Jellyfish -332,Treadmill,Treadmill -333,Lighter,Lighter -334,Grapefruit,Grapefruit -335,Game board,Game board -336,Mop,Mop -337,Radish,Radish -338,Baozi,Baozi -339,Target,Target -340,French,French -341,Spring Rolls,Spring Rolls -342,Monkey,Monkey -343,Rabbit,Rabbit -344,Pencil Case,Pencil Case -345,Yak,Yak -346,Red Cabbage,Red Cabbage -347,Binoculars,Binoculars -348,Asparagus,Asparagus -349,Barbell,Barbell -350,Scallop,Scallop -351,Noddles,Noddles -352,Comb,Comb -353,Dumpling,Dumpling -354,Oyster,Oyster -355,Table Teniis paddle,Table Tennis paddle -356,Cosmetics Brush/Eyeliner Pencil,Cosmetics Brush/Eyeliner Pencil -357,Chainsaw,Chainsaw -358,Eraser,Eraser -359,Lobster,Lobster -360,Durian,Durian -361,Okra,Okra -362,Lipstick,Lipstick -363,Cosmetics Mirror,Cosmetics Mirror -364,Curling,Curling -365,Table Tennis,Table Tennis \ No newline at end of file diff --git a/dimos/models/Detic/datasets/metadata/coco_clip_a+cname.npy b/dimos/models/Detic/datasets/metadata/coco_clip_a+cname.npy deleted file mode 100644 index 63b938afaf..0000000000 Binary files a/dimos/models/Detic/datasets/metadata/coco_clip_a+cname.npy and /dev/null differ diff --git a/dimos/models/Detic/datasets/metadata/imagenet_lvis_wnid.txt b/dimos/models/Detic/datasets/metadata/imagenet_lvis_wnid.txt deleted file mode 100644 index 8433aa01af..0000000000 --- a/dimos/models/Detic/datasets/metadata/imagenet_lvis_wnid.txt +++ /dev/null @@ -1,997 +0,0 @@ -n02682922 -n02686379 -n02691156 -n02694662 -n07884567 -n01698434 -n07750586 -n02701002 -n02705944 -n02715229 -n07739125 -n07825850 -n07750872 -n02730930 -n02732072 -n02735538 -n02738449 -n02738535 -n02739550 -n02739668 -n07718747 -n02747177 -n02747802 -n07719213 -n02754103 -n07764847 -n02763901 -n02764044 -n02486410 -n02766534 -n02768226 -n02769748 -n02774152 -n02773838 -n07693725 -n02775483 -n07687381 -n02776205 -n02779435 -n02780815 -n02782093 -n12147226 -n07753592 -n02786058 -n02785648 -n02786198 -n02787622 -n02788021 -n02790996 -n02792552 -n02795169 -n02796318 -n02797295 -n02797881 -n02799071 -n02799175 -n02799323 -n02800213 -n02801938 -n02802426 -n02804252 -n02139199 -n02808304 -n02807616 -n02808440 -n07860805 -n02810471 -n07709881 -n02816656 -n02816768 -n02131653 -n02818832 -n02821202 -n02822220 -n02404186 -n02823124 -n02823428 -n02823510 -n02164464 -n02824448 -n07720875 -n02827606 -n02828299 -n02828884 -n02831237 -n02834778 -n02838728 -n02839110 -n02840245 -n02841315 -n01503061 -n02843553 -n02843158 -n02843276 -n02843684 -n02413050 -n07744811 -n02846511 -n02849154 -n02850358 -n02850732 -n02850950 -n02852173 -n02854926 -n07743544 -n02858304 -n02860415 -n02860640 -n07841495 -n02865351 -n02865931 -n02865665 -n02869837 -n02870880 -n02871147 -n02871824 -n02872752 -n02876657 -n02877962 -n02879087 -n02879718 -n02883205 -n02880940 -n02881757 -n02882301 -n02883344 -n02885462 -n02887489 -n02887970 -n02892201 -n02892767 -n02893692 -n07679356 -n02896294 -n02898585 -n02900705 -n11876803 -n02906734 -n07715221 -n07600285 -n02909870 -n02912557 -n01887623 -n02108672 -n02916179 -n02917067 -n02916936 -n02917377 -n07680932 -n02920259 -n07880968 -n02924116 -n07848338 -n02274259 -n02928608 -n02930766 -n02931294 -n02932523 -n02933112 -n02933462 -n02938886 -n01887896 -n02942349 -n02437136 -n02942699 -n02943241 -n02946348 -n02946921 -n02951585 -n02948072 -n02948557 -n07598256 -n07601572 -n02949202 -n02949542 -n02951358 -n07755929 -n02952374 -n02954340 -n02954938 -n02955767 -n07920349 -n02958343 -n02959942 -n02960352 -n02961225 -n02963159 -n02965300 -n11808468 -n02968473 -n02970408 -n02970849 -n02971356 -n02977438 -n07580359 -n02978881 -n02979836 -n02121620 -n07715103 -n07822518 -n02988304 -n02992529 -n03000247 -n03001627 -n03002711 -n03002948 -n03005285 -n03006903 -n07757132 -n01791625 -n12515925 -n07721456 -n03017168 -n07712559 -n03020416 -n07921360 -n07617611 -n07921455 -n03030353 -n03031012 -n03035715 -n03037709 -n03038281 -n03041114 -n12710415 -n03043958 -n03045074 -n03045337 -n03046257 -n03047052 -n03050864 -n03051249 -n03055418 -n03057021 -n03057920 -n03059103 -n01792158 -n02233338 -n07922764 -n07772935 -n03063338 -n03063968 -n03063689 -n03066849 -n07808587 -n03075370 -n03075768 -n06596364 -n03080497 -n03085013 -n07810907 -n03096960 -n03100240 -n03100346 -n03101156 -n03101986 -n03102654 -n03108853 -n03109150 -n07731952 -n07687789 -n03110669 -n03111296 -n07568095 -n03112869 -n03113835 -n02125311 -n03121897 -n03123917 -n03124170 -n01976957 -n07681926 -n03127925 -n03128248 -n03129001 -n07691650 -n03131574 -n03133415 -n03135917 -n07682197 -n01579028 -n03138344 -n03138669 -n03140292 -n03141327 -n03141065 -n03141823 -n01322685 -n07718472 -n03147509 -n03148324 -n03150232 -n03150511 -n03151077 -n03156279 -n03157348 -n03158885 -n02110341 -n07765073 -n03168217 -n02430045 -n03175843 -n03179701 -n03188531 -n03199901 -n03201208 -n03201776 -n03206908 -n03207305 -n03207743 -n03207835 -n03207941 -n03210683 -n03216710 -n02084071 -n03219135 -n03219483 -n02068974 -n02389559 -n03223299 -n07639069 -n01812337 -n02268443 -n03233905 -n03234164 -n03236735 -n03237416 -n03239054 -n03237340 -n03239726 -n03245889 -n03247083 -n03249569 -n03250847 -n01846331 -n01847170 -n03253886 -n03255030 -n03256032 -n03259009 -n01613294 -n03261776 -n03262248 -n03262809 -n07840804 -n07866723 -n07841345 -n03266371 -n07713074 -n03271030 -n03273913 -n02503517 -n02432983 -n03291819 -n03294833 -n03309356 -n01610955 -n03320046 -n03325088 -n03325941 -n02443346 -n03329302 -n03329663 -n07753113 -n03335030 -n03337140 -n03336839 -n03343737 -n03345487 -n03345837 -n03346455 -n03349469 -n02512053 -n03350204 -n03351979 -n03354903 -n03355925 -n02007558 -n03356982 -n03358172 -n03359137 -n03362639 -n03364008 -n03364156 -n03372549 -n02376542 -n03376595 -n03378174 -n03378765 -n03379051 -n03380724 -n03384352 -n03393912 -n07868200 -n03397947 -n01639765 -n07924033 -n03400231 -n07605474 -n03403643 -n03408444 -n03410740 -n03416900 -n03417042 -n07818277 -n03424325 -n02423022 -n07643981 -n03433877 -n02510455 -n07814925 -n02439033 -n03438071 -n03438257 -n03441112 -n02416519 -n03443912 -n01443537 -n03446070 -n03445924 -n03447447 -n01855672 -n02480855 -n12158031 -n07758680 -n03454885 -n03455488 -n03456024 -n07722485 -n03459328 -n03459591 -n02132580 -n03461288 -n03467517 -n02041246 -n03467984 -n03475581 -n03475961 -n03476313 -n03480579 -n07697100 -n03481172 -n03482252 -n03482405 -n02342885 -n03483316 -n03485198 -n03490006 -n03484083 -n03484576 -n03485794 -n03488188 -n03494537 -n03497657 -n03498441 -n03502331 -n03502200 -n03503997 -n03505504 -n03505667 -n03506028 -n03508101 -n03512147 -n03513137 -n02008041 -n03518445 -n03521076 -n02398521 -n03524150 -n02395406 -n03528901 -n07858978 -n03531546 -n03532342 -n03533014 -n02213107 -n02374451 -n03541923 -n03543254 -n07830593 -n03544143 -n03545470 -n01833805 -n07857731 -n02134084 -n07614500 -n07615774 -n03557692 -n03557840 -n03558404 -n03571280 -n03584254 -n03584829 -n03589791 -n07642933 -n03593526 -n03594734 -n03594945 -n07606669 -n03595614 -n03595860 -n03602883 -n03605598 -n03609235 -n03610418 -n03610524 -n03612814 -n03613294 -n03617312 -n03617480 -n03620967 -n02122948 -n07763629 -n03623198 -n03623556 -n03625646 -n03626760 -n01882714 -n03630383 -n03633091 -n02165456 -n02412440 -n03636649 -n03637181 -n03637318 -n03640988 -n03642806 -n07870167 -n03644858 -n03649909 -n03655072 -n11748002 -n07749582 -n07926250 -n03662719 -n03662887 -n03665924 -n03668067 -n07749731 -n03670208 -n02129165 -n07901587 -n01674464 -n07607605 -n03691459 -n03693474 -n03701391 -n03705379 -n03710193 -n01847806 -n03715892 -n02504770 -n02073831 -n07747951 -n03717131 -n03717447 -n03720163 -n03722007 -n07916041 -n10297234 -n07711569 -n03724417 -n03725035 -n03726760 -n03727946 -n03729402 -n03733805 -n03735637 -n07871436 -n07755411 -n03759954 -n03760671 -n03761084 -n07844042 -n03764736 -n03770679 -n07606278 -n03773035 -n03775071 -n03775199 -n03782190 -n02484322 -n03789946 -n03791053 -n03791235 -n03790512 -n03792334 -n03793489 -n07690273 -n03797390 -n13000891 -n03801880 -n03800933 -n03805280 -n03814817 -n03814906 -n03815615 -n03816136 -n06267145 -n03822656 -n03825080 -n03831203 -n03831382 -n03836602 -n03837422 -n01970164 -n03844045 -n07842753 -n12433081 -n07747607 -n07924834 -n01518878 -n03858418 -n03862676 -n03863108 -n01621127 -n03871628 -n03873416 -n03874599 -n03876231 -n03877472 -n03878674 -n03880531 -n03880323 -n03885904 -n07762244 -n03887697 -n03888257 -n01821203 -n03889726 -n03889871 -n03891051 -n03891332 -n01816887 -n03895866 -n03896103 -n07663899 -n07725376 -n07751004 -n07855510 -n07767847 -n03904909 -n03906106 -n03906224 -n02051845 -n03906997 -n03908204 -n03908618 -n03908714 -n03909160 -n02055803 -n07815588 -n03914337 -n03916031 -n07746186 -n00007846 -n01318894 -n03920867 -n03924069 -n03928116 -n07824988 -n03930630 -n01811909 -n03935335 -n03938244 -n03940256 -n07753275 -n03942813 -n03944138 -n03948459 -n07683617 -n03950228 -n03950359 -n07873807 -n03963198 -n03964495 -n03966976 -n03967562 -n03973839 -n03973628 -n03975926 -n03976657 -n03978966 -n03980874 -n02382437 -n03982430 -n07927512 -n03990474 -n03991062 -n07710616 -n03992703 -n03993180 -n03996416 -n07695742 -n04004475 -n04008634 -n04009552 -n04011827 -n07752602 -n07617188 -n02655020 -n02047614 -n02110958 -n07735510 -n04023249 -n01322604 -n07881205 -n04033995 -n02324045 -n04037443 -n04039381 -n04039848 -n04040759 -n04043733 -n04045397 -n04049405 -n02412080 -n07745466 -n02331046 -n04057215 -n04059516 -n04059947 -n04062428 -n04064401 -n04069276 -n04074963 -n02391994 -n04090263 -n04095210 -n04097866 -n04099969 -n02329401 -n04102618 -n04102162 -n04103206 -n07928887 -n04114844 -n04116098 -n04122825 -n04123740 -n04124202 -n04124098 -n04127249 -n04127904 -n07806221 -n02534734 -n07823460 -n04131690 -n04133789 -n07695965 -n04137217 -n04138977 -n04140631 -n04141076 -n04141975 -n04143897 -n04146614 -n04148054 -n04149813 -n04150980 -n04154565 -n04156140 -n04157320 -n02021795 -n01456756 -n04160586 -n01956764 -n04179913 -n04183329 -n01482330 -n04185071 -n04185529 -n04185804 -n04186051 -n04186455 -n04186848 -n02411705 -n02104523 -n07615289 -n04192698 -n04197391 -n04199027 -n04204081 -n04204347 -n04205318 -n04206225 -n04207343 -n04208210 -n04208936 -n04209133 -n04209239 -n04210120 -n04217882 -n04220250 -n04225987 -n04227900 -n04228054 -n04228581 -n04230387 -n04230603 -n04230808 -n04232153 -n04235291 -n04235860 -n04239436 -n04241394 -n07914271 -n01726692 -n04251791 -n04252077 -n04254680 -n04254777 -n04256520 -n04256891 -n04257790 -n04259630 -n07583197 -n04263257 -n04263502 -n07848093 -n07844867 -n04266014 -n04269944 -n04270891 -n04272054 -n04275175 -n01772222 -n01984695 -n04284002 -n04285803 -n04286575 -n02355227 -n04297098 -n04303497 -n02317335 -n04306847 -n04307986 -n04313503 -n04315713 -n04315948 -n07588947 -n04320871 -n04320973 -n04326896 -n04330340 -n04332243 -n04333129 -n07745940 -n06794110 -n04335886 -n07854707 -n04346511 -n04349401 -n04350581 -n04350905 -n11978233 -n04356056 -n04356595 -n07879450 -n04367480 -n04370288 -n04370048 -n04370456 -n07712063 -n04371563 -n04373894 -n04376876 -n07826091 -n04381587 -n04379243 -n04380533 -n04382880 -n07880751 -n04384910 -n04387400 -n04389033 -n04388743 -n04390577 -n04392113 -n04393549 -n04395024 -n04395106 -n07933154 -n04397452 -n04397768 -n04398044 -n04401088 -n04401680 -n04402449 -n04403413 -n04404997 -n04405907 -n04409515 -n04409806 -n07905979 -n04421872 -n04422727 -n04422875 -n04423845 -n04431745 -n04432203 -n02129604 -n04434932 -n04438304 -n04439712 -n07686873 -n04442312 -n04442441 -n15075141 -n07734017 -n04450749 -n04452615 -n04453156 -n04453390 -n04453910 -n04461696 -n04459362 -n04459773 -n04461879 -n04465501 -n06874185 -n04466871 -n04467665 -n04468005 -n04469514 -n04476259 -n04479046 -n04480853 -n04482393 -n04485082 -n04489008 -n04490091 -n07609632 -n04491769 -n04493381 -n04498389 -n11877646 -n01662784 -n04502197 -n04505036 -n04507155 -n04508949 -n04509417 -n04516116 -n04517823 -n04522168 -n04525305 -n04531873 -n04534520 -n07828987 -n04536866 -n07906111 -n04540053 -n01616318 -n04542943 -n04543158 -n04543772 -n04546194 -n04548280 -n04548362 -n02081571 -n04550184 -n04554684 -n04555897 -n04557648 -n04559166 -n04559451 -n04560113 -n04560804 -n04562122 -n04562262 -n04562935 -n04560292 -n07756951 -n04568069 -n04569063 -n04574067 -n04574999 -n04576002 -n04579667 -n04584207 -n04587559 -n04589325 -n04590746 -n04591713 -n04591887 -n04592099 -n04593629 -n04596742 -n02114100 -n04597913 -n04606574 -n04610013 -n07849336 -n04612840 -n02391049 -n07716358 diff --git a/dimos/models/Detic/datasets/metadata/lvis_v1_clip_a+cname.npy b/dimos/models/Detic/datasets/metadata/lvis_v1_clip_a+cname.npy deleted file mode 100644 index a9e5376ee4..0000000000 Binary files a/dimos/models/Detic/datasets/metadata/lvis_v1_clip_a+cname.npy and /dev/null differ diff --git a/dimos/models/Detic/datasets/metadata/lvis_v1_train_cat_info.json b/dimos/models/Detic/datasets/metadata/lvis_v1_train_cat_info.json deleted file mode 100644 index 95fef09233..0000000000 --- a/dimos/models/Detic/datasets/metadata/lvis_v1_train_cat_info.json +++ /dev/null @@ -1 +0,0 @@ -[{"name": "aerosol_can", "instance_count": 109, "def": "a dispenser that holds a substance under pressure", "synonyms": ["aerosol_can", "spray_can"], "image_count": 64, "id": 1, "frequency": "c", "synset": "aerosol.n.02"}, {"name": "air_conditioner", "instance_count": 1081, "def": "a machine that keeps air cool and dry", "synonyms": ["air_conditioner"], "image_count": 364, "id": 2, "frequency": "f", "synset": "air_conditioner.n.01"}, {"name": "airplane", "instance_count": 3720, "def": "an aircraft that has a fixed wing and is powered by propellers or jets", "synonyms": ["airplane", "aeroplane"], "image_count": 1911, "id": 3, "frequency": "f", "synset": "airplane.n.01"}, {"name": "alarm_clock", "instance_count": 158, "def": "a clock that wakes a sleeper at some preset time", "synonyms": ["alarm_clock"], "image_count": 149, "id": 4, "frequency": "f", "synset": "alarm_clock.n.01"}, {"name": "alcohol", "instance_count": 207, "def": "a liquor or brew containing alcohol as the active agent", "synonyms": ["alcohol", "alcoholic_beverage"], "image_count": 29, "id": 5, "frequency": "c", "synset": "alcohol.n.01"}, {"name": "alligator", "instance_count": 39, "def": "amphibious reptiles related to crocodiles but with shorter broader snouts", "synonyms": ["alligator", "gator"], "image_count": 26, "id": 6, "frequency": "c", "synset": "alligator.n.02"}, {"name": "almond", "instance_count": 1700, "def": "oval-shaped edible seed of the almond tree", "synonyms": ["almond"], "image_count": 59, "id": 7, "frequency": "c", "synset": "almond.n.02"}, {"name": "ambulance", "instance_count": 25, "def": "a vehicle that takes people to and from hospitals", "synonyms": ["ambulance"], "image_count": 22, "id": 8, "frequency": "c", "synset": "ambulance.n.01"}, {"name": "amplifier", "instance_count": 16, "def": "electronic equipment that increases strength of signals", "synonyms": ["amplifier"], "image_count": 12, "id": 9, "frequency": "c", "synset": "amplifier.n.01"}, {"name": "anklet", "instance_count": 39, "def": "an ornament worn around the ankle", "synonyms": ["anklet", "ankle_bracelet"], "image_count": 28, "id": 10, "frequency": "c", "synset": "anklet.n.03"}, {"name": "antenna", "instance_count": 1018, "def": "an electrical device that sends or receives radio or television signals", "synonyms": ["antenna", "aerial", "transmitting_aerial"], "image_count": 505, "id": 11, "frequency": "f", "synset": "antenna.n.01"}, {"name": "apple", "instance_count": 17451, "def": "fruit with red or yellow or green skin and sweet to tart crisp whitish flesh", "synonyms": ["apple"], "image_count": 1207, "id": 12, "frequency": "f", "synset": "apple.n.01"}, {"name": "applesauce", "instance_count": 7, "def": "puree of stewed apples usually sweetened and spiced", "synonyms": ["applesauce"], "image_count": 4, "id": 13, "frequency": "r", "synset": "applesauce.n.01"}, {"name": "apricot", "instance_count": 62, "def": "downy yellow to rosy-colored fruit resembling a small peach", "synonyms": ["apricot"], "image_count": 10, "id": 14, "frequency": "r", "synset": "apricot.n.02"}, {"name": "apron", "instance_count": 881, "def": "a garment of cloth that is tied about the waist and worn to protect clothing", "synonyms": ["apron"], "image_count": 500, "id": 15, "frequency": "f", "synset": "apron.n.01"}, {"name": "aquarium", "instance_count": 36, "def": "a tank/pool/bowl filled with water for keeping live fish and underwater animals", "synonyms": ["aquarium", "fish_tank"], "image_count": 33, "id": 16, "frequency": "c", "synset": "aquarium.n.01"}, {"name": "arctic_(type_of_shoe)", "instance_count": 8, "def": "a waterproof overshoe that protects shoes from water or snow", "synonyms": ["arctic_(type_of_shoe)", "galosh", "golosh", "rubber_(type_of_shoe)", "gumshoe"], "image_count": 3, "id": 17, "frequency": "r", "synset": "arctic.n.02"}, {"name": "armband", "instance_count": 85, "def": "a band worn around the upper arm", "synonyms": ["armband"], "image_count": 44, "id": 18, "frequency": "c", "synset": "armband.n.02"}, {"name": "armchair", "instance_count": 1112, "def": "chair with a support on each side for arms", "synonyms": ["armchair"], "image_count": 561, "id": 19, "frequency": "f", "synset": "armchair.n.01"}, {"name": "armoire", "instance_count": 11, "def": "a large wardrobe or cabinet", "synonyms": ["armoire"], "image_count": 8, "id": 20, "frequency": "r", "synset": "armoire.n.01"}, {"name": "armor", "instance_count": 23, "def": "protective covering made of metal and used in combat", "synonyms": ["armor", "armour"], "image_count": 9, "id": 21, "frequency": "r", "synset": "armor.n.01"}, {"name": "artichoke", "instance_count": 293, "def": "a thistlelike flower head with edible fleshy leaves and heart", "synonyms": ["artichoke"], "image_count": 33, "id": 22, "frequency": "c", "synset": "artichoke.n.02"}, {"name": "trash_can", "instance_count": 2722, "def": "a bin that holds rubbish until it is collected", "synonyms": ["trash_can", "garbage_can", "wastebin", "dustbin", "trash_barrel", "trash_bin"], "image_count": 1883, "id": 23, "frequency": "f", "synset": "ashcan.n.01"}, {"name": "ashtray", "instance_count": 136, "def": "a receptacle for the ash from smokers' cigars or cigarettes", "synonyms": ["ashtray"], "image_count": 98, "id": 24, "frequency": "c", "synset": "ashtray.n.01"}, {"name": "asparagus", "instance_count": 969, "def": "edible young shoots of the asparagus plant", "synonyms": ["asparagus"], "image_count": 70, "id": 25, "frequency": "c", "synset": "asparagus.n.02"}, {"name": "atomizer", "instance_count": 67, "def": "a dispenser that turns a liquid (such as perfume) into a fine mist", "synonyms": ["atomizer", "atomiser", "spray", "sprayer", "nebulizer", "nebuliser"], "image_count": 46, "id": 26, "frequency": "c", "synset": "atomizer.n.01"}, {"name": "avocado", "instance_count": 1048, "def": "a pear-shaped fruit with green or blackish skin and rich yellowish pulp enclosing a single large seed", "synonyms": ["avocado"], "image_count": 117, "id": 27, "frequency": "f", "synset": "avocado.n.01"}, {"name": "award", "instance_count": 163, "def": "a tangible symbol signifying approval or distinction", "synonyms": ["award", "accolade"], "image_count": 41, "id": 28, "frequency": "c", "synset": "award.n.02"}, {"name": "awning", "instance_count": 4270, "def": "a canopy made of canvas to shelter people or things from rain or sun", "synonyms": ["awning"], "image_count": 1395, "id": 29, "frequency": "f", "synset": "awning.n.01"}, {"name": "ax", "instance_count": 8, "def": "an edge tool with a heavy bladed head mounted across a handle", "synonyms": ["ax", "axe"], "image_count": 7, "id": 30, "frequency": "r", "synset": "ax.n.01"}, {"name": "baboon", "instance_count": 3, "def": "large terrestrial monkeys having doglike muzzles", "synonyms": ["baboon"], "image_count": 1, "id": 31, "frequency": "r", "synset": "baboon.n.01"}, {"name": "baby_buggy", "instance_count": 447, "def": "a small vehicle with four wheels in which a baby or child is pushed around", "synonyms": ["baby_buggy", "baby_carriage", "perambulator", "pram", "stroller"], "image_count": 314, "id": 32, "frequency": "f", "synset": "baby_buggy.n.01"}, {"name": "basketball_backboard", "instance_count": 42, "def": "a raised vertical board with basket attached; used to play basketball", "synonyms": ["basketball_backboard"], "image_count": 31, "id": 33, "frequency": "c", "synset": "backboard.n.01"}, {"name": "backpack", "instance_count": 3907, "def": "a bag carried by a strap on your back or shoulder", "synonyms": ["backpack", "knapsack", "packsack", "rucksack", "haversack"], "image_count": 1905, "id": 34, "frequency": "f", "synset": "backpack.n.01"}, {"name": "handbag", "instance_count": 3947, "def": "a container used for carrying money and small personal items or accessories", "synonyms": ["handbag", "purse", "pocketbook"], "image_count": 1859, "id": 35, "frequency": "f", "synset": "bag.n.04"}, {"name": "suitcase", "instance_count": 8537, "def": "cases used to carry belongings when traveling", "synonyms": ["suitcase", "baggage", "luggage"], "image_count": 1623, "id": 36, "frequency": "f", "synset": "bag.n.06"}, {"name": "bagel", "instance_count": 372, "def": "glazed yeast-raised doughnut-shaped roll with hard crust", "synonyms": ["bagel", "beigel"], "image_count": 47, "id": 37, "frequency": "c", "synset": "bagel.n.01"}, {"name": "bagpipe", "instance_count": 6, "def": "a tubular wind instrument; the player blows air into a bag and squeezes it out", "synonyms": ["bagpipe"], "image_count": 3, "id": 38, "frequency": "r", "synset": "bagpipe.n.01"}, {"name": "baguet", "instance_count": 9, "def": "narrow French stick loaf", "synonyms": ["baguet", "baguette"], "image_count": 3, "id": 39, "frequency": "r", "synset": "baguet.n.01"}, {"name": "bait", "instance_count": 1, "def": "something used to lure fish or other animals into danger so they can be trapped or killed", "synonyms": ["bait", "lure"], "image_count": 1, "id": 40, "frequency": "r", "synset": "bait.n.02"}, {"name": "ball", "instance_count": 755, "def": "a spherical object used as a plaything", "synonyms": ["ball"], "image_count": 305, "id": 41, "frequency": "f", "synset": "ball.n.06"}, {"name": "ballet_skirt", "instance_count": 12, "def": "very short skirt worn by ballerinas", "synonyms": ["ballet_skirt", "tutu"], "image_count": 6, "id": 42, "frequency": "r", "synset": "ballet_skirt.n.01"}, {"name": "balloon", "instance_count": 1556, "def": "large tough nonrigid bag filled with gas or heated air", "synonyms": ["balloon"], "image_count": 210, "id": 43, "frequency": "f", "synset": "balloon.n.01"}, {"name": "bamboo", "instance_count": 243, "def": "woody tropical grass having hollow woody stems", "synonyms": ["bamboo"], "image_count": 36, "id": 44, "frequency": "c", "synset": "bamboo.n.02"}, {"name": "banana", "instance_count": 50552, "def": "elongated crescent-shaped yellow fruit with soft sweet flesh", "synonyms": ["banana"], "image_count": 1787, "id": 45, "frequency": "f", "synset": "banana.n.02"}, {"name": "Band_Aid", "instance_count": 19, "def": "trade name for an adhesive bandage to cover small cuts or blisters", "synonyms": ["Band_Aid"], "image_count": 17, "id": 46, "frequency": "c", "synset": "band_aid.n.01"}, {"name": "bandage", "instance_count": 92, "def": "a piece of soft material that covers and protects an injured part of the body", "synonyms": ["bandage"], "image_count": 51, "id": 47, "frequency": "c", "synset": "bandage.n.01"}, {"name": "bandanna", "instance_count": 219, "def": "large and brightly colored handkerchief; often used as a neckerchief", "synonyms": ["bandanna", "bandana"], "image_count": 138, "id": 48, "frequency": "f", "synset": "bandanna.n.01"}, {"name": "banjo", "instance_count": 3, "def": "a stringed instrument of the guitar family with a long neck and circular body", "synonyms": ["banjo"], "image_count": 3, "id": 49, "frequency": "r", "synset": "banjo.n.01"}, {"name": "banner", "instance_count": 5907, "def": "long strip of cloth or paper used for decoration or advertising", "synonyms": ["banner", "streamer"], "image_count": 1470, "id": 50, "frequency": "f", "synset": "banner.n.01"}, {"name": "barbell", "instance_count": 4, "def": "a bar to which heavy discs are attached at each end; used in weightlifting", "synonyms": ["barbell"], "image_count": 3, "id": 51, "frequency": "r", "synset": "barbell.n.01"}, {"name": "barge", "instance_count": 3, "def": "a flatbottom boat for carrying heavy loads (especially on canals)", "synonyms": ["barge"], "image_count": 2, "id": 52, "frequency": "r", "synset": "barge.n.01"}, {"name": "barrel", "instance_count": 707, "def": "a cylindrical container that holds liquids", "synonyms": ["barrel", "cask"], "image_count": 186, "id": 53, "frequency": "f", "synset": "barrel.n.02"}, {"name": "barrette", "instance_count": 119, "def": "a pin for holding women's hair in place", "synonyms": ["barrette"], "image_count": 76, "id": 54, "frequency": "c", "synset": "barrette.n.01"}, {"name": "barrow", "instance_count": 30, "def": "a cart for carrying small loads; has handles and one or more wheels", "synonyms": ["barrow", "garden_cart", "lawn_cart", "wheelbarrow"], "image_count": 26, "id": 55, "frequency": "c", "synset": "barrow.n.03"}, {"name": "baseball_base", "instance_count": 404, "def": "a place that the runner must touch before scoring", "synonyms": ["baseball_base"], "image_count": 303, "id": 56, "frequency": "f", "synset": "base.n.03"}, {"name": "baseball", "instance_count": 1013, "def": "a ball used in playing baseball", "synonyms": ["baseball"], "image_count": 738, "id": 57, "frequency": "f", "synset": "baseball.n.02"}, {"name": "baseball_bat", "instance_count": 2698, "def": "an implement used in baseball by the batter", "synonyms": ["baseball_bat"], "image_count": 1799, "id": 58, "frequency": "f", "synset": "baseball_bat.n.01"}, {"name": "baseball_cap", "instance_count": 9028, "def": "a cap with a bill", "synonyms": ["baseball_cap", "jockey_cap", "golf_cap"], "image_count": 1934, "id": 59, "frequency": "f", "synset": "baseball_cap.n.01"}, {"name": "baseball_glove", "instance_count": 2536, "def": "the handwear used by fielders in playing baseball", "synonyms": ["baseball_glove", "baseball_mitt"], "image_count": 1609, "id": 60, "frequency": "f", "synset": "baseball_glove.n.01"}, {"name": "basket", "instance_count": 3984, "def": "a container that is usually woven and has handles", "synonyms": ["basket", "handbasket"], "image_count": 1622, "id": 61, "frequency": "f", "synset": "basket.n.01"}, {"name": "basketball", "instance_count": 56, "def": "an inflated ball used in playing basketball", "synonyms": ["basketball"], "image_count": 41, "id": 62, "frequency": "c", "synset": "basketball.n.02"}, {"name": "bass_horn", "instance_count": 6, "def": "the lowest brass wind instrument", "synonyms": ["bass_horn", "sousaphone", "tuba"], "image_count": 4, "id": 63, "frequency": "r", "synset": "bass_horn.n.01"}, {"name": "bat_(animal)", "instance_count": 47, "def": "nocturnal mouselike mammal with forelimbs modified to form membranous wings", "synonyms": ["bat_(animal)"], "image_count": 11, "id": 64, "frequency": "c", "synset": "bat.n.01"}, {"name": "bath_mat", "instance_count": 336, "def": "a heavy towel or mat to stand on while drying yourself after a bath", "synonyms": ["bath_mat"], "image_count": 270, "id": 65, "frequency": "f", "synset": "bath_mat.n.01"}, {"name": "bath_towel", "instance_count": 1210, "def": "a large towel; to dry yourself after a bath", "synonyms": ["bath_towel"], "image_count": 349, "id": 66, "frequency": "f", "synset": "bath_towel.n.01"}, {"name": "bathrobe", "instance_count": 53, "def": "a loose-fitting robe of towelling; worn after a bath or swim", "synonyms": ["bathrobe"], "image_count": 42, "id": 67, "frequency": "c", "synset": "bathrobe.n.01"}, {"name": "bathtub", "instance_count": 868, "def": "a large open container that you fill with water and use to wash the body", "synonyms": ["bathtub", "bathing_tub"], "image_count": 823, "id": 68, "frequency": "f", "synset": "bathtub.n.01"}, {"name": "batter_(food)", "instance_count": 26, "def": "a liquid or semiliquid mixture, as of flour, eggs, and milk, used in cooking", "synonyms": ["batter_(food)"], "image_count": 6, "id": 69, "frequency": "r", "synset": "batter.n.02"}, {"name": "battery", "instance_count": 155, "def": "a portable device that produces electricity", "synonyms": ["battery"], "image_count": 48, "id": 70, "frequency": "c", "synset": "battery.n.02"}, {"name": "beachball", "instance_count": 3, "def": "large and light ball; for play at the seaside", "synonyms": ["beachball"], "image_count": 3, "id": 71, "frequency": "r", "synset": "beach_ball.n.01"}, {"name": "bead", "instance_count": 1371, "def": "a small ball with a hole through the middle used for ornamentation, jewellery, etc.", "synonyms": ["bead"], "image_count": 42, "id": 72, "frequency": "c", "synset": "bead.n.01"}, {"name": "bean_curd", "instance_count": 231, "def": "cheeselike food made of curdled soybean milk", "synonyms": ["bean_curd", "tofu"], "image_count": 24, "id": 73, "frequency": "c", "synset": "bean_curd.n.01"}, {"name": "beanbag", "instance_count": 20, "def": "a bag filled with dried beans or similar items; used in games or to sit on", "synonyms": ["beanbag"], "image_count": 16, "id": 74, "frequency": "c", "synset": "beanbag.n.01"}, {"name": "beanie", "instance_count": 1907, "def": "a small skullcap; formerly worn by schoolboys and college freshmen", "synonyms": ["beanie", "beany"], "image_count": 605, "id": 75, "frequency": "f", "synset": "beanie.n.01"}, {"name": "bear", "instance_count": 1069, "def": "large carnivorous or omnivorous mammals with shaggy coats and claws", "synonyms": ["bear"], "image_count": 646, "id": 76, "frequency": "f", "synset": "bear.n.01"}, {"name": "bed", "instance_count": 2137, "def": "a piece of furniture that provides a place to sleep", "synonyms": ["bed"], "image_count": 1765, "id": 77, "frequency": "f", "synset": "bed.n.01"}, {"name": "bedpan", "instance_count": 2, "def": "a shallow vessel used by a bedridden patient for defecation and urination", "synonyms": ["bedpan"], "image_count": 2, "id": 78, "frequency": "r", "synset": "bedpan.n.01"}, {"name": "bedspread", "instance_count": 188, "def": "decorative cover for a bed", "synonyms": ["bedspread", "bedcover", "bed_covering", "counterpane", "spread"], "image_count": 125, "id": 79, "frequency": "f", "synset": "bedspread.n.01"}, {"name": "cow", "instance_count": 8085, "def": "cattle/cow", "synonyms": ["cow"], "image_count": 1420, "id": 80, "frequency": "f", "synset": "beef.n.01"}, {"name": "beef_(food)", "instance_count": 1242, "def": "meat from an adult domestic bovine", "synonyms": ["beef_(food)", "boeuf_(food)"], "image_count": 140, "id": 81, "frequency": "f", "synset": "beef.n.02"}, {"name": "beeper", "instance_count": 4, "def": "an device that beeps when the person carrying it is being paged", "synonyms": ["beeper", "pager"], "image_count": 4, "id": 82, "frequency": "r", "synset": "beeper.n.01"}, {"name": "beer_bottle", "instance_count": 1227, "def": "a bottle that holds beer", "synonyms": ["beer_bottle"], "image_count": 322, "id": 83, "frequency": "f", "synset": "beer_bottle.n.01"}, {"name": "beer_can", "instance_count": 203, "def": "a can that holds beer", "synonyms": ["beer_can"], "image_count": 60, "id": 84, "frequency": "c", "synset": "beer_can.n.01"}, {"name": "beetle", "instance_count": 9, "def": "insect with hard wing covers", "synonyms": ["beetle"], "image_count": 2, "id": 85, "frequency": "r", "synset": "beetle.n.01"}, {"name": "bell", "instance_count": 590, "def": "a hollow device made of metal that makes a ringing sound when struck", "synonyms": ["bell"], "image_count": 231, "id": 86, "frequency": "f", "synset": "bell.n.01"}, {"name": "bell_pepper", "instance_count": 4369, "def": "large bell-shaped sweet pepper in green or red or yellow or orange or black varieties", "synonyms": ["bell_pepper", "capsicum"], "image_count": 333, "id": 87, "frequency": "f", "synset": "bell_pepper.n.02"}, {"name": "belt", "instance_count": 3683, "def": "a band to tie or buckle around the body (usually at the waist)", "synonyms": ["belt"], "image_count": 1941, "id": 88, "frequency": "f", "synset": "belt.n.02"}, {"name": "belt_buckle", "instance_count": 589, "def": "the buckle used to fasten a belt", "synonyms": ["belt_buckle"], "image_count": 367, "id": 89, "frequency": "f", "synset": "belt_buckle.n.01"}, {"name": "bench", "instance_count": 4374, "def": "a long seat for more than one person", "synonyms": ["bench"], "image_count": 1922, "id": 90, "frequency": "f", "synset": "bench.n.01"}, {"name": "beret", "instance_count": 57, "def": "a cap with no brim or bill; made of soft cloth", "synonyms": ["beret"], "image_count": 18, "id": 91, "frequency": "c", "synset": "beret.n.01"}, {"name": "bib", "instance_count": 96, "def": "a napkin tied under the chin of a child while eating", "synonyms": ["bib"], "image_count": 81, "id": 92, "frequency": "c", "synset": "bib.n.02"}, {"name": "Bible", "instance_count": 2, "def": "the sacred writings of the Christian religions", "synonyms": ["Bible"], "image_count": 1, "id": 93, "frequency": "r", "synset": "bible.n.01"}, {"name": "bicycle", "instance_count": 4566, "def": "a wheeled vehicle that has two wheels and is moved by foot pedals", "synonyms": ["bicycle", "bike_(bicycle)"], "image_count": 1852, "id": 94, "frequency": "f", "synset": "bicycle.n.01"}, {"name": "visor", "instance_count": 777, "def": "a brim that projects to the front to shade the eyes", "synonyms": ["visor", "vizor"], "image_count": 430, "id": 95, "frequency": "f", "synset": "bill.n.09"}, {"name": "billboard", "instance_count": 1025, "def": "large outdoor signboard", "synonyms": ["billboard"], "image_count": 247, "id": 96, "frequency": "f", "synset": "billboard.n.01"}, {"name": "binder", "instance_count": 311, "def": "holds loose papers or magazines", "synonyms": ["binder", "ring-binder"], "image_count": 94, "id": 97, "frequency": "c", "synset": "binder.n.03"}, {"name": "binoculars", "instance_count": 22, "def": "an optical instrument designed for simultaneous use by both eyes", "synonyms": ["binoculars", "field_glasses", "opera_glasses"], "image_count": 21, "id": 98, "frequency": "c", "synset": "binoculars.n.01"}, {"name": "bird", "instance_count": 11557, "def": "animal characterized by feathers and wings", "synonyms": ["bird"], "image_count": 1821, "id": 99, "frequency": "f", "synset": "bird.n.01"}, {"name": "birdfeeder", "instance_count": 16, "def": "an outdoor device that supplies food for wild birds", "synonyms": ["birdfeeder"], "image_count": 16, "id": 100, "frequency": "c", "synset": "bird_feeder.n.01"}, {"name": "birdbath", "instance_count": 12, "def": "an ornamental basin (usually in a garden) for birds to bathe in", "synonyms": ["birdbath"], "image_count": 12, "id": 101, "frequency": "c", "synset": "birdbath.n.01"}, {"name": "birdcage", "instance_count": 180, "def": "a cage in which a bird can be kept", "synonyms": ["birdcage"], "image_count": 25, "id": 102, "frequency": "c", "synset": "birdcage.n.01"}, {"name": "birdhouse", "instance_count": 60, "def": "a shelter for birds", "synonyms": ["birdhouse"], "image_count": 41, "id": 103, "frequency": "c", "synset": "birdhouse.n.01"}, {"name": "birthday_cake", "instance_count": 311, "def": "decorated cake served at a birthday party", "synonyms": ["birthday_cake"], "image_count": 244, "id": 104, "frequency": "f", "synset": "birthday_cake.n.01"}, {"name": "birthday_card", "instance_count": 23, "def": "a card expressing a birthday greeting", "synonyms": ["birthday_card"], "image_count": 7, "id": 105, "frequency": "r", "synset": "birthday_card.n.01"}, {"name": "pirate_flag", "instance_count": 1, "def": "a flag usually bearing a white skull and crossbones on a black background", "synonyms": ["pirate_flag"], "image_count": 1, "id": 106, "frequency": "r", "synset": "black_flag.n.01"}, {"name": "black_sheep", "instance_count": 214, "def": "sheep with a black coat", "synonyms": ["black_sheep"], "image_count": 40, "id": 107, "frequency": "c", "synset": "black_sheep.n.02"}, {"name": "blackberry", "instance_count": 406, "def": "large sweet black or very dark purple edible aggregate fruit", "synonyms": ["blackberry"], "image_count": 40, "id": 108, "frequency": "c", "synset": "blackberry.n.01"}, {"name": "blackboard", "instance_count": 154, "def": "sheet of slate; for writing with chalk", "synonyms": ["blackboard", "chalkboard"], "image_count": 104, "id": 109, "frequency": "f", "synset": "blackboard.n.01"}, {"name": "blanket", "instance_count": 3075, "def": "bedding that keeps a person warm in bed", "synonyms": ["blanket"], "image_count": 1671, "id": 110, "frequency": "f", "synset": "blanket.n.01"}, {"name": "blazer", "instance_count": 124, "def": "lightweight jacket; often striped in the colors of a club or school", "synonyms": ["blazer", "sport_jacket", "sport_coat", "sports_jacket", "sports_coat"], "image_count": 49, "id": 111, "frequency": "c", "synset": "blazer.n.01"}, {"name": "blender", "instance_count": 316, "def": "an electrically powered mixer that mix or chop or liquefy foods", "synonyms": ["blender", "liquidizer", "liquidiser"], "image_count": 243, "id": 112, "frequency": "f", "synset": "blender.n.01"}, {"name": "blimp", "instance_count": 3, "def": "a small nonrigid airship used for observation or as a barrage balloon", "synonyms": ["blimp"], "image_count": 2, "id": 113, "frequency": "r", "synset": "blimp.n.02"}, {"name": "blinker", "instance_count": 1269, "def": "a light that flashes on and off; used as a signal or to send messages", "synonyms": ["blinker", "flasher"], "image_count": 242, "id": 114, "frequency": "f", "synset": "blinker.n.01"}, {"name": "blouse", "instance_count": 623, "def": "a top worn by women", "synonyms": ["blouse"], "image_count": 271, "id": 115, "frequency": "f", "synset": "blouse.n.01"}, {"name": "blueberry", "instance_count": 2114, "def": "sweet edible dark-blue berries of blueberry plants", "synonyms": ["blueberry"], "image_count": 104, "id": 116, "frequency": "f", "synset": "blueberry.n.02"}, {"name": "gameboard", "instance_count": 17, "def": "a flat portable surface (usually rectangular) designed for board games", "synonyms": ["gameboard"], "image_count": 8, "id": 117, "frequency": "r", "synset": "board.n.09"}, {"name": "boat", "instance_count": 9981, "def": "a vessel for travel on water", "synonyms": ["boat", "ship_(boat)"], "image_count": 1758, "id": 118, "frequency": "f", "synset": "boat.n.01"}, {"name": "bob", "instance_count": 2, "def": "a small float usually made of cork; attached to a fishing line", "synonyms": ["bob", "bobber", "bobfloat"], "image_count": 1, "id": 119, "frequency": "r", "synset": "bob.n.05"}, {"name": "bobbin", "instance_count": 190, "def": "a thing around which thread/tape/film or other flexible materials can be wound", "synonyms": ["bobbin", "spool", "reel"], "image_count": 48, "id": 120, "frequency": "c", "synset": "bobbin.n.01"}, {"name": "bobby_pin", "instance_count": 43, "def": "a flat wire hairpin used to hold bobbed hair in place", "synonyms": ["bobby_pin", "hairgrip"], "image_count": 14, "id": 121, "frequency": "c", "synset": "bobby_pin.n.01"}, {"name": "boiled_egg", "instance_count": 125, "def": "egg cooked briefly in the shell in gently boiling water", "synonyms": ["boiled_egg", "coddled_egg"], "image_count": 40, "id": 122, "frequency": "c", "synset": "boiled_egg.n.01"}, {"name": "bolo_tie", "instance_count": 1, "def": "a cord fastened around the neck with an ornamental clasp and worn as a necktie", "synonyms": ["bolo_tie", "bolo", "bola_tie", "bola"], "image_count": 1, "id": 123, "frequency": "r", "synset": "bolo_tie.n.01"}, {"name": "deadbolt", "instance_count": 46, "def": "the part of a lock that is engaged or withdrawn with a key", "synonyms": ["deadbolt"], "image_count": 37, "id": 124, "frequency": "c", "synset": "bolt.n.03"}, {"name": "bolt", "instance_count": 11261, "def": "a screw that screws into a nut to form a fastener", "synonyms": ["bolt"], "image_count": 1510, "id": 125, "frequency": "f", "synset": "bolt.n.06"}, {"name": "bonnet", "instance_count": 10, "def": "a hat tied under the chin", "synonyms": ["bonnet"], "image_count": 6, "id": 126, "frequency": "r", "synset": "bonnet.n.01"}, {"name": "book", "instance_count": 33353, "def": "a written work or composition that has been published", "synonyms": ["book"], "image_count": 1903, "id": 127, "frequency": "f", "synset": "book.n.01"}, {"name": "bookcase", "instance_count": 113, "def": "a piece of furniture with shelves for storing books", "synonyms": ["bookcase"], "image_count": 70, "id": 128, "frequency": "c", "synset": "bookcase.n.01"}, {"name": "booklet", "instance_count": 439, "def": "a small book usually having a paper cover", "synonyms": ["booklet", "brochure", "leaflet", "pamphlet"], "image_count": 86, "id": 129, "frequency": "c", "synset": "booklet.n.01"}, {"name": "bookmark", "instance_count": 15, "def": "a marker (a piece of paper or ribbon) placed between the pages of a book", "synonyms": ["bookmark", "bookmarker"], "image_count": 7, "id": 130, "frequency": "r", "synset": "bookmark.n.01"}, {"name": "boom_microphone", "instance_count": 10, "def": "a pole carrying an overhead microphone projected over a film or tv set", "synonyms": ["boom_microphone", "microphone_boom"], "image_count": 5, "id": 131, "frequency": "r", "synset": "boom.n.04"}, {"name": "boot", "instance_count": 4194, "def": "footwear that covers the whole foot and lower leg", "synonyms": ["boot"], "image_count": 1406, "id": 132, "frequency": "f", "synset": "boot.n.01"}, {"name": "bottle", "instance_count": 7969, "def": "a glass or plastic vessel used for storing drinks or other liquids", "synonyms": ["bottle"], "image_count": 1901, "id": 133, "frequency": "f", "synset": "bottle.n.01"}, {"name": "bottle_opener", "instance_count": 15, "def": "an opener for removing caps or corks from bottles", "synonyms": ["bottle_opener"], "image_count": 15, "id": 134, "frequency": "c", "synset": "bottle_opener.n.01"}, {"name": "bouquet", "instance_count": 53, "def": "an arrangement of flowers that is usually given as a present", "synonyms": ["bouquet"], "image_count": 28, "id": 135, "frequency": "c", "synset": "bouquet.n.01"}, {"name": "bow_(weapon)", "instance_count": 6, "def": "a weapon for shooting arrows", "synonyms": ["bow_(weapon)"], "image_count": 6, "id": 136, "frequency": "r", "synset": "bow.n.04"}, {"name": "bow_(decorative_ribbons)", "instance_count": 1144, "def": "a decorative interlacing of ribbons", "synonyms": ["bow_(decorative_ribbons)"], "image_count": 494, "id": 137, "frequency": "f", "synset": "bow.n.08"}, {"name": "bow-tie", "instance_count": 359, "def": "a man's tie that ties in a bow", "synonyms": ["bow-tie", "bowtie"], "image_count": 234, "id": 138, "frequency": "f", "synset": "bow_tie.n.01"}, {"name": "bowl", "instance_count": 5308, "def": "a dish that is round and open at the top for serving foods", "synonyms": ["bowl"], "image_count": 1922, "id": 139, "frequency": "f", "synset": "bowl.n.03"}, {"name": "pipe_bowl", "instance_count": 1, "def": "a small round container that is open at the top for holding tobacco", "synonyms": ["pipe_bowl"], "image_count": 1, "id": 140, "frequency": "r", "synset": "bowl.n.08"}, {"name": "bowler_hat", "instance_count": 89, "def": "a felt hat that is round and hard with a narrow brim", "synonyms": ["bowler_hat", "bowler", "derby_hat", "derby", "plug_hat"], "image_count": 35, "id": 141, "frequency": "c", "synset": "bowler_hat.n.01"}, {"name": "bowling_ball", "instance_count": 38, "def": "a large ball with finger holes used in the sport of bowling", "synonyms": ["bowling_ball"], "image_count": 5, "id": 142, "frequency": "r", "synset": "bowling_ball.n.01"}, {"name": "box", "instance_count": 7855, "def": "a (usually rectangular) container; may have a lid", "synonyms": ["box"], "image_count": 1828, "id": 143, "frequency": "f", "synset": "box.n.01"}, {"name": "boxing_glove", "instance_count": 22, "def": "large glove coverings the fists of a fighter worn for the sport of boxing", "synonyms": ["boxing_glove"], "image_count": 8, "id": 144, "frequency": "r", "synset": "boxing_glove.n.01"}, {"name": "suspenders", "instance_count": 88, "def": "elastic straps that hold trousers up (usually used in the plural)", "synonyms": ["suspenders"], "image_count": 63, "id": 145, "frequency": "c", "synset": "brace.n.06"}, {"name": "bracelet", "instance_count": 3219, "def": "jewelry worn around the wrist for decoration", "synonyms": ["bracelet", "bangle"], "image_count": 1668, "id": 146, "frequency": "f", "synset": "bracelet.n.02"}, {"name": "brass_plaque", "instance_count": 4, "def": "a memorial made of brass", "synonyms": ["brass_plaque"], "image_count": 4, "id": 147, "frequency": "r", "synset": "brass.n.07"}, {"name": "brassiere", "instance_count": 118, "def": "an undergarment worn by women to support their breasts", "synonyms": ["brassiere", "bra", "bandeau"], "image_count": 95, "id": 148, "frequency": "c", "synset": "brassiere.n.01"}, {"name": "bread-bin", "instance_count": 17, "def": "a container used to keep bread or cake in", "synonyms": ["bread-bin", "breadbox"], "image_count": 17, "id": 149, "frequency": "c", "synset": "bread-bin.n.01"}, {"name": "bread", "instance_count": 6550, "def": "food made from dough of flour or meal and usually raised with yeast or baking powder and then baked", "synonyms": ["bread"], "image_count": 1567, "id": 150, "frequency": "f", "synset": "bread.n.01"}, {"name": "breechcloth", "instance_count": 3, "def": "a garment that provides covering for the loins", "synonyms": ["breechcloth", "breechclout", "loincloth"], "image_count": 2, "id": 151, "frequency": "r", "synset": "breechcloth.n.01"}, {"name": "bridal_gown", "instance_count": 118, "def": "a gown worn by the bride at a wedding", "synonyms": ["bridal_gown", "wedding_gown", "wedding_dress"], "image_count": 103, "id": 152, "frequency": "f", "synset": "bridal_gown.n.01"}, {"name": "briefcase", "instance_count": 84, "def": "a case with a handle; for carrying papers or files or books", "synonyms": ["briefcase"], "image_count": 50, "id": 153, "frequency": "c", "synset": "briefcase.n.01"}, {"name": "broccoli", "instance_count": 12166, "def": "plant with dense clusters of tight green flower buds", "synonyms": ["broccoli"], "image_count": 1309, "id": 154, "frequency": "f", "synset": "broccoli.n.01"}, {"name": "broach", "instance_count": 9, "def": "a decorative pin worn by women", "synonyms": ["broach"], "image_count": 6, "id": 155, "frequency": "r", "synset": "brooch.n.01"}, {"name": "broom", "instance_count": 144, "def": "bundle of straws or twigs attached to a long handle; used for cleaning", "synonyms": ["broom"], "image_count": 92, "id": 156, "frequency": "c", "synset": "broom.n.01"}, {"name": "brownie", "instance_count": 217, "def": "square or bar of very rich chocolate cake usually with nuts", "synonyms": ["brownie"], "image_count": 19, "id": 157, "frequency": "c", "synset": "brownie.n.03"}, {"name": "brussels_sprouts", "instance_count": 590, "def": "the small edible cabbage-like buds growing along a stalk", "synonyms": ["brussels_sprouts"], "image_count": 37, "id": 158, "frequency": "c", "synset": "brussels_sprouts.n.01"}, {"name": "bubble_gum", "instance_count": 4, "def": "a kind of chewing gum that can be blown into bubbles", "synonyms": ["bubble_gum"], "image_count": 4, "id": 159, "frequency": "r", "synset": "bubble_gum.n.01"}, {"name": "bucket", "instance_count": 1346, "def": "a roughly cylindrical vessel that is open at the top", "synonyms": ["bucket", "pail"], "image_count": 709, "id": 160, "frequency": "f", "synset": "bucket.n.01"}, {"name": "horse_buggy", "instance_count": 19, "def": "a small lightweight carriage; drawn by a single horse", "synonyms": ["horse_buggy"], "image_count": 9, "id": 161, "frequency": "r", "synset": "buggy.n.01"}, {"name": "bull", "instance_count": 230, "def": "a cow with horns", "synonyms": ["horned_cow"], "image_count": 82, "id": 162, "frequency": "c", "synset": "bull.n.11"}, {"name": "bulldog", "instance_count": 21, "def": "a thickset short-haired dog with a large head and strong undershot lower jaw", "synonyms": ["bulldog"], "image_count": 15, "id": 163, "frequency": "c", "synset": "bulldog.n.01"}, {"name": "bulldozer", "instance_count": 4, "def": "large powerful tractor; a large blade in front flattens areas of ground", "synonyms": ["bulldozer", "dozer"], "image_count": 3, "id": 164, "frequency": "r", "synset": "bulldozer.n.01"}, {"name": "bullet_train", "instance_count": 80, "def": "a high-speed passenger train", "synonyms": ["bullet_train"], "image_count": 61, "id": 165, "frequency": "c", "synset": "bullet_train.n.01"}, {"name": "bulletin_board", "instance_count": 76, "def": "a board that hangs on a wall; displays announcements", "synonyms": ["bulletin_board", "notice_board"], "image_count": 51, "id": 166, "frequency": "c", "synset": "bulletin_board.n.02"}, {"name": "bulletproof_vest", "instance_count": 27, "def": "a vest capable of resisting the impact of a bullet", "synonyms": ["bulletproof_vest"], "image_count": 5, "id": 167, "frequency": "r", "synset": "bulletproof_vest.n.01"}, {"name": "bullhorn", "instance_count": 15, "def": "a portable loudspeaker with built-in microphone and amplifier", "synonyms": ["bullhorn", "megaphone"], "image_count": 13, "id": 168, "frequency": "c", "synset": "bullhorn.n.01"}, {"name": "bun", "instance_count": 1780, "def": "small rounded bread either plain or sweet", "synonyms": ["bun", "roll"], "image_count": 642, "id": 169, "frequency": "f", "synset": "bun.n.01"}, {"name": "bunk_bed", "instance_count": 44, "def": "beds built one above the other", "synonyms": ["bunk_bed"], "image_count": 24, "id": 170, "frequency": "c", "synset": "bunk_bed.n.01"}, {"name": "buoy", "instance_count": 1404, "def": "a float attached by rope to the seabed to mark channels in a harbor or underwater hazards", "synonyms": ["buoy"], "image_count": 255, "id": 171, "frequency": "f", "synset": "buoy.n.01"}, {"name": "burrito", "instance_count": 14, "def": "a flour tortilla folded around a filling", "synonyms": ["burrito"], "image_count": 9, "id": 172, "frequency": "r", "synset": "burrito.n.01"}, {"name": "bus_(vehicle)", "instance_count": 3281, "def": "a vehicle carrying many passengers; used for public transport", "synonyms": ["bus_(vehicle)", "autobus", "charabanc", "double-decker", "motorbus", "motorcoach"], "image_count": 1808, "id": 173, "frequency": "f", "synset": "bus.n.01"}, {"name": "business_card", "instance_count": 84, "def": "a card on which are printed the person's name and business affiliation", "synonyms": ["business_card"], "image_count": 31, "id": 174, "frequency": "c", "synset": "business_card.n.01"}, {"name": "butter", "instance_count": 308, "def": "an edible emulsion of fat globules made by churning milk or cream; for cooking and table use", "synonyms": ["butter"], "image_count": 158, "id": 175, "frequency": "f", "synset": "butter.n.01"}, {"name": "butterfly", "instance_count": 296, "def": "insect typically having a slender body with knobbed antennae and broad colorful wings", "synonyms": ["butterfly"], "image_count": 80, "id": 176, "frequency": "c", "synset": "butterfly.n.01"}, {"name": "button", "instance_count": 7884, "def": "a round fastener sewn to shirts and coats etc to fit through buttonholes", "synonyms": ["button"], "image_count": 1884, "id": 177, "frequency": "f", "synset": "button.n.01"}, {"name": "cab_(taxi)", "instance_count": 414, "def": "a car that takes passengers where they want to go in exchange for money", "synonyms": ["cab_(taxi)", "taxi", "taxicab"], "image_count": 158, "id": 178, "frequency": "f", "synset": "cab.n.03"}, {"name": "cabana", "instance_count": 20, "def": "a small tent used as a dressing room beside the sea or a swimming pool", "synonyms": ["cabana"], "image_count": 2, "id": 179, "frequency": "r", "synset": "cabana.n.01"}, {"name": "cabin_car", "instance_count": 14, "def": "a car on a freight train for use of the train crew; usually the last car on the train", "synonyms": ["cabin_car", "caboose"], "image_count": 12, "id": 180, "frequency": "c", "synset": "cabin_car.n.01"}, {"name": "cabinet", "instance_count": 7371, "def": "a piece of furniture resembling a cupboard with doors and shelves and drawers", "synonyms": ["cabinet"], "image_count": 1659, "id": 181, "frequency": "f", "synset": "cabinet.n.01"}, {"name": "locker", "instance_count": 95, "def": "a storage compartment for clothes and valuables; usually it has a lock", "synonyms": ["locker", "storage_locker"], "image_count": 7, "id": 182, "frequency": "r", "synset": "cabinet.n.03"}, {"name": "cake", "instance_count": 2297, "def": "baked goods made from or based on a mixture of flour, sugar, eggs, and fat", "synonyms": ["cake"], "image_count": 834, "id": 183, "frequency": "f", "synset": "cake.n.03"}, {"name": "calculator", "instance_count": 60, "def": "a small machine that is used for mathematical calculations", "synonyms": ["calculator"], "image_count": 57, "id": 184, "frequency": "c", "synset": "calculator.n.02"}, {"name": "calendar", "instance_count": 251, "def": "a list or register of events (appointments/social events/court cases, etc)", "synonyms": ["calendar"], "image_count": 174, "id": 185, "frequency": "f", "synset": "calendar.n.02"}, {"name": "calf", "instance_count": 301, "def": "young of domestic cattle", "synonyms": ["calf"], "image_count": 95, "id": 186, "frequency": "c", "synset": "calf.n.01"}, {"name": "camcorder", "instance_count": 45, "def": "a portable television camera and videocassette recorder", "synonyms": ["camcorder"], "image_count": 27, "id": 187, "frequency": "c", "synset": "camcorder.n.01"}, {"name": "camel", "instance_count": 34, "def": "cud-chewing mammal used as a draft or saddle animal in desert regions", "synonyms": ["camel"], "image_count": 22, "id": 188, "frequency": "c", "synset": "camel.n.01"}, {"name": "camera", "instance_count": 2471, "def": "equipment for taking photographs", "synonyms": ["camera"], "image_count": 1391, "id": 189, "frequency": "f", "synset": "camera.n.01"}, {"name": "camera_lens", "instance_count": 167, "def": "a lens that focuses the image in a camera", "synonyms": ["camera_lens"], "image_count": 90, "id": 190, "frequency": "c", "synset": "camera_lens.n.01"}, {"name": "camper_(vehicle)", "instance_count": 102, "def": "a recreational vehicle equipped for camping out while traveling", "synonyms": ["camper_(vehicle)", "camping_bus", "motor_home"], "image_count": 40, "id": 191, "frequency": "c", "synset": "camper.n.02"}, {"name": "can", "instance_count": 1424, "def": "airtight sealed metal container for food or drink or paint etc.", "synonyms": ["can", "tin_can"], "image_count": 445, "id": 192, "frequency": "f", "synset": "can.n.01"}, {"name": "can_opener", "instance_count": 22, "def": "a device for cutting cans open", "synonyms": ["can_opener", "tin_opener"], "image_count": 21, "id": 193, "frequency": "c", "synset": "can_opener.n.01"}, {"name": "candle", "instance_count": 4288, "def": "stick of wax with a wick in the middle", "synonyms": ["candle", "candlestick"], "image_count": 1132, "id": 194, "frequency": "f", "synset": "candle.n.01"}, {"name": "candle_holder", "instance_count": 530, "def": "a holder with sockets for candles", "synonyms": ["candle_holder"], "image_count": 177, "id": 195, "frequency": "f", "synset": "candlestick.n.01"}, {"name": "candy_bar", "instance_count": 29, "def": "a candy shaped as a bar", "synonyms": ["candy_bar"], "image_count": 4, "id": 196, "frequency": "r", "synset": "candy_bar.n.01"}, {"name": "candy_cane", "instance_count": 107, "def": "a hard candy in the shape of a rod (usually with stripes)", "synonyms": ["candy_cane"], "image_count": 17, "id": 197, "frequency": "c", "synset": "candy_cane.n.01"}, {"name": "walking_cane", "instance_count": 106, "def": "a stick that people can lean on to help them walk", "synonyms": ["walking_cane"], "image_count": 84, "id": 198, "frequency": "c", "synset": "cane.n.01"}, {"name": "canister", "instance_count": 218, "def": "metal container for storing dry foods such as tea or flour", "synonyms": ["canister", "cannister"], "image_count": 55, "id": 199, "frequency": "c", "synset": "canister.n.02"}, {"name": "canoe", "instance_count": 96, "def": "small and light boat; pointed at both ends; propelled with a paddle", "synonyms": ["canoe"], "image_count": 30, "id": 200, "frequency": "c", "synset": "canoe.n.01"}, {"name": "cantaloup", "instance_count": 193, "def": "the fruit of a cantaloup vine; small to medium-sized melon with yellowish flesh", "synonyms": ["cantaloup", "cantaloupe"], "image_count": 25, "id": 201, "frequency": "c", "synset": "cantaloup.n.02"}, {"name": "canteen", "instance_count": 2, "def": "a flask for carrying water; used by soldiers or travelers", "synonyms": ["canteen"], "image_count": 2, "id": 202, "frequency": "r", "synset": "canteen.n.01"}, {"name": "cap_(headwear)", "instance_count": 636, "def": "a tight-fitting headwear", "synonyms": ["cap_(headwear)"], "image_count": 125, "id": 203, "frequency": "f", "synset": "cap.n.01"}, {"name": "bottle_cap", "instance_count": 5293, "def": "a top (as for a bottle)", "synonyms": ["bottle_cap", "cap_(container_lid)"], "image_count": 1135, "id": 204, "frequency": "f", "synset": "cap.n.02"}, {"name": "cape", "instance_count": 27, "def": "a sleeveless garment like a cloak but shorter", "synonyms": ["cape"], "image_count": 19, "id": 205, "frequency": "c", "synset": "cape.n.02"}, {"name": "cappuccino", "instance_count": 87, "def": "equal parts of espresso and steamed milk", "synonyms": ["cappuccino", "coffee_cappuccino"], "image_count": 72, "id": 206, "frequency": "c", "synset": "cappuccino.n.01"}, {"name": "car_(automobile)", "instance_count": 10528, "def": "a motor vehicle with four wheels", "synonyms": ["car_(automobile)", "auto_(automobile)", "automobile"], "image_count": 1926, "id": 207, "frequency": "f", "synset": "car.n.01"}, {"name": "railcar_(part_of_a_train)", "instance_count": 928, "def": "a wheeled vehicle adapted to the rails of railroad (mark each individual railcar separately)", "synonyms": ["railcar_(part_of_a_train)", "railway_car_(part_of_a_train)", "railroad_car_(part_of_a_train)"], "image_count": 159, "id": 208, "frequency": "f", "synset": "car.n.02"}, {"name": "elevator_car", "instance_count": 10, "def": "where passengers ride up and down", "synonyms": ["elevator_car"], "image_count": 7, "id": 209, "frequency": "r", "synset": "car.n.04"}, {"name": "car_battery", "instance_count": 1, "def": "a battery in a motor vehicle", "synonyms": ["car_battery", "automobile_battery"], "image_count": 1, "id": 210, "frequency": "r", "synset": "car_battery.n.01"}, {"name": "identity_card", "instance_count": 16, "def": "a card certifying the identity of the bearer", "synonyms": ["identity_card"], "image_count": 13, "id": 211, "frequency": "c", "synset": "card.n.02"}, {"name": "card", "instance_count": 122, "def": "a rectangular piece of paper used to send messages (e.g. greetings or pictures)", "synonyms": ["card"], "image_count": 35, "id": 212, "frequency": "c", "synset": "card.n.03"}, {"name": "cardigan", "instance_count": 22, "def": "knitted jacket that is fastened up the front with buttons or a zipper", "synonyms": ["cardigan"], "image_count": 18, "id": 213, "frequency": "c", "synset": "cardigan.n.01"}, {"name": "cargo_ship", "instance_count": 15, "def": "a ship designed to carry cargo", "synonyms": ["cargo_ship", "cargo_vessel"], "image_count": 8, "id": 214, "frequency": "r", "synset": "cargo_ship.n.01"}, {"name": "carnation", "instance_count": 22, "def": "plant with pink to purple-red spice-scented usually double flowers", "synonyms": ["carnation"], "image_count": 6, "id": 215, "frequency": "r", "synset": "carnation.n.01"}, {"name": "horse_carriage", "instance_count": 49, "def": "a vehicle with wheels drawn by one or more horses", "synonyms": ["horse_carriage"], "image_count": 35, "id": 216, "frequency": "c", "synset": "carriage.n.02"}, {"name": "carrot", "instance_count": 18049, "def": "deep orange edible root of the cultivated carrot plant", "synonyms": ["carrot"], "image_count": 1222, "id": 217, "frequency": "f", "synset": "carrot.n.01"}, {"name": "tote_bag", "instance_count": 231, "def": "a capacious bag or basket", "synonyms": ["tote_bag"], "image_count": 103, "id": 218, "frequency": "f", "synset": "carryall.n.01"}, {"name": "cart", "instance_count": 51, "def": "a heavy open wagon usually having two wheels and drawn by an animal", "synonyms": ["cart"], "image_count": 28, "id": 219, "frequency": "c", "synset": "cart.n.01"}, {"name": "carton", "instance_count": 206, "def": "a container made of cardboard for holding food or drink", "synonyms": ["carton"], "image_count": 63, "id": 220, "frequency": "c", "synset": "carton.n.02"}, {"name": "cash_register", "instance_count": 33, "def": "a cashbox with an adding machine to register transactions", "synonyms": ["cash_register", "register_(for_cash_transactions)"], "image_count": 28, "id": 221, "frequency": "c", "synset": "cash_register.n.01"}, {"name": "casserole", "instance_count": 12, "def": "food cooked and served in a casserole", "synonyms": ["casserole"], "image_count": 5, "id": 222, "frequency": "r", "synset": "casserole.n.01"}, {"name": "cassette", "instance_count": 74, "def": "a container that holds a magnetic tape used for recording or playing sound or video", "synonyms": ["cassette"], "image_count": 7, "id": 223, "frequency": "r", "synset": "cassette.n.01"}, {"name": "cast", "instance_count": 15, "def": "bandage consisting of a firm covering that immobilizes broken bones while they heal", "synonyms": ["cast", "plaster_cast", "plaster_bandage"], "image_count": 14, "id": 224, "frequency": "c", "synset": "cast.n.05"}, {"name": "cat", "instance_count": 2387, "def": "a domestic house cat", "synonyms": ["cat"], "image_count": 1918, "id": 225, "frequency": "f", "synset": "cat.n.01"}, {"name": "cauliflower", "instance_count": 1035, "def": "edible compact head of white undeveloped flowers", "synonyms": ["cauliflower"], "image_count": 133, "id": 226, "frequency": "f", "synset": "cauliflower.n.02"}, {"name": "cayenne_(spice)", "instance_count": 49, "def": "ground pods and seeds of pungent red peppers of the genus Capsicum", "synonyms": ["cayenne_(spice)", "cayenne_pepper_(spice)", "red_pepper_(spice)"], "image_count": 16, "id": 227, "frequency": "c", "synset": "cayenne.n.02"}, {"name": "CD_player", "instance_count": 37, "def": "electronic equipment for playing compact discs (CDs)", "synonyms": ["CD_player"], "image_count": 27, "id": 228, "frequency": "c", "synset": "cd_player.n.01"}, {"name": "celery", "instance_count": 911, "def": "widely cultivated herb with aromatic leaf stalks that are eaten raw or cooked", "synonyms": ["celery"], "image_count": 110, "id": 229, "frequency": "f", "synset": "celery.n.01"}, {"name": "cellular_telephone", "instance_count": 2902, "def": "a hand-held mobile telephone", "synonyms": ["cellular_telephone", "cellular_phone", "cellphone", "mobile_phone", "smart_phone"], "image_count": 1895, "id": 230, "frequency": "f", "synset": "cellular_telephone.n.01"}, {"name": "chain_mail", "instance_count": 13, "def": "(Middle Ages) flexible armor made of interlinked metal rings", "synonyms": ["chain_mail", "ring_mail", "chain_armor", "chain_armour", "ring_armor", "ring_armour"], "image_count": 4, "id": 231, "frequency": "r", "synset": "chain_mail.n.01"}, {"name": "chair", "instance_count": 11549, "def": "a seat for one person, with a support for the back", "synonyms": ["chair"], "image_count": 1927, "id": 232, "frequency": "f", "synset": "chair.n.01"}, {"name": "chaise_longue", "instance_count": 15, "def": "a long chair; for reclining", "synonyms": ["chaise_longue", "chaise", "daybed"], "image_count": 8, "id": 233, "frequency": "r", "synset": "chaise_longue.n.01"}, {"name": "chalice", "instance_count": 1, "def": "a bowl-shaped drinking vessel; especially the Eucharistic cup", "synonyms": ["chalice"], "image_count": 1, "id": 234, "frequency": "r", "synset": "chalice.n.01"}, {"name": "chandelier", "instance_count": 392, "def": "branched lighting fixture; often ornate; hangs from the ceiling", "synonyms": ["chandelier"], "image_count": 263, "id": 235, "frequency": "f", "synset": "chandelier.n.01"}, {"name": "chap", "instance_count": 19, "def": "leather leggings without a seat; worn over trousers by cowboys to protect their legs", "synonyms": ["chap"], "image_count": 10, "id": 236, "frequency": "r", "synset": "chap.n.04"}, {"name": "checkbook", "instance_count": 2, "def": "a book issued to holders of checking accounts", "synonyms": ["checkbook", "chequebook"], "image_count": 2, "id": 237, "frequency": "r", "synset": "checkbook.n.01"}, {"name": "checkerboard", "instance_count": 3, "def": "a board having 64 squares of two alternating colors", "synonyms": ["checkerboard"], "image_count": 3, "id": 238, "frequency": "r", "synset": "checkerboard.n.01"}, {"name": "cherry", "instance_count": 903, "def": "a red fruit with a single hard stone", "synonyms": ["cherry"], "image_count": 87, "id": 239, "frequency": "c", "synset": "cherry.n.03"}, {"name": "chessboard", "instance_count": 13, "def": "a checkerboard used to play chess", "synonyms": ["chessboard"], "image_count": 9, "id": 240, "frequency": "r", "synset": "chessboard.n.01"}, {"name": "chicken_(animal)", "instance_count": 417, "def": "a domestic fowl bred for flesh or eggs", "synonyms": ["chicken_(animal)"], "image_count": 71, "id": 241, "frequency": "c", "synset": "chicken.n.02"}, {"name": "chickpea", "instance_count": 265, "def": "the seed of the chickpea plant; usually dried", "synonyms": ["chickpea", "garbanzo"], "image_count": 13, "id": 242, "frequency": "c", "synset": "chickpea.n.01"}, {"name": "chili_(vegetable)", "instance_count": 354, "def": "very hot and finely tapering pepper of special pungency", "synonyms": ["chili_(vegetable)", "chili_pepper_(vegetable)", "chilli_(vegetable)", "chilly_(vegetable)", "chile_(vegetable)"], "image_count": 18, "id": 243, "frequency": "c", "synset": "chili.n.02"}, {"name": "chime", "instance_count": 2, "def": "an instrument consisting of a set of bells that are struck with a hammer", "synonyms": ["chime", "gong"], "image_count": 2, "id": 244, "frequency": "r", "synset": "chime.n.01"}, {"name": "chinaware", "instance_count": 41, "def": "dishware made of high quality porcelain", "synonyms": ["chinaware"], "image_count": 5, "id": 245, "frequency": "r", "synset": "chinaware.n.01"}, {"name": "crisp_(potato_chip)", "instance_count": 541, "def": "a thin crisp slice of potato fried in deep fat", "synonyms": ["crisp_(potato_chip)", "potato_chip"], "image_count": 45, "id": 246, "frequency": "c", "synset": "chip.n.04"}, {"name": "poker_chip", "instance_count": 21, "def": "a small disk-shaped counter used to represent money when gambling", "synonyms": ["poker_chip"], "image_count": 1, "id": 247, "frequency": "r", "synset": "chip.n.06"}, {"name": "chocolate_bar", "instance_count": 179, "def": "a bar of chocolate candy", "synonyms": ["chocolate_bar"], "image_count": 23, "id": 248, "frequency": "c", "synset": "chocolate_bar.n.01"}, {"name": "chocolate_cake", "instance_count": 80, "def": "cake containing chocolate", "synonyms": ["chocolate_cake"], "image_count": 32, "id": 249, "frequency": "c", "synset": "chocolate_cake.n.01"}, {"name": "chocolate_milk", "instance_count": 7, "def": "milk flavored with chocolate syrup", "synonyms": ["chocolate_milk"], "image_count": 4, "id": 250, "frequency": "r", "synset": "chocolate_milk.n.01"}, {"name": "chocolate_mousse", "instance_count": 1, "def": "dessert mousse made with chocolate", "synonyms": ["chocolate_mousse"], "image_count": 1, "id": 251, "frequency": "r", "synset": "chocolate_mousse.n.01"}, {"name": "choker", "instance_count": 1380, "def": "shirt collar, animal collar, or tight-fitting necklace", "synonyms": ["choker", "collar", "neckband"], "image_count": 858, "id": 252, "frequency": "f", "synset": "choker.n.03"}, {"name": "chopping_board", "instance_count": 840, "def": "a wooden board where meats or vegetables can be cut", "synonyms": ["chopping_board", "cutting_board", "chopping_block"], "image_count": 661, "id": 253, "frequency": "f", "synset": "chopping_board.n.01"}, {"name": "chopstick", "instance_count": 557, "def": "one of a pair of slender sticks used as oriental tableware to eat food with", "synonyms": ["chopstick"], "image_count": 168, "id": 254, "frequency": "f", "synset": "chopstick.n.01"}, {"name": "Christmas_tree", "instance_count": 303, "def": "an ornamented evergreen used as a Christmas decoration", "synonyms": ["Christmas_tree"], "image_count": 210, "id": 255, "frequency": "f", "synset": "christmas_tree.n.05"}, {"name": "slide", "instance_count": 106, "def": "sloping channel through which things can descend", "synonyms": ["slide"], "image_count": 65, "id": 256, "frequency": "c", "synset": "chute.n.02"}, {"name": "cider", "instance_count": 38, "def": "a beverage made from juice pressed from apples", "synonyms": ["cider", "cyder"], "image_count": 4, "id": 257, "frequency": "r", "synset": "cider.n.01"}, {"name": "cigar_box", "instance_count": 3, "def": "a box for holding cigars", "synonyms": ["cigar_box"], "image_count": 2, "id": 258, "frequency": "r", "synset": "cigar_box.n.01"}, {"name": "cigarette", "instance_count": 269, "def": "finely ground tobacco wrapped in paper; for smoking", "synonyms": ["cigarette"], "image_count": 159, "id": 259, "frequency": "f", "synset": "cigarette.n.01"}, {"name": "cigarette_case", "instance_count": 35, "def": "a small flat case for holding cigarettes", "synonyms": ["cigarette_case", "cigarette_pack"], "image_count": 31, "id": 260, "frequency": "c", "synset": "cigarette_case.n.01"}, {"name": "cistern", "instance_count": 901, "def": "a tank that holds the water used to flush a toilet", "synonyms": ["cistern", "water_tank"], "image_count": 811, "id": 261, "frequency": "f", "synset": "cistern.n.02"}, {"name": "clarinet", "instance_count": 1, "def": "a single-reed instrument with a straight tube", "synonyms": ["clarinet"], "image_count": 1, "id": 262, "frequency": "r", "synset": "clarinet.n.01"}, {"name": "clasp", "instance_count": 197, "def": "a fastener (as a buckle or hook) that is used to hold two things together", "synonyms": ["clasp"], "image_count": 42, "id": 263, "frequency": "c", "synset": "clasp.n.01"}, {"name": "cleansing_agent", "instance_count": 63, "def": "a preparation used in cleaning something", "synonyms": ["cleansing_agent", "cleanser", "cleaner"], "image_count": 27, "id": 264, "frequency": "c", "synset": "cleansing_agent.n.01"}, {"name": "cleat_(for_securing_rope)", "instance_count": 8, "def": "a fastener (usually with two projecting horns) around which a rope can be secured", "synonyms": ["cleat_(for_securing_rope)"], "image_count": 2, "id": 265, "frequency": "r", "synset": "cleat.n.02"}, {"name": "clementine", "instance_count": 108, "def": "a variety of mandarin orange", "synonyms": ["clementine"], "image_count": 5, "id": 266, "frequency": "r", "synset": "clementine.n.01"}, {"name": "clip", "instance_count": 301, "def": "any of various small fasteners used to hold loose articles together", "synonyms": ["clip"], "image_count": 95, "id": 267, "frequency": "c", "synset": "clip.n.03"}, {"name": "clipboard", "instance_count": 36, "def": "a small writing board with a clip at the top for holding papers", "synonyms": ["clipboard"], "image_count": 32, "id": 268, "frequency": "c", "synset": "clipboard.n.01"}, {"name": "clippers_(for_plants)", "instance_count": 1, "def": "shears for cutting grass or shrubbery (often used in the plural)", "synonyms": ["clippers_(for_plants)"], "image_count": 1, "id": 269, "frequency": "r", "synset": "clipper.n.03"}, {"name": "cloak", "instance_count": 1, "def": "a loose outer garment", "synonyms": ["cloak"], "image_count": 1, "id": 270, "frequency": "r", "synset": "cloak.n.02"}, {"name": "clock", "instance_count": 2677, "def": "a timepiece that shows the time of day", "synonyms": ["clock", "timepiece", "timekeeper"], "image_count": 1844, "id": 271, "frequency": "f", "synset": "clock.n.01"}, {"name": "clock_tower", "instance_count": 932, "def": "a tower with a large clock visible high up on an outside face", "synonyms": ["clock_tower"], "image_count": 897, "id": 272, "frequency": "f", "synset": "clock_tower.n.01"}, {"name": "clothes_hamper", "instance_count": 47, "def": "a hamper that holds dirty clothes to be washed or wet clothes to be dried", "synonyms": ["clothes_hamper", "laundry_basket", "clothes_basket"], "image_count": 31, "id": 273, "frequency": "c", "synset": "clothes_hamper.n.01"}, {"name": "clothespin", "instance_count": 111, "def": "wood or plastic fastener; for holding clothes on a clothesline", "synonyms": ["clothespin", "clothes_peg"], "image_count": 23, "id": 274, "frequency": "c", "synset": "clothespin.n.01"}, {"name": "clutch_bag", "instance_count": 1, "def": "a woman's strapless purse that is carried in the hand", "synonyms": ["clutch_bag"], "image_count": 1, "id": 275, "frequency": "r", "synset": "clutch_bag.n.01"}, {"name": "coaster", "instance_count": 390, "def": "a covering (plate or mat) that protects the surface of a table", "synonyms": ["coaster"], "image_count": 202, "id": 276, "frequency": "f", "synset": "coaster.n.03"}, {"name": "coat", "instance_count": 4145, "def": "an outer garment that has sleeves and covers the body from shoulder down", "synonyms": ["coat"], "image_count": 746, "id": 277, "frequency": "f", "synset": "coat.n.01"}, {"name": "coat_hanger", "instance_count": 282, "def": "a hanger that is shaped like a person's shoulders", "synonyms": ["coat_hanger", "clothes_hanger", "dress_hanger"], "image_count": 44, "id": 278, "frequency": "c", "synset": "coat_hanger.n.01"}, {"name": "coatrack", "instance_count": 16, "def": "a rack with hooks for temporarily holding coats and hats", "synonyms": ["coatrack", "hatrack"], "image_count": 14, "id": 279, "frequency": "c", "synset": "coatrack.n.01"}, {"name": "cock", "instance_count": 132, "def": "adult male chicken", "synonyms": ["cock", "rooster"], "image_count": 26, "id": 280, "frequency": "c", "synset": "cock.n.04"}, {"name": "cockroach", "instance_count": 1, "def": "any of numerous chiefly nocturnal insects; some are domestic pests", "synonyms": ["cockroach"], "image_count": 1, "id": 281, "frequency": "r", "synset": "cockroach.n.01"}, {"name": "cocoa_(beverage)", "instance_count": 4, "def": "a beverage made from cocoa powder and milk and sugar; usually drunk hot", "synonyms": ["cocoa_(beverage)", "hot_chocolate_(beverage)", "drinking_chocolate"], "image_count": 2, "id": 282, "frequency": "r", "synset": "cocoa.n.01"}, {"name": "coconut", "instance_count": 273, "def": "large hard-shelled brown oval nut with a fibrous husk", "synonyms": ["coconut", "cocoanut"], "image_count": 25, "id": 283, "frequency": "c", "synset": "coconut.n.02"}, {"name": "coffee_maker", "instance_count": 271, "def": "a kitchen appliance for brewing coffee automatically", "synonyms": ["coffee_maker", "coffee_machine"], "image_count": 238, "id": 284, "frequency": "f", "synset": "coffee_maker.n.01"}, {"name": "coffee_table", "instance_count": 709, "def": "low table where magazines can be placed and coffee or cocktails are served", "synonyms": ["coffee_table", "cocktail_table"], "image_count": 592, "id": 285, "frequency": "f", "synset": "coffee_table.n.01"}, {"name": "coffeepot", "instance_count": 32, "def": "tall pot in which coffee is brewed", "synonyms": ["coffeepot"], "image_count": 26, "id": 286, "frequency": "c", "synset": "coffeepot.n.01"}, {"name": "coil", "instance_count": 7, "def": "tubing that is wound in a spiral", "synonyms": ["coil"], "image_count": 5, "id": 287, "frequency": "r", "synset": "coil.n.05"}, {"name": "coin", "instance_count": 305, "def": "a flat metal piece (usually a disc) used as money", "synonyms": ["coin"], "image_count": 42, "id": 288, "frequency": "c", "synset": "coin.n.01"}, {"name": "colander", "instance_count": 16, "def": "bowl-shaped strainer; used to wash or drain foods", "synonyms": ["colander", "cullender"], "image_count": 13, "id": 289, "frequency": "c", "synset": "colander.n.01"}, {"name": "coleslaw", "instance_count": 72, "def": "basically shredded cabbage", "synonyms": ["coleslaw", "slaw"], "image_count": 46, "id": 290, "frequency": "c", "synset": "coleslaw.n.01"}, {"name": "coloring_material", "instance_count": 1, "def": "any material used for its color", "synonyms": ["coloring_material", "colouring_material"], "image_count": 1, "id": 291, "frequency": "r", "synset": "coloring_material.n.01"}, {"name": "combination_lock", "instance_count": 13, "def": "lock that can be opened only by turning dials in a special sequence", "synonyms": ["combination_lock"], "image_count": 8, "id": 292, "frequency": "r", "synset": "combination_lock.n.01"}, {"name": "pacifier", "instance_count": 40, "def": "device used for an infant to suck or bite on", "synonyms": ["pacifier", "teething_ring"], "image_count": 34, "id": 293, "frequency": "c", "synset": "comforter.n.04"}, {"name": "comic_book", "instance_count": 97, "def": "a magazine devoted to comic strips", "synonyms": ["comic_book"], "image_count": 5, "id": 294, "frequency": "r", "synset": "comic_book.n.01"}, {"name": "compass", "instance_count": 1, "def": "navigational instrument for finding directions", "synonyms": ["compass"], "image_count": 1, "id": 295, "frequency": "r", "synset": "compass.n.01"}, {"name": "computer_keyboard", "instance_count": 2745, "def": "a keyboard that is a data input device for computers", "synonyms": ["computer_keyboard", "keyboard_(computer)"], "image_count": 1871, "id": 296, "frequency": "f", "synset": "computer_keyboard.n.01"}, {"name": "condiment", "instance_count": 2985, "def": "a preparation (a sauce or relish or spice) to enhance flavor or enjoyment", "synonyms": ["condiment"], "image_count": 717, "id": 297, "frequency": "f", "synset": "condiment.n.01"}, {"name": "cone", "instance_count": 4081, "def": "a cone-shaped object used to direct traffic", "synonyms": ["cone", "traffic_cone"], "image_count": 1010, "id": 298, "frequency": "f", "synset": "cone.n.01"}, {"name": "control", "instance_count": 1775, "def": "a mechanism that controls the operation of a machine", "synonyms": ["control", "controller"], "image_count": 679, "id": 299, "frequency": "f", "synset": "control.n.09"}, {"name": "convertible_(automobile)", "instance_count": 4, "def": "a car that has top that can be folded or removed", "synonyms": ["convertible_(automobile)"], "image_count": 3, "id": 300, "frequency": "r", "synset": "convertible.n.01"}, {"name": "sofa_bed", "instance_count": 5, "def": "a sofa that can be converted into a bed", "synonyms": ["sofa_bed"], "image_count": 4, "id": 301, "frequency": "r", "synset": "convertible.n.03"}, {"name": "cooker", "instance_count": 1, "def": "a utensil for cooking", "synonyms": ["cooker"], "image_count": 1, "id": 302, "frequency": "r", "synset": "cooker.n.01"}, {"name": "cookie", "instance_count": 1920, "def": "any of various small flat sweet cakes (`biscuit' is the British term)", "synonyms": ["cookie", "cooky", "biscuit_(cookie)"], "image_count": 166, "id": 303, "frequency": "f", "synset": "cookie.n.01"}, {"name": "cooking_utensil", "instance_count": 18, "def": "a kitchen utensil made of material that does not melt easily; used for cooking", "synonyms": ["cooking_utensil"], "image_count": 2, "id": 304, "frequency": "r", "synset": "cooking_utensil.n.01"}, {"name": "cooler_(for_food)", "instance_count": 499, "def": "an insulated box for storing food often with ice", "synonyms": ["cooler_(for_food)", "ice_chest"], "image_count": 266, "id": 305, "frequency": "f", "synset": "cooler.n.01"}, {"name": "cork_(bottle_plug)", "instance_count": 326, "def": "the plug in the mouth of a bottle (especially a wine bottle)", "synonyms": ["cork_(bottle_plug)", "bottle_cork"], "image_count": 101, "id": 306, "frequency": "f", "synset": "cork.n.04"}, {"name": "corkboard", "instance_count": 7, "def": "a sheet consisting of cork granules", "synonyms": ["corkboard"], "image_count": 6, "id": 307, "frequency": "r", "synset": "corkboard.n.01"}, {"name": "corkscrew", "instance_count": 15, "def": "a bottle opener that pulls corks", "synonyms": ["corkscrew", "bottle_screw"], "image_count": 14, "id": 308, "frequency": "c", "synset": "corkscrew.n.01"}, {"name": "edible_corn", "instance_count": 1883, "def": "ears or kernels of corn that can be prepared and served for human food (only mark individual ears or kernels)", "synonyms": ["edible_corn", "corn", "maize"], "image_count": 133, "id": 309, "frequency": "f", "synset": "corn.n.03"}, {"name": "cornbread", "instance_count": 10, "def": "bread made primarily of cornmeal", "synonyms": ["cornbread"], "image_count": 2, "id": 310, "frequency": "r", "synset": "cornbread.n.01"}, {"name": "cornet", "instance_count": 65, "def": "a brass musical instrument with a narrow tube and a flared bell and many valves", "synonyms": ["cornet", "horn", "trumpet"], "image_count": 38, "id": 311, "frequency": "c", "synset": "cornet.n.01"}, {"name": "cornice", "instance_count": 149, "def": "a decorative framework to conceal curtain fixtures at the top of a window casing", "synonyms": ["cornice", "valance", "valance_board", "pelmet"], "image_count": 95, "id": 312, "frequency": "c", "synset": "cornice.n.01"}, {"name": "cornmeal", "instance_count": 1, "def": "coarsely ground corn", "synonyms": ["cornmeal"], "image_count": 1, "id": 313, "frequency": "r", "synset": "cornmeal.n.01"}, {"name": "corset", "instance_count": 12, "def": "a woman's close-fitting foundation garment", "synonyms": ["corset", "girdle"], "image_count": 12, "id": 314, "frequency": "c", "synset": "corset.n.01"}, {"name": "costume", "instance_count": 124, "def": "the attire characteristic of a country or a time or a social class", "synonyms": ["costume"], "image_count": 49, "id": 315, "frequency": "c", "synset": "costume.n.04"}, {"name": "cougar", "instance_count": 6, "def": "large American feline resembling a lion", "synonyms": ["cougar", "puma", "catamount", "mountain_lion", "panther"], "image_count": 5, "id": 316, "frequency": "r", "synset": "cougar.n.01"}, {"name": "coverall", "instance_count": 12, "def": "a loose-fitting protective garment that is worn over other clothing", "synonyms": ["coverall"], "image_count": 5, "id": 317, "frequency": "r", "synset": "coverall.n.01"}, {"name": "cowbell", "instance_count": 29, "def": "a bell hung around the neck of cow so that the cow can be easily located", "synonyms": ["cowbell"], "image_count": 16, "id": 318, "frequency": "c", "synset": "cowbell.n.01"}, {"name": "cowboy_hat", "instance_count": 535, "def": "a hat with a wide brim and a soft crown; worn by American ranch hands", "synonyms": ["cowboy_hat", "ten-gallon_hat"], "image_count": 216, "id": 319, "frequency": "f", "synset": "cowboy_hat.n.01"}, {"name": "crab_(animal)", "instance_count": 50, "def": "decapod having eyes on short stalks and a broad flattened shell and pincers", "synonyms": ["crab_(animal)"], "image_count": 12, "id": 320, "frequency": "c", "synset": "crab.n.01"}, {"name": "crabmeat", "instance_count": 5, "def": "the edible flesh of any of various crabs", "synonyms": ["crabmeat"], "image_count": 1, "id": 321, "frequency": "r", "synset": "crab.n.05"}, {"name": "cracker", "instance_count": 510, "def": "a thin crisp wafer", "synonyms": ["cracker"], "image_count": 54, "id": 322, "frequency": "c", "synset": "cracker.n.01"}, {"name": "crape", "instance_count": 12, "def": "small very thin pancake", "synonyms": ["crape", "crepe", "French_pancake"], "image_count": 5, "id": 323, "frequency": "r", "synset": "crape.n.01"}, {"name": "crate", "instance_count": 1832, "def": "a rugged box (usually made of wood); used for shipping", "synonyms": ["crate"], "image_count": 245, "id": 324, "frequency": "f", "synset": "crate.n.01"}, {"name": "crayon", "instance_count": 59, "def": "writing or drawing implement made of a colored stick of composition wax", "synonyms": ["crayon", "wax_crayon"], "image_count": 12, "id": 325, "frequency": "c", "synset": "crayon.n.01"}, {"name": "cream_pitcher", "instance_count": 10, "def": "a small pitcher for serving cream", "synonyms": ["cream_pitcher"], "image_count": 7, "id": 326, "frequency": "r", "synset": "cream_pitcher.n.01"}, {"name": "crescent_roll", "instance_count": 152, "def": "very rich flaky crescent-shaped roll", "synonyms": ["crescent_roll", "croissant"], "image_count": 35, "id": 327, "frequency": "c", "synset": "crescent_roll.n.01"}, {"name": "crib", "instance_count": 40, "def": "baby bed with high sides made of slats", "synonyms": ["crib", "cot"], "image_count": 36, "id": 328, "frequency": "c", "synset": "crib.n.01"}, {"name": "crock_pot", "instance_count": 128, "def": "an earthen jar (made of baked clay) or a modern electric crockpot", "synonyms": ["crock_pot", "earthenware_jar"], "image_count": 32, "id": 329, "frequency": "c", "synset": "crock.n.03"}, {"name": "crossbar", "instance_count": 6991, "def": "a horizontal bar that goes across something", "synonyms": ["crossbar"], "image_count": 1027, "id": 330, "frequency": "f", "synset": "crossbar.n.01"}, {"name": "crouton", "instance_count": 140, "def": "a small piece of toasted or fried bread; served in soup or salads", "synonyms": ["crouton"], "image_count": 10, "id": 331, "frequency": "r", "synset": "crouton.n.01"}, {"name": "crow", "instance_count": 24, "def": "black birds having a raucous call", "synonyms": ["crow"], "image_count": 12, "id": 332, "frequency": "c", "synset": "crow.n.01"}, {"name": "crowbar", "instance_count": 1, "def": "a heavy iron lever with one end forged into a wedge", "synonyms": ["crowbar", "wrecking_bar", "pry_bar"], "image_count": 1, "id": 333, "frequency": "r", "synset": "crowbar.n.01"}, {"name": "crown", "instance_count": 126, "def": "an ornamental jeweled headdress signifying sovereignty", "synonyms": ["crown"], "image_count": 67, "id": 334, "frequency": "c", "synset": "crown.n.04"}, {"name": "crucifix", "instance_count": 99, "def": "representation of the cross on which Jesus died", "synonyms": ["crucifix"], "image_count": 71, "id": 335, "frequency": "c", "synset": "crucifix.n.01"}, {"name": "cruise_ship", "instance_count": 35, "def": "a passenger ship used commercially for pleasure cruises", "synonyms": ["cruise_ship", "cruise_liner"], "image_count": 30, "id": 336, "frequency": "c", "synset": "cruise_ship.n.01"}, {"name": "police_cruiser", "instance_count": 86, "def": "a car in which policemen cruise the streets", "synonyms": ["police_cruiser", "patrol_car", "police_car", "squad_car"], "image_count": 48, "id": 337, "frequency": "c", "synset": "cruiser.n.01"}, {"name": "crumb", "instance_count": 3021, "def": "small piece of e.g. bread or cake", "synonyms": ["crumb"], "image_count": 249, "id": 338, "frequency": "f", "synset": "crumb.n.03"}, {"name": "crutch", "instance_count": 20, "def": "a wooden or metal staff that fits under the armpit and reaches to the ground", "synonyms": ["crutch"], "image_count": 13, "id": 339, "frequency": "c", "synset": "crutch.n.01"}, {"name": "cub_(animal)", "instance_count": 55, "def": "the young of certain carnivorous mammals such as the bear or wolf or lion", "synonyms": ["cub_(animal)"], "image_count": 29, "id": 340, "frequency": "c", "synset": "cub.n.03"}, {"name": "cube", "instance_count": 189, "def": "a block in the (approximate) shape of a cube", "synonyms": ["cube", "square_block"], "image_count": 14, "id": 341, "frequency": "c", "synset": "cube.n.05"}, {"name": "cucumber", "instance_count": 1533, "def": "cylindrical green fruit with thin green rind and white flesh eaten as a vegetable", "synonyms": ["cucumber", "cuke"], "image_count": 236, "id": 342, "frequency": "f", "synset": "cucumber.n.02"}, {"name": "cufflink", "instance_count": 17, "def": "jewelry consisting of linked buttons used to fasten the cuffs of a shirt", "synonyms": ["cufflink"], "image_count": 15, "id": 343, "frequency": "c", "synset": "cufflink.n.01"}, {"name": "cup", "instance_count": 4637, "def": "a small open container usually used for drinking; usually has a handle", "synonyms": ["cup"], "image_count": 1521, "id": 344, "frequency": "f", "synset": "cup.n.01"}, {"name": "trophy_cup", "instance_count": 80, "def": "a metal award or cup-shaped vessel with handles that is awarded as a trophy to a competition winner", "synonyms": ["trophy_cup"], "image_count": 25, "id": 345, "frequency": "c", "synset": "cup.n.08"}, {"name": "cupboard", "instance_count": 1623, "def": "a small room (or recess) or cabinet used for storage space", "synonyms": ["cupboard", "closet"], "image_count": 249, "id": 346, "frequency": "f", "synset": "cupboard.n.01"}, {"name": "cupcake", "instance_count": 1628, "def": "small cake baked in a muffin tin", "synonyms": ["cupcake"], "image_count": 139, "id": 347, "frequency": "f", "synset": "cupcake.n.01"}, {"name": "hair_curler", "instance_count": 20, "def": "a cylindrical tube around which the hair is wound to curl it", "synonyms": ["hair_curler", "hair_roller", "hair_crimper"], "image_count": 2, "id": 348, "frequency": "r", "synset": "curler.n.01"}, {"name": "curling_iron", "instance_count": 2, "def": "a cylindrical home appliance that heats hair that has been curled around it", "synonyms": ["curling_iron"], "image_count": 2, "id": 349, "frequency": "r", "synset": "curling_iron.n.01"}, {"name": "curtain", "instance_count": 4506, "def": "hanging cloth used as a blind (especially for a window)", "synonyms": ["curtain", "drapery"], "image_count": 1890, "id": 350, "frequency": "f", "synset": "curtain.n.01"}, {"name": "cushion", "instance_count": 7174, "def": "a soft bag filled with air or padding such as feathers or foam rubber", "synonyms": ["cushion"], "image_count": 1240, "id": 351, "frequency": "f", "synset": "cushion.n.03"}, {"name": "cylinder", "instance_count": 3, "def": "a cylindrical container", "synonyms": ["cylinder"], "image_count": 1, "id": 352, "frequency": "r", "synset": "cylinder.n.04"}, {"name": "cymbal", "instance_count": 24, "def": "a percussion instrument consisting of a concave brass disk", "synonyms": ["cymbal"], "image_count": 9, "id": 353, "frequency": "r", "synset": "cymbal.n.01"}, {"name": "dagger", "instance_count": 1, "def": "a short knife with a pointed blade used for piercing or stabbing", "synonyms": ["dagger"], "image_count": 1, "id": 354, "frequency": "r", "synset": "dagger.n.01"}, {"name": "dalmatian", "instance_count": 3, "def": "a large breed having a smooth white coat with black or brown spots", "synonyms": ["dalmatian"], "image_count": 3, "id": 355, "frequency": "r", "synset": "dalmatian.n.02"}, {"name": "dartboard", "instance_count": 11, "def": "a circular board of wood or cork used as the target in the game of darts", "synonyms": ["dartboard"], "image_count": 11, "id": 356, "frequency": "c", "synset": "dartboard.n.01"}, {"name": "date_(fruit)", "instance_count": 103, "def": "sweet edible fruit of the date palm with a single long woody seed", "synonyms": ["date_(fruit)"], "image_count": 4, "id": 357, "frequency": "r", "synset": "date.n.08"}, {"name": "deck_chair", "instance_count": 1787, "def": "a folding chair for use outdoors; a wooden frame supports a length of canvas", "synonyms": ["deck_chair", "beach_chair"], "image_count": 236, "id": 358, "frequency": "f", "synset": "deck_chair.n.01"}, {"name": "deer", "instance_count": 130, "def": "distinguished from Bovidae by the male's having solid deciduous antlers", "synonyms": ["deer", "cervid"], "image_count": 44, "id": 359, "frequency": "c", "synset": "deer.n.01"}, {"name": "dental_floss", "instance_count": 20, "def": "a soft thread for cleaning the spaces between the teeth", "synonyms": ["dental_floss", "floss"], "image_count": 19, "id": 360, "frequency": "c", "synset": "dental_floss.n.01"}, {"name": "desk", "instance_count": 1662, "def": "a piece of furniture with a writing surface and usually drawers or other compartments", "synonyms": ["desk"], "image_count": 1100, "id": 361, "frequency": "f", "synset": "desk.n.01"}, {"name": "detergent", "instance_count": 11, "def": "a surface-active chemical widely used in industry and laundering", "synonyms": ["detergent"], "image_count": 7, "id": 362, "frequency": "r", "synset": "detergent.n.01"}, {"name": "diaper", "instance_count": 89, "def": "garment consisting of a folded cloth drawn up between the legs and fastened at the waist", "synonyms": ["diaper"], "image_count": 69, "id": 363, "frequency": "c", "synset": "diaper.n.01"}, {"name": "diary", "instance_count": 2, "def": "yearly planner book", "synonyms": ["diary", "journal"], "image_count": 2, "id": 364, "frequency": "r", "synset": "diary.n.01"}, {"name": "die", "instance_count": 25, "def": "a small cube with 1 to 6 spots on the six faces; used in gambling", "synonyms": ["die", "dice"], "image_count": 8, "id": 365, "frequency": "r", "synset": "die.n.01"}, {"name": "dinghy", "instance_count": 15, "def": "a small boat of shallow draft with seats and oars with which it is propelled", "synonyms": ["dinghy", "dory", "rowboat"], "image_count": 5, "id": 366, "frequency": "r", "synset": "dinghy.n.01"}, {"name": "dining_table", "instance_count": 312, "def": "a table at which meals are served", "synonyms": ["dining_table"], "image_count": 227, "id": 367, "frequency": "f", "synset": "dining_table.n.01"}, {"name": "tux", "instance_count": 10, "def": "semiformal evening dress for men", "synonyms": ["tux", "tuxedo"], "image_count": 6, "id": 368, "frequency": "r", "synset": "dinner_jacket.n.01"}, {"name": "dish", "instance_count": 532, "def": "a piece of dishware normally used as a container for holding or serving food", "synonyms": ["dish"], "image_count": 106, "id": 369, "frequency": "f", "synset": "dish.n.01"}, {"name": "dish_antenna", "instance_count": 153, "def": "directional antenna consisting of a parabolic reflector", "synonyms": ["dish_antenna"], "image_count": 81, "id": 370, "frequency": "c", "synset": "dish.n.05"}, {"name": "dishrag", "instance_count": 32, "def": "a cloth for washing dishes or cleaning in general", "synonyms": ["dishrag", "dishcloth"], "image_count": 17, "id": 371, "frequency": "c", "synset": "dishrag.n.01"}, {"name": "dishtowel", "instance_count": 223, "def": "a towel for drying dishes", "synonyms": ["dishtowel", "tea_towel"], "image_count": 134, "id": 372, "frequency": "f", "synset": "dishtowel.n.01"}, {"name": "dishwasher", "instance_count": 317, "def": "a machine for washing dishes", "synonyms": ["dishwasher", "dishwashing_machine"], "image_count": 312, "id": 373, "frequency": "f", "synset": "dishwasher.n.01"}, {"name": "dishwasher_detergent", "instance_count": 9, "def": "dishsoap or dish detergent designed for use in dishwashers", "synonyms": ["dishwasher_detergent", "dishwashing_detergent", "dishwashing_liquid", "dishsoap"], "image_count": 8, "id": 374, "frequency": "r", "synset": "dishwasher_detergent.n.01"}, {"name": "dispenser", "instance_count": 610, "def": "a container so designed that the contents can be used in prescribed amounts", "synonyms": ["dispenser"], "image_count": 271, "id": 375, "frequency": "f", "synset": "dispenser.n.01"}, {"name": "diving_board", "instance_count": 2, "def": "a springboard from which swimmers can dive", "synonyms": ["diving_board"], "image_count": 2, "id": 376, "frequency": "r", "synset": "diving_board.n.01"}, {"name": "Dixie_cup", "instance_count": 352, "def": "a disposable cup made of paper; for holding drinks", "synonyms": ["Dixie_cup", "paper_cup"], "image_count": 103, "id": 377, "frequency": "f", "synset": "dixie_cup.n.01"}, {"name": "dog", "instance_count": 2684, "def": "a common domesticated dog", "synonyms": ["dog"], "image_count": 1938, "id": 378, "frequency": "f", "synset": "dog.n.01"}, {"name": "dog_collar", "instance_count": 733, "def": "a collar for a dog", "synonyms": ["dog_collar"], "image_count": 574, "id": 379, "frequency": "f", "synset": "dog_collar.n.01"}, {"name": "doll", "instance_count": 398, "def": "a toy replica of a HUMAN (NOT AN ANIMAL)", "synonyms": ["doll"], "image_count": 120, "id": 380, "frequency": "f", "synset": "doll.n.01"}, {"name": "dollar", "instance_count": 2, "def": "a piece of paper money worth one dollar", "synonyms": ["dollar", "dollar_bill", "one_dollar_bill"], "image_count": 2, "id": 381, "frequency": "r", "synset": "dollar.n.02"}, {"name": "dollhouse", "instance_count": 2, "def": "a house so small that it is likened to a child's plaything", "synonyms": ["dollhouse", "doll's_house"], "image_count": 2, "id": 382, "frequency": "r", "synset": "dollhouse.n.01"}, {"name": "dolphin", "instance_count": 38, "def": "any of various small toothed whales with a beaklike snout; larger than porpoises", "synonyms": ["dolphin"], "image_count": 13, "id": 383, "frequency": "c", "synset": "dolphin.n.02"}, {"name": "domestic_ass", "instance_count": 49, "def": "domestic beast of burden descended from the African wild ass; patient but stubborn", "synonyms": ["domestic_ass", "donkey"], "image_count": 29, "id": 384, "frequency": "c", "synset": "domestic_ass.n.01"}, {"name": "doorknob", "instance_count": 4072, "def": "a knob used to open a door (often called `doorhandle' in Great Britain)", "synonyms": ["doorknob", "doorhandle"], "image_count": 1710, "id": 385, "frequency": "f", "synset": "doorknob.n.01"}, {"name": "doormat", "instance_count": 78, "def": "a mat placed outside an exterior door for wiping the shoes before entering", "synonyms": ["doormat", "welcome_mat"], "image_count": 66, "id": 386, "frequency": "c", "synset": "doormat.n.02"}, {"name": "doughnut", "instance_count": 11911, "def": "a small ring-shaped friedcake", "synonyms": ["doughnut", "donut"], "image_count": 1008, "id": 387, "frequency": "f", "synset": "doughnut.n.02"}, {"name": "dove", "instance_count": 2, "def": "any of numerous small pigeons", "synonyms": ["dove"], "image_count": 1, "id": 388, "frequency": "r", "synset": "dove.n.01"}, {"name": "dragonfly", "instance_count": 8, "def": "slender-bodied non-stinging insect having iridescent wings that are outspread at rest", "synonyms": ["dragonfly"], "image_count": 3, "id": 389, "frequency": "r", "synset": "dragonfly.n.01"}, {"name": "drawer", "instance_count": 7927, "def": "a boxlike container in a piece of furniture; made so as to slide in and out", "synonyms": ["drawer"], "image_count": 1942, "id": 390, "frequency": "f", "synset": "drawer.n.01"}, {"name": "underdrawers", "instance_count": 23, "def": "underpants worn by men", "synonyms": ["underdrawers", "boxers", "boxershorts"], "image_count": 19, "id": 391, "frequency": "c", "synset": "drawers.n.01"}, {"name": "dress", "instance_count": 2842, "def": "a one-piece garment for a woman; has skirt and bodice", "synonyms": ["dress", "frock"], "image_count": 1488, "id": 392, "frequency": "f", "synset": "dress.n.01"}, {"name": "dress_hat", "instance_count": 76, "def": "a man's hat with a tall crown; usually covered with silk or with beaver fur", "synonyms": ["dress_hat", "high_hat", "opera_hat", "silk_hat", "top_hat"], "image_count": 46, "id": 393, "frequency": "c", "synset": "dress_hat.n.01"}, {"name": "dress_suit", "instance_count": 306, "def": "formalwear consisting of full evening dress for men", "synonyms": ["dress_suit"], "image_count": 106, "id": 394, "frequency": "f", "synset": "dress_suit.n.01"}, {"name": "dresser", "instance_count": 152, "def": "a cabinet with shelves", "synonyms": ["dresser"], "image_count": 115, "id": 395, "frequency": "f", "synset": "dresser.n.05"}, {"name": "drill", "instance_count": 24, "def": "a tool with a sharp rotating point for making holes in hard materials", "synonyms": ["drill"], "image_count": 19, "id": 396, "frequency": "c", "synset": "drill.n.01"}, {"name": "drone", "instance_count": 2, "def": "an aircraft without a pilot that is operated by remote control", "synonyms": ["drone"], "image_count": 2, "id": 397, "frequency": "r", "synset": "drone.n.04"}, {"name": "dropper", "instance_count": 1, "def": "pipet consisting of a small tube with a vacuum bulb at one end for drawing liquid in and releasing it a drop at a time", "synonyms": ["dropper", "eye_dropper"], "image_count": 1, "id": 398, "frequency": "r", "synset": "dropper.n.01"}, {"name": "drum_(musical_instrument)", "instance_count": 59, "def": "a musical percussion instrument; usually consists of a hollow cylinder with a membrane stretched across each end", "synonyms": ["drum_(musical_instrument)"], "image_count": 28, "id": 399, "frequency": "c", "synset": "drum.n.01"}, {"name": "drumstick", "instance_count": 25, "def": "a stick used for playing a drum", "synonyms": ["drumstick"], "image_count": 9, "id": 400, "frequency": "r", "synset": "drumstick.n.02"}, {"name": "duck", "instance_count": 1090, "def": "small web-footed broad-billed swimming bird", "synonyms": ["duck"], "image_count": 192, "id": 401, "frequency": "f", "synset": "duck.n.01"}, {"name": "duckling", "instance_count": 36, "def": "young duck", "synonyms": ["duckling"], "image_count": 12, "id": 402, "frequency": "c", "synset": "duckling.n.02"}, {"name": "duct_tape", "instance_count": 77, "def": "a wide silvery adhesive tape", "synonyms": ["duct_tape"], "image_count": 21, "id": 403, "frequency": "c", "synset": "duct_tape.n.01"}, {"name": "duffel_bag", "instance_count": 666, "def": "a large cylindrical bag of heavy cloth (does not include suitcases)", "synonyms": ["duffel_bag", "duffle_bag", "duffel", "duffle"], "image_count": 247, "id": 404, "frequency": "f", "synset": "duffel_bag.n.01"}, {"name": "dumbbell", "instance_count": 13, "def": "an exercising weight with two ball-like ends connected by a short handle", "synonyms": ["dumbbell"], "image_count": 6, "id": 405, "frequency": "r", "synset": "dumbbell.n.01"}, {"name": "dumpster", "instance_count": 95, "def": "a container designed to receive and transport and dump waste", "synonyms": ["dumpster"], "image_count": 64, "id": 406, "frequency": "c", "synset": "dumpster.n.01"}, {"name": "dustpan", "instance_count": 7, "def": "a short-handled receptacle into which dust can be swept", "synonyms": ["dustpan"], "image_count": 7, "id": 407, "frequency": "r", "synset": "dustpan.n.02"}, {"name": "eagle", "instance_count": 48, "def": "large birds of prey noted for their broad wings and strong soaring flight", "synonyms": ["eagle"], "image_count": 40, "id": 408, "frequency": "c", "synset": "eagle.n.01"}, {"name": "earphone", "instance_count": 767, "def": "device for listening to audio that is held over or inserted into the ear", "synonyms": ["earphone", "earpiece", "headphone"], "image_count": 542, "id": 409, "frequency": "f", "synset": "earphone.n.01"}, {"name": "earplug", "instance_count": 39, "def": "a soft plug that is inserted into the ear canal to block sound", "synonyms": ["earplug"], "image_count": 2, "id": 410, "frequency": "r", "synset": "earplug.n.01"}, {"name": "earring", "instance_count": 3070, "def": "jewelry to ornament the ear", "synonyms": ["earring"], "image_count": 1898, "id": 411, "frequency": "f", "synset": "earring.n.01"}, {"name": "easel", "instance_count": 43, "def": "an upright tripod for displaying something (usually an artist's canvas)", "synonyms": ["easel"], "image_count": 36, "id": 412, "frequency": "c", "synset": "easel.n.01"}, {"name": "eclair", "instance_count": 39, "def": "oblong cream puff", "synonyms": ["eclair"], "image_count": 4, "id": 413, "frequency": "r", "synset": "eclair.n.01"}, {"name": "eel", "instance_count": 1, "def": "an elongate fish with fatty flesh", "synonyms": ["eel"], "image_count": 1, "id": 414, "frequency": "r", "synset": "eel.n.01"}, {"name": "egg", "instance_count": 813, "def": "oval reproductive body of a fowl (especially a hen) used as food", "synonyms": ["egg", "eggs"], "image_count": 191, "id": 415, "frequency": "f", "synset": "egg.n.02"}, {"name": "egg_roll", "instance_count": 15, "def": "minced vegetables and meat wrapped in a pancake and fried", "synonyms": ["egg_roll", "spring_roll"], "image_count": 6, "id": 416, "frequency": "r", "synset": "egg_roll.n.01"}, {"name": "egg_yolk", "instance_count": 90, "def": "the yellow spherical part of an egg", "synonyms": ["egg_yolk", "yolk_(egg)"], "image_count": 41, "id": 417, "frequency": "c", "synset": "egg_yolk.n.01"}, {"name": "eggbeater", "instance_count": 52, "def": "a mixer for beating eggs or whipping cream", "synonyms": ["eggbeater", "eggwhisk"], "image_count": 39, "id": 418, "frequency": "c", "synset": "eggbeater.n.02"}, {"name": "eggplant", "instance_count": 337, "def": "egg-shaped vegetable having a shiny skin typically dark purple", "synonyms": ["eggplant", "aubergine"], "image_count": 46, "id": 419, "frequency": "c", "synset": "eggplant.n.01"}, {"name": "electric_chair", "instance_count": 1, "def": "a chair-shaped instrument of execution by electrocution", "synonyms": ["electric_chair"], "image_count": 1, "id": 420, "frequency": "r", "synset": "electric_chair.n.01"}, {"name": "refrigerator", "instance_count": 1702, "def": "a refrigerator in which the coolant is pumped around by an electric motor", "synonyms": ["refrigerator"], "image_count": 1451, "id": 421, "frequency": "f", "synset": "electric_refrigerator.n.01"}, {"name": "elephant", "instance_count": 5325, "def": "a common elephant", "synonyms": ["elephant"], "image_count": 1878, "id": 422, "frequency": "f", "synset": "elephant.n.01"}, {"name": "elk", "instance_count": 29, "def": "large northern deer with enormous flattened antlers in the male", "synonyms": ["elk", "moose"], "image_count": 11, "id": 423, "frequency": "c", "synset": "elk.n.01"}, {"name": "envelope", "instance_count": 210, "def": "a flat (usually rectangular) container for a letter, thin package, etc.", "synonyms": ["envelope"], "image_count": 82, "id": 424, "frequency": "c", "synset": "envelope.n.01"}, {"name": "eraser", "instance_count": 41, "def": "an implement used to erase something", "synonyms": ["eraser"], "image_count": 18, "id": 425, "frequency": "c", "synset": "eraser.n.01"}, {"name": "escargot", "instance_count": 5, "def": "edible snail usually served in the shell with a sauce of melted butter and garlic", "synonyms": ["escargot"], "image_count": 1, "id": 426, "frequency": "r", "synset": "escargot.n.01"}, {"name": "eyepatch", "instance_count": 9, "def": "a protective cloth covering for an injured eye", "synonyms": ["eyepatch"], "image_count": 7, "id": 427, "frequency": "r", "synset": "eyepatch.n.01"}, {"name": "falcon", "instance_count": 3, "def": "birds of prey having long pointed powerful wings adapted for swift flight", "synonyms": ["falcon"], "image_count": 3, "id": 428, "frequency": "r", "synset": "falcon.n.01"}, {"name": "fan", "instance_count": 737, "def": "a device for creating a current of air by movement of a surface or surfaces", "synonyms": ["fan"], "image_count": 575, "id": 429, "frequency": "f", "synset": "fan.n.01"}, {"name": "faucet", "instance_count": 3185, "def": "a regulator for controlling the flow of a liquid from a reservoir", "synonyms": ["faucet", "spigot", "tap"], "image_count": 1907, "id": 430, "frequency": "f", "synset": "faucet.n.01"}, {"name": "fedora", "instance_count": 14, "def": "a hat made of felt with a creased crown", "synonyms": ["fedora"], "image_count": 8, "id": 431, "frequency": "r", "synset": "fedora.n.01"}, {"name": "ferret", "instance_count": 5, "def": "domesticated albino variety of the European polecat bred for hunting rats and rabbits", "synonyms": ["ferret"], "image_count": 4, "id": 432, "frequency": "r", "synset": "ferret.n.02"}, {"name": "Ferris_wheel", "instance_count": 32, "def": "a large wheel with suspended seats that remain upright as the wheel rotates", "synonyms": ["Ferris_wheel"], "image_count": 32, "id": 433, "frequency": "c", "synset": "ferris_wheel.n.01"}, {"name": "ferry", "instance_count": 17, "def": "a boat that transports people or vehicles across a body of water and operates on a regular schedule", "synonyms": ["ferry", "ferryboat"], "image_count": 11, "id": 434, "frequency": "c", "synset": "ferry.n.01"}, {"name": "fig_(fruit)", "instance_count": 147, "def": "fleshy sweet pear-shaped yellowish or purple fruit eaten fresh or preserved or dried", "synonyms": ["fig_(fruit)"], "image_count": 4, "id": 435, "frequency": "r", "synset": "fig.n.04"}, {"name": "fighter_jet", "instance_count": 115, "def": "a high-speed military or naval airplane designed to destroy enemy targets", "synonyms": ["fighter_jet", "fighter_aircraft", "attack_aircraft"], "image_count": 54, "id": 436, "frequency": "c", "synset": "fighter.n.02"}, {"name": "figurine", "instance_count": 1056, "def": "a small carved or molded figure", "synonyms": ["figurine"], "image_count": 202, "id": 437, "frequency": "f", "synset": "figurine.n.01"}, {"name": "file_cabinet", "instance_count": 53, "def": "office furniture consisting of a container for keeping papers in order", "synonyms": ["file_cabinet", "filing_cabinet"], "image_count": 32, "id": 438, "frequency": "c", "synset": "file.n.03"}, {"name": "file_(tool)", "instance_count": 3, "def": "a steel hand tool with small sharp teeth on some or all of its surfaces; used for smoothing wood or metal", "synonyms": ["file_(tool)"], "image_count": 3, "id": 439, "frequency": "r", "synset": "file.n.04"}, {"name": "fire_alarm", "instance_count": 151, "def": "an alarm that is tripped off by fire or smoke", "synonyms": ["fire_alarm", "smoke_alarm"], "image_count": 130, "id": 440, "frequency": "f", "synset": "fire_alarm.n.02"}, {"name": "fire_engine", "instance_count": 179, "def": "large trucks that carry firefighters and equipment to the site of a fire", "synonyms": ["fire_engine", "fire_truck"], "image_count": 119, "id": 441, "frequency": "f", "synset": "fire_engine.n.01"}, {"name": "fire_extinguisher", "instance_count": 165, "def": "a manually operated device for extinguishing small fires", "synonyms": ["fire_extinguisher", "extinguisher"], "image_count": 141, "id": 442, "frequency": "f", "synset": "fire_extinguisher.n.01"}, {"name": "fire_hose", "instance_count": 67, "def": "a large hose that carries water from a fire hydrant to the site of the fire", "synonyms": ["fire_hose"], "image_count": 29, "id": 443, "frequency": "c", "synset": "fire_hose.n.01"}, {"name": "fireplace", "instance_count": 530, "def": "an open recess in a wall at the base of a chimney where a fire can be built", "synonyms": ["fireplace"], "image_count": 525, "id": 444, "frequency": "f", "synset": "fireplace.n.01"}, {"name": "fireplug", "instance_count": 1458, "def": "an upright hydrant for drawing water to use in fighting a fire", "synonyms": ["fireplug", "fire_hydrant", "hydrant"], "image_count": 1323, "id": 445, "frequency": "f", "synset": "fireplug.n.01"}, {"name": "first-aid_kit", "instance_count": 2, "def": "kit consisting of a set of bandages and medicines for giving first aid", "synonyms": ["first-aid_kit"], "image_count": 2, "id": 446, "frequency": "r", "synset": "first-aid_kit.n.01"}, {"name": "fish", "instance_count": 525, "def": "any of various mostly cold-blooded aquatic vertebrates usually having scales and breathing through gills", "synonyms": ["fish"], "image_count": 113, "id": 447, "frequency": "f", "synset": "fish.n.01"}, {"name": "fish_(food)", "instance_count": 96, "def": "the flesh of fish used as food", "synonyms": ["fish_(food)"], "image_count": 16, "id": 448, "frequency": "c", "synset": "fish.n.02"}, {"name": "fishbowl", "instance_count": 33, "def": "a transparent bowl in which small fish are kept", "synonyms": ["fishbowl", "goldfish_bowl"], "image_count": 7, "id": 449, "frequency": "r", "synset": "fishbowl.n.02"}, {"name": "fishing_rod", "instance_count": 84, "def": "a rod that is used in fishing to extend the fishing line", "synonyms": ["fishing_rod", "fishing_pole"], "image_count": 35, "id": 450, "frequency": "c", "synset": "fishing_rod.n.01"}, {"name": "flag", "instance_count": 7007, "def": "emblem usually consisting of a rectangular piece of cloth of distinctive design (do not include pole)", "synonyms": ["flag"], "image_count": 1908, "id": 451, "frequency": "f", "synset": "flag.n.01"}, {"name": "flagpole", "instance_count": 1082, "def": "a tall staff or pole on which a flag is raised", "synonyms": ["flagpole", "flagstaff"], "image_count": 353, "id": 452, "frequency": "f", "synset": "flagpole.n.02"}, {"name": "flamingo", "instance_count": 309, "def": "large pink web-footed bird with down-bent bill", "synonyms": ["flamingo"], "image_count": 18, "id": 453, "frequency": "c", "synset": "flamingo.n.01"}, {"name": "flannel", "instance_count": 18, "def": "a soft light woolen fabric; used for clothing", "synonyms": ["flannel"], "image_count": 14, "id": 454, "frequency": "c", "synset": "flannel.n.01"}, {"name": "flap", "instance_count": 218, "def": "any broad thin covering attached at one edge, such as a mud flap next to a wheel or a flap on an airplane wing", "synonyms": ["flap"], "image_count": 77, "id": 455, "frequency": "c", "synset": "flap.n.01"}, {"name": "flash", "instance_count": 10, "def": "a lamp for providing momentary light to take a photograph", "synonyms": ["flash", "flashbulb"], "image_count": 8, "id": 456, "frequency": "r", "synset": "flash.n.10"}, {"name": "flashlight", "instance_count": 48, "def": "a small portable battery-powered electric lamp", "synonyms": ["flashlight", "torch"], "image_count": 37, "id": 457, "frequency": "c", "synset": "flashlight.n.01"}, {"name": "fleece", "instance_count": 2, "def": "a soft bulky fabric with deep pile; used chiefly for clothing", "synonyms": ["fleece"], "image_count": 1, "id": 458, "frequency": "r", "synset": "fleece.n.03"}, {"name": "flip-flop_(sandal)", "instance_count": 1103, "def": "a backless sandal held to the foot by a thong between two toes", "synonyms": ["flip-flop_(sandal)"], "image_count": 346, "id": 459, "frequency": "f", "synset": "flip-flop.n.02"}, {"name": "flipper_(footwear)", "instance_count": 49, "def": "a shoe to aid a person in swimming", "synonyms": ["flipper_(footwear)", "fin_(footwear)"], "image_count": 19, "id": 460, "frequency": "c", "synset": "flipper.n.01"}, {"name": "flower_arrangement", "instance_count": 3960, "def": "a decorative arrangement of flowers", "synonyms": ["flower_arrangement", "floral_arrangement"], "image_count": 1779, "id": 461, "frequency": "f", "synset": "flower_arrangement.n.01"}, {"name": "flute_glass", "instance_count": 86, "def": "a tall narrow wineglass", "synonyms": ["flute_glass", "champagne_flute"], "image_count": 23, "id": 462, "frequency": "c", "synset": "flute.n.02"}, {"name": "foal", "instance_count": 30, "def": "a young horse", "synonyms": ["foal"], "image_count": 25, "id": 463, "frequency": "c", "synset": "foal.n.01"}, {"name": "folding_chair", "instance_count": 303, "def": "a chair that can be folded flat for storage", "synonyms": ["folding_chair"], "image_count": 67, "id": 464, "frequency": "c", "synset": "folding_chair.n.01"}, {"name": "food_processor", "instance_count": 22, "def": "a kitchen appliance for shredding, blending, chopping, or slicing food", "synonyms": ["food_processor"], "image_count": 19, "id": 465, "frequency": "c", "synset": "food_processor.n.01"}, {"name": "football_(American)", "instance_count": 35, "def": "the inflated oblong ball used in playing American football", "synonyms": ["football_(American)"], "image_count": 28, "id": 466, "frequency": "c", "synset": "football.n.02"}, {"name": "football_helmet", "instance_count": 7, "def": "a padded helmet with a face mask to protect the head of football players", "synonyms": ["football_helmet"], "image_count": 4, "id": 467, "frequency": "r", "synset": "football_helmet.n.01"}, {"name": "footstool", "instance_count": 41, "def": "a low seat or a stool to rest the feet of a seated person", "synonyms": ["footstool", "footrest"], "image_count": 27, "id": 468, "frequency": "c", "synset": "footstool.n.01"}, {"name": "fork", "instance_count": 3137, "def": "cutlery used for serving and eating food", "synonyms": ["fork"], "image_count": 1861, "id": 469, "frequency": "f", "synset": "fork.n.01"}, {"name": "forklift", "instance_count": 14, "def": "an industrial vehicle with a power operated fork in front that can be inserted under loads to lift and move them", "synonyms": ["forklift"], "image_count": 11, "id": 470, "frequency": "c", "synset": "forklift.n.01"}, {"name": "freight_car", "instance_count": 121, "def": "a railway car that carries freight", "synonyms": ["freight_car"], "image_count": 13, "id": 471, "frequency": "c", "synset": "freight_car.n.01"}, {"name": "French_toast", "instance_count": 41, "def": "bread slice dipped in egg and milk and fried", "synonyms": ["French_toast"], "image_count": 13, "id": 472, "frequency": "c", "synset": "french_toast.n.01"}, {"name": "freshener", "instance_count": 39, "def": "anything that freshens air by removing or covering odor", "synonyms": ["freshener", "air_freshener"], "image_count": 32, "id": 473, "frequency": "c", "synset": "freshener.n.01"}, {"name": "frisbee", "instance_count": 2332, "def": "a light, plastic disk propelled with a flip of the wrist for recreation or competition", "synonyms": ["frisbee"], "image_count": 1767, "id": 474, "frequency": "f", "synset": "frisbee.n.01"}, {"name": "frog", "instance_count": 84, "def": "a tailless stout-bodied amphibians with long hind limbs for leaping", "synonyms": ["frog", "toad", "toad_frog"], "image_count": 42, "id": 475, "frequency": "c", "synset": "frog.n.01"}, {"name": "fruit_juice", "instance_count": 37, "def": "drink produced by squeezing or crushing fruit", "synonyms": ["fruit_juice"], "image_count": 17, "id": 476, "frequency": "c", "synset": "fruit_juice.n.01"}, {"name": "frying_pan", "instance_count": 310, "def": "a pan used for frying foods", "synonyms": ["frying_pan", "frypan", "skillet"], "image_count": 128, "id": 477, "frequency": "f", "synset": "frying_pan.n.01"}, {"name": "fudge", "instance_count": 4, "def": "soft creamy candy", "synonyms": ["fudge"], "image_count": 1, "id": 478, "frequency": "r", "synset": "fudge.n.01"}, {"name": "funnel", "instance_count": 9, "def": "a cone-shaped utensil used to channel a substance into a container with a small mouth", "synonyms": ["funnel"], "image_count": 9, "id": 479, "frequency": "r", "synset": "funnel.n.02"}, {"name": "futon", "instance_count": 11, "def": "a pad that is used for sleeping on the floor or on a raised frame", "synonyms": ["futon"], "image_count": 10, "id": 480, "frequency": "r", "synset": "futon.n.01"}, {"name": "gag", "instance_count": 4, "def": "restraint put into a person's mouth to prevent speaking or shouting", "synonyms": ["gag", "muzzle"], "image_count": 4, "id": 481, "frequency": "r", "synset": "gag.n.02"}, {"name": "garbage", "instance_count": 18, "def": "a receptacle where waste can be discarded", "synonyms": ["garbage"], "image_count": 9, "id": 482, "frequency": "r", "synset": "garbage.n.03"}, {"name": "garbage_truck", "instance_count": 18, "def": "a truck for collecting domestic refuse", "synonyms": ["garbage_truck"], "image_count": 18, "id": 483, "frequency": "c", "synset": "garbage_truck.n.01"}, {"name": "garden_hose", "instance_count": 50, "def": "a hose used for watering a lawn or garden", "synonyms": ["garden_hose"], "image_count": 41, "id": 484, "frequency": "c", "synset": "garden_hose.n.01"}, {"name": "gargle", "instance_count": 38, "def": "a medicated solution used for gargling and rinsing the mouth", "synonyms": ["gargle", "mouthwash"], "image_count": 28, "id": 485, "frequency": "c", "synset": "gargle.n.01"}, {"name": "gargoyle", "instance_count": 8, "def": "an ornament consisting of a grotesquely carved figure of a person or animal", "synonyms": ["gargoyle"], "image_count": 3, "id": 486, "frequency": "r", "synset": "gargoyle.n.02"}, {"name": "garlic", "instance_count": 487, "def": "aromatic bulb used as seasoning", "synonyms": ["garlic", "ail"], "image_count": 65, "id": 487, "frequency": "c", "synset": "garlic.n.02"}, {"name": "gasmask", "instance_count": 12, "def": "a protective face mask with a filter", "synonyms": ["gasmask", "respirator", "gas_helmet"], "image_count": 9, "id": 488, "frequency": "r", "synset": "gasmask.n.01"}, {"name": "gazelle", "instance_count": 82, "def": "small swift graceful antelope of Africa and Asia having lustrous eyes", "synonyms": ["gazelle"], "image_count": 23, "id": 489, "frequency": "c", "synset": "gazelle.n.01"}, {"name": "gelatin", "instance_count": 248, "def": "an edible jelly made with gelatin and used as a dessert or salad base or a coating for foods", "synonyms": ["gelatin", "jelly"], "image_count": 24, "id": 490, "frequency": "c", "synset": "gelatin.n.02"}, {"name": "gemstone", "instance_count": 2, "def": "a crystalline rock that can be cut and polished for jewelry", "synonyms": ["gemstone"], "image_count": 1, "id": 491, "frequency": "r", "synset": "gem.n.02"}, {"name": "generator", "instance_count": 2, "def": "engine that converts mechanical energy into electrical energy by electromagnetic induction", "synonyms": ["generator"], "image_count": 2, "id": 492, "frequency": "r", "synset": "generator.n.02"}, {"name": "giant_panda", "instance_count": 112, "def": "large black-and-white herbivorous mammal of bamboo forests of China and Tibet", "synonyms": ["giant_panda", "panda", "panda_bear"], "image_count": 59, "id": 493, "frequency": "c", "synset": "giant_panda.n.01"}, {"name": "gift_wrap", "instance_count": 247, "def": "attractive wrapping paper suitable for wrapping gifts", "synonyms": ["gift_wrap"], "image_count": 48, "id": 494, "frequency": "c", "synset": "gift_wrap.n.01"}, {"name": "ginger", "instance_count": 93, "def": "the root of the common ginger plant; used fresh as a seasoning", "synonyms": ["ginger", "gingerroot"], "image_count": 17, "id": 495, "frequency": "c", "synset": "ginger.n.03"}, {"name": "giraffe", "instance_count": 3923, "def": "tall animal having a spotted coat and small horns and very long neck and legs", "synonyms": ["giraffe"], "image_count": 1877, "id": 496, "frequency": "f", "synset": "giraffe.n.01"}, {"name": "cincture", "instance_count": 56, "def": "a band of material around the waist that strengthens a skirt or trousers", "synonyms": ["cincture", "sash", "waistband", "waistcloth"], "image_count": 18, "id": 497, "frequency": "c", "synset": "girdle.n.02"}, {"name": "glass_(drink_container)", "instance_count": 6420, "def": "a container for holding liquids while drinking", "synonyms": ["glass_(drink_container)", "drinking_glass"], "image_count": 1920, "id": 498, "frequency": "f", "synset": "glass.n.02"}, {"name": "globe", "instance_count": 59, "def": "a sphere on which a map (especially of the earth) is represented", "synonyms": ["globe"], "image_count": 50, "id": 499, "frequency": "c", "synset": "globe.n.03"}, {"name": "glove", "instance_count": 5951, "def": "handwear covering the hand", "synonyms": ["glove"], "image_count": 1890, "id": 500, "frequency": "f", "synset": "glove.n.02"}, {"name": "goat", "instance_count": 842, "def": "a common goat", "synonyms": ["goat"], "image_count": 99, "id": 501, "frequency": "c", "synset": "goat.n.01"}, {"name": "goggles", "instance_count": 3202, "def": "tight-fitting spectacles worn to protect the eyes", "synonyms": ["goggles"], "image_count": 1530, "id": 502, "frequency": "f", "synset": "goggles.n.01"}, {"name": "goldfish", "instance_count": 11, "def": "small golden or orange-red freshwater fishes used as pond or aquarium pets", "synonyms": ["goldfish"], "image_count": 3, "id": 503, "frequency": "r", "synset": "goldfish.n.01"}, {"name": "golf_club", "instance_count": 14, "def": "golf equipment used by a golfer to hit a golf ball", "synonyms": ["golf_club", "golf-club"], "image_count": 11, "id": 504, "frequency": "c", "synset": "golf_club.n.02"}, {"name": "golfcart", "instance_count": 25, "def": "a small motor vehicle in which golfers can ride between shots", "synonyms": ["golfcart"], "image_count": 19, "id": 505, "frequency": "c", "synset": "golfcart.n.01"}, {"name": "gondola_(boat)", "instance_count": 8, "def": "long narrow flat-bottomed boat propelled by sculling; traditionally used on canals of Venice", "synonyms": ["gondola_(boat)"], "image_count": 3, "id": 506, "frequency": "r", "synset": "gondola.n.02"}, {"name": "goose", "instance_count": 413, "def": "loud, web-footed long-necked aquatic birds usually larger than ducks", "synonyms": ["goose"], "image_count": 63, "id": 507, "frequency": "c", "synset": "goose.n.01"}, {"name": "gorilla", "instance_count": 10, "def": "largest ape", "synonyms": ["gorilla"], "image_count": 5, "id": 508, "frequency": "r", "synset": "gorilla.n.01"}, {"name": "gourd", "instance_count": 101, "def": "any of numerous inedible fruits with hard rinds", "synonyms": ["gourd"], "image_count": 6, "id": 509, "frequency": "r", "synset": "gourd.n.02"}, {"name": "grape", "instance_count": 6377, "def": "any of various juicy fruit with green or purple skins; grow in clusters", "synonyms": ["grape"], "image_count": 233, "id": 510, "frequency": "f", "synset": "grape.n.01"}, {"name": "grater", "instance_count": 64, "def": "utensil with sharp perforations for shredding foods (as vegetables or cheese)", "synonyms": ["grater"], "image_count": 54, "id": 511, "frequency": "c", "synset": "grater.n.01"}, {"name": "gravestone", "instance_count": 778, "def": "a stone that is used to mark a grave", "synonyms": ["gravestone", "headstone", "tombstone"], "image_count": 36, "id": 512, "frequency": "c", "synset": "gravestone.n.01"}, {"name": "gravy_boat", "instance_count": 10, "def": "a dish (often boat-shaped) for serving gravy or sauce", "synonyms": ["gravy_boat", "gravy_holder"], "image_count": 10, "id": 513, "frequency": "r", "synset": "gravy_boat.n.01"}, {"name": "green_bean", "instance_count": 2571, "def": "a common bean plant cultivated for its slender green edible pods", "synonyms": ["green_bean"], "image_count": 124, "id": 514, "frequency": "f", "synset": "green_bean.n.02"}, {"name": "green_onion", "instance_count": 1618, "def": "a young onion before the bulb has enlarged", "synonyms": ["green_onion", "spring_onion", "scallion"], "image_count": 101, "id": 515, "frequency": "f", "synset": "green_onion.n.01"}, {"name": "griddle", "instance_count": 4, "def": "cooking utensil consisting of a flat heated surface on which food is cooked", "synonyms": ["griddle"], "image_count": 3, "id": 516, "frequency": "r", "synset": "griddle.n.01"}, {"name": "grill", "instance_count": 747, "def": "a framework of metal bars used as a partition or a grate", "synonyms": ["grill", "grille", "grillwork", "radiator_grille"], "image_count": 363, "id": 517, "frequency": "f", "synset": "grill.n.02"}, {"name": "grits", "instance_count": 3, "def": "coarsely ground corn boiled as a breakfast dish", "synonyms": ["grits", "hominy_grits"], "image_count": 3, "id": 518, "frequency": "r", "synset": "grits.n.01"}, {"name": "grizzly", "instance_count": 44, "def": "powerful brownish-yellow bear of the uplands of western North America", "synonyms": ["grizzly", "grizzly_bear"], "image_count": 30, "id": 519, "frequency": "c", "synset": "grizzly.n.01"}, {"name": "grocery_bag", "instance_count": 46, "def": "a sack for holding customer's groceries", "synonyms": ["grocery_bag"], "image_count": 18, "id": 520, "frequency": "c", "synset": "grocery_bag.n.01"}, {"name": "guitar", "instance_count": 315, "def": "a stringed instrument usually having six strings; played by strumming or plucking", "synonyms": ["guitar"], "image_count": 199, "id": 521, "frequency": "f", "synset": "guitar.n.01"}, {"name": "gull", "instance_count": 1398, "def": "mostly white aquatic bird having long pointed wings and short legs", "synonyms": ["gull", "seagull"], "image_count": 97, "id": 522, "frequency": "c", "synset": "gull.n.02"}, {"name": "gun", "instance_count": 68, "def": "a weapon that discharges a bullet at high velocity from a metal tube", "synonyms": ["gun"], "image_count": 32, "id": 523, "frequency": "c", "synset": "gun.n.01"}, {"name": "hairbrush", "instance_count": 165, "def": "a brush used to groom a person's hair", "synonyms": ["hairbrush"], "image_count": 121, "id": 524, "frequency": "f", "synset": "hairbrush.n.01"}, {"name": "hairnet", "instance_count": 53, "def": "a small net that someone wears over their hair to keep it in place", "synonyms": ["hairnet"], "image_count": 16, "id": 525, "frequency": "c", "synset": "hairnet.n.01"}, {"name": "hairpin", "instance_count": 20, "def": "a double pronged pin used to hold women's hair in place", "synonyms": ["hairpin"], "image_count": 12, "id": 526, "frequency": "c", "synset": "hairpin.n.01"}, {"name": "halter_top", "instance_count": 3, "def": "a woman's top that fastens behind the back and neck leaving the back and arms uncovered", "synonyms": ["halter_top"], "image_count": 2, "id": 527, "frequency": "r", "synset": "halter.n.03"}, {"name": "ham", "instance_count": 1765, "def": "meat cut from the thigh of a hog (usually smoked)", "synonyms": ["ham", "jambon", "gammon"], "image_count": 214, "id": 528, "frequency": "f", "synset": "ham.n.01"}, {"name": "hamburger", "instance_count": 126, "def": "a sandwich consisting of a patty of minced beef served on a bun", "synonyms": ["hamburger", "beefburger", "burger"], "image_count": 48, "id": 529, "frequency": "c", "synset": "hamburger.n.01"}, {"name": "hammer", "instance_count": 41, "def": "a hand tool with a heavy head and a handle; used to deliver an impulsive force by striking", "synonyms": ["hammer"], "image_count": 26, "id": 530, "frequency": "c", "synset": "hammer.n.02"}, {"name": "hammock", "instance_count": 15, "def": "a hanging bed of canvas or rope netting (usually suspended between two trees)", "synonyms": ["hammock"], "image_count": 13, "id": 531, "frequency": "c", "synset": "hammock.n.02"}, {"name": "hamper", "instance_count": 5, "def": "a basket usually with a cover", "synonyms": ["hamper"], "image_count": 4, "id": 532, "frequency": "r", "synset": "hamper.n.02"}, {"name": "hamster", "instance_count": 12, "def": "short-tailed burrowing rodent with large cheek pouches", "synonyms": ["hamster"], "image_count": 11, "id": 533, "frequency": "c", "synset": "hamster.n.01"}, {"name": "hair_dryer", "instance_count": 144, "def": "a hand-held electric blower that can blow warm air onto the hair", "synonyms": ["hair_dryer"], "image_count": 123, "id": 534, "frequency": "f", "synset": "hand_blower.n.01"}, {"name": "hand_glass", "instance_count": 7, "def": "a mirror intended to be held in the hand", "synonyms": ["hand_glass", "hand_mirror"], "image_count": 7, "id": 535, "frequency": "r", "synset": "hand_glass.n.01"}, {"name": "hand_towel", "instance_count": 619, "def": "a small towel used to dry the hands or face", "synonyms": ["hand_towel", "face_towel"], "image_count": 200, "id": 536, "frequency": "f", "synset": "hand_towel.n.01"}, {"name": "handcart", "instance_count": 204, "def": "wheeled vehicle that can be pushed by a person", "synonyms": ["handcart", "pushcart", "hand_truck"], "image_count": 91, "id": 537, "frequency": "c", "synset": "handcart.n.01"}, {"name": "handcuff", "instance_count": 10, "def": "shackle that consists of a metal loop that can be locked around the wrist", "synonyms": ["handcuff"], "image_count": 9, "id": 538, "frequency": "r", "synset": "handcuff.n.01"}, {"name": "handkerchief", "instance_count": 86, "def": "a square piece of cloth used for wiping the eyes or nose or as a costume accessory", "synonyms": ["handkerchief"], "image_count": 72, "id": 539, "frequency": "c", "synset": "handkerchief.n.01"}, {"name": "handle", "instance_count": 8314, "def": "the appendage to an object that is designed to be held in order to use or move it", "synonyms": ["handle", "grip", "handgrip"], "image_count": 1886, "id": 540, "frequency": "f", "synset": "handle.n.01"}, {"name": "handsaw", "instance_count": 5, "def": "a saw used with one hand for cutting wood", "synonyms": ["handsaw", "carpenter's_saw"], "image_count": 4, "id": 541, "frequency": "r", "synset": "handsaw.n.01"}, {"name": "hardback_book", "instance_count": 2, "def": "a book with cardboard or cloth or leather covers", "synonyms": ["hardback_book", "hardcover_book"], "image_count": 1, "id": 542, "frequency": "r", "synset": "hardback.n.01"}, {"name": "harmonium", "instance_count": 2, "def": "a free-reed instrument in which air is forced through the reeds by bellows", "synonyms": ["harmonium", "organ_(musical_instrument)", "reed_organ_(musical_instrument)"], "image_count": 1, "id": 543, "frequency": "r", "synset": "harmonium.n.01"}, {"name": "hat", "instance_count": 7213, "def": "headwear that protects the head from bad weather, sun, or worn for fashion", "synonyms": ["hat"], "image_count": 1932, "id": 544, "frequency": "f", "synset": "hat.n.01"}, {"name": "hatbox", "instance_count": 7, "def": "a round piece of luggage for carrying hats", "synonyms": ["hatbox"], "image_count": 4, "id": 545, "frequency": "r", "synset": "hatbox.n.01"}, {"name": "veil", "instance_count": 57, "def": "a garment that covers the head OR face", "synonyms": ["veil"], "image_count": 56, "id": 546, "frequency": "c", "synset": "head_covering.n.01"}, {"name": "headband", "instance_count": 1114, "def": "a band worn around or over the head", "synonyms": ["headband"], "image_count": 854, "id": 547, "frequency": "f", "synset": "headband.n.01"}, {"name": "headboard", "instance_count": 850, "def": "a vertical board or panel forming the head of a bedstead", "synonyms": ["headboard"], "image_count": 755, "id": 548, "frequency": "f", "synset": "headboard.n.01"}, {"name": "headlight", "instance_count": 7326, "def": "a powerful light with reflector; attached to the front of an automobile or locomotive", "synonyms": ["headlight", "headlamp"], "image_count": 1843, "id": 549, "frequency": "f", "synset": "headlight.n.01"}, {"name": "headscarf", "instance_count": 235, "def": "a kerchief worn over the head and tied under the chin", "synonyms": ["headscarf"], "image_count": 96, "id": 550, "frequency": "c", "synset": "headscarf.n.01"}, {"name": "headset", "instance_count": 10, "def": "receiver consisting of a pair of headphones", "synonyms": ["headset"], "image_count": 7, "id": 551, "frequency": "r", "synset": "headset.n.01"}, {"name": "headstall_(for_horses)", "instance_count": 133, "def": "the band that is the part of a bridle that fits around a horse's head", "synonyms": ["headstall_(for_horses)", "headpiece_(for_horses)"], "image_count": 74, "id": 552, "frequency": "c", "synset": "headstall.n.01"}, {"name": "heart", "instance_count": 347, "def": "a muscular organ; its contractions move the blood through the body", "synonyms": ["heart"], "image_count": 66, "id": 553, "frequency": "c", "synset": "heart.n.02"}, {"name": "heater", "instance_count": 64, "def": "device that heats water or supplies warmth to a room", "synonyms": ["heater", "warmer"], "image_count": 57, "id": 554, "frequency": "c", "synset": "heater.n.01"}, {"name": "helicopter", "instance_count": 68, "def": "an aircraft without wings that obtains its lift from the rotation of overhead blades", "synonyms": ["helicopter"], "image_count": 44, "id": 555, "frequency": "c", "synset": "helicopter.n.01"}, {"name": "helmet", "instance_count": 4845, "def": "a protective headgear made of hard material to resist blows", "synonyms": ["helmet"], "image_count": 1905, "id": 556, "frequency": "f", "synset": "helmet.n.02"}, {"name": "heron", "instance_count": 6, "def": "grey or white wading bird with long neck and long legs and (usually) long bill", "synonyms": ["heron"], "image_count": 4, "id": 557, "frequency": "r", "synset": "heron.n.02"}, {"name": "highchair", "instance_count": 98, "def": "a chair for feeding a very young child", "synonyms": ["highchair", "feeding_chair"], "image_count": 90, "id": 558, "frequency": "c", "synset": "highchair.n.01"}, {"name": "hinge", "instance_count": 5283, "def": "a joint that holds two parts together so that one can swing relative to the other", "synonyms": ["hinge"], "image_count": 1635, "id": 559, "frequency": "f", "synset": "hinge.n.01"}, {"name": "hippopotamus", "instance_count": 24, "def": "massive thick-skinned animal living in or around rivers of tropical Africa", "synonyms": ["hippopotamus"], "image_count": 8, "id": 560, "frequency": "r", "synset": "hippopotamus.n.01"}, {"name": "hockey_stick", "instance_count": 15, "def": "sports implement consisting of a stick used by hockey players to move the puck", "synonyms": ["hockey_stick"], "image_count": 5, "id": 561, "frequency": "r", "synset": "hockey_stick.n.01"}, {"name": "hog", "instance_count": 73, "def": "domestic swine", "synonyms": ["hog", "pig"], "image_count": 50, "id": 562, "frequency": "c", "synset": "hog.n.03"}, {"name": "home_plate_(baseball)", "instance_count": 551, "def": "(baseball) a rubber slab where the batter stands; it must be touched by a base runner in order to score", "synonyms": ["home_plate_(baseball)", "home_base_(baseball)"], "image_count": 545, "id": 563, "frequency": "f", "synset": "home_plate.n.01"}, {"name": "honey", "instance_count": 90, "def": "a sweet yellow liquid produced by bees", "synonyms": ["honey"], "image_count": 20, "id": 564, "frequency": "c", "synset": "honey.n.01"}, {"name": "fume_hood", "instance_count": 208, "def": "metal covering leading to a vent that exhausts smoke or fumes", "synonyms": ["fume_hood", "exhaust_hood"], "image_count": 193, "id": 565, "frequency": "f", "synset": "hood.n.06"}, {"name": "hook", "instance_count": 1157, "def": "a curved or bent implement for suspending or pulling something", "synonyms": ["hook"], "image_count": 285, "id": 566, "frequency": "f", "synset": "hook.n.05"}, {"name": "hookah", "instance_count": 3, "def": "a tobacco pipe with a long flexible tube connected to a container where the smoke is cooled by passing through water", "synonyms": ["hookah", "narghile", "nargileh", "sheesha", "shisha", "water_pipe"], "image_count": 3, "id": 567, "frequency": "r", "synset": "hookah.n.01"}, {"name": "hornet", "instance_count": 1, "def": "large stinging wasp", "synonyms": ["hornet"], "image_count": 1, "id": 568, "frequency": "r", "synset": "hornet.n.01"}, {"name": "horse", "instance_count": 4744, "def": "a common horse", "synonyms": ["horse"], "image_count": 1904, "id": 569, "frequency": "f", "synset": "horse.n.01"}, {"name": "hose", "instance_count": 610, "def": "a flexible pipe for conveying a liquid or gas", "synonyms": ["hose", "hosepipe"], "image_count": 294, "id": 570, "frequency": "f", "synset": "hose.n.03"}, {"name": "hot-air_balloon", "instance_count": 4, "def": "balloon for travel through the air in a basket suspended below a large bag of heated air", "synonyms": ["hot-air_balloon"], "image_count": 3, "id": 571, "frequency": "r", "synset": "hot-air_balloon.n.01"}, {"name": "hotplate", "instance_count": 6, "def": "a portable electric appliance for heating or cooking or keeping food warm", "synonyms": ["hotplate"], "image_count": 5, "id": 572, "frequency": "r", "synset": "hot_plate.n.01"}, {"name": "hot_sauce", "instance_count": 70, "def": "a pungent peppery sauce", "synonyms": ["hot_sauce"], "image_count": 24, "id": 573, "frequency": "c", "synset": "hot_sauce.n.01"}, {"name": "hourglass", "instance_count": 2, "def": "a sandglass timer that runs for sixty minutes", "synonyms": ["hourglass"], "image_count": 2, "id": 574, "frequency": "r", "synset": "hourglass.n.01"}, {"name": "houseboat", "instance_count": 4, "def": "a barge that is designed and equipped for use as a dwelling", "synonyms": ["houseboat"], "image_count": 2, "id": 575, "frequency": "r", "synset": "houseboat.n.01"}, {"name": "hummingbird", "instance_count": 18, "def": "tiny American bird having brilliant iridescent plumage and long slender bills", "synonyms": ["hummingbird"], "image_count": 16, "id": 576, "frequency": "c", "synset": "hummingbird.n.01"}, {"name": "hummus", "instance_count": 9, "def": "a thick spread made from mashed chickpeas", "synonyms": ["hummus", "humus", "hommos", "hoummos", "humous"], "image_count": 8, "id": 577, "frequency": "r", "synset": "hummus.n.01"}, {"name": "polar_bear", "instance_count": 196, "def": "white bear of Arctic regions", "synonyms": ["polar_bear"], "image_count": 154, "id": 578, "frequency": "f", "synset": "ice_bear.n.01"}, {"name": "icecream", "instance_count": 180, "def": "frozen dessert containing cream and sugar and flavoring", "synonyms": ["icecream"], "image_count": 66, "id": 579, "frequency": "c", "synset": "ice_cream.n.01"}, {"name": "popsicle", "instance_count": 1, "def": "ice cream or water ice on a small wooden stick", "synonyms": ["popsicle"], "image_count": 1, "id": 580, "frequency": "r", "synset": "ice_lolly.n.01"}, {"name": "ice_maker", "instance_count": 26, "def": "an appliance included in some electric refrigerators for making ice cubes", "synonyms": ["ice_maker"], "image_count": 24, "id": 581, "frequency": "c", "synset": "ice_maker.n.01"}, {"name": "ice_pack", "instance_count": 4, "def": "a waterproof bag filled with ice: applied to the body (especially the head) to cool or reduce swelling", "synonyms": ["ice_pack", "ice_bag"], "image_count": 1, "id": 582, "frequency": "r", "synset": "ice_pack.n.01"}, {"name": "ice_skate", "instance_count": 14, "def": "skate consisting of a boot with a steel blade fitted to the sole", "synonyms": ["ice_skate"], "image_count": 4, "id": 583, "frequency": "r", "synset": "ice_skate.n.01"}, {"name": "igniter", "instance_count": 77, "def": "a substance or device used to start a fire", "synonyms": ["igniter", "ignitor", "lighter"], "image_count": 75, "id": 584, "frequency": "c", "synset": "igniter.n.01"}, {"name": "inhaler", "instance_count": 7, "def": "a dispenser that produces a chemical vapor to be inhaled through mouth or nose", "synonyms": ["inhaler", "inhalator"], "image_count": 6, "id": 585, "frequency": "r", "synset": "inhaler.n.01"}, {"name": "iPod", "instance_count": 172, "def": "a pocket-sized device used to play music files", "synonyms": ["iPod"], "image_count": 126, "id": 586, "frequency": "f", "synset": "ipod.n.01"}, {"name": "iron_(for_clothing)", "instance_count": 38, "def": "home appliance consisting of a flat metal base that is heated and used to smooth cloth", "synonyms": ["iron_(for_clothing)", "smoothing_iron_(for_clothing)"], "image_count": 24, "id": 587, "frequency": "c", "synset": "iron.n.04"}, {"name": "ironing_board", "instance_count": 24, "def": "narrow padded board on collapsible supports; used for ironing clothes", "synonyms": ["ironing_board"], "image_count": 22, "id": 588, "frequency": "c", "synset": "ironing_board.n.01"}, {"name": "jacket", "instance_count": 8013, "def": "a waist-length coat", "synonyms": ["jacket"], "image_count": 1872, "id": 589, "frequency": "f", "synset": "jacket.n.01"}, {"name": "jam", "instance_count": 29, "def": "preserve of crushed fruit", "synonyms": ["jam"], "image_count": 16, "id": 590, "frequency": "c", "synset": "jam.n.01"}, {"name": "jar", "instance_count": 2002, "def": "a vessel (usually cylindrical) with a wide mouth and without handles", "synonyms": ["jar"], "image_count": 423, "id": 591, "frequency": "f", "synset": "jar.n.01"}, {"name": "jean", "instance_count": 5421, "def": "(usually plural) close-fitting trousers of heavy denim for manual work or casual wear", "synonyms": ["jean", "blue_jean", "denim"], "image_count": 1927, "id": 592, "frequency": "f", "synset": "jean.n.01"}, {"name": "jeep", "instance_count": 55, "def": "a car suitable for traveling over rough terrain", "synonyms": ["jeep", "landrover"], "image_count": 38, "id": 593, "frequency": "c", "synset": "jeep.n.01"}, {"name": "jelly_bean", "instance_count": 116, "def": "sugar-glazed jellied candy", "synonyms": ["jelly_bean", "jelly_egg"], "image_count": 3, "id": 594, "frequency": "r", "synset": "jelly_bean.n.01"}, {"name": "jersey", "instance_count": 8117, "def": "a close-fitting pullover shirt", "synonyms": ["jersey", "T-shirt", "tee_shirt"], "image_count": 1945, "id": 595, "frequency": "f", "synset": "jersey.n.03"}, {"name": "jet_plane", "instance_count": 87, "def": "an airplane powered by one or more jet engines", "synonyms": ["jet_plane", "jet-propelled_plane"], "image_count": 35, "id": 596, "frequency": "c", "synset": "jet.n.01"}, {"name": "jewel", "instance_count": 1, "def": "a precious or semiprecious stone incorporated into a piece of jewelry", "synonyms": ["jewel", "gem", "precious_stone"], "image_count": 1, "id": 597, "frequency": "r", "synset": "jewel.n.01"}, {"name": "jewelry", "instance_count": 51, "def": "an adornment (as a bracelet or ring or necklace) made of precious metals and set with gems (or imitation gems)", "synonyms": ["jewelry", "jewellery"], "image_count": 13, "id": 598, "frequency": "c", "synset": "jewelry.n.01"}, {"name": "joystick", "instance_count": 12, "def": "a control device for computers consisting of a vertical handle that can move freely in two directions", "synonyms": ["joystick"], "image_count": 9, "id": 599, "frequency": "r", "synset": "joystick.n.02"}, {"name": "jumpsuit", "instance_count": 21, "def": "one-piece garment fashioned after a parachutist's uniform", "synonyms": ["jumpsuit"], "image_count": 14, "id": 600, "frequency": "c", "synset": "jump_suit.n.01"}, {"name": "kayak", "instance_count": 124, "def": "a small canoe consisting of a light frame made watertight with animal skins", "synonyms": ["kayak"], "image_count": 37, "id": 601, "frequency": "c", "synset": "kayak.n.01"}, {"name": "keg", "instance_count": 6, "def": "small cask or barrel", "synonyms": ["keg"], "image_count": 3, "id": 602, "frequency": "r", "synset": "keg.n.02"}, {"name": "kennel", "instance_count": 4, "def": "outbuilding that serves as a shelter for a dog", "synonyms": ["kennel", "doghouse"], "image_count": 4, "id": 603, "frequency": "r", "synset": "kennel.n.01"}, {"name": "kettle", "instance_count": 130, "def": "a metal pot for stewing or boiling; usually has a lid", "synonyms": ["kettle", "boiler"], "image_count": 100, "id": 604, "frequency": "c", "synset": "kettle.n.01"}, {"name": "key", "instance_count": 447, "def": "metal instrument used to unlock a lock", "synonyms": ["key"], "image_count": 195, "id": 605, "frequency": "f", "synset": "key.n.01"}, {"name": "keycard", "instance_count": 1, "def": "a plastic card used to gain access typically to a door", "synonyms": ["keycard"], "image_count": 1, "id": 606, "frequency": "r", "synset": "keycard.n.01"}, {"name": "kilt", "instance_count": 19, "def": "a knee-length pleated tartan skirt worn by men as part of the traditional dress in the Highlands of northern Scotland", "synonyms": ["kilt"], "image_count": 12, "id": 607, "frequency": "c", "synset": "kilt.n.01"}, {"name": "kimono", "instance_count": 38, "def": "a loose robe; imitated from robes originally worn by Japanese", "synonyms": ["kimono"], "image_count": 24, "id": 608, "frequency": "c", "synset": "kimono.n.01"}, {"name": "kitchen_sink", "instance_count": 519, "def": "a sink in a kitchen", "synonyms": ["kitchen_sink"], "image_count": 489, "id": 609, "frequency": "f", "synset": "kitchen_sink.n.01"}, {"name": "kitchen_table", "instance_count": 11, "def": "a table in the kitchen", "synonyms": ["kitchen_table"], "image_count": 10, "id": 610, "frequency": "r", "synset": "kitchen_table.n.01"}, {"name": "kite", "instance_count": 11174, "def": "plaything consisting of a light frame covered with tissue paper; flown in wind at end of a string", "synonyms": ["kite"], "image_count": 1689, "id": 611, "frequency": "f", "synset": "kite.n.03"}, {"name": "kitten", "instance_count": 60, "def": "young domestic cat", "synonyms": ["kitten", "kitty"], "image_count": 42, "id": 612, "frequency": "c", "synset": "kitten.n.01"}, {"name": "kiwi_fruit", "instance_count": 702, "def": "fuzzy brown egg-shaped fruit with slightly tart green flesh", "synonyms": ["kiwi_fruit"], "image_count": 81, "id": 613, "frequency": "c", "synset": "kiwi.n.03"}, {"name": "knee_pad", "instance_count": 1765, "def": "protective garment consisting of a pad worn by football or baseball or hockey players", "synonyms": ["knee_pad"], "image_count": 894, "id": 614, "frequency": "f", "synset": "knee_pad.n.01"}, {"name": "knife", "instance_count": 3515, "def": "tool with a blade and point used as a cutting instrument", "synonyms": ["knife"], "image_count": 1868, "id": 615, "frequency": "f", "synset": "knife.n.01"}, {"name": "knitting_needle", "instance_count": 16, "def": "needle consisting of a slender rod with pointed ends; usually used in pairs", "synonyms": ["knitting_needle"], "image_count": 7, "id": 616, "frequency": "r", "synset": "knitting_needle.n.01"}, {"name": "knob", "instance_count": 8432, "def": "a round handle often found on a door", "synonyms": ["knob"], "image_count": 1567, "id": 617, "frequency": "f", "synset": "knob.n.02"}, {"name": "knocker_(on_a_door)", "instance_count": 10, "def": "a device (usually metal and ornamental) attached by a hinge to a door", "synonyms": ["knocker_(on_a_door)", "doorknocker"], "image_count": 10, "id": 618, "frequency": "r", "synset": "knocker.n.05"}, {"name": "koala", "instance_count": 15, "def": "sluggish tailless Australian marsupial with grey furry ears and coat", "synonyms": ["koala", "koala_bear"], "image_count": 8, "id": 619, "frequency": "r", "synset": "koala.n.01"}, {"name": "lab_coat", "instance_count": 42, "def": "a light coat worn to protect clothing from substances used while working in a laboratory", "synonyms": ["lab_coat", "laboratory_coat"], "image_count": 7, "id": 620, "frequency": "r", "synset": "lab_coat.n.01"}, {"name": "ladder", "instance_count": 975, "def": "steps consisting of two parallel members connected by rungs", "synonyms": ["ladder"], "image_count": 629, "id": 621, "frequency": "f", "synset": "ladder.n.01"}, {"name": "ladle", "instance_count": 226, "def": "a spoon-shaped vessel with a long handle frequently used to transfer liquids", "synonyms": ["ladle"], "image_count": 89, "id": 622, "frequency": "c", "synset": "ladle.n.01"}, {"name": "ladybug", "instance_count": 68, "def": "small round bright-colored and spotted beetle, typically red and black", "synonyms": ["ladybug", "ladybeetle", "ladybird_beetle"], "image_count": 15, "id": 623, "frequency": "c", "synset": "ladybug.n.01"}, {"name": "lamb_(animal)", "instance_count": 618, "def": "young sheep", "synonyms": ["lamb_(animal)"], "image_count": 134, "id": 624, "frequency": "f", "synset": "lamb.n.01"}, {"name": "lamb-chop", "instance_count": 8, "def": "chop cut from a lamb", "synonyms": ["lamb-chop", "lambchop"], "image_count": 4, "id": 625, "frequency": "r", "synset": "lamb_chop.n.01"}, {"name": "lamp", "instance_count": 4139, "def": "a piece of furniture holding one or more electric light bulbs", "synonyms": ["lamp"], "image_count": 1802, "id": 626, "frequency": "f", "synset": "lamp.n.02"}, {"name": "lamppost", "instance_count": 2234, "def": "a metal post supporting an outdoor lamp (such as a streetlight)", "synonyms": ["lamppost"], "image_count": 595, "id": 627, "frequency": "f", "synset": "lamppost.n.01"}, {"name": "lampshade", "instance_count": 2475, "def": "a protective ornamental shade used to screen a light bulb from direct view", "synonyms": ["lampshade"], "image_count": 1210, "id": 628, "frequency": "f", "synset": "lampshade.n.01"}, {"name": "lantern", "instance_count": 364, "def": "light in a transparent protective case", "synonyms": ["lantern"], "image_count": 48, "id": 629, "frequency": "c", "synset": "lantern.n.01"}, {"name": "lanyard", "instance_count": 1065, "def": "a cord worn around the neck to hold a knife or whistle, etc.", "synonyms": ["lanyard", "laniard"], "image_count": 418, "id": 630, "frequency": "f", "synset": "lanyard.n.02"}, {"name": "laptop_computer", "instance_count": 2852, "def": "a portable computer small enough to use in your lap", "synonyms": ["laptop_computer", "notebook_computer"], "image_count": 1846, "id": 631, "frequency": "f", "synset": "laptop.n.01"}, {"name": "lasagna", "instance_count": 7, "def": "baked dish of layers of lasagna pasta with sauce and cheese and meat or vegetables", "synonyms": ["lasagna", "lasagne"], "image_count": 5, "id": 632, "frequency": "r", "synset": "lasagna.n.01"}, {"name": "latch", "instance_count": 702, "def": "a bar that can be lowered or slid into a groove to fasten a door or gate", "synonyms": ["latch"], "image_count": 221, "id": 633, "frequency": "f", "synset": "latch.n.02"}, {"name": "lawn_mower", "instance_count": 12, "def": "garden tool for mowing grass on lawns", "synonyms": ["lawn_mower"], "image_count": 10, "id": 634, "frequency": "r", "synset": "lawn_mower.n.01"}, {"name": "leather", "instance_count": 20, "def": "an animal skin made smooth and flexible by removing the hair and then tanning", "synonyms": ["leather"], "image_count": 7, "id": 635, "frequency": "r", "synset": "leather.n.01"}, {"name": "legging_(clothing)", "instance_count": 154, "def": "a garment covering the leg (usually extending from the knee to the ankle)", "synonyms": ["legging_(clothing)", "leging_(clothing)", "leg_covering"], "image_count": 76, "id": 636, "frequency": "c", "synset": "legging.n.01"}, {"name": "Lego", "instance_count": 331, "def": "a child's plastic construction set for making models from blocks", "synonyms": ["Lego", "Lego_set"], "image_count": 22, "id": 637, "frequency": "c", "synset": "lego.n.01"}, {"name": "legume", "instance_count": 333, "def": "the fruit or seed of bean or pea plants", "synonyms": ["legume"], "image_count": 10, "id": 638, "frequency": "r", "synset": "legume.n.02"}, {"name": "lemon", "instance_count": 2168, "def": "yellow oval fruit with juicy acidic flesh", "synonyms": ["lemon"], "image_count": 341, "id": 639, "frequency": "f", "synset": "lemon.n.01"}, {"name": "lemonade", "instance_count": 2, "def": "sweetened beverage of diluted lemon juice", "synonyms": ["lemonade"], "image_count": 1, "id": 640, "frequency": "r", "synset": "lemonade.n.01"}, {"name": "lettuce", "instance_count": 5500, "def": "leafy plant commonly eaten in salad or on sandwiches", "synonyms": ["lettuce"], "image_count": 705, "id": 641, "frequency": "f", "synset": "lettuce.n.02"}, {"name": "license_plate", "instance_count": 4392, "def": "a plate mounted on the front and back of car and bearing the car's registration number", "synonyms": ["license_plate", "numberplate"], "image_count": 1900, "id": 642, "frequency": "f", "synset": "license_plate.n.01"}, {"name": "life_buoy", "instance_count": 524, "def": "a ring-shaped life preserver used to prevent drowning (NOT a life-jacket or vest)", "synonyms": ["life_buoy", "lifesaver", "life_belt", "life_ring"], "image_count": 188, "id": 643, "frequency": "f", "synset": "life_buoy.n.01"}, {"name": "life_jacket", "instance_count": 689, "def": "life preserver consisting of a sleeveless jacket of buoyant or inflatable design", "synonyms": ["life_jacket", "life_vest"], "image_count": 227, "id": 644, "frequency": "f", "synset": "life_jacket.n.01"}, {"name": "lightbulb", "instance_count": 7075, "def": "lightblub/source of light", "synonyms": ["lightbulb"], "image_count": 861, "id": 645, "frequency": "f", "synset": "light_bulb.n.01"}, {"name": "lightning_rod", "instance_count": 6, "def": "a metallic conductor that is attached to a high point and leads to the ground", "synonyms": ["lightning_rod", "lightning_conductor"], "image_count": 6, "id": 646, "frequency": "r", "synset": "lightning_rod.n.02"}, {"name": "lime", "instance_count": 1134, "def": "the green acidic fruit of any of various lime trees", "synonyms": ["lime"], "image_count": 115, "id": 647, "frequency": "f", "synset": "lime.n.06"}, {"name": "limousine", "instance_count": 6, "def": "long luxurious car; usually driven by a chauffeur", "synonyms": ["limousine"], "image_count": 5, "id": 648, "frequency": "r", "synset": "limousine.n.01"}, {"name": "lion", "instance_count": 69, "def": "large gregarious predatory cat of Africa and India", "synonyms": ["lion"], "image_count": 43, "id": 649, "frequency": "c", "synset": "lion.n.01"}, {"name": "lip_balm", "instance_count": 29, "def": "a balm applied to the lips", "synonyms": ["lip_balm"], "image_count": 14, "id": 650, "frequency": "c", "synset": "lip_balm.n.01"}, {"name": "liquor", "instance_count": 66, "def": "liquor or beer", "synonyms": ["liquor", "spirits", "hard_liquor", "liqueur", "cordial"], "image_count": 6, "id": 651, "frequency": "r", "synset": "liquor.n.01"}, {"name": "lizard", "instance_count": 22, "def": "a reptile with usually two pairs of legs and a tapering tail", "synonyms": ["lizard"], "image_count": 15, "id": 652, "frequency": "c", "synset": "lizard.n.01"}, {"name": "log", "instance_count": 7363, "def": "a segment of the trunk of a tree when stripped of branches", "synonyms": ["log"], "image_count": 1167, "id": 653, "frequency": "f", "synset": "log.n.01"}, {"name": "lollipop", "instance_count": 59, "def": "hard candy on a stick", "synonyms": ["lollipop"], "image_count": 15, "id": 654, "frequency": "c", "synset": "lollipop.n.02"}, {"name": "speaker_(stero_equipment)", "instance_count": 2029, "def": "electronic device that produces sound often as part of a stereo system", "synonyms": ["speaker_(stero_equipment)"], "image_count": 994, "id": 655, "frequency": "f", "synset": "loudspeaker.n.01"}, {"name": "loveseat", "instance_count": 41, "def": "small sofa that seats two people", "synonyms": ["loveseat"], "image_count": 28, "id": 656, "frequency": "c", "synset": "love_seat.n.01"}, {"name": "machine_gun", "instance_count": 5, "def": "a rapidly firing automatic gun", "synonyms": ["machine_gun"], "image_count": 2, "id": 657, "frequency": "r", "synset": "machine_gun.n.01"}, {"name": "magazine", "instance_count": 1379, "def": "a paperback periodic publication", "synonyms": ["magazine"], "image_count": 338, "id": 658, "frequency": "f", "synset": "magazine.n.02"}, {"name": "magnet", "instance_count": 5638, "def": "a device that attracts iron and produces a magnetic field", "synonyms": ["magnet"], "image_count": 334, "id": 659, "frequency": "f", "synset": "magnet.n.01"}, {"name": "mail_slot", "instance_count": 16, "def": "a slot (usually in a door) through which mail can be delivered", "synonyms": ["mail_slot"], "image_count": 15, "id": 660, "frequency": "c", "synset": "mail_slot.n.01"}, {"name": "mailbox_(at_home)", "instance_count": 240, "def": "a private box for delivery of mail", "synonyms": ["mailbox_(at_home)", "letter_box_(at_home)"], "image_count": 102, "id": 661, "frequency": "f", "synset": "mailbox.n.01"}, {"name": "mallard", "instance_count": 2, "def": "wild dabbling duck from which domestic ducks are descended", "synonyms": ["mallard"], "image_count": 1, "id": 662, "frequency": "r", "synset": "mallard.n.01"}, {"name": "mallet", "instance_count": 16, "def": "a sports implement with a long handle and a hammer-like head used to hit a ball", "synonyms": ["mallet"], "image_count": 8, "id": 663, "frequency": "r", "synset": "mallet.n.01"}, {"name": "mammoth", "instance_count": 2, "def": "any of numerous extinct elephants widely distributed in the Pleistocene", "synonyms": ["mammoth"], "image_count": 1, "id": 664, "frequency": "r", "synset": "mammoth.n.01"}, {"name": "manatee", "instance_count": 1, "def": "sirenian mammal of tropical coastal waters of America", "synonyms": ["manatee"], "image_count": 1, "id": 665, "frequency": "r", "synset": "manatee.n.01"}, {"name": "mandarin_orange", "instance_count": 401, "def": "a somewhat flat reddish-orange loose skinned citrus of China", "synonyms": ["mandarin_orange"], "image_count": 28, "id": 666, "frequency": "c", "synset": "mandarin.n.05"}, {"name": "manger", "instance_count": 126, "def": "a container (usually in a barn or stable) from which cattle or horses feed", "synonyms": ["manger", "trough"], "image_count": 91, "id": 667, "frequency": "c", "synset": "manger.n.01"}, {"name": "manhole", "instance_count": 445, "def": "a hole (usually with a flush cover) through which a person can gain access to an underground structure", "synonyms": ["manhole"], "image_count": 260, "id": 668, "frequency": "f", "synset": "manhole.n.01"}, {"name": "map", "instance_count": 186, "def": "a diagrammatic representation of the earth's surface (or part of it)", "synonyms": ["map"], "image_count": 131, "id": 669, "frequency": "f", "synset": "map.n.01"}, {"name": "marker", "instance_count": 501, "def": "a writing implement for making a mark", "synonyms": ["marker"], "image_count": 128, "id": 670, "frequency": "f", "synset": "marker.n.03"}, {"name": "martini", "instance_count": 3, "def": "a cocktail made of gin (or vodka) with dry vermouth", "synonyms": ["martini"], "image_count": 3, "id": 671, "frequency": "r", "synset": "martini.n.01"}, {"name": "mascot", "instance_count": 10, "def": "a person or animal that is adopted by a team or other group as a symbolic figure", "synonyms": ["mascot"], "image_count": 10, "id": 672, "frequency": "r", "synset": "mascot.n.01"}, {"name": "mashed_potato", "instance_count": 58, "def": "potato that has been peeled and boiled and then mashed", "synonyms": ["mashed_potato"], "image_count": 39, "id": 673, "frequency": "c", "synset": "mashed_potato.n.01"}, {"name": "masher", "instance_count": 2, "def": "a kitchen utensil used for mashing (e.g. potatoes)", "synonyms": ["masher"], "image_count": 2, "id": 674, "frequency": "r", "synset": "masher.n.02"}, {"name": "mask", "instance_count": 1595, "def": "a protective covering worn over the face", "synonyms": ["mask", "facemask"], "image_count": 925, "id": 675, "frequency": "f", "synset": "mask.n.04"}, {"name": "mast", "instance_count": 2985, "def": "a vertical spar for supporting sails", "synonyms": ["mast"], "image_count": 354, "id": 676, "frequency": "f", "synset": "mast.n.01"}, {"name": "mat_(gym_equipment)", "instance_count": 114, "def": "sports equipment consisting of a piece of thick padding on the floor for gymnastics", "synonyms": ["mat_(gym_equipment)", "gym_mat"], "image_count": 31, "id": 677, "frequency": "c", "synset": "mat.n.03"}, {"name": "matchbox", "instance_count": 11, "def": "a box for holding matches", "synonyms": ["matchbox"], "image_count": 10, "id": 678, "frequency": "r", "synset": "matchbox.n.01"}, {"name": "mattress", "instance_count": 354, "def": "a thick pad filled with resilient material used as a bed or part of a bed", "synonyms": ["mattress"], "image_count": 215, "id": 679, "frequency": "f", "synset": "mattress.n.01"}, {"name": "measuring_cup", "instance_count": 139, "def": "graduated cup used to measure liquid or granular ingredients", "synonyms": ["measuring_cup"], "image_count": 71, "id": 680, "frequency": "c", "synset": "measuring_cup.n.01"}, {"name": "measuring_stick", "instance_count": 57, "def": "measuring instrument having a sequence of marks at regular intervals", "synonyms": ["measuring_stick", "ruler_(measuring_stick)", "measuring_rod"], "image_count": 43, "id": 681, "frequency": "c", "synset": "measuring_stick.n.01"}, {"name": "meatball", "instance_count": 174, "def": "ground meat formed into a ball and fried or simmered in broth", "synonyms": ["meatball"], "image_count": 28, "id": 682, "frequency": "c", "synset": "meatball.n.01"}, {"name": "medicine", "instance_count": 243, "def": "something that treats or prevents or alleviates the symptoms of disease", "synonyms": ["medicine"], "image_count": 34, "id": 683, "frequency": "c", "synset": "medicine.n.02"}, {"name": "melon", "instance_count": 167, "def": "fruit of the gourd family having a hard rind and sweet juicy flesh", "synonyms": ["melon"], "image_count": 16, "id": 684, "frequency": "c", "synset": "melon.n.01"}, {"name": "microphone", "instance_count": 435, "def": "device for converting sound waves into electrical energy", "synonyms": ["microphone"], "image_count": 273, "id": 685, "frequency": "f", "synset": "microphone.n.01"}, {"name": "microscope", "instance_count": 3, "def": "magnifier of the image of small objects", "synonyms": ["microscope"], "image_count": 2, "id": 686, "frequency": "r", "synset": "microscope.n.01"}, {"name": "microwave_oven", "instance_count": 1105, "def": "kitchen appliance that cooks food by passing an electromagnetic wave through it", "synonyms": ["microwave_oven"], "image_count": 999, "id": 687, "frequency": "f", "synset": "microwave.n.02"}, {"name": "milestone", "instance_count": 5, "def": "stone post at side of a road to show distances", "synonyms": ["milestone", "milepost"], "image_count": 4, "id": 688, "frequency": "r", "synset": "milestone.n.01"}, {"name": "milk", "instance_count": 227, "def": "a white nutritious liquid secreted by mammals and used as food by human beings", "synonyms": ["milk"], "image_count": 107, "id": 689, "frequency": "f", "synset": "milk.n.01"}, {"name": "milk_can", "instance_count": 8, "def": "can for transporting milk", "synonyms": ["milk_can"], "image_count": 2, "id": 690, "frequency": "r", "synset": "milk_can.n.01"}, {"name": "milkshake", "instance_count": 1, "def": "frothy drink of milk and flavoring and sometimes fruit or ice cream", "synonyms": ["milkshake"], "image_count": 1, "id": 691, "frequency": "r", "synset": "milkshake.n.01"}, {"name": "minivan", "instance_count": 1046, "def": "a small box-shaped passenger van", "synonyms": ["minivan"], "image_count": 454, "id": 692, "frequency": "f", "synset": "minivan.n.01"}, {"name": "mint_candy", "instance_count": 27, "def": "a candy that is flavored with a mint oil", "synonyms": ["mint_candy"], "image_count": 9, "id": 693, "frequency": "r", "synset": "mint.n.05"}, {"name": "mirror", "instance_count": 3490, "def": "polished surface that forms images by reflecting light", "synonyms": ["mirror"], "image_count": 1901, "id": 694, "frequency": "f", "synset": "mirror.n.01"}, {"name": "mitten", "instance_count": 156, "def": "glove that encases the thumb separately and the other four fingers together", "synonyms": ["mitten"], "image_count": 61, "id": 695, "frequency": "c", "synset": "mitten.n.01"}, {"name": "mixer_(kitchen_tool)", "instance_count": 108, "def": "a kitchen utensil that is used for mixing foods", "synonyms": ["mixer_(kitchen_tool)", "stand_mixer"], "image_count": 91, "id": 696, "frequency": "c", "synset": "mixer.n.04"}, {"name": "money", "instance_count": 122, "def": "the official currency issued by a government or national bank", "synonyms": ["money"], "image_count": 46, "id": 697, "frequency": "c", "synset": "money.n.03"}, {"name": "monitor_(computer_equipment) computer_monitor", "instance_count": 2955, "def": "a computer monitor", "synonyms": ["monitor_(computer_equipment) computer_monitor"], "image_count": 1402, "id": 698, "frequency": "f", "synset": "monitor.n.04"}, {"name": "monkey", "instance_count": 166, "def": "any of various long-tailed primates", "synonyms": ["monkey"], "image_count": 74, "id": 699, "frequency": "c", "synset": "monkey.n.01"}, {"name": "motor", "instance_count": 985, "def": "machine that converts other forms of energy into mechanical energy and so imparts motion", "synonyms": ["motor"], "image_count": 421, "id": 700, "frequency": "f", "synset": "motor.n.01"}, {"name": "motor_scooter", "instance_count": 720, "def": "a wheeled vehicle with small wheels and a low-powered engine", "synonyms": ["motor_scooter", "scooter"], "image_count": 226, "id": 701, "frequency": "f", "synset": "motor_scooter.n.01"}, {"name": "motor_vehicle", "instance_count": 64, "def": "a self-propelled wheeled vehicle that does not run on rails", "synonyms": ["motor_vehicle", "automotive_vehicle"], "image_count": 10, "id": 702, "frequency": "r", "synset": "motor_vehicle.n.01"}, {"name": "motorcycle", "instance_count": 5247, "def": "a motor vehicle with two wheels and a strong frame", "synonyms": ["motorcycle"], "image_count": 1720, "id": 703, "frequency": "f", "synset": "motorcycle.n.01"}, {"name": "mound_(baseball)", "instance_count": 269, "def": "(baseball) the slight elevation on which the pitcher stands", "synonyms": ["mound_(baseball)", "pitcher's_mound"], "image_count": 261, "id": 704, "frequency": "f", "synset": "mound.n.01"}, {"name": "mouse_(computer_equipment)", "instance_count": 1832, "def": "a computer input device that controls an on-screen pointer (does not include trackpads / touchpads)", "synonyms": ["mouse_(computer_equipment)", "computer_mouse"], "image_count": 1337, "id": 705, "frequency": "f", "synset": "mouse.n.04"}, {"name": "mousepad", "instance_count": 333, "def": "a small portable pad that provides an operating surface for a computer mouse", "synonyms": ["mousepad"], "image_count": 293, "id": 706, "frequency": "f", "synset": "mousepad.n.01"}, {"name": "muffin", "instance_count": 352, "def": "a sweet quick bread baked in a cup-shaped pan", "synonyms": ["muffin"], "image_count": 62, "id": 707, "frequency": "c", "synset": "muffin.n.01"}, {"name": "mug", "instance_count": 1785, "def": "with handle and usually cylindrical", "synonyms": ["mug"], "image_count": 814, "id": 708, "frequency": "f", "synset": "mug.n.04"}, {"name": "mushroom", "instance_count": 6257, "def": "a common mushroom", "synonyms": ["mushroom"], "image_count": 407, "id": 709, "frequency": "f", "synset": "mushroom.n.02"}, {"name": "music_stool", "instance_count": 6, "def": "a stool for piano players; usually adjustable in height", "synonyms": ["music_stool", "piano_stool"], "image_count": 6, "id": 710, "frequency": "r", "synset": "music_stool.n.01"}, {"name": "musical_instrument", "instance_count": 33, "def": "any of various devices or contrivances that can be used to produce musical tones or sounds", "synonyms": ["musical_instrument", "instrument_(musical)"], "image_count": 16, "id": 711, "frequency": "c", "synset": "musical_instrument.n.01"}, {"name": "nailfile", "instance_count": 10, "def": "a small flat file for shaping the nails", "synonyms": ["nailfile"], "image_count": 7, "id": 712, "frequency": "r", "synset": "nailfile.n.01"}, {"name": "napkin", "instance_count": 3979, "def": "a small piece of table linen or paper that is used to wipe the mouth and to cover the lap in order to protect clothing", "synonyms": ["napkin", "table_napkin", "serviette"], "image_count": 1791, "id": 713, "frequency": "f", "synset": "napkin.n.01"}, {"name": "neckerchief", "instance_count": 4, "def": "a kerchief worn around the neck", "synonyms": ["neckerchief"], "image_count": 2, "id": 714, "frequency": "r", "synset": "neckerchief.n.01"}, {"name": "necklace", "instance_count": 2709, "def": "jewelry consisting of a cord or chain (often bearing gems) worn about the neck as an ornament", "synonyms": ["necklace"], "image_count": 1915, "id": 715, "frequency": "f", "synset": "necklace.n.01"}, {"name": "necktie", "instance_count": 4069, "def": "neckwear consisting of a long narrow piece of material worn under a collar and tied in knot at the front", "synonyms": ["necktie", "tie_(necktie)"], "image_count": 1940, "id": 716, "frequency": "f", "synset": "necktie.n.01"}, {"name": "needle", "instance_count": 61, "def": "a sharp pointed implement (usually metal)", "synonyms": ["needle"], "image_count": 13, "id": 717, "frequency": "c", "synset": "needle.n.03"}, {"name": "nest", "instance_count": 20, "def": "a structure in which animals lay eggs or give birth to their young", "synonyms": ["nest"], "image_count": 16, "id": 718, "frequency": "c", "synset": "nest.n.01"}, {"name": "newspaper", "instance_count": 1179, "def": "a daily or weekly publication on folded sheets containing news, articles, and advertisements", "synonyms": ["newspaper", "paper_(newspaper)"], "image_count": 448, "id": 719, "frequency": "f", "synset": "newspaper.n.01"}, {"name": "newsstand", "instance_count": 39, "def": "a stall where newspapers and other periodicals are sold", "synonyms": ["newsstand"], "image_count": 12, "id": 720, "frequency": "c", "synset": "newsstand.n.01"}, {"name": "nightshirt", "instance_count": 35, "def": "garments designed to be worn in bed", "synonyms": ["nightshirt", "nightwear", "sleepwear", "nightclothes"], "image_count": 18, "id": 721, "frequency": "c", "synset": "nightwear.n.01"}, {"name": "nosebag_(for_animals)", "instance_count": 4, "def": "a canvas bag that is used to feed an animal (such as a horse); covers the muzzle and fastens at the top of the head", "synonyms": ["nosebag_(for_animals)", "feedbag"], "image_count": 4, "id": 722, "frequency": "r", "synset": "nosebag.n.01"}, {"name": "noseband_(for_animals)", "instance_count": 120, "def": "a strap that is the part of a bridle that goes over the animal's nose", "synonyms": ["noseband_(for_animals)", "nosepiece_(for_animals)"], "image_count": 71, "id": 723, "frequency": "c", "synset": "noseband.n.01"}, {"name": "notebook", "instance_count": 290, "def": "a book with blank pages for recording notes or memoranda", "synonyms": ["notebook"], "image_count": 189, "id": 724, "frequency": "f", "synset": "notebook.n.01"}, {"name": "notepad", "instance_count": 187, "def": "a pad of paper for keeping notes", "synonyms": ["notepad"], "image_count": 74, "id": 725, "frequency": "c", "synset": "notepad.n.01"}, {"name": "nut", "instance_count": 790, "def": "a small metal block (usually square or hexagonal) with internal screw thread to be fitted onto a bolt", "synonyms": ["nut"], "image_count": 103, "id": 726, "frequency": "f", "synset": "nut.n.03"}, {"name": "nutcracker", "instance_count": 7, "def": "a hand tool used to crack nuts open", "synonyms": ["nutcracker"], "image_count": 3, "id": 727, "frequency": "r", "synset": "nutcracker.n.01"}, {"name": "oar", "instance_count": 488, "def": "an implement used to propel or steer a boat", "synonyms": ["oar"], "image_count": 110, "id": 728, "frequency": "f", "synset": "oar.n.01"}, {"name": "octopus_(food)", "instance_count": 5, "def": "tentacles of octopus prepared as food", "synonyms": ["octopus_(food)"], "image_count": 5, "id": 729, "frequency": "r", "synset": "octopus.n.01"}, {"name": "octopus_(animal)", "instance_count": 17, "def": "bottom-living cephalopod having a soft oval body with eight long tentacles", "synonyms": ["octopus_(animal)"], "image_count": 9, "id": 730, "frequency": "r", "synset": "octopus.n.02"}, {"name": "oil_lamp", "instance_count": 28, "def": "a lamp that burns oil (as kerosine) for light", "synonyms": ["oil_lamp", "kerosene_lamp", "kerosine_lamp"], "image_count": 15, "id": 731, "frequency": "c", "synset": "oil_lamp.n.01"}, {"name": "olive_oil", "instance_count": 36, "def": "oil from olives", "synonyms": ["olive_oil"], "image_count": 25, "id": 732, "frequency": "c", "synset": "olive_oil.n.01"}, {"name": "omelet", "instance_count": 10, "def": "beaten eggs cooked until just set; may be folded around e.g. ham or cheese or jelly", "synonyms": ["omelet", "omelette"], "image_count": 7, "id": 733, "frequency": "r", "synset": "omelet.n.01"}, {"name": "onion", "instance_count": 9779, "def": "the bulb of an onion plant", "synonyms": ["onion"], "image_count": 647, "id": 734, "frequency": "f", "synset": "onion.n.01"}, {"name": "orange_(fruit)", "instance_count": 13034, "def": "orange (FRUIT of an orange tree)", "synonyms": ["orange_(fruit)"], "image_count": 824, "id": 735, "frequency": "f", "synset": "orange.n.01"}, {"name": "orange_juice", "instance_count": 223, "def": "bottled or freshly squeezed juice of oranges", "synonyms": ["orange_juice"], "image_count": 100, "id": 736, "frequency": "c", "synset": "orange_juice.n.01"}, {"name": "ostrich", "instance_count": 71, "def": "fast-running African flightless bird with two-toed feet; largest living bird", "synonyms": ["ostrich"], "image_count": 47, "id": 737, "frequency": "c", "synset": "ostrich.n.02"}, {"name": "ottoman", "instance_count": 157, "def": "a thick standalone cushion used as a seat or footrest, often next to a chair", "synonyms": ["ottoman", "pouf", "pouffe", "hassock"], "image_count": 121, "id": 738, "frequency": "f", "synset": "ottoman.n.03"}, {"name": "oven", "instance_count": 929, "def": "kitchen appliance used for baking or roasting", "synonyms": ["oven"], "image_count": 731, "id": 739, "frequency": "f", "synset": "oven.n.01"}, {"name": "overalls_(clothing)", "instance_count": 76, "def": "work clothing consisting of denim trousers usually with a bib and shoulder straps", "synonyms": ["overalls_(clothing)"], "image_count": 73, "id": 740, "frequency": "c", "synset": "overall.n.01"}, {"name": "owl", "instance_count": 73, "def": "nocturnal bird of prey with hawk-like beak and claws and large head with front-facing eyes", "synonyms": ["owl"], "image_count": 49, "id": 741, "frequency": "c", "synset": "owl.n.01"}, {"name": "packet", "instance_count": 109, "def": "a small package or bundle", "synonyms": ["packet"], "image_count": 23, "id": 742, "frequency": "c", "synset": "packet.n.03"}, {"name": "inkpad", "instance_count": 12, "def": "absorbent material saturated with ink used to transfer ink evenly to a rubber stamp", "synonyms": ["inkpad", "inking_pad", "stamp_pad"], "image_count": 4, "id": 743, "frequency": "r", "synset": "pad.n.03"}, {"name": "pad", "instance_count": 264, "def": "mostly arm/knee pads labeled", "synonyms": ["pad"], "image_count": 62, "id": 744, "frequency": "c", "synset": "pad.n.04"}, {"name": "paddle", "instance_count": 306, "def": "a short light oar used without an oarlock to propel a canoe or small boat", "synonyms": ["paddle", "boat_paddle"], "image_count": 118, "id": 745, "frequency": "f", "synset": "paddle.n.04"}, {"name": "padlock", "instance_count": 184, "def": "a detachable, portable lock", "synonyms": ["padlock"], "image_count": 99, "id": 746, "frequency": "c", "synset": "padlock.n.01"}, {"name": "paintbrush", "instance_count": 91, "def": "a brush used as an applicator to apply paint", "synonyms": ["paintbrush"], "image_count": 40, "id": 747, "frequency": "c", "synset": "paintbrush.n.01"}, {"name": "painting", "instance_count": 2645, "def": "graphic art consisting of an artistic composition made by applying paints to a surface", "synonyms": ["painting"], "image_count": 1036, "id": 748, "frequency": "f", "synset": "painting.n.01"}, {"name": "pajamas", "instance_count": 163, "def": "loose-fitting nightclothes worn for sleeping or lounging", "synonyms": ["pajamas", "pyjamas"], "image_count": 105, "id": 749, "frequency": "f", "synset": "pajama.n.02"}, {"name": "palette", "instance_count": 68, "def": "board that provides a flat surface on which artists mix paints and the range of colors used", "synonyms": ["palette", "pallet"], "image_count": 21, "id": 750, "frequency": "c", "synset": "palette.n.02"}, {"name": "pan_(for_cooking)", "instance_count": 643, "def": "cooking utensil consisting of a wide metal vessel", "synonyms": ["pan_(for_cooking)", "cooking_pan"], "image_count": 229, "id": 751, "frequency": "f", "synset": "pan.n.01"}, {"name": "pan_(metal_container)", "instance_count": 21, "def": "shallow container made of metal", "synonyms": ["pan_(metal_container)"], "image_count": 7, "id": 752, "frequency": "r", "synset": "pan.n.03"}, {"name": "pancake", "instance_count": 295, "def": "a flat cake of thin batter fried on both sides on a griddle", "synonyms": ["pancake"], "image_count": 72, "id": 753, "frequency": "c", "synset": "pancake.n.01"}, {"name": "pantyhose", "instance_count": 11, "def": "a woman's tights consisting of underpants and stockings", "synonyms": ["pantyhose"], "image_count": 9, "id": 754, "frequency": "r", "synset": "pantyhose.n.01"}, {"name": "papaya", "instance_count": 206, "def": "large oval melon-like tropical fruit with yellowish flesh", "synonyms": ["papaya"], "image_count": 10, "id": 755, "frequency": "r", "synset": "papaya.n.02"}, {"name": "paper_plate", "instance_count": 957, "def": "a disposable plate made of cardboard", "synonyms": ["paper_plate"], "image_count": 328, "id": 756, "frequency": "f", "synset": "paper_plate.n.01"}, {"name": "paper_towel", "instance_count": 600, "def": "a disposable towel made of absorbent paper", "synonyms": ["paper_towel"], "image_count": 468, "id": 757, "frequency": "f", "synset": "paper_towel.n.01"}, {"name": "paperback_book", "instance_count": 3, "def": "a book with paper covers", "synonyms": ["paperback_book", "paper-back_book", "softback_book", "soft-cover_book"], "image_count": 1, "id": 758, "frequency": "r", "synset": "paperback_book.n.01"}, {"name": "paperweight", "instance_count": 4, "def": "a weight used to hold down a stack of papers", "synonyms": ["paperweight"], "image_count": 2, "id": 759, "frequency": "r", "synset": "paperweight.n.01"}, {"name": "parachute", "instance_count": 61, "def": "rescue equipment consisting of a device that fills with air and retards your fall", "synonyms": ["parachute"], "image_count": 24, "id": 760, "frequency": "c", "synset": "parachute.n.01"}, {"name": "parakeet", "instance_count": 46, "def": "any of numerous small slender long-tailed parrots", "synonyms": ["parakeet", "parrakeet", "parroket", "paraquet", "paroquet", "parroquet"], "image_count": 11, "id": 761, "frequency": "c", "synset": "parakeet.n.01"}, {"name": "parasail_(sports)", "instance_count": 385, "def": "parachute that will lift a person up into the air when it is towed by a motorboat or a car", "synonyms": ["parasail_(sports)"], "image_count": 72, "id": 762, "frequency": "c", "synset": "parasail.n.01"}, {"name": "parasol", "instance_count": 45, "def": "a handheld collapsible source of shade", "synonyms": ["parasol", "sunshade"], "image_count": 17, "id": 763, "frequency": "c", "synset": "parasol.n.01"}, {"name": "parchment", "instance_count": 17, "def": "a superior paper resembling sheepskin", "synonyms": ["parchment"], "image_count": 10, "id": 764, "frequency": "r", "synset": "parchment.n.01"}, {"name": "parka", "instance_count": 89, "def": "a kind of heavy jacket (`windcheater' is a British term)", "synonyms": ["parka", "anorak"], "image_count": 17, "id": 765, "frequency": "c", "synset": "parka.n.01"}, {"name": "parking_meter", "instance_count": 1075, "def": "a coin-operated timer located next to a parking space", "synonyms": ["parking_meter"], "image_count": 489, "id": 766, "frequency": "f", "synset": "parking_meter.n.01"}, {"name": "parrot", "instance_count": 76, "def": "usually brightly colored tropical birds with short hooked beaks and the ability to mimic sounds", "synonyms": ["parrot"], "image_count": 47, "id": 767, "frequency": "c", "synset": "parrot.n.01"}, {"name": "passenger_car_(part_of_a_train)", "instance_count": 465, "def": "a railcar where passengers ride", "synonyms": ["passenger_car_(part_of_a_train)", "coach_(part_of_a_train)"], "image_count": 93, "id": 768, "frequency": "c", "synset": "passenger_car.n.01"}, {"name": "passenger_ship", "instance_count": 1, "def": "a ship built to carry passengers", "synonyms": ["passenger_ship"], "image_count": 1, "id": 769, "frequency": "r", "synset": "passenger_ship.n.01"}, {"name": "passport", "instance_count": 12, "def": "a document issued by a country to a citizen allowing that person to travel abroad and re-enter the home country", "synonyms": ["passport"], "image_count": 12, "id": 770, "frequency": "c", "synset": "passport.n.02"}, {"name": "pastry", "instance_count": 4972, "def": "any of various baked foods made of dough or batter", "synonyms": ["pastry"], "image_count": 228, "id": 771, "frequency": "f", "synset": "pastry.n.02"}, {"name": "patty_(food)", "instance_count": 20, "def": "small flat mass of chopped food", "synonyms": ["patty_(food)"], "image_count": 5, "id": 772, "frequency": "r", "synset": "patty.n.01"}, {"name": "pea_(food)", "instance_count": 1869, "def": "seed of a pea plant used for food", "synonyms": ["pea_(food)"], "image_count": 76, "id": 773, "frequency": "c", "synset": "pea.n.01"}, {"name": "peach", "instance_count": 1041, "def": "downy juicy fruit with sweet yellowish or whitish flesh", "synonyms": ["peach"], "image_count": 71, "id": 774, "frequency": "c", "synset": "peach.n.03"}, {"name": "peanut_butter", "instance_count": 50, "def": "a spread made from ground peanuts", "synonyms": ["peanut_butter"], "image_count": 30, "id": 775, "frequency": "c", "synset": "peanut_butter.n.01"}, {"name": "pear", "instance_count": 1069, "def": "sweet juicy gritty-textured fruit available in many varieties", "synonyms": ["pear"], "image_count": 109, "id": 776, "frequency": "f", "synset": "pear.n.01"}, {"name": "peeler_(tool_for_fruit_and_vegetables)", "instance_count": 18, "def": "a device for peeling vegetables or fruits", "synonyms": ["peeler_(tool_for_fruit_and_vegetables)"], "image_count": 14, "id": 777, "frequency": "c", "synset": "peeler.n.03"}, {"name": "wooden_leg", "instance_count": 1, "def": "a prosthesis that replaces a missing leg", "synonyms": ["wooden_leg", "pegleg"], "image_count": 1, "id": 778, "frequency": "r", "synset": "peg.n.04"}, {"name": "pegboard", "instance_count": 9, "def": "a board perforated with regularly spaced holes into which pegs can be fitted", "synonyms": ["pegboard"], "image_count": 8, "id": 779, "frequency": "r", "synset": "pegboard.n.01"}, {"name": "pelican", "instance_count": 76, "def": "large long-winged warm-water seabird having a large bill with a distensible pouch for fish", "synonyms": ["pelican"], "image_count": 26, "id": 780, "frequency": "c", "synset": "pelican.n.01"}, {"name": "pen", "instance_count": 987, "def": "a writing implement with a point from which ink flows", "synonyms": ["pen"], "image_count": 339, "id": 781, "frequency": "f", "synset": "pen.n.01"}, {"name": "pencil", "instance_count": 543, "def": "a thin cylindrical pointed writing implement made of wood and graphite", "synonyms": ["pencil"], "image_count": 153, "id": 782, "frequency": "f", "synset": "pencil.n.01"}, {"name": "pencil_box", "instance_count": 2, "def": "a box for holding pencils", "synonyms": ["pencil_box", "pencil_case"], "image_count": 2, "id": 783, "frequency": "r", "synset": "pencil_box.n.01"}, {"name": "pencil_sharpener", "instance_count": 4, "def": "a rotary implement for sharpening the point on pencils", "synonyms": ["pencil_sharpener"], "image_count": 3, "id": 784, "frequency": "r", "synset": "pencil_sharpener.n.01"}, {"name": "pendulum", "instance_count": 18, "def": "an apparatus consisting of an object mounted so that it swings freely under the influence of gravity", "synonyms": ["pendulum"], "image_count": 8, "id": 785, "frequency": "r", "synset": "pendulum.n.01"}, {"name": "penguin", "instance_count": 229, "def": "short-legged flightless birds of cold southern regions having webbed feet and wings modified as flippers", "synonyms": ["penguin"], "image_count": 47, "id": 786, "frequency": "c", "synset": "penguin.n.01"}, {"name": "pennant", "instance_count": 235, "def": "a flag longer than it is wide (and often tapering)", "synonyms": ["pennant"], "image_count": 8, "id": 787, "frequency": "r", "synset": "pennant.n.02"}, {"name": "penny_(coin)", "instance_count": 15, "def": "a coin worth one-hundredth of the value of the basic unit", "synonyms": ["penny_(coin)"], "image_count": 6, "id": 788, "frequency": "r", "synset": "penny.n.02"}, {"name": "pepper", "instance_count": 697, "def": "pungent seasoning from the berry of the common pepper plant; whole or ground", "synonyms": ["pepper", "peppercorn"], "image_count": 116, "id": 789, "frequency": "f", "synset": "pepper.n.03"}, {"name": "pepper_mill", "instance_count": 91, "def": "a mill for grinding pepper", "synonyms": ["pepper_mill", "pepper_grinder"], "image_count": 69, "id": 790, "frequency": "c", "synset": "pepper_mill.n.01"}, {"name": "perfume", "instance_count": 28, "def": "a toiletry that emits and diffuses a fragrant odor", "synonyms": ["perfume"], "image_count": 13, "id": 791, "frequency": "c", "synset": "perfume.n.02"}, {"name": "persimmon", "instance_count": 22, "def": "orange fruit resembling a plum; edible when fully ripe", "synonyms": ["persimmon"], "image_count": 6, "id": 792, "frequency": "r", "synset": "persimmon.n.02"}, {"name": "person", "instance_count": 13439, "def": "a human being", "synonyms": ["person", "baby", "child", "boy", "girl", "man", "woman", "human"], "image_count": 1928, "id": 793, "frequency": "f", "synset": "person.n.01"}, {"name": "pet", "instance_count": 103, "def": "a domesticated animal kept for companionship or amusement", "synonyms": ["pet"], "image_count": 79, "id": 794, "frequency": "c", "synset": "pet.n.01"}, {"name": "pew_(church_bench)", "instance_count": 194, "def": "long bench with backs; used in church by the congregation", "synonyms": ["pew_(church_bench)", "church_bench"], "image_count": 14, "id": 795, "frequency": "c", "synset": "pew.n.01"}, {"name": "phonebook", "instance_count": 24, "def": "a directory containing an alphabetical list of telephone subscribers and their telephone numbers", "synonyms": ["phonebook", "telephone_book", "telephone_directory"], "image_count": 7, "id": 796, "frequency": "r", "synset": "phonebook.n.01"}, {"name": "phonograph_record", "instance_count": 138, "def": "sound recording consisting of a typically black disk with a continuous groove", "synonyms": ["phonograph_record", "phonograph_recording", "record_(phonograph_recording)"], "image_count": 20, "id": 797, "frequency": "c", "synset": "phonograph_record.n.01"}, {"name": "piano", "instance_count": 126, "def": "a keyboard instrument that is played by depressing keys that cause hammers to strike tuned strings and produce sounds", "synonyms": ["piano"], "image_count": 114, "id": 798, "frequency": "f", "synset": "piano.n.01"}, {"name": "pickle", "instance_count": 632, "def": "vegetables (especially cucumbers) preserved in brine or vinegar", "synonyms": ["pickle"], "image_count": 221, "id": 799, "frequency": "f", "synset": "pickle.n.01"}, {"name": "pickup_truck", "instance_count": 838, "def": "a light truck with an open body and low sides and a tailboard", "synonyms": ["pickup_truck"], "image_count": 502, "id": 800, "frequency": "f", "synset": "pickup.n.01"}, {"name": "pie", "instance_count": 228, "def": "dish baked in pastry-lined pan often with a pastry top", "synonyms": ["pie"], "image_count": 62, "id": 801, "frequency": "c", "synset": "pie.n.01"}, {"name": "pigeon", "instance_count": 1850, "def": "wild and domesticated birds having a heavy body and short legs", "synonyms": ["pigeon"], "image_count": 87, "id": 802, "frequency": "c", "synset": "pigeon.n.01"}, {"name": "piggy_bank", "instance_count": 5, "def": "a child's coin bank (often shaped like a pig)", "synonyms": ["piggy_bank", "penny_bank"], "image_count": 4, "id": 803, "frequency": "r", "synset": "piggy_bank.n.01"}, {"name": "pillow", "instance_count": 6115, "def": "a cushion to support the head of a sleeping person", "synonyms": ["pillow"], "image_count": 1912, "id": 804, "frequency": "f", "synset": "pillow.n.01"}, {"name": "pin_(non_jewelry)", "instance_count": 112, "def": "a small slender (often pointed) piece of wood or metal used to support or fasten or attach things", "synonyms": ["pin_(non_jewelry)"], "image_count": 7, "id": 805, "frequency": "r", "synset": "pin.n.09"}, {"name": "pineapple", "instance_count": 1636, "def": "large sweet fleshy tropical fruit with a tuft of stiff leaves", "synonyms": ["pineapple"], "image_count": 186, "id": 806, "frequency": "f", "synset": "pineapple.n.02"}, {"name": "pinecone", "instance_count": 141, "def": "the seed-producing cone of a pine tree", "synonyms": ["pinecone"], "image_count": 18, "id": 807, "frequency": "c", "synset": "pinecone.n.01"}, {"name": "ping-pong_ball", "instance_count": 4, "def": "light hollow ball used in playing table tennis", "synonyms": ["ping-pong_ball"], "image_count": 4, "id": 808, "frequency": "r", "synset": "ping-pong_ball.n.01"}, {"name": "pinwheel", "instance_count": 172, "def": "a toy consisting of vanes of colored paper or plastic that is pinned to a stick and spins when it is pointed into the wind", "synonyms": ["pinwheel"], "image_count": 3, "id": 809, "frequency": "r", "synset": "pinwheel.n.03"}, {"name": "tobacco_pipe", "instance_count": 7, "def": "a tube with a small bowl at one end; used for smoking tobacco", "synonyms": ["tobacco_pipe"], "image_count": 7, "id": 810, "frequency": "r", "synset": "pipe.n.01"}, {"name": "pipe", "instance_count": 4762, "def": "a long tube made of metal or plastic that is used to carry water or oil or gas etc.", "synonyms": ["pipe", "piping"], "image_count": 1413, "id": 811, "frequency": "f", "synset": "pipe.n.02"}, {"name": "pistol", "instance_count": 9, "def": "a firearm that is held and fired with one hand", "synonyms": ["pistol", "handgun"], "image_count": 7, "id": 812, "frequency": "r", "synset": "pistol.n.01"}, {"name": "pita_(bread)", "instance_count": 28, "def": "usually small round bread that can open into a pocket for filling", "synonyms": ["pita_(bread)", "pocket_bread"], "image_count": 12, "id": 813, "frequency": "c", "synset": "pita.n.01"}, {"name": "pitcher_(vessel_for_liquid)", "instance_count": 488, "def": "an open vessel with a handle and a spout for pouring", "synonyms": ["pitcher_(vessel_for_liquid)", "ewer"], "image_count": 248, "id": 814, "frequency": "f", "synset": "pitcher.n.02"}, {"name": "pitchfork", "instance_count": 4, "def": "a long-handled hand tool with sharp widely spaced prongs for lifting and pitching hay", "synonyms": ["pitchfork"], "image_count": 4, "id": 815, "frequency": "r", "synset": "pitchfork.n.01"}, {"name": "pizza", "instance_count": 4103, "def": "Italian open pie made of thin bread dough spread with a spiced mixture of e.g. tomato sauce and cheese", "synonyms": ["pizza"], "image_count": 1881, "id": 816, "frequency": "f", "synset": "pizza.n.01"}, {"name": "place_mat", "instance_count": 1123, "def": "a mat placed on a table for an individual place setting", "synonyms": ["place_mat"], "image_count": 529, "id": 817, "frequency": "f", "synset": "place_mat.n.01"}, {"name": "plate", "instance_count": 5214, "def": "dish on which food is served or from which food is eaten", "synonyms": ["plate"], "image_count": 1932, "id": 818, "frequency": "f", "synset": "plate.n.04"}, {"name": "platter", "instance_count": 148, "def": "a large shallow dish used for serving food", "synonyms": ["platter"], "image_count": 50, "id": 819, "frequency": "c", "synset": "platter.n.01"}, {"name": "playpen", "instance_count": 3, "def": "a portable enclosure in which babies may be left to play", "synonyms": ["playpen"], "image_count": 3, "id": 820, "frequency": "r", "synset": "playpen.n.01"}, {"name": "pliers", "instance_count": 49, "def": "a gripping hand tool with two hinged arms and (usually) serrated jaws", "synonyms": ["pliers", "plyers"], "image_count": 28, "id": 821, "frequency": "c", "synset": "pliers.n.01"}, {"name": "plow_(farm_equipment)", "instance_count": 12, "def": "a farm tool having one or more heavy blades to break the soil and cut a furrow prior to sowing", "synonyms": ["plow_(farm_equipment)", "plough_(farm_equipment)"], "image_count": 10, "id": 822, "frequency": "r", "synset": "plow.n.01"}, {"name": "plume", "instance_count": 11, "def": "a feather or cluster of feathers worn as an ornament", "synonyms": ["plume"], "image_count": 5, "id": 823, "frequency": "r", "synset": "plume.n.02"}, {"name": "pocket_watch", "instance_count": 20, "def": "a watch that is carried in a small watch pocket", "synonyms": ["pocket_watch"], "image_count": 5, "id": 824, "frequency": "r", "synset": "pocket_watch.n.01"}, {"name": "pocketknife", "instance_count": 21, "def": "a knife with a blade that folds into the handle; suitable for carrying in the pocket", "synonyms": ["pocketknife"], "image_count": 18, "id": 825, "frequency": "c", "synset": "pocketknife.n.01"}, {"name": "poker_(fire_stirring_tool)", "instance_count": 34, "def": "fire iron consisting of a metal rod with a handle; used to stir a fire", "synonyms": ["poker_(fire_stirring_tool)", "stove_poker", "fire_hook"], "image_count": 14, "id": 826, "frequency": "c", "synset": "poker.n.01"}, {"name": "pole", "instance_count": 14276, "def": "a long (usually round) rod of wood or metal or plastic", "synonyms": ["pole", "post"], "image_count": 1890, "id": 827, "frequency": "f", "synset": "pole.n.01"}, {"name": "polo_shirt", "instance_count": 1695, "def": "a shirt with short sleeves designed for comfort and casual wear", "synonyms": ["polo_shirt", "sport_shirt"], "image_count": 660, "id": 828, "frequency": "f", "synset": "polo_shirt.n.01"}, {"name": "poncho", "instance_count": 14, "def": "a blanket-like cloak with a hole in the center for the head", "synonyms": ["poncho"], "image_count": 8, "id": 829, "frequency": "r", "synset": "poncho.n.01"}, {"name": "pony", "instance_count": 57, "def": "any of various breeds of small gentle horses usually less than five feet high at the shoulder", "synonyms": ["pony"], "image_count": 25, "id": 830, "frequency": "c", "synset": "pony.n.05"}, {"name": "pool_table", "instance_count": 10, "def": "game equipment consisting of a heavy table on which pool is played", "synonyms": ["pool_table", "billiard_table", "snooker_table"], "image_count": 10, "id": 831, "frequency": "r", "synset": "pool_table.n.01"}, {"name": "pop_(soda)", "instance_count": 951, "def": "a sweet drink containing carbonated water and flavoring", "synonyms": ["pop_(soda)", "soda_(pop)", "tonic", "soft_drink"], "image_count": 218, "id": 832, "frequency": "f", "synset": "pop.n.02"}, {"name": "postbox_(public)", "instance_count": 57, "def": "public box for deposit of mail", "synonyms": ["postbox_(public)", "mailbox_(public)"], "image_count": 36, "id": 833, "frequency": "c", "synset": "postbox.n.01"}, {"name": "postcard", "instance_count": 276, "def": "a card for sending messages by post without an envelope", "synonyms": ["postcard", "postal_card", "mailing-card"], "image_count": 16, "id": 834, "frequency": "c", "synset": "postcard.n.01"}, {"name": "poster", "instance_count": 3378, "def": "a sign posted in a public place as an advertisement", "synonyms": ["poster", "placard"], "image_count": 808, "id": 835, "frequency": "f", "synset": "poster.n.01"}, {"name": "pot", "instance_count": 1719, "def": "metal or earthenware cooking vessel that is usually round and deep; often has a handle and lid", "synonyms": ["pot"], "image_count": 479, "id": 836, "frequency": "f", "synset": "pot.n.01"}, {"name": "flowerpot", "instance_count": 3902, "def": "a container in which plants are cultivated", "synonyms": ["flowerpot"], "image_count": 1404, "id": 837, "frequency": "f", "synset": "pot.n.04"}, {"name": "potato", "instance_count": 4393, "def": "an edible tuber native to South America", "synonyms": ["potato"], "image_count": 307, "id": 838, "frequency": "f", "synset": "potato.n.01"}, {"name": "potholder", "instance_count": 112, "def": "an insulated pad for holding hot pots", "synonyms": ["potholder"], "image_count": 57, "id": 839, "frequency": "c", "synset": "potholder.n.01"}, {"name": "pottery", "instance_count": 272, "def": "ceramic ware made from clay and baked in a kiln", "synonyms": ["pottery", "clayware"], "image_count": 28, "id": 840, "frequency": "c", "synset": "pottery.n.01"}, {"name": "pouch", "instance_count": 131, "def": "a small or medium size container for holding or carrying things", "synonyms": ["pouch"], "image_count": 80, "id": 841, "frequency": "c", "synset": "pouch.n.01"}, {"name": "power_shovel", "instance_count": 16, "def": "a machine for excavating", "synonyms": ["power_shovel", "excavator", "digger"], "image_count": 11, "id": 842, "frequency": "c", "synset": "power_shovel.n.01"}, {"name": "prawn", "instance_count": 779, "def": "any of various edible decapod crustaceans", "synonyms": ["prawn", "shrimp"], "image_count": 92, "id": 843, "frequency": "c", "synset": "prawn.n.01"}, {"name": "pretzel", "instance_count": 179, "def": "glazed and salted cracker typically in the shape of a loose knot", "synonyms": ["pretzel"], "image_count": 20, "id": 844, "frequency": "c", "synset": "pretzel.n.01"}, {"name": "printer", "instance_count": 217, "def": "a machine that prints", "synonyms": ["printer", "printing_machine"], "image_count": 194, "id": 845, "frequency": "f", "synset": "printer.n.03"}, {"name": "projectile_(weapon)", "instance_count": 64, "def": "a weapon that is forcibly thrown or projected at a targets", "synonyms": ["projectile_(weapon)", "missile"], "image_count": 23, "id": 846, "frequency": "c", "synset": "projectile.n.01"}, {"name": "projector", "instance_count": 54, "def": "an optical instrument that projects an enlarged image onto a screen", "synonyms": ["projector"], "image_count": 52, "id": 847, "frequency": "c", "synset": "projector.n.02"}, {"name": "propeller", "instance_count": 1458, "def": "a mechanical device that rotates to push against air or water", "synonyms": ["propeller", "propellor"], "image_count": 673, "id": 848, "frequency": "f", "synset": "propeller.n.01"}, {"name": "prune", "instance_count": 8, "def": "dried plum", "synonyms": ["prune"], "image_count": 2, "id": 849, "frequency": "r", "synset": "prune.n.01"}, {"name": "pudding", "instance_count": 2, "def": "any of various soft thick unsweetened baked dishes", "synonyms": ["pudding"], "image_count": 2, "id": 850, "frequency": "r", "synset": "pudding.n.01"}, {"name": "puffer_(fish)", "instance_count": 2, "def": "fishes whose elongated spiny body can inflate itself with water or air to form a globe", "synonyms": ["puffer_(fish)", "pufferfish", "blowfish", "globefish"], "image_count": 1, "id": 851, "frequency": "r", "synset": "puffer.n.02"}, {"name": "puffin", "instance_count": 4, "def": "seabirds having short necks and brightly colored compressed bills", "synonyms": ["puffin"], "image_count": 2, "id": 852, "frequency": "r", "synset": "puffin.n.01"}, {"name": "pug-dog", "instance_count": 13, "def": "small compact smooth-coated breed of Asiatic origin having a tightly curled tail and broad flat wrinkled muzzle", "synonyms": ["pug-dog"], "image_count": 8, "id": 853, "frequency": "r", "synset": "pug.n.01"}, {"name": "pumpkin", "instance_count": 1192, "def": "usually large pulpy deep-yellow round fruit of the squash family maturing in late summer or early autumn", "synonyms": ["pumpkin"], "image_count": 80, "id": 854, "frequency": "c", "synset": "pumpkin.n.02"}, {"name": "puncher", "instance_count": 6, "def": "a tool for making holes or indentations", "synonyms": ["puncher"], "image_count": 3, "id": 855, "frequency": "r", "synset": "punch.n.03"}, {"name": "puppet", "instance_count": 18, "def": "a small figure of a person operated from above with strings by a puppeteer", "synonyms": ["puppet", "marionette"], "image_count": 3, "id": 856, "frequency": "r", "synset": "puppet.n.01"}, {"name": "puppy", "instance_count": 57, "def": "a young dog", "synonyms": ["puppy"], "image_count": 15, "id": 857, "frequency": "c", "synset": "puppy.n.01"}, {"name": "quesadilla", "instance_count": 6, "def": "a tortilla that is filled with cheese and heated", "synonyms": ["quesadilla"], "image_count": 2, "id": 858, "frequency": "r", "synset": "quesadilla.n.01"}, {"name": "quiche", "instance_count": 33, "def": "a tart filled with rich unsweetened custard; often contains other ingredients (as cheese or ham or seafood or vegetables)", "synonyms": ["quiche"], "image_count": 10, "id": 859, "frequency": "r", "synset": "quiche.n.02"}, {"name": "quilt", "instance_count": 513, "def": "bedding made of two layers of cloth filled with stuffing and stitched together", "synonyms": ["quilt", "comforter"], "image_count": 386, "id": 860, "frequency": "f", "synset": "quilt.n.01"}, {"name": "rabbit", "instance_count": 139, "def": "any of various burrowing animals of the family Leporidae having long ears and short tails", "synonyms": ["rabbit"], "image_count": 65, "id": 861, "frequency": "c", "synset": "rabbit.n.01"}, {"name": "race_car", "instance_count": 6, "def": "a fast car that competes in races", "synonyms": ["race_car", "racing_car"], "image_count": 3, "id": 862, "frequency": "r", "synset": "racer.n.02"}, {"name": "racket", "instance_count": 64, "def": "a sports implement used to strike a ball in various games", "synonyms": ["racket", "racquet"], "image_count": 35, "id": 863, "frequency": "c", "synset": "racket.n.04"}, {"name": "radar", "instance_count": 13, "def": "measuring instrument in which the echo of a pulse of microwave radiation is used to detect and locate distant objects", "synonyms": ["radar"], "image_count": 5, "id": 864, "frequency": "r", "synset": "radar.n.01"}, {"name": "radiator", "instance_count": 195, "def": "a mechanism consisting of a metal honeycomb through which hot fluids circulate", "synonyms": ["radiator"], "image_count": 180, "id": 865, "frequency": "f", "synset": "radiator.n.03"}, {"name": "radio_receiver", "instance_count": 123, "def": "an electronic receiver that detects and demodulates and amplifies transmitted radio signals", "synonyms": ["radio_receiver", "radio_set", "radio", "tuner_(radio)"], "image_count": 99, "id": 866, "frequency": "c", "synset": "radio_receiver.n.01"}, {"name": "radish", "instance_count": 519, "def": "pungent edible root of any of various cultivated radish plants", "synonyms": ["radish", "daikon"], "image_count": 49, "id": 867, "frequency": "c", "synset": "radish.n.03"}, {"name": "raft", "instance_count": 66, "def": "a flat float (usually made of logs or planks) that can be used for transport or as a platform for swimmers", "synonyms": ["raft"], "image_count": 28, "id": 868, "frequency": "c", "synset": "raft.n.01"}, {"name": "rag_doll", "instance_count": 3, "def": "a cloth doll that is stuffed and (usually) painted", "synonyms": ["rag_doll"], "image_count": 1, "id": 869, "frequency": "r", "synset": "rag_doll.n.01"}, {"name": "raincoat", "instance_count": 303, "def": "a water-resistant coat", "synonyms": ["raincoat", "waterproof_jacket"], "image_count": 52, "id": 870, "frequency": "c", "synset": "raincoat.n.01"}, {"name": "ram_(animal)", "instance_count": 132, "def": "uncastrated adult male sheep", "synonyms": ["ram_(animal)"], "image_count": 36, "id": 871, "frequency": "c", "synset": "ram.n.05"}, {"name": "raspberry", "instance_count": 778, "def": "red or black edible aggregate berries usually smaller than the related blackberries", "synonyms": ["raspberry"], "image_count": 70, "id": 872, "frequency": "c", "synset": "raspberry.n.02"}, {"name": "rat", "instance_count": 6, "def": "any of various long-tailed rodents similar to but larger than a mouse", "synonyms": ["rat"], "image_count": 6, "id": 873, "frequency": "r", "synset": "rat.n.01"}, {"name": "razorblade", "instance_count": 35, "def": "a blade that has very sharp edge", "synonyms": ["razorblade"], "image_count": 29, "id": 874, "frequency": "c", "synset": "razorblade.n.01"}, {"name": "reamer_(juicer)", "instance_count": 26, "def": "a squeezer with a conical ridged center that is used for squeezing juice from citrus fruit", "synonyms": ["reamer_(juicer)", "juicer", "juice_reamer"], "image_count": 24, "id": 875, "frequency": "c", "synset": "reamer.n.01"}, {"name": "rearview_mirror", "instance_count": 3650, "def": "vehicle mirror (side or rearview)", "synonyms": ["rearview_mirror"], "image_count": 1115, "id": 876, "frequency": "f", "synset": "rearview_mirror.n.01"}, {"name": "receipt", "instance_count": 89, "def": "an acknowledgment (usually tangible) that payment has been made", "synonyms": ["receipt"], "image_count": 61, "id": 877, "frequency": "c", "synset": "receipt.n.02"}, {"name": "recliner", "instance_count": 28, "def": "an armchair whose back can be lowered and foot can be raised to allow the sitter to recline in it", "synonyms": ["recliner", "reclining_chair", "lounger_(chair)"], "image_count": 18, "id": 878, "frequency": "c", "synset": "recliner.n.01"}, {"name": "record_player", "instance_count": 22, "def": "machine in which rotating records cause a stylus to vibrate and the vibrations are amplified acoustically or electronically", "synonyms": ["record_player", "phonograph_(record_player)", "turntable"], "image_count": 18, "id": 879, "frequency": "c", "synset": "record_player.n.01"}, {"name": "reflector", "instance_count": 3426, "def": "device that reflects light, radiation, etc.", "synonyms": ["reflector"], "image_count": 665, "id": 880, "frequency": "f", "synset": "reflector.n.01"}, {"name": "remote_control", "instance_count": 2467, "def": "a device that can be used to control a machine or apparatus from a distance", "synonyms": ["remote_control"], "image_count": 1096, "id": 881, "frequency": "f", "synset": "remote_control.n.01"}, {"name": "rhinoceros", "instance_count": 50, "def": "massive powerful herbivorous odd-toed ungulate of southeast Asia and Africa having very thick skin and one or two horns on the snout", "synonyms": ["rhinoceros"], "image_count": 29, "id": 882, "frequency": "c", "synset": "rhinoceros.n.01"}, {"name": "rib_(food)", "instance_count": 32, "def": "cut of meat including one or more ribs", "synonyms": ["rib_(food)"], "image_count": 8, "id": 883, "frequency": "r", "synset": "rib.n.03"}, {"name": "rifle", "instance_count": 37, "def": "a shoulder firearm with a long barrel", "synonyms": ["rifle"], "image_count": 14, "id": 884, "frequency": "c", "synset": "rifle.n.01"}, {"name": "ring", "instance_count": 2314, "def": "jewelry consisting of a circlet of precious metal (often set with jewels) worn on the finger", "synonyms": ["ring"], "image_count": 1622, "id": 885, "frequency": "f", "synset": "ring.n.08"}, {"name": "river_boat", "instance_count": 3, "def": "a boat used on rivers or to ply a river", "synonyms": ["river_boat"], "image_count": 2, "id": 886, "frequency": "r", "synset": "river_boat.n.01"}, {"name": "road_map", "instance_count": 3, "def": "(NOT A ROAD) a MAP showing roads (for automobile travel)", "synonyms": ["road_map"], "image_count": 3, "id": 887, "frequency": "r", "synset": "road_map.n.02"}, {"name": "robe", "instance_count": 77, "def": "any loose flowing garment", "synonyms": ["robe"], "image_count": 32, "id": 888, "frequency": "c", "synset": "robe.n.01"}, {"name": "rocking_chair", "instance_count": 70, "def": "a chair mounted on rockers", "synonyms": ["rocking_chair"], "image_count": 55, "id": 889, "frequency": "c", "synset": "rocking_chair.n.01"}, {"name": "rodent", "instance_count": 2, "def": "relatively small placental mammals having a single pair of constantly growing incisor teeth specialized for gnawing", "synonyms": ["rodent"], "image_count": 1, "id": 890, "frequency": "r", "synset": "rodent.n.01"}, {"name": "roller_skate", "instance_count": 35, "def": "a shoe with pairs of rollers (small hard wheels) fixed to the sole", "synonyms": ["roller_skate"], "image_count": 10, "id": 891, "frequency": "r", "synset": "roller_skate.n.01"}, {"name": "Rollerblade", "instance_count": 31, "def": "an in-line variant of a roller skate", "synonyms": ["Rollerblade"], "image_count": 10, "id": 892, "frequency": "r", "synset": "rollerblade.n.01"}, {"name": "rolling_pin", "instance_count": 52, "def": "utensil consisting of a cylinder (usually of wood) with a handle at each end; used to roll out dough", "synonyms": ["rolling_pin"], "image_count": 47, "id": 893, "frequency": "c", "synset": "rolling_pin.n.01"}, {"name": "root_beer", "instance_count": 3, "def": "carbonated drink containing extracts of roots and herbs", "synonyms": ["root_beer"], "image_count": 3, "id": 894, "frequency": "r", "synset": "root_beer.n.01"}, {"name": "router_(computer_equipment)", "instance_count": 41, "def": "a device that forwards data packets between computer networks", "synonyms": ["router_(computer_equipment)"], "image_count": 29, "id": 895, "frequency": "c", "synset": "router.n.02"}, {"name": "rubber_band", "instance_count": 574, "def": "a narrow band of elastic rubber used to hold things (such as papers) together", "synonyms": ["rubber_band", "elastic_band"], "image_count": 342, "id": 896, "frequency": "f", "synset": "rubber_band.n.01"}, {"name": "runner_(carpet)", "instance_count": 32, "def": "a long narrow carpet", "synonyms": ["runner_(carpet)"], "image_count": 25, "id": 897, "frequency": "c", "synset": "runner.n.08"}, {"name": "plastic_bag", "instance_count": 3631, "def": "a bag made of paper or plastic for holding customer's purchases", "synonyms": ["plastic_bag", "paper_bag"], "image_count": 1469, "id": 898, "frequency": "f", "synset": "sack.n.01"}, {"name": "saddle_(on_an_animal)", "instance_count": 955, "def": "a seat for the rider of a horse or camel", "synonyms": ["saddle_(on_an_animal)"], "image_count": 521, "id": 899, "frequency": "f", "synset": "saddle.n.01"}, {"name": "saddle_blanket", "instance_count": 648, "def": "stable gear consisting of a blanket placed under the saddle", "synonyms": ["saddle_blanket", "saddlecloth", "horse_blanket"], "image_count": 347, "id": 900, "frequency": "f", "synset": "saddle_blanket.n.01"}, {"name": "saddlebag", "instance_count": 56, "def": "a large bag (or pair of bags) hung over a saddle", "synonyms": ["saddlebag"], "image_count": 35, "id": 901, "frequency": "c", "synset": "saddlebag.n.01"}, {"name": "safety_pin", "instance_count": 15, "def": "a pin in the form of a clasp; has a guard so the point of the pin will not stick the user", "synonyms": ["safety_pin"], "image_count": 7, "id": 902, "frequency": "r", "synset": "safety_pin.n.01"}, {"name": "sail", "instance_count": 863, "def": "a large piece of fabric by means of which wind is used to propel a sailing vessel", "synonyms": ["sail"], "image_count": 207, "id": 903, "frequency": "f", "synset": "sail.n.01"}, {"name": "salad", "instance_count": 171, "def": "food mixtures either arranged on a plate or tossed and served with a moist dressing; usually consisting of or including greens", "synonyms": ["salad"], "image_count": 108, "id": 904, "frequency": "f", "synset": "salad.n.01"}, {"name": "salad_plate", "instance_count": 6, "def": "a plate or bowl for individual servings of salad", "synonyms": ["salad_plate", "salad_bowl"], "image_count": 2, "id": 905, "frequency": "r", "synset": "salad_plate.n.01"}, {"name": "salami", "instance_count": 290, "def": "highly seasoned fatty sausage of pork and beef usually dried", "synonyms": ["salami"], "image_count": 34, "id": 906, "frequency": "c", "synset": "salami.n.01"}, {"name": "salmon_(fish)", "instance_count": 27, "def": "any of various large food and game fishes of northern waters", "synonyms": ["salmon_(fish)"], "image_count": 12, "id": 907, "frequency": "c", "synset": "salmon.n.01"}, {"name": "salmon_(food)", "instance_count": 14, "def": "flesh of any of various marine or freshwater fish of the family Salmonidae", "synonyms": ["salmon_(food)"], "image_count": 10, "id": 908, "frequency": "r", "synset": "salmon.n.03"}, {"name": "salsa", "instance_count": 22, "def": "spicy sauce of tomatoes and onions and chili peppers to accompany Mexican foods", "synonyms": ["salsa"], "image_count": 13, "id": 909, "frequency": "c", "synset": "salsa.n.01"}, {"name": "saltshaker", "instance_count": 543, "def": "a shaker with a perforated top for sprinkling salt", "synonyms": ["saltshaker"], "image_count": 361, "id": 910, "frequency": "f", "synset": "saltshaker.n.01"}, {"name": "sandal_(type_of_shoe)", "instance_count": 3145, "def": "a shoe consisting of a sole fastened by straps to the foot", "synonyms": ["sandal_(type_of_shoe)"], "image_count": 1023, "id": 911, "frequency": "f", "synset": "sandal.n.01"}, {"name": "sandwich", "instance_count": 2315, "def": "two (or more) slices of bread with a filling between them", "synonyms": ["sandwich"], "image_count": 782, "id": 912, "frequency": "f", "synset": "sandwich.n.01"}, {"name": "satchel", "instance_count": 3, "def": "luggage consisting of a small case with a flat bottom and (usually) a shoulder strap", "synonyms": ["satchel"], "image_count": 2, "id": 913, "frequency": "r", "synset": "satchel.n.01"}, {"name": "saucepan", "instance_count": 26, "def": "a deep pan with a handle; used for stewing or boiling", "synonyms": ["saucepan"], "image_count": 5, "id": 914, "frequency": "r", "synset": "saucepan.n.01"}, {"name": "saucer", "instance_count": 555, "def": "a small shallow dish for holding a cup at the table", "synonyms": ["saucer"], "image_count": 247, "id": 915, "frequency": "f", "synset": "saucer.n.02"}, {"name": "sausage", "instance_count": 2704, "def": "highly seasoned minced meat stuffed in casings", "synonyms": ["sausage"], "image_count": 221, "id": 916, "frequency": "f", "synset": "sausage.n.01"}, {"name": "sawhorse", "instance_count": 5, "def": "a framework for holding wood that is being sawed", "synonyms": ["sawhorse", "sawbuck"], "image_count": 4, "id": 917, "frequency": "r", "synset": "sawhorse.n.01"}, {"name": "saxophone", "instance_count": 13, "def": "a wind instrument with a `J'-shaped form typically made of brass", "synonyms": ["saxophone"], "image_count": 8, "id": 918, "frequency": "r", "synset": "sax.n.02"}, {"name": "scale_(measuring_instrument)", "instance_count": 178, "def": "a measuring instrument for weighing; shows amount of mass", "synonyms": ["scale_(measuring_instrument)"], "image_count": 158, "id": 919, "frequency": "f", "synset": "scale.n.07"}, {"name": "scarecrow", "instance_count": 4, "def": "an effigy in the shape of a man to frighten birds away from seeds", "synonyms": ["scarecrow", "strawman"], "image_count": 3, "id": 920, "frequency": "r", "synset": "scarecrow.n.01"}, {"name": "scarf", "instance_count": 1310, "def": "a garment worn around the head or neck or shoulders for warmth or decoration", "synonyms": ["scarf"], "image_count": 752, "id": 921, "frequency": "f", "synset": "scarf.n.01"}, {"name": "school_bus", "instance_count": 142, "def": "a bus used to transport children to or from school", "synonyms": ["school_bus"], "image_count": 64, "id": 922, "frequency": "c", "synset": "school_bus.n.01"}, {"name": "scissors", "instance_count": 1376, "def": "a tool having two crossed pivoting blades with looped handles", "synonyms": ["scissors"], "image_count": 707, "id": 923, "frequency": "f", "synset": "scissors.n.01"}, {"name": "scoreboard", "instance_count": 161, "def": "a large board for displaying the score of a contest (and some other information)", "synonyms": ["scoreboard"], "image_count": 143, "id": 924, "frequency": "f", "synset": "scoreboard.n.01"}, {"name": "scraper", "instance_count": 1, "def": "any of various hand tools for scraping", "synonyms": ["scraper"], "image_count": 1, "id": 925, "frequency": "r", "synset": "scraper.n.01"}, {"name": "screwdriver", "instance_count": 88, "def": "a hand tool for driving screws; has a tip that fits into the head of a screw", "synonyms": ["screwdriver"], "image_count": 49, "id": 926, "frequency": "c", "synset": "screwdriver.n.01"}, {"name": "scrubbing_brush", "instance_count": 141, "def": "a brush with short stiff bristles for heavy cleaning", "synonyms": ["scrubbing_brush"], "image_count": 126, "id": 927, "frequency": "f", "synset": "scrub_brush.n.01"}, {"name": "sculpture", "instance_count": 202, "def": "a three-dimensional work of art", "synonyms": ["sculpture"], "image_count": 76, "id": 928, "frequency": "c", "synset": "sculpture.n.01"}, {"name": "seabird", "instance_count": 126, "def": "a bird that frequents coastal waters and the open ocean: gulls; pelicans; gannets; cormorants; albatrosses; petrels; etc.", "synonyms": ["seabird", "seafowl"], "image_count": 11, "id": 929, "frequency": "c", "synset": "seabird.n.01"}, {"name": "seahorse", "instance_count": 23, "def": "small fish with horse-like heads bent sharply downward and curled tails", "synonyms": ["seahorse"], "image_count": 11, "id": 930, "frequency": "c", "synset": "seahorse.n.02"}, {"name": "seaplane", "instance_count": 4, "def": "an airplane that can land on or take off from water", "synonyms": ["seaplane", "hydroplane"], "image_count": 4, "id": 931, "frequency": "r", "synset": "seaplane.n.01"}, {"name": "seashell", "instance_count": 451, "def": "the shell of a marine organism", "synonyms": ["seashell"], "image_count": 39, "id": 932, "frequency": "c", "synset": "seashell.n.01"}, {"name": "sewing_machine", "instance_count": 11, "def": "a textile machine used as a home appliance for sewing", "synonyms": ["sewing_machine"], "image_count": 11, "id": 933, "frequency": "c", "synset": "sewing_machine.n.01"}, {"name": "shaker", "instance_count": 24, "def": "a container in which something can be shaken", "synonyms": ["shaker"], "image_count": 13, "id": 934, "frequency": "c", "synset": "shaker.n.03"}, {"name": "shampoo", "instance_count": 254, "def": "cleansing agent consisting of soaps or detergents used for washing the hair", "synonyms": ["shampoo"], "image_count": 91, "id": 935, "frequency": "c", "synset": "shampoo.n.01"}, {"name": "shark", "instance_count": 20, "def": "typically large carnivorous fishes with sharpe teeth", "synonyms": ["shark"], "image_count": 14, "id": 936, "frequency": "c", "synset": "shark.n.01"}, {"name": "sharpener", "instance_count": 7, "def": "any implement that is used to make something (an edge or a point) sharper", "synonyms": ["sharpener"], "image_count": 5, "id": 937, "frequency": "r", "synset": "sharpener.n.01"}, {"name": "Sharpie", "instance_count": 5, "def": "a pen with indelible ink that will write on any surface", "synonyms": ["Sharpie"], "image_count": 3, "id": 938, "frequency": "r", "synset": "sharpie.n.03"}, {"name": "shaver_(electric)", "instance_count": 12, "def": "a razor powered by an electric motor", "synonyms": ["shaver_(electric)", "electric_shaver", "electric_razor"], "image_count": 10, "id": 939, "frequency": "r", "synset": "shaver.n.03"}, {"name": "shaving_cream", "instance_count": 33, "def": "toiletry consisting that forms a rich lather for softening the beard before shaving", "synonyms": ["shaving_cream", "shaving_soap"], "image_count": 18, "id": 940, "frequency": "c", "synset": "shaving_cream.n.01"}, {"name": "shawl", "instance_count": 9, "def": "cloak consisting of an oblong piece of cloth used to cover the head and shoulders", "synonyms": ["shawl"], "image_count": 9, "id": 941, "frequency": "r", "synset": "shawl.n.01"}, {"name": "shears", "instance_count": 38, "def": "large scissors with strong blades", "synonyms": ["shears"], "image_count": 6, "id": 942, "frequency": "r", "synset": "shears.n.01"}, {"name": "sheep", "instance_count": 13304, "def": "woolly usually horned ruminant mammal related to the goat", "synonyms": ["sheep"], "image_count": 951, "id": 943, "frequency": "f", "synset": "sheep.n.01"}, {"name": "shepherd_dog", "instance_count": 2, "def": "any of various usually long-haired breeds of dog reared to herd and guard sheep", "synonyms": ["shepherd_dog", "sheepdog"], "image_count": 2, "id": 944, "frequency": "r", "synset": "shepherd_dog.n.01"}, {"name": "sherbert", "instance_count": 2, "def": "a frozen dessert made primarily of fruit juice and sugar", "synonyms": ["sherbert", "sherbet"], "image_count": 1, "id": 945, "frequency": "r", "synset": "sherbert.n.01"}, {"name": "shield", "instance_count": 41, "def": "armor carried on the arm to intercept blows", "synonyms": ["shield"], "image_count": 19, "id": 946, "frequency": "c", "synset": "shield.n.02"}, {"name": "shirt", "instance_count": 10177, "def": "a garment worn on the upper half of the body", "synonyms": ["shirt"], "image_count": 1942, "id": 947, "frequency": "f", "synset": "shirt.n.01"}, {"name": "shoe", "instance_count": 9374, "def": "common footwear covering the foot", "synonyms": ["shoe", "sneaker_(type_of_shoe)", "tennis_shoe"], "image_count": 1916, "id": 948, "frequency": "f", "synset": "shoe.n.01"}, {"name": "shopping_bag", "instance_count": 377, "def": "a bag made of plastic or strong paper (often with handles); used to transport goods after shopping", "synonyms": ["shopping_bag"], "image_count": 139, "id": 949, "frequency": "f", "synset": "shopping_bag.n.01"}, {"name": "shopping_cart", "instance_count": 90, "def": "a handcart that holds groceries or other goods while shopping", "synonyms": ["shopping_cart"], "image_count": 43, "id": 950, "frequency": "c", "synset": "shopping_cart.n.01"}, {"name": "short_pants", "instance_count": 5305, "def": "trousers that end at or above the knee", "synonyms": ["short_pants", "shorts_(clothing)", "trunks_(clothing)"], "image_count": 1969, "id": 951, "frequency": "f", "synset": "short_pants.n.01"}, {"name": "shot_glass", "instance_count": 24, "def": "a small glass adequate to hold a single swallow of whiskey", "synonyms": ["shot_glass"], "image_count": 5, "id": 952, "frequency": "r", "synset": "shot_glass.n.01"}, {"name": "shoulder_bag", "instance_count": 331, "def": "a large handbag that can be carried by a strap looped over the shoulder", "synonyms": ["shoulder_bag"], "image_count": 134, "id": 953, "frequency": "f", "synset": "shoulder_bag.n.01"}, {"name": "shovel", "instance_count": 110, "def": "a hand tool for lifting loose material such as snow, dirt, etc.", "synonyms": ["shovel"], "image_count": 74, "id": 954, "frequency": "c", "synset": "shovel.n.01"}, {"name": "shower_head", "instance_count": 450, "def": "a plumbing fixture that sprays water over you", "synonyms": ["shower_head"], "image_count": 381, "id": 955, "frequency": "f", "synset": "shower.n.01"}, {"name": "shower_cap", "instance_count": 1, "def": "a tight cap worn to keep hair dry while showering", "synonyms": ["shower_cap"], "image_count": 1, "id": 956, "frequency": "r", "synset": "shower_cap.n.01"}, {"name": "shower_curtain", "instance_count": 479, "def": "a curtain that keeps water from splashing out of the shower area", "synonyms": ["shower_curtain"], "image_count": 381, "id": 957, "frequency": "f", "synset": "shower_curtain.n.01"}, {"name": "shredder_(for_paper)", "instance_count": 6, "def": "a device that shreds documents", "synonyms": ["shredder_(for_paper)"], "image_count": 6, "id": 958, "frequency": "r", "synset": "shredder.n.01"}, {"name": "signboard", "instance_count": 8091, "def": "structure displaying a board on which advertisements can be posted", "synonyms": ["signboard"], "image_count": 1826, "id": 959, "frequency": "f", "synset": "signboard.n.01"}, {"name": "silo", "instance_count": 95, "def": "a cylindrical tower used for storing goods", "synonyms": ["silo"], "image_count": 28, "id": 960, "frequency": "c", "synset": "silo.n.01"}, {"name": "sink", "instance_count": 2182, "def": "plumbing fixture consisting of a water basin fixed to a wall or floor and having a drainpipe", "synonyms": ["sink"], "image_count": 1635, "id": 961, "frequency": "f", "synset": "sink.n.01"}, {"name": "skateboard", "instance_count": 3597, "def": "a board with wheels that is ridden in a standing or crouching position and propelled by foot", "synonyms": ["skateboard"], "image_count": 1967, "id": 962, "frequency": "f", "synset": "skateboard.n.01"}, {"name": "skewer", "instance_count": 81, "def": "a long pin for holding meat in position while it is being roasted", "synonyms": ["skewer"], "image_count": 16, "id": 963, "frequency": "c", "synset": "skewer.n.01"}, {"name": "ski", "instance_count": 8496, "def": "sports equipment for skiing on snow", "synonyms": ["ski"], "image_count": 1926, "id": 964, "frequency": "f", "synset": "ski.n.01"}, {"name": "ski_boot", "instance_count": 8124, "def": "a stiff boot that is fastened to a ski with a ski binding", "synonyms": ["ski_boot"], "image_count": 1789, "id": 965, "frequency": "f", "synset": "ski_boot.n.01"}, {"name": "ski_parka", "instance_count": 1727, "def": "a parka to be worn while skiing", "synonyms": ["ski_parka", "ski_jacket"], "image_count": 401, "id": 966, "frequency": "f", "synset": "ski_parka.n.01"}, {"name": "ski_pole", "instance_count": 8263, "def": "a pole with metal points used as an aid in skiing", "synonyms": ["ski_pole"], "image_count": 1968, "id": 967, "frequency": "f", "synset": "ski_pole.n.01"}, {"name": "skirt", "instance_count": 1784, "def": "a garment hanging from the waist; worn mainly by girls and women", "synonyms": ["skirt"], "image_count": 1167, "id": 968, "frequency": "f", "synset": "skirt.n.02"}, {"name": "skullcap", "instance_count": 1, "def": "rounded brimless cap fitting the crown of the head", "synonyms": ["skullcap"], "image_count": 1, "id": 969, "frequency": "r", "synset": "skullcap.n.01"}, {"name": "sled", "instance_count": 102, "def": "a vehicle or flat object for transportation over snow by sliding or pulled by dogs, etc.", "synonyms": ["sled", "sledge", "sleigh"], "image_count": 56, "id": 970, "frequency": "c", "synset": "sled.n.01"}, {"name": "sleeping_bag", "instance_count": 33, "def": "large padded bag designed to be slept in outdoors", "synonyms": ["sleeping_bag"], "image_count": 17, "id": 971, "frequency": "c", "synset": "sleeping_bag.n.01"}, {"name": "sling_(bandage)", "instance_count": 1, "def": "bandage to support an injured forearm; slung over the shoulder or neck", "synonyms": ["sling_(bandage)", "triangular_bandage"], "image_count": 1, "id": 972, "frequency": "r", "synset": "sling.n.05"}, {"name": "slipper_(footwear)", "instance_count": 121, "def": "low footwear that can be slipped on and off easily; usually worn indoors", "synonyms": ["slipper_(footwear)", "carpet_slipper_(footwear)"], "image_count": 58, "id": 973, "frequency": "c", "synset": "slipper.n.01"}, {"name": "smoothie", "instance_count": 53, "def": "a thick smooth drink consisting of fresh fruit pureed with ice cream or yoghurt or milk", "synonyms": ["smoothie"], "image_count": 9, "id": 974, "frequency": "r", "synset": "smoothie.n.02"}, {"name": "snake", "instance_count": 16, "def": "limbless scaly elongate reptile; some are venomous", "synonyms": ["snake", "serpent"], "image_count": 8, "id": 975, "frequency": "r", "synset": "snake.n.01"}, {"name": "snowboard", "instance_count": 2119, "def": "a board that resembles a broad ski or a small surfboard; used in a standing position to slide down snow-covered slopes", "synonyms": ["snowboard"], "image_count": 1124, "id": 976, "frequency": "f", "synset": "snowboard.n.01"}, {"name": "snowman", "instance_count": 61, "def": "a figure of a person made of packed snow", "synonyms": ["snowman"], "image_count": 31, "id": 977, "frequency": "c", "synset": "snowman.n.01"}, {"name": "snowmobile", "instance_count": 23, "def": "tracked vehicle for travel on snow having skis in front", "synonyms": ["snowmobile"], "image_count": 16, "id": 978, "frequency": "c", "synset": "snowmobile.n.01"}, {"name": "soap", "instance_count": 895, "def": "a cleansing agent made from the salts of vegetable or animal fats", "synonyms": ["soap"], "image_count": 491, "id": 979, "frequency": "f", "synset": "soap.n.01"}, {"name": "soccer_ball", "instance_count": 670, "def": "an inflated ball used in playing soccer (called `football' outside of the United States)", "synonyms": ["soccer_ball"], "image_count": 432, "id": 980, "frequency": "f", "synset": "soccer_ball.n.01"}, {"name": "sock", "instance_count": 6866, "def": "cloth covering for the foot; worn inside the shoe; reaches to between the ankle and the knee", "synonyms": ["sock"], "image_count": 1945, "id": 981, "frequency": "f", "synset": "sock.n.01"}, {"name": "sofa", "instance_count": 2408, "def": "an upholstered seat for more than one person", "synonyms": ["sofa", "couch", "lounge"], "image_count": 1899, "id": 982, "frequency": "f", "synset": "sofa.n.01"}, {"name": "softball", "instance_count": 5, "def": "ball used in playing softball", "synonyms": ["softball"], "image_count": 5, "id": 983, "frequency": "r", "synset": "softball.n.01"}, {"name": "solar_array", "instance_count": 52, "def": "electrical device consisting of a large array of connected solar cells", "synonyms": ["solar_array", "solar_battery", "solar_panel"], "image_count": 28, "id": 984, "frequency": "c", "synset": "solar_array.n.01"}, {"name": "sombrero", "instance_count": 22, "def": "a straw hat with a tall crown and broad brim; worn in American southwest and in Mexico", "synonyms": ["sombrero"], "image_count": 7, "id": 985, "frequency": "r", "synset": "sombrero.n.02"}, {"name": "soup", "instance_count": 193, "def": "liquid food especially of meat or fish or vegetable stock often containing pieces of solid food", "synonyms": ["soup"], "image_count": 146, "id": 986, "frequency": "f", "synset": "soup.n.01"}, {"name": "soup_bowl", "instance_count": 2, "def": "a bowl for serving soup", "synonyms": ["soup_bowl"], "image_count": 1, "id": 987, "frequency": "r", "synset": "soup_bowl.n.01"}, {"name": "soupspoon", "instance_count": 44, "def": "a spoon with a rounded bowl for eating soup", "synonyms": ["soupspoon"], "image_count": 25, "id": 988, "frequency": "c", "synset": "soupspoon.n.01"}, {"name": "sour_cream", "instance_count": 49, "def": "soured light cream", "synonyms": ["sour_cream", "soured_cream"], "image_count": 22, "id": 989, "frequency": "c", "synset": "sour_cream.n.01"}, {"name": "soya_milk", "instance_count": 2, "def": "a milk substitute containing soybean flour and water; used in some infant formulas and in making tofu", "synonyms": ["soya_milk", "soybean_milk", "soymilk"], "image_count": 1, "id": 990, "frequency": "r", "synset": "soya_milk.n.01"}, {"name": "space_shuttle", "instance_count": 10, "def": "a reusable spacecraft with wings for a controlled descent through the Earth's atmosphere", "synonyms": ["space_shuttle"], "image_count": 10, "id": 991, "frequency": "r", "synset": "space_shuttle.n.01"}, {"name": "sparkler_(fireworks)", "instance_count": 12, "def": "a firework that burns slowly and throws out a shower of sparks", "synonyms": ["sparkler_(fireworks)"], "image_count": 9, "id": 992, "frequency": "r", "synset": "sparkler.n.02"}, {"name": "spatula", "instance_count": 508, "def": "a hand tool with a thin flexible blade used to mix or spread soft substances", "synonyms": ["spatula"], "image_count": 308, "id": 993, "frequency": "f", "synset": "spatula.n.02"}, {"name": "spear", "instance_count": 9, "def": "a long pointed rod used as a tool or weapon", "synonyms": ["spear", "lance"], "image_count": 4, "id": 994, "frequency": "r", "synset": "spear.n.01"}, {"name": "spectacles", "instance_count": 3040, "def": "optical instrument consisting of a frame that holds a pair of lenses for correcting defective vision", "synonyms": ["spectacles", "specs", "eyeglasses", "glasses"], "image_count": 1969, "id": 995, "frequency": "f", "synset": "spectacles.n.01"}, {"name": "spice_rack", "instance_count": 54, "def": "a rack for displaying containers filled with spices", "synonyms": ["spice_rack"], "image_count": 45, "id": 996, "frequency": "c", "synset": "spice_rack.n.01"}, {"name": "spider", "instance_count": 19, "def": "predatory arachnid with eight legs, two poison fangs, two feelers, and usually two silk-spinning organs at the back end of the body", "synonyms": ["spider"], "image_count": 12, "id": 997, "frequency": "c", "synset": "spider.n.01"}, {"name": "crawfish", "instance_count": 5, "def": "large edible marine crustacean having a spiny carapace but lacking the large pincers of true lobsters", "synonyms": ["crawfish", "crayfish"], "image_count": 1, "id": 998, "frequency": "r", "synset": "spiny_lobster.n.02"}, {"name": "sponge", "instance_count": 116, "def": "a porous mass usable to absorb water typically used for cleaning", "synonyms": ["sponge"], "image_count": 85, "id": 999, "frequency": "c", "synset": "sponge.n.01"}, {"name": "spoon", "instance_count": 2111, "def": "a piece of cutlery with a shallow bowl-shaped container and a handle", "synonyms": ["spoon"], "image_count": 1127, "id": 1000, "frequency": "f", "synset": "spoon.n.01"}, {"name": "sportswear", "instance_count": 85, "def": "attire worn for sport or for casual wear", "synonyms": ["sportswear", "athletic_wear", "activewear"], "image_count": 11, "id": 1001, "frequency": "c", "synset": "sportswear.n.01"}, {"name": "spotlight", "instance_count": 403, "def": "a lamp that produces a strong beam of light to illuminate a restricted area; used to focus attention of a stage performer", "synonyms": ["spotlight"], "image_count": 60, "id": 1002, "frequency": "c", "synset": "spotlight.n.02"}, {"name": "squid_(food)", "instance_count": 6, "def": "(Italian cuisine) squid prepared as food", "synonyms": ["squid_(food)", "calamari", "calamary"], "image_count": 1, "id": 1003, "frequency": "r", "synset": "squid.n.01"}, {"name": "squirrel", "instance_count": 19, "def": "a kind of arboreal rodent having a long bushy tail", "synonyms": ["squirrel"], "image_count": 16, "id": 1004, "frequency": "c", "synset": "squirrel.n.01"}, {"name": "stagecoach", "instance_count": 1, "def": "a large coach-and-four formerly used to carry passengers and mail on regular routes between towns", "synonyms": ["stagecoach"], "image_count": 1, "id": 1005, "frequency": "r", "synset": "stagecoach.n.01"}, {"name": "stapler_(stapling_machine)", "instance_count": 68, "def": "a machine that inserts staples into sheets of paper in order to fasten them together", "synonyms": ["stapler_(stapling_machine)"], "image_count": 65, "id": 1006, "frequency": "c", "synset": "stapler.n.01"}, {"name": "starfish", "instance_count": 28, "def": "echinoderms characterized by five arms extending from a central disk", "synonyms": ["starfish", "sea_star"], "image_count": 13, "id": 1007, "frequency": "c", "synset": "starfish.n.01"}, {"name": "statue_(sculpture)", "instance_count": 1934, "def": "a sculpture representing a human or animal", "synonyms": ["statue_(sculpture)"], "image_count": 655, "id": 1008, "frequency": "f", "synset": "statue.n.01"}, {"name": "steak_(food)", "instance_count": 139, "def": "a slice of meat cut from the fleshy part of an animal or large fish", "synonyms": ["steak_(food)"], "image_count": 51, "id": 1009, "frequency": "c", "synset": "steak.n.01"}, {"name": "steak_knife", "instance_count": 1, "def": "a sharp table knife used in eating steak", "synonyms": ["steak_knife"], "image_count": 1, "id": 1010, "frequency": "r", "synset": "steak_knife.n.01"}, {"name": "steering_wheel", "instance_count": 901, "def": "a handwheel that is used for steering", "synonyms": ["steering_wheel"], "image_count": 673, "id": 1011, "frequency": "f", "synset": "steering_wheel.n.01"}, {"name": "stepladder", "instance_count": 5, "def": "a folding portable ladder hinged at the top", "synonyms": ["stepladder"], "image_count": 5, "id": 1012, "frequency": "r", "synset": "step_ladder.n.01"}, {"name": "step_stool", "instance_count": 43, "def": "a stool that has one or two steps that fold under the seat", "synonyms": ["step_stool"], "image_count": 36, "id": 1013, "frequency": "c", "synset": "step_stool.n.01"}, {"name": "stereo_(sound_system)", "instance_count": 77, "def": "electronic device for playing audio", "synonyms": ["stereo_(sound_system)"], "image_count": 54, "id": 1014, "frequency": "c", "synset": "stereo.n.01"}, {"name": "stew", "instance_count": 7, "def": "food prepared by stewing especially meat or fish with vegetables", "synonyms": ["stew"], "image_count": 5, "id": 1015, "frequency": "r", "synset": "stew.n.02"}, {"name": "stirrer", "instance_count": 18, "def": "an implement used for stirring", "synonyms": ["stirrer"], "image_count": 8, "id": 1016, "frequency": "r", "synset": "stirrer.n.02"}, {"name": "stirrup", "instance_count": 625, "def": "support consisting of metal loops into which rider's feet go", "synonyms": ["stirrup"], "image_count": 305, "id": 1017, "frequency": "f", "synset": "stirrup.n.01"}, {"name": "stool", "instance_count": 583, "def": "a simple seat without a back or arms", "synonyms": ["stool"], "image_count": 297, "id": 1018, "frequency": "f", "synset": "stool.n.01"}, {"name": "stop_sign", "instance_count": 1349, "def": "a traffic sign to notify drivers that they must come to a complete stop", "synonyms": ["stop_sign"], "image_count": 1053, "id": 1019, "frequency": "f", "synset": "stop_sign.n.01"}, {"name": "brake_light", "instance_count": 1334, "def": "a red light on the rear of a motor vehicle that signals when the brakes are applied", "synonyms": ["brake_light"], "image_count": 223, "id": 1020, "frequency": "f", "synset": "stoplight.n.01"}, {"name": "stove", "instance_count": 1133, "def": "a kitchen appliance used for cooking food", "synonyms": ["stove", "kitchen_stove", "range_(kitchen_appliance)", "kitchen_range", "cooking_stove"], "image_count": 1037, "id": 1021, "frequency": "f", "synset": "stove.n.01"}, {"name": "strainer", "instance_count": 99, "def": "a filter to retain larger pieces while smaller pieces and liquids pass through", "synonyms": ["strainer"], "image_count": 63, "id": 1022, "frequency": "c", "synset": "strainer.n.01"}, {"name": "strap", "instance_count": 7435, "def": "an elongated strip of material for binding things together or holding", "synonyms": ["strap"], "image_count": 1881, "id": 1023, "frequency": "f", "synset": "strap.n.01"}, {"name": "straw_(for_drinking)", "instance_count": 1154, "def": "a thin paper or plastic tube used to suck liquids into the mouth", "synonyms": ["straw_(for_drinking)", "drinking_straw"], "image_count": 507, "id": 1024, "frequency": "f", "synset": "straw.n.04"}, {"name": "strawberry", "instance_count": 4386, "def": "sweet fleshy red fruit", "synonyms": ["strawberry"], "image_count": 333, "id": 1025, "frequency": "f", "synset": "strawberry.n.01"}, {"name": "street_sign", "instance_count": 8350, "def": "a sign visible from the street", "synonyms": ["street_sign"], "image_count": 1911, "id": 1026, "frequency": "f", "synset": "street_sign.n.01"}, {"name": "streetlight", "instance_count": 7381, "def": "a lamp supported on a lamppost; for illuminating a street", "synonyms": ["streetlight", "street_lamp"], "image_count": 1765, "id": 1027, "frequency": "f", "synset": "streetlight.n.01"}, {"name": "string_cheese", "instance_count": 1, "def": "cheese formed in long strings twisted together", "synonyms": ["string_cheese"], "image_count": 1, "id": 1028, "frequency": "r", "synset": "string_cheese.n.01"}, {"name": "stylus", "instance_count": 11, "def": "a pointed tool for writing or drawing or engraving, including pens", "synonyms": ["stylus"], "image_count": 5, "id": 1029, "frequency": "r", "synset": "stylus.n.02"}, {"name": "subwoofer", "instance_count": 1, "def": "a loudspeaker that is designed to reproduce very low bass frequencies", "synonyms": ["subwoofer"], "image_count": 1, "id": 1030, "frequency": "r", "synset": "subwoofer.n.01"}, {"name": "sugar_bowl", "instance_count": 10, "def": "a dish in which sugar is served", "synonyms": ["sugar_bowl"], "image_count": 9, "id": 1031, "frequency": "r", "synset": "sugar_bowl.n.01"}, {"name": "sugarcane_(plant)", "instance_count": 31, "def": "juicy canes whose sap is a source of molasses and commercial sugar; fresh canes are sometimes chewed for the juice", "synonyms": ["sugarcane_(plant)"], "image_count": 2, "id": 1032, "frequency": "r", "synset": "sugarcane.n.01"}, {"name": "suit_(clothing)", "instance_count": 461, "def": "a set of garments (usually including a jacket and trousers or skirt) for outerwear all of the same fabric and color", "synonyms": ["suit_(clothing)"], "image_count": 151, "id": 1033, "frequency": "f", "synset": "suit.n.01"}, {"name": "sunflower", "instance_count": 618, "def": "any plant of the genus Helianthus having large flower heads with dark disk florets and showy yellow rays", "synonyms": ["sunflower"], "image_count": 82, "id": 1034, "frequency": "c", "synset": "sunflower.n.01"}, {"name": "sunglasses", "instance_count": 5603, "def": "spectacles that are darkened or polarized to protect the eyes from the glare of the sun", "synonyms": ["sunglasses"], "image_count": 1931, "id": 1035, "frequency": "f", "synset": "sunglasses.n.01"}, {"name": "sunhat", "instance_count": 170, "def": "a hat with a broad brim that protects the face from direct exposure to the sun", "synonyms": ["sunhat"], "image_count": 41, "id": 1036, "frequency": "c", "synset": "sunhat.n.01"}, {"name": "surfboard", "instance_count": 3835, "def": "a narrow buoyant board for riding surf", "synonyms": ["surfboard"], "image_count": 1895, "id": 1037, "frequency": "f", "synset": "surfboard.n.01"}, {"name": "sushi", "instance_count": 337, "def": "rice (with raw fish) wrapped in seaweed", "synonyms": ["sushi"], "image_count": 24, "id": 1038, "frequency": "c", "synset": "sushi.n.01"}, {"name": "mop", "instance_count": 22, "def": "cleaning implement consisting of absorbent material fastened to a handle; for cleaning floors", "synonyms": ["mop"], "image_count": 22, "id": 1039, "frequency": "c", "synset": "swab.n.02"}, {"name": "sweat_pants", "instance_count": 56, "def": "loose-fitting trousers with elastic cuffs; worn by athletes", "synonyms": ["sweat_pants"], "image_count": 35, "id": 1040, "frequency": "c", "synset": "sweat_pants.n.01"}, {"name": "sweatband", "instance_count": 145, "def": "a band of material tied around the forehead or wrist to absorb sweat", "synonyms": ["sweatband"], "image_count": 69, "id": 1041, "frequency": "c", "synset": "sweatband.n.02"}, {"name": "sweater", "instance_count": 1894, "def": "a crocheted or knitted garment covering the upper part of the body", "synonyms": ["sweater"], "image_count": 962, "id": 1042, "frequency": "f", "synset": "sweater.n.01"}, {"name": "sweatshirt", "instance_count": 1482, "def": "cotton knit pullover with long sleeves worn during athletic activity", "synonyms": ["sweatshirt"], "image_count": 588, "id": 1043, "frequency": "f", "synset": "sweatshirt.n.01"}, {"name": "sweet_potato", "instance_count": 137, "def": "the edible tuberous root of the sweet potato vine", "synonyms": ["sweet_potato"], "image_count": 21, "id": 1044, "frequency": "c", "synset": "sweet_potato.n.02"}, {"name": "swimsuit", "instance_count": 3141, "def": "garment worn for swimming", "synonyms": ["swimsuit", "swimwear", "bathing_suit", "swimming_costume", "bathing_costume", "swimming_trunks", "bathing_trunks"], "image_count": 825, "id": 1045, "frequency": "f", "synset": "swimsuit.n.01"}, {"name": "sword", "instance_count": 72, "def": "a cutting or thrusting weapon that has a long metal blade", "synonyms": ["sword"], "image_count": 52, "id": 1046, "frequency": "c", "synset": "sword.n.01"}, {"name": "syringe", "instance_count": 14, "def": "a medical instrument used to inject or withdraw fluids", "synonyms": ["syringe"], "image_count": 5, "id": 1047, "frequency": "r", "synset": "syringe.n.01"}, {"name": "Tabasco_sauce", "instance_count": 5, "def": "very spicy sauce (trade name Tabasco) made from fully-aged red peppers", "synonyms": ["Tabasco_sauce"], "image_count": 5, "id": 1048, "frequency": "r", "synset": "tabasco.n.02"}, {"name": "table-tennis_table", "instance_count": 5, "def": "a table used for playing table tennis", "synonyms": ["table-tennis_table", "ping-pong_table"], "image_count": 5, "id": 1049, "frequency": "r", "synset": "table-tennis_table.n.01"}, {"name": "table", "instance_count": 2804, "def": "a piece of furniture having a smooth flat top that is usually supported by one or more vertical legs", "synonyms": ["table"], "image_count": 1860, "id": 1050, "frequency": "f", "synset": "table.n.02"}, {"name": "table_lamp", "instance_count": 81, "def": "a lamp that sits on a table", "synonyms": ["table_lamp"], "image_count": 56, "id": 1051, "frequency": "c", "synset": "table_lamp.n.01"}, {"name": "tablecloth", "instance_count": 2496, "def": "a covering spread over a dining table", "synonyms": ["tablecloth"], "image_count": 1582, "id": 1052, "frequency": "f", "synset": "tablecloth.n.01"}, {"name": "tachometer", "instance_count": 10, "def": "measuring instrument for indicating speed of rotation", "synonyms": ["tachometer"], "image_count": 7, "id": 1053, "frequency": "r", "synset": "tachometer.n.01"}, {"name": "taco", "instance_count": 21, "def": "a small tortilla cupped around a filling", "synonyms": ["taco"], "image_count": 2, "id": 1054, "frequency": "r", "synset": "taco.n.02"}, {"name": "tag", "instance_count": 7550, "def": "a label associated with something for the purpose of identification or information", "synonyms": ["tag"], "image_count": 1562, "id": 1055, "frequency": "f", "synset": "tag.n.02"}, {"name": "taillight", "instance_count": 9222, "def": "lamp (usually red) mounted at the rear of a motor vehicle", "synonyms": ["taillight", "rear_light"], "image_count": 1885, "id": 1056, "frequency": "f", "synset": "taillight.n.01"}, {"name": "tambourine", "instance_count": 1, "def": "a shallow drum with a single drumhead and with metallic disks in the sides", "synonyms": ["tambourine"], "image_count": 1, "id": 1057, "frequency": "r", "synset": "tambourine.n.01"}, {"name": "army_tank", "instance_count": 7, "def": "an enclosed armored military vehicle; has a cannon and moves on caterpillar treads", "synonyms": ["army_tank", "armored_combat_vehicle", "armoured_combat_vehicle"], "image_count": 5, "id": 1058, "frequency": "r", "synset": "tank.n.01"}, {"name": "tank_(storage_vessel)", "instance_count": 304, "def": "a large (usually metallic) vessel for holding gases or liquids", "synonyms": ["tank_(storage_vessel)", "storage_tank"], "image_count": 137, "id": 1059, "frequency": "f", "synset": "tank.n.02"}, {"name": "tank_top_(clothing)", "instance_count": 1799, "def": "a tight-fitting sleeveless shirt with wide shoulder straps and low neck and no front opening", "synonyms": ["tank_top_(clothing)"], "image_count": 1094, "id": 1060, "frequency": "f", "synset": "tank_top.n.01"}, {"name": "tape_(sticky_cloth_or_paper)", "instance_count": 560, "def": "a long thin piece of cloth or paper as used for binding or fastening", "synonyms": ["tape_(sticky_cloth_or_paper)"], "image_count": 134, "id": 1061, "frequency": "f", "synset": "tape.n.01"}, {"name": "tape_measure", "instance_count": 35, "def": "measuring instrument consisting of a narrow strip (cloth or metal) marked in inches or centimeters and used for measuring lengths", "synonyms": ["tape_measure", "measuring_tape"], "image_count": 29, "id": 1062, "frequency": "c", "synset": "tape.n.04"}, {"name": "tapestry", "instance_count": 29, "def": "a heavy textile with a woven design; used for curtains and upholstery", "synonyms": ["tapestry"], "image_count": 22, "id": 1063, "frequency": "c", "synset": "tapestry.n.02"}, {"name": "tarp", "instance_count": 1315, "def": "waterproofed canvas", "synonyms": ["tarp"], "image_count": 522, "id": 1064, "frequency": "f", "synset": "tarpaulin.n.01"}, {"name": "tartan", "instance_count": 68, "def": "a cloth having a crisscross design", "synonyms": ["tartan", "plaid"], "image_count": 50, "id": 1065, "frequency": "c", "synset": "tartan.n.01"}, {"name": "tassel", "instance_count": 276, "def": "adornment consisting of a bunch of cords fastened at one end", "synonyms": ["tassel"], "image_count": 68, "id": 1066, "frequency": "c", "synset": "tassel.n.01"}, {"name": "tea_bag", "instance_count": 42, "def": "a measured amount of tea in a bag for an individual serving of tea", "synonyms": ["tea_bag"], "image_count": 16, "id": 1067, "frequency": "c", "synset": "tea_bag.n.01"}, {"name": "teacup", "instance_count": 152, "def": "a cup from which tea is drunk", "synonyms": ["teacup"], "image_count": 40, "id": 1068, "frequency": "c", "synset": "teacup.n.02"}, {"name": "teakettle", "instance_count": 40, "def": "kettle for boiling water to make tea", "synonyms": ["teakettle"], "image_count": 35, "id": 1069, "frequency": "c", "synset": "teakettle.n.01"}, {"name": "teapot", "instance_count": 209, "def": "pot for brewing tea; usually has a spout and handle", "synonyms": ["teapot"], "image_count": 135, "id": 1070, "frequency": "f", "synset": "teapot.n.01"}, {"name": "teddy_bear", "instance_count": 4886, "def": "plaything consisting of a child's toy bear (usually plush and stuffed with soft materials)", "synonyms": ["teddy_bear"], "image_count": 1413, "id": 1071, "frequency": "f", "synset": "teddy.n.01"}, {"name": "telephone", "instance_count": 945, "def": "electronic device for communicating by voice over long distances (includes wired and wireless/cell phones)", "synonyms": ["telephone", "phone", "telephone_set"], "image_count": 772, "id": 1072, "frequency": "f", "synset": "telephone.n.01"}, {"name": "telephone_booth", "instance_count": 62, "def": "booth for using a telephone", "synonyms": ["telephone_booth", "phone_booth", "call_box", "telephone_box", "telephone_kiosk"], "image_count": 50, "id": 1073, "frequency": "c", "synset": "telephone_booth.n.01"}, {"name": "telephone_pole", "instance_count": 3725, "def": "tall pole supporting telephone wires", "synonyms": ["telephone_pole", "telegraph_pole", "telegraph_post"], "image_count": 1015, "id": 1074, "frequency": "f", "synset": "telephone_pole.n.01"}, {"name": "telephoto_lens", "instance_count": 1, "def": "a camera lens that magnifies the image", "synonyms": ["telephoto_lens", "zoom_lens"], "image_count": 1, "id": 1075, "frequency": "r", "synset": "telephoto_lens.n.01"}, {"name": "television_camera", "instance_count": 117, "def": "television equipment for capturing and recording video", "synonyms": ["television_camera", "tv_camera"], "image_count": 65, "id": 1076, "frequency": "c", "synset": "television_camera.n.01"}, {"name": "television_set", "instance_count": 2205, "def": "an electronic device that receives television signals and displays them on a screen", "synonyms": ["television_set", "tv", "tv_set"], "image_count": 1900, "id": 1077, "frequency": "f", "synset": "television_receiver.n.01"}, {"name": "tennis_ball", "instance_count": 2835, "def": "ball about the size of a fist used in playing tennis", "synonyms": ["tennis_ball"], "image_count": 1302, "id": 1078, "frequency": "f", "synset": "tennis_ball.n.01"}, {"name": "tennis_racket", "instance_count": 3035, "def": "a racket used to play tennis", "synonyms": ["tennis_racket"], "image_count": 1977, "id": 1079, "frequency": "f", "synset": "tennis_racket.n.01"}, {"name": "tequila", "instance_count": 2, "def": "Mexican liquor made from fermented juices of an agave plant", "synonyms": ["tequila"], "image_count": 2, "id": 1080, "frequency": "r", "synset": "tequila.n.01"}, {"name": "thermometer", "instance_count": 33, "def": "measuring instrument for measuring temperature", "synonyms": ["thermometer"], "image_count": 29, "id": 1081, "frequency": "c", "synset": "thermometer.n.01"}, {"name": "thermos_bottle", "instance_count": 49, "def": "vacuum flask that preserves temperature of hot or cold drinks", "synonyms": ["thermos_bottle"], "image_count": 36, "id": 1082, "frequency": "c", "synset": "thermos.n.01"}, {"name": "thermostat", "instance_count": 153, "def": "a regulator for automatically regulating temperature by starting or stopping the supply of heat", "synonyms": ["thermostat"], "image_count": 138, "id": 1083, "frequency": "f", "synset": "thermostat.n.01"}, {"name": "thimble", "instance_count": 6, "def": "a small metal cap to protect the finger while sewing; can be used as a small container", "synonyms": ["thimble"], "image_count": 4, "id": 1084, "frequency": "r", "synset": "thimble.n.02"}, {"name": "thread", "instance_count": 320, "def": "a fine cord of twisted fibers (of cotton or silk or wool or nylon etc.) used in sewing and weaving", "synonyms": ["thread", "yarn"], "image_count": 67, "id": 1085, "frequency": "c", "synset": "thread.n.01"}, {"name": "thumbtack", "instance_count": 224, "def": "a tack for attaching papers to a bulletin board or drawing board", "synonyms": ["thumbtack", "drawing_pin", "pushpin"], "image_count": 26, "id": 1086, "frequency": "c", "synset": "thumbtack.n.01"}, {"name": "tiara", "instance_count": 31, "def": "a jeweled headdress worn by women on formal occasions", "synonyms": ["tiara"], "image_count": 25, "id": 1087, "frequency": "c", "synset": "tiara.n.01"}, {"name": "tiger", "instance_count": 67, "def": "large feline of forests in most of Asia having a tawny coat with black stripes", "synonyms": ["tiger"], "image_count": 33, "id": 1088, "frequency": "c", "synset": "tiger.n.02"}, {"name": "tights_(clothing)", "instance_count": 45, "def": "skintight knit hose covering the body from the waist to the feet worn by acrobats and dancers and as stockings by women and girls", "synonyms": ["tights_(clothing)", "leotards"], "image_count": 37, "id": 1089, "frequency": "c", "synset": "tights.n.01"}, {"name": "timer", "instance_count": 62, "def": "a timepiece that measures a time interval and signals its end", "synonyms": ["timer", "stopwatch"], "image_count": 50, "id": 1090, "frequency": "c", "synset": "timer.n.01"}, {"name": "tinfoil", "instance_count": 421, "def": "foil made of tin or an alloy of tin and lead", "synonyms": ["tinfoil"], "image_count": 270, "id": 1091, "frequency": "f", "synset": "tinfoil.n.01"}, {"name": "tinsel", "instance_count": 70, "def": "a showy decoration that is basically valueless", "synonyms": ["tinsel"], "image_count": 12, "id": 1092, "frequency": "c", "synset": "tinsel.n.01"}, {"name": "tissue_paper", "instance_count": 587, "def": "a soft thin (usually translucent) paper", "synonyms": ["tissue_paper"], "image_count": 316, "id": 1093, "frequency": "f", "synset": "tissue.n.02"}, {"name": "toast_(food)", "instance_count": 125, "def": "slice of bread that has been toasted", "synonyms": ["toast_(food)"], "image_count": 41, "id": 1094, "frequency": "c", "synset": "toast.n.01"}, {"name": "toaster", "instance_count": 240, "def": "a kitchen appliance (usually electric) for toasting bread", "synonyms": ["toaster"], "image_count": 224, "id": 1095, "frequency": "f", "synset": "toaster.n.02"}, {"name": "toaster_oven", "instance_count": 114, "def": "kitchen appliance consisting of a small electric oven for toasting or warming food", "synonyms": ["toaster_oven"], "image_count": 105, "id": 1096, "frequency": "f", "synset": "toaster_oven.n.01"}, {"name": "toilet", "instance_count": 2295, "def": "a plumbing fixture for defecation and urination", "synonyms": ["toilet"], "image_count": 1925, "id": 1097, "frequency": "f", "synset": "toilet.n.02"}, {"name": "toilet_tissue", "instance_count": 1683, "def": "a soft thin absorbent paper for use in toilets", "synonyms": ["toilet_tissue", "toilet_paper", "bathroom_tissue"], "image_count": 1021, "id": 1098, "frequency": "f", "synset": "toilet_tissue.n.01"}, {"name": "tomato", "instance_count": 12338, "def": "mildly acid red or yellow pulpy fruit eaten as a vegetable", "synonyms": ["tomato"], "image_count": 1213, "id": 1099, "frequency": "f", "synset": "tomato.n.01"}, {"name": "tongs", "instance_count": 294, "def": "any of various devices for taking hold of objects; usually have two hinged legs with handles above and pointed hooks below", "synonyms": ["tongs"], "image_count": 172, "id": 1100, "frequency": "f", "synset": "tongs.n.01"}, {"name": "toolbox", "instance_count": 39, "def": "a box or chest or cabinet for holding hand tools", "synonyms": ["toolbox"], "image_count": 28, "id": 1101, "frequency": "c", "synset": "toolbox.n.01"}, {"name": "toothbrush", "instance_count": 1683, "def": "small brush; has long handle; used to clean teeth", "synonyms": ["toothbrush"], "image_count": 745, "id": 1102, "frequency": "f", "synset": "toothbrush.n.01"}, {"name": "toothpaste", "instance_count": 326, "def": "a dentifrice in the form of a paste", "synonyms": ["toothpaste"], "image_count": 187, "id": 1103, "frequency": "f", "synset": "toothpaste.n.01"}, {"name": "toothpick", "instance_count": 423, "def": "pick consisting of a small strip of wood or plastic; used to pick food from between the teeth", "synonyms": ["toothpick"], "image_count": 147, "id": 1104, "frequency": "f", "synset": "toothpick.n.01"}, {"name": "cover", "instance_count": 306, "def": "covering for a hole (especially a hole in the top of a container)", "synonyms": ["cover"], "image_count": 136, "id": 1105, "frequency": "f", "synset": "top.n.09"}, {"name": "tortilla", "instance_count": 135, "def": "thin unleavened pancake made from cornmeal or wheat flour", "synonyms": ["tortilla"], "image_count": 34, "id": 1106, "frequency": "c", "synset": "tortilla.n.01"}, {"name": "tow_truck", "instance_count": 45, "def": "a truck equipped to hoist and pull wrecked cars (or to remove cars from no-parking zones)", "synonyms": ["tow_truck"], "image_count": 41, "id": 1107, "frequency": "c", "synset": "tow_truck.n.01"}, {"name": "towel", "instance_count": 2212, "def": "a rectangular piece of absorbent cloth (or paper) for drying or wiping", "synonyms": ["towel"], "image_count": 636, "id": 1108, "frequency": "f", "synset": "towel.n.01"}, {"name": "towel_rack", "instance_count": 987, "def": "a rack consisting of one or more bars on which towels can be hung", "synonyms": ["towel_rack", "towel_rail", "towel_bar"], "image_count": 570, "id": 1109, "frequency": "f", "synset": "towel_rack.n.01"}, {"name": "toy", "instance_count": 6756, "def": "a device regarded as providing amusement", "synonyms": ["toy"], "image_count": 1149, "id": 1110, "frequency": "f", "synset": "toy.n.03"}, {"name": "tractor_(farm_equipment)", "instance_count": 80, "def": "a wheeled vehicle with large wheels; used in farming and other applications", "synonyms": ["tractor_(farm_equipment)"], "image_count": 61, "id": 1111, "frequency": "c", "synset": "tractor.n.01"}, {"name": "traffic_light", "instance_count": 7298, "def": "a device to control vehicle traffic often consisting of three or more lights", "synonyms": ["traffic_light"], "image_count": 1890, "id": 1112, "frequency": "f", "synset": "traffic_light.n.01"}, {"name": "dirt_bike", "instance_count": 47, "def": "a lightweight motorcycle equipped with rugged tires and suspension for off-road use", "synonyms": ["dirt_bike"], "image_count": 18, "id": 1113, "frequency": "c", "synset": "trail_bike.n.01"}, {"name": "trailer_truck", "instance_count": 297, "def": "a truck consisting of a tractor and trailer together", "synonyms": ["trailer_truck", "tractor_trailer", "trucking_rig", "articulated_lorry", "semi_truck"], "image_count": 143, "id": 1114, "frequency": "f", "synset": "trailer_truck.n.01"}, {"name": "train_(railroad_vehicle)", "instance_count": 2192, "def": "public or private transport provided by a line of railway cars coupled together and drawn by a locomotive", "synonyms": ["train_(railroad_vehicle)", "railroad_train"], "image_count": 1517, "id": 1115, "frequency": "f", "synset": "train.n.01"}, {"name": "trampoline", "instance_count": 7, "def": "gymnastic apparatus consisting of a strong canvas sheet attached with springs to a metal frame", "synonyms": ["trampoline"], "image_count": 7, "id": 1116, "frequency": "r", "synset": "trampoline.n.01"}, {"name": "tray", "instance_count": 2397, "def": "an open receptacle for holding or displaying or serving articles or food", "synonyms": ["tray"], "image_count": 943, "id": 1117, "frequency": "f", "synset": "tray.n.01"}, {"name": "trench_coat", "instance_count": 16, "def": "a military style raincoat; belted with deep pockets", "synonyms": ["trench_coat"], "image_count": 6, "id": 1118, "frequency": "r", "synset": "trench_coat.n.01"}, {"name": "triangle_(musical_instrument)", "instance_count": 1, "def": "a percussion instrument consisting of a metal bar bent in the shape of an open triangle", "synonyms": ["triangle_(musical_instrument)"], "image_count": 1, "id": 1119, "frequency": "r", "synset": "triangle.n.05"}, {"name": "tricycle", "instance_count": 15, "def": "a vehicle with three wheels that is moved by foot pedals", "synonyms": ["tricycle"], "image_count": 11, "id": 1120, "frequency": "c", "synset": "tricycle.n.01"}, {"name": "tripod", "instance_count": 132, "def": "a three-legged rack used for support", "synonyms": ["tripod"], "image_count": 101, "id": 1121, "frequency": "f", "synset": "tripod.n.01"}, {"name": "trousers", "instance_count": 7806, "def": "a garment extending from the waist to the knee or ankle, covering each leg separately", "synonyms": ["trousers", "pants_(clothing)"], "image_count": 1909, "id": 1122, "frequency": "f", "synset": "trouser.n.01"}, {"name": "truck", "instance_count": 1797, "def": "an automotive vehicle suitable for hauling", "synonyms": ["truck"], "image_count": 800, "id": 1123, "frequency": "f", "synset": "truck.n.01"}, {"name": "truffle_(chocolate)", "instance_count": 4, "def": "creamy chocolate candy", "synonyms": ["truffle_(chocolate)", "chocolate_truffle"], "image_count": 1, "id": 1124, "frequency": "r", "synset": "truffle.n.03"}, {"name": "trunk", "instance_count": 334, "def": "luggage consisting of a large strong case used when traveling or for storage", "synonyms": ["trunk"], "image_count": 44, "id": 1125, "frequency": "c", "synset": "trunk.n.02"}, {"name": "vat", "instance_count": 15, "def": "a large vessel for holding or storing liquids", "synonyms": ["vat"], "image_count": 3, "id": 1126, "frequency": "r", "synset": "tub.n.02"}, {"name": "turban", "instance_count": 124, "def": "a traditional headdress consisting of a long scarf wrapped around the head", "synonyms": ["turban"], "image_count": 44, "id": 1127, "frequency": "c", "synset": "turban.n.01"}, {"name": "turkey_(food)", "instance_count": 120, "def": "flesh of large domesticated fowl usually roasted", "synonyms": ["turkey_(food)"], "image_count": 31, "id": 1128, "frequency": "c", "synset": "turkey.n.04"}, {"name": "turnip", "instance_count": 109, "def": "widely cultivated plant having a large fleshy edible white or yellow root", "synonyms": ["turnip"], "image_count": 7, "id": 1129, "frequency": "r", "synset": "turnip.n.01"}, {"name": "turtle", "instance_count": 31, "def": "any of various aquatic and land reptiles having a bony shell and flipper-like limbs for swimming", "synonyms": ["turtle"], "image_count": 20, "id": 1130, "frequency": "c", "synset": "turtle.n.02"}, {"name": "turtleneck_(clothing)", "instance_count": 13, "def": "a sweater or jersey with a high close-fitting collar", "synonyms": ["turtleneck_(clothing)", "polo-neck"], "image_count": 11, "id": 1131, "frequency": "c", "synset": "turtleneck.n.01"}, {"name": "typewriter", "instance_count": 14, "def": "hand-operated character printer for printing written messages one character at a time", "synonyms": ["typewriter"], "image_count": 13, "id": 1132, "frequency": "c", "synset": "typewriter.n.01"}, {"name": "umbrella", "instance_count": 9161, "def": "a lightweight handheld collapsible canopy", "synonyms": ["umbrella"], "image_count": 1924, "id": 1133, "frequency": "f", "synset": "umbrella.n.01"}, {"name": "underwear", "instance_count": 164, "def": "undergarment worn next to the skin and under the outer garments", "synonyms": ["underwear", "underclothes", "underclothing", "underpants"], "image_count": 113, "id": 1134, "frequency": "f", "synset": "underwear.n.01"}, {"name": "unicycle", "instance_count": 2, "def": "a vehicle with a single wheel that is driven by pedals", "synonyms": ["unicycle"], "image_count": 2, "id": 1135, "frequency": "r", "synset": "unicycle.n.01"}, {"name": "urinal", "instance_count": 381, "def": "a plumbing fixture (usually attached to the wall) used by men to urinate", "synonyms": ["urinal"], "image_count": 139, "id": 1136, "frequency": "f", "synset": "urinal.n.01"}, {"name": "urn", "instance_count": 81, "def": "a large vase that usually has a pedestal or feet", "synonyms": ["urn"], "image_count": 12, "id": 1137, "frequency": "c", "synset": "urn.n.01"}, {"name": "vacuum_cleaner", "instance_count": 38, "def": "an electrical home appliance that cleans by suction", "synonyms": ["vacuum_cleaner"], "image_count": 37, "id": 1138, "frequency": "c", "synset": "vacuum.n.04"}, {"name": "vase", "instance_count": 4971, "def": "an open jar of glass or porcelain used as an ornament or to hold flowers", "synonyms": ["vase"], "image_count": 1866, "id": 1139, "frequency": "f", "synset": "vase.n.01"}, {"name": "vending_machine", "instance_count": 65, "def": "a slot machine for selling goods", "synonyms": ["vending_machine"], "image_count": 47, "id": 1140, "frequency": "c", "synset": "vending_machine.n.01"}, {"name": "vent", "instance_count": 3370, "def": "a hole for the escape of gas or air", "synonyms": ["vent", "blowhole", "air_vent"], "image_count": 1468, "id": 1141, "frequency": "f", "synset": "vent.n.01"}, {"name": "vest", "instance_count": 1313, "def": "a man's sleeveless garment worn underneath a coat", "synonyms": ["vest", "waistcoat"], "image_count": 729, "id": 1142, "frequency": "f", "synset": "vest.n.01"}, {"name": "videotape", "instance_count": 228, "def": "a video recording made on magnetic tape", "synonyms": ["videotape"], "image_count": 24, "id": 1143, "frequency": "c", "synset": "videotape.n.01"}, {"name": "vinegar", "instance_count": 1, "def": "sour-tasting liquid produced usually by oxidation of the alcohol in wine or cider and used as a condiment or food preservative", "synonyms": ["vinegar"], "image_count": 1, "id": 1144, "frequency": "r", "synset": "vinegar.n.01"}, {"name": "violin", "instance_count": 10, "def": "bowed stringed instrument that is the highest member of the violin family", "synonyms": ["violin", "fiddle"], "image_count": 10, "id": 1145, "frequency": "r", "synset": "violin.n.01"}, {"name": "vodka", "instance_count": 3, "def": "unaged colorless liquor originating in Russia", "synonyms": ["vodka"], "image_count": 3, "id": 1146, "frequency": "r", "synset": "vodka.n.01"}, {"name": "volleyball", "instance_count": 33, "def": "an inflated ball used in playing volleyball", "synonyms": ["volleyball"], "image_count": 14, "id": 1147, "frequency": "c", "synset": "volleyball.n.02"}, {"name": "vulture", "instance_count": 16, "def": "any of various large birds of prey having naked heads and weak claws and feeding chiefly on carrion", "synonyms": ["vulture"], "image_count": 4, "id": 1148, "frequency": "r", "synset": "vulture.n.01"}, {"name": "waffle", "instance_count": 61, "def": "pancake batter baked in a waffle iron", "synonyms": ["waffle"], "image_count": 29, "id": 1149, "frequency": "c", "synset": "waffle.n.01"}, {"name": "waffle_iron", "instance_count": 4, "def": "a kitchen appliance for baking waffles", "synonyms": ["waffle_iron"], "image_count": 4, "id": 1150, "frequency": "r", "synset": "waffle_iron.n.01"}, {"name": "wagon", "instance_count": 121, "def": "any of various kinds of wheeled vehicles drawn by an animal or a tractor", "synonyms": ["wagon"], "image_count": 70, "id": 1151, "frequency": "c", "synset": "wagon.n.01"}, {"name": "wagon_wheel", "instance_count": 209, "def": "a wheel of a wagon", "synonyms": ["wagon_wheel"], "image_count": 46, "id": 1152, "frequency": "c", "synset": "wagon_wheel.n.01"}, {"name": "walking_stick", "instance_count": 21, "def": "a stick carried in the hand for support in walking", "synonyms": ["walking_stick"], "image_count": 14, "id": 1153, "frequency": "c", "synset": "walking_stick.n.01"}, {"name": "wall_clock", "instance_count": 100, "def": "a clock mounted on a wall", "synonyms": ["wall_clock"], "image_count": 48, "id": 1154, "frequency": "c", "synset": "wall_clock.n.01"}, {"name": "wall_socket", "instance_count": 3069, "def": "receptacle providing a place in a wiring system where current can be taken to run electrical devices", "synonyms": ["wall_socket", "wall_plug", "electric_outlet", "electrical_outlet", "outlet", "electric_receptacle"], "image_count": 1855, "id": 1155, "frequency": "f", "synset": "wall_socket.n.01"}, {"name": "wallet", "instance_count": 123, "def": "a pocket-size case for holding papers and paper money", "synonyms": ["wallet", "billfold"], "image_count": 113, "id": 1156, "frequency": "f", "synset": "wallet.n.01"}, {"name": "walrus", "instance_count": 1, "def": "either of two large northern marine mammals having ivory tusks and tough hide over thick blubber", "synonyms": ["walrus"], "image_count": 1, "id": 1157, "frequency": "r", "synset": "walrus.n.01"}, {"name": "wardrobe", "instance_count": 1, "def": "a tall piece of furniture that provides storage space for clothes; has a door and rails or hooks for hanging clothes", "synonyms": ["wardrobe"], "image_count": 1, "id": 1158, "frequency": "r", "synset": "wardrobe.n.01"}, {"name": "washbasin", "instance_count": 15, "def": "a bathroom sink that is permanently installed and connected to a water supply and drainpipe; where you can wash your hands and face", "synonyms": ["washbasin", "basin_(for_washing)", "washbowl", "washstand", "handbasin"], "image_count": 10, "id": 1159, "frequency": "r", "synset": "washbasin.n.01"}, {"name": "automatic_washer", "instance_count": 68, "def": "a home appliance for washing clothes and linens automatically", "synonyms": ["automatic_washer", "washing_machine"], "image_count": 54, "id": 1160, "frequency": "c", "synset": "washer.n.03"}, {"name": "watch", "instance_count": 2703, "def": "a small, portable timepiece", "synonyms": ["watch", "wristwatch"], "image_count": 1923, "id": 1161, "frequency": "f", "synset": "watch.n.01"}, {"name": "water_bottle", "instance_count": 1449, "def": "a bottle for holding water", "synonyms": ["water_bottle"], "image_count": 630, "id": 1162, "frequency": "f", "synset": "water_bottle.n.01"}, {"name": "water_cooler", "instance_count": 39, "def": "a device for cooling and dispensing drinking water", "synonyms": ["water_cooler"], "image_count": 31, "id": 1163, "frequency": "c", "synset": "water_cooler.n.01"}, {"name": "water_faucet", "instance_count": 109, "def": "a faucet for drawing water from a pipe or cask", "synonyms": ["water_faucet", "water_tap", "tap_(water_faucet)"], "image_count": 69, "id": 1164, "frequency": "c", "synset": "water_faucet.n.01"}, {"name": "water_heater", "instance_count": 7, "def": "a heater and storage tank to supply heated water", "synonyms": ["water_heater", "hot-water_heater"], "image_count": 7, "id": 1165, "frequency": "r", "synset": "water_heater.n.01"}, {"name": "water_jug", "instance_count": 23, "def": "a jug that holds water", "synonyms": ["water_jug"], "image_count": 11, "id": 1166, "frequency": "c", "synset": "water_jug.n.01"}, {"name": "water_gun", "instance_count": 1, "def": "plaything consisting of a toy pistol that squirts water", "synonyms": ["water_gun", "squirt_gun"], "image_count": 1, "id": 1167, "frequency": "r", "synset": "water_pistol.n.01"}, {"name": "water_scooter", "instance_count": 54, "def": "a motorboat resembling a motor scooter (NOT A SURFBOARD OR WATER SKI)", "synonyms": ["water_scooter", "sea_scooter", "jet_ski"], "image_count": 30, "id": 1168, "frequency": "c", "synset": "water_scooter.n.01"}, {"name": "water_ski", "instance_count": 98, "def": "broad ski for skimming over water towed by a speedboat (DO NOT MARK WATER)", "synonyms": ["water_ski"], "image_count": 50, "id": 1169, "frequency": "c", "synset": "water_ski.n.01"}, {"name": "water_tower", "instance_count": 60, "def": "a large reservoir for water", "synonyms": ["water_tower"], "image_count": 45, "id": 1170, "frequency": "c", "synset": "water_tower.n.01"}, {"name": "watering_can", "instance_count": 44, "def": "a container with a handle and a spout with a perforated nozzle; used to sprinkle water over plants", "synonyms": ["watering_can"], "image_count": 28, "id": 1171, "frequency": "c", "synset": "watering_can.n.01"}, {"name": "watermelon", "instance_count": 814, "def": "large oblong or roundish melon with a hard green rind and sweet watery red or occasionally yellowish pulp", "synonyms": ["watermelon"], "image_count": 114, "id": 1172, "frequency": "f", "synset": "watermelon.n.02"}, {"name": "weathervane", "instance_count": 237, "def": "mechanical device attached to an elevated structure; rotates freely to show the direction of the wind", "synonyms": ["weathervane", "vane_(weathervane)", "wind_vane"], "image_count": 193, "id": 1173, "frequency": "f", "synset": "weathervane.n.01"}, {"name": "webcam", "instance_count": 27, "def": "a digital camera designed to take digital photographs and transmit them over the internet", "synonyms": ["webcam"], "image_count": 21, "id": 1174, "frequency": "c", "synset": "webcam.n.01"}, {"name": "wedding_cake", "instance_count": 140, "def": "a rich cake with two or more tiers and covered with frosting and decorations; served at a wedding reception", "synonyms": ["wedding_cake", "bridecake"], "image_count": 91, "id": 1175, "frequency": "c", "synset": "wedding_cake.n.01"}, {"name": "wedding_ring", "instance_count": 49, "def": "a ring given to the bride and/or groom at the wedding", "synonyms": ["wedding_ring", "wedding_band"], "image_count": 31, "id": 1176, "frequency": "c", "synset": "wedding_ring.n.01"}, {"name": "wet_suit", "instance_count": 2907, "def": "a close-fitting garment made of a permeable material; worn in cold water to retain body heat", "synonyms": ["wet_suit"], "image_count": 1469, "id": 1177, "frequency": "f", "synset": "wet_suit.n.01"}, {"name": "wheel", "instance_count": 11272, "def": "a circular frame with spokes (or a solid disc) that can rotate on a shaft or axle", "synonyms": ["wheel"], "image_count": 1924, "id": 1178, "frequency": "f", "synset": "wheel.n.01"}, {"name": "wheelchair", "instance_count": 107, "def": "a movable chair mounted on large wheels", "synonyms": ["wheelchair"], "image_count": 87, "id": 1179, "frequency": "c", "synset": "wheelchair.n.01"}, {"name": "whipped_cream", "instance_count": 201, "def": "cream that has been beaten until light and fluffy", "synonyms": ["whipped_cream"], "image_count": 77, "id": 1180, "frequency": "c", "synset": "whipped_cream.n.01"}, {"name": "whistle", "instance_count": 13, "def": "a small wind instrument that produces a whistling sound by blowing into it", "synonyms": ["whistle"], "image_count": 11, "id": 1181, "frequency": "c", "synset": "whistle.n.03"}, {"name": "wig", "instance_count": 69, "def": "hairpiece covering the head and made of real or synthetic hair", "synonyms": ["wig"], "image_count": 47, "id": 1182, "frequency": "c", "synset": "wig.n.01"}, {"name": "wind_chime", "instance_count": 28, "def": "a decorative arrangement of pieces of metal or glass or pottery that hang together loosely so the wind can cause them to tinkle", "synonyms": ["wind_chime"], "image_count": 21, "id": 1183, "frequency": "c", "synset": "wind_chime.n.01"}, {"name": "windmill", "instance_count": 202, "def": "A mill or turbine that is powered by wind", "synonyms": ["windmill"], "image_count": 47, "id": 1184, "frequency": "c", "synset": "windmill.n.01"}, {"name": "window_box_(for_plants)", "instance_count": 253, "def": "a container for growing plants on a windowsill", "synonyms": ["window_box_(for_plants)"], "image_count": 70, "id": 1185, "frequency": "c", "synset": "window_box.n.01"}, {"name": "windshield_wiper", "instance_count": 4793, "def": "a mechanical device that cleans the windshield", "synonyms": ["windshield_wiper", "windscreen_wiper", "wiper_(for_windshield/screen)"], "image_count": 1838, "id": 1186, "frequency": "f", "synset": "windshield_wiper.n.01"}, {"name": "windsock", "instance_count": 26, "def": "a truncated cloth cone mounted on a mast/pole; shows wind direction", "synonyms": ["windsock", "air_sock", "air-sleeve", "wind_sleeve", "wind_cone"], "image_count": 19, "id": 1187, "frequency": "c", "synset": "windsock.n.01"}, {"name": "wine_bottle", "instance_count": 4449, "def": "a bottle for holding wine", "synonyms": ["wine_bottle"], "image_count": 531, "id": 1188, "frequency": "f", "synset": "wine_bottle.n.01"}, {"name": "wine_bucket", "instance_count": 21, "def": "a bucket of ice used to chill a bottle of wine", "synonyms": ["wine_bucket", "wine_cooler"], "image_count": 11, "id": 1189, "frequency": "c", "synset": "wine_bucket.n.01"}, {"name": "wineglass", "instance_count": 4259, "def": "a glass that has a stem and in which wine is served", "synonyms": ["wineglass"], "image_count": 941, "id": 1190, "frequency": "f", "synset": "wineglass.n.01"}, {"name": "blinder_(for_horses)", "instance_count": 271, "def": "blinds that prevent a horse from seeing something on either side", "synonyms": ["blinder_(for_horses)"], "image_count": 113, "id": 1191, "frequency": "f", "synset": "winker.n.02"}, {"name": "wok", "instance_count": 60, "def": "pan with a convex bottom; used for frying in Chinese cooking", "synonyms": ["wok"], "image_count": 26, "id": 1192, "frequency": "c", "synset": "wok.n.01"}, {"name": "wolf", "instance_count": 16, "def": "a wild carnivorous mammal of the dog family, living and hunting in packs", "synonyms": ["wolf"], "image_count": 5, "id": 1193, "frequency": "r", "synset": "wolf.n.01"}, {"name": "wooden_spoon", "instance_count": 123, "def": "a spoon made of wood", "synonyms": ["wooden_spoon"], "image_count": 56, "id": 1194, "frequency": "c", "synset": "wooden_spoon.n.02"}, {"name": "wreath", "instance_count": 119, "def": "an arrangement of flowers, leaves, or stems fastened in a ring", "synonyms": ["wreath"], "image_count": 73, "id": 1195, "frequency": "c", "synset": "wreath.n.01"}, {"name": "wrench", "instance_count": 80, "def": "a hand tool that is used to hold or twist a nut or bolt", "synonyms": ["wrench", "spanner"], "image_count": 32, "id": 1196, "frequency": "c", "synset": "wrench.n.03"}, {"name": "wristband", "instance_count": 268, "def": "band consisting of a part of a sleeve that covers the wrist", "synonyms": ["wristband"], "image_count": 128, "id": 1197, "frequency": "f", "synset": "wristband.n.01"}, {"name": "wristlet", "instance_count": 1330, "def": "a band or bracelet worn around the wrist", "synonyms": ["wristlet", "wrist_band"], "image_count": 623, "id": 1198, "frequency": "f", "synset": "wristlet.n.01"}, {"name": "yacht", "instance_count": 50, "def": "an expensive vessel propelled by sail or power and used for cruising or racing", "synonyms": ["yacht"], "image_count": 12, "id": 1199, "frequency": "c", "synset": "yacht.n.01"}, {"name": "yogurt", "instance_count": 116, "def": "a custard-like food made from curdled milk", "synonyms": ["yogurt", "yoghurt", "yoghourt"], "image_count": 52, "id": 1200, "frequency": "c", "synset": "yogurt.n.01"}, {"name": "yoke_(animal_equipment)", "instance_count": 20, "def": "gear joining two animals at the neck; NOT egg yolk", "synonyms": ["yoke_(animal_equipment)"], "image_count": 11, "id": 1201, "frequency": "c", "synset": "yoke.n.07"}, {"name": "zebra", "instance_count": 5443, "def": "any of several fleet black-and-white striped African equines", "synonyms": ["zebra"], "image_count": 1674, "id": 1202, "frequency": "f", "synset": "zebra.n.01"}, {"name": "zucchini", "instance_count": 798, "def": "small cucumber-shaped vegetable marrow; typically dark green", "synonyms": ["zucchini", "courgette"], "image_count": 81, "id": 1203, "frequency": "c", "synset": "zucchini.n.02"}] \ No newline at end of file diff --git a/dimos/models/Detic/datasets/metadata/o365_clip_a+cnamefix.npy b/dimos/models/Detic/datasets/metadata/o365_clip_a+cnamefix.npy deleted file mode 100644 index 64a2e43c4b..0000000000 Binary files a/dimos/models/Detic/datasets/metadata/o365_clip_a+cnamefix.npy and /dev/null differ diff --git a/dimos/models/Detic/datasets/metadata/oid_clip_a+cname.npy b/dimos/models/Detic/datasets/metadata/oid_clip_a+cname.npy deleted file mode 100644 index 1a2c953b8d..0000000000 Binary files a/dimos/models/Detic/datasets/metadata/oid_clip_a+cname.npy and /dev/null differ diff --git a/dimos/models/Detic/demo.py b/dimos/models/Detic/demo.py deleted file mode 100755 index e982f745a5..0000000000 --- a/dimos/models/Detic/demo.py +++ /dev/null @@ -1,228 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import glob -import multiprocessing as mp -import os -import sys -import tempfile -import time -import warnings - -import cv2 -from detectron2.config import get_cfg -from detectron2.data.detection_utils import read_image -from detectron2.utils.logger import setup_logger -import mss -import numpy as np -import tqdm - -sys.path.insert(0, "third_party/CenterNet2/") -from centernet.config import add_centernet_config -from detic.config import add_detic_config -from detic.predictor import VisualizationDemo - - -# Fake a video capture object OpenCV style - half width, half height of first screen using MSS -class ScreenGrab: - def __init__(self) -> None: - self.sct = mss.mss() - m0 = self.sct.monitors[0] - self.monitor = {"top": 0, "left": 0, "width": m0["width"] / 2, "height": m0["height"] / 2} - - def read(self): - img = np.array(self.sct.grab(self.monitor)) - nf = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR) - return (True, nf) - - def isOpened(self) -> bool: - return True - - def release(self) -> bool: - return True - - -# constants -WINDOW_NAME = "Detic" - - -def setup_cfg(args): - cfg = get_cfg() - if args.cpu: - cfg.MODEL.DEVICE = "cpu" - add_centernet_config(cfg) - add_detic_config(cfg) - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - # Set score_threshold for builtin models - cfg.MODEL.RETINANET.SCORE_THRESH_TEST = args.confidence_threshold - cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = args.confidence_threshold - cfg.MODEL.PANOPTIC_FPN.COMBINE.INSTANCES_CONFIDENCE_THRESH = args.confidence_threshold - cfg.MODEL.ROI_BOX_HEAD.ZEROSHOT_WEIGHT_PATH = "rand" # load later - if not args.pred_all_class: - cfg.MODEL.ROI_HEADS.ONE_CLASS_PER_PROPOSAL = True - cfg.freeze() - return cfg - - -def get_parser(): - parser = argparse.ArgumentParser(description="Detectron2 demo for builtin configs") - parser.add_argument( - "--config-file", - default="configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml", - metavar="FILE", - help="path to config file", - ) - parser.add_argument("--webcam", help="Take inputs from webcam.") - parser.add_argument("--cpu", action="store_true", help="Use CPU only.") - parser.add_argument("--video-input", help="Path to video file.") - parser.add_argument( - "--input", - nargs="+", - help="A list of space separated input images; or a single glob pattern such as 'directory/*.jpg'", - ) - parser.add_argument( - "--output", - help="A file or directory to save output visualizations. If not given, will show output in an OpenCV window.", - ) - parser.add_argument( - "--vocabulary", - default="lvis", - choices=["lvis", "openimages", "objects365", "coco", "custom"], - help="", - ) - parser.add_argument( - "--custom_vocabulary", - default="", - help="", - ) - parser.add_argument("--pred_all_class", action="store_true") - parser.add_argument( - "--confidence-threshold", - type=float, - default=0.5, - help="Minimum score for instance predictions to be shown", - ) - parser.add_argument( - "--opts", - help="Modify config options using the command-line 'KEY VALUE' pairs", - default=[], - nargs=argparse.REMAINDER, - ) - return parser - - -def test_opencv_video_format(codec, file_ext) -> bool: - with tempfile.TemporaryDirectory(prefix="video_format_test") as dir: - filename = os.path.join(dir, "test_file" + file_ext) - writer = cv2.VideoWriter( - filename=filename, - fourcc=cv2.VideoWriter_fourcc(*codec), - fps=float(30), - frameSize=(10, 10), - isColor=True, - ) - [writer.write(np.zeros((10, 10, 3), np.uint8)) for _ in range(30)] - writer.release() - if os.path.isfile(filename): - return True - return False - - -if __name__ == "__main__": - mp.set_start_method("spawn", force=True) - args = get_parser().parse_args() - setup_logger(name="fvcore") - logger = setup_logger() - logger.info("Arguments: " + str(args)) - - cfg = setup_cfg(args) - - demo = VisualizationDemo(cfg, args) - - if args.input: - if len(args.input) == 1: - args.input = glob.glob(os.path.expanduser(args.input[0])) - assert args.input, "The input path(s) was not found" - for path in tqdm.tqdm(args.input, disable=not args.output): - img = read_image(path, format="BGR") - start_time = time.time() - predictions, visualized_output = demo.run_on_image(img) - logger.info( - "{}: {} in {:.2f}s".format( - path, - "detected {} instances".format(len(predictions["instances"])) - if "instances" in predictions - else "finished", - time.time() - start_time, - ) - ) - - if args.output: - if os.path.isdir(args.output): - assert os.path.isdir(args.output), args.output - out_filename = os.path.join(args.output, os.path.basename(path)) - else: - assert len(args.input) == 1, "Please specify a directory with args.output" - out_filename = args.output - visualized_output.save(out_filename) - else: - cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL) - cv2.imshow(WINDOW_NAME, visualized_output.get_image()[:, :, ::-1]) - if cv2.waitKey(0) == 27: - break # esc to quit - elif args.webcam: - assert args.input is None, "Cannot have both --input and --webcam!" - assert args.output is None, "output not yet supported with --webcam!" - if args.webcam == "screen": - cam = ScreenGrab() - else: - cam = cv2.VideoCapture(int(args.webcam)) - for vis in tqdm.tqdm(demo.run_on_video(cam)): - cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL) - cv2.imshow(WINDOW_NAME, vis) - if cv2.waitKey(1) == 27: - break # esc to quit - cam.release() - cv2.destroyAllWindows() - elif args.video_input: - video = cv2.VideoCapture(args.video_input) - width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) - height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) - frames_per_second = video.get(cv2.CAP_PROP_FPS) - num_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) - basename = os.path.basename(args.video_input) - codec, file_ext = ( - ("x264", ".mkv") if test_opencv_video_format("x264", ".mkv") else ("mp4v", ".mp4") - ) - if codec == ".mp4v": - warnings.warn("x264 codec not available, switching to mp4v", stacklevel=2) - if args.output: - if os.path.isdir(args.output): - output_fname = os.path.join(args.output, basename) - output_fname = os.path.splitext(output_fname)[0] + file_ext - else: - output_fname = args.output - assert not os.path.isfile(output_fname), output_fname - output_file = cv2.VideoWriter( - filename=output_fname, - # some installation of opencv may not support x264 (due to its license), - # you can try other format (e.g. MPEG) - fourcc=cv2.VideoWriter_fourcc(*codec), - fps=float(frames_per_second), - frameSize=(width, height), - isColor=True, - ) - assert os.path.isfile(args.video_input) - for vis_frame in tqdm.tqdm(demo.run_on_video(video), total=num_frames): - if args.output: - output_file.write(vis_frame) - else: - cv2.namedWindow(basename, cv2.WINDOW_NORMAL) - cv2.imshow(basename, vis_frame) - if cv2.waitKey(1) == 27: - break # esc to quit - video.release() - if args.output: - output_file.release() - else: - cv2.destroyAllWindows() diff --git a/dimos/models/Detic/detic/__init__.py b/dimos/models/Detic/detic/__init__.py deleted file mode 100644 index 2f8aa0a44e..0000000000 --- a/dimos/models/Detic/detic/__init__.py +++ /dev/null @@ -1,10 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from .data.datasets import cc, coco_zeroshot, imagenet, lvis_v1, objects365, oid -from .modeling.backbone import swintransformer, timm -from .modeling.meta_arch import custom_rcnn -from .modeling.roi_heads import detic_roi_heads, res5_roi_heads - -try: - from .modeling.meta_arch import d2_deformable_detr -except: - pass diff --git a/dimos/models/Detic/detic/config.py b/dimos/models/Detic/detic/config.py deleted file mode 100644 index c053f0bd06..0000000000 --- a/dimos/models/Detic/detic/config.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from detectron2.config import CfgNode as CN - - -def add_detic_config(cfg) -> None: - _C = cfg - - _C.WITH_IMAGE_LABELS = False # Turn on co-training with classification data - - # Open-vocabulary classifier - _C.MODEL.ROI_BOX_HEAD.USE_ZEROSHOT_CLS = ( - False # Use fixed classifier for open-vocabulary detection - ) - _C.MODEL.ROI_BOX_HEAD.ZEROSHOT_WEIGHT_PATH = "datasets/metadata/lvis_v1_clip_a+cname.npy" - _C.MODEL.ROI_BOX_HEAD.ZEROSHOT_WEIGHT_DIM = 512 - _C.MODEL.ROI_BOX_HEAD.NORM_WEIGHT = True - _C.MODEL.ROI_BOX_HEAD.NORM_TEMP = 50.0 - _C.MODEL.ROI_BOX_HEAD.IGNORE_ZERO_CATS = False - _C.MODEL.ROI_BOX_HEAD.USE_BIAS = 0.0 # >= 0: not use - - _C.MODEL.ROI_BOX_HEAD.MULT_PROPOSAL_SCORE = False # CenterNet2 - _C.MODEL.ROI_BOX_HEAD.USE_SIGMOID_CE = False - _C.MODEL.ROI_BOX_HEAD.PRIOR_PROB = 0.01 - _C.MODEL.ROI_BOX_HEAD.USE_FED_LOSS = False # Federated Loss - _C.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH = "datasets/metadata/lvis_v1_train_cat_info.json" - _C.MODEL.ROI_BOX_HEAD.FED_LOSS_NUM_CAT = 50 - _C.MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT = 0.5 - - # Classification data configs - _C.MODEL.ROI_BOX_HEAD.IMAGE_LABEL_LOSS = "max_size" # max, softmax, sum - _C.MODEL.ROI_BOX_HEAD.IMAGE_LOSS_WEIGHT = 0.1 - _C.MODEL.ROI_BOX_HEAD.IMAGE_BOX_SIZE = 1.0 - _C.MODEL.ROI_BOX_HEAD.ADD_IMAGE_BOX = False # Used for image-box loss and caption loss - _C.MODEL.ROI_BOX_HEAD.WS_NUM_PROPS = 128 # num proposals for image-labeled data - _C.MODEL.ROI_BOX_HEAD.WITH_SOFTMAX_PROP = False # Used for WSDDN - _C.MODEL.ROI_BOX_HEAD.CAPTION_WEIGHT = 1.0 # Caption loss weight - _C.MODEL.ROI_BOX_HEAD.NEG_CAP_WEIGHT = 0.125 # Caption loss hyper-parameter - _C.MODEL.ROI_BOX_HEAD.ADD_FEATURE_TO_PROP = False # Used for WSDDN - _C.MODEL.ROI_BOX_HEAD.SOFTMAX_WEAK_LOSS = False # Used when USE_SIGMOID_CE is False - - _C.MODEL.ROI_HEADS.MASK_WEIGHT = 1.0 - _C.MODEL.ROI_HEADS.ONE_CLASS_PER_PROPOSAL = False # For demo only - - # Caption losses - _C.MODEL.CAP_BATCH_RATIO = 4 # Ratio between detection data and caption data - _C.MODEL.WITH_CAPTION = False - _C.MODEL.SYNC_CAPTION_BATCH = False # synchronize across GPUs to enlarge # "classes" - - # dynamic class sampling when training with 21K classes - _C.MODEL.DYNAMIC_CLASSIFIER = False - _C.MODEL.NUM_SAMPLE_CATS = 50 - - # Different classifiers in testing, used in cross-dataset evaluation - _C.MODEL.RESET_CLS_TESTS = False - _C.MODEL.TEST_CLASSIFIERS = [] - _C.MODEL.TEST_NUM_CLASSES = [] - - # Backbones - _C.MODEL.SWIN = CN() - _C.MODEL.SWIN.SIZE = "T" # 'T', 'S', 'B' - _C.MODEL.SWIN.USE_CHECKPOINT = False - _C.MODEL.SWIN.OUT_FEATURES = (1, 2, 3) # FPN stride 8 - 32 - - _C.MODEL.TIMM = CN() - _C.MODEL.TIMM.BASE_NAME = "resnet50" - _C.MODEL.TIMM.OUT_LEVELS = (3, 4, 5) - _C.MODEL.TIMM.NORM = "FrozenBN" - _C.MODEL.TIMM.FREEZE_AT = 0 - _C.MODEL.TIMM.PRETRAINED = False - _C.MODEL.DATASET_LOSS_WEIGHT = [] - - # Multi-dataset dataloader - _C.DATALOADER.DATASET_RATIO = [1, 1] # sample ratio - _C.DATALOADER.USE_RFS = [False, False] - _C.DATALOADER.MULTI_DATASET_GROUPING = False # Always true when multi-dataset is enabled - _C.DATALOADER.DATASET_ANN = ["box", "box"] # Annotation type of each dataset - _C.DATALOADER.USE_DIFF_BS_SIZE = False # Use different batchsize for each dataset - _C.DATALOADER.DATASET_BS = [8, 32] # Used when USE_DIFF_BS_SIZE is on - _C.DATALOADER.DATASET_INPUT_SIZE = [896, 384] # Used when USE_DIFF_BS_SIZE is on - _C.DATALOADER.DATASET_INPUT_SCALE = [(0.1, 2.0), (0.5, 1.5)] # Used when USE_DIFF_BS_SIZE is on - _C.DATALOADER.DATASET_MIN_SIZES = [(640, 800), (320, 400)] # Used when USE_DIFF_BS_SIZE is on - _C.DATALOADER.DATASET_MAX_SIZES = [1333, 667] # Used when USE_DIFF_BS_SIZE is on - _C.DATALOADER.USE_TAR_DATASET = False # for ImageNet-21K, directly reading from unziped files - _C.DATALOADER.TARFILE_PATH = "datasets/imagenet/metadata-22k/tar_files.npy" - _C.DATALOADER.TAR_INDEX_DIR = "datasets/imagenet/metadata-22k/tarindex_npy" - - _C.SOLVER.USE_CUSTOM_SOLVER = False - _C.SOLVER.OPTIMIZER = "SGD" - _C.SOLVER.BACKBONE_MULTIPLIER = 1.0 # Used in DETR - _C.SOLVER.CUSTOM_MULTIPLIER = 1.0 # Used in DETR - _C.SOLVER.CUSTOM_MULTIPLIER_NAME = [] # Used in DETR - - # Deformable DETR - _C.MODEL.DETR = CN() - _C.MODEL.DETR.NUM_CLASSES = 80 - _C.MODEL.DETR.FROZEN_WEIGHTS = "" # For Segmentation - _C.MODEL.DETR.GIOU_WEIGHT = 2.0 - _C.MODEL.DETR.L1_WEIGHT = 5.0 - _C.MODEL.DETR.DEEP_SUPERVISION = True - _C.MODEL.DETR.NO_OBJECT_WEIGHT = 0.1 - _C.MODEL.DETR.CLS_WEIGHT = 2.0 - _C.MODEL.DETR.NUM_FEATURE_LEVELS = 4 - _C.MODEL.DETR.TWO_STAGE = False - _C.MODEL.DETR.WITH_BOX_REFINE = False - _C.MODEL.DETR.FOCAL_ALPHA = 0.25 - _C.MODEL.DETR.NHEADS = 8 - _C.MODEL.DETR.DROPOUT = 0.1 - _C.MODEL.DETR.DIM_FEEDFORWARD = 2048 - _C.MODEL.DETR.ENC_LAYERS = 6 - _C.MODEL.DETR.DEC_LAYERS = 6 - _C.MODEL.DETR.PRE_NORM = False - _C.MODEL.DETR.HIDDEN_DIM = 256 - _C.MODEL.DETR.NUM_OBJECT_QUERIES = 100 - - _C.MODEL.DETR.USE_FED_LOSS = False - _C.MODEL.DETR.WEAK_WEIGHT = 0.1 - - _C.INPUT.CUSTOM_AUG = "" - _C.INPUT.TRAIN_SIZE = 640 - _C.INPUT.TEST_SIZE = 640 - _C.INPUT.SCALE_RANGE = (0.1, 2.0) - # 'default' for fixed short/ long edge, 'square' for max size=INPUT.SIZE - _C.INPUT.TEST_INPUT_TYPE = "default" - - _C.FIND_UNUSED_PARAM = True - _C.EVAL_PRED_AR = False - _C.EVAL_PROPOSAL_AR = False - _C.EVAL_CAT_SPEC_AR = False - _C.IS_DEBUG = False - _C.QUICK_DEBUG = False - _C.FP16 = False - _C.EVAL_AP_FIX = False - _C.GEN_PSEDO_LABELS = False - _C.SAVE_DEBUG_PATH = "output/save_debug/" diff --git a/dimos/models/Detic/detic/custom_solver.py b/dimos/models/Detic/detic/custom_solver.py deleted file mode 100644 index a552dea0f1..0000000000 --- a/dimos/models/Detic/detic/custom_solver.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import itertools -from typing import Any, Dict, List, Set - -from detectron2.config import CfgNode -from detectron2.solver.build import maybe_add_gradient_clipping -import torch - - -def match_name_keywords(n, name_keywords): - out = False - for b in name_keywords: - if b in n: - out = True - break - return out - - -def build_custom_optimizer(cfg: CfgNode, model: torch.nn.Module) -> torch.optim.Optimizer: - """ - Build an optimizer from config. - """ - params: list[dict[str, Any]] = [] - memo: set[torch.nn.parameter.Parameter] = set() - custom_multiplier_name = cfg.SOLVER.CUSTOM_MULTIPLIER_NAME - optimizer_type = cfg.SOLVER.OPTIMIZER - for key, value in model.named_parameters(recurse=True): - if not value.requires_grad: - continue - # Avoid duplicating parameters - if value in memo: - continue - memo.add(value) - lr = cfg.SOLVER.BASE_LR - weight_decay = cfg.SOLVER.WEIGHT_DECAY - if "backbone" in key: - lr = lr * cfg.SOLVER.BACKBONE_MULTIPLIER - if match_name_keywords(key, custom_multiplier_name): - lr = lr * cfg.SOLVER.CUSTOM_MULTIPLIER - print("Costum LR", key, lr) - param = {"params": [value], "lr": lr} - if optimizer_type != "ADAMW": - param["weight_decay"] = weight_decay - params += [param] - - def maybe_add_full_model_gradient_clipping(optim): # optim: the optimizer class - # detectron2 doesn't have full model gradient clipping now - clip_norm_val = cfg.SOLVER.CLIP_GRADIENTS.CLIP_VALUE - enable = ( - cfg.SOLVER.CLIP_GRADIENTS.ENABLED - and cfg.SOLVER.CLIP_GRADIENTS.CLIP_TYPE == "full_model" - and clip_norm_val > 0.0 - ) - - class FullModelGradientClippingOptimizer(optim): - def step(self, closure=None) -> None: - all_params = itertools.chain(*[x["params"] for x in self.param_groups]) - torch.nn.utils.clip_grad_norm_(all_params, clip_norm_val) - super().step(closure=closure) - - return FullModelGradientClippingOptimizer if enable else optim - - if optimizer_type == "SGD": - optimizer = maybe_add_full_model_gradient_clipping(torch.optim.SGD)( - params, cfg.SOLVER.BASE_LR, momentum=cfg.SOLVER.MOMENTUM, nesterov=cfg.SOLVER.NESTEROV - ) - elif optimizer_type == "ADAMW": - optimizer = maybe_add_full_model_gradient_clipping(torch.optim.AdamW)( - params, cfg.SOLVER.BASE_LR, weight_decay=cfg.SOLVER.WEIGHT_DECAY - ) - else: - raise NotImplementedError(f"no optimizer type {optimizer_type}") - if not cfg.SOLVER.CLIP_GRADIENTS.CLIP_TYPE == "full_model": - optimizer = maybe_add_gradient_clipping(cfg, optimizer) - return optimizer diff --git a/dimos/models/Detic/detic/data/custom_build_augmentation.py b/dimos/models/Detic/detic/data/custom_build_augmentation.py deleted file mode 100644 index 5a6049ae02..0000000000 --- a/dimos/models/Detic/detic/data/custom_build_augmentation.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. - - -from detectron2.data import transforms as T - -from .transforms.custom_augmentation_impl import EfficientDetResizeCrop -from typing import Optional - - -def build_custom_augmentation(cfg, is_train: bool, scale=None, size: Optional[int]=None, min_size: Optional[int]=None, max_size: Optional[int]=None): - """ - Create a list of default :class:`Augmentation` from config. - Now it includes resizing and flipping. - - Returns: - list[Augmentation] - """ - if cfg.INPUT.CUSTOM_AUG == "ResizeShortestEdge": - if is_train: - min_size = cfg.INPUT.MIN_SIZE_TRAIN if min_size is None else min_size - max_size = cfg.INPUT.MAX_SIZE_TRAIN if max_size is None else max_size - sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING - else: - min_size = cfg.INPUT.MIN_SIZE_TEST - max_size = cfg.INPUT.MAX_SIZE_TEST - sample_style = "choice" - augmentation = [T.ResizeShortestEdge(min_size, max_size, sample_style)] - elif cfg.INPUT.CUSTOM_AUG == "EfficientDetResizeCrop": - if is_train: - scale = cfg.INPUT.SCALE_RANGE if scale is None else scale - size = cfg.INPUT.TRAIN_SIZE if size is None else size - else: - scale = (1, 1) - size = cfg.INPUT.TEST_SIZE - augmentation = [EfficientDetResizeCrop(size, scale)] - else: - assert 0, cfg.INPUT.CUSTOM_AUG - - if is_train: - augmentation.append(T.RandomFlip()) - return augmentation - - -build_custom_transform_gen = build_custom_augmentation -""" -Alias for backward-compatibility. -""" diff --git a/dimos/models/Detic/detic/data/custom_dataset_dataloader.py b/dimos/models/Detic/detic/data/custom_dataset_dataloader.py deleted file mode 100644 index ff4bfc9ea4..0000000000 --- a/dimos/models/Detic/detic/data/custom_dataset_dataloader.py +++ /dev/null @@ -1,322 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -# Part of the code is from https://github.com/xingyizhou/UniDet/blob/master/projects/UniDet/unidet/data/multi_dataset_dataloader.py (Apache-2.0 License) -from collections import defaultdict -import itertools -import math -import operator -from typing import Iterator, Sequence, Optional - -from detectron2.config import configurable -from detectron2.data.build import ( - build_batch_data_loader, - check_metadata_consistency, - filter_images_with_few_keypoints, - filter_images_with_only_crowd_annotations, - get_detection_dataset_dicts, - print_instances_class_histogram, - worker_init_reset_seed, -) -from detectron2.data.catalog import DatasetCatalog, MetadataCatalog -from detectron2.data.common import DatasetFromList, MapDataset -from detectron2.data.dataset_mapper import DatasetMapper -from detectron2.data.samplers import RepeatFactorTrainingSampler, TrainingSampler -from detectron2.utils import comm -from detectron2.utils.comm import get_world_size -import torch -import torch.utils.data -from torch.utils.data.sampler import Sampler - - -def _custom_train_loader_from_config(cfg, mapper=None, *, dataset=None, sampler=None): - sampler_name = cfg.DATALOADER.SAMPLER_TRAIN - if "MultiDataset" in sampler_name: - dataset_dicts = get_detection_dataset_dicts_with_source( - cfg.DATASETS.TRAIN, - filter_empty=cfg.DATALOADER.FILTER_EMPTY_ANNOTATIONS, - min_keypoints=cfg.MODEL.ROI_KEYPOINT_HEAD.MIN_KEYPOINTS_PER_IMAGE - if cfg.MODEL.KEYPOINT_ON - else 0, - proposal_files=cfg.DATASETS.PROPOSAL_FILES_TRAIN if cfg.MODEL.LOAD_PROPOSALS else None, - ) - else: - dataset_dicts = get_detection_dataset_dicts( - cfg.DATASETS.TRAIN, - filter_empty=cfg.DATALOADER.FILTER_EMPTY_ANNOTATIONS, - min_keypoints=cfg.MODEL.ROI_KEYPOINT_HEAD.MIN_KEYPOINTS_PER_IMAGE - if cfg.MODEL.KEYPOINT_ON - else 0, - proposal_files=cfg.DATASETS.PROPOSAL_FILES_TRAIN if cfg.MODEL.LOAD_PROPOSALS else None, - ) - - if mapper is None: - mapper = DatasetMapper(cfg, True) - - if sampler is not None: - pass - elif sampler_name == "TrainingSampler": - sampler = TrainingSampler(len(dataset)) - elif sampler_name == "MultiDatasetSampler": - sampler = MultiDatasetSampler( - dataset_dicts, - dataset_ratio=cfg.DATALOADER.DATASET_RATIO, - use_rfs=cfg.DATALOADER.USE_RFS, - dataset_ann=cfg.DATALOADER.DATASET_ANN, - repeat_threshold=cfg.DATALOADER.REPEAT_THRESHOLD, - ) - elif sampler_name == "RepeatFactorTrainingSampler": - repeat_factors = RepeatFactorTrainingSampler.repeat_factors_from_category_frequency( - dataset_dicts, cfg.DATALOADER.REPEAT_THRESHOLD - ) - sampler = RepeatFactorTrainingSampler(repeat_factors) - else: - raise ValueError(f"Unknown training sampler: {sampler_name}") - - return { - "dataset": dataset_dicts, - "sampler": sampler, - "mapper": mapper, - "total_batch_size": cfg.SOLVER.IMS_PER_BATCH, - "aspect_ratio_grouping": cfg.DATALOADER.ASPECT_RATIO_GROUPING, - "num_workers": cfg.DATALOADER.NUM_WORKERS, - "multi_dataset_grouping": cfg.DATALOADER.MULTI_DATASET_GROUPING, - "use_diff_bs_size": cfg.DATALOADER.USE_DIFF_BS_SIZE, - "dataset_bs": cfg.DATALOADER.DATASET_BS, - "num_datasets": len(cfg.DATASETS.TRAIN), - } - - -@configurable(from_config=_custom_train_loader_from_config) -def build_custom_train_loader( - dataset, - *, - mapper, - sampler, - total_batch_size: int=16, - aspect_ratio_grouping: bool=True, - num_workers: int=0, - num_datasets: int=1, - multi_dataset_grouping: bool=False, - use_diff_bs_size: bool=False, - dataset_bs=None, -): - """ - Modified from detectron2.data.build.build_custom_train_loader, but supports - different samplers - """ - if dataset_bs is None: - dataset_bs = [] - if isinstance(dataset, list): - dataset = DatasetFromList(dataset, copy=False) - if mapper is not None: - dataset = MapDataset(dataset, mapper) - if sampler is None: - sampler = TrainingSampler(len(dataset)) - assert isinstance(sampler, torch.utils.data.sampler.Sampler) - if multi_dataset_grouping: - return build_multi_dataset_batch_data_loader( - use_diff_bs_size, - dataset_bs, - dataset, - sampler, - total_batch_size, - num_datasets=num_datasets, - num_workers=num_workers, - ) - else: - return build_batch_data_loader( - dataset, - sampler, - total_batch_size, - aspect_ratio_grouping=aspect_ratio_grouping, - num_workers=num_workers, - ) - - -def build_multi_dataset_batch_data_loader( - use_diff_bs_size: int, dataset_bs, dataset, sampler, total_batch_size: int, num_datasets: int, num_workers: int=0 -): - """ """ - world_size = get_world_size() - assert total_batch_size > 0 and total_batch_size % world_size == 0, ( - f"Total batch size ({total_batch_size}) must be divisible by the number of gpus ({world_size})." - ) - - batch_size = total_batch_size // world_size - data_loader = torch.utils.data.DataLoader( - dataset, - sampler=sampler, - num_workers=num_workers, - batch_sampler=None, - collate_fn=operator.itemgetter(0), # don't batch, but yield individual elements - worker_init_fn=worker_init_reset_seed, - ) # yield individual mapped dict - if use_diff_bs_size: - return DIFFMDAspectRatioGroupedDataset(data_loader, dataset_bs, num_datasets) - else: - return MDAspectRatioGroupedDataset(data_loader, batch_size, num_datasets) - - -def get_detection_dataset_dicts_with_source( - dataset_names: Sequence[str], filter_empty: bool=True, min_keypoints: int=0, proposal_files=None -): - assert len(dataset_names) - dataset_dicts = [DatasetCatalog.get(dataset_name) for dataset_name in dataset_names] - for dataset_name, dicts in zip(dataset_names, dataset_dicts, strict=False): - assert len(dicts), f"Dataset '{dataset_name}' is empty!" - - for source_id, (dataset_name, dicts) in enumerate(zip(dataset_names, dataset_dicts, strict=False)): - assert len(dicts), f"Dataset '{dataset_name}' is empty!" - for d in dicts: - d["dataset_source"] = source_id - - if "annotations" in dicts[0]: - try: - class_names = MetadataCatalog.get(dataset_name).thing_classes - check_metadata_consistency("thing_classes", dataset_name) - print_instances_class_histogram(dicts, class_names) - except AttributeError: # class names are not available for this dataset - pass - - assert proposal_files is None - - dataset_dicts = list(itertools.chain.from_iterable(dataset_dicts)) - - has_instances = "annotations" in dataset_dicts[0] - if filter_empty and has_instances: - dataset_dicts = filter_images_with_only_crowd_annotations(dataset_dicts) - if min_keypoints > 0 and has_instances: - dataset_dicts = filter_images_with_few_keypoints(dataset_dicts, min_keypoints) - - return dataset_dicts - - -class MultiDatasetSampler(Sampler): - def __init__( - self, - dataset_dicts, - dataset_ratio, - use_rfs, - dataset_ann, - repeat_threshold: float=0.001, - seed: int | None = None, - ) -> None: - """ """ - sizes = [0 for _ in range(len(dataset_ratio))] - for d in dataset_dicts: - sizes[d["dataset_source"]] += 1 - print("dataset sizes", sizes) - self.sizes = sizes - assert len(dataset_ratio) == len(sizes), ( - f"length of dataset ratio {len(dataset_ratio)} should be equal to number if dataset {len(sizes)}" - ) - if seed is None: - seed = comm.shared_random_seed() - self._seed = int(seed) - self._rank = comm.get_rank() - self._world_size = comm.get_world_size() - - self.dataset_ids = torch.tensor( - [d["dataset_source"] for d in dataset_dicts], dtype=torch.long - ) - - dataset_weight = [ - torch.ones(s) * max(sizes) / s * r / sum(dataset_ratio) - for i, (r, s) in enumerate(zip(dataset_ratio, sizes, strict=False)) - ] - dataset_weight = torch.cat(dataset_weight) - - rfs_factors = [] - st = 0 - for i, s in enumerate(sizes): - if use_rfs[i]: - if dataset_ann[i] == "box": - rfs_func = RepeatFactorTrainingSampler.repeat_factors_from_category_frequency - else: - rfs_func = repeat_factors_from_tag_frequency - rfs_factor = rfs_func(dataset_dicts[st : st + s], repeat_thresh=repeat_threshold) - rfs_factor = rfs_factor * (s / rfs_factor.sum()) - else: - rfs_factor = torch.ones(s) - rfs_factors.append(rfs_factor) - st = st + s - rfs_factors = torch.cat(rfs_factors) - - self.weights = dataset_weight * rfs_factors - self.sample_epoch_size = len(self.weights) - - def __iter__(self) -> Iterator: - start = self._rank - yield from itertools.islice(self._infinite_indices(), start, None, self._world_size) - - def _infinite_indices(self): - g = torch.Generator() - g.manual_seed(self._seed) - while True: - ids = torch.multinomial( - self.weights, self.sample_epoch_size, generator=g, replacement=True - ) - [(self.dataset_ids[ids] == i).sum().int().item() for i in range(len(self.sizes))] - yield from ids - - -class MDAspectRatioGroupedDataset(torch.utils.data.IterableDataset): - def __init__(self, dataset, batch_size: int, num_datasets: int) -> None: - """ """ - self.dataset = dataset - self.batch_size = batch_size - self._buckets = [[] for _ in range(2 * num_datasets)] - - def __iter__(self) -> Iterator: - for d in self.dataset: - w, h = d["width"], d["height"] - aspect_ratio_bucket_id = 0 if w > h else 1 - bucket_id = d["dataset_source"] * 2 + aspect_ratio_bucket_id - bucket = self._buckets[bucket_id] - bucket.append(d) - if len(bucket) == self.batch_size: - yield bucket[:] - del bucket[:] - - -class DIFFMDAspectRatioGroupedDataset(torch.utils.data.IterableDataset): - def __init__(self, dataset, batch_sizes: Sequence[int], num_datasets: int) -> None: - """ """ - self.dataset = dataset - self.batch_sizes = batch_sizes - self._buckets = [[] for _ in range(2 * num_datasets)] - - def __iter__(self) -> Iterator: - for d in self.dataset: - w, h = d["width"], d["height"] - aspect_ratio_bucket_id = 0 if w > h else 1 - bucket_id = d["dataset_source"] * 2 + aspect_ratio_bucket_id - bucket = self._buckets[bucket_id] - bucket.append(d) - if len(bucket) == self.batch_sizes[d["dataset_source"]]: - yield bucket[:] - del bucket[:] - - -def repeat_factors_from_tag_frequency(dataset_dicts, repeat_thresh): - """ """ - category_freq = defaultdict(int) - for dataset_dict in dataset_dicts: - cat_ids = dataset_dict["pos_category_ids"] - for cat_id in cat_ids: - category_freq[cat_id] += 1 - num_images = len(dataset_dicts) - for k, v in category_freq.items(): - category_freq[k] = v / num_images - - category_rep = { - cat_id: max(1.0, math.sqrt(repeat_thresh / cat_freq)) - for cat_id, cat_freq in category_freq.items() - } - - rep_factors = [] - for dataset_dict in dataset_dicts: - cat_ids = dataset_dict["pos_category_ids"] - rep_factor = max({category_rep[cat_id] for cat_id in cat_ids}, default=1.0) - rep_factors.append(rep_factor) - - return torch.tensor(rep_factors, dtype=torch.float32) diff --git a/dimos/models/Detic/detic/data/custom_dataset_mapper.py b/dimos/models/Detic/detic/data/custom_dataset_mapper.py deleted file mode 100644 index 46c86ffd84..0000000000 --- a/dimos/models/Detic/detic/data/custom_dataset_mapper.py +++ /dev/null @@ -1,284 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import copy -import logging - -from detectron2.config import configurable -from detectron2.data import detection_utils as utils, transforms as T -from detectron2.data.dataset_mapper import DatasetMapper -import numpy as np -import torch - -from .custom_build_augmentation import build_custom_augmentation -from .tar_dataset import DiskTarDataset - -__all__ = ["CustomDatasetMapper"] - - -class CustomDatasetMapper(DatasetMapper): - @configurable - def __init__( - self, - is_train: bool, - with_ann_type: bool=False, - dataset_ann=None, - use_diff_bs_size: bool=False, - dataset_augs=None, - is_debug: bool=False, - use_tar_dataset: bool=False, - tarfile_path: str="", - tar_index_dir: str="", - **kwargs, - ) -> None: - """ - add image labels - """ - if dataset_augs is None: - dataset_augs = [] - if dataset_ann is None: - dataset_ann = [] - self.with_ann_type = with_ann_type - self.dataset_ann = dataset_ann - self.use_diff_bs_size = use_diff_bs_size - if self.use_diff_bs_size and is_train: - self.dataset_augs = [T.AugmentationList(x) for x in dataset_augs] - self.is_debug = is_debug - self.use_tar_dataset = use_tar_dataset - if self.use_tar_dataset: - print("Using tar dataset") - self.tar_dataset = DiskTarDataset(tarfile_path, tar_index_dir) - super().__init__(is_train, **kwargs) - - @classmethod - def from_config(cls, cfg, is_train: bool = True): - ret = super().from_config(cfg, is_train) - ret.update( - { - "with_ann_type": cfg.WITH_IMAGE_LABELS, - "dataset_ann": cfg.DATALOADER.DATASET_ANN, - "use_diff_bs_size": cfg.DATALOADER.USE_DIFF_BS_SIZE, - "is_debug": cfg.IS_DEBUG, - "use_tar_dataset": cfg.DATALOADER.USE_TAR_DATASET, - "tarfile_path": cfg.DATALOADER.TARFILE_PATH, - "tar_index_dir": cfg.DATALOADER.TAR_INDEX_DIR, - } - ) - if ret["use_diff_bs_size"] and is_train: - if cfg.INPUT.CUSTOM_AUG == "EfficientDetResizeCrop": - dataset_scales = cfg.DATALOADER.DATASET_INPUT_SCALE - dataset_sizes = cfg.DATALOADER.DATASET_INPUT_SIZE - ret["dataset_augs"] = [ - build_custom_augmentation(cfg, True, scale, size) - for scale, size in zip(dataset_scales, dataset_sizes, strict=False) - ] - else: - assert cfg.INPUT.CUSTOM_AUG == "ResizeShortestEdge" - min_sizes = cfg.DATALOADER.DATASET_MIN_SIZES - max_sizes = cfg.DATALOADER.DATASET_MAX_SIZES - ret["dataset_augs"] = [ - build_custom_augmentation(cfg, True, min_size=mi, max_size=ma) - for mi, ma in zip(min_sizes, max_sizes, strict=False) - ] - else: - ret["dataset_augs"] = [] - - return ret - - def __call__(self, dataset_dict): - """ - include image labels - """ - dataset_dict = copy.deepcopy(dataset_dict) # it will be modified by code below - # USER: Write your own image loading if it's not from a file - if "file_name" in dataset_dict: - ori_image = utils.read_image(dataset_dict["file_name"], format=self.image_format) - else: - ori_image, _, _ = self.tar_dataset[dataset_dict["tar_index"]] - ori_image = utils._apply_exif_orientation(ori_image) - ori_image = utils.convert_PIL_to_numpy(ori_image, self.image_format) - utils.check_image_size(dataset_dict, ori_image) - - # USER: Remove if you don't do semantic/panoptic segmentation. - if "sem_seg_file_name" in dataset_dict: - sem_seg_gt = utils.read_image(dataset_dict.pop("sem_seg_file_name"), "L").squeeze(2) - else: - sem_seg_gt = None - - if self.is_debug: - dataset_dict["dataset_source"] = 0 - - ( - "dataset_source" in dataset_dict - and self.with_ann_type - and self.dataset_ann[dataset_dict["dataset_source"]] != "box" - ) - - aug_input = T.AugInput(copy.deepcopy(ori_image), sem_seg=sem_seg_gt) - if self.use_diff_bs_size and self.is_train: - transforms = self.dataset_augs[dataset_dict["dataset_source"]](aug_input) - else: - transforms = self.augmentations(aug_input) - image, sem_seg_gt = aug_input.image, aug_input.sem_seg - - image_shape = image.shape[:2] # h, w - dataset_dict["image"] = torch.as_tensor(np.ascontiguousarray(image.transpose(2, 0, 1))) - - if sem_seg_gt is not None: - dataset_dict["sem_seg"] = torch.as_tensor(sem_seg_gt.astype("long")) - - # USER: Remove if you don't use pre-computed proposals. - # Most users would not need this feature. - if self.proposal_topk is not None: - utils.transform_proposals( - dataset_dict, image_shape, transforms, proposal_topk=self.proposal_topk - ) - - if not self.is_train: - # USER: Modify this if you want to keep them for some reason. - dataset_dict.pop("annotations", None) - dataset_dict.pop("sem_seg_file_name", None) - return dataset_dict - - if "annotations" in dataset_dict: - # USER: Modify this if you want to keep them for some reason. - for anno in dataset_dict["annotations"]: - if not self.use_instance_mask: - anno.pop("segmentation", None) - if not self.use_keypoint: - anno.pop("keypoints", None) - - # USER: Implement additional transformations if you have other types of data - all_annos = [ - ( - utils.transform_instance_annotations( - obj, - transforms, - image_shape, - keypoint_hflip_indices=self.keypoint_hflip_indices, - ), - obj.get("iscrowd", 0), - ) - for obj in dataset_dict.pop("annotations") - ] - annos = [ann[0] for ann in all_annos if ann[1] == 0] - instances = utils.annotations_to_instances( - annos, image_shape, mask_format=self.instance_mask_format - ) - - del all_annos - if self.recompute_boxes: - instances.gt_boxes = instances.gt_masks.get_bounding_boxes() - dataset_dict["instances"] = utils.filter_empty_instances(instances) - if self.with_ann_type: - dataset_dict["pos_category_ids"] = dataset_dict.get("pos_category_ids", []) - dataset_dict["ann_type"] = self.dataset_ann[dataset_dict["dataset_source"]] - if self.is_debug and ( - ("pos_category_ids" not in dataset_dict) or (dataset_dict["pos_category_ids"] == []) - ): - dataset_dict["pos_category_ids"] = [ - x for x in sorted(set(dataset_dict["instances"].gt_classes.tolist())) - ] - return dataset_dict - - -# DETR augmentation -def build_transform_gen(cfg, is_train: bool): - """ """ - if is_train: - min_size = cfg.INPUT.MIN_SIZE_TRAIN - max_size = cfg.INPUT.MAX_SIZE_TRAIN - sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING - else: - min_size = cfg.INPUT.MIN_SIZE_TEST - max_size = cfg.INPUT.MAX_SIZE_TEST - sample_style = "choice" - if sample_style == "range": - assert len(min_size) == 2, f"more than 2 ({len(min_size)}) min_size(s) are provided for ranges" - - logger = logging.getLogger(__name__) - tfm_gens = [] - if is_train: - tfm_gens.append(T.RandomFlip()) - tfm_gens.append(T.ResizeShortestEdge(min_size, max_size, sample_style)) - if is_train: - logger.info("TransformGens used in training: " + str(tfm_gens)) - return tfm_gens - - -class DetrDatasetMapper: - """ - A callable which takes a dataset dict in Detectron2 Dataset format, - and map it into a format used by DETR. - The callable currently does the following: - 1. Read the image from "file_name" - 2. Applies geometric transforms to the image and annotation - 3. Find and applies suitable cropping to the image and annotation - 4. Prepare image and annotation to Tensors - """ - - def __init__(self, cfg, is_train: bool=True) -> None: - if cfg.INPUT.CROP.ENABLED and is_train: - self.crop_gen = [ - T.ResizeShortestEdge([400, 500, 600], sample_style="choice"), - T.RandomCrop(cfg.INPUT.CROP.TYPE, cfg.INPUT.CROP.SIZE), - ] - else: - self.crop_gen = None - - self.mask_on = cfg.MODEL.MASK_ON - self.tfm_gens = build_transform_gen(cfg, is_train) - logging.getLogger(__name__).info( - f"Full TransformGens used in training: {self.tfm_gens!s}, crop: {self.crop_gen!s}" - ) - - self.img_format = cfg.INPUT.FORMAT - self.is_train = is_train - - def __call__(self, dataset_dict): - """ - Args: - dataset_dict (dict): Metadata of one image, in Detectron2 Dataset format. - Returns: - dict: a format that builtin models in detectron2 accept - """ - dataset_dict = copy.deepcopy(dataset_dict) # it will be modified by code below - image = utils.read_image(dataset_dict["file_name"], format=self.img_format) - utils.check_image_size(dataset_dict, image) - - if self.crop_gen is None: - image, transforms = T.apply_transform_gens(self.tfm_gens, image) - else: - if np.random.rand() > 0.5: - image, transforms = T.apply_transform_gens(self.tfm_gens, image) - else: - image, transforms = T.apply_transform_gens( - self.tfm_gens[:-1] + self.crop_gen + self.tfm_gens[-1:], image - ) - - image_shape = image.shape[:2] # h, w - - # Pytorch's dataloader is efficient on torch.Tensor due to shared-memory, - # but not efficient on large generic data structures due to the use of pickle & mp.Queue. - # Therefore it's important to use torch.Tensor. - dataset_dict["image"] = torch.as_tensor(np.ascontiguousarray(image.transpose(2, 0, 1))) - - if not self.is_train: - # USER: Modify this if you want to keep them for some reason. - dataset_dict.pop("annotations", None) - return dataset_dict - - if "annotations" in dataset_dict: - # USER: Modify this if you want to keep them for some reason. - for anno in dataset_dict["annotations"]: - if not self.mask_on: - anno.pop("segmentation", None) - anno.pop("keypoints", None) - - # USER: Implement additional transformations if you have other types of data - annos = [ - utils.transform_instance_annotations(obj, transforms, image_shape) - for obj in dataset_dict.pop("annotations") - if obj.get("iscrowd", 0) == 0 - ] - instances = utils.annotations_to_instances(annos, image_shape) - dataset_dict["instances"] = utils.filter_empty_instances(instances) - return dataset_dict diff --git a/dimos/models/Detic/detic/data/datasets/cc.py b/dimos/models/Detic/detic/data/datasets/cc.py deleted file mode 100644 index be9c7f4a8b..0000000000 --- a/dimos/models/Detic/detic/data/datasets/cc.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import os - -from detectron2.data.datasets.lvis import get_lvis_instances_meta - -from .lvis_v1 import custom_register_lvis_instances - -_CUSTOM_SPLITS = { - "cc3m_v1_val": ("cc3m/validation/", "cc3m/val_image_info.json"), - "cc3m_v1_train": ("cc3m/training/", "cc3m/train_image_info.json"), - "cc3m_v1_train_tags": ("cc3m/training/", "cc3m/train_image_info_tags.json"), -} - -for key, (image_root, json_file) in _CUSTOM_SPLITS.items(): - custom_register_lvis_instances( - key, - get_lvis_instances_meta("lvis_v1"), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/detic/data/datasets/coco_zeroshot.py b/dimos/models/Detic/detic/data/datasets/coco_zeroshot.py deleted file mode 100644 index 80c360593d..0000000000 --- a/dimos/models/Detic/detic/data/datasets/coco_zeroshot.py +++ /dev/null @@ -1,148 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import os - -from detectron2.data.datasets.builtin_meta import _get_builtin_metadata -from detectron2.data.datasets.register_coco import register_coco_instances - -from .lvis_v1 import custom_register_lvis_instances - -categories_seen = [ - {"id": 1, "name": "person"}, - {"id": 2, "name": "bicycle"}, - {"id": 3, "name": "car"}, - {"id": 4, "name": "motorcycle"}, - {"id": 7, "name": "train"}, - {"id": 8, "name": "truck"}, - {"id": 9, "name": "boat"}, - {"id": 15, "name": "bench"}, - {"id": 16, "name": "bird"}, - {"id": 19, "name": "horse"}, - {"id": 20, "name": "sheep"}, - {"id": 23, "name": "bear"}, - {"id": 24, "name": "zebra"}, - {"id": 25, "name": "giraffe"}, - {"id": 27, "name": "backpack"}, - {"id": 31, "name": "handbag"}, - {"id": 33, "name": "suitcase"}, - {"id": 34, "name": "frisbee"}, - {"id": 35, "name": "skis"}, - {"id": 38, "name": "kite"}, - {"id": 42, "name": "surfboard"}, - {"id": 44, "name": "bottle"}, - {"id": 48, "name": "fork"}, - {"id": 50, "name": "spoon"}, - {"id": 51, "name": "bowl"}, - {"id": 52, "name": "banana"}, - {"id": 53, "name": "apple"}, - {"id": 54, "name": "sandwich"}, - {"id": 55, "name": "orange"}, - {"id": 56, "name": "broccoli"}, - {"id": 57, "name": "carrot"}, - {"id": 59, "name": "pizza"}, - {"id": 60, "name": "donut"}, - {"id": 62, "name": "chair"}, - {"id": 65, "name": "bed"}, - {"id": 70, "name": "toilet"}, - {"id": 72, "name": "tv"}, - {"id": 73, "name": "laptop"}, - {"id": 74, "name": "mouse"}, - {"id": 75, "name": "remote"}, - {"id": 78, "name": "microwave"}, - {"id": 79, "name": "oven"}, - {"id": 80, "name": "toaster"}, - {"id": 82, "name": "refrigerator"}, - {"id": 84, "name": "book"}, - {"id": 85, "name": "clock"}, - {"id": 86, "name": "vase"}, - {"id": 90, "name": "toothbrush"}, -] - -categories_unseen = [ - {"id": 5, "name": "airplane"}, - {"id": 6, "name": "bus"}, - {"id": 17, "name": "cat"}, - {"id": 18, "name": "dog"}, - {"id": 21, "name": "cow"}, - {"id": 22, "name": "elephant"}, - {"id": 28, "name": "umbrella"}, - {"id": 32, "name": "tie"}, - {"id": 36, "name": "snowboard"}, - {"id": 41, "name": "skateboard"}, - {"id": 47, "name": "cup"}, - {"id": 49, "name": "knife"}, - {"id": 61, "name": "cake"}, - {"id": 63, "name": "couch"}, - {"id": 76, "name": "keyboard"}, - {"id": 81, "name": "sink"}, - {"id": 87, "name": "scissors"}, -] - - -def _get_metadata(cat): - if cat == "all": - return _get_builtin_metadata("coco") - elif cat == "seen": - id_to_name = {x["id"]: x["name"] for x in categories_seen} - else: - assert cat == "unseen" - id_to_name = {x["id"]: x["name"] for x in categories_unseen} - - thing_dataset_id_to_contiguous_id = {x: i for i, x in enumerate(sorted(id_to_name))} - thing_classes = [id_to_name[k] for k in sorted(id_to_name)] - return { - "thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id, - "thing_classes": thing_classes, - } - - -_PREDEFINED_SPLITS_COCO = { - "coco_zeroshot_train": ( - "coco/train2017", - "coco/zero-shot/instances_train2017_seen_2.json", - "seen", - ), - "coco_zeroshot_val": ( - "coco/val2017", - "coco/zero-shot/instances_val2017_unseen_2.json", - "unseen", - ), - "coco_not_zeroshot_val": ( - "coco/val2017", - "coco/zero-shot/instances_val2017_seen_2.json", - "seen", - ), - "coco_generalized_zeroshot_val": ( - "coco/val2017", - "coco/zero-shot/instances_val2017_all_2_oriorder.json", - "all", - ), - "coco_zeroshot_train_oriorder": ( - "coco/train2017", - "coco/zero-shot/instances_train2017_seen_2_oriorder.json", - "all", - ), -} - -for key, (image_root, json_file, cat) in _PREDEFINED_SPLITS_COCO.items(): - register_coco_instances( - key, - _get_metadata(cat), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) - -_CUSTOM_SPLITS_COCO = { - "cc3m_coco_train_tags": ("cc3m/training/", "cc3m/coco_train_image_info_tags.json"), - "coco_caption_train_tags": ( - "coco/train2017/", - "coco/annotations/captions_train2017_tags_allcaps.json", - ), -} - -for key, (image_root, json_file) in _CUSTOM_SPLITS_COCO.items(): - custom_register_lvis_instances( - key, - _get_builtin_metadata("coco"), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/detic/data/datasets/imagenet.py b/dimos/models/Detic/detic/data/datasets/imagenet.py deleted file mode 100644 index caa7aa8fe0..0000000000 --- a/dimos/models/Detic/detic/data/datasets/imagenet.py +++ /dev/null @@ -1,47 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import os - -from detectron2.data import DatasetCatalog, MetadataCatalog -from detectron2.data.datasets.lvis import get_lvis_instances_meta - -from .lvis_v1 import custom_load_lvis_json, get_lvis_22k_meta - - -def custom_register_imagenet_instances(name: str, metadata, json_file, image_root) -> None: - """ """ - DatasetCatalog.register(name, lambda: custom_load_lvis_json(json_file, image_root, name)) - MetadataCatalog.get(name).set( - json_file=json_file, image_root=image_root, evaluator_type="imagenet", **metadata - ) - - -_CUSTOM_SPLITS_IMAGENET = { - "imagenet_lvis_v1": ( - "imagenet/ImageNet-LVIS/", - "imagenet/annotations/imagenet_lvis_image_info.json", - ), -} - -for key, (image_root, json_file) in _CUSTOM_SPLITS_IMAGENET.items(): - custom_register_imagenet_instances( - key, - get_lvis_instances_meta("lvis_v1"), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) - - -_CUSTOM_SPLITS_IMAGENET_22K = { - "imagenet_lvis-22k": ( - "imagenet/ImageNet-LVIS/", - "imagenet/annotations/imagenet-22k_image_info_lvis-22k.json", - ), -} - -for key, (image_root, json_file) in _CUSTOM_SPLITS_IMAGENET_22K.items(): - custom_register_imagenet_instances( - key, - get_lvis_22k_meta(), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/detic/data/datasets/lvis_22k_categories.py b/dimos/models/Detic/detic/data/datasets/lvis_22k_categories.py deleted file mode 100644 index d1b3cc370a..0000000000 --- a/dimos/models/Detic/detic/data/datasets/lvis_22k_categories.py +++ /dev/null @@ -1,22383 +0,0 @@ -CATEGORIES = [ - {"name": "aerosol_can", "id": 1, "frequency": "c", "synset": "aerosol.n.02"}, - {"name": "air_conditioner", "id": 2, "frequency": "f", "synset": "air_conditioner.n.01"}, - {"name": "airplane", "id": 3, "frequency": "f", "synset": "airplane.n.01"}, - {"name": "alarm_clock", "id": 4, "frequency": "f", "synset": "alarm_clock.n.01"}, - {"name": "alcohol", "id": 5, "frequency": "c", "synset": "alcohol.n.01"}, - {"name": "alligator", "id": 6, "frequency": "c", "synset": "alligator.n.02"}, - {"name": "almond", "id": 7, "frequency": "c", "synset": "almond.n.02"}, - {"name": "ambulance", "id": 8, "frequency": "c", "synset": "ambulance.n.01"}, - {"name": "amplifier", "id": 9, "frequency": "c", "synset": "amplifier.n.01"}, - {"name": "anklet", "id": 10, "frequency": "c", "synset": "anklet.n.03"}, - {"name": "antenna", "id": 11, "frequency": "f", "synset": "antenna.n.01"}, - {"name": "apple", "id": 12, "frequency": "f", "synset": "apple.n.01"}, - {"name": "applesauce", "id": 13, "frequency": "r", "synset": "applesauce.n.01"}, - {"name": "apricot", "id": 14, "frequency": "r", "synset": "apricot.n.02"}, - {"name": "apron", "id": 15, "frequency": "f", "synset": "apron.n.01"}, - {"name": "aquarium", "id": 16, "frequency": "c", "synset": "aquarium.n.01"}, - {"name": "arctic_(type_of_shoe)", "id": 17, "frequency": "r", "synset": "arctic.n.02"}, - {"name": "armband", "id": 18, "frequency": "c", "synset": "armband.n.02"}, - {"name": "armchair", "id": 19, "frequency": "f", "synset": "armchair.n.01"}, - {"name": "armoire", "id": 20, "frequency": "r", "synset": "armoire.n.01"}, - {"name": "armor", "id": 21, "frequency": "r", "synset": "armor.n.01"}, - {"name": "artichoke", "id": 22, "frequency": "c", "synset": "artichoke.n.02"}, - {"name": "trash_can", "id": 23, "frequency": "f", "synset": "ashcan.n.01"}, - {"name": "ashtray", "id": 24, "frequency": "c", "synset": "ashtray.n.01"}, - {"name": "asparagus", "id": 25, "frequency": "c", "synset": "asparagus.n.02"}, - {"name": "atomizer", "id": 26, "frequency": "c", "synset": "atomizer.n.01"}, - {"name": "avocado", "id": 27, "frequency": "f", "synset": "avocado.n.01"}, - {"name": "award", "id": 28, "frequency": "c", "synset": "award.n.02"}, - {"name": "awning", "id": 29, "frequency": "f", "synset": "awning.n.01"}, - {"name": "ax", "id": 30, "frequency": "r", "synset": "ax.n.01"}, - {"name": "baboon", "id": 31, "frequency": "r", "synset": "baboon.n.01"}, - {"name": "baby_buggy", "id": 32, "frequency": "f", "synset": "baby_buggy.n.01"}, - {"name": "basketball_backboard", "id": 33, "frequency": "c", "synset": "backboard.n.01"}, - {"name": "backpack", "id": 34, "frequency": "f", "synset": "backpack.n.01"}, - {"name": "handbag", "id": 35, "frequency": "f", "synset": "bag.n.04"}, - {"name": "suitcase", "id": 36, "frequency": "f", "synset": "bag.n.06"}, - {"name": "bagel", "id": 37, "frequency": "c", "synset": "bagel.n.01"}, - {"name": "bagpipe", "id": 38, "frequency": "r", "synset": "bagpipe.n.01"}, - {"name": "baguet", "id": 39, "frequency": "r", "synset": "baguet.n.01"}, - {"name": "bait", "id": 40, "frequency": "r", "synset": "bait.n.02"}, - {"name": "ball", "id": 41, "frequency": "f", "synset": "ball.n.06"}, - {"name": "ballet_skirt", "id": 42, "frequency": "r", "synset": "ballet_skirt.n.01"}, - {"name": "balloon", "id": 43, "frequency": "f", "synset": "balloon.n.01"}, - {"name": "bamboo", "id": 44, "frequency": "c", "synset": "bamboo.n.02"}, - {"name": "banana", "id": 45, "frequency": "f", "synset": "banana.n.02"}, - {"name": "Band_Aid", "id": 46, "frequency": "c", "synset": "band_aid.n.01"}, - {"name": "bandage", "id": 47, "frequency": "c", "synset": "bandage.n.01"}, - {"name": "bandanna", "id": 48, "frequency": "f", "synset": "bandanna.n.01"}, - {"name": "banjo", "id": 49, "frequency": "r", "synset": "banjo.n.01"}, - {"name": "banner", "id": 50, "frequency": "f", "synset": "banner.n.01"}, - {"name": "barbell", "id": 51, "frequency": "r", "synset": "barbell.n.01"}, - {"name": "barge", "id": 52, "frequency": "r", "synset": "barge.n.01"}, - {"name": "barrel", "id": 53, "frequency": "f", "synset": "barrel.n.02"}, - {"name": "barrette", "id": 54, "frequency": "c", "synset": "barrette.n.01"}, - {"name": "barrow", "id": 55, "frequency": "c", "synset": "barrow.n.03"}, - {"name": "baseball_base", "id": 56, "frequency": "f", "synset": "base.n.03"}, - {"name": "baseball", "id": 57, "frequency": "f", "synset": "baseball.n.02"}, - {"name": "baseball_bat", "id": 58, "frequency": "f", "synset": "baseball_bat.n.01"}, - {"name": "baseball_cap", "id": 59, "frequency": "f", "synset": "baseball_cap.n.01"}, - {"name": "baseball_glove", "id": 60, "frequency": "f", "synset": "baseball_glove.n.01"}, - {"name": "basket", "id": 61, "frequency": "f", "synset": "basket.n.01"}, - {"name": "basketball", "id": 62, "frequency": "c", "synset": "basketball.n.02"}, - {"name": "bass_horn", "id": 63, "frequency": "r", "synset": "bass_horn.n.01"}, - {"name": "bat_(animal)", "id": 64, "frequency": "c", "synset": "bat.n.01"}, - {"name": "bath_mat", "id": 65, "frequency": "f", "synset": "bath_mat.n.01"}, - {"name": "bath_towel", "id": 66, "frequency": "f", "synset": "bath_towel.n.01"}, - {"name": "bathrobe", "id": 67, "frequency": "c", "synset": "bathrobe.n.01"}, - {"name": "bathtub", "id": 68, "frequency": "f", "synset": "bathtub.n.01"}, - {"name": "batter_(food)", "id": 69, "frequency": "r", "synset": "batter.n.02"}, - {"name": "battery", "id": 70, "frequency": "c", "synset": "battery.n.02"}, - {"name": "beachball", "id": 71, "frequency": "r", "synset": "beach_ball.n.01"}, - {"name": "bead", "id": 72, "frequency": "c", "synset": "bead.n.01"}, - {"name": "bean_curd", "id": 73, "frequency": "c", "synset": "bean_curd.n.01"}, - {"name": "beanbag", "id": 74, "frequency": "c", "synset": "beanbag.n.01"}, - {"name": "beanie", "id": 75, "frequency": "f", "synset": "beanie.n.01"}, - {"name": "bear", "id": 76, "frequency": "f", "synset": "bear.n.01"}, - {"name": "bed", "id": 77, "frequency": "f", "synset": "bed.n.01"}, - {"name": "bedpan", "id": 78, "frequency": "r", "synset": "bedpan.n.01"}, - {"name": "bedspread", "id": 79, "frequency": "f", "synset": "bedspread.n.01"}, - {"name": "cow", "id": 80, "frequency": "f", "synset": "beef.n.01"}, - {"name": "beef_(food)", "id": 81, "frequency": "f", "synset": "beef.n.02"}, - {"name": "beeper", "id": 82, "frequency": "r", "synset": "beeper.n.01"}, - {"name": "beer_bottle", "id": 83, "frequency": "f", "synset": "beer_bottle.n.01"}, - {"name": "beer_can", "id": 84, "frequency": "c", "synset": "beer_can.n.01"}, - {"name": "beetle", "id": 85, "frequency": "r", "synset": "beetle.n.01"}, - {"name": "bell", "id": 86, "frequency": "f", "synset": "bell.n.01"}, - {"name": "bell_pepper", "id": 87, "frequency": "f", "synset": "bell_pepper.n.02"}, - {"name": "belt", "id": 88, "frequency": "f", "synset": "belt.n.02"}, - {"name": "belt_buckle", "id": 89, "frequency": "f", "synset": "belt_buckle.n.01"}, - {"name": "bench", "id": 90, "frequency": "f", "synset": "bench.n.01"}, - {"name": "beret", "id": 91, "frequency": "c", "synset": "beret.n.01"}, - {"name": "bib", "id": 92, "frequency": "c", "synset": "bib.n.02"}, - {"name": "Bible", "id": 93, "frequency": "r", "synset": "bible.n.01"}, - {"name": "bicycle", "id": 94, "frequency": "f", "synset": "bicycle.n.01"}, - {"name": "visor", "id": 95, "frequency": "f", "synset": "bill.n.09"}, - {"name": "billboard", "id": 96, "frequency": "f", "synset": "billboard.n.01"}, - {"name": "binder", "id": 97, "frequency": "c", "synset": "binder.n.03"}, - {"name": "binoculars", "id": 98, "frequency": "c", "synset": "binoculars.n.01"}, - {"name": "bird", "id": 99, "frequency": "f", "synset": "bird.n.01"}, - {"name": "birdfeeder", "id": 100, "frequency": "c", "synset": "bird_feeder.n.01"}, - {"name": "birdbath", "id": 101, "frequency": "c", "synset": "birdbath.n.01"}, - {"name": "birdcage", "id": 102, "frequency": "c", "synset": "birdcage.n.01"}, - {"name": "birdhouse", "id": 103, "frequency": "c", "synset": "birdhouse.n.01"}, - {"name": "birthday_cake", "id": 104, "frequency": "f", "synset": "birthday_cake.n.01"}, - {"name": "birthday_card", "id": 105, "frequency": "r", "synset": "birthday_card.n.01"}, - {"name": "pirate_flag", "id": 106, "frequency": "r", "synset": "black_flag.n.01"}, - {"name": "black_sheep", "id": 107, "frequency": "c", "synset": "black_sheep.n.02"}, - {"name": "blackberry", "id": 108, "frequency": "c", "synset": "blackberry.n.01"}, - {"name": "blackboard", "id": 109, "frequency": "f", "synset": "blackboard.n.01"}, - {"name": "blanket", "id": 110, "frequency": "f", "synset": "blanket.n.01"}, - {"name": "blazer", "id": 111, "frequency": "c", "synset": "blazer.n.01"}, - {"name": "blender", "id": 112, "frequency": "f", "synset": "blender.n.01"}, - {"name": "blimp", "id": 113, "frequency": "r", "synset": "blimp.n.02"}, - {"name": "blinker", "id": 114, "frequency": "f", "synset": "blinker.n.01"}, - {"name": "blouse", "id": 115, "frequency": "f", "synset": "blouse.n.01"}, - {"name": "blueberry", "id": 116, "frequency": "f", "synset": "blueberry.n.02"}, - {"name": "gameboard", "id": 117, "frequency": "r", "synset": "board.n.09"}, - {"name": "boat", "id": 118, "frequency": "f", "synset": "boat.n.01"}, - {"name": "bob", "id": 119, "frequency": "r", "synset": "bob.n.05"}, - {"name": "bobbin", "id": 120, "frequency": "c", "synset": "bobbin.n.01"}, - {"name": "bobby_pin", "id": 121, "frequency": "c", "synset": "bobby_pin.n.01"}, - {"name": "boiled_egg", "id": 122, "frequency": "c", "synset": "boiled_egg.n.01"}, - {"name": "bolo_tie", "id": 123, "frequency": "r", "synset": "bolo_tie.n.01"}, - {"name": "deadbolt", "id": 124, "frequency": "c", "synset": "bolt.n.03"}, - {"name": "bolt", "id": 125, "frequency": "f", "synset": "bolt.n.06"}, - {"name": "bonnet", "id": 126, "frequency": "r", "synset": "bonnet.n.01"}, - {"name": "book", "id": 127, "frequency": "f", "synset": "book.n.01"}, - {"name": "bookcase", "id": 128, "frequency": "c", "synset": "bookcase.n.01"}, - {"name": "booklet", "id": 129, "frequency": "c", "synset": "booklet.n.01"}, - {"name": "bookmark", "id": 130, "frequency": "r", "synset": "bookmark.n.01"}, - {"name": "boom_microphone", "id": 131, "frequency": "r", "synset": "boom.n.04"}, - {"name": "boot", "id": 132, "frequency": "f", "synset": "boot.n.01"}, - {"name": "bottle", "id": 133, "frequency": "f", "synset": "bottle.n.01"}, - {"name": "bottle_opener", "id": 134, "frequency": "c", "synset": "bottle_opener.n.01"}, - {"name": "bouquet", "id": 135, "frequency": "c", "synset": "bouquet.n.01"}, - {"name": "bow_(weapon)", "id": 136, "frequency": "r", "synset": "bow.n.04"}, - {"name": "bow_(decorative_ribbons)", "id": 137, "frequency": "f", "synset": "bow.n.08"}, - {"name": "bow-tie", "id": 138, "frequency": "f", "synset": "bow_tie.n.01"}, - {"name": "bowl", "id": 139, "frequency": "f", "synset": "bowl.n.03"}, - {"name": "pipe_bowl", "id": 140, "frequency": "r", "synset": "bowl.n.08"}, - {"name": "bowler_hat", "id": 141, "frequency": "c", "synset": "bowler_hat.n.01"}, - {"name": "bowling_ball", "id": 142, "frequency": "r", "synset": "bowling_ball.n.01"}, - {"name": "box", "id": 143, "frequency": "f", "synset": "box.n.01"}, - {"name": "boxing_glove", "id": 144, "frequency": "r", "synset": "boxing_glove.n.01"}, - {"name": "suspenders", "id": 145, "frequency": "c", "synset": "brace.n.06"}, - {"name": "bracelet", "id": 146, "frequency": "f", "synset": "bracelet.n.02"}, - {"name": "brass_plaque", "id": 147, "frequency": "r", "synset": "brass.n.07"}, - {"name": "brassiere", "id": 148, "frequency": "c", "synset": "brassiere.n.01"}, - {"name": "bread-bin", "id": 149, "frequency": "c", "synset": "bread-bin.n.01"}, - {"name": "bread", "id": 150, "frequency": "f", "synset": "bread.n.01"}, - {"name": "breechcloth", "id": 151, "frequency": "r", "synset": "breechcloth.n.01"}, - {"name": "bridal_gown", "id": 152, "frequency": "f", "synset": "bridal_gown.n.01"}, - {"name": "briefcase", "id": 153, "frequency": "c", "synset": "briefcase.n.01"}, - {"name": "broccoli", "id": 154, "frequency": "f", "synset": "broccoli.n.01"}, - {"name": "broach", "id": 155, "frequency": "r", "synset": "brooch.n.01"}, - {"name": "broom", "id": 156, "frequency": "c", "synset": "broom.n.01"}, - {"name": "brownie", "id": 157, "frequency": "c", "synset": "brownie.n.03"}, - {"name": "brussels_sprouts", "id": 158, "frequency": "c", "synset": "brussels_sprouts.n.01"}, - {"name": "bubble_gum", "id": 159, "frequency": "r", "synset": "bubble_gum.n.01"}, - {"name": "bucket", "id": 160, "frequency": "f", "synset": "bucket.n.01"}, - {"name": "horse_buggy", "id": 161, "frequency": "r", "synset": "buggy.n.01"}, - {"name": "bull", "id": 162, "frequency": "c", "synset": "bull.n.11"}, - {"name": "bulldog", "id": 163, "frequency": "c", "synset": "bulldog.n.01"}, - {"name": "bulldozer", "id": 164, "frequency": "r", "synset": "bulldozer.n.01"}, - {"name": "bullet_train", "id": 165, "frequency": "c", "synset": "bullet_train.n.01"}, - {"name": "bulletin_board", "id": 166, "frequency": "c", "synset": "bulletin_board.n.02"}, - {"name": "bulletproof_vest", "id": 167, "frequency": "r", "synset": "bulletproof_vest.n.01"}, - {"name": "bullhorn", "id": 168, "frequency": "c", "synset": "bullhorn.n.01"}, - {"name": "bun", "id": 169, "frequency": "f", "synset": "bun.n.01"}, - {"name": "bunk_bed", "id": 170, "frequency": "c", "synset": "bunk_bed.n.01"}, - {"name": "buoy", "id": 171, "frequency": "f", "synset": "buoy.n.01"}, - {"name": "burrito", "id": 172, "frequency": "r", "synset": "burrito.n.01"}, - {"name": "bus_(vehicle)", "id": 173, "frequency": "f", "synset": "bus.n.01"}, - {"name": "business_card", "id": 174, "frequency": "c", "synset": "business_card.n.01"}, - {"name": "butter", "id": 175, "frequency": "f", "synset": "butter.n.01"}, - {"name": "butterfly", "id": 176, "frequency": "c", "synset": "butterfly.n.01"}, - {"name": "button", "id": 177, "frequency": "f", "synset": "button.n.01"}, - {"name": "cab_(taxi)", "id": 178, "frequency": "f", "synset": "cab.n.03"}, - {"name": "cabana", "id": 179, "frequency": "r", "synset": "cabana.n.01"}, - {"name": "cabin_car", "id": 180, "frequency": "c", "synset": "cabin_car.n.01"}, - {"name": "cabinet", "id": 181, "frequency": "f", "synset": "cabinet.n.01"}, - {"name": "locker", "id": 182, "frequency": "r", "synset": "cabinet.n.03"}, - {"name": "cake", "id": 183, "frequency": "f", "synset": "cake.n.03"}, - {"name": "calculator", "id": 184, "frequency": "c", "synset": "calculator.n.02"}, - {"name": "calendar", "id": 185, "frequency": "f", "synset": "calendar.n.02"}, - {"name": "calf", "id": 186, "frequency": "c", "synset": "calf.n.01"}, - {"name": "camcorder", "id": 187, "frequency": "c", "synset": "camcorder.n.01"}, - {"name": "camel", "id": 188, "frequency": "c", "synset": "camel.n.01"}, - {"name": "camera", "id": 189, "frequency": "f", "synset": "camera.n.01"}, - {"name": "camera_lens", "id": 190, "frequency": "c", "synset": "camera_lens.n.01"}, - {"name": "camper_(vehicle)", "id": 191, "frequency": "c", "synset": "camper.n.02"}, - {"name": "can", "id": 192, "frequency": "f", "synset": "can.n.01"}, - {"name": "can_opener", "id": 193, "frequency": "c", "synset": "can_opener.n.01"}, - {"name": "candle", "id": 194, "frequency": "f", "synset": "candle.n.01"}, - {"name": "candle_holder", "id": 195, "frequency": "f", "synset": "candlestick.n.01"}, - {"name": "candy_bar", "id": 196, "frequency": "r", "synset": "candy_bar.n.01"}, - {"name": "candy_cane", "id": 197, "frequency": "c", "synset": "candy_cane.n.01"}, - {"name": "walking_cane", "id": 198, "frequency": "c", "synset": "cane.n.01"}, - {"name": "canister", "id": 199, "frequency": "c", "synset": "canister.n.02"}, - {"name": "canoe", "id": 200, "frequency": "c", "synset": "canoe.n.01"}, - {"name": "cantaloup", "id": 201, "frequency": "c", "synset": "cantaloup.n.02"}, - {"name": "canteen", "id": 202, "frequency": "r", "synset": "canteen.n.01"}, - {"name": "cap_(headwear)", "id": 203, "frequency": "f", "synset": "cap.n.01"}, - {"name": "bottle_cap", "id": 204, "frequency": "f", "synset": "cap.n.02"}, - {"name": "cape", "id": 205, "frequency": "c", "synset": "cape.n.02"}, - {"name": "cappuccino", "id": 206, "frequency": "c", "synset": "cappuccino.n.01"}, - {"name": "car_(automobile)", "id": 207, "frequency": "f", "synset": "car.n.01"}, - {"name": "railcar_(part_of_a_train)", "id": 208, "frequency": "f", "synset": "car.n.02"}, - {"name": "elevator_car", "id": 209, "frequency": "r", "synset": "car.n.04"}, - {"name": "car_battery", "id": 210, "frequency": "r", "synset": "car_battery.n.01"}, - {"name": "identity_card", "id": 211, "frequency": "c", "synset": "card.n.02"}, - {"name": "card", "id": 212, "frequency": "c", "synset": "card.n.03"}, - {"name": "cardigan", "id": 213, "frequency": "c", "synset": "cardigan.n.01"}, - {"name": "cargo_ship", "id": 214, "frequency": "r", "synset": "cargo_ship.n.01"}, - {"name": "carnation", "id": 215, "frequency": "r", "synset": "carnation.n.01"}, - {"name": "horse_carriage", "id": 216, "frequency": "c", "synset": "carriage.n.02"}, - {"name": "carrot", "id": 217, "frequency": "f", "synset": "carrot.n.01"}, - {"name": "tote_bag", "id": 218, "frequency": "f", "synset": "carryall.n.01"}, - {"name": "cart", "id": 219, "frequency": "c", "synset": "cart.n.01"}, - {"name": "carton", "id": 220, "frequency": "c", "synset": "carton.n.02"}, - {"name": "cash_register", "id": 221, "frequency": "c", "synset": "cash_register.n.01"}, - {"name": "casserole", "id": 222, "frequency": "r", "synset": "casserole.n.01"}, - {"name": "cassette", "id": 223, "frequency": "r", "synset": "cassette.n.01"}, - {"name": "cast", "id": 224, "frequency": "c", "synset": "cast.n.05"}, - {"name": "cat", "id": 225, "frequency": "f", "synset": "cat.n.01"}, - {"name": "cauliflower", "id": 226, "frequency": "f", "synset": "cauliflower.n.02"}, - {"name": "cayenne_(spice)", "id": 227, "frequency": "c", "synset": "cayenne.n.02"}, - {"name": "CD_player", "id": 228, "frequency": "c", "synset": "cd_player.n.01"}, - {"name": "celery", "id": 229, "frequency": "f", "synset": "celery.n.01"}, - { - "name": "cellular_telephone", - "id": 230, - "frequency": "f", - "synset": "cellular_telephone.n.01", - }, - {"name": "chain_mail", "id": 231, "frequency": "r", "synset": "chain_mail.n.01"}, - {"name": "chair", "id": 232, "frequency": "f", "synset": "chair.n.01"}, - {"name": "chaise_longue", "id": 233, "frequency": "r", "synset": "chaise_longue.n.01"}, - {"name": "chalice", "id": 234, "frequency": "r", "synset": "chalice.n.01"}, - {"name": "chandelier", "id": 235, "frequency": "f", "synset": "chandelier.n.01"}, - {"name": "chap", "id": 236, "frequency": "r", "synset": "chap.n.04"}, - {"name": "checkbook", "id": 237, "frequency": "r", "synset": "checkbook.n.01"}, - {"name": "checkerboard", "id": 238, "frequency": "r", "synset": "checkerboard.n.01"}, - {"name": "cherry", "id": 239, "frequency": "c", "synset": "cherry.n.03"}, - {"name": "chessboard", "id": 240, "frequency": "r", "synset": "chessboard.n.01"}, - {"name": "chicken_(animal)", "id": 241, "frequency": "c", "synset": "chicken.n.02"}, - {"name": "chickpea", "id": 242, "frequency": "c", "synset": "chickpea.n.01"}, - {"name": "chili_(vegetable)", "id": 243, "frequency": "c", "synset": "chili.n.02"}, - {"name": "chime", "id": 244, "frequency": "r", "synset": "chime.n.01"}, - {"name": "chinaware", "id": 245, "frequency": "r", "synset": "chinaware.n.01"}, - {"name": "crisp_(potato_chip)", "id": 246, "frequency": "c", "synset": "chip.n.04"}, - {"name": "poker_chip", "id": 247, "frequency": "r", "synset": "chip.n.06"}, - {"name": "chocolate_bar", "id": 248, "frequency": "c", "synset": "chocolate_bar.n.01"}, - {"name": "chocolate_cake", "id": 249, "frequency": "c", "synset": "chocolate_cake.n.01"}, - {"name": "chocolate_milk", "id": 250, "frequency": "r", "synset": "chocolate_milk.n.01"}, - {"name": "chocolate_mousse", "id": 251, "frequency": "r", "synset": "chocolate_mousse.n.01"}, - {"name": "choker", "id": 252, "frequency": "f", "synset": "choker.n.03"}, - {"name": "chopping_board", "id": 253, "frequency": "f", "synset": "chopping_board.n.01"}, - {"name": "chopstick", "id": 254, "frequency": "f", "synset": "chopstick.n.01"}, - {"name": "Christmas_tree", "id": 255, "frequency": "f", "synset": "christmas_tree.n.05"}, - {"name": "slide", "id": 256, "frequency": "c", "synset": "chute.n.02"}, - {"name": "cider", "id": 257, "frequency": "r", "synset": "cider.n.01"}, - {"name": "cigar_box", "id": 258, "frequency": "r", "synset": "cigar_box.n.01"}, - {"name": "cigarette", "id": 259, "frequency": "f", "synset": "cigarette.n.01"}, - {"name": "cigarette_case", "id": 260, "frequency": "c", "synset": "cigarette_case.n.01"}, - {"name": "cistern", "id": 261, "frequency": "f", "synset": "cistern.n.02"}, - {"name": "clarinet", "id": 262, "frequency": "r", "synset": "clarinet.n.01"}, - {"name": "clasp", "id": 263, "frequency": "c", "synset": "clasp.n.01"}, - {"name": "cleansing_agent", "id": 264, "frequency": "c", "synset": "cleansing_agent.n.01"}, - {"name": "cleat_(for_securing_rope)", "id": 265, "frequency": "r", "synset": "cleat.n.02"}, - {"name": "clementine", "id": 266, "frequency": "r", "synset": "clementine.n.01"}, - {"name": "clip", "id": 267, "frequency": "c", "synset": "clip.n.03"}, - {"name": "clipboard", "id": 268, "frequency": "c", "synset": "clipboard.n.01"}, - {"name": "clippers_(for_plants)", "id": 269, "frequency": "r", "synset": "clipper.n.03"}, - {"name": "cloak", "id": 270, "frequency": "r", "synset": "cloak.n.02"}, - {"name": "clock", "id": 271, "frequency": "f", "synset": "clock.n.01"}, - {"name": "clock_tower", "id": 272, "frequency": "f", "synset": "clock_tower.n.01"}, - {"name": "clothes_hamper", "id": 273, "frequency": "c", "synset": "clothes_hamper.n.01"}, - {"name": "clothespin", "id": 274, "frequency": "c", "synset": "clothespin.n.01"}, - {"name": "clutch_bag", "id": 275, "frequency": "r", "synset": "clutch_bag.n.01"}, - {"name": "coaster", "id": 276, "frequency": "f", "synset": "coaster.n.03"}, - {"name": "coat", "id": 277, "frequency": "f", "synset": "coat.n.01"}, - {"name": "coat_hanger", "id": 278, "frequency": "c", "synset": "coat_hanger.n.01"}, - {"name": "coatrack", "id": 279, "frequency": "c", "synset": "coatrack.n.01"}, - {"name": "cock", "id": 280, "frequency": "c", "synset": "cock.n.04"}, - {"name": "cockroach", "id": 281, "frequency": "r", "synset": "cockroach.n.01"}, - {"name": "cocoa_(beverage)", "id": 282, "frequency": "r", "synset": "cocoa.n.01"}, - {"name": "coconut", "id": 283, "frequency": "c", "synset": "coconut.n.02"}, - {"name": "coffee_maker", "id": 284, "frequency": "f", "synset": "coffee_maker.n.01"}, - {"name": "coffee_table", "id": 285, "frequency": "f", "synset": "coffee_table.n.01"}, - {"name": "coffeepot", "id": 286, "frequency": "c", "synset": "coffeepot.n.01"}, - {"name": "coil", "id": 287, "frequency": "r", "synset": "coil.n.05"}, - {"name": "coin", "id": 288, "frequency": "c", "synset": "coin.n.01"}, - {"name": "colander", "id": 289, "frequency": "c", "synset": "colander.n.01"}, - {"name": "coleslaw", "id": 290, "frequency": "c", "synset": "coleslaw.n.01"}, - {"name": "coloring_material", "id": 291, "frequency": "r", "synset": "coloring_material.n.01"}, - {"name": "combination_lock", "id": 292, "frequency": "r", "synset": "combination_lock.n.01"}, - {"name": "pacifier", "id": 293, "frequency": "c", "synset": "comforter.n.04"}, - {"name": "comic_book", "id": 294, "frequency": "r", "synset": "comic_book.n.01"}, - {"name": "compass", "id": 295, "frequency": "r", "synset": "compass.n.01"}, - {"name": "computer_keyboard", "id": 296, "frequency": "f", "synset": "computer_keyboard.n.01"}, - {"name": "condiment", "id": 297, "frequency": "f", "synset": "condiment.n.01"}, - {"name": "cone", "id": 298, "frequency": "f", "synset": "cone.n.01"}, - {"name": "control", "id": 299, "frequency": "f", "synset": "control.n.09"}, - {"name": "convertible_(automobile)", "id": 300, "frequency": "r", "synset": "convertible.n.01"}, - {"name": "sofa_bed", "id": 301, "frequency": "r", "synset": "convertible.n.03"}, - {"name": "cooker", "id": 302, "frequency": "r", "synset": "cooker.n.01"}, - {"name": "cookie", "id": 303, "frequency": "f", "synset": "cookie.n.01"}, - {"name": "cooking_utensil", "id": 304, "frequency": "r", "synset": "cooking_utensil.n.01"}, - {"name": "cooler_(for_food)", "id": 305, "frequency": "f", "synset": "cooler.n.01"}, - {"name": "cork_(bottle_plug)", "id": 306, "frequency": "f", "synset": "cork.n.04"}, - {"name": "corkboard", "id": 307, "frequency": "r", "synset": "corkboard.n.01"}, - {"name": "corkscrew", "id": 308, "frequency": "c", "synset": "corkscrew.n.01"}, - {"name": "edible_corn", "id": 309, "frequency": "f", "synset": "corn.n.03"}, - {"name": "cornbread", "id": 310, "frequency": "r", "synset": "cornbread.n.01"}, - {"name": "cornet", "id": 311, "frequency": "c", "synset": "cornet.n.01"}, - {"name": "cornice", "id": 312, "frequency": "c", "synset": "cornice.n.01"}, - {"name": "cornmeal", "id": 313, "frequency": "r", "synset": "cornmeal.n.01"}, - {"name": "corset", "id": 314, "frequency": "c", "synset": "corset.n.01"}, - {"name": "costume", "id": 315, "frequency": "c", "synset": "costume.n.04"}, - {"name": "cougar", "id": 316, "frequency": "r", "synset": "cougar.n.01"}, - {"name": "coverall", "id": 317, "frequency": "r", "synset": "coverall.n.01"}, - {"name": "cowbell", "id": 318, "frequency": "c", "synset": "cowbell.n.01"}, - {"name": "cowboy_hat", "id": 319, "frequency": "f", "synset": "cowboy_hat.n.01"}, - {"name": "crab_(animal)", "id": 320, "frequency": "c", "synset": "crab.n.01"}, - {"name": "crabmeat", "id": 321, "frequency": "r", "synset": "crab.n.05"}, - {"name": "cracker", "id": 322, "frequency": "c", "synset": "cracker.n.01"}, - {"name": "crape", "id": 323, "frequency": "r", "synset": "crape.n.01"}, - {"name": "crate", "id": 324, "frequency": "f", "synset": "crate.n.01"}, - {"name": "crayon", "id": 325, "frequency": "c", "synset": "crayon.n.01"}, - {"name": "cream_pitcher", "id": 326, "frequency": "r", "synset": "cream_pitcher.n.01"}, - {"name": "crescent_roll", "id": 327, "frequency": "c", "synset": "crescent_roll.n.01"}, - {"name": "crib", "id": 328, "frequency": "c", "synset": "crib.n.01"}, - {"name": "crock_pot", "id": 329, "frequency": "c", "synset": "crock.n.03"}, - {"name": "crossbar", "id": 330, "frequency": "f", "synset": "crossbar.n.01"}, - {"name": "crouton", "id": 331, "frequency": "r", "synset": "crouton.n.01"}, - {"name": "crow", "id": 332, "frequency": "c", "synset": "crow.n.01"}, - {"name": "crowbar", "id": 333, "frequency": "r", "synset": "crowbar.n.01"}, - {"name": "crown", "id": 334, "frequency": "c", "synset": "crown.n.04"}, - {"name": "crucifix", "id": 335, "frequency": "c", "synset": "crucifix.n.01"}, - {"name": "cruise_ship", "id": 336, "frequency": "c", "synset": "cruise_ship.n.01"}, - {"name": "police_cruiser", "id": 337, "frequency": "c", "synset": "cruiser.n.01"}, - {"name": "crumb", "id": 338, "frequency": "f", "synset": "crumb.n.03"}, - {"name": "crutch", "id": 339, "frequency": "c", "synset": "crutch.n.01"}, - {"name": "cub_(animal)", "id": 340, "frequency": "c", "synset": "cub.n.03"}, - {"name": "cube", "id": 341, "frequency": "c", "synset": "cube.n.05"}, - {"name": "cucumber", "id": 342, "frequency": "f", "synset": "cucumber.n.02"}, - {"name": "cufflink", "id": 343, "frequency": "c", "synset": "cufflink.n.01"}, - {"name": "cup", "id": 344, "frequency": "f", "synset": "cup.n.01"}, - {"name": "trophy_cup", "id": 345, "frequency": "c", "synset": "cup.n.08"}, - {"name": "cupboard", "id": 346, "frequency": "f", "synset": "cupboard.n.01"}, - {"name": "cupcake", "id": 347, "frequency": "f", "synset": "cupcake.n.01"}, - {"name": "hair_curler", "id": 348, "frequency": "r", "synset": "curler.n.01"}, - {"name": "curling_iron", "id": 349, "frequency": "r", "synset": "curling_iron.n.01"}, - {"name": "curtain", "id": 350, "frequency": "f", "synset": "curtain.n.01"}, - {"name": "cushion", "id": 351, "frequency": "f", "synset": "cushion.n.03"}, - {"name": "cylinder", "id": 352, "frequency": "r", "synset": "cylinder.n.04"}, - {"name": "cymbal", "id": 353, "frequency": "r", "synset": "cymbal.n.01"}, - {"name": "dagger", "id": 354, "frequency": "r", "synset": "dagger.n.01"}, - {"name": "dalmatian", "id": 355, "frequency": "r", "synset": "dalmatian.n.02"}, - {"name": "dartboard", "id": 356, "frequency": "c", "synset": "dartboard.n.01"}, - {"name": "date_(fruit)", "id": 357, "frequency": "r", "synset": "date.n.08"}, - {"name": "deck_chair", "id": 358, "frequency": "f", "synset": "deck_chair.n.01"}, - {"name": "deer", "id": 359, "frequency": "c", "synset": "deer.n.01"}, - {"name": "dental_floss", "id": 360, "frequency": "c", "synset": "dental_floss.n.01"}, - {"name": "desk", "id": 361, "frequency": "f", "synset": "desk.n.01"}, - {"name": "detergent", "id": 362, "frequency": "r", "synset": "detergent.n.01"}, - {"name": "diaper", "id": 363, "frequency": "c", "synset": "diaper.n.01"}, - {"name": "diary", "id": 364, "frequency": "r", "synset": "diary.n.01"}, - {"name": "die", "id": 365, "frequency": "r", "synset": "die.n.01"}, - {"name": "dinghy", "id": 366, "frequency": "r", "synset": "dinghy.n.01"}, - {"name": "dining_table", "id": 367, "frequency": "f", "synset": "dining_table.n.01"}, - {"name": "tux", "id": 368, "frequency": "r", "synset": "dinner_jacket.n.01"}, - {"name": "dish", "id": 369, "frequency": "f", "synset": "dish.n.01"}, - {"name": "dish_antenna", "id": 370, "frequency": "c", "synset": "dish.n.05"}, - {"name": "dishrag", "id": 371, "frequency": "c", "synset": "dishrag.n.01"}, - {"name": "dishtowel", "id": 372, "frequency": "f", "synset": "dishtowel.n.01"}, - {"name": "dishwasher", "id": 373, "frequency": "f", "synset": "dishwasher.n.01"}, - { - "name": "dishwasher_detergent", - "id": 374, - "frequency": "r", - "synset": "dishwasher_detergent.n.01", - }, - {"name": "dispenser", "id": 375, "frequency": "f", "synset": "dispenser.n.01"}, - {"name": "diving_board", "id": 376, "frequency": "r", "synset": "diving_board.n.01"}, - {"name": "Dixie_cup", "id": 377, "frequency": "f", "synset": "dixie_cup.n.01"}, - {"name": "dog", "id": 378, "frequency": "f", "synset": "dog.n.01"}, - {"name": "dog_collar", "id": 379, "frequency": "f", "synset": "dog_collar.n.01"}, - {"name": "doll", "id": 380, "frequency": "f", "synset": "doll.n.01"}, - {"name": "dollar", "id": 381, "frequency": "r", "synset": "dollar.n.02"}, - {"name": "dollhouse", "id": 382, "frequency": "r", "synset": "dollhouse.n.01"}, - {"name": "dolphin", "id": 383, "frequency": "c", "synset": "dolphin.n.02"}, - {"name": "domestic_ass", "id": 384, "frequency": "c", "synset": "domestic_ass.n.01"}, - {"name": "doorknob", "id": 385, "frequency": "f", "synset": "doorknob.n.01"}, - {"name": "doormat", "id": 386, "frequency": "c", "synset": "doormat.n.02"}, - {"name": "doughnut", "id": 387, "frequency": "f", "synset": "doughnut.n.02"}, - {"name": "dove", "id": 388, "frequency": "r", "synset": "dove.n.01"}, - {"name": "dragonfly", "id": 389, "frequency": "r", "synset": "dragonfly.n.01"}, - {"name": "drawer", "id": 390, "frequency": "f", "synset": "drawer.n.01"}, - {"name": "underdrawers", "id": 391, "frequency": "c", "synset": "drawers.n.01"}, - {"name": "dress", "id": 392, "frequency": "f", "synset": "dress.n.01"}, - {"name": "dress_hat", "id": 393, "frequency": "c", "synset": "dress_hat.n.01"}, - {"name": "dress_suit", "id": 394, "frequency": "f", "synset": "dress_suit.n.01"}, - {"name": "dresser", "id": 395, "frequency": "f", "synset": "dresser.n.05"}, - {"name": "drill", "id": 396, "frequency": "c", "synset": "drill.n.01"}, - {"name": "drone", "id": 397, "frequency": "r", "synset": "drone.n.04"}, - {"name": "dropper", "id": 398, "frequency": "r", "synset": "dropper.n.01"}, - {"name": "drum_(musical_instrument)", "id": 399, "frequency": "c", "synset": "drum.n.01"}, - {"name": "drumstick", "id": 400, "frequency": "r", "synset": "drumstick.n.02"}, - {"name": "duck", "id": 401, "frequency": "f", "synset": "duck.n.01"}, - {"name": "duckling", "id": 402, "frequency": "c", "synset": "duckling.n.02"}, - {"name": "duct_tape", "id": 403, "frequency": "c", "synset": "duct_tape.n.01"}, - {"name": "duffel_bag", "id": 404, "frequency": "f", "synset": "duffel_bag.n.01"}, - {"name": "dumbbell", "id": 405, "frequency": "r", "synset": "dumbbell.n.01"}, - {"name": "dumpster", "id": 406, "frequency": "c", "synset": "dumpster.n.01"}, - {"name": "dustpan", "id": 407, "frequency": "r", "synset": "dustpan.n.02"}, - {"name": "eagle", "id": 408, "frequency": "c", "synset": "eagle.n.01"}, - {"name": "earphone", "id": 409, "frequency": "f", "synset": "earphone.n.01"}, - {"name": "earplug", "id": 410, "frequency": "r", "synset": "earplug.n.01"}, - {"name": "earring", "id": 411, "frequency": "f", "synset": "earring.n.01"}, - {"name": "easel", "id": 412, "frequency": "c", "synset": "easel.n.01"}, - {"name": "eclair", "id": 413, "frequency": "r", "synset": "eclair.n.01"}, - {"name": "eel", "id": 414, "frequency": "r", "synset": "eel.n.01"}, - {"name": "egg", "id": 415, "frequency": "f", "synset": "egg.n.02"}, - {"name": "egg_roll", "id": 416, "frequency": "r", "synset": "egg_roll.n.01"}, - {"name": "egg_yolk", "id": 417, "frequency": "c", "synset": "egg_yolk.n.01"}, - {"name": "eggbeater", "id": 418, "frequency": "c", "synset": "eggbeater.n.02"}, - {"name": "eggplant", "id": 419, "frequency": "c", "synset": "eggplant.n.01"}, - {"name": "electric_chair", "id": 420, "frequency": "r", "synset": "electric_chair.n.01"}, - {"name": "refrigerator", "id": 421, "frequency": "f", "synset": "electric_refrigerator.n.01"}, - {"name": "elephant", "id": 422, "frequency": "f", "synset": "elephant.n.01"}, - {"name": "elk", "id": 423, "frequency": "c", "synset": "elk.n.01"}, - {"name": "envelope", "id": 424, "frequency": "c", "synset": "envelope.n.01"}, - {"name": "eraser", "id": 425, "frequency": "c", "synset": "eraser.n.01"}, - {"name": "escargot", "id": 426, "frequency": "r", "synset": "escargot.n.01"}, - {"name": "eyepatch", "id": 427, "frequency": "r", "synset": "eyepatch.n.01"}, - {"name": "falcon", "id": 428, "frequency": "r", "synset": "falcon.n.01"}, - {"name": "fan", "id": 429, "frequency": "f", "synset": "fan.n.01"}, - {"name": "faucet", "id": 430, "frequency": "f", "synset": "faucet.n.01"}, - {"name": "fedora", "id": 431, "frequency": "r", "synset": "fedora.n.01"}, - {"name": "ferret", "id": 432, "frequency": "r", "synset": "ferret.n.02"}, - {"name": "Ferris_wheel", "id": 433, "frequency": "c", "synset": "ferris_wheel.n.01"}, - {"name": "ferry", "id": 434, "frequency": "c", "synset": "ferry.n.01"}, - {"name": "fig_(fruit)", "id": 435, "frequency": "r", "synset": "fig.n.04"}, - {"name": "fighter_jet", "id": 436, "frequency": "c", "synset": "fighter.n.02"}, - {"name": "figurine", "id": 437, "frequency": "f", "synset": "figurine.n.01"}, - {"name": "file_cabinet", "id": 438, "frequency": "c", "synset": "file.n.03"}, - {"name": "file_(tool)", "id": 439, "frequency": "r", "synset": "file.n.04"}, - {"name": "fire_alarm", "id": 440, "frequency": "f", "synset": "fire_alarm.n.02"}, - {"name": "fire_engine", "id": 441, "frequency": "f", "synset": "fire_engine.n.01"}, - {"name": "fire_extinguisher", "id": 442, "frequency": "f", "synset": "fire_extinguisher.n.01"}, - {"name": "fire_hose", "id": 443, "frequency": "c", "synset": "fire_hose.n.01"}, - {"name": "fireplace", "id": 444, "frequency": "f", "synset": "fireplace.n.01"}, - {"name": "fireplug", "id": 445, "frequency": "f", "synset": "fireplug.n.01"}, - {"name": "first-aid_kit", "id": 446, "frequency": "r", "synset": "first-aid_kit.n.01"}, - {"name": "fish", "id": 447, "frequency": "f", "synset": "fish.n.01"}, - {"name": "fish_(food)", "id": 448, "frequency": "c", "synset": "fish.n.02"}, - {"name": "fishbowl", "id": 449, "frequency": "r", "synset": "fishbowl.n.02"}, - {"name": "fishing_rod", "id": 450, "frequency": "c", "synset": "fishing_rod.n.01"}, - {"name": "flag", "id": 451, "frequency": "f", "synset": "flag.n.01"}, - {"name": "flagpole", "id": 452, "frequency": "f", "synset": "flagpole.n.02"}, - {"name": "flamingo", "id": 453, "frequency": "c", "synset": "flamingo.n.01"}, - {"name": "flannel", "id": 454, "frequency": "c", "synset": "flannel.n.01"}, - {"name": "flap", "id": 455, "frequency": "c", "synset": "flap.n.01"}, - {"name": "flash", "id": 456, "frequency": "r", "synset": "flash.n.10"}, - {"name": "flashlight", "id": 457, "frequency": "c", "synset": "flashlight.n.01"}, - {"name": "fleece", "id": 458, "frequency": "r", "synset": "fleece.n.03"}, - {"name": "flip-flop_(sandal)", "id": 459, "frequency": "f", "synset": "flip-flop.n.02"}, - {"name": "flipper_(footwear)", "id": 460, "frequency": "c", "synset": "flipper.n.01"}, - { - "name": "flower_arrangement", - "id": 461, - "frequency": "f", - "synset": "flower_arrangement.n.01", - }, - {"name": "flute_glass", "id": 462, "frequency": "c", "synset": "flute.n.02"}, - {"name": "foal", "id": 463, "frequency": "c", "synset": "foal.n.01"}, - {"name": "folding_chair", "id": 464, "frequency": "c", "synset": "folding_chair.n.01"}, - {"name": "food_processor", "id": 465, "frequency": "c", "synset": "food_processor.n.01"}, - {"name": "football_(American)", "id": 466, "frequency": "c", "synset": "football.n.02"}, - {"name": "football_helmet", "id": 467, "frequency": "r", "synset": "football_helmet.n.01"}, - {"name": "footstool", "id": 468, "frequency": "c", "synset": "footstool.n.01"}, - {"name": "fork", "id": 469, "frequency": "f", "synset": "fork.n.01"}, - {"name": "forklift", "id": 470, "frequency": "c", "synset": "forklift.n.01"}, - {"name": "freight_car", "id": 471, "frequency": "c", "synset": "freight_car.n.01"}, - {"name": "French_toast", "id": 472, "frequency": "c", "synset": "french_toast.n.01"}, - {"name": "freshener", "id": 473, "frequency": "c", "synset": "freshener.n.01"}, - {"name": "frisbee", "id": 474, "frequency": "f", "synset": "frisbee.n.01"}, - {"name": "frog", "id": 475, "frequency": "c", "synset": "frog.n.01"}, - {"name": "fruit_juice", "id": 476, "frequency": "c", "synset": "fruit_juice.n.01"}, - {"name": "frying_pan", "id": 477, "frequency": "f", "synset": "frying_pan.n.01"}, - {"name": "fudge", "id": 478, "frequency": "r", "synset": "fudge.n.01"}, - {"name": "funnel", "id": 479, "frequency": "r", "synset": "funnel.n.02"}, - {"name": "futon", "id": 480, "frequency": "r", "synset": "futon.n.01"}, - {"name": "gag", "id": 481, "frequency": "r", "synset": "gag.n.02"}, - {"name": "garbage", "id": 482, "frequency": "r", "synset": "garbage.n.03"}, - {"name": "garbage_truck", "id": 483, "frequency": "c", "synset": "garbage_truck.n.01"}, - {"name": "garden_hose", "id": 484, "frequency": "c", "synset": "garden_hose.n.01"}, - {"name": "gargle", "id": 485, "frequency": "c", "synset": "gargle.n.01"}, - {"name": "gargoyle", "id": 486, "frequency": "r", "synset": "gargoyle.n.02"}, - {"name": "garlic", "id": 487, "frequency": "c", "synset": "garlic.n.02"}, - {"name": "gasmask", "id": 488, "frequency": "r", "synset": "gasmask.n.01"}, - {"name": "gazelle", "id": 489, "frequency": "c", "synset": "gazelle.n.01"}, - {"name": "gelatin", "id": 490, "frequency": "c", "synset": "gelatin.n.02"}, - {"name": "gemstone", "id": 491, "frequency": "r", "synset": "gem.n.02"}, - {"name": "generator", "id": 492, "frequency": "r", "synset": "generator.n.02"}, - {"name": "giant_panda", "id": 493, "frequency": "c", "synset": "giant_panda.n.01"}, - {"name": "gift_wrap", "id": 494, "frequency": "c", "synset": "gift_wrap.n.01"}, - {"name": "ginger", "id": 495, "frequency": "c", "synset": "ginger.n.03"}, - {"name": "giraffe", "id": 496, "frequency": "f", "synset": "giraffe.n.01"}, - {"name": "cincture", "id": 497, "frequency": "c", "synset": "girdle.n.02"}, - {"name": "glass_(drink_container)", "id": 498, "frequency": "f", "synset": "glass.n.02"}, - {"name": "globe", "id": 499, "frequency": "c", "synset": "globe.n.03"}, - {"name": "glove", "id": 500, "frequency": "f", "synset": "glove.n.02"}, - {"name": "goat", "id": 501, "frequency": "c", "synset": "goat.n.01"}, - {"name": "goggles", "id": 502, "frequency": "f", "synset": "goggles.n.01"}, - {"name": "goldfish", "id": 503, "frequency": "r", "synset": "goldfish.n.01"}, - {"name": "golf_club", "id": 504, "frequency": "c", "synset": "golf_club.n.02"}, - {"name": "golfcart", "id": 505, "frequency": "c", "synset": "golfcart.n.01"}, - {"name": "gondola_(boat)", "id": 506, "frequency": "r", "synset": "gondola.n.02"}, - {"name": "goose", "id": 507, "frequency": "c", "synset": "goose.n.01"}, - {"name": "gorilla", "id": 508, "frequency": "r", "synset": "gorilla.n.01"}, - {"name": "gourd", "id": 509, "frequency": "r", "synset": "gourd.n.02"}, - {"name": "grape", "id": 510, "frequency": "f", "synset": "grape.n.01"}, - {"name": "grater", "id": 511, "frequency": "c", "synset": "grater.n.01"}, - {"name": "gravestone", "id": 512, "frequency": "c", "synset": "gravestone.n.01"}, - {"name": "gravy_boat", "id": 513, "frequency": "r", "synset": "gravy_boat.n.01"}, - {"name": "green_bean", "id": 514, "frequency": "f", "synset": "green_bean.n.02"}, - {"name": "green_onion", "id": 515, "frequency": "f", "synset": "green_onion.n.01"}, - {"name": "griddle", "id": 516, "frequency": "r", "synset": "griddle.n.01"}, - {"name": "grill", "id": 517, "frequency": "f", "synset": "grill.n.02"}, - {"name": "grits", "id": 518, "frequency": "r", "synset": "grits.n.01"}, - {"name": "grizzly", "id": 519, "frequency": "c", "synset": "grizzly.n.01"}, - {"name": "grocery_bag", "id": 520, "frequency": "c", "synset": "grocery_bag.n.01"}, - {"name": "guitar", "id": 521, "frequency": "f", "synset": "guitar.n.01"}, - {"name": "gull", "id": 522, "frequency": "c", "synset": "gull.n.02"}, - {"name": "gun", "id": 523, "frequency": "c", "synset": "gun.n.01"}, - {"name": "hairbrush", "id": 524, "frequency": "f", "synset": "hairbrush.n.01"}, - {"name": "hairnet", "id": 525, "frequency": "c", "synset": "hairnet.n.01"}, - {"name": "hairpin", "id": 526, "frequency": "c", "synset": "hairpin.n.01"}, - {"name": "halter_top", "id": 527, "frequency": "r", "synset": "halter.n.03"}, - {"name": "ham", "id": 528, "frequency": "f", "synset": "ham.n.01"}, - {"name": "hamburger", "id": 529, "frequency": "c", "synset": "hamburger.n.01"}, - {"name": "hammer", "id": 530, "frequency": "c", "synset": "hammer.n.02"}, - {"name": "hammock", "id": 531, "frequency": "c", "synset": "hammock.n.02"}, - {"name": "hamper", "id": 532, "frequency": "r", "synset": "hamper.n.02"}, - {"name": "hamster", "id": 533, "frequency": "c", "synset": "hamster.n.01"}, - {"name": "hair_dryer", "id": 534, "frequency": "f", "synset": "hand_blower.n.01"}, - {"name": "hand_glass", "id": 535, "frequency": "r", "synset": "hand_glass.n.01"}, - {"name": "hand_towel", "id": 536, "frequency": "f", "synset": "hand_towel.n.01"}, - {"name": "handcart", "id": 537, "frequency": "c", "synset": "handcart.n.01"}, - {"name": "handcuff", "id": 538, "frequency": "r", "synset": "handcuff.n.01"}, - {"name": "handkerchief", "id": 539, "frequency": "c", "synset": "handkerchief.n.01"}, - {"name": "handle", "id": 540, "frequency": "f", "synset": "handle.n.01"}, - {"name": "handsaw", "id": 541, "frequency": "r", "synset": "handsaw.n.01"}, - {"name": "hardback_book", "id": 542, "frequency": "r", "synset": "hardback.n.01"}, - {"name": "harmonium", "id": 543, "frequency": "r", "synset": "harmonium.n.01"}, - {"name": "hat", "id": 544, "frequency": "f", "synset": "hat.n.01"}, - {"name": "hatbox", "id": 545, "frequency": "r", "synset": "hatbox.n.01"}, - {"name": "veil", "id": 546, "frequency": "c", "synset": "head_covering.n.01"}, - {"name": "headband", "id": 547, "frequency": "f", "synset": "headband.n.01"}, - {"name": "headboard", "id": 548, "frequency": "f", "synset": "headboard.n.01"}, - {"name": "headlight", "id": 549, "frequency": "f", "synset": "headlight.n.01"}, - {"name": "headscarf", "id": 550, "frequency": "c", "synset": "headscarf.n.01"}, - {"name": "headset", "id": 551, "frequency": "r", "synset": "headset.n.01"}, - {"name": "headstall_(for_horses)", "id": 552, "frequency": "c", "synset": "headstall.n.01"}, - {"name": "heart", "id": 553, "frequency": "c", "synset": "heart.n.02"}, - {"name": "heater", "id": 554, "frequency": "c", "synset": "heater.n.01"}, - {"name": "helicopter", "id": 555, "frequency": "c", "synset": "helicopter.n.01"}, - {"name": "helmet", "id": 556, "frequency": "f", "synset": "helmet.n.02"}, - {"name": "heron", "id": 557, "frequency": "r", "synset": "heron.n.02"}, - {"name": "highchair", "id": 558, "frequency": "c", "synset": "highchair.n.01"}, - {"name": "hinge", "id": 559, "frequency": "f", "synset": "hinge.n.01"}, - {"name": "hippopotamus", "id": 560, "frequency": "r", "synset": "hippopotamus.n.01"}, - {"name": "hockey_stick", "id": 561, "frequency": "r", "synset": "hockey_stick.n.01"}, - {"name": "hog", "id": 562, "frequency": "c", "synset": "hog.n.03"}, - {"name": "home_plate_(baseball)", "id": 563, "frequency": "f", "synset": "home_plate.n.01"}, - {"name": "honey", "id": 564, "frequency": "c", "synset": "honey.n.01"}, - {"name": "fume_hood", "id": 565, "frequency": "f", "synset": "hood.n.06"}, - {"name": "hook", "id": 566, "frequency": "f", "synset": "hook.n.05"}, - {"name": "hookah", "id": 567, "frequency": "r", "synset": "hookah.n.01"}, - {"name": "hornet", "id": 568, "frequency": "r", "synset": "hornet.n.01"}, - {"name": "horse", "id": 569, "frequency": "f", "synset": "horse.n.01"}, - {"name": "hose", "id": 570, "frequency": "f", "synset": "hose.n.03"}, - {"name": "hot-air_balloon", "id": 571, "frequency": "r", "synset": "hot-air_balloon.n.01"}, - {"name": "hotplate", "id": 572, "frequency": "r", "synset": "hot_plate.n.01"}, - {"name": "hot_sauce", "id": 573, "frequency": "c", "synset": "hot_sauce.n.01"}, - {"name": "hourglass", "id": 574, "frequency": "r", "synset": "hourglass.n.01"}, - {"name": "houseboat", "id": 575, "frequency": "r", "synset": "houseboat.n.01"}, - {"name": "hummingbird", "id": 576, "frequency": "c", "synset": "hummingbird.n.01"}, - {"name": "hummus", "id": 577, "frequency": "r", "synset": "hummus.n.01"}, - {"name": "polar_bear", "id": 578, "frequency": "f", "synset": "ice_bear.n.01"}, - {"name": "icecream", "id": 579, "frequency": "c", "synset": "ice_cream.n.01"}, - {"name": "popsicle", "id": 580, "frequency": "r", "synset": "ice_lolly.n.01"}, - {"name": "ice_maker", "id": 581, "frequency": "c", "synset": "ice_maker.n.01"}, - {"name": "ice_pack", "id": 582, "frequency": "r", "synset": "ice_pack.n.01"}, - {"name": "ice_skate", "id": 583, "frequency": "r", "synset": "ice_skate.n.01"}, - {"name": "igniter", "id": 584, "frequency": "c", "synset": "igniter.n.01"}, - {"name": "inhaler", "id": 585, "frequency": "r", "synset": "inhaler.n.01"}, - {"name": "iPod", "id": 586, "frequency": "f", "synset": "ipod.n.01"}, - {"name": "iron_(for_clothing)", "id": 587, "frequency": "c", "synset": "iron.n.04"}, - {"name": "ironing_board", "id": 588, "frequency": "c", "synset": "ironing_board.n.01"}, - {"name": "jacket", "id": 589, "frequency": "f", "synset": "jacket.n.01"}, - {"name": "jam", "id": 590, "frequency": "c", "synset": "jam.n.01"}, - {"name": "jar", "id": 591, "frequency": "f", "synset": "jar.n.01"}, - {"name": "jean", "id": 592, "frequency": "f", "synset": "jean.n.01"}, - {"name": "jeep", "id": 593, "frequency": "c", "synset": "jeep.n.01"}, - {"name": "jelly_bean", "id": 594, "frequency": "r", "synset": "jelly_bean.n.01"}, - {"name": "jersey", "id": 595, "frequency": "f", "synset": "jersey.n.03"}, - {"name": "jet_plane", "id": 596, "frequency": "c", "synset": "jet.n.01"}, - {"name": "jewel", "id": 597, "frequency": "r", "synset": "jewel.n.01"}, - {"name": "jewelry", "id": 598, "frequency": "c", "synset": "jewelry.n.01"}, - {"name": "joystick", "id": 599, "frequency": "r", "synset": "joystick.n.02"}, - {"name": "jumpsuit", "id": 600, "frequency": "c", "synset": "jump_suit.n.01"}, - {"name": "kayak", "id": 601, "frequency": "c", "synset": "kayak.n.01"}, - {"name": "keg", "id": 602, "frequency": "r", "synset": "keg.n.02"}, - {"name": "kennel", "id": 603, "frequency": "r", "synset": "kennel.n.01"}, - {"name": "kettle", "id": 604, "frequency": "c", "synset": "kettle.n.01"}, - {"name": "key", "id": 605, "frequency": "f", "synset": "key.n.01"}, - {"name": "keycard", "id": 606, "frequency": "r", "synset": "keycard.n.01"}, - {"name": "kilt", "id": 607, "frequency": "c", "synset": "kilt.n.01"}, - {"name": "kimono", "id": 608, "frequency": "c", "synset": "kimono.n.01"}, - {"name": "kitchen_sink", "id": 609, "frequency": "f", "synset": "kitchen_sink.n.01"}, - {"name": "kitchen_table", "id": 610, "frequency": "r", "synset": "kitchen_table.n.01"}, - {"name": "kite", "id": 611, "frequency": "f", "synset": "kite.n.03"}, - {"name": "kitten", "id": 612, "frequency": "c", "synset": "kitten.n.01"}, - {"name": "kiwi_fruit", "id": 613, "frequency": "c", "synset": "kiwi.n.03"}, - {"name": "knee_pad", "id": 614, "frequency": "f", "synset": "knee_pad.n.01"}, - {"name": "knife", "id": 615, "frequency": "f", "synset": "knife.n.01"}, - {"name": "knitting_needle", "id": 616, "frequency": "r", "synset": "knitting_needle.n.01"}, - {"name": "knob", "id": 617, "frequency": "f", "synset": "knob.n.02"}, - {"name": "knocker_(on_a_door)", "id": 618, "frequency": "r", "synset": "knocker.n.05"}, - {"name": "koala", "id": 619, "frequency": "r", "synset": "koala.n.01"}, - {"name": "lab_coat", "id": 620, "frequency": "r", "synset": "lab_coat.n.01"}, - {"name": "ladder", "id": 621, "frequency": "f", "synset": "ladder.n.01"}, - {"name": "ladle", "id": 622, "frequency": "c", "synset": "ladle.n.01"}, - {"name": "ladybug", "id": 623, "frequency": "c", "synset": "ladybug.n.01"}, - {"name": "lamb_(animal)", "id": 624, "frequency": "f", "synset": "lamb.n.01"}, - {"name": "lamb-chop", "id": 625, "frequency": "r", "synset": "lamb_chop.n.01"}, - {"name": "lamp", "id": 626, "frequency": "f", "synset": "lamp.n.02"}, - {"name": "lamppost", "id": 627, "frequency": "f", "synset": "lamppost.n.01"}, - {"name": "lampshade", "id": 628, "frequency": "f", "synset": "lampshade.n.01"}, - {"name": "lantern", "id": 629, "frequency": "c", "synset": "lantern.n.01"}, - {"name": "lanyard", "id": 630, "frequency": "f", "synset": "lanyard.n.02"}, - {"name": "laptop_computer", "id": 631, "frequency": "f", "synset": "laptop.n.01"}, - {"name": "lasagna", "id": 632, "frequency": "r", "synset": "lasagna.n.01"}, - {"name": "latch", "id": 633, "frequency": "f", "synset": "latch.n.02"}, - {"name": "lawn_mower", "id": 634, "frequency": "r", "synset": "lawn_mower.n.01"}, - {"name": "leather", "id": 635, "frequency": "r", "synset": "leather.n.01"}, - {"name": "legging_(clothing)", "id": 636, "frequency": "c", "synset": "legging.n.01"}, - {"name": "Lego", "id": 637, "frequency": "c", "synset": "lego.n.01"}, - {"name": "legume", "id": 638, "frequency": "r", "synset": "legume.n.02"}, - {"name": "lemon", "id": 639, "frequency": "f", "synset": "lemon.n.01"}, - {"name": "lemonade", "id": 640, "frequency": "r", "synset": "lemonade.n.01"}, - {"name": "lettuce", "id": 641, "frequency": "f", "synset": "lettuce.n.02"}, - {"name": "license_plate", "id": 642, "frequency": "f", "synset": "license_plate.n.01"}, - {"name": "life_buoy", "id": 643, "frequency": "f", "synset": "life_buoy.n.01"}, - {"name": "life_jacket", "id": 644, "frequency": "f", "synset": "life_jacket.n.01"}, - {"name": "lightbulb", "id": 645, "frequency": "f", "synset": "light_bulb.n.01"}, - {"name": "lightning_rod", "id": 646, "frequency": "r", "synset": "lightning_rod.n.02"}, - {"name": "lime", "id": 647, "frequency": "f", "synset": "lime.n.06"}, - {"name": "limousine", "id": 648, "frequency": "r", "synset": "limousine.n.01"}, - {"name": "lion", "id": 649, "frequency": "c", "synset": "lion.n.01"}, - {"name": "lip_balm", "id": 650, "frequency": "c", "synset": "lip_balm.n.01"}, - {"name": "liquor", "id": 651, "frequency": "r", "synset": "liquor.n.01"}, - {"name": "lizard", "id": 652, "frequency": "c", "synset": "lizard.n.01"}, - {"name": "log", "id": 653, "frequency": "f", "synset": "log.n.01"}, - {"name": "lollipop", "id": 654, "frequency": "c", "synset": "lollipop.n.02"}, - { - "name": "speaker_(stero_equipment)", - "id": 655, - "frequency": "f", - "synset": "loudspeaker.n.01", - }, - {"name": "loveseat", "id": 656, "frequency": "c", "synset": "love_seat.n.01"}, - {"name": "machine_gun", "id": 657, "frequency": "r", "synset": "machine_gun.n.01"}, - {"name": "magazine", "id": 658, "frequency": "f", "synset": "magazine.n.02"}, - {"name": "magnet", "id": 659, "frequency": "f", "synset": "magnet.n.01"}, - {"name": "mail_slot", "id": 660, "frequency": "c", "synset": "mail_slot.n.01"}, - {"name": "mailbox_(at_home)", "id": 661, "frequency": "f", "synset": "mailbox.n.01"}, - {"name": "mallard", "id": 662, "frequency": "r", "synset": "mallard.n.01"}, - {"name": "mallet", "id": 663, "frequency": "r", "synset": "mallet.n.01"}, - {"name": "mammoth", "id": 664, "frequency": "r", "synset": "mammoth.n.01"}, - {"name": "manatee", "id": 665, "frequency": "r", "synset": "manatee.n.01"}, - {"name": "mandarin_orange", "id": 666, "frequency": "c", "synset": "mandarin.n.05"}, - {"name": "manger", "id": 667, "frequency": "c", "synset": "manger.n.01"}, - {"name": "manhole", "id": 668, "frequency": "f", "synset": "manhole.n.01"}, - {"name": "map", "id": 669, "frequency": "f", "synset": "map.n.01"}, - {"name": "marker", "id": 670, "frequency": "f", "synset": "marker.n.03"}, - {"name": "martini", "id": 671, "frequency": "r", "synset": "martini.n.01"}, - {"name": "mascot", "id": 672, "frequency": "r", "synset": "mascot.n.01"}, - {"name": "mashed_potato", "id": 673, "frequency": "c", "synset": "mashed_potato.n.01"}, - {"name": "masher", "id": 674, "frequency": "r", "synset": "masher.n.02"}, - {"name": "mask", "id": 675, "frequency": "f", "synset": "mask.n.04"}, - {"name": "mast", "id": 676, "frequency": "f", "synset": "mast.n.01"}, - {"name": "mat_(gym_equipment)", "id": 677, "frequency": "c", "synset": "mat.n.03"}, - {"name": "matchbox", "id": 678, "frequency": "r", "synset": "matchbox.n.01"}, - {"name": "mattress", "id": 679, "frequency": "f", "synset": "mattress.n.01"}, - {"name": "measuring_cup", "id": 680, "frequency": "c", "synset": "measuring_cup.n.01"}, - {"name": "measuring_stick", "id": 681, "frequency": "c", "synset": "measuring_stick.n.01"}, - {"name": "meatball", "id": 682, "frequency": "c", "synset": "meatball.n.01"}, - {"name": "medicine", "id": 683, "frequency": "c", "synset": "medicine.n.02"}, - {"name": "melon", "id": 684, "frequency": "c", "synset": "melon.n.01"}, - {"name": "microphone", "id": 685, "frequency": "f", "synset": "microphone.n.01"}, - {"name": "microscope", "id": 686, "frequency": "r", "synset": "microscope.n.01"}, - {"name": "microwave_oven", "id": 687, "frequency": "f", "synset": "microwave.n.02"}, - {"name": "milestone", "id": 688, "frequency": "r", "synset": "milestone.n.01"}, - {"name": "milk", "id": 689, "frequency": "f", "synset": "milk.n.01"}, - {"name": "milk_can", "id": 690, "frequency": "r", "synset": "milk_can.n.01"}, - {"name": "milkshake", "id": 691, "frequency": "r", "synset": "milkshake.n.01"}, - {"name": "minivan", "id": 692, "frequency": "f", "synset": "minivan.n.01"}, - {"name": "mint_candy", "id": 693, "frequency": "r", "synset": "mint.n.05"}, - {"name": "mirror", "id": 694, "frequency": "f", "synset": "mirror.n.01"}, - {"name": "mitten", "id": 695, "frequency": "c", "synset": "mitten.n.01"}, - {"name": "mixer_(kitchen_tool)", "id": 696, "frequency": "c", "synset": "mixer.n.04"}, - {"name": "money", "id": 697, "frequency": "c", "synset": "money.n.03"}, - { - "name": "monitor_(computer_equipment) computer_monitor", - "id": 698, - "frequency": "f", - "synset": "monitor.n.04", - }, - {"name": "monkey", "id": 699, "frequency": "c", "synset": "monkey.n.01"}, - {"name": "motor", "id": 700, "frequency": "f", "synset": "motor.n.01"}, - {"name": "motor_scooter", "id": 701, "frequency": "f", "synset": "motor_scooter.n.01"}, - {"name": "motor_vehicle", "id": 702, "frequency": "r", "synset": "motor_vehicle.n.01"}, - {"name": "motorcycle", "id": 703, "frequency": "f", "synset": "motorcycle.n.01"}, - {"name": "mound_(baseball)", "id": 704, "frequency": "f", "synset": "mound.n.01"}, - {"name": "mouse_(computer_equipment)", "id": 705, "frequency": "f", "synset": "mouse.n.04"}, - {"name": "mousepad", "id": 706, "frequency": "f", "synset": "mousepad.n.01"}, - {"name": "muffin", "id": 707, "frequency": "c", "synset": "muffin.n.01"}, - {"name": "mug", "id": 708, "frequency": "f", "synset": "mug.n.04"}, - {"name": "mushroom", "id": 709, "frequency": "f", "synset": "mushroom.n.02"}, - {"name": "music_stool", "id": 710, "frequency": "r", "synset": "music_stool.n.01"}, - { - "name": "musical_instrument", - "id": 711, - "frequency": "c", - "synset": "musical_instrument.n.01", - }, - {"name": "nailfile", "id": 712, "frequency": "r", "synset": "nailfile.n.01"}, - {"name": "napkin", "id": 713, "frequency": "f", "synset": "napkin.n.01"}, - {"name": "neckerchief", "id": 714, "frequency": "r", "synset": "neckerchief.n.01"}, - {"name": "necklace", "id": 715, "frequency": "f", "synset": "necklace.n.01"}, - {"name": "necktie", "id": 716, "frequency": "f", "synset": "necktie.n.01"}, - {"name": "needle", "id": 717, "frequency": "c", "synset": "needle.n.03"}, - {"name": "nest", "id": 718, "frequency": "c", "synset": "nest.n.01"}, - {"name": "newspaper", "id": 719, "frequency": "f", "synset": "newspaper.n.01"}, - {"name": "newsstand", "id": 720, "frequency": "c", "synset": "newsstand.n.01"}, - {"name": "nightshirt", "id": 721, "frequency": "c", "synset": "nightwear.n.01"}, - {"name": "nosebag_(for_animals)", "id": 722, "frequency": "r", "synset": "nosebag.n.01"}, - {"name": "noseband_(for_animals)", "id": 723, "frequency": "c", "synset": "noseband.n.01"}, - {"name": "notebook", "id": 724, "frequency": "f", "synset": "notebook.n.01"}, - {"name": "notepad", "id": 725, "frequency": "c", "synset": "notepad.n.01"}, - {"name": "nut", "id": 726, "frequency": "f", "synset": "nut.n.03"}, - {"name": "nutcracker", "id": 727, "frequency": "r", "synset": "nutcracker.n.01"}, - {"name": "oar", "id": 728, "frequency": "f", "synset": "oar.n.01"}, - {"name": "octopus_(food)", "id": 729, "frequency": "r", "synset": "octopus.n.01"}, - {"name": "octopus_(animal)", "id": 730, "frequency": "r", "synset": "octopus.n.02"}, - {"name": "oil_lamp", "id": 731, "frequency": "c", "synset": "oil_lamp.n.01"}, - {"name": "olive_oil", "id": 732, "frequency": "c", "synset": "olive_oil.n.01"}, - {"name": "omelet", "id": 733, "frequency": "r", "synset": "omelet.n.01"}, - {"name": "onion", "id": 734, "frequency": "f", "synset": "onion.n.01"}, - {"name": "orange_(fruit)", "id": 735, "frequency": "f", "synset": "orange.n.01"}, - {"name": "orange_juice", "id": 736, "frequency": "c", "synset": "orange_juice.n.01"}, - {"name": "ostrich", "id": 737, "frequency": "c", "synset": "ostrich.n.02"}, - {"name": "ottoman", "id": 738, "frequency": "f", "synset": "ottoman.n.03"}, - {"name": "oven", "id": 739, "frequency": "f", "synset": "oven.n.01"}, - {"name": "overalls_(clothing)", "id": 740, "frequency": "c", "synset": "overall.n.01"}, - {"name": "owl", "id": 741, "frequency": "c", "synset": "owl.n.01"}, - {"name": "packet", "id": 742, "frequency": "c", "synset": "packet.n.03"}, - {"name": "inkpad", "id": 743, "frequency": "r", "synset": "pad.n.03"}, - {"name": "pad", "id": 744, "frequency": "c", "synset": "pad.n.04"}, - {"name": "paddle", "id": 745, "frequency": "f", "synset": "paddle.n.04"}, - {"name": "padlock", "id": 746, "frequency": "c", "synset": "padlock.n.01"}, - {"name": "paintbrush", "id": 747, "frequency": "c", "synset": "paintbrush.n.01"}, - {"name": "painting", "id": 748, "frequency": "f", "synset": "painting.n.01"}, - {"name": "pajamas", "id": 749, "frequency": "f", "synset": "pajama.n.02"}, - {"name": "palette", "id": 750, "frequency": "c", "synset": "palette.n.02"}, - {"name": "pan_(for_cooking)", "id": 751, "frequency": "f", "synset": "pan.n.01"}, - {"name": "pan_(metal_container)", "id": 752, "frequency": "r", "synset": "pan.n.03"}, - {"name": "pancake", "id": 753, "frequency": "c", "synset": "pancake.n.01"}, - {"name": "pantyhose", "id": 754, "frequency": "r", "synset": "pantyhose.n.01"}, - {"name": "papaya", "id": 755, "frequency": "r", "synset": "papaya.n.02"}, - {"name": "paper_plate", "id": 756, "frequency": "f", "synset": "paper_plate.n.01"}, - {"name": "paper_towel", "id": 757, "frequency": "f", "synset": "paper_towel.n.01"}, - {"name": "paperback_book", "id": 758, "frequency": "r", "synset": "paperback_book.n.01"}, - {"name": "paperweight", "id": 759, "frequency": "r", "synset": "paperweight.n.01"}, - {"name": "parachute", "id": 760, "frequency": "c", "synset": "parachute.n.01"}, - {"name": "parakeet", "id": 761, "frequency": "c", "synset": "parakeet.n.01"}, - {"name": "parasail_(sports)", "id": 762, "frequency": "c", "synset": "parasail.n.01"}, - {"name": "parasol", "id": 763, "frequency": "c", "synset": "parasol.n.01"}, - {"name": "parchment", "id": 764, "frequency": "r", "synset": "parchment.n.01"}, - {"name": "parka", "id": 765, "frequency": "c", "synset": "parka.n.01"}, - {"name": "parking_meter", "id": 766, "frequency": "f", "synset": "parking_meter.n.01"}, - {"name": "parrot", "id": 767, "frequency": "c", "synset": "parrot.n.01"}, - { - "name": "passenger_car_(part_of_a_train)", - "id": 768, - "frequency": "c", - "synset": "passenger_car.n.01", - }, - {"name": "passenger_ship", "id": 769, "frequency": "r", "synset": "passenger_ship.n.01"}, - {"name": "passport", "id": 770, "frequency": "c", "synset": "passport.n.02"}, - {"name": "pastry", "id": 771, "frequency": "f", "synset": "pastry.n.02"}, - {"name": "patty_(food)", "id": 772, "frequency": "r", "synset": "patty.n.01"}, - {"name": "pea_(food)", "id": 773, "frequency": "c", "synset": "pea.n.01"}, - {"name": "peach", "id": 774, "frequency": "c", "synset": "peach.n.03"}, - {"name": "peanut_butter", "id": 775, "frequency": "c", "synset": "peanut_butter.n.01"}, - {"name": "pear", "id": 776, "frequency": "f", "synset": "pear.n.01"}, - { - "name": "peeler_(tool_for_fruit_and_vegetables)", - "id": 777, - "frequency": "c", - "synset": "peeler.n.03", - }, - {"name": "wooden_leg", "id": 778, "frequency": "r", "synset": "peg.n.04"}, - {"name": "pegboard", "id": 779, "frequency": "r", "synset": "pegboard.n.01"}, - {"name": "pelican", "id": 780, "frequency": "c", "synset": "pelican.n.01"}, - {"name": "pen", "id": 781, "frequency": "f", "synset": "pen.n.01"}, - {"name": "pencil", "id": 782, "frequency": "f", "synset": "pencil.n.01"}, - {"name": "pencil_box", "id": 783, "frequency": "r", "synset": "pencil_box.n.01"}, - {"name": "pencil_sharpener", "id": 784, "frequency": "r", "synset": "pencil_sharpener.n.01"}, - {"name": "pendulum", "id": 785, "frequency": "r", "synset": "pendulum.n.01"}, - {"name": "penguin", "id": 786, "frequency": "c", "synset": "penguin.n.01"}, - {"name": "pennant", "id": 787, "frequency": "r", "synset": "pennant.n.02"}, - {"name": "penny_(coin)", "id": 788, "frequency": "r", "synset": "penny.n.02"}, - {"name": "pepper", "id": 789, "frequency": "f", "synset": "pepper.n.03"}, - {"name": "pepper_mill", "id": 790, "frequency": "c", "synset": "pepper_mill.n.01"}, - {"name": "perfume", "id": 791, "frequency": "c", "synset": "perfume.n.02"}, - {"name": "persimmon", "id": 792, "frequency": "r", "synset": "persimmon.n.02"}, - {"name": "person", "id": 793, "frequency": "f", "synset": "person.n.01"}, - {"name": "pet", "id": 794, "frequency": "c", "synset": "pet.n.01"}, - {"name": "pew_(church_bench)", "id": 795, "frequency": "c", "synset": "pew.n.01"}, - {"name": "phonebook", "id": 796, "frequency": "r", "synset": "phonebook.n.01"}, - {"name": "phonograph_record", "id": 797, "frequency": "c", "synset": "phonograph_record.n.01"}, - {"name": "piano", "id": 798, "frequency": "f", "synset": "piano.n.01"}, - {"name": "pickle", "id": 799, "frequency": "f", "synset": "pickle.n.01"}, - {"name": "pickup_truck", "id": 800, "frequency": "f", "synset": "pickup.n.01"}, - {"name": "pie", "id": 801, "frequency": "c", "synset": "pie.n.01"}, - {"name": "pigeon", "id": 802, "frequency": "c", "synset": "pigeon.n.01"}, - {"name": "piggy_bank", "id": 803, "frequency": "r", "synset": "piggy_bank.n.01"}, - {"name": "pillow", "id": 804, "frequency": "f", "synset": "pillow.n.01"}, - {"name": "pin_(non_jewelry)", "id": 805, "frequency": "r", "synset": "pin.n.09"}, - {"name": "pineapple", "id": 806, "frequency": "f", "synset": "pineapple.n.02"}, - {"name": "pinecone", "id": 807, "frequency": "c", "synset": "pinecone.n.01"}, - {"name": "ping-pong_ball", "id": 808, "frequency": "r", "synset": "ping-pong_ball.n.01"}, - {"name": "pinwheel", "id": 809, "frequency": "r", "synset": "pinwheel.n.03"}, - {"name": "tobacco_pipe", "id": 810, "frequency": "r", "synset": "pipe.n.01"}, - {"name": "pipe", "id": 811, "frequency": "f", "synset": "pipe.n.02"}, - {"name": "pistol", "id": 812, "frequency": "r", "synset": "pistol.n.01"}, - {"name": "pita_(bread)", "id": 813, "frequency": "c", "synset": "pita.n.01"}, - {"name": "pitcher_(vessel_for_liquid)", "id": 814, "frequency": "f", "synset": "pitcher.n.02"}, - {"name": "pitchfork", "id": 815, "frequency": "r", "synset": "pitchfork.n.01"}, - {"name": "pizza", "id": 816, "frequency": "f", "synset": "pizza.n.01"}, - {"name": "place_mat", "id": 817, "frequency": "f", "synset": "place_mat.n.01"}, - {"name": "plate", "id": 818, "frequency": "f", "synset": "plate.n.04"}, - {"name": "platter", "id": 819, "frequency": "c", "synset": "platter.n.01"}, - {"name": "playpen", "id": 820, "frequency": "r", "synset": "playpen.n.01"}, - {"name": "pliers", "id": 821, "frequency": "c", "synset": "pliers.n.01"}, - {"name": "plow_(farm_equipment)", "id": 822, "frequency": "r", "synset": "plow.n.01"}, - {"name": "plume", "id": 823, "frequency": "r", "synset": "plume.n.02"}, - {"name": "pocket_watch", "id": 824, "frequency": "r", "synset": "pocket_watch.n.01"}, - {"name": "pocketknife", "id": 825, "frequency": "c", "synset": "pocketknife.n.01"}, - {"name": "poker_(fire_stirring_tool)", "id": 826, "frequency": "c", "synset": "poker.n.01"}, - {"name": "pole", "id": 827, "frequency": "f", "synset": "pole.n.01"}, - {"name": "polo_shirt", "id": 828, "frequency": "f", "synset": "polo_shirt.n.01"}, - {"name": "poncho", "id": 829, "frequency": "r", "synset": "poncho.n.01"}, - {"name": "pony", "id": 830, "frequency": "c", "synset": "pony.n.05"}, - {"name": "pool_table", "id": 831, "frequency": "r", "synset": "pool_table.n.01"}, - {"name": "pop_(soda)", "id": 832, "frequency": "f", "synset": "pop.n.02"}, - {"name": "postbox_(public)", "id": 833, "frequency": "c", "synset": "postbox.n.01"}, - {"name": "postcard", "id": 834, "frequency": "c", "synset": "postcard.n.01"}, - {"name": "poster", "id": 835, "frequency": "f", "synset": "poster.n.01"}, - {"name": "pot", "id": 836, "frequency": "f", "synset": "pot.n.01"}, - {"name": "flowerpot", "id": 837, "frequency": "f", "synset": "pot.n.04"}, - {"name": "potato", "id": 838, "frequency": "f", "synset": "potato.n.01"}, - {"name": "potholder", "id": 839, "frequency": "c", "synset": "potholder.n.01"}, - {"name": "pottery", "id": 840, "frequency": "c", "synset": "pottery.n.01"}, - {"name": "pouch", "id": 841, "frequency": "c", "synset": "pouch.n.01"}, - {"name": "power_shovel", "id": 842, "frequency": "c", "synset": "power_shovel.n.01"}, - {"name": "prawn", "id": 843, "frequency": "c", "synset": "prawn.n.01"}, - {"name": "pretzel", "id": 844, "frequency": "c", "synset": "pretzel.n.01"}, - {"name": "printer", "id": 845, "frequency": "f", "synset": "printer.n.03"}, - {"name": "projectile_(weapon)", "id": 846, "frequency": "c", "synset": "projectile.n.01"}, - {"name": "projector", "id": 847, "frequency": "c", "synset": "projector.n.02"}, - {"name": "propeller", "id": 848, "frequency": "f", "synset": "propeller.n.01"}, - {"name": "prune", "id": 849, "frequency": "r", "synset": "prune.n.01"}, - {"name": "pudding", "id": 850, "frequency": "r", "synset": "pudding.n.01"}, - {"name": "puffer_(fish)", "id": 851, "frequency": "r", "synset": "puffer.n.02"}, - {"name": "puffin", "id": 852, "frequency": "r", "synset": "puffin.n.01"}, - {"name": "pug-dog", "id": 853, "frequency": "r", "synset": "pug.n.01"}, - {"name": "pumpkin", "id": 854, "frequency": "c", "synset": "pumpkin.n.02"}, - {"name": "puncher", "id": 855, "frequency": "r", "synset": "punch.n.03"}, - {"name": "puppet", "id": 856, "frequency": "r", "synset": "puppet.n.01"}, - {"name": "puppy", "id": 857, "frequency": "c", "synset": "puppy.n.01"}, - {"name": "quesadilla", "id": 858, "frequency": "r", "synset": "quesadilla.n.01"}, - {"name": "quiche", "id": 859, "frequency": "r", "synset": "quiche.n.02"}, - {"name": "quilt", "id": 860, "frequency": "f", "synset": "quilt.n.01"}, - {"name": "rabbit", "id": 861, "frequency": "c", "synset": "rabbit.n.01"}, - {"name": "race_car", "id": 862, "frequency": "r", "synset": "racer.n.02"}, - {"name": "racket", "id": 863, "frequency": "c", "synset": "racket.n.04"}, - {"name": "radar", "id": 864, "frequency": "r", "synset": "radar.n.01"}, - {"name": "radiator", "id": 865, "frequency": "f", "synset": "radiator.n.03"}, - {"name": "radio_receiver", "id": 866, "frequency": "c", "synset": "radio_receiver.n.01"}, - {"name": "radish", "id": 867, "frequency": "c", "synset": "radish.n.03"}, - {"name": "raft", "id": 868, "frequency": "c", "synset": "raft.n.01"}, - {"name": "rag_doll", "id": 869, "frequency": "r", "synset": "rag_doll.n.01"}, - {"name": "raincoat", "id": 870, "frequency": "c", "synset": "raincoat.n.01"}, - {"name": "ram_(animal)", "id": 871, "frequency": "c", "synset": "ram.n.05"}, - {"name": "raspberry", "id": 872, "frequency": "c", "synset": "raspberry.n.02"}, - {"name": "rat", "id": 873, "frequency": "r", "synset": "rat.n.01"}, - {"name": "razorblade", "id": 874, "frequency": "c", "synset": "razorblade.n.01"}, - {"name": "reamer_(juicer)", "id": 875, "frequency": "c", "synset": "reamer.n.01"}, - {"name": "rearview_mirror", "id": 876, "frequency": "f", "synset": "rearview_mirror.n.01"}, - {"name": "receipt", "id": 877, "frequency": "c", "synset": "receipt.n.02"}, - {"name": "recliner", "id": 878, "frequency": "c", "synset": "recliner.n.01"}, - {"name": "record_player", "id": 879, "frequency": "c", "synset": "record_player.n.01"}, - {"name": "reflector", "id": 880, "frequency": "f", "synset": "reflector.n.01"}, - {"name": "remote_control", "id": 881, "frequency": "f", "synset": "remote_control.n.01"}, - {"name": "rhinoceros", "id": 882, "frequency": "c", "synset": "rhinoceros.n.01"}, - {"name": "rib_(food)", "id": 883, "frequency": "r", "synset": "rib.n.03"}, - {"name": "rifle", "id": 884, "frequency": "c", "synset": "rifle.n.01"}, - {"name": "ring", "id": 885, "frequency": "f", "synset": "ring.n.08"}, - {"name": "river_boat", "id": 886, "frequency": "r", "synset": "river_boat.n.01"}, - {"name": "road_map", "id": 887, "frequency": "r", "synset": "road_map.n.02"}, - {"name": "robe", "id": 888, "frequency": "c", "synset": "robe.n.01"}, - {"name": "rocking_chair", "id": 889, "frequency": "c", "synset": "rocking_chair.n.01"}, - {"name": "rodent", "id": 890, "frequency": "r", "synset": "rodent.n.01"}, - {"name": "roller_skate", "id": 891, "frequency": "r", "synset": "roller_skate.n.01"}, - {"name": "Rollerblade", "id": 892, "frequency": "r", "synset": "rollerblade.n.01"}, - {"name": "rolling_pin", "id": 893, "frequency": "c", "synset": "rolling_pin.n.01"}, - {"name": "root_beer", "id": 894, "frequency": "r", "synset": "root_beer.n.01"}, - {"name": "router_(computer_equipment)", "id": 895, "frequency": "c", "synset": "router.n.02"}, - {"name": "rubber_band", "id": 896, "frequency": "f", "synset": "rubber_band.n.01"}, - {"name": "runner_(carpet)", "id": 897, "frequency": "c", "synset": "runner.n.08"}, - {"name": "plastic_bag", "id": 898, "frequency": "f", "synset": "sack.n.01"}, - {"name": "saddle_(on_an_animal)", "id": 899, "frequency": "f", "synset": "saddle.n.01"}, - {"name": "saddle_blanket", "id": 900, "frequency": "f", "synset": "saddle_blanket.n.01"}, - {"name": "saddlebag", "id": 901, "frequency": "c", "synset": "saddlebag.n.01"}, - {"name": "safety_pin", "id": 902, "frequency": "r", "synset": "safety_pin.n.01"}, - {"name": "sail", "id": 903, "frequency": "f", "synset": "sail.n.01"}, - {"name": "salad", "id": 904, "frequency": "f", "synset": "salad.n.01"}, - {"name": "salad_plate", "id": 905, "frequency": "r", "synset": "salad_plate.n.01"}, - {"name": "salami", "id": 906, "frequency": "c", "synset": "salami.n.01"}, - {"name": "salmon_(fish)", "id": 907, "frequency": "c", "synset": "salmon.n.01"}, - {"name": "salmon_(food)", "id": 908, "frequency": "r", "synset": "salmon.n.03"}, - {"name": "salsa", "id": 909, "frequency": "c", "synset": "salsa.n.01"}, - {"name": "saltshaker", "id": 910, "frequency": "f", "synset": "saltshaker.n.01"}, - {"name": "sandal_(type_of_shoe)", "id": 911, "frequency": "f", "synset": "sandal.n.01"}, - {"name": "sandwich", "id": 912, "frequency": "f", "synset": "sandwich.n.01"}, - {"name": "satchel", "id": 913, "frequency": "r", "synset": "satchel.n.01"}, - {"name": "saucepan", "id": 914, "frequency": "r", "synset": "saucepan.n.01"}, - {"name": "saucer", "id": 915, "frequency": "f", "synset": "saucer.n.02"}, - {"name": "sausage", "id": 916, "frequency": "f", "synset": "sausage.n.01"}, - {"name": "sawhorse", "id": 917, "frequency": "r", "synset": "sawhorse.n.01"}, - {"name": "saxophone", "id": 918, "frequency": "r", "synset": "sax.n.02"}, - {"name": "scale_(measuring_instrument)", "id": 919, "frequency": "f", "synset": "scale.n.07"}, - {"name": "scarecrow", "id": 920, "frequency": "r", "synset": "scarecrow.n.01"}, - {"name": "scarf", "id": 921, "frequency": "f", "synset": "scarf.n.01"}, - {"name": "school_bus", "id": 922, "frequency": "c", "synset": "school_bus.n.01"}, - {"name": "scissors", "id": 923, "frequency": "f", "synset": "scissors.n.01"}, - {"name": "scoreboard", "id": 924, "frequency": "f", "synset": "scoreboard.n.01"}, - {"name": "scraper", "id": 925, "frequency": "r", "synset": "scraper.n.01"}, - {"name": "screwdriver", "id": 926, "frequency": "c", "synset": "screwdriver.n.01"}, - {"name": "scrubbing_brush", "id": 927, "frequency": "f", "synset": "scrub_brush.n.01"}, - {"name": "sculpture", "id": 928, "frequency": "c", "synset": "sculpture.n.01"}, - {"name": "seabird", "id": 929, "frequency": "c", "synset": "seabird.n.01"}, - {"name": "seahorse", "id": 930, "frequency": "c", "synset": "seahorse.n.02"}, - {"name": "seaplane", "id": 931, "frequency": "r", "synset": "seaplane.n.01"}, - {"name": "seashell", "id": 932, "frequency": "c", "synset": "seashell.n.01"}, - {"name": "sewing_machine", "id": 933, "frequency": "c", "synset": "sewing_machine.n.01"}, - {"name": "shaker", "id": 934, "frequency": "c", "synset": "shaker.n.03"}, - {"name": "shampoo", "id": 935, "frequency": "c", "synset": "shampoo.n.01"}, - {"name": "shark", "id": 936, "frequency": "c", "synset": "shark.n.01"}, - {"name": "sharpener", "id": 937, "frequency": "r", "synset": "sharpener.n.01"}, - {"name": "Sharpie", "id": 938, "frequency": "r", "synset": "sharpie.n.03"}, - {"name": "shaver_(electric)", "id": 939, "frequency": "r", "synset": "shaver.n.03"}, - {"name": "shaving_cream", "id": 940, "frequency": "c", "synset": "shaving_cream.n.01"}, - {"name": "shawl", "id": 941, "frequency": "r", "synset": "shawl.n.01"}, - {"name": "shears", "id": 942, "frequency": "r", "synset": "shears.n.01"}, - {"name": "sheep", "id": 943, "frequency": "f", "synset": "sheep.n.01"}, - {"name": "shepherd_dog", "id": 944, "frequency": "r", "synset": "shepherd_dog.n.01"}, - {"name": "sherbert", "id": 945, "frequency": "r", "synset": "sherbert.n.01"}, - {"name": "shield", "id": 946, "frequency": "c", "synset": "shield.n.02"}, - {"name": "shirt", "id": 947, "frequency": "f", "synset": "shirt.n.01"}, - {"name": "shoe", "id": 948, "frequency": "f", "synset": "shoe.n.01"}, - {"name": "shopping_bag", "id": 949, "frequency": "f", "synset": "shopping_bag.n.01"}, - {"name": "shopping_cart", "id": 950, "frequency": "c", "synset": "shopping_cart.n.01"}, - {"name": "short_pants", "id": 951, "frequency": "f", "synset": "short_pants.n.01"}, - {"name": "shot_glass", "id": 952, "frequency": "r", "synset": "shot_glass.n.01"}, - {"name": "shoulder_bag", "id": 953, "frequency": "f", "synset": "shoulder_bag.n.01"}, - {"name": "shovel", "id": 954, "frequency": "c", "synset": "shovel.n.01"}, - {"name": "shower_head", "id": 955, "frequency": "f", "synset": "shower.n.01"}, - {"name": "shower_cap", "id": 956, "frequency": "r", "synset": "shower_cap.n.01"}, - {"name": "shower_curtain", "id": 957, "frequency": "f", "synset": "shower_curtain.n.01"}, - {"name": "shredder_(for_paper)", "id": 958, "frequency": "r", "synset": "shredder.n.01"}, - {"name": "signboard", "id": 959, "frequency": "f", "synset": "signboard.n.01"}, - {"name": "silo", "id": 960, "frequency": "c", "synset": "silo.n.01"}, - {"name": "sink", "id": 961, "frequency": "f", "synset": "sink.n.01"}, - {"name": "skateboard", "id": 962, "frequency": "f", "synset": "skateboard.n.01"}, - {"name": "skewer", "id": 963, "frequency": "c", "synset": "skewer.n.01"}, - {"name": "ski", "id": 964, "frequency": "f", "synset": "ski.n.01"}, - {"name": "ski_boot", "id": 965, "frequency": "f", "synset": "ski_boot.n.01"}, - {"name": "ski_parka", "id": 966, "frequency": "f", "synset": "ski_parka.n.01"}, - {"name": "ski_pole", "id": 967, "frequency": "f", "synset": "ski_pole.n.01"}, - {"name": "skirt", "id": 968, "frequency": "f", "synset": "skirt.n.02"}, - {"name": "skullcap", "id": 969, "frequency": "r", "synset": "skullcap.n.01"}, - {"name": "sled", "id": 970, "frequency": "c", "synset": "sled.n.01"}, - {"name": "sleeping_bag", "id": 971, "frequency": "c", "synset": "sleeping_bag.n.01"}, - {"name": "sling_(bandage)", "id": 972, "frequency": "r", "synset": "sling.n.05"}, - {"name": "slipper_(footwear)", "id": 973, "frequency": "c", "synset": "slipper.n.01"}, - {"name": "smoothie", "id": 974, "frequency": "r", "synset": "smoothie.n.02"}, - {"name": "snake", "id": 975, "frequency": "r", "synset": "snake.n.01"}, - {"name": "snowboard", "id": 976, "frequency": "f", "synset": "snowboard.n.01"}, - {"name": "snowman", "id": 977, "frequency": "c", "synset": "snowman.n.01"}, - {"name": "snowmobile", "id": 978, "frequency": "c", "synset": "snowmobile.n.01"}, - {"name": "soap", "id": 979, "frequency": "f", "synset": "soap.n.01"}, - {"name": "soccer_ball", "id": 980, "frequency": "f", "synset": "soccer_ball.n.01"}, - {"name": "sock", "id": 981, "frequency": "f", "synset": "sock.n.01"}, - {"name": "sofa", "id": 982, "frequency": "f", "synset": "sofa.n.01"}, - {"name": "softball", "id": 983, "frequency": "r", "synset": "softball.n.01"}, - {"name": "solar_array", "id": 984, "frequency": "c", "synset": "solar_array.n.01"}, - {"name": "sombrero", "id": 985, "frequency": "r", "synset": "sombrero.n.02"}, - {"name": "soup", "id": 986, "frequency": "f", "synset": "soup.n.01"}, - {"name": "soup_bowl", "id": 987, "frequency": "r", "synset": "soup_bowl.n.01"}, - {"name": "soupspoon", "id": 988, "frequency": "c", "synset": "soupspoon.n.01"}, - {"name": "sour_cream", "id": 989, "frequency": "c", "synset": "sour_cream.n.01"}, - {"name": "soya_milk", "id": 990, "frequency": "r", "synset": "soya_milk.n.01"}, - {"name": "space_shuttle", "id": 991, "frequency": "r", "synset": "space_shuttle.n.01"}, - {"name": "sparkler_(fireworks)", "id": 992, "frequency": "r", "synset": "sparkler.n.02"}, - {"name": "spatula", "id": 993, "frequency": "f", "synset": "spatula.n.02"}, - {"name": "spear", "id": 994, "frequency": "r", "synset": "spear.n.01"}, - {"name": "spectacles", "id": 995, "frequency": "f", "synset": "spectacles.n.01"}, - {"name": "spice_rack", "id": 996, "frequency": "c", "synset": "spice_rack.n.01"}, - {"name": "spider", "id": 997, "frequency": "c", "synset": "spider.n.01"}, - {"name": "crawfish", "id": 998, "frequency": "r", "synset": "spiny_lobster.n.02"}, - {"name": "sponge", "id": 999, "frequency": "c", "synset": "sponge.n.01"}, - {"name": "spoon", "id": 1000, "frequency": "f", "synset": "spoon.n.01"}, - {"name": "sportswear", "id": 1001, "frequency": "c", "synset": "sportswear.n.01"}, - {"name": "spotlight", "id": 1002, "frequency": "c", "synset": "spotlight.n.02"}, - {"name": "squid_(food)", "id": 1003, "frequency": "r", "synset": "squid.n.01"}, - {"name": "squirrel", "id": 1004, "frequency": "c", "synset": "squirrel.n.01"}, - {"name": "stagecoach", "id": 1005, "frequency": "r", "synset": "stagecoach.n.01"}, - {"name": "stapler_(stapling_machine)", "id": 1006, "frequency": "c", "synset": "stapler.n.01"}, - {"name": "starfish", "id": 1007, "frequency": "c", "synset": "starfish.n.01"}, - {"name": "statue_(sculpture)", "id": 1008, "frequency": "f", "synset": "statue.n.01"}, - {"name": "steak_(food)", "id": 1009, "frequency": "c", "synset": "steak.n.01"}, - {"name": "steak_knife", "id": 1010, "frequency": "r", "synset": "steak_knife.n.01"}, - {"name": "steering_wheel", "id": 1011, "frequency": "f", "synset": "steering_wheel.n.01"}, - {"name": "stepladder", "id": 1012, "frequency": "r", "synset": "step_ladder.n.01"}, - {"name": "step_stool", "id": 1013, "frequency": "c", "synset": "step_stool.n.01"}, - {"name": "stereo_(sound_system)", "id": 1014, "frequency": "c", "synset": "stereo.n.01"}, - {"name": "stew", "id": 1015, "frequency": "r", "synset": "stew.n.02"}, - {"name": "stirrer", "id": 1016, "frequency": "r", "synset": "stirrer.n.02"}, - {"name": "stirrup", "id": 1017, "frequency": "f", "synset": "stirrup.n.01"}, - {"name": "stool", "id": 1018, "frequency": "f", "synset": "stool.n.01"}, - {"name": "stop_sign", "id": 1019, "frequency": "f", "synset": "stop_sign.n.01"}, - {"name": "brake_light", "id": 1020, "frequency": "f", "synset": "stoplight.n.01"}, - {"name": "stove", "id": 1021, "frequency": "f", "synset": "stove.n.01"}, - {"name": "strainer", "id": 1022, "frequency": "c", "synset": "strainer.n.01"}, - {"name": "strap", "id": 1023, "frequency": "f", "synset": "strap.n.01"}, - {"name": "straw_(for_drinking)", "id": 1024, "frequency": "f", "synset": "straw.n.04"}, - {"name": "strawberry", "id": 1025, "frequency": "f", "synset": "strawberry.n.01"}, - {"name": "street_sign", "id": 1026, "frequency": "f", "synset": "street_sign.n.01"}, - {"name": "streetlight", "id": 1027, "frequency": "f", "synset": "streetlight.n.01"}, - {"name": "string_cheese", "id": 1028, "frequency": "r", "synset": "string_cheese.n.01"}, - {"name": "stylus", "id": 1029, "frequency": "r", "synset": "stylus.n.02"}, - {"name": "subwoofer", "id": 1030, "frequency": "r", "synset": "subwoofer.n.01"}, - {"name": "sugar_bowl", "id": 1031, "frequency": "r", "synset": "sugar_bowl.n.01"}, - {"name": "sugarcane_(plant)", "id": 1032, "frequency": "r", "synset": "sugarcane.n.01"}, - {"name": "suit_(clothing)", "id": 1033, "frequency": "f", "synset": "suit.n.01"}, - {"name": "sunflower", "id": 1034, "frequency": "c", "synset": "sunflower.n.01"}, - {"name": "sunglasses", "id": 1035, "frequency": "f", "synset": "sunglasses.n.01"}, - {"name": "sunhat", "id": 1036, "frequency": "c", "synset": "sunhat.n.01"}, - {"name": "surfboard", "id": 1037, "frequency": "f", "synset": "surfboard.n.01"}, - {"name": "sushi", "id": 1038, "frequency": "c", "synset": "sushi.n.01"}, - {"name": "mop", "id": 1039, "frequency": "c", "synset": "swab.n.02"}, - {"name": "sweat_pants", "id": 1040, "frequency": "c", "synset": "sweat_pants.n.01"}, - {"name": "sweatband", "id": 1041, "frequency": "c", "synset": "sweatband.n.02"}, - {"name": "sweater", "id": 1042, "frequency": "f", "synset": "sweater.n.01"}, - {"name": "sweatshirt", "id": 1043, "frequency": "f", "synset": "sweatshirt.n.01"}, - {"name": "sweet_potato", "id": 1044, "frequency": "c", "synset": "sweet_potato.n.02"}, - {"name": "swimsuit", "id": 1045, "frequency": "f", "synset": "swimsuit.n.01"}, - {"name": "sword", "id": 1046, "frequency": "c", "synset": "sword.n.01"}, - {"name": "syringe", "id": 1047, "frequency": "r", "synset": "syringe.n.01"}, - {"name": "Tabasco_sauce", "id": 1048, "frequency": "r", "synset": "tabasco.n.02"}, - { - "name": "table-tennis_table", - "id": 1049, - "frequency": "r", - "synset": "table-tennis_table.n.01", - }, - {"name": "table", "id": 1050, "frequency": "f", "synset": "table.n.02"}, - {"name": "table_lamp", "id": 1051, "frequency": "c", "synset": "table_lamp.n.01"}, - {"name": "tablecloth", "id": 1052, "frequency": "f", "synset": "tablecloth.n.01"}, - {"name": "tachometer", "id": 1053, "frequency": "r", "synset": "tachometer.n.01"}, - {"name": "taco", "id": 1054, "frequency": "r", "synset": "taco.n.02"}, - {"name": "tag", "id": 1055, "frequency": "f", "synset": "tag.n.02"}, - {"name": "taillight", "id": 1056, "frequency": "f", "synset": "taillight.n.01"}, - {"name": "tambourine", "id": 1057, "frequency": "r", "synset": "tambourine.n.01"}, - {"name": "army_tank", "id": 1058, "frequency": "r", "synset": "tank.n.01"}, - {"name": "tank_(storage_vessel)", "id": 1059, "frequency": "f", "synset": "tank.n.02"}, - {"name": "tank_top_(clothing)", "id": 1060, "frequency": "f", "synset": "tank_top.n.01"}, - {"name": "tape_(sticky_cloth_or_paper)", "id": 1061, "frequency": "f", "synset": "tape.n.01"}, - {"name": "tape_measure", "id": 1062, "frequency": "c", "synset": "tape.n.04"}, - {"name": "tapestry", "id": 1063, "frequency": "c", "synset": "tapestry.n.02"}, - {"name": "tarp", "id": 1064, "frequency": "f", "synset": "tarpaulin.n.01"}, - {"name": "tartan", "id": 1065, "frequency": "c", "synset": "tartan.n.01"}, - {"name": "tassel", "id": 1066, "frequency": "c", "synset": "tassel.n.01"}, - {"name": "tea_bag", "id": 1067, "frequency": "c", "synset": "tea_bag.n.01"}, - {"name": "teacup", "id": 1068, "frequency": "c", "synset": "teacup.n.02"}, - {"name": "teakettle", "id": 1069, "frequency": "c", "synset": "teakettle.n.01"}, - {"name": "teapot", "id": 1070, "frequency": "f", "synset": "teapot.n.01"}, - {"name": "teddy_bear", "id": 1071, "frequency": "f", "synset": "teddy.n.01"}, - {"name": "telephone", "id": 1072, "frequency": "f", "synset": "telephone.n.01"}, - {"name": "telephone_booth", "id": 1073, "frequency": "c", "synset": "telephone_booth.n.01"}, - {"name": "telephone_pole", "id": 1074, "frequency": "f", "synset": "telephone_pole.n.01"}, - {"name": "telephoto_lens", "id": 1075, "frequency": "r", "synset": "telephoto_lens.n.01"}, - {"name": "television_camera", "id": 1076, "frequency": "c", "synset": "television_camera.n.01"}, - {"name": "television_set", "id": 1077, "frequency": "f", "synset": "television_receiver.n.01"}, - {"name": "tennis_ball", "id": 1078, "frequency": "f", "synset": "tennis_ball.n.01"}, - {"name": "tennis_racket", "id": 1079, "frequency": "f", "synset": "tennis_racket.n.01"}, - {"name": "tequila", "id": 1080, "frequency": "r", "synset": "tequila.n.01"}, - {"name": "thermometer", "id": 1081, "frequency": "c", "synset": "thermometer.n.01"}, - {"name": "thermos_bottle", "id": 1082, "frequency": "c", "synset": "thermos.n.01"}, - {"name": "thermostat", "id": 1083, "frequency": "f", "synset": "thermostat.n.01"}, - {"name": "thimble", "id": 1084, "frequency": "r", "synset": "thimble.n.02"}, - {"name": "thread", "id": 1085, "frequency": "c", "synset": "thread.n.01"}, - {"name": "thumbtack", "id": 1086, "frequency": "c", "synset": "thumbtack.n.01"}, - {"name": "tiara", "id": 1087, "frequency": "c", "synset": "tiara.n.01"}, - {"name": "tiger", "id": 1088, "frequency": "c", "synset": "tiger.n.02"}, - {"name": "tights_(clothing)", "id": 1089, "frequency": "c", "synset": "tights.n.01"}, - {"name": "timer", "id": 1090, "frequency": "c", "synset": "timer.n.01"}, - {"name": "tinfoil", "id": 1091, "frequency": "f", "synset": "tinfoil.n.01"}, - {"name": "tinsel", "id": 1092, "frequency": "c", "synset": "tinsel.n.01"}, - {"name": "tissue_paper", "id": 1093, "frequency": "f", "synset": "tissue.n.02"}, - {"name": "toast_(food)", "id": 1094, "frequency": "c", "synset": "toast.n.01"}, - {"name": "toaster", "id": 1095, "frequency": "f", "synset": "toaster.n.02"}, - {"name": "toaster_oven", "id": 1096, "frequency": "f", "synset": "toaster_oven.n.01"}, - {"name": "toilet", "id": 1097, "frequency": "f", "synset": "toilet.n.02"}, - {"name": "toilet_tissue", "id": 1098, "frequency": "f", "synset": "toilet_tissue.n.01"}, - {"name": "tomato", "id": 1099, "frequency": "f", "synset": "tomato.n.01"}, - {"name": "tongs", "id": 1100, "frequency": "f", "synset": "tongs.n.01"}, - {"name": "toolbox", "id": 1101, "frequency": "c", "synset": "toolbox.n.01"}, - {"name": "toothbrush", "id": 1102, "frequency": "f", "synset": "toothbrush.n.01"}, - {"name": "toothpaste", "id": 1103, "frequency": "f", "synset": "toothpaste.n.01"}, - {"name": "toothpick", "id": 1104, "frequency": "f", "synset": "toothpick.n.01"}, - {"name": "cover", "id": 1105, "frequency": "f", "synset": "top.n.09"}, - {"name": "tortilla", "id": 1106, "frequency": "c", "synset": "tortilla.n.01"}, - {"name": "tow_truck", "id": 1107, "frequency": "c", "synset": "tow_truck.n.01"}, - {"name": "towel", "id": 1108, "frequency": "f", "synset": "towel.n.01"}, - {"name": "towel_rack", "id": 1109, "frequency": "f", "synset": "towel_rack.n.01"}, - {"name": "toy", "id": 1110, "frequency": "f", "synset": "toy.n.03"}, - {"name": "tractor_(farm_equipment)", "id": 1111, "frequency": "c", "synset": "tractor.n.01"}, - {"name": "traffic_light", "id": 1112, "frequency": "f", "synset": "traffic_light.n.01"}, - {"name": "dirt_bike", "id": 1113, "frequency": "c", "synset": "trail_bike.n.01"}, - {"name": "trailer_truck", "id": 1114, "frequency": "f", "synset": "trailer_truck.n.01"}, - {"name": "train_(railroad_vehicle)", "id": 1115, "frequency": "f", "synset": "train.n.01"}, - {"name": "trampoline", "id": 1116, "frequency": "r", "synset": "trampoline.n.01"}, - {"name": "tray", "id": 1117, "frequency": "f", "synset": "tray.n.01"}, - {"name": "trench_coat", "id": 1118, "frequency": "r", "synset": "trench_coat.n.01"}, - { - "name": "triangle_(musical_instrument)", - "id": 1119, - "frequency": "r", - "synset": "triangle.n.05", - }, - {"name": "tricycle", "id": 1120, "frequency": "c", "synset": "tricycle.n.01"}, - {"name": "tripod", "id": 1121, "frequency": "f", "synset": "tripod.n.01"}, - {"name": "trousers", "id": 1122, "frequency": "f", "synset": "trouser.n.01"}, - {"name": "truck", "id": 1123, "frequency": "f", "synset": "truck.n.01"}, - {"name": "truffle_(chocolate)", "id": 1124, "frequency": "r", "synset": "truffle.n.03"}, - {"name": "trunk", "id": 1125, "frequency": "c", "synset": "trunk.n.02"}, - {"name": "vat", "id": 1126, "frequency": "r", "synset": "tub.n.02"}, - {"name": "turban", "id": 1127, "frequency": "c", "synset": "turban.n.01"}, - {"name": "turkey_(food)", "id": 1128, "frequency": "c", "synset": "turkey.n.04"}, - {"name": "turnip", "id": 1129, "frequency": "r", "synset": "turnip.n.01"}, - {"name": "turtle", "id": 1130, "frequency": "c", "synset": "turtle.n.02"}, - {"name": "turtleneck_(clothing)", "id": 1131, "frequency": "c", "synset": "turtleneck.n.01"}, - {"name": "typewriter", "id": 1132, "frequency": "c", "synset": "typewriter.n.01"}, - {"name": "umbrella", "id": 1133, "frequency": "f", "synset": "umbrella.n.01"}, - {"name": "underwear", "id": 1134, "frequency": "f", "synset": "underwear.n.01"}, - {"name": "unicycle", "id": 1135, "frequency": "r", "synset": "unicycle.n.01"}, - {"name": "urinal", "id": 1136, "frequency": "f", "synset": "urinal.n.01"}, - {"name": "urn", "id": 1137, "frequency": "c", "synset": "urn.n.01"}, - {"name": "vacuum_cleaner", "id": 1138, "frequency": "c", "synset": "vacuum.n.04"}, - {"name": "vase", "id": 1139, "frequency": "f", "synset": "vase.n.01"}, - {"name": "vending_machine", "id": 1140, "frequency": "c", "synset": "vending_machine.n.01"}, - {"name": "vent", "id": 1141, "frequency": "f", "synset": "vent.n.01"}, - {"name": "vest", "id": 1142, "frequency": "f", "synset": "vest.n.01"}, - {"name": "videotape", "id": 1143, "frequency": "c", "synset": "videotape.n.01"}, - {"name": "vinegar", "id": 1144, "frequency": "r", "synset": "vinegar.n.01"}, - {"name": "violin", "id": 1145, "frequency": "r", "synset": "violin.n.01"}, - {"name": "vodka", "id": 1146, "frequency": "r", "synset": "vodka.n.01"}, - {"name": "volleyball", "id": 1147, "frequency": "c", "synset": "volleyball.n.02"}, - {"name": "vulture", "id": 1148, "frequency": "r", "synset": "vulture.n.01"}, - {"name": "waffle", "id": 1149, "frequency": "c", "synset": "waffle.n.01"}, - {"name": "waffle_iron", "id": 1150, "frequency": "r", "synset": "waffle_iron.n.01"}, - {"name": "wagon", "id": 1151, "frequency": "c", "synset": "wagon.n.01"}, - {"name": "wagon_wheel", "id": 1152, "frequency": "c", "synset": "wagon_wheel.n.01"}, - {"name": "walking_stick", "id": 1153, "frequency": "c", "synset": "walking_stick.n.01"}, - {"name": "wall_clock", "id": 1154, "frequency": "c", "synset": "wall_clock.n.01"}, - {"name": "wall_socket", "id": 1155, "frequency": "f", "synset": "wall_socket.n.01"}, - {"name": "wallet", "id": 1156, "frequency": "f", "synset": "wallet.n.01"}, - {"name": "walrus", "id": 1157, "frequency": "r", "synset": "walrus.n.01"}, - {"name": "wardrobe", "id": 1158, "frequency": "r", "synset": "wardrobe.n.01"}, - {"name": "washbasin", "id": 1159, "frequency": "r", "synset": "washbasin.n.01"}, - {"name": "automatic_washer", "id": 1160, "frequency": "c", "synset": "washer.n.03"}, - {"name": "watch", "id": 1161, "frequency": "f", "synset": "watch.n.01"}, - {"name": "water_bottle", "id": 1162, "frequency": "f", "synset": "water_bottle.n.01"}, - {"name": "water_cooler", "id": 1163, "frequency": "c", "synset": "water_cooler.n.01"}, - {"name": "water_faucet", "id": 1164, "frequency": "c", "synset": "water_faucet.n.01"}, - {"name": "water_heater", "id": 1165, "frequency": "r", "synset": "water_heater.n.01"}, - {"name": "water_jug", "id": 1166, "frequency": "c", "synset": "water_jug.n.01"}, - {"name": "water_gun", "id": 1167, "frequency": "r", "synset": "water_pistol.n.01"}, - {"name": "water_scooter", "id": 1168, "frequency": "c", "synset": "water_scooter.n.01"}, - {"name": "water_ski", "id": 1169, "frequency": "c", "synset": "water_ski.n.01"}, - {"name": "water_tower", "id": 1170, "frequency": "c", "synset": "water_tower.n.01"}, - {"name": "watering_can", "id": 1171, "frequency": "c", "synset": "watering_can.n.01"}, - {"name": "watermelon", "id": 1172, "frequency": "f", "synset": "watermelon.n.02"}, - {"name": "weathervane", "id": 1173, "frequency": "f", "synset": "weathervane.n.01"}, - {"name": "webcam", "id": 1174, "frequency": "c", "synset": "webcam.n.01"}, - {"name": "wedding_cake", "id": 1175, "frequency": "c", "synset": "wedding_cake.n.01"}, - {"name": "wedding_ring", "id": 1176, "frequency": "c", "synset": "wedding_ring.n.01"}, - {"name": "wet_suit", "id": 1177, "frequency": "f", "synset": "wet_suit.n.01"}, - {"name": "wheel", "id": 1178, "frequency": "f", "synset": "wheel.n.01"}, - {"name": "wheelchair", "id": 1179, "frequency": "c", "synset": "wheelchair.n.01"}, - {"name": "whipped_cream", "id": 1180, "frequency": "c", "synset": "whipped_cream.n.01"}, - {"name": "whistle", "id": 1181, "frequency": "c", "synset": "whistle.n.03"}, - {"name": "wig", "id": 1182, "frequency": "c", "synset": "wig.n.01"}, - {"name": "wind_chime", "id": 1183, "frequency": "c", "synset": "wind_chime.n.01"}, - {"name": "windmill", "id": 1184, "frequency": "c", "synset": "windmill.n.01"}, - {"name": "window_box_(for_plants)", "id": 1185, "frequency": "c", "synset": "window_box.n.01"}, - {"name": "windshield_wiper", "id": 1186, "frequency": "f", "synset": "windshield_wiper.n.01"}, - {"name": "windsock", "id": 1187, "frequency": "c", "synset": "windsock.n.01"}, - {"name": "wine_bottle", "id": 1188, "frequency": "f", "synset": "wine_bottle.n.01"}, - {"name": "wine_bucket", "id": 1189, "frequency": "c", "synset": "wine_bucket.n.01"}, - {"name": "wineglass", "id": 1190, "frequency": "f", "synset": "wineglass.n.01"}, - {"name": "blinder_(for_horses)", "id": 1191, "frequency": "f", "synset": "winker.n.02"}, - {"name": "wok", "id": 1192, "frequency": "c", "synset": "wok.n.01"}, - {"name": "wolf", "id": 1193, "frequency": "r", "synset": "wolf.n.01"}, - {"name": "wooden_spoon", "id": 1194, "frequency": "c", "synset": "wooden_spoon.n.02"}, - {"name": "wreath", "id": 1195, "frequency": "c", "synset": "wreath.n.01"}, - {"name": "wrench", "id": 1196, "frequency": "c", "synset": "wrench.n.03"}, - {"name": "wristband", "id": 1197, "frequency": "f", "synset": "wristband.n.01"}, - {"name": "wristlet", "id": 1198, "frequency": "f", "synset": "wristlet.n.01"}, - {"name": "yacht", "id": 1199, "frequency": "c", "synset": "yacht.n.01"}, - {"name": "yogurt", "id": 1200, "frequency": "c", "synset": "yogurt.n.01"}, - {"name": "yoke_(animal_equipment)", "id": 1201, "frequency": "c", "synset": "yoke.n.07"}, - {"name": "zebra", "id": 1202, "frequency": "f", "synset": "zebra.n.01"}, - {"name": "zucchini", "id": 1203, "frequency": "c", "synset": "zucchini.n.02"}, - {"id": 1204, "synset": "organism.n.01", "name": "organism"}, - {"id": 1205, "synset": "benthos.n.02", "name": "benthos"}, - {"id": 1206, "synset": "heterotroph.n.01", "name": "heterotroph"}, - {"id": 1207, "synset": "cell.n.02", "name": "cell"}, - {"id": 1208, "synset": "animal.n.01", "name": "animal"}, - {"id": 1209, "synset": "plant.n.02", "name": "plant"}, - {"id": 1210, "synset": "food.n.01", "name": "food"}, - {"id": 1211, "synset": "artifact.n.01", "name": "artifact"}, - {"id": 1212, "synset": "hop.n.01", "name": "hop"}, - {"id": 1213, "synset": "check-in.n.01", "name": "check-in"}, - {"id": 1214, "synset": "dressage.n.01", "name": "dressage"}, - {"id": 1215, "synset": "curvet.n.01", "name": "curvet"}, - {"id": 1216, "synset": "piaffe.n.01", "name": "piaffe"}, - {"id": 1217, "synset": "funambulism.n.01", "name": "funambulism"}, - {"id": 1218, "synset": "rock_climbing.n.01", "name": "rock_climbing"}, - {"id": 1219, "synset": "contact_sport.n.01", "name": "contact_sport"}, - {"id": 1220, "synset": "outdoor_sport.n.01", "name": "outdoor_sport"}, - {"id": 1221, "synset": "gymnastics.n.01", "name": "gymnastics"}, - {"id": 1222, "synset": "acrobatics.n.01", "name": "acrobatics"}, - {"id": 1223, "synset": "track_and_field.n.01", "name": "track_and_field"}, - {"id": 1224, "synset": "track.n.11", "name": "track"}, - {"id": 1225, "synset": "jumping.n.01", "name": "jumping"}, - {"id": 1226, "synset": "broad_jump.n.02", "name": "broad_jump"}, - {"id": 1227, "synset": "high_jump.n.02", "name": "high_jump"}, - {"id": 1228, "synset": "fosbury_flop.n.01", "name": "Fosbury_flop"}, - {"id": 1229, "synset": "skiing.n.01", "name": "skiing"}, - {"id": 1230, "synset": "cross-country_skiing.n.01", "name": "cross-country_skiing"}, - {"id": 1231, "synset": "ski_jumping.n.01", "name": "ski_jumping"}, - {"id": 1232, "synset": "water_sport.n.01", "name": "water_sport"}, - {"id": 1233, "synset": "swimming.n.01", "name": "swimming"}, - {"id": 1234, "synset": "bathe.n.01", "name": "bathe"}, - {"id": 1235, "synset": "dip.n.08", "name": "dip"}, - {"id": 1236, "synset": "dive.n.02", "name": "dive"}, - {"id": 1237, "synset": "floating.n.01", "name": "floating"}, - {"id": 1238, "synset": "dead-man's_float.n.01", "name": "dead-man's_float"}, - {"id": 1239, "synset": "belly_flop.n.01", "name": "belly_flop"}, - {"id": 1240, "synset": "cliff_diving.n.01", "name": "cliff_diving"}, - {"id": 1241, "synset": "flip.n.05", "name": "flip"}, - {"id": 1242, "synset": "gainer.n.03", "name": "gainer"}, - {"id": 1243, "synset": "half_gainer.n.01", "name": "half_gainer"}, - {"id": 1244, "synset": "jackknife.n.02", "name": "jackknife"}, - {"id": 1245, "synset": "swan_dive.n.01", "name": "swan_dive"}, - {"id": 1246, "synset": "skin_diving.n.01", "name": "skin_diving"}, - {"id": 1247, "synset": "scuba_diving.n.01", "name": "scuba_diving"}, - {"id": 1248, "synset": "snorkeling.n.01", "name": "snorkeling"}, - {"id": 1249, "synset": "surfing.n.01", "name": "surfing"}, - {"id": 1250, "synset": "water-skiing.n.01", "name": "water-skiing"}, - {"id": 1251, "synset": "rowing.n.01", "name": "rowing"}, - {"id": 1252, "synset": "sculling.n.01", "name": "sculling"}, - {"id": 1253, "synset": "boxing.n.01", "name": "boxing"}, - {"id": 1254, "synset": "professional_boxing.n.01", "name": "professional_boxing"}, - {"id": 1255, "synset": "in-fighting.n.02", "name": "in-fighting"}, - {"id": 1256, "synset": "fight.n.05", "name": "fight"}, - {"id": 1257, "synset": "rope-a-dope.n.01", "name": "rope-a-dope"}, - {"id": 1258, "synset": "spar.n.03", "name": "spar"}, - {"id": 1259, "synset": "archery.n.01", "name": "archery"}, - {"id": 1260, "synset": "sledding.n.01", "name": "sledding"}, - {"id": 1261, "synset": "tobogganing.n.01", "name": "tobogganing"}, - {"id": 1262, "synset": "luging.n.01", "name": "luging"}, - {"id": 1263, "synset": "bobsledding.n.01", "name": "bobsledding"}, - {"id": 1264, "synset": "wrestling.n.02", "name": "wrestling"}, - {"id": 1265, "synset": "greco-roman_wrestling.n.01", "name": "Greco-Roman_wrestling"}, - {"id": 1266, "synset": "professional_wrestling.n.01", "name": "professional_wrestling"}, - {"id": 1267, "synset": "sumo.n.01", "name": "sumo"}, - {"id": 1268, "synset": "skating.n.01", "name": "skating"}, - {"id": 1269, "synset": "ice_skating.n.01", "name": "ice_skating"}, - {"id": 1270, "synset": "figure_skating.n.01", "name": "figure_skating"}, - {"id": 1271, "synset": "rollerblading.n.01", "name": "rollerblading"}, - {"id": 1272, "synset": "roller_skating.n.01", "name": "roller_skating"}, - {"id": 1273, "synset": "skateboarding.n.01", "name": "skateboarding"}, - {"id": 1274, "synset": "speed_skating.n.01", "name": "speed_skating"}, - {"id": 1275, "synset": "racing.n.01", "name": "racing"}, - {"id": 1276, "synset": "auto_racing.n.01", "name": "auto_racing"}, - {"id": 1277, "synset": "boat_racing.n.01", "name": "boat_racing"}, - {"id": 1278, "synset": "hydroplane_racing.n.01", "name": "hydroplane_racing"}, - {"id": 1279, "synset": "camel_racing.n.01", "name": "camel_racing"}, - {"id": 1280, "synset": "greyhound_racing.n.01", "name": "greyhound_racing"}, - {"id": 1281, "synset": "horse_racing.n.01", "name": "horse_racing"}, - {"id": 1282, "synset": "riding.n.01", "name": "riding"}, - {"id": 1283, "synset": "equestrian_sport.n.01", "name": "equestrian_sport"}, - {"id": 1284, "synset": "pony-trekking.n.01", "name": "pony-trekking"}, - {"id": 1285, "synset": "showjumping.n.01", "name": "showjumping"}, - {"id": 1286, "synset": "cross-country_riding.n.01", "name": "cross-country_riding"}, - {"id": 1287, "synset": "cycling.n.01", "name": "cycling"}, - {"id": 1288, "synset": "bicycling.n.01", "name": "bicycling"}, - {"id": 1289, "synset": "motorcycling.n.01", "name": "motorcycling"}, - {"id": 1290, "synset": "dune_cycling.n.01", "name": "dune_cycling"}, - {"id": 1291, "synset": "blood_sport.n.01", "name": "blood_sport"}, - {"id": 1292, "synset": "bullfighting.n.01", "name": "bullfighting"}, - {"id": 1293, "synset": "cockfighting.n.01", "name": "cockfighting"}, - {"id": 1294, "synset": "hunt.n.08", "name": "hunt"}, - {"id": 1295, "synset": "battue.n.01", "name": "battue"}, - {"id": 1296, "synset": "beagling.n.01", "name": "beagling"}, - {"id": 1297, "synset": "coursing.n.01", "name": "coursing"}, - {"id": 1298, "synset": "deer_hunting.n.01", "name": "deer_hunting"}, - {"id": 1299, "synset": "ducking.n.01", "name": "ducking"}, - {"id": 1300, "synset": "fox_hunting.n.01", "name": "fox_hunting"}, - {"id": 1301, "synset": "pigsticking.n.01", "name": "pigsticking"}, - {"id": 1302, "synset": "fishing.n.01", "name": "fishing"}, - {"id": 1303, "synset": "angling.n.01", "name": "angling"}, - {"id": 1304, "synset": "fly-fishing.n.01", "name": "fly-fishing"}, - {"id": 1305, "synset": "troll.n.04", "name": "troll"}, - {"id": 1306, "synset": "casting.n.03", "name": "casting"}, - {"id": 1307, "synset": "bait_casting.n.01", "name": "bait_casting"}, - {"id": 1308, "synset": "fly_casting.n.01", "name": "fly_casting"}, - {"id": 1309, "synset": "overcast.n.04", "name": "overcast"}, - {"id": 1310, "synset": "surf_casting.n.01", "name": "surf_casting"}, - {"id": 1311, "synset": "day_game.n.01", "name": "day_game"}, - {"id": 1312, "synset": "athletic_game.n.01", "name": "athletic_game"}, - {"id": 1313, "synset": "ice_hockey.n.01", "name": "ice_hockey"}, - {"id": 1314, "synset": "tetherball.n.01", "name": "tetherball"}, - {"id": 1315, "synset": "water_polo.n.01", "name": "water_polo"}, - {"id": 1316, "synset": "outdoor_game.n.01", "name": "outdoor_game"}, - {"id": 1317, "synset": "golf.n.01", "name": "golf"}, - {"id": 1318, "synset": "professional_golf.n.01", "name": "professional_golf"}, - {"id": 1319, "synset": "round_of_golf.n.01", "name": "round_of_golf"}, - {"id": 1320, "synset": "medal_play.n.01", "name": "medal_play"}, - {"id": 1321, "synset": "match_play.n.01", "name": "match_play"}, - {"id": 1322, "synset": "miniature_golf.n.01", "name": "miniature_golf"}, - {"id": 1323, "synset": "croquet.n.01", "name": "croquet"}, - {"id": 1324, "synset": "quoits.n.01", "name": "quoits"}, - {"id": 1325, "synset": "shuffleboard.n.01", "name": "shuffleboard"}, - {"id": 1326, "synset": "field_game.n.01", "name": "field_game"}, - {"id": 1327, "synset": "field_hockey.n.01", "name": "field_hockey"}, - {"id": 1328, "synset": "shinny.n.01", "name": "shinny"}, - {"id": 1329, "synset": "football.n.01", "name": "football"}, - {"id": 1330, "synset": "american_football.n.01", "name": "American_football"}, - {"id": 1331, "synset": "professional_football.n.01", "name": "professional_football"}, - {"id": 1332, "synset": "touch_football.n.01", "name": "touch_football"}, - {"id": 1333, "synset": "hurling.n.01", "name": "hurling"}, - {"id": 1334, "synset": "rugby.n.01", "name": "rugby"}, - {"id": 1335, "synset": "ball_game.n.01", "name": "ball_game"}, - {"id": 1336, "synset": "baseball.n.01", "name": "baseball"}, - {"id": 1337, "synset": "ball.n.11", "name": "ball"}, - {"id": 1338, "synset": "professional_baseball.n.01", "name": "professional_baseball"}, - {"id": 1339, "synset": "hardball.n.02", "name": "hardball"}, - {"id": 1340, "synset": "perfect_game.n.01", "name": "perfect_game"}, - {"id": 1341, "synset": "no-hit_game.n.01", "name": "no-hit_game"}, - {"id": 1342, "synset": "one-hitter.n.01", "name": "one-hitter"}, - {"id": 1343, "synset": "two-hitter.n.01", "name": "two-hitter"}, - {"id": 1344, "synset": "three-hitter.n.01", "name": "three-hitter"}, - {"id": 1345, "synset": "four-hitter.n.01", "name": "four-hitter"}, - {"id": 1346, "synset": "five-hitter.n.01", "name": "five-hitter"}, - {"id": 1347, "synset": "softball.n.02", "name": "softball"}, - {"id": 1348, "synset": "rounders.n.01", "name": "rounders"}, - {"id": 1349, "synset": "stickball.n.01", "name": "stickball"}, - {"id": 1350, "synset": "cricket.n.02", "name": "cricket"}, - {"id": 1351, "synset": "lacrosse.n.01", "name": "lacrosse"}, - {"id": 1352, "synset": "polo.n.02", "name": "polo"}, - {"id": 1353, "synset": "pushball.n.01", "name": "pushball"}, - {"id": 1354, "synset": "soccer.n.01", "name": "soccer"}, - {"id": 1355, "synset": "court_game.n.01", "name": "court_game"}, - {"id": 1356, "synset": "handball.n.02", "name": "handball"}, - {"id": 1357, "synset": "racquetball.n.02", "name": "racquetball"}, - {"id": 1358, "synset": "fives.n.01", "name": "fives"}, - {"id": 1359, "synset": "squash.n.03", "name": "squash"}, - {"id": 1360, "synset": "volleyball.n.01", "name": "volleyball"}, - {"id": 1361, "synset": "jai_alai.n.01", "name": "jai_alai"}, - {"id": 1362, "synset": "badminton.n.01", "name": "badminton"}, - {"id": 1363, "synset": "battledore.n.02", "name": "battledore"}, - {"id": 1364, "synset": "basketball.n.01", "name": "basketball"}, - {"id": 1365, "synset": "professional_basketball.n.01", "name": "professional_basketball"}, - {"id": 1366, "synset": "deck_tennis.n.01", "name": "deck_tennis"}, - {"id": 1367, "synset": "netball.n.01", "name": "netball"}, - {"id": 1368, "synset": "tennis.n.01", "name": "tennis"}, - {"id": 1369, "synset": "professional_tennis.n.01", "name": "professional_tennis"}, - {"id": 1370, "synset": "singles.n.02", "name": "singles"}, - {"id": 1371, "synset": "singles.n.01", "name": "singles"}, - {"id": 1372, "synset": "doubles.n.02", "name": "doubles"}, - {"id": 1373, "synset": "doubles.n.01", "name": "doubles"}, - {"id": 1374, "synset": "royal_tennis.n.01", "name": "royal_tennis"}, - {"id": 1375, "synset": "pallone.n.01", "name": "pallone"}, - {"id": 1376, "synset": "sport.n.01", "name": "sport"}, - {"id": 1377, "synset": "clasp.n.02", "name": "clasp"}, - {"id": 1378, "synset": "judo.n.01", "name": "judo"}, - {"id": 1379, "synset": "team_sport.n.01", "name": "team_sport"}, - {"id": 1380, "synset": "last_supper.n.01", "name": "Last_Supper"}, - {"id": 1381, "synset": "seder.n.01", "name": "Seder"}, - {"id": 1382, "synset": "camping.n.01", "name": "camping"}, - {"id": 1383, "synset": "pest.n.04", "name": "pest"}, - {"id": 1384, "synset": "critter.n.01", "name": "critter"}, - {"id": 1385, "synset": "creepy-crawly.n.01", "name": "creepy-crawly"}, - {"id": 1386, "synset": "darter.n.02", "name": "darter"}, - {"id": 1387, "synset": "peeper.n.03", "name": "peeper"}, - {"id": 1388, "synset": "homeotherm.n.01", "name": "homeotherm"}, - {"id": 1389, "synset": "poikilotherm.n.01", "name": "poikilotherm"}, - {"id": 1390, "synset": "range_animal.n.01", "name": "range_animal"}, - {"id": 1391, "synset": "scavenger.n.03", "name": "scavenger"}, - {"id": 1392, "synset": "bottom-feeder.n.02", "name": "bottom-feeder"}, - {"id": 1393, "synset": "bottom-feeder.n.01", "name": "bottom-feeder"}, - {"id": 1394, "synset": "work_animal.n.01", "name": "work_animal"}, - {"id": 1395, "synset": "beast_of_burden.n.01", "name": "beast_of_burden"}, - {"id": 1396, "synset": "draft_animal.n.01", "name": "draft_animal"}, - {"id": 1397, "synset": "pack_animal.n.01", "name": "pack_animal"}, - {"id": 1398, "synset": "domestic_animal.n.01", "name": "domestic_animal"}, - {"id": 1399, "synset": "feeder.n.01", "name": "feeder"}, - {"id": 1400, "synset": "feeder.n.06", "name": "feeder"}, - {"id": 1401, "synset": "stocker.n.01", "name": "stocker"}, - {"id": 1402, "synset": "hatchling.n.01", "name": "hatchling"}, - {"id": 1403, "synset": "head.n.02", "name": "head"}, - {"id": 1404, "synset": "migrator.n.02", "name": "migrator"}, - {"id": 1405, "synset": "molter.n.01", "name": "molter"}, - {"id": 1406, "synset": "stayer.n.01", "name": "stayer"}, - {"id": 1407, "synset": "stunt.n.02", "name": "stunt"}, - {"id": 1408, "synset": "marine_animal.n.01", "name": "marine_animal"}, - {"id": 1409, "synset": "by-catch.n.01", "name": "by-catch"}, - {"id": 1410, "synset": "female.n.01", "name": "female"}, - {"id": 1411, "synset": "hen.n.04", "name": "hen"}, - {"id": 1412, "synset": "male.n.01", "name": "male"}, - {"id": 1413, "synset": "adult.n.02", "name": "adult"}, - {"id": 1414, "synset": "young.n.01", "name": "young"}, - {"id": 1415, "synset": "orphan.n.04", "name": "orphan"}, - {"id": 1416, "synset": "young_mammal.n.01", "name": "young_mammal"}, - {"id": 1417, "synset": "baby.n.06", "name": "baby"}, - {"id": 1418, "synset": "pup.n.01", "name": "pup"}, - {"id": 1419, "synset": "wolf_pup.n.01", "name": "wolf_pup"}, - {"id": 1420, "synset": "lion_cub.n.01", "name": "lion_cub"}, - {"id": 1421, "synset": "bear_cub.n.01", "name": "bear_cub"}, - {"id": 1422, "synset": "tiger_cub.n.01", "name": "tiger_cub"}, - {"id": 1423, "synset": "kit.n.03", "name": "kit"}, - {"id": 1424, "synset": "suckling.n.03", "name": "suckling"}, - {"id": 1425, "synset": "sire.n.03", "name": "sire"}, - {"id": 1426, "synset": "dam.n.03", "name": "dam"}, - {"id": 1427, "synset": "thoroughbred.n.03", "name": "thoroughbred"}, - {"id": 1428, "synset": "giant.n.01", "name": "giant"}, - {"id": 1429, "synset": "mutant.n.02", "name": "mutant"}, - {"id": 1430, "synset": "carnivore.n.02", "name": "carnivore"}, - {"id": 1431, "synset": "herbivore.n.01", "name": "herbivore"}, - {"id": 1432, "synset": "insectivore.n.02", "name": "insectivore"}, - {"id": 1433, "synset": "acrodont.n.01", "name": "acrodont"}, - {"id": 1434, "synset": "pleurodont.n.01", "name": "pleurodont"}, - {"id": 1435, "synset": "microorganism.n.01", "name": "microorganism"}, - {"id": 1436, "synset": "monohybrid.n.01", "name": "monohybrid"}, - {"id": 1437, "synset": "arbovirus.n.01", "name": "arbovirus"}, - {"id": 1438, "synset": "adenovirus.n.01", "name": "adenovirus"}, - {"id": 1439, "synset": "arenavirus.n.01", "name": "arenavirus"}, - {"id": 1440, "synset": "marburg_virus.n.01", "name": "Marburg_virus"}, - {"id": 1441, "synset": "arenaviridae.n.01", "name": "Arenaviridae"}, - {"id": 1442, "synset": "vesiculovirus.n.01", "name": "vesiculovirus"}, - {"id": 1443, "synset": "reoviridae.n.01", "name": "Reoviridae"}, - {"id": 1444, "synset": "variola_major.n.02", "name": "variola_major"}, - {"id": 1445, "synset": "viroid.n.01", "name": "viroid"}, - {"id": 1446, "synset": "coliphage.n.01", "name": "coliphage"}, - {"id": 1447, "synset": "paramyxovirus.n.01", "name": "paramyxovirus"}, - {"id": 1448, "synset": "poliovirus.n.01", "name": "poliovirus"}, - {"id": 1449, "synset": "herpes.n.02", "name": "herpes"}, - {"id": 1450, "synset": "herpes_simplex_1.n.01", "name": "herpes_simplex_1"}, - {"id": 1451, "synset": "herpes_zoster.n.02", "name": "herpes_zoster"}, - {"id": 1452, "synset": "herpes_varicella_zoster.n.01", "name": "herpes_varicella_zoster"}, - {"id": 1453, "synset": "cytomegalovirus.n.01", "name": "cytomegalovirus"}, - {"id": 1454, "synset": "varicella_zoster_virus.n.01", "name": "varicella_zoster_virus"}, - {"id": 1455, "synset": "polyoma.n.01", "name": "polyoma"}, - {"id": 1456, "synset": "lyssavirus.n.01", "name": "lyssavirus"}, - {"id": 1457, "synset": "reovirus.n.01", "name": "reovirus"}, - {"id": 1458, "synset": "rotavirus.n.01", "name": "rotavirus"}, - {"id": 1459, "synset": "moneran.n.01", "name": "moneran"}, - {"id": 1460, "synset": "archaebacteria.n.01", "name": "archaebacteria"}, - {"id": 1461, "synset": "bacteroid.n.01", "name": "bacteroid"}, - {"id": 1462, "synset": "bacillus_anthracis.n.01", "name": "Bacillus_anthracis"}, - {"id": 1463, "synset": "yersinia_pestis.n.01", "name": "Yersinia_pestis"}, - {"id": 1464, "synset": "brucella.n.01", "name": "Brucella"}, - {"id": 1465, "synset": "spirillum.n.02", "name": "spirillum"}, - {"id": 1466, "synset": "botulinus.n.01", "name": "botulinus"}, - {"id": 1467, "synset": "clostridium_perfringens.n.01", "name": "clostridium_perfringens"}, - {"id": 1468, "synset": "cyanobacteria.n.01", "name": "cyanobacteria"}, - {"id": 1469, "synset": "trichodesmium.n.01", "name": "trichodesmium"}, - {"id": 1470, "synset": "nitric_bacteria.n.01", "name": "nitric_bacteria"}, - {"id": 1471, "synset": "spirillum.n.01", "name": "spirillum"}, - {"id": 1472, "synset": "francisella.n.01", "name": "Francisella"}, - {"id": 1473, "synset": "gonococcus.n.01", "name": "gonococcus"}, - { - "id": 1474, - "synset": "corynebacterium_diphtheriae.n.01", - "name": "Corynebacterium_diphtheriae", - }, - {"id": 1475, "synset": "enteric_bacteria.n.01", "name": "enteric_bacteria"}, - {"id": 1476, "synset": "klebsiella.n.01", "name": "klebsiella"}, - {"id": 1477, "synset": "salmonella_typhimurium.n.01", "name": "Salmonella_typhimurium"}, - {"id": 1478, "synset": "typhoid_bacillus.n.01", "name": "typhoid_bacillus"}, - {"id": 1479, "synset": "nitrate_bacterium.n.01", "name": "nitrate_bacterium"}, - {"id": 1480, "synset": "nitrite_bacterium.n.01", "name": "nitrite_bacterium"}, - {"id": 1481, "synset": "actinomycete.n.01", "name": "actinomycete"}, - {"id": 1482, "synset": "streptomyces.n.01", "name": "streptomyces"}, - {"id": 1483, "synset": "streptomyces_erythreus.n.01", "name": "Streptomyces_erythreus"}, - {"id": 1484, "synset": "streptomyces_griseus.n.01", "name": "Streptomyces_griseus"}, - {"id": 1485, "synset": "tubercle_bacillus.n.01", "name": "tubercle_bacillus"}, - {"id": 1486, "synset": "pus-forming_bacteria.n.01", "name": "pus-forming_bacteria"}, - {"id": 1487, "synset": "streptobacillus.n.01", "name": "streptobacillus"}, - {"id": 1488, "synset": "myxobacteria.n.01", "name": "myxobacteria"}, - {"id": 1489, "synset": "staphylococcus.n.01", "name": "staphylococcus"}, - {"id": 1490, "synset": "diplococcus.n.01", "name": "diplococcus"}, - {"id": 1491, "synset": "pneumococcus.n.01", "name": "pneumococcus"}, - {"id": 1492, "synset": "streptococcus.n.01", "name": "streptococcus"}, - {"id": 1493, "synset": "spirochete.n.01", "name": "spirochete"}, - {"id": 1494, "synset": "planktonic_algae.n.01", "name": "planktonic_algae"}, - {"id": 1495, "synset": "zooplankton.n.01", "name": "zooplankton"}, - {"id": 1496, "synset": "parasite.n.01", "name": "parasite"}, - {"id": 1497, "synset": "endoparasite.n.01", "name": "endoparasite"}, - {"id": 1498, "synset": "ectoparasite.n.01", "name": "ectoparasite"}, - {"id": 1499, "synset": "pathogen.n.01", "name": "pathogen"}, - {"id": 1500, "synset": "commensal.n.01", "name": "commensal"}, - {"id": 1501, "synset": "myrmecophile.n.01", "name": "myrmecophile"}, - {"id": 1502, "synset": "protoctist.n.01", "name": "protoctist"}, - {"id": 1503, "synset": "protozoan.n.01", "name": "protozoan"}, - {"id": 1504, "synset": "sarcodinian.n.01", "name": "sarcodinian"}, - {"id": 1505, "synset": "heliozoan.n.01", "name": "heliozoan"}, - {"id": 1506, "synset": "endameba.n.01", "name": "endameba"}, - {"id": 1507, "synset": "ameba.n.01", "name": "ameba"}, - {"id": 1508, "synset": "globigerina.n.01", "name": "globigerina"}, - {"id": 1509, "synset": "testacean.n.01", "name": "testacean"}, - {"id": 1510, "synset": "arcella.n.01", "name": "arcella"}, - {"id": 1511, "synset": "difflugia.n.01", "name": "difflugia"}, - {"id": 1512, "synset": "ciliate.n.01", "name": "ciliate"}, - {"id": 1513, "synset": "paramecium.n.01", "name": "paramecium"}, - {"id": 1514, "synset": "stentor.n.03", "name": "stentor"}, - {"id": 1515, "synset": "alga.n.01", "name": "alga"}, - {"id": 1516, "synset": "arame.n.01", "name": "arame"}, - {"id": 1517, "synset": "seagrass.n.01", "name": "seagrass"}, - {"id": 1518, "synset": "golden_algae.n.01", "name": "golden_algae"}, - {"id": 1519, "synset": "yellow-green_algae.n.01", "name": "yellow-green_algae"}, - {"id": 1520, "synset": "brown_algae.n.01", "name": "brown_algae"}, - {"id": 1521, "synset": "kelp.n.01", "name": "kelp"}, - {"id": 1522, "synset": "fucoid.n.02", "name": "fucoid"}, - {"id": 1523, "synset": "fucoid.n.01", "name": "fucoid"}, - {"id": 1524, "synset": "fucus.n.01", "name": "fucus"}, - {"id": 1525, "synset": "bladderwrack.n.01", "name": "bladderwrack"}, - {"id": 1526, "synset": "green_algae.n.01", "name": "green_algae"}, - {"id": 1527, "synset": "pond_scum.n.01", "name": "pond_scum"}, - {"id": 1528, "synset": "chlorella.n.01", "name": "chlorella"}, - {"id": 1529, "synset": "stonewort.n.01", "name": "stonewort"}, - {"id": 1530, "synset": "desmid.n.01", "name": "desmid"}, - {"id": 1531, "synset": "sea_moss.n.02", "name": "sea_moss"}, - {"id": 1532, "synset": "eukaryote.n.01", "name": "eukaryote"}, - {"id": 1533, "synset": "prokaryote.n.01", "name": "prokaryote"}, - {"id": 1534, "synset": "zooid.n.01", "name": "zooid"}, - {"id": 1535, "synset": "leishmania.n.01", "name": "Leishmania"}, - {"id": 1536, "synset": "zoomastigote.n.01", "name": "zoomastigote"}, - {"id": 1537, "synset": "polymastigote.n.01", "name": "polymastigote"}, - {"id": 1538, "synset": "costia.n.01", "name": "costia"}, - {"id": 1539, "synset": "giardia.n.01", "name": "giardia"}, - {"id": 1540, "synset": "cryptomonad.n.01", "name": "cryptomonad"}, - {"id": 1541, "synset": "sporozoan.n.01", "name": "sporozoan"}, - {"id": 1542, "synset": "sporozoite.n.01", "name": "sporozoite"}, - {"id": 1543, "synset": "trophozoite.n.01", "name": "trophozoite"}, - {"id": 1544, "synset": "merozoite.n.01", "name": "merozoite"}, - {"id": 1545, "synset": "coccidium.n.01", "name": "coccidium"}, - {"id": 1546, "synset": "gregarine.n.01", "name": "gregarine"}, - {"id": 1547, "synset": "plasmodium.n.02", "name": "plasmodium"}, - {"id": 1548, "synset": "leucocytozoan.n.01", "name": "leucocytozoan"}, - {"id": 1549, "synset": "microsporidian.n.01", "name": "microsporidian"}, - {"id": 1550, "synset": "ostariophysi.n.01", "name": "Ostariophysi"}, - {"id": 1551, "synset": "cypriniform_fish.n.01", "name": "cypriniform_fish"}, - {"id": 1552, "synset": "loach.n.01", "name": "loach"}, - {"id": 1553, "synset": "cyprinid.n.01", "name": "cyprinid"}, - {"id": 1554, "synset": "carp.n.02", "name": "carp"}, - {"id": 1555, "synset": "domestic_carp.n.01", "name": "domestic_carp"}, - {"id": 1556, "synset": "leather_carp.n.01", "name": "leather_carp"}, - {"id": 1557, "synset": "mirror_carp.n.01", "name": "mirror_carp"}, - {"id": 1558, "synset": "european_bream.n.01", "name": "European_bream"}, - {"id": 1559, "synset": "tench.n.01", "name": "tench"}, - {"id": 1560, "synset": "dace.n.01", "name": "dace"}, - {"id": 1561, "synset": "chub.n.01", "name": "chub"}, - {"id": 1562, "synset": "shiner.n.04", "name": "shiner"}, - {"id": 1563, "synset": "common_shiner.n.01", "name": "common_shiner"}, - {"id": 1564, "synset": "roach.n.05", "name": "roach"}, - {"id": 1565, "synset": "rudd.n.01", "name": "rudd"}, - {"id": 1566, "synset": "minnow.n.01", "name": "minnow"}, - {"id": 1567, "synset": "gudgeon.n.02", "name": "gudgeon"}, - {"id": 1568, "synset": "crucian_carp.n.01", "name": "crucian_carp"}, - {"id": 1569, "synset": "electric_eel.n.01", "name": "electric_eel"}, - {"id": 1570, "synset": "catostomid.n.01", "name": "catostomid"}, - {"id": 1571, "synset": "buffalo_fish.n.01", "name": "buffalo_fish"}, - {"id": 1572, "synset": "black_buffalo.n.01", "name": "black_buffalo"}, - {"id": 1573, "synset": "hog_sucker.n.01", "name": "hog_sucker"}, - {"id": 1574, "synset": "redhorse.n.01", "name": "redhorse"}, - {"id": 1575, "synset": "cyprinodont.n.01", "name": "cyprinodont"}, - {"id": 1576, "synset": "killifish.n.01", "name": "killifish"}, - {"id": 1577, "synset": "mummichog.n.01", "name": "mummichog"}, - {"id": 1578, "synset": "striped_killifish.n.01", "name": "striped_killifish"}, - {"id": 1579, "synset": "rivulus.n.01", "name": "rivulus"}, - {"id": 1580, "synset": "flagfish.n.01", "name": "flagfish"}, - {"id": 1581, "synset": "swordtail.n.01", "name": "swordtail"}, - {"id": 1582, "synset": "guppy.n.01", "name": "guppy"}, - {"id": 1583, "synset": "topminnow.n.01", "name": "topminnow"}, - {"id": 1584, "synset": "mosquitofish.n.01", "name": "mosquitofish"}, - {"id": 1585, "synset": "platy.n.01", "name": "platy"}, - {"id": 1586, "synset": "mollie.n.01", "name": "mollie"}, - {"id": 1587, "synset": "squirrelfish.n.02", "name": "squirrelfish"}, - {"id": 1588, "synset": "reef_squirrelfish.n.01", "name": "reef_squirrelfish"}, - {"id": 1589, "synset": "deepwater_squirrelfish.n.01", "name": "deepwater_squirrelfish"}, - {"id": 1590, "synset": "holocentrus_ascensionis.n.01", "name": "Holocentrus_ascensionis"}, - {"id": 1591, "synset": "soldierfish.n.01", "name": "soldierfish"}, - {"id": 1592, "synset": "anomalops.n.01", "name": "anomalops"}, - {"id": 1593, "synset": "flashlight_fish.n.01", "name": "flashlight_fish"}, - {"id": 1594, "synset": "john_dory.n.01", "name": "John_Dory"}, - {"id": 1595, "synset": "boarfish.n.02", "name": "boarfish"}, - {"id": 1596, "synset": "boarfish.n.01", "name": "boarfish"}, - {"id": 1597, "synset": "cornetfish.n.01", "name": "cornetfish"}, - {"id": 1598, "synset": "stickleback.n.01", "name": "stickleback"}, - {"id": 1599, "synset": "three-spined_stickleback.n.01", "name": "three-spined_stickleback"}, - {"id": 1600, "synset": "ten-spined_stickleback.n.01", "name": "ten-spined_stickleback"}, - {"id": 1601, "synset": "pipefish.n.01", "name": "pipefish"}, - {"id": 1602, "synset": "dwarf_pipefish.n.01", "name": "dwarf_pipefish"}, - {"id": 1603, "synset": "deepwater_pipefish.n.01", "name": "deepwater_pipefish"}, - {"id": 1604, "synset": "snipefish.n.01", "name": "snipefish"}, - {"id": 1605, "synset": "shrimpfish.n.01", "name": "shrimpfish"}, - {"id": 1606, "synset": "trumpetfish.n.01", "name": "trumpetfish"}, - {"id": 1607, "synset": "pellicle.n.01", "name": "pellicle"}, - {"id": 1608, "synset": "embryo.n.02", "name": "embryo"}, - {"id": 1609, "synset": "fetus.n.01", "name": "fetus"}, - {"id": 1610, "synset": "abortus.n.01", "name": "abortus"}, - {"id": 1611, "synset": "spawn.n.01", "name": "spawn"}, - {"id": 1612, "synset": "blastula.n.01", "name": "blastula"}, - {"id": 1613, "synset": "blastocyst.n.01", "name": "blastocyst"}, - {"id": 1614, "synset": "gastrula.n.01", "name": "gastrula"}, - {"id": 1615, "synset": "morula.n.01", "name": "morula"}, - {"id": 1616, "synset": "yolk.n.02", "name": "yolk"}, - {"id": 1617, "synset": "chordate.n.01", "name": "chordate"}, - {"id": 1618, "synset": "cephalochordate.n.01", "name": "cephalochordate"}, - {"id": 1619, "synset": "lancelet.n.01", "name": "lancelet"}, - {"id": 1620, "synset": "tunicate.n.01", "name": "tunicate"}, - {"id": 1621, "synset": "ascidian.n.01", "name": "ascidian"}, - {"id": 1622, "synset": "sea_squirt.n.01", "name": "sea_squirt"}, - {"id": 1623, "synset": "salp.n.01", "name": "salp"}, - {"id": 1624, "synset": "doliolum.n.01", "name": "doliolum"}, - {"id": 1625, "synset": "larvacean.n.01", "name": "larvacean"}, - {"id": 1626, "synset": "appendicularia.n.01", "name": "appendicularia"}, - {"id": 1627, "synset": "ascidian_tadpole.n.01", "name": "ascidian_tadpole"}, - {"id": 1628, "synset": "vertebrate.n.01", "name": "vertebrate"}, - {"id": 1629, "synset": "amniota.n.01", "name": "Amniota"}, - {"id": 1630, "synset": "amniote.n.01", "name": "amniote"}, - {"id": 1631, "synset": "aquatic_vertebrate.n.01", "name": "aquatic_vertebrate"}, - {"id": 1632, "synset": "jawless_vertebrate.n.01", "name": "jawless_vertebrate"}, - {"id": 1633, "synset": "ostracoderm.n.01", "name": "ostracoderm"}, - {"id": 1634, "synset": "heterostracan.n.01", "name": "heterostracan"}, - {"id": 1635, "synset": "anaspid.n.01", "name": "anaspid"}, - {"id": 1636, "synset": "conodont.n.02", "name": "conodont"}, - {"id": 1637, "synset": "cyclostome.n.01", "name": "cyclostome"}, - {"id": 1638, "synset": "lamprey.n.01", "name": "lamprey"}, - {"id": 1639, "synset": "sea_lamprey.n.01", "name": "sea_lamprey"}, - {"id": 1640, "synset": "hagfish.n.01", "name": "hagfish"}, - {"id": 1641, "synset": "myxine_glutinosa.n.01", "name": "Myxine_glutinosa"}, - {"id": 1642, "synset": "eptatretus.n.01", "name": "eptatretus"}, - {"id": 1643, "synset": "gnathostome.n.01", "name": "gnathostome"}, - {"id": 1644, "synset": "placoderm.n.01", "name": "placoderm"}, - {"id": 1645, "synset": "cartilaginous_fish.n.01", "name": "cartilaginous_fish"}, - {"id": 1646, "synset": "holocephalan.n.01", "name": "holocephalan"}, - {"id": 1647, "synset": "chimaera.n.03", "name": "chimaera"}, - {"id": 1648, "synset": "rabbitfish.n.01", "name": "rabbitfish"}, - {"id": 1649, "synset": "elasmobranch.n.01", "name": "elasmobranch"}, - {"id": 1650, "synset": "cow_shark.n.01", "name": "cow_shark"}, - {"id": 1651, "synset": "mackerel_shark.n.01", "name": "mackerel_shark"}, - {"id": 1652, "synset": "porbeagle.n.01", "name": "porbeagle"}, - {"id": 1653, "synset": "mako.n.01", "name": "mako"}, - {"id": 1654, "synset": "shortfin_mako.n.01", "name": "shortfin_mako"}, - {"id": 1655, "synset": "longfin_mako.n.01", "name": "longfin_mako"}, - {"id": 1656, "synset": "bonito_shark.n.01", "name": "bonito_shark"}, - {"id": 1657, "synset": "great_white_shark.n.01", "name": "great_white_shark"}, - {"id": 1658, "synset": "basking_shark.n.01", "name": "basking_shark"}, - {"id": 1659, "synset": "thresher.n.02", "name": "thresher"}, - {"id": 1660, "synset": "carpet_shark.n.01", "name": "carpet_shark"}, - {"id": 1661, "synset": "nurse_shark.n.01", "name": "nurse_shark"}, - {"id": 1662, "synset": "sand_tiger.n.01", "name": "sand_tiger"}, - {"id": 1663, "synset": "whale_shark.n.01", "name": "whale_shark"}, - {"id": 1664, "synset": "requiem_shark.n.01", "name": "requiem_shark"}, - {"id": 1665, "synset": "bull_shark.n.01", "name": "bull_shark"}, - {"id": 1666, "synset": "sandbar_shark.n.02", "name": "sandbar_shark"}, - {"id": 1667, "synset": "blacktip_shark.n.01", "name": "blacktip_shark"}, - {"id": 1668, "synset": "whitetip_shark.n.02", "name": "whitetip_shark"}, - {"id": 1669, "synset": "dusky_shark.n.01", "name": "dusky_shark"}, - {"id": 1670, "synset": "lemon_shark.n.01", "name": "lemon_shark"}, - {"id": 1671, "synset": "blue_shark.n.01", "name": "blue_shark"}, - {"id": 1672, "synset": "tiger_shark.n.01", "name": "tiger_shark"}, - {"id": 1673, "synset": "soupfin_shark.n.01", "name": "soupfin_shark"}, - {"id": 1674, "synset": "dogfish.n.02", "name": "dogfish"}, - {"id": 1675, "synset": "smooth_dogfish.n.01", "name": "smooth_dogfish"}, - {"id": 1676, "synset": "smoothhound.n.01", "name": "smoothhound"}, - {"id": 1677, "synset": "american_smooth_dogfish.n.01", "name": "American_smooth_dogfish"}, - {"id": 1678, "synset": "florida_smoothhound.n.01", "name": "Florida_smoothhound"}, - {"id": 1679, "synset": "whitetip_shark.n.01", "name": "whitetip_shark"}, - {"id": 1680, "synset": "spiny_dogfish.n.01", "name": "spiny_dogfish"}, - {"id": 1681, "synset": "atlantic_spiny_dogfish.n.01", "name": "Atlantic_spiny_dogfish"}, - {"id": 1682, "synset": "pacific_spiny_dogfish.n.01", "name": "Pacific_spiny_dogfish"}, - {"id": 1683, "synset": "hammerhead.n.03", "name": "hammerhead"}, - {"id": 1684, "synset": "smooth_hammerhead.n.01", "name": "smooth_hammerhead"}, - {"id": 1685, "synset": "smalleye_hammerhead.n.01", "name": "smalleye_hammerhead"}, - {"id": 1686, "synset": "shovelhead.n.01", "name": "shovelhead"}, - {"id": 1687, "synset": "angel_shark.n.01", "name": "angel_shark"}, - {"id": 1688, "synset": "ray.n.07", "name": "ray"}, - {"id": 1689, "synset": "electric_ray.n.01", "name": "electric_ray"}, - {"id": 1690, "synset": "sawfish.n.01", "name": "sawfish"}, - {"id": 1691, "synset": "smalltooth_sawfish.n.01", "name": "smalltooth_sawfish"}, - {"id": 1692, "synset": "guitarfish.n.01", "name": "guitarfish"}, - {"id": 1693, "synset": "stingray.n.01", "name": "stingray"}, - {"id": 1694, "synset": "roughtail_stingray.n.01", "name": "roughtail_stingray"}, - {"id": 1695, "synset": "butterfly_ray.n.01", "name": "butterfly_ray"}, - {"id": 1696, "synset": "eagle_ray.n.01", "name": "eagle_ray"}, - {"id": 1697, "synset": "spotted_eagle_ray.n.01", "name": "spotted_eagle_ray"}, - {"id": 1698, "synset": "cownose_ray.n.01", "name": "cownose_ray"}, - {"id": 1699, "synset": "manta.n.02", "name": "manta"}, - {"id": 1700, "synset": "atlantic_manta.n.01", "name": "Atlantic_manta"}, - {"id": 1701, "synset": "devil_ray.n.01", "name": "devil_ray"}, - {"id": 1702, "synset": "skate.n.02", "name": "skate"}, - {"id": 1703, "synset": "grey_skate.n.01", "name": "grey_skate"}, - {"id": 1704, "synset": "little_skate.n.01", "name": "little_skate"}, - {"id": 1705, "synset": "thorny_skate.n.01", "name": "thorny_skate"}, - {"id": 1706, "synset": "barndoor_skate.n.01", "name": "barndoor_skate"}, - {"id": 1707, "synset": "dickeybird.n.01", "name": "dickeybird"}, - {"id": 1708, "synset": "fledgling.n.02", "name": "fledgling"}, - {"id": 1709, "synset": "nestling.n.01", "name": "nestling"}, - {"id": 1710, "synset": "cock.n.05", "name": "cock"}, - {"id": 1711, "synset": "gamecock.n.01", "name": "gamecock"}, - {"id": 1712, "synset": "hen.n.02", "name": "hen"}, - {"id": 1713, "synset": "nester.n.02", "name": "nester"}, - {"id": 1714, "synset": "night_bird.n.01", "name": "night_bird"}, - {"id": 1715, "synset": "night_raven.n.02", "name": "night_raven"}, - {"id": 1716, "synset": "bird_of_passage.n.02", "name": "bird_of_passage"}, - {"id": 1717, "synset": "archaeopteryx.n.01", "name": "archaeopteryx"}, - {"id": 1718, "synset": "archaeornis.n.01", "name": "archaeornis"}, - {"id": 1719, "synset": "ratite.n.01", "name": "ratite"}, - {"id": 1720, "synset": "carinate.n.01", "name": "carinate"}, - {"id": 1721, "synset": "cassowary.n.01", "name": "cassowary"}, - {"id": 1722, "synset": "emu.n.02", "name": "emu"}, - {"id": 1723, "synset": "kiwi.n.04", "name": "kiwi"}, - {"id": 1724, "synset": "rhea.n.03", "name": "rhea"}, - {"id": 1725, "synset": "rhea.n.02", "name": "rhea"}, - {"id": 1726, "synset": "elephant_bird.n.01", "name": "elephant_bird"}, - {"id": 1727, "synset": "moa.n.01", "name": "moa"}, - {"id": 1728, "synset": "passerine.n.01", "name": "passerine"}, - {"id": 1729, "synset": "nonpasserine_bird.n.01", "name": "nonpasserine_bird"}, - {"id": 1730, "synset": "oscine.n.01", "name": "oscine"}, - {"id": 1731, "synset": "songbird.n.01", "name": "songbird"}, - {"id": 1732, "synset": "honey_eater.n.01", "name": "honey_eater"}, - {"id": 1733, "synset": "accentor.n.01", "name": "accentor"}, - {"id": 1734, "synset": "hedge_sparrow.n.01", "name": "hedge_sparrow"}, - {"id": 1735, "synset": "lark.n.03", "name": "lark"}, - {"id": 1736, "synset": "skylark.n.01", "name": "skylark"}, - {"id": 1737, "synset": "wagtail.n.01", "name": "wagtail"}, - {"id": 1738, "synset": "pipit.n.01", "name": "pipit"}, - {"id": 1739, "synset": "meadow_pipit.n.01", "name": "meadow_pipit"}, - {"id": 1740, "synset": "finch.n.01", "name": "finch"}, - {"id": 1741, "synset": "chaffinch.n.01", "name": "chaffinch"}, - {"id": 1742, "synset": "brambling.n.01", "name": "brambling"}, - {"id": 1743, "synset": "goldfinch.n.02", "name": "goldfinch"}, - {"id": 1744, "synset": "linnet.n.02", "name": "linnet"}, - {"id": 1745, "synset": "siskin.n.01", "name": "siskin"}, - {"id": 1746, "synset": "red_siskin.n.01", "name": "red_siskin"}, - {"id": 1747, "synset": "redpoll.n.02", "name": "redpoll"}, - {"id": 1748, "synset": "redpoll.n.01", "name": "redpoll"}, - {"id": 1749, "synset": "new_world_goldfinch.n.01", "name": "New_World_goldfinch"}, - {"id": 1750, "synset": "pine_siskin.n.01", "name": "pine_siskin"}, - {"id": 1751, "synset": "house_finch.n.01", "name": "house_finch"}, - {"id": 1752, "synset": "purple_finch.n.01", "name": "purple_finch"}, - {"id": 1753, "synset": "canary.n.04", "name": "canary"}, - {"id": 1754, "synset": "common_canary.n.01", "name": "common_canary"}, - {"id": 1755, "synset": "serin.n.01", "name": "serin"}, - {"id": 1756, "synset": "crossbill.n.01", "name": "crossbill"}, - {"id": 1757, "synset": "bullfinch.n.02", "name": "bullfinch"}, - {"id": 1758, "synset": "junco.n.01", "name": "junco"}, - {"id": 1759, "synset": "dark-eyed_junco.n.01", "name": "dark-eyed_junco"}, - {"id": 1760, "synset": "new_world_sparrow.n.01", "name": "New_World_sparrow"}, - {"id": 1761, "synset": "vesper_sparrow.n.01", "name": "vesper_sparrow"}, - {"id": 1762, "synset": "white-throated_sparrow.n.01", "name": "white-throated_sparrow"}, - {"id": 1763, "synset": "white-crowned_sparrow.n.01", "name": "white-crowned_sparrow"}, - {"id": 1764, "synset": "chipping_sparrow.n.01", "name": "chipping_sparrow"}, - {"id": 1765, "synset": "field_sparrow.n.01", "name": "field_sparrow"}, - {"id": 1766, "synset": "tree_sparrow.n.02", "name": "tree_sparrow"}, - {"id": 1767, "synset": "song_sparrow.n.01", "name": "song_sparrow"}, - {"id": 1768, "synset": "swamp_sparrow.n.01", "name": "swamp_sparrow"}, - {"id": 1769, "synset": "bunting.n.02", "name": "bunting"}, - {"id": 1770, "synset": "indigo_bunting.n.01", "name": "indigo_bunting"}, - {"id": 1771, "synset": "ortolan.n.01", "name": "ortolan"}, - {"id": 1772, "synset": "reed_bunting.n.01", "name": "reed_bunting"}, - {"id": 1773, "synset": "yellowhammer.n.02", "name": "yellowhammer"}, - {"id": 1774, "synset": "yellow-breasted_bunting.n.01", "name": "yellow-breasted_bunting"}, - {"id": 1775, "synset": "snow_bunting.n.01", "name": "snow_bunting"}, - {"id": 1776, "synset": "honeycreeper.n.02", "name": "honeycreeper"}, - {"id": 1777, "synset": "banana_quit.n.01", "name": "banana_quit"}, - {"id": 1778, "synset": "sparrow.n.01", "name": "sparrow"}, - {"id": 1779, "synset": "english_sparrow.n.01", "name": "English_sparrow"}, - {"id": 1780, "synset": "tree_sparrow.n.01", "name": "tree_sparrow"}, - {"id": 1781, "synset": "grosbeak.n.01", "name": "grosbeak"}, - {"id": 1782, "synset": "evening_grosbeak.n.01", "name": "evening_grosbeak"}, - {"id": 1783, "synset": "hawfinch.n.01", "name": "hawfinch"}, - {"id": 1784, "synset": "pine_grosbeak.n.01", "name": "pine_grosbeak"}, - {"id": 1785, "synset": "cardinal.n.04", "name": "cardinal"}, - {"id": 1786, "synset": "pyrrhuloxia.n.01", "name": "pyrrhuloxia"}, - {"id": 1787, "synset": "towhee.n.01", "name": "towhee"}, - {"id": 1788, "synset": "chewink.n.01", "name": "chewink"}, - {"id": 1789, "synset": "green-tailed_towhee.n.01", "name": "green-tailed_towhee"}, - {"id": 1790, "synset": "weaver.n.02", "name": "weaver"}, - {"id": 1791, "synset": "baya.n.01", "name": "baya"}, - {"id": 1792, "synset": "whydah.n.01", "name": "whydah"}, - {"id": 1793, "synset": "java_sparrow.n.01", "name": "Java_sparrow"}, - {"id": 1794, "synset": "avadavat.n.01", "name": "avadavat"}, - {"id": 1795, "synset": "grassfinch.n.01", "name": "grassfinch"}, - {"id": 1796, "synset": "zebra_finch.n.01", "name": "zebra_finch"}, - {"id": 1797, "synset": "honeycreeper.n.01", "name": "honeycreeper"}, - {"id": 1798, "synset": "lyrebird.n.01", "name": "lyrebird"}, - {"id": 1799, "synset": "scrubbird.n.01", "name": "scrubbird"}, - {"id": 1800, "synset": "broadbill.n.04", "name": "broadbill"}, - {"id": 1801, "synset": "tyrannid.n.01", "name": "tyrannid"}, - {"id": 1802, "synset": "new_world_flycatcher.n.01", "name": "New_World_flycatcher"}, - {"id": 1803, "synset": "kingbird.n.01", "name": "kingbird"}, - {"id": 1804, "synset": "arkansas_kingbird.n.01", "name": "Arkansas_kingbird"}, - {"id": 1805, "synset": "cassin's_kingbird.n.01", "name": "Cassin's_kingbird"}, - {"id": 1806, "synset": "eastern_kingbird.n.01", "name": "eastern_kingbird"}, - {"id": 1807, "synset": "grey_kingbird.n.01", "name": "grey_kingbird"}, - {"id": 1808, "synset": "pewee.n.01", "name": "pewee"}, - {"id": 1809, "synset": "western_wood_pewee.n.01", "name": "western_wood_pewee"}, - {"id": 1810, "synset": "phoebe.n.03", "name": "phoebe"}, - {"id": 1811, "synset": "vermillion_flycatcher.n.01", "name": "vermillion_flycatcher"}, - {"id": 1812, "synset": "cotinga.n.01", "name": "cotinga"}, - {"id": 1813, "synset": "cock_of_the_rock.n.02", "name": "cock_of_the_rock"}, - {"id": 1814, "synset": "cock_of_the_rock.n.01", "name": "cock_of_the_rock"}, - {"id": 1815, "synset": "manakin.n.03", "name": "manakin"}, - {"id": 1816, "synset": "bellbird.n.01", "name": "bellbird"}, - {"id": 1817, "synset": "umbrella_bird.n.01", "name": "umbrella_bird"}, - {"id": 1818, "synset": "ovenbird.n.02", "name": "ovenbird"}, - {"id": 1819, "synset": "antbird.n.01", "name": "antbird"}, - {"id": 1820, "synset": "ant_thrush.n.01", "name": "ant_thrush"}, - {"id": 1821, "synset": "ant_shrike.n.01", "name": "ant_shrike"}, - {"id": 1822, "synset": "spotted_antbird.n.01", "name": "spotted_antbird"}, - {"id": 1823, "synset": "woodhewer.n.01", "name": "woodhewer"}, - {"id": 1824, "synset": "pitta.n.01", "name": "pitta"}, - {"id": 1825, "synset": "scissortail.n.01", "name": "scissortail"}, - {"id": 1826, "synset": "old_world_flycatcher.n.01", "name": "Old_World_flycatcher"}, - {"id": 1827, "synset": "spotted_flycatcher.n.01", "name": "spotted_flycatcher"}, - {"id": 1828, "synset": "thickhead.n.01", "name": "thickhead"}, - {"id": 1829, "synset": "thrush.n.03", "name": "thrush"}, - {"id": 1830, "synset": "missel_thrush.n.01", "name": "missel_thrush"}, - {"id": 1831, "synset": "song_thrush.n.01", "name": "song_thrush"}, - {"id": 1832, "synset": "fieldfare.n.01", "name": "fieldfare"}, - {"id": 1833, "synset": "redwing.n.02", "name": "redwing"}, - {"id": 1834, "synset": "blackbird.n.02", "name": "blackbird"}, - {"id": 1835, "synset": "ring_ouzel.n.01", "name": "ring_ouzel"}, - {"id": 1836, "synset": "robin.n.02", "name": "robin"}, - {"id": 1837, "synset": "clay-colored_robin.n.01", "name": "clay-colored_robin"}, - {"id": 1838, "synset": "hermit_thrush.n.01", "name": "hermit_thrush"}, - {"id": 1839, "synset": "veery.n.01", "name": "veery"}, - {"id": 1840, "synset": "wood_thrush.n.01", "name": "wood_thrush"}, - {"id": 1841, "synset": "nightingale.n.01", "name": "nightingale"}, - {"id": 1842, "synset": "thrush_nightingale.n.01", "name": "thrush_nightingale"}, - {"id": 1843, "synset": "bulbul.n.01", "name": "bulbul"}, - {"id": 1844, "synset": "old_world_chat.n.01", "name": "Old_World_chat"}, - {"id": 1845, "synset": "stonechat.n.01", "name": "stonechat"}, - {"id": 1846, "synset": "whinchat.n.01", "name": "whinchat"}, - {"id": 1847, "synset": "solitaire.n.03", "name": "solitaire"}, - {"id": 1848, "synset": "redstart.n.02", "name": "redstart"}, - {"id": 1849, "synset": "wheatear.n.01", "name": "wheatear"}, - {"id": 1850, "synset": "bluebird.n.02", "name": "bluebird"}, - {"id": 1851, "synset": "robin.n.01", "name": "robin"}, - {"id": 1852, "synset": "bluethroat.n.01", "name": "bluethroat"}, - {"id": 1853, "synset": "warbler.n.02", "name": "warbler"}, - {"id": 1854, "synset": "gnatcatcher.n.01", "name": "gnatcatcher"}, - {"id": 1855, "synset": "kinglet.n.01", "name": "kinglet"}, - {"id": 1856, "synset": "goldcrest.n.01", "name": "goldcrest"}, - {"id": 1857, "synset": "gold-crowned_kinglet.n.01", "name": "gold-crowned_kinglet"}, - {"id": 1858, "synset": "ruby-crowned_kinglet.n.01", "name": "ruby-crowned_kinglet"}, - {"id": 1859, "synset": "old_world_warbler.n.01", "name": "Old_World_warbler"}, - {"id": 1860, "synset": "blackcap.n.04", "name": "blackcap"}, - {"id": 1861, "synset": "greater_whitethroat.n.01", "name": "greater_whitethroat"}, - {"id": 1862, "synset": "lesser_whitethroat.n.01", "name": "lesser_whitethroat"}, - {"id": 1863, "synset": "wood_warbler.n.02", "name": "wood_warbler"}, - {"id": 1864, "synset": "sedge_warbler.n.01", "name": "sedge_warbler"}, - {"id": 1865, "synset": "wren_warbler.n.01", "name": "wren_warbler"}, - {"id": 1866, "synset": "tailorbird.n.01", "name": "tailorbird"}, - {"id": 1867, "synset": "babbler.n.02", "name": "babbler"}, - {"id": 1868, "synset": "new_world_warbler.n.01", "name": "New_World_warbler"}, - {"id": 1869, "synset": "parula_warbler.n.01", "name": "parula_warbler"}, - {"id": 1870, "synset": "wilson's_warbler.n.01", "name": "Wilson's_warbler"}, - {"id": 1871, "synset": "flycatching_warbler.n.01", "name": "flycatching_warbler"}, - {"id": 1872, "synset": "american_redstart.n.01", "name": "American_redstart"}, - {"id": 1873, "synset": "cape_may_warbler.n.01", "name": "Cape_May_warbler"}, - {"id": 1874, "synset": "yellow_warbler.n.01", "name": "yellow_warbler"}, - {"id": 1875, "synset": "blackburn.n.01", "name": "Blackburn"}, - {"id": 1876, "synset": "audubon's_warbler.n.01", "name": "Audubon's_warbler"}, - {"id": 1877, "synset": "myrtle_warbler.n.01", "name": "myrtle_warbler"}, - {"id": 1878, "synset": "blackpoll.n.01", "name": "blackpoll"}, - {"id": 1879, "synset": "new_world_chat.n.01", "name": "New_World_chat"}, - {"id": 1880, "synset": "yellow-breasted_chat.n.01", "name": "yellow-breasted_chat"}, - {"id": 1881, "synset": "ovenbird.n.01", "name": "ovenbird"}, - {"id": 1882, "synset": "water_thrush.n.01", "name": "water_thrush"}, - {"id": 1883, "synset": "yellowthroat.n.01", "name": "yellowthroat"}, - {"id": 1884, "synset": "common_yellowthroat.n.01", "name": "common_yellowthroat"}, - {"id": 1885, "synset": "riflebird.n.01", "name": "riflebird"}, - {"id": 1886, "synset": "new_world_oriole.n.01", "name": "New_World_oriole"}, - {"id": 1887, "synset": "northern_oriole.n.01", "name": "northern_oriole"}, - {"id": 1888, "synset": "baltimore_oriole.n.01", "name": "Baltimore_oriole"}, - {"id": 1889, "synset": "bullock's_oriole.n.01", "name": "Bullock's_oriole"}, - {"id": 1890, "synset": "orchard_oriole.n.01", "name": "orchard_oriole"}, - {"id": 1891, "synset": "meadowlark.n.01", "name": "meadowlark"}, - {"id": 1892, "synset": "eastern_meadowlark.n.01", "name": "eastern_meadowlark"}, - {"id": 1893, "synset": "western_meadowlark.n.01", "name": "western_meadowlark"}, - {"id": 1894, "synset": "cacique.n.01", "name": "cacique"}, - {"id": 1895, "synset": "bobolink.n.01", "name": "bobolink"}, - {"id": 1896, "synset": "new_world_blackbird.n.01", "name": "New_World_blackbird"}, - {"id": 1897, "synset": "grackle.n.02", "name": "grackle"}, - {"id": 1898, "synset": "purple_grackle.n.01", "name": "purple_grackle"}, - {"id": 1899, "synset": "rusty_blackbird.n.01", "name": "rusty_blackbird"}, - {"id": 1900, "synset": "cowbird.n.01", "name": "cowbird"}, - {"id": 1901, "synset": "red-winged_blackbird.n.01", "name": "red-winged_blackbird"}, - {"id": 1902, "synset": "old_world_oriole.n.01", "name": "Old_World_oriole"}, - {"id": 1903, "synset": "golden_oriole.n.01", "name": "golden_oriole"}, - {"id": 1904, "synset": "fig-bird.n.01", "name": "fig-bird"}, - {"id": 1905, "synset": "starling.n.01", "name": "starling"}, - {"id": 1906, "synset": "common_starling.n.01", "name": "common_starling"}, - {"id": 1907, "synset": "rose-colored_starling.n.01", "name": "rose-colored_starling"}, - {"id": 1908, "synset": "myna.n.01", "name": "myna"}, - {"id": 1909, "synset": "crested_myna.n.01", "name": "crested_myna"}, - {"id": 1910, "synset": "hill_myna.n.01", "name": "hill_myna"}, - {"id": 1911, "synset": "corvine_bird.n.01", "name": "corvine_bird"}, - {"id": 1912, "synset": "american_crow.n.01", "name": "American_crow"}, - {"id": 1913, "synset": "raven.n.01", "name": "raven"}, - {"id": 1914, "synset": "rook.n.02", "name": "rook"}, - {"id": 1915, "synset": "jackdaw.n.01", "name": "jackdaw"}, - {"id": 1916, "synset": "chough.n.01", "name": "chough"}, - {"id": 1917, "synset": "jay.n.02", "name": "jay"}, - {"id": 1918, "synset": "old_world_jay.n.01", "name": "Old_World_jay"}, - {"id": 1919, "synset": "common_european_jay.n.01", "name": "common_European_jay"}, - {"id": 1920, "synset": "new_world_jay.n.01", "name": "New_World_jay"}, - {"id": 1921, "synset": "blue_jay.n.01", "name": "blue_jay"}, - {"id": 1922, "synset": "canada_jay.n.01", "name": "Canada_jay"}, - {"id": 1923, "synset": "rocky_mountain_jay.n.01", "name": "Rocky_Mountain_jay"}, - {"id": 1924, "synset": "nutcracker.n.03", "name": "nutcracker"}, - {"id": 1925, "synset": "common_nutcracker.n.01", "name": "common_nutcracker"}, - {"id": 1926, "synset": "clark's_nutcracker.n.01", "name": "Clark's_nutcracker"}, - {"id": 1927, "synset": "magpie.n.01", "name": "magpie"}, - {"id": 1928, "synset": "european_magpie.n.01", "name": "European_magpie"}, - {"id": 1929, "synset": "american_magpie.n.01", "name": "American_magpie"}, - {"id": 1930, "synset": "australian_magpie.n.01", "name": "Australian_magpie"}, - {"id": 1931, "synset": "butcherbird.n.02", "name": "butcherbird"}, - {"id": 1932, "synset": "currawong.n.01", "name": "currawong"}, - {"id": 1933, "synset": "piping_crow.n.01", "name": "piping_crow"}, - {"id": 1934, "synset": "wren.n.02", "name": "wren"}, - {"id": 1935, "synset": "winter_wren.n.01", "name": "winter_wren"}, - {"id": 1936, "synset": "house_wren.n.01", "name": "house_wren"}, - {"id": 1937, "synset": "marsh_wren.n.01", "name": "marsh_wren"}, - {"id": 1938, "synset": "long-billed_marsh_wren.n.01", "name": "long-billed_marsh_wren"}, - {"id": 1939, "synset": "sedge_wren.n.01", "name": "sedge_wren"}, - {"id": 1940, "synset": "rock_wren.n.02", "name": "rock_wren"}, - {"id": 1941, "synset": "carolina_wren.n.01", "name": "Carolina_wren"}, - {"id": 1942, "synset": "cactus_wren.n.01", "name": "cactus_wren"}, - {"id": 1943, "synset": "mockingbird.n.01", "name": "mockingbird"}, - {"id": 1944, "synset": "blue_mockingbird.n.01", "name": "blue_mockingbird"}, - {"id": 1945, "synset": "catbird.n.02", "name": "catbird"}, - {"id": 1946, "synset": "thrasher.n.02", "name": "thrasher"}, - {"id": 1947, "synset": "brown_thrasher.n.01", "name": "brown_thrasher"}, - {"id": 1948, "synset": "new_zealand_wren.n.01", "name": "New_Zealand_wren"}, - {"id": 1949, "synset": "rock_wren.n.01", "name": "rock_wren"}, - {"id": 1950, "synset": "rifleman_bird.n.01", "name": "rifleman_bird"}, - {"id": 1951, "synset": "creeper.n.03", "name": "creeper"}, - {"id": 1952, "synset": "brown_creeper.n.01", "name": "brown_creeper"}, - {"id": 1953, "synset": "european_creeper.n.01", "name": "European_creeper"}, - {"id": 1954, "synset": "wall_creeper.n.01", "name": "wall_creeper"}, - {"id": 1955, "synset": "european_nuthatch.n.01", "name": "European_nuthatch"}, - {"id": 1956, "synset": "red-breasted_nuthatch.n.01", "name": "red-breasted_nuthatch"}, - {"id": 1957, "synset": "white-breasted_nuthatch.n.01", "name": "white-breasted_nuthatch"}, - {"id": 1958, "synset": "titmouse.n.01", "name": "titmouse"}, - {"id": 1959, "synset": "chickadee.n.01", "name": "chickadee"}, - {"id": 1960, "synset": "black-capped_chickadee.n.01", "name": "black-capped_chickadee"}, - {"id": 1961, "synset": "tufted_titmouse.n.01", "name": "tufted_titmouse"}, - {"id": 1962, "synset": "carolina_chickadee.n.01", "name": "Carolina_chickadee"}, - {"id": 1963, "synset": "blue_tit.n.01", "name": "blue_tit"}, - {"id": 1964, "synset": "bushtit.n.01", "name": "bushtit"}, - {"id": 1965, "synset": "wren-tit.n.01", "name": "wren-tit"}, - {"id": 1966, "synset": "verdin.n.01", "name": "verdin"}, - {"id": 1967, "synset": "fairy_bluebird.n.01", "name": "fairy_bluebird"}, - {"id": 1968, "synset": "swallow.n.03", "name": "swallow"}, - {"id": 1969, "synset": "barn_swallow.n.01", "name": "barn_swallow"}, - {"id": 1970, "synset": "cliff_swallow.n.01", "name": "cliff_swallow"}, - {"id": 1971, "synset": "tree_swallow.n.02", "name": "tree_swallow"}, - {"id": 1972, "synset": "white-bellied_swallow.n.01", "name": "white-bellied_swallow"}, - {"id": 1973, "synset": "martin.n.05", "name": "martin"}, - {"id": 1974, "synset": "house_martin.n.01", "name": "house_martin"}, - {"id": 1975, "synset": "bank_martin.n.01", "name": "bank_martin"}, - {"id": 1976, "synset": "purple_martin.n.01", "name": "purple_martin"}, - {"id": 1977, "synset": "wood_swallow.n.01", "name": "wood_swallow"}, - {"id": 1978, "synset": "tanager.n.01", "name": "tanager"}, - {"id": 1979, "synset": "scarlet_tanager.n.01", "name": "scarlet_tanager"}, - {"id": 1980, "synset": "western_tanager.n.01", "name": "western_tanager"}, - {"id": 1981, "synset": "summer_tanager.n.01", "name": "summer_tanager"}, - {"id": 1982, "synset": "hepatic_tanager.n.01", "name": "hepatic_tanager"}, - {"id": 1983, "synset": "shrike.n.01", "name": "shrike"}, - {"id": 1984, "synset": "butcherbird.n.01", "name": "butcherbird"}, - {"id": 1985, "synset": "european_shrike.n.01", "name": "European_shrike"}, - {"id": 1986, "synset": "northern_shrike.n.01", "name": "northern_shrike"}, - {"id": 1987, "synset": "white-rumped_shrike.n.01", "name": "white-rumped_shrike"}, - {"id": 1988, "synset": "loggerhead_shrike.n.01", "name": "loggerhead_shrike"}, - {"id": 1989, "synset": "migrant_shrike.n.01", "name": "migrant_shrike"}, - {"id": 1990, "synset": "bush_shrike.n.01", "name": "bush_shrike"}, - {"id": 1991, "synset": "black-fronted_bush_shrike.n.01", "name": "black-fronted_bush_shrike"}, - {"id": 1992, "synset": "bowerbird.n.01", "name": "bowerbird"}, - {"id": 1993, "synset": "satin_bowerbird.n.01", "name": "satin_bowerbird"}, - {"id": 1994, "synset": "great_bowerbird.n.01", "name": "great_bowerbird"}, - {"id": 1995, "synset": "water_ouzel.n.01", "name": "water_ouzel"}, - {"id": 1996, "synset": "european_water_ouzel.n.01", "name": "European_water_ouzel"}, - {"id": 1997, "synset": "american_water_ouzel.n.01", "name": "American_water_ouzel"}, - {"id": 1998, "synset": "vireo.n.01", "name": "vireo"}, - {"id": 1999, "synset": "red-eyed_vireo.n.01", "name": "red-eyed_vireo"}, - {"id": 2000, "synset": "solitary_vireo.n.01", "name": "solitary_vireo"}, - {"id": 2001, "synset": "blue-headed_vireo.n.01", "name": "blue-headed_vireo"}, - {"id": 2002, "synset": "waxwing.n.01", "name": "waxwing"}, - {"id": 2003, "synset": "cedar_waxwing.n.01", "name": "cedar_waxwing"}, - {"id": 2004, "synset": "bohemian_waxwing.n.01", "name": "Bohemian_waxwing"}, - {"id": 2005, "synset": "bird_of_prey.n.01", "name": "bird_of_prey"}, - {"id": 2006, "synset": "accipitriformes.n.01", "name": "Accipitriformes"}, - {"id": 2007, "synset": "hawk.n.01", "name": "hawk"}, - {"id": 2008, "synset": "eyas.n.01", "name": "eyas"}, - {"id": 2009, "synset": "tiercel.n.01", "name": "tiercel"}, - {"id": 2010, "synset": "goshawk.n.01", "name": "goshawk"}, - {"id": 2011, "synset": "sparrow_hawk.n.02", "name": "sparrow_hawk"}, - {"id": 2012, "synset": "cooper's_hawk.n.01", "name": "Cooper's_hawk"}, - {"id": 2013, "synset": "chicken_hawk.n.01", "name": "chicken_hawk"}, - {"id": 2014, "synset": "buteonine.n.01", "name": "buteonine"}, - {"id": 2015, "synset": "redtail.n.01", "name": "redtail"}, - {"id": 2016, "synset": "rough-legged_hawk.n.01", "name": "rough-legged_hawk"}, - {"id": 2017, "synset": "red-shouldered_hawk.n.01", "name": "red-shouldered_hawk"}, - {"id": 2018, "synset": "buzzard.n.02", "name": "buzzard"}, - {"id": 2019, "synset": "honey_buzzard.n.01", "name": "honey_buzzard"}, - {"id": 2020, "synset": "kite.n.04", "name": "kite"}, - {"id": 2021, "synset": "black_kite.n.01", "name": "black_kite"}, - {"id": 2022, "synset": "swallow-tailed_kite.n.01", "name": "swallow-tailed_kite"}, - {"id": 2023, "synset": "white-tailed_kite.n.01", "name": "white-tailed_kite"}, - {"id": 2024, "synset": "harrier.n.03", "name": "harrier"}, - {"id": 2025, "synset": "marsh_harrier.n.01", "name": "marsh_harrier"}, - {"id": 2026, "synset": "montagu's_harrier.n.01", "name": "Montagu's_harrier"}, - {"id": 2027, "synset": "marsh_hawk.n.01", "name": "marsh_hawk"}, - {"id": 2028, "synset": "harrier_eagle.n.01", "name": "harrier_eagle"}, - {"id": 2029, "synset": "peregrine.n.01", "name": "peregrine"}, - {"id": 2030, "synset": "falcon-gentle.n.01", "name": "falcon-gentle"}, - {"id": 2031, "synset": "gyrfalcon.n.01", "name": "gyrfalcon"}, - {"id": 2032, "synset": "kestrel.n.02", "name": "kestrel"}, - {"id": 2033, "synset": "sparrow_hawk.n.01", "name": "sparrow_hawk"}, - {"id": 2034, "synset": "pigeon_hawk.n.01", "name": "pigeon_hawk"}, - {"id": 2035, "synset": "hobby.n.03", "name": "hobby"}, - {"id": 2036, "synset": "caracara.n.01", "name": "caracara"}, - {"id": 2037, "synset": "audubon's_caracara.n.01", "name": "Audubon's_caracara"}, - {"id": 2038, "synset": "carancha.n.01", "name": "carancha"}, - {"id": 2039, "synset": "young_bird.n.01", "name": "young_bird"}, - {"id": 2040, "synset": "eaglet.n.01", "name": "eaglet"}, - {"id": 2041, "synset": "harpy.n.04", "name": "harpy"}, - {"id": 2042, "synset": "golden_eagle.n.01", "name": "golden_eagle"}, - {"id": 2043, "synset": "tawny_eagle.n.01", "name": "tawny_eagle"}, - {"id": 2044, "synset": "bald_eagle.n.01", "name": "bald_eagle"}, - {"id": 2045, "synset": "sea_eagle.n.02", "name": "sea_eagle"}, - {"id": 2046, "synset": "kamchatkan_sea_eagle.n.01", "name": "Kamchatkan_sea_eagle"}, - {"id": 2047, "synset": "ern.n.01", "name": "ern"}, - {"id": 2048, "synset": "fishing_eagle.n.01", "name": "fishing_eagle"}, - {"id": 2049, "synset": "osprey.n.01", "name": "osprey"}, - {"id": 2050, "synset": "aegypiidae.n.01", "name": "Aegypiidae"}, - {"id": 2051, "synset": "old_world_vulture.n.01", "name": "Old_World_vulture"}, - {"id": 2052, "synset": "griffon_vulture.n.01", "name": "griffon_vulture"}, - {"id": 2053, "synset": "bearded_vulture.n.01", "name": "bearded_vulture"}, - {"id": 2054, "synset": "egyptian_vulture.n.01", "name": "Egyptian_vulture"}, - {"id": 2055, "synset": "black_vulture.n.02", "name": "black_vulture"}, - {"id": 2056, "synset": "secretary_bird.n.01", "name": "secretary_bird"}, - {"id": 2057, "synset": "new_world_vulture.n.01", "name": "New_World_vulture"}, - {"id": 2058, "synset": "buzzard.n.01", "name": "buzzard"}, - {"id": 2059, "synset": "condor.n.01", "name": "condor"}, - {"id": 2060, "synset": "andean_condor.n.01", "name": "Andean_condor"}, - {"id": 2061, "synset": "california_condor.n.01", "name": "California_condor"}, - {"id": 2062, "synset": "black_vulture.n.01", "name": "black_vulture"}, - {"id": 2063, "synset": "king_vulture.n.01", "name": "king_vulture"}, - {"id": 2064, "synset": "owlet.n.01", "name": "owlet"}, - {"id": 2065, "synset": "little_owl.n.01", "name": "little_owl"}, - {"id": 2066, "synset": "horned_owl.n.01", "name": "horned_owl"}, - {"id": 2067, "synset": "great_horned_owl.n.01", "name": "great_horned_owl"}, - {"id": 2068, "synset": "great_grey_owl.n.01", "name": "great_grey_owl"}, - {"id": 2069, "synset": "tawny_owl.n.01", "name": "tawny_owl"}, - {"id": 2070, "synset": "barred_owl.n.01", "name": "barred_owl"}, - {"id": 2071, "synset": "screech_owl.n.02", "name": "screech_owl"}, - {"id": 2072, "synset": "screech_owl.n.01", "name": "screech_owl"}, - {"id": 2073, "synset": "scops_owl.n.01", "name": "scops_owl"}, - {"id": 2074, "synset": "spotted_owl.n.01", "name": "spotted_owl"}, - {"id": 2075, "synset": "old_world_scops_owl.n.01", "name": "Old_World_scops_owl"}, - {"id": 2076, "synset": "oriental_scops_owl.n.01", "name": "Oriental_scops_owl"}, - {"id": 2077, "synset": "hoot_owl.n.01", "name": "hoot_owl"}, - {"id": 2078, "synset": "hawk_owl.n.01", "name": "hawk_owl"}, - {"id": 2079, "synset": "long-eared_owl.n.01", "name": "long-eared_owl"}, - {"id": 2080, "synset": "laughing_owl.n.01", "name": "laughing_owl"}, - {"id": 2081, "synset": "barn_owl.n.01", "name": "barn_owl"}, - {"id": 2082, "synset": "amphibian.n.03", "name": "amphibian"}, - {"id": 2083, "synset": "ichyostega.n.01", "name": "Ichyostega"}, - {"id": 2084, "synset": "urodele.n.01", "name": "urodele"}, - {"id": 2085, "synset": "salamander.n.01", "name": "salamander"}, - {"id": 2086, "synset": "european_fire_salamander.n.01", "name": "European_fire_salamander"}, - {"id": 2087, "synset": "spotted_salamander.n.02", "name": "spotted_salamander"}, - {"id": 2088, "synset": "alpine_salamander.n.01", "name": "alpine_salamander"}, - {"id": 2089, "synset": "newt.n.01", "name": "newt"}, - {"id": 2090, "synset": "common_newt.n.01", "name": "common_newt"}, - {"id": 2091, "synset": "red_eft.n.01", "name": "red_eft"}, - {"id": 2092, "synset": "pacific_newt.n.01", "name": "Pacific_newt"}, - {"id": 2093, "synset": "rough-skinned_newt.n.01", "name": "rough-skinned_newt"}, - {"id": 2094, "synset": "california_newt.n.01", "name": "California_newt"}, - {"id": 2095, "synset": "eft.n.01", "name": "eft"}, - {"id": 2096, "synset": "ambystomid.n.01", "name": "ambystomid"}, - {"id": 2097, "synset": "mole_salamander.n.01", "name": "mole_salamander"}, - {"id": 2098, "synset": "spotted_salamander.n.01", "name": "spotted_salamander"}, - {"id": 2099, "synset": "tiger_salamander.n.01", "name": "tiger_salamander"}, - {"id": 2100, "synset": "axolotl.n.01", "name": "axolotl"}, - {"id": 2101, "synset": "waterdog.n.01", "name": "waterdog"}, - {"id": 2102, "synset": "hellbender.n.01", "name": "hellbender"}, - {"id": 2103, "synset": "giant_salamander.n.01", "name": "giant_salamander"}, - {"id": 2104, "synset": "olm.n.01", "name": "olm"}, - {"id": 2105, "synset": "mud_puppy.n.01", "name": "mud_puppy"}, - {"id": 2106, "synset": "dicamptodon.n.01", "name": "dicamptodon"}, - {"id": 2107, "synset": "pacific_giant_salamander.n.01", "name": "Pacific_giant_salamander"}, - {"id": 2108, "synset": "olympic_salamander.n.01", "name": "olympic_salamander"}, - {"id": 2109, "synset": "lungless_salamander.n.01", "name": "lungless_salamander"}, - { - "id": 2110, - "synset": "eastern_red-backed_salamander.n.01", - "name": "eastern_red-backed_salamander", - }, - { - "id": 2111, - "synset": "western_red-backed_salamander.n.01", - "name": "western_red-backed_salamander", - }, - {"id": 2112, "synset": "dusky_salamander.n.01", "name": "dusky_salamander"}, - {"id": 2113, "synset": "climbing_salamander.n.01", "name": "climbing_salamander"}, - {"id": 2114, "synset": "arboreal_salamander.n.01", "name": "arboreal_salamander"}, - {"id": 2115, "synset": "slender_salamander.n.01", "name": "slender_salamander"}, - {"id": 2116, "synset": "web-toed_salamander.n.01", "name": "web-toed_salamander"}, - {"id": 2117, "synset": "shasta_salamander.n.01", "name": "Shasta_salamander"}, - {"id": 2118, "synset": "limestone_salamander.n.01", "name": "limestone_salamander"}, - {"id": 2119, "synset": "amphiuma.n.01", "name": "amphiuma"}, - {"id": 2120, "synset": "siren.n.05", "name": "siren"}, - {"id": 2121, "synset": "true_frog.n.01", "name": "true_frog"}, - {"id": 2122, "synset": "wood-frog.n.01", "name": "wood-frog"}, - {"id": 2123, "synset": "leopard_frog.n.01", "name": "leopard_frog"}, - {"id": 2124, "synset": "bullfrog.n.01", "name": "bullfrog"}, - {"id": 2125, "synset": "green_frog.n.01", "name": "green_frog"}, - {"id": 2126, "synset": "cascades_frog.n.01", "name": "cascades_frog"}, - {"id": 2127, "synset": "goliath_frog.n.01", "name": "goliath_frog"}, - {"id": 2128, "synset": "pickerel_frog.n.01", "name": "pickerel_frog"}, - {"id": 2129, "synset": "tarahumara_frog.n.01", "name": "tarahumara_frog"}, - {"id": 2130, "synset": "grass_frog.n.01", "name": "grass_frog"}, - {"id": 2131, "synset": "leptodactylid_frog.n.01", "name": "leptodactylid_frog"}, - {"id": 2132, "synset": "robber_frog.n.02", "name": "robber_frog"}, - {"id": 2133, "synset": "barking_frog.n.01", "name": "barking_frog"}, - {"id": 2134, "synset": "crapaud.n.01", "name": "crapaud"}, - {"id": 2135, "synset": "tree_frog.n.02", "name": "tree_frog"}, - {"id": 2136, "synset": "tailed_frog.n.01", "name": "tailed_frog"}, - {"id": 2137, "synset": "liopelma_hamiltoni.n.01", "name": "Liopelma_hamiltoni"}, - {"id": 2138, "synset": "true_toad.n.01", "name": "true_toad"}, - {"id": 2139, "synset": "bufo.n.01", "name": "bufo"}, - {"id": 2140, "synset": "agua.n.01", "name": "agua"}, - {"id": 2141, "synset": "european_toad.n.01", "name": "European_toad"}, - {"id": 2142, "synset": "natterjack.n.01", "name": "natterjack"}, - {"id": 2143, "synset": "american_toad.n.01", "name": "American_toad"}, - {"id": 2144, "synset": "eurasian_green_toad.n.01", "name": "Eurasian_green_toad"}, - {"id": 2145, "synset": "american_green_toad.n.01", "name": "American_green_toad"}, - {"id": 2146, "synset": "yosemite_toad.n.01", "name": "Yosemite_toad"}, - {"id": 2147, "synset": "texas_toad.n.01", "name": "Texas_toad"}, - {"id": 2148, "synset": "southwestern_toad.n.01", "name": "southwestern_toad"}, - {"id": 2149, "synset": "western_toad.n.01", "name": "western_toad"}, - {"id": 2150, "synset": "obstetrical_toad.n.01", "name": "obstetrical_toad"}, - {"id": 2151, "synset": "midwife_toad.n.01", "name": "midwife_toad"}, - {"id": 2152, "synset": "fire-bellied_toad.n.01", "name": "fire-bellied_toad"}, - {"id": 2153, "synset": "spadefoot.n.01", "name": "spadefoot"}, - {"id": 2154, "synset": "western_spadefoot.n.01", "name": "western_spadefoot"}, - {"id": 2155, "synset": "southern_spadefoot.n.01", "name": "southern_spadefoot"}, - {"id": 2156, "synset": "plains_spadefoot.n.01", "name": "plains_spadefoot"}, - {"id": 2157, "synset": "tree_toad.n.01", "name": "tree_toad"}, - {"id": 2158, "synset": "spring_peeper.n.01", "name": "spring_peeper"}, - {"id": 2159, "synset": "pacific_tree_toad.n.01", "name": "Pacific_tree_toad"}, - {"id": 2160, "synset": "canyon_treefrog.n.01", "name": "canyon_treefrog"}, - {"id": 2161, "synset": "chameleon_tree_frog.n.01", "name": "chameleon_tree_frog"}, - {"id": 2162, "synset": "cricket_frog.n.01", "name": "cricket_frog"}, - {"id": 2163, "synset": "northern_cricket_frog.n.01", "name": "northern_cricket_frog"}, - {"id": 2164, "synset": "eastern_cricket_frog.n.01", "name": "eastern_cricket_frog"}, - {"id": 2165, "synset": "chorus_frog.n.01", "name": "chorus_frog"}, - {"id": 2166, "synset": "lowland_burrowing_treefrog.n.01", "name": "lowland_burrowing_treefrog"}, - { - "id": 2167, - "synset": "western_narrow-mouthed_toad.n.01", - "name": "western_narrow-mouthed_toad", - }, - { - "id": 2168, - "synset": "eastern_narrow-mouthed_toad.n.01", - "name": "eastern_narrow-mouthed_toad", - }, - {"id": 2169, "synset": "sheep_frog.n.01", "name": "sheep_frog"}, - {"id": 2170, "synset": "tongueless_frog.n.01", "name": "tongueless_frog"}, - {"id": 2171, "synset": "surinam_toad.n.01", "name": "Surinam_toad"}, - {"id": 2172, "synset": "african_clawed_frog.n.01", "name": "African_clawed_frog"}, - {"id": 2173, "synset": "south_american_poison_toad.n.01", "name": "South_American_poison_toad"}, - {"id": 2174, "synset": "caecilian.n.01", "name": "caecilian"}, - {"id": 2175, "synset": "reptile.n.01", "name": "reptile"}, - {"id": 2176, "synset": "anapsid.n.01", "name": "anapsid"}, - {"id": 2177, "synset": "diapsid.n.01", "name": "diapsid"}, - {"id": 2178, "synset": "diapsida.n.01", "name": "Diapsida"}, - {"id": 2179, "synset": "chelonian.n.01", "name": "chelonian"}, - {"id": 2180, "synset": "sea_turtle.n.01", "name": "sea_turtle"}, - {"id": 2181, "synset": "green_turtle.n.01", "name": "green_turtle"}, - {"id": 2182, "synset": "loggerhead.n.02", "name": "loggerhead"}, - {"id": 2183, "synset": "ridley.n.01", "name": "ridley"}, - {"id": 2184, "synset": "atlantic_ridley.n.01", "name": "Atlantic_ridley"}, - {"id": 2185, "synset": "pacific_ridley.n.01", "name": "Pacific_ridley"}, - {"id": 2186, "synset": "hawksbill_turtle.n.01", "name": "hawksbill_turtle"}, - {"id": 2187, "synset": "leatherback_turtle.n.01", "name": "leatherback_turtle"}, - {"id": 2188, "synset": "snapping_turtle.n.01", "name": "snapping_turtle"}, - {"id": 2189, "synset": "common_snapping_turtle.n.01", "name": "common_snapping_turtle"}, - {"id": 2190, "synset": "alligator_snapping_turtle.n.01", "name": "alligator_snapping_turtle"}, - {"id": 2191, "synset": "mud_turtle.n.01", "name": "mud_turtle"}, - {"id": 2192, "synset": "musk_turtle.n.01", "name": "musk_turtle"}, - {"id": 2193, "synset": "terrapin.n.01", "name": "terrapin"}, - {"id": 2194, "synset": "diamondback_terrapin.n.01", "name": "diamondback_terrapin"}, - {"id": 2195, "synset": "red-bellied_terrapin.n.01", "name": "red-bellied_terrapin"}, - {"id": 2196, "synset": "slider.n.03", "name": "slider"}, - {"id": 2197, "synset": "cooter.n.01", "name": "cooter"}, - {"id": 2198, "synset": "box_turtle.n.01", "name": "box_turtle"}, - {"id": 2199, "synset": "western_box_turtle.n.01", "name": "Western_box_turtle"}, - {"id": 2200, "synset": "painted_turtle.n.01", "name": "painted_turtle"}, - {"id": 2201, "synset": "tortoise.n.01", "name": "tortoise"}, - {"id": 2202, "synset": "european_tortoise.n.01", "name": "European_tortoise"}, - {"id": 2203, "synset": "giant_tortoise.n.01", "name": "giant_tortoise"}, - {"id": 2204, "synset": "gopher_tortoise.n.01", "name": "gopher_tortoise"}, - {"id": 2205, "synset": "desert_tortoise.n.01", "name": "desert_tortoise"}, - {"id": 2206, "synset": "texas_tortoise.n.01", "name": "Texas_tortoise"}, - {"id": 2207, "synset": "soft-shelled_turtle.n.01", "name": "soft-shelled_turtle"}, - {"id": 2208, "synset": "spiny_softshell.n.01", "name": "spiny_softshell"}, - {"id": 2209, "synset": "smooth_softshell.n.01", "name": "smooth_softshell"}, - {"id": 2210, "synset": "tuatara.n.01", "name": "tuatara"}, - {"id": 2211, "synset": "saurian.n.01", "name": "saurian"}, - {"id": 2212, "synset": "gecko.n.01", "name": "gecko"}, - {"id": 2213, "synset": "flying_gecko.n.01", "name": "flying_gecko"}, - {"id": 2214, "synset": "banded_gecko.n.01", "name": "banded_gecko"}, - {"id": 2215, "synset": "iguanid.n.01", "name": "iguanid"}, - {"id": 2216, "synset": "common_iguana.n.01", "name": "common_iguana"}, - {"id": 2217, "synset": "marine_iguana.n.01", "name": "marine_iguana"}, - {"id": 2218, "synset": "desert_iguana.n.01", "name": "desert_iguana"}, - {"id": 2219, "synset": "chuckwalla.n.01", "name": "chuckwalla"}, - {"id": 2220, "synset": "zebra-tailed_lizard.n.01", "name": "zebra-tailed_lizard"}, - {"id": 2221, "synset": "fringe-toed_lizard.n.01", "name": "fringe-toed_lizard"}, - {"id": 2222, "synset": "earless_lizard.n.01", "name": "earless_lizard"}, - {"id": 2223, "synset": "collared_lizard.n.01", "name": "collared_lizard"}, - {"id": 2224, "synset": "leopard_lizard.n.01", "name": "leopard_lizard"}, - {"id": 2225, "synset": "spiny_lizard.n.02", "name": "spiny_lizard"}, - {"id": 2226, "synset": "fence_lizard.n.01", "name": "fence_lizard"}, - {"id": 2227, "synset": "western_fence_lizard.n.01", "name": "western_fence_lizard"}, - {"id": 2228, "synset": "eastern_fence_lizard.n.01", "name": "eastern_fence_lizard"}, - {"id": 2229, "synset": "sagebrush_lizard.n.01", "name": "sagebrush_lizard"}, - {"id": 2230, "synset": "side-blotched_lizard.n.01", "name": "side-blotched_lizard"}, - {"id": 2231, "synset": "tree_lizard.n.01", "name": "tree_lizard"}, - {"id": 2232, "synset": "horned_lizard.n.01", "name": "horned_lizard"}, - {"id": 2233, "synset": "texas_horned_lizard.n.01", "name": "Texas_horned_lizard"}, - {"id": 2234, "synset": "basilisk.n.03", "name": "basilisk"}, - {"id": 2235, "synset": "american_chameleon.n.01", "name": "American_chameleon"}, - {"id": 2236, "synset": "worm_lizard.n.01", "name": "worm_lizard"}, - {"id": 2237, "synset": "night_lizard.n.01", "name": "night_lizard"}, - {"id": 2238, "synset": "skink.n.01", "name": "skink"}, - {"id": 2239, "synset": "western_skink.n.01", "name": "western_skink"}, - {"id": 2240, "synset": "mountain_skink.n.01", "name": "mountain_skink"}, - {"id": 2241, "synset": "teiid_lizard.n.01", "name": "teiid_lizard"}, - {"id": 2242, "synset": "whiptail.n.01", "name": "whiptail"}, - {"id": 2243, "synset": "racerunner.n.01", "name": "racerunner"}, - {"id": 2244, "synset": "plateau_striped_whiptail.n.01", "name": "plateau_striped_whiptail"}, - { - "id": 2245, - "synset": "chihuahuan_spotted_whiptail.n.01", - "name": "Chihuahuan_spotted_whiptail", - }, - {"id": 2246, "synset": "western_whiptail.n.01", "name": "western_whiptail"}, - {"id": 2247, "synset": "checkered_whiptail.n.01", "name": "checkered_whiptail"}, - {"id": 2248, "synset": "teju.n.01", "name": "teju"}, - {"id": 2249, "synset": "caiman_lizard.n.01", "name": "caiman_lizard"}, - {"id": 2250, "synset": "agamid.n.01", "name": "agamid"}, - {"id": 2251, "synset": "agama.n.01", "name": "agama"}, - {"id": 2252, "synset": "frilled_lizard.n.01", "name": "frilled_lizard"}, - {"id": 2253, "synset": "moloch.n.03", "name": "moloch"}, - {"id": 2254, "synset": "mountain_devil.n.02", "name": "mountain_devil"}, - {"id": 2255, "synset": "anguid_lizard.n.01", "name": "anguid_lizard"}, - {"id": 2256, "synset": "alligator_lizard.n.01", "name": "alligator_lizard"}, - {"id": 2257, "synset": "blindworm.n.01", "name": "blindworm"}, - {"id": 2258, "synset": "glass_lizard.n.01", "name": "glass_lizard"}, - {"id": 2259, "synset": "legless_lizard.n.01", "name": "legless_lizard"}, - {"id": 2260, "synset": "lanthanotus_borneensis.n.01", "name": "Lanthanotus_borneensis"}, - {"id": 2261, "synset": "venomous_lizard.n.01", "name": "venomous_lizard"}, - {"id": 2262, "synset": "gila_monster.n.01", "name": "Gila_monster"}, - {"id": 2263, "synset": "beaded_lizard.n.01", "name": "beaded_lizard"}, - {"id": 2264, "synset": "lacertid_lizard.n.01", "name": "lacertid_lizard"}, - {"id": 2265, "synset": "sand_lizard.n.01", "name": "sand_lizard"}, - {"id": 2266, "synset": "green_lizard.n.01", "name": "green_lizard"}, - {"id": 2267, "synset": "chameleon.n.03", "name": "chameleon"}, - {"id": 2268, "synset": "african_chameleon.n.01", "name": "African_chameleon"}, - {"id": 2269, "synset": "horned_chameleon.n.01", "name": "horned_chameleon"}, - {"id": 2270, "synset": "monitor.n.07", "name": "monitor"}, - {"id": 2271, "synset": "african_monitor.n.01", "name": "African_monitor"}, - {"id": 2272, "synset": "komodo_dragon.n.01", "name": "Komodo_dragon"}, - {"id": 2273, "synset": "crocodilian_reptile.n.01", "name": "crocodilian_reptile"}, - {"id": 2274, "synset": "crocodile.n.01", "name": "crocodile"}, - {"id": 2275, "synset": "african_crocodile.n.01", "name": "African_crocodile"}, - {"id": 2276, "synset": "asian_crocodile.n.01", "name": "Asian_crocodile"}, - {"id": 2277, "synset": "morlett's_crocodile.n.01", "name": "Morlett's_crocodile"}, - {"id": 2278, "synset": "false_gavial.n.01", "name": "false_gavial"}, - {"id": 2279, "synset": "american_alligator.n.01", "name": "American_alligator"}, - {"id": 2280, "synset": "chinese_alligator.n.01", "name": "Chinese_alligator"}, - {"id": 2281, "synset": "caiman.n.01", "name": "caiman"}, - {"id": 2282, "synset": "spectacled_caiman.n.01", "name": "spectacled_caiman"}, - {"id": 2283, "synset": "gavial.n.01", "name": "gavial"}, - {"id": 2284, "synset": "armored_dinosaur.n.01", "name": "armored_dinosaur"}, - {"id": 2285, "synset": "stegosaur.n.01", "name": "stegosaur"}, - {"id": 2286, "synset": "ankylosaur.n.01", "name": "ankylosaur"}, - {"id": 2287, "synset": "edmontonia.n.01", "name": "Edmontonia"}, - {"id": 2288, "synset": "bone-headed_dinosaur.n.01", "name": "bone-headed_dinosaur"}, - {"id": 2289, "synset": "pachycephalosaur.n.01", "name": "pachycephalosaur"}, - {"id": 2290, "synset": "ceratopsian.n.01", "name": "ceratopsian"}, - {"id": 2291, "synset": "protoceratops.n.01", "name": "protoceratops"}, - {"id": 2292, "synset": "triceratops.n.01", "name": "triceratops"}, - {"id": 2293, "synset": "styracosaur.n.01", "name": "styracosaur"}, - {"id": 2294, "synset": "psittacosaur.n.01", "name": "psittacosaur"}, - {"id": 2295, "synset": "ornithopod.n.01", "name": "ornithopod"}, - {"id": 2296, "synset": "hadrosaur.n.01", "name": "hadrosaur"}, - {"id": 2297, "synset": "trachodon.n.01", "name": "trachodon"}, - {"id": 2298, "synset": "saurischian.n.01", "name": "saurischian"}, - {"id": 2299, "synset": "sauropod.n.01", "name": "sauropod"}, - {"id": 2300, "synset": "apatosaur.n.01", "name": "apatosaur"}, - {"id": 2301, "synset": "barosaur.n.01", "name": "barosaur"}, - {"id": 2302, "synset": "diplodocus.n.01", "name": "diplodocus"}, - {"id": 2303, "synset": "argentinosaur.n.01", "name": "argentinosaur"}, - {"id": 2304, "synset": "theropod.n.01", "name": "theropod"}, - {"id": 2305, "synset": "ceratosaur.n.01", "name": "ceratosaur"}, - {"id": 2306, "synset": "coelophysis.n.01", "name": "coelophysis"}, - {"id": 2307, "synset": "tyrannosaur.n.01", "name": "tyrannosaur"}, - {"id": 2308, "synset": "allosaur.n.01", "name": "allosaur"}, - {"id": 2309, "synset": "ornithomimid.n.01", "name": "ornithomimid"}, - {"id": 2310, "synset": "maniraptor.n.01", "name": "maniraptor"}, - {"id": 2311, "synset": "oviraptorid.n.01", "name": "oviraptorid"}, - {"id": 2312, "synset": "velociraptor.n.01", "name": "velociraptor"}, - {"id": 2313, "synset": "deinonychus.n.01", "name": "deinonychus"}, - {"id": 2314, "synset": "utahraptor.n.01", "name": "utahraptor"}, - {"id": 2315, "synset": "synapsid.n.01", "name": "synapsid"}, - {"id": 2316, "synset": "dicynodont.n.01", "name": "dicynodont"}, - {"id": 2317, "synset": "pelycosaur.n.01", "name": "pelycosaur"}, - {"id": 2318, "synset": "dimetrodon.n.01", "name": "dimetrodon"}, - {"id": 2319, "synset": "pterosaur.n.01", "name": "pterosaur"}, - {"id": 2320, "synset": "pterodactyl.n.01", "name": "pterodactyl"}, - {"id": 2321, "synset": "ichthyosaur.n.01", "name": "ichthyosaur"}, - {"id": 2322, "synset": "ichthyosaurus.n.01", "name": "ichthyosaurus"}, - {"id": 2323, "synset": "stenopterygius.n.01", "name": "stenopterygius"}, - {"id": 2324, "synset": "plesiosaur.n.01", "name": "plesiosaur"}, - {"id": 2325, "synset": "nothosaur.n.01", "name": "nothosaur"}, - {"id": 2326, "synset": "colubrid_snake.n.01", "name": "colubrid_snake"}, - {"id": 2327, "synset": "hoop_snake.n.01", "name": "hoop_snake"}, - {"id": 2328, "synset": "thunder_snake.n.01", "name": "thunder_snake"}, - {"id": 2329, "synset": "ringneck_snake.n.01", "name": "ringneck_snake"}, - {"id": 2330, "synset": "hognose_snake.n.01", "name": "hognose_snake"}, - {"id": 2331, "synset": "leaf-nosed_snake.n.01", "name": "leaf-nosed_snake"}, - {"id": 2332, "synset": "green_snake.n.02", "name": "green_snake"}, - {"id": 2333, "synset": "smooth_green_snake.n.01", "name": "smooth_green_snake"}, - {"id": 2334, "synset": "rough_green_snake.n.01", "name": "rough_green_snake"}, - {"id": 2335, "synset": "green_snake.n.01", "name": "green_snake"}, - {"id": 2336, "synset": "racer.n.04", "name": "racer"}, - {"id": 2337, "synset": "blacksnake.n.02", "name": "blacksnake"}, - {"id": 2338, "synset": "blue_racer.n.01", "name": "blue_racer"}, - {"id": 2339, "synset": "horseshoe_whipsnake.n.01", "name": "horseshoe_whipsnake"}, - {"id": 2340, "synset": "whip-snake.n.01", "name": "whip-snake"}, - {"id": 2341, "synset": "coachwhip.n.02", "name": "coachwhip"}, - {"id": 2342, "synset": "california_whipsnake.n.01", "name": "California_whipsnake"}, - {"id": 2343, "synset": "sonoran_whipsnake.n.01", "name": "Sonoran_whipsnake"}, - {"id": 2344, "synset": "rat_snake.n.01", "name": "rat_snake"}, - {"id": 2345, "synset": "corn_snake.n.01", "name": "corn_snake"}, - {"id": 2346, "synset": "black_rat_snake.n.01", "name": "black_rat_snake"}, - {"id": 2347, "synset": "chicken_snake.n.01", "name": "chicken_snake"}, - {"id": 2348, "synset": "indian_rat_snake.n.01", "name": "Indian_rat_snake"}, - {"id": 2349, "synset": "glossy_snake.n.01", "name": "glossy_snake"}, - {"id": 2350, "synset": "bull_snake.n.01", "name": "bull_snake"}, - {"id": 2351, "synset": "gopher_snake.n.02", "name": "gopher_snake"}, - {"id": 2352, "synset": "pine_snake.n.01", "name": "pine_snake"}, - {"id": 2353, "synset": "king_snake.n.01", "name": "king_snake"}, - {"id": 2354, "synset": "common_kingsnake.n.01", "name": "common_kingsnake"}, - {"id": 2355, "synset": "milk_snake.n.01", "name": "milk_snake"}, - {"id": 2356, "synset": "garter_snake.n.01", "name": "garter_snake"}, - {"id": 2357, "synset": "common_garter_snake.n.01", "name": "common_garter_snake"}, - {"id": 2358, "synset": "ribbon_snake.n.01", "name": "ribbon_snake"}, - {"id": 2359, "synset": "western_ribbon_snake.n.01", "name": "Western_ribbon_snake"}, - {"id": 2360, "synset": "lined_snake.n.01", "name": "lined_snake"}, - {"id": 2361, "synset": "ground_snake.n.01", "name": "ground_snake"}, - {"id": 2362, "synset": "eastern_ground_snake.n.01", "name": "eastern_ground_snake"}, - {"id": 2363, "synset": "water_snake.n.01", "name": "water_snake"}, - {"id": 2364, "synset": "common_water_snake.n.01", "name": "common_water_snake"}, - {"id": 2365, "synset": "water_moccasin.n.02", "name": "water_moccasin"}, - {"id": 2366, "synset": "grass_snake.n.01", "name": "grass_snake"}, - {"id": 2367, "synset": "viperine_grass_snake.n.01", "name": "viperine_grass_snake"}, - {"id": 2368, "synset": "red-bellied_snake.n.01", "name": "red-bellied_snake"}, - {"id": 2369, "synset": "sand_snake.n.01", "name": "sand_snake"}, - {"id": 2370, "synset": "banded_sand_snake.n.01", "name": "banded_sand_snake"}, - {"id": 2371, "synset": "black-headed_snake.n.01", "name": "black-headed_snake"}, - {"id": 2372, "synset": "vine_snake.n.01", "name": "vine_snake"}, - {"id": 2373, "synset": "lyre_snake.n.01", "name": "lyre_snake"}, - {"id": 2374, "synset": "sonoran_lyre_snake.n.01", "name": "Sonoran_lyre_snake"}, - {"id": 2375, "synset": "night_snake.n.01", "name": "night_snake"}, - {"id": 2376, "synset": "blind_snake.n.01", "name": "blind_snake"}, - {"id": 2377, "synset": "western_blind_snake.n.01", "name": "western_blind_snake"}, - {"id": 2378, "synset": "indigo_snake.n.01", "name": "indigo_snake"}, - {"id": 2379, "synset": "eastern_indigo_snake.n.01", "name": "eastern_indigo_snake"}, - {"id": 2380, "synset": "constrictor.n.01", "name": "constrictor"}, - {"id": 2381, "synset": "boa.n.02", "name": "boa"}, - {"id": 2382, "synset": "boa_constrictor.n.01", "name": "boa_constrictor"}, - {"id": 2383, "synset": "rubber_boa.n.01", "name": "rubber_boa"}, - {"id": 2384, "synset": "rosy_boa.n.01", "name": "rosy_boa"}, - {"id": 2385, "synset": "anaconda.n.01", "name": "anaconda"}, - {"id": 2386, "synset": "python.n.01", "name": "python"}, - {"id": 2387, "synset": "carpet_snake.n.01", "name": "carpet_snake"}, - {"id": 2388, "synset": "reticulated_python.n.01", "name": "reticulated_python"}, - {"id": 2389, "synset": "indian_python.n.01", "name": "Indian_python"}, - {"id": 2390, "synset": "rock_python.n.01", "name": "rock_python"}, - {"id": 2391, "synset": "amethystine_python.n.01", "name": "amethystine_python"}, - {"id": 2392, "synset": "elapid.n.01", "name": "elapid"}, - {"id": 2393, "synset": "coral_snake.n.02", "name": "coral_snake"}, - {"id": 2394, "synset": "eastern_coral_snake.n.01", "name": "eastern_coral_snake"}, - {"id": 2395, "synset": "western_coral_snake.n.01", "name": "western_coral_snake"}, - {"id": 2396, "synset": "coral_snake.n.01", "name": "coral_snake"}, - {"id": 2397, "synset": "african_coral_snake.n.01", "name": "African_coral_snake"}, - {"id": 2398, "synset": "australian_coral_snake.n.01", "name": "Australian_coral_snake"}, - {"id": 2399, "synset": "copperhead.n.02", "name": "copperhead"}, - {"id": 2400, "synset": "cobra.n.01", "name": "cobra"}, - {"id": 2401, "synset": "indian_cobra.n.01", "name": "Indian_cobra"}, - {"id": 2402, "synset": "asp.n.02", "name": "asp"}, - {"id": 2403, "synset": "black-necked_cobra.n.01", "name": "black-necked_cobra"}, - {"id": 2404, "synset": "hamadryad.n.02", "name": "hamadryad"}, - {"id": 2405, "synset": "ringhals.n.01", "name": "ringhals"}, - {"id": 2406, "synset": "mamba.n.01", "name": "mamba"}, - {"id": 2407, "synset": "black_mamba.n.01", "name": "black_mamba"}, - {"id": 2408, "synset": "green_mamba.n.01", "name": "green_mamba"}, - {"id": 2409, "synset": "death_adder.n.01", "name": "death_adder"}, - {"id": 2410, "synset": "tiger_snake.n.01", "name": "tiger_snake"}, - {"id": 2411, "synset": "australian_blacksnake.n.01", "name": "Australian_blacksnake"}, - {"id": 2412, "synset": "krait.n.01", "name": "krait"}, - {"id": 2413, "synset": "banded_krait.n.01", "name": "banded_krait"}, - {"id": 2414, "synset": "taipan.n.01", "name": "taipan"}, - {"id": 2415, "synset": "sea_snake.n.01", "name": "sea_snake"}, - {"id": 2416, "synset": "viper.n.01", "name": "viper"}, - {"id": 2417, "synset": "adder.n.03", "name": "adder"}, - {"id": 2418, "synset": "asp.n.01", "name": "asp"}, - {"id": 2419, "synset": "puff_adder.n.01", "name": "puff_adder"}, - {"id": 2420, "synset": "gaboon_viper.n.01", "name": "gaboon_viper"}, - {"id": 2421, "synset": "horned_viper.n.01", "name": "horned_viper"}, - {"id": 2422, "synset": "pit_viper.n.01", "name": "pit_viper"}, - {"id": 2423, "synset": "copperhead.n.01", "name": "copperhead"}, - {"id": 2424, "synset": "water_moccasin.n.01", "name": "water_moccasin"}, - {"id": 2425, "synset": "rattlesnake.n.01", "name": "rattlesnake"}, - {"id": 2426, "synset": "diamondback.n.01", "name": "diamondback"}, - {"id": 2427, "synset": "timber_rattlesnake.n.01", "name": "timber_rattlesnake"}, - {"id": 2428, "synset": "canebrake_rattlesnake.n.01", "name": "canebrake_rattlesnake"}, - {"id": 2429, "synset": "prairie_rattlesnake.n.01", "name": "prairie_rattlesnake"}, - {"id": 2430, "synset": "sidewinder.n.01", "name": "sidewinder"}, - {"id": 2431, "synset": "western_diamondback.n.01", "name": "Western_diamondback"}, - {"id": 2432, "synset": "rock_rattlesnake.n.01", "name": "rock_rattlesnake"}, - {"id": 2433, "synset": "tiger_rattlesnake.n.01", "name": "tiger_rattlesnake"}, - {"id": 2434, "synset": "mojave_rattlesnake.n.01", "name": "Mojave_rattlesnake"}, - {"id": 2435, "synset": "speckled_rattlesnake.n.01", "name": "speckled_rattlesnake"}, - {"id": 2436, "synset": "massasauga.n.02", "name": "massasauga"}, - {"id": 2437, "synset": "ground_rattler.n.01", "name": "ground_rattler"}, - {"id": 2438, "synset": "fer-de-lance.n.01", "name": "fer-de-lance"}, - {"id": 2439, "synset": "carcase.n.01", "name": "carcase"}, - {"id": 2440, "synset": "carrion.n.01", "name": "carrion"}, - {"id": 2441, "synset": "arthropod.n.01", "name": "arthropod"}, - {"id": 2442, "synset": "trilobite.n.01", "name": "trilobite"}, - {"id": 2443, "synset": "arachnid.n.01", "name": "arachnid"}, - {"id": 2444, "synset": "harvestman.n.01", "name": "harvestman"}, - {"id": 2445, "synset": "scorpion.n.03", "name": "scorpion"}, - {"id": 2446, "synset": "false_scorpion.n.01", "name": "false_scorpion"}, - {"id": 2447, "synset": "book_scorpion.n.01", "name": "book_scorpion"}, - {"id": 2448, "synset": "whip-scorpion.n.01", "name": "whip-scorpion"}, - {"id": 2449, "synset": "vinegarroon.n.01", "name": "vinegarroon"}, - {"id": 2450, "synset": "orb-weaving_spider.n.01", "name": "orb-weaving_spider"}, - { - "id": 2451, - "synset": "black_and_gold_garden_spider.n.01", - "name": "black_and_gold_garden_spider", - }, - {"id": 2452, "synset": "barn_spider.n.01", "name": "barn_spider"}, - {"id": 2453, "synset": "garden_spider.n.01", "name": "garden_spider"}, - {"id": 2454, "synset": "comb-footed_spider.n.01", "name": "comb-footed_spider"}, - {"id": 2455, "synset": "black_widow.n.01", "name": "black_widow"}, - {"id": 2456, "synset": "tarantula.n.02", "name": "tarantula"}, - {"id": 2457, "synset": "wolf_spider.n.01", "name": "wolf_spider"}, - {"id": 2458, "synset": "european_wolf_spider.n.01", "name": "European_wolf_spider"}, - {"id": 2459, "synset": "trap-door_spider.n.01", "name": "trap-door_spider"}, - {"id": 2460, "synset": "acarine.n.01", "name": "acarine"}, - {"id": 2461, "synset": "tick.n.02", "name": "tick"}, - {"id": 2462, "synset": "hard_tick.n.01", "name": "hard_tick"}, - {"id": 2463, "synset": "ixodes_dammini.n.01", "name": "Ixodes_dammini"}, - {"id": 2464, "synset": "ixodes_neotomae.n.01", "name": "Ixodes_neotomae"}, - {"id": 2465, "synset": "ixodes_pacificus.n.01", "name": "Ixodes_pacificus"}, - {"id": 2466, "synset": "ixodes_scapularis.n.01", "name": "Ixodes_scapularis"}, - {"id": 2467, "synset": "sheep-tick.n.02", "name": "sheep-tick"}, - {"id": 2468, "synset": "ixodes_persulcatus.n.01", "name": "Ixodes_persulcatus"}, - {"id": 2469, "synset": "ixodes_dentatus.n.01", "name": "Ixodes_dentatus"}, - {"id": 2470, "synset": "ixodes_spinipalpis.n.01", "name": "Ixodes_spinipalpis"}, - {"id": 2471, "synset": "wood_tick.n.01", "name": "wood_tick"}, - {"id": 2472, "synset": "soft_tick.n.01", "name": "soft_tick"}, - {"id": 2473, "synset": "mite.n.02", "name": "mite"}, - {"id": 2474, "synset": "web-spinning_mite.n.01", "name": "web-spinning_mite"}, - {"id": 2475, "synset": "acarid.n.01", "name": "acarid"}, - {"id": 2476, "synset": "trombidiid.n.01", "name": "trombidiid"}, - {"id": 2477, "synset": "trombiculid.n.01", "name": "trombiculid"}, - {"id": 2478, "synset": "harvest_mite.n.01", "name": "harvest_mite"}, - {"id": 2479, "synset": "acarus.n.01", "name": "acarus"}, - {"id": 2480, "synset": "itch_mite.n.01", "name": "itch_mite"}, - {"id": 2481, "synset": "rust_mite.n.01", "name": "rust_mite"}, - {"id": 2482, "synset": "spider_mite.n.01", "name": "spider_mite"}, - {"id": 2483, "synset": "red_spider.n.01", "name": "red_spider"}, - {"id": 2484, "synset": "myriapod.n.01", "name": "myriapod"}, - {"id": 2485, "synset": "garden_centipede.n.01", "name": "garden_centipede"}, - {"id": 2486, "synset": "tardigrade.n.01", "name": "tardigrade"}, - {"id": 2487, "synset": "centipede.n.01", "name": "centipede"}, - {"id": 2488, "synset": "house_centipede.n.01", "name": "house_centipede"}, - {"id": 2489, "synset": "millipede.n.01", "name": "millipede"}, - {"id": 2490, "synset": "sea_spider.n.01", "name": "sea_spider"}, - {"id": 2491, "synset": "merostomata.n.01", "name": "Merostomata"}, - {"id": 2492, "synset": "horseshoe_crab.n.01", "name": "horseshoe_crab"}, - {"id": 2493, "synset": "asian_horseshoe_crab.n.01", "name": "Asian_horseshoe_crab"}, - {"id": 2494, "synset": "eurypterid.n.01", "name": "eurypterid"}, - {"id": 2495, "synset": "tongue_worm.n.01", "name": "tongue_worm"}, - {"id": 2496, "synset": "gallinaceous_bird.n.01", "name": "gallinaceous_bird"}, - {"id": 2497, "synset": "domestic_fowl.n.01", "name": "domestic_fowl"}, - {"id": 2498, "synset": "dorking.n.01", "name": "Dorking"}, - {"id": 2499, "synset": "plymouth_rock.n.02", "name": "Plymouth_Rock"}, - {"id": 2500, "synset": "cornish.n.02", "name": "Cornish"}, - {"id": 2501, "synset": "rock_cornish.n.01", "name": "Rock_Cornish"}, - {"id": 2502, "synset": "game_fowl.n.01", "name": "game_fowl"}, - {"id": 2503, "synset": "cochin.n.01", "name": "cochin"}, - {"id": 2504, "synset": "jungle_fowl.n.01", "name": "jungle_fowl"}, - {"id": 2505, "synset": "jungle_cock.n.01", "name": "jungle_cock"}, - {"id": 2506, "synset": "jungle_hen.n.01", "name": "jungle_hen"}, - {"id": 2507, "synset": "red_jungle_fowl.n.01", "name": "red_jungle_fowl"}, - {"id": 2508, "synset": "bantam.n.01", "name": "bantam"}, - {"id": 2509, "synset": "chick.n.01", "name": "chick"}, - {"id": 2510, "synset": "cockerel.n.01", "name": "cockerel"}, - {"id": 2511, "synset": "capon.n.02", "name": "capon"}, - {"id": 2512, "synset": "hen.n.01", "name": "hen"}, - {"id": 2513, "synset": "cackler.n.01", "name": "cackler"}, - {"id": 2514, "synset": "brood_hen.n.01", "name": "brood_hen"}, - {"id": 2515, "synset": "mother_hen.n.02", "name": "mother_hen"}, - {"id": 2516, "synset": "layer.n.04", "name": "layer"}, - {"id": 2517, "synset": "pullet.n.02", "name": "pullet"}, - {"id": 2518, "synset": "spring_chicken.n.02", "name": "spring_chicken"}, - {"id": 2519, "synset": "rhode_island_red.n.01", "name": "Rhode_Island_red"}, - {"id": 2520, "synset": "dominique.n.01", "name": "Dominique"}, - {"id": 2521, "synset": "orpington.n.01", "name": "Orpington"}, - {"id": 2522, "synset": "turkey.n.01", "name": "turkey"}, - {"id": 2523, "synset": "turkey_cock.n.01", "name": "turkey_cock"}, - {"id": 2524, "synset": "ocellated_turkey.n.01", "name": "ocellated_turkey"}, - {"id": 2525, "synset": "grouse.n.02", "name": "grouse"}, - {"id": 2526, "synset": "black_grouse.n.01", "name": "black_grouse"}, - {"id": 2527, "synset": "european_black_grouse.n.01", "name": "European_black_grouse"}, - {"id": 2528, "synset": "asian_black_grouse.n.01", "name": "Asian_black_grouse"}, - {"id": 2529, "synset": "blackcock.n.01", "name": "blackcock"}, - {"id": 2530, "synset": "greyhen.n.01", "name": "greyhen"}, - {"id": 2531, "synset": "ptarmigan.n.01", "name": "ptarmigan"}, - {"id": 2532, "synset": "red_grouse.n.01", "name": "red_grouse"}, - {"id": 2533, "synset": "moorhen.n.02", "name": "moorhen"}, - {"id": 2534, "synset": "capercaillie.n.01", "name": "capercaillie"}, - {"id": 2535, "synset": "spruce_grouse.n.01", "name": "spruce_grouse"}, - {"id": 2536, "synset": "sage_grouse.n.01", "name": "sage_grouse"}, - {"id": 2537, "synset": "ruffed_grouse.n.01", "name": "ruffed_grouse"}, - {"id": 2538, "synset": "sharp-tailed_grouse.n.01", "name": "sharp-tailed_grouse"}, - {"id": 2539, "synset": "prairie_chicken.n.01", "name": "prairie_chicken"}, - {"id": 2540, "synset": "greater_prairie_chicken.n.01", "name": "greater_prairie_chicken"}, - {"id": 2541, "synset": "lesser_prairie_chicken.n.01", "name": "lesser_prairie_chicken"}, - {"id": 2542, "synset": "heath_hen.n.01", "name": "heath_hen"}, - {"id": 2543, "synset": "guan.n.01", "name": "guan"}, - {"id": 2544, "synset": "curassow.n.01", "name": "curassow"}, - {"id": 2545, "synset": "piping_guan.n.01", "name": "piping_guan"}, - {"id": 2546, "synset": "chachalaca.n.01", "name": "chachalaca"}, - {"id": 2547, "synset": "texas_chachalaca.n.01", "name": "Texas_chachalaca"}, - {"id": 2548, "synset": "megapode.n.01", "name": "megapode"}, - {"id": 2549, "synset": "mallee_fowl.n.01", "name": "mallee_fowl"}, - {"id": 2550, "synset": "mallee_hen.n.01", "name": "mallee_hen"}, - {"id": 2551, "synset": "brush_turkey.n.01", "name": "brush_turkey"}, - {"id": 2552, "synset": "maleo.n.01", "name": "maleo"}, - {"id": 2553, "synset": "phasianid.n.01", "name": "phasianid"}, - {"id": 2554, "synset": "pheasant.n.01", "name": "pheasant"}, - {"id": 2555, "synset": "ring-necked_pheasant.n.01", "name": "ring-necked_pheasant"}, - {"id": 2556, "synset": "afropavo.n.01", "name": "afropavo"}, - {"id": 2557, "synset": "argus.n.02", "name": "argus"}, - {"id": 2558, "synset": "golden_pheasant.n.01", "name": "golden_pheasant"}, - {"id": 2559, "synset": "bobwhite.n.01", "name": "bobwhite"}, - {"id": 2560, "synset": "northern_bobwhite.n.01", "name": "northern_bobwhite"}, - {"id": 2561, "synset": "old_world_quail.n.01", "name": "Old_World_quail"}, - {"id": 2562, "synset": "migratory_quail.n.01", "name": "migratory_quail"}, - {"id": 2563, "synset": "monal.n.01", "name": "monal"}, - {"id": 2564, "synset": "peafowl.n.01", "name": "peafowl"}, - {"id": 2565, "synset": "peachick.n.01", "name": "peachick"}, - {"id": 2566, "synset": "peacock.n.02", "name": "peacock"}, - {"id": 2567, "synset": "peahen.n.01", "name": "peahen"}, - {"id": 2568, "synset": "blue_peafowl.n.01", "name": "blue_peafowl"}, - {"id": 2569, "synset": "green_peafowl.n.01", "name": "green_peafowl"}, - {"id": 2570, "synset": "quail.n.02", "name": "quail"}, - {"id": 2571, "synset": "california_quail.n.01", "name": "California_quail"}, - {"id": 2572, "synset": "tragopan.n.01", "name": "tragopan"}, - {"id": 2573, "synset": "partridge.n.03", "name": "partridge"}, - {"id": 2574, "synset": "hungarian_partridge.n.01", "name": "Hungarian_partridge"}, - {"id": 2575, "synset": "red-legged_partridge.n.01", "name": "red-legged_partridge"}, - {"id": 2576, "synset": "greek_partridge.n.01", "name": "Greek_partridge"}, - {"id": 2577, "synset": "mountain_quail.n.01", "name": "mountain_quail"}, - {"id": 2578, "synset": "guinea_fowl.n.01", "name": "guinea_fowl"}, - {"id": 2579, "synset": "guinea_hen.n.02", "name": "guinea_hen"}, - {"id": 2580, "synset": "hoatzin.n.01", "name": "hoatzin"}, - {"id": 2581, "synset": "tinamou.n.01", "name": "tinamou"}, - {"id": 2582, "synset": "columbiform_bird.n.01", "name": "columbiform_bird"}, - {"id": 2583, "synset": "dodo.n.02", "name": "dodo"}, - {"id": 2584, "synset": "pouter_pigeon.n.01", "name": "pouter_pigeon"}, - {"id": 2585, "synset": "rock_dove.n.01", "name": "rock_dove"}, - {"id": 2586, "synset": "band-tailed_pigeon.n.01", "name": "band-tailed_pigeon"}, - {"id": 2587, "synset": "wood_pigeon.n.01", "name": "wood_pigeon"}, - {"id": 2588, "synset": "turtledove.n.02", "name": "turtledove"}, - {"id": 2589, "synset": "streptopelia_turtur.n.01", "name": "Streptopelia_turtur"}, - {"id": 2590, "synset": "ringdove.n.01", "name": "ringdove"}, - {"id": 2591, "synset": "australian_turtledove.n.01", "name": "Australian_turtledove"}, - {"id": 2592, "synset": "mourning_dove.n.01", "name": "mourning_dove"}, - {"id": 2593, "synset": "domestic_pigeon.n.01", "name": "domestic_pigeon"}, - {"id": 2594, "synset": "squab.n.03", "name": "squab"}, - {"id": 2595, "synset": "fairy_swallow.n.01", "name": "fairy_swallow"}, - {"id": 2596, "synset": "roller.n.07", "name": "roller"}, - {"id": 2597, "synset": "homing_pigeon.n.01", "name": "homing_pigeon"}, - {"id": 2598, "synset": "carrier_pigeon.n.01", "name": "carrier_pigeon"}, - {"id": 2599, "synset": "passenger_pigeon.n.01", "name": "passenger_pigeon"}, - {"id": 2600, "synset": "sandgrouse.n.01", "name": "sandgrouse"}, - {"id": 2601, "synset": "painted_sandgrouse.n.01", "name": "painted_sandgrouse"}, - {"id": 2602, "synset": "pin-tailed_sandgrouse.n.01", "name": "pin-tailed_sandgrouse"}, - {"id": 2603, "synset": "pallas's_sandgrouse.n.01", "name": "pallas's_sandgrouse"}, - {"id": 2604, "synset": "popinjay.n.02", "name": "popinjay"}, - {"id": 2605, "synset": "poll.n.04", "name": "poll"}, - {"id": 2606, "synset": "african_grey.n.01", "name": "African_grey"}, - {"id": 2607, "synset": "amazon.n.04", "name": "amazon"}, - {"id": 2608, "synset": "macaw.n.01", "name": "macaw"}, - {"id": 2609, "synset": "kea.n.01", "name": "kea"}, - {"id": 2610, "synset": "cockatoo.n.01", "name": "cockatoo"}, - {"id": 2611, "synset": "sulphur-crested_cockatoo.n.01", "name": "sulphur-crested_cockatoo"}, - {"id": 2612, "synset": "pink_cockatoo.n.01", "name": "pink_cockatoo"}, - {"id": 2613, "synset": "cockateel.n.01", "name": "cockateel"}, - {"id": 2614, "synset": "lovebird.n.02", "name": "lovebird"}, - {"id": 2615, "synset": "lory.n.01", "name": "lory"}, - {"id": 2616, "synset": "lorikeet.n.01", "name": "lorikeet"}, - {"id": 2617, "synset": "varied_lorikeet.n.01", "name": "varied_Lorikeet"}, - {"id": 2618, "synset": "rainbow_lorikeet.n.01", "name": "rainbow_lorikeet"}, - {"id": 2619, "synset": "carolina_parakeet.n.01", "name": "Carolina_parakeet"}, - {"id": 2620, "synset": "budgerigar.n.01", "name": "budgerigar"}, - {"id": 2621, "synset": "ring-necked_parakeet.n.01", "name": "ring-necked_parakeet"}, - {"id": 2622, "synset": "cuculiform_bird.n.01", "name": "cuculiform_bird"}, - {"id": 2623, "synset": "cuckoo.n.02", "name": "cuckoo"}, - {"id": 2624, "synset": "european_cuckoo.n.01", "name": "European_cuckoo"}, - {"id": 2625, "synset": "black-billed_cuckoo.n.01", "name": "black-billed_cuckoo"}, - {"id": 2626, "synset": "roadrunner.n.01", "name": "roadrunner"}, - {"id": 2627, "synset": "ani.n.01", "name": "ani"}, - {"id": 2628, "synset": "coucal.n.01", "name": "coucal"}, - {"id": 2629, "synset": "crow_pheasant.n.01", "name": "crow_pheasant"}, - {"id": 2630, "synset": "touraco.n.01", "name": "touraco"}, - {"id": 2631, "synset": "coraciiform_bird.n.01", "name": "coraciiform_bird"}, - {"id": 2632, "synset": "roller.n.06", "name": "roller"}, - {"id": 2633, "synset": "european_roller.n.01", "name": "European_roller"}, - {"id": 2634, "synset": "ground_roller.n.01", "name": "ground_roller"}, - {"id": 2635, "synset": "kingfisher.n.01", "name": "kingfisher"}, - {"id": 2636, "synset": "eurasian_kingfisher.n.01", "name": "Eurasian_kingfisher"}, - {"id": 2637, "synset": "belted_kingfisher.n.01", "name": "belted_kingfisher"}, - {"id": 2638, "synset": "kookaburra.n.01", "name": "kookaburra"}, - {"id": 2639, "synset": "bee_eater.n.01", "name": "bee_eater"}, - {"id": 2640, "synset": "hornbill.n.01", "name": "hornbill"}, - {"id": 2641, "synset": "hoopoe.n.01", "name": "hoopoe"}, - {"id": 2642, "synset": "euopean_hoopoe.n.01", "name": "Euopean_hoopoe"}, - {"id": 2643, "synset": "wood_hoopoe.n.01", "name": "wood_hoopoe"}, - {"id": 2644, "synset": "motmot.n.01", "name": "motmot"}, - {"id": 2645, "synset": "tody.n.01", "name": "tody"}, - {"id": 2646, "synset": "apodiform_bird.n.01", "name": "apodiform_bird"}, - {"id": 2647, "synset": "swift.n.03", "name": "swift"}, - {"id": 2648, "synset": "european_swift.n.01", "name": "European_swift"}, - {"id": 2649, "synset": "chimney_swift.n.01", "name": "chimney_swift"}, - {"id": 2650, "synset": "swiftlet.n.01", "name": "swiftlet"}, - {"id": 2651, "synset": "tree_swift.n.01", "name": "tree_swift"}, - {"id": 2652, "synset": "archilochus_colubris.n.01", "name": "Archilochus_colubris"}, - {"id": 2653, "synset": "thornbill.n.01", "name": "thornbill"}, - {"id": 2654, "synset": "goatsucker.n.01", "name": "goatsucker"}, - {"id": 2655, "synset": "european_goatsucker.n.01", "name": "European_goatsucker"}, - {"id": 2656, "synset": "chuck-will's-widow.n.01", "name": "chuck-will's-widow"}, - {"id": 2657, "synset": "whippoorwill.n.01", "name": "whippoorwill"}, - {"id": 2658, "synset": "poorwill.n.01", "name": "poorwill"}, - {"id": 2659, "synset": "frogmouth.n.01", "name": "frogmouth"}, - {"id": 2660, "synset": "oilbird.n.01", "name": "oilbird"}, - {"id": 2661, "synset": "piciform_bird.n.01", "name": "piciform_bird"}, - {"id": 2662, "synset": "woodpecker.n.01", "name": "woodpecker"}, - {"id": 2663, "synset": "green_woodpecker.n.01", "name": "green_woodpecker"}, - {"id": 2664, "synset": "downy_woodpecker.n.01", "name": "downy_woodpecker"}, - {"id": 2665, "synset": "flicker.n.02", "name": "flicker"}, - {"id": 2666, "synset": "yellow-shafted_flicker.n.01", "name": "yellow-shafted_flicker"}, - {"id": 2667, "synset": "gilded_flicker.n.01", "name": "gilded_flicker"}, - {"id": 2668, "synset": "red-shafted_flicker.n.01", "name": "red-shafted_flicker"}, - {"id": 2669, "synset": "ivorybill.n.01", "name": "ivorybill"}, - {"id": 2670, "synset": "redheaded_woodpecker.n.01", "name": "redheaded_woodpecker"}, - {"id": 2671, "synset": "sapsucker.n.01", "name": "sapsucker"}, - {"id": 2672, "synset": "yellow-bellied_sapsucker.n.01", "name": "yellow-bellied_sapsucker"}, - {"id": 2673, "synset": "red-breasted_sapsucker.n.01", "name": "red-breasted_sapsucker"}, - {"id": 2674, "synset": "wryneck.n.02", "name": "wryneck"}, - {"id": 2675, "synset": "piculet.n.01", "name": "piculet"}, - {"id": 2676, "synset": "barbet.n.01", "name": "barbet"}, - {"id": 2677, "synset": "puffbird.n.01", "name": "puffbird"}, - {"id": 2678, "synset": "honey_guide.n.01", "name": "honey_guide"}, - {"id": 2679, "synset": "jacamar.n.01", "name": "jacamar"}, - {"id": 2680, "synset": "toucan.n.01", "name": "toucan"}, - {"id": 2681, "synset": "toucanet.n.01", "name": "toucanet"}, - {"id": 2682, "synset": "trogon.n.01", "name": "trogon"}, - {"id": 2683, "synset": "quetzal.n.02", "name": "quetzal"}, - {"id": 2684, "synset": "resplendent_quetzel.n.01", "name": "resplendent_quetzel"}, - {"id": 2685, "synset": "aquatic_bird.n.01", "name": "aquatic_bird"}, - {"id": 2686, "synset": "waterfowl.n.01", "name": "waterfowl"}, - {"id": 2687, "synset": "anseriform_bird.n.01", "name": "anseriform_bird"}, - {"id": 2688, "synset": "drake.n.02", "name": "drake"}, - {"id": 2689, "synset": "quack-quack.n.01", "name": "quack-quack"}, - {"id": 2690, "synset": "diving_duck.n.01", "name": "diving_duck"}, - {"id": 2691, "synset": "dabbling_duck.n.01", "name": "dabbling_duck"}, - {"id": 2692, "synset": "black_duck.n.01", "name": "black_duck"}, - {"id": 2693, "synset": "teal.n.02", "name": "teal"}, - {"id": 2694, "synset": "greenwing.n.01", "name": "greenwing"}, - {"id": 2695, "synset": "bluewing.n.01", "name": "bluewing"}, - {"id": 2696, "synset": "garganey.n.01", "name": "garganey"}, - {"id": 2697, "synset": "widgeon.n.01", "name": "widgeon"}, - {"id": 2698, "synset": "american_widgeon.n.01", "name": "American_widgeon"}, - {"id": 2699, "synset": "shoveler.n.02", "name": "shoveler"}, - {"id": 2700, "synset": "pintail.n.01", "name": "pintail"}, - {"id": 2701, "synset": "sheldrake.n.02", "name": "sheldrake"}, - {"id": 2702, "synset": "shelduck.n.01", "name": "shelduck"}, - {"id": 2703, "synset": "ruddy_duck.n.01", "name": "ruddy_duck"}, - {"id": 2704, "synset": "bufflehead.n.01", "name": "bufflehead"}, - {"id": 2705, "synset": "goldeneye.n.02", "name": "goldeneye"}, - {"id": 2706, "synset": "barrow's_goldeneye.n.01", "name": "Barrow's_goldeneye"}, - {"id": 2707, "synset": "canvasback.n.01", "name": "canvasback"}, - {"id": 2708, "synset": "pochard.n.01", "name": "pochard"}, - {"id": 2709, "synset": "redhead.n.02", "name": "redhead"}, - {"id": 2710, "synset": "scaup.n.01", "name": "scaup"}, - {"id": 2711, "synset": "greater_scaup.n.01", "name": "greater_scaup"}, - {"id": 2712, "synset": "lesser_scaup.n.01", "name": "lesser_scaup"}, - {"id": 2713, "synset": "wild_duck.n.01", "name": "wild_duck"}, - {"id": 2714, "synset": "wood_duck.n.01", "name": "wood_duck"}, - {"id": 2715, "synset": "wood_drake.n.01", "name": "wood_drake"}, - {"id": 2716, "synset": "mandarin_duck.n.01", "name": "mandarin_duck"}, - {"id": 2717, "synset": "muscovy_duck.n.01", "name": "muscovy_duck"}, - {"id": 2718, "synset": "sea_duck.n.01", "name": "sea_duck"}, - {"id": 2719, "synset": "eider.n.01", "name": "eider"}, - {"id": 2720, "synset": "scoter.n.01", "name": "scoter"}, - {"id": 2721, "synset": "common_scoter.n.01", "name": "common_scoter"}, - {"id": 2722, "synset": "old_squaw.n.01", "name": "old_squaw"}, - {"id": 2723, "synset": "merganser.n.01", "name": "merganser"}, - {"id": 2724, "synset": "goosander.n.01", "name": "goosander"}, - {"id": 2725, "synset": "american_merganser.n.01", "name": "American_merganser"}, - {"id": 2726, "synset": "red-breasted_merganser.n.01", "name": "red-breasted_merganser"}, - {"id": 2727, "synset": "smew.n.01", "name": "smew"}, - {"id": 2728, "synset": "hooded_merganser.n.01", "name": "hooded_merganser"}, - {"id": 2729, "synset": "gosling.n.01", "name": "gosling"}, - {"id": 2730, "synset": "gander.n.01", "name": "gander"}, - {"id": 2731, "synset": "chinese_goose.n.01", "name": "Chinese_goose"}, - {"id": 2732, "synset": "greylag.n.01", "name": "greylag"}, - {"id": 2733, "synset": "blue_goose.n.01", "name": "blue_goose"}, - {"id": 2734, "synset": "snow_goose.n.01", "name": "snow_goose"}, - {"id": 2735, "synset": "brant.n.01", "name": "brant"}, - {"id": 2736, "synset": "common_brant_goose.n.01", "name": "common_brant_goose"}, - {"id": 2737, "synset": "honker.n.03", "name": "honker"}, - {"id": 2738, "synset": "barnacle_goose.n.01", "name": "barnacle_goose"}, - {"id": 2739, "synset": "coscoroba.n.01", "name": "coscoroba"}, - {"id": 2740, "synset": "swan.n.01", "name": "swan"}, - {"id": 2741, "synset": "cob.n.04", "name": "cob"}, - {"id": 2742, "synset": "pen.n.05", "name": "pen"}, - {"id": 2743, "synset": "cygnet.n.01", "name": "cygnet"}, - {"id": 2744, "synset": "mute_swan.n.01", "name": "mute_swan"}, - {"id": 2745, "synset": "whooper.n.02", "name": "whooper"}, - {"id": 2746, "synset": "tundra_swan.n.01", "name": "tundra_swan"}, - {"id": 2747, "synset": "whistling_swan.n.01", "name": "whistling_swan"}, - {"id": 2748, "synset": "bewick's_swan.n.01", "name": "Bewick's_swan"}, - {"id": 2749, "synset": "trumpeter.n.04", "name": "trumpeter"}, - {"id": 2750, "synset": "black_swan.n.01", "name": "black_swan"}, - {"id": 2751, "synset": "screamer.n.03", "name": "screamer"}, - {"id": 2752, "synset": "horned_screamer.n.01", "name": "horned_screamer"}, - {"id": 2753, "synset": "crested_screamer.n.01", "name": "crested_screamer"}, - {"id": 2754, "synset": "chaja.n.01", "name": "chaja"}, - {"id": 2755, "synset": "mammal.n.01", "name": "mammal"}, - {"id": 2756, "synset": "female_mammal.n.01", "name": "female_mammal"}, - {"id": 2757, "synset": "tusker.n.01", "name": "tusker"}, - {"id": 2758, "synset": "prototherian.n.01", "name": "prototherian"}, - {"id": 2759, "synset": "monotreme.n.01", "name": "monotreme"}, - {"id": 2760, "synset": "echidna.n.02", "name": "echidna"}, - {"id": 2761, "synset": "echidna.n.01", "name": "echidna"}, - {"id": 2762, "synset": "platypus.n.01", "name": "platypus"}, - {"id": 2763, "synset": "marsupial.n.01", "name": "marsupial"}, - {"id": 2764, "synset": "opossum.n.02", "name": "opossum"}, - {"id": 2765, "synset": "common_opossum.n.01", "name": "common_opossum"}, - {"id": 2766, "synset": "crab-eating_opossum.n.01", "name": "crab-eating_opossum"}, - {"id": 2767, "synset": "opossum_rat.n.01", "name": "opossum_rat"}, - {"id": 2768, "synset": "bandicoot.n.01", "name": "bandicoot"}, - {"id": 2769, "synset": "rabbit-eared_bandicoot.n.01", "name": "rabbit-eared_bandicoot"}, - {"id": 2770, "synset": "kangaroo.n.01", "name": "kangaroo"}, - {"id": 2771, "synset": "giant_kangaroo.n.01", "name": "giant_kangaroo"}, - {"id": 2772, "synset": "wallaby.n.01", "name": "wallaby"}, - {"id": 2773, "synset": "common_wallaby.n.01", "name": "common_wallaby"}, - {"id": 2774, "synset": "hare_wallaby.n.01", "name": "hare_wallaby"}, - {"id": 2775, "synset": "nail-tailed_wallaby.n.01", "name": "nail-tailed_wallaby"}, - {"id": 2776, "synset": "rock_wallaby.n.01", "name": "rock_wallaby"}, - {"id": 2777, "synset": "pademelon.n.01", "name": "pademelon"}, - {"id": 2778, "synset": "tree_wallaby.n.01", "name": "tree_wallaby"}, - {"id": 2779, "synset": "musk_kangaroo.n.01", "name": "musk_kangaroo"}, - {"id": 2780, "synset": "rat_kangaroo.n.01", "name": "rat_kangaroo"}, - {"id": 2781, "synset": "potoroo.n.01", "name": "potoroo"}, - {"id": 2782, "synset": "bettong.n.01", "name": "bettong"}, - {"id": 2783, "synset": "jerboa_kangaroo.n.01", "name": "jerboa_kangaroo"}, - {"id": 2784, "synset": "phalanger.n.01", "name": "phalanger"}, - {"id": 2785, "synset": "cuscus.n.01", "name": "cuscus"}, - {"id": 2786, "synset": "brush-tailed_phalanger.n.01", "name": "brush-tailed_phalanger"}, - {"id": 2787, "synset": "flying_phalanger.n.01", "name": "flying_phalanger"}, - {"id": 2788, "synset": "wombat.n.01", "name": "wombat"}, - {"id": 2789, "synset": "dasyurid_marsupial.n.01", "name": "dasyurid_marsupial"}, - {"id": 2790, "synset": "dasyure.n.01", "name": "dasyure"}, - {"id": 2791, "synset": "eastern_dasyure.n.01", "name": "eastern_dasyure"}, - {"id": 2792, "synset": "native_cat.n.01", "name": "native_cat"}, - {"id": 2793, "synset": "thylacine.n.01", "name": "thylacine"}, - {"id": 2794, "synset": "tasmanian_devil.n.01", "name": "Tasmanian_devil"}, - {"id": 2795, "synset": "pouched_mouse.n.01", "name": "pouched_mouse"}, - {"id": 2796, "synset": "numbat.n.01", "name": "numbat"}, - {"id": 2797, "synset": "pouched_mole.n.01", "name": "pouched_mole"}, - {"id": 2798, "synset": "placental.n.01", "name": "placental"}, - {"id": 2799, "synset": "livestock.n.01", "name": "livestock"}, - {"id": 2800, "synset": "cow.n.02", "name": "cow"}, - {"id": 2801, "synset": "calf.n.04", "name": "calf"}, - {"id": 2802, "synset": "yearling.n.03", "name": "yearling"}, - {"id": 2803, "synset": "buck.n.05", "name": "buck"}, - {"id": 2804, "synset": "doe.n.02", "name": "doe"}, - {"id": 2805, "synset": "insectivore.n.01", "name": "insectivore"}, - {"id": 2806, "synset": "mole.n.06", "name": "mole"}, - {"id": 2807, "synset": "starnose_mole.n.01", "name": "starnose_mole"}, - {"id": 2808, "synset": "brewer's_mole.n.01", "name": "brewer's_mole"}, - {"id": 2809, "synset": "golden_mole.n.01", "name": "golden_mole"}, - {"id": 2810, "synset": "shrew_mole.n.01", "name": "shrew_mole"}, - {"id": 2811, "synset": "asiatic_shrew_mole.n.01", "name": "Asiatic_shrew_mole"}, - {"id": 2812, "synset": "american_shrew_mole.n.01", "name": "American_shrew_mole"}, - {"id": 2813, "synset": "shrew.n.02", "name": "shrew"}, - {"id": 2814, "synset": "common_shrew.n.01", "name": "common_shrew"}, - {"id": 2815, "synset": "masked_shrew.n.01", "name": "masked_shrew"}, - {"id": 2816, "synset": "short-tailed_shrew.n.01", "name": "short-tailed_shrew"}, - {"id": 2817, "synset": "water_shrew.n.01", "name": "water_shrew"}, - {"id": 2818, "synset": "american_water_shrew.n.01", "name": "American_water_shrew"}, - {"id": 2819, "synset": "european_water_shrew.n.01", "name": "European_water_shrew"}, - {"id": 2820, "synset": "mediterranean_water_shrew.n.01", "name": "Mediterranean_water_shrew"}, - {"id": 2821, "synset": "least_shrew.n.01", "name": "least_shrew"}, - {"id": 2822, "synset": "hedgehog.n.02", "name": "hedgehog"}, - {"id": 2823, "synset": "tenrec.n.01", "name": "tenrec"}, - {"id": 2824, "synset": "tailless_tenrec.n.01", "name": "tailless_tenrec"}, - {"id": 2825, "synset": "otter_shrew.n.01", "name": "otter_shrew"}, - {"id": 2826, "synset": "eiderdown.n.02", "name": "eiderdown"}, - {"id": 2827, "synset": "aftershaft.n.01", "name": "aftershaft"}, - {"id": 2828, "synset": "sickle_feather.n.01", "name": "sickle_feather"}, - {"id": 2829, "synset": "contour_feather.n.01", "name": "contour_feather"}, - {"id": 2830, "synset": "bastard_wing.n.01", "name": "bastard_wing"}, - {"id": 2831, "synset": "saddle_hackle.n.01", "name": "saddle_hackle"}, - {"id": 2832, "synset": "encolure.n.01", "name": "encolure"}, - {"id": 2833, "synset": "hair.n.06", "name": "hair"}, - {"id": 2834, "synset": "squama.n.01", "name": "squama"}, - {"id": 2835, "synset": "scute.n.01", "name": "scute"}, - {"id": 2836, "synset": "sclerite.n.01", "name": "sclerite"}, - {"id": 2837, "synset": "plastron.n.05", "name": "plastron"}, - {"id": 2838, "synset": "scallop_shell.n.01", "name": "scallop_shell"}, - {"id": 2839, "synset": "oyster_shell.n.01", "name": "oyster_shell"}, - {"id": 2840, "synset": "theca.n.02", "name": "theca"}, - {"id": 2841, "synset": "invertebrate.n.01", "name": "invertebrate"}, - {"id": 2842, "synset": "sponge.n.04", "name": "sponge"}, - {"id": 2843, "synset": "choanocyte.n.01", "name": "choanocyte"}, - {"id": 2844, "synset": "glass_sponge.n.01", "name": "glass_sponge"}, - {"id": 2845, "synset": "venus's_flower_basket.n.01", "name": "Venus's_flower_basket"}, - {"id": 2846, "synset": "metazoan.n.01", "name": "metazoan"}, - {"id": 2847, "synset": "coelenterate.n.01", "name": "coelenterate"}, - {"id": 2848, "synset": "planula.n.01", "name": "planula"}, - {"id": 2849, "synset": "polyp.n.02", "name": "polyp"}, - {"id": 2850, "synset": "medusa.n.02", "name": "medusa"}, - {"id": 2851, "synset": "jellyfish.n.02", "name": "jellyfish"}, - {"id": 2852, "synset": "scyphozoan.n.01", "name": "scyphozoan"}, - {"id": 2853, "synset": "chrysaora_quinquecirrha.n.01", "name": "Chrysaora_quinquecirrha"}, - {"id": 2854, "synset": "hydrozoan.n.01", "name": "hydrozoan"}, - {"id": 2855, "synset": "hydra.n.04", "name": "hydra"}, - {"id": 2856, "synset": "siphonophore.n.01", "name": "siphonophore"}, - {"id": 2857, "synset": "nanomia.n.01", "name": "nanomia"}, - {"id": 2858, "synset": "portuguese_man-of-war.n.01", "name": "Portuguese_man-of-war"}, - {"id": 2859, "synset": "praya.n.01", "name": "praya"}, - {"id": 2860, "synset": "apolemia.n.01", "name": "apolemia"}, - {"id": 2861, "synset": "anthozoan.n.01", "name": "anthozoan"}, - {"id": 2862, "synset": "sea_anemone.n.01", "name": "sea_anemone"}, - {"id": 2863, "synset": "actinia.n.02", "name": "actinia"}, - {"id": 2864, "synset": "sea_pen.n.01", "name": "sea_pen"}, - {"id": 2865, "synset": "coral.n.04", "name": "coral"}, - {"id": 2866, "synset": "gorgonian.n.01", "name": "gorgonian"}, - {"id": 2867, "synset": "sea_feather.n.01", "name": "sea_feather"}, - {"id": 2868, "synset": "sea_fan.n.01", "name": "sea_fan"}, - {"id": 2869, "synset": "red_coral.n.02", "name": "red_coral"}, - {"id": 2870, "synset": "stony_coral.n.01", "name": "stony_coral"}, - {"id": 2871, "synset": "brain_coral.n.01", "name": "brain_coral"}, - {"id": 2872, "synset": "staghorn_coral.n.01", "name": "staghorn_coral"}, - {"id": 2873, "synset": "mushroom_coral.n.01", "name": "mushroom_coral"}, - {"id": 2874, "synset": "ctenophore.n.01", "name": "ctenophore"}, - {"id": 2875, "synset": "beroe.n.01", "name": "beroe"}, - {"id": 2876, "synset": "platyctenean.n.01", "name": "platyctenean"}, - {"id": 2877, "synset": "sea_gooseberry.n.01", "name": "sea_gooseberry"}, - {"id": 2878, "synset": "venus's_girdle.n.01", "name": "Venus's_girdle"}, - {"id": 2879, "synset": "worm.n.01", "name": "worm"}, - {"id": 2880, "synset": "helminth.n.01", "name": "helminth"}, - {"id": 2881, "synset": "woodworm.n.01", "name": "woodworm"}, - {"id": 2882, "synset": "woodborer.n.01", "name": "woodborer"}, - {"id": 2883, "synset": "acanthocephalan.n.01", "name": "acanthocephalan"}, - {"id": 2884, "synset": "arrowworm.n.01", "name": "arrowworm"}, - {"id": 2885, "synset": "bladder_worm.n.01", "name": "bladder_worm"}, - {"id": 2886, "synset": "flatworm.n.01", "name": "flatworm"}, - {"id": 2887, "synset": "planarian.n.01", "name": "planarian"}, - {"id": 2888, "synset": "fluke.n.05", "name": "fluke"}, - {"id": 2889, "synset": "cercaria.n.01", "name": "cercaria"}, - {"id": 2890, "synset": "liver_fluke.n.01", "name": "liver_fluke"}, - {"id": 2891, "synset": "fasciolopsis_buski.n.01", "name": "Fasciolopsis_buski"}, - {"id": 2892, "synset": "schistosome.n.01", "name": "schistosome"}, - {"id": 2893, "synset": "tapeworm.n.01", "name": "tapeworm"}, - {"id": 2894, "synset": "echinococcus.n.01", "name": "echinococcus"}, - {"id": 2895, "synset": "taenia.n.02", "name": "taenia"}, - {"id": 2896, "synset": "ribbon_worm.n.01", "name": "ribbon_worm"}, - {"id": 2897, "synset": "beard_worm.n.01", "name": "beard_worm"}, - {"id": 2898, "synset": "rotifer.n.01", "name": "rotifer"}, - {"id": 2899, "synset": "nematode.n.01", "name": "nematode"}, - {"id": 2900, "synset": "common_roundworm.n.01", "name": "common_roundworm"}, - {"id": 2901, "synset": "chicken_roundworm.n.01", "name": "chicken_roundworm"}, - {"id": 2902, "synset": "pinworm.n.01", "name": "pinworm"}, - {"id": 2903, "synset": "eelworm.n.01", "name": "eelworm"}, - {"id": 2904, "synset": "vinegar_eel.n.01", "name": "vinegar_eel"}, - {"id": 2905, "synset": "trichina.n.01", "name": "trichina"}, - {"id": 2906, "synset": "hookworm.n.01", "name": "hookworm"}, - {"id": 2907, "synset": "filaria.n.02", "name": "filaria"}, - {"id": 2908, "synset": "guinea_worm.n.02", "name": "Guinea_worm"}, - {"id": 2909, "synset": "annelid.n.01", "name": "annelid"}, - {"id": 2910, "synset": "archiannelid.n.01", "name": "archiannelid"}, - {"id": 2911, "synset": "oligochaete.n.01", "name": "oligochaete"}, - {"id": 2912, "synset": "earthworm.n.01", "name": "earthworm"}, - {"id": 2913, "synset": "polychaete.n.01", "name": "polychaete"}, - {"id": 2914, "synset": "lugworm.n.01", "name": "lugworm"}, - {"id": 2915, "synset": "sea_mouse.n.01", "name": "sea_mouse"}, - {"id": 2916, "synset": "bloodworm.n.01", "name": "bloodworm"}, - {"id": 2917, "synset": "leech.n.01", "name": "leech"}, - {"id": 2918, "synset": "medicinal_leech.n.01", "name": "medicinal_leech"}, - {"id": 2919, "synset": "horseleech.n.01", "name": "horseleech"}, - {"id": 2920, "synset": "mollusk.n.01", "name": "mollusk"}, - {"id": 2921, "synset": "scaphopod.n.01", "name": "scaphopod"}, - {"id": 2922, "synset": "tooth_shell.n.01", "name": "tooth_shell"}, - {"id": 2923, "synset": "gastropod.n.01", "name": "gastropod"}, - {"id": 2924, "synset": "abalone.n.01", "name": "abalone"}, - {"id": 2925, "synset": "ormer.n.01", "name": "ormer"}, - {"id": 2926, "synset": "scorpion_shell.n.01", "name": "scorpion_shell"}, - {"id": 2927, "synset": "conch.n.01", "name": "conch"}, - {"id": 2928, "synset": "giant_conch.n.01", "name": "giant_conch"}, - {"id": 2929, "synset": "snail.n.01", "name": "snail"}, - {"id": 2930, "synset": "edible_snail.n.01", "name": "edible_snail"}, - {"id": 2931, "synset": "garden_snail.n.01", "name": "garden_snail"}, - {"id": 2932, "synset": "brown_snail.n.01", "name": "brown_snail"}, - {"id": 2933, "synset": "helix_hortensis.n.01", "name": "Helix_hortensis"}, - {"id": 2934, "synset": "slug.n.07", "name": "slug"}, - {"id": 2935, "synset": "seasnail.n.02", "name": "seasnail"}, - {"id": 2936, "synset": "neritid.n.01", "name": "neritid"}, - {"id": 2937, "synset": "nerita.n.01", "name": "nerita"}, - {"id": 2938, "synset": "bleeding_tooth.n.01", "name": "bleeding_tooth"}, - {"id": 2939, "synset": "neritina.n.01", "name": "neritina"}, - {"id": 2940, "synset": "whelk.n.02", "name": "whelk"}, - {"id": 2941, "synset": "moon_shell.n.01", "name": "moon_shell"}, - {"id": 2942, "synset": "periwinkle.n.04", "name": "periwinkle"}, - {"id": 2943, "synset": "limpet.n.02", "name": "limpet"}, - {"id": 2944, "synset": "common_limpet.n.01", "name": "common_limpet"}, - {"id": 2945, "synset": "keyhole_limpet.n.01", "name": "keyhole_limpet"}, - {"id": 2946, "synset": "river_limpet.n.01", "name": "river_limpet"}, - {"id": 2947, "synset": "sea_slug.n.01", "name": "sea_slug"}, - {"id": 2948, "synset": "sea_hare.n.01", "name": "sea_hare"}, - {"id": 2949, "synset": "hermissenda_crassicornis.n.01", "name": "Hermissenda_crassicornis"}, - {"id": 2950, "synset": "bubble_shell.n.01", "name": "bubble_shell"}, - {"id": 2951, "synset": "physa.n.01", "name": "physa"}, - {"id": 2952, "synset": "cowrie.n.01", "name": "cowrie"}, - {"id": 2953, "synset": "money_cowrie.n.01", "name": "money_cowrie"}, - {"id": 2954, "synset": "tiger_cowrie.n.01", "name": "tiger_cowrie"}, - {"id": 2955, "synset": "solenogaster.n.01", "name": "solenogaster"}, - {"id": 2956, "synset": "chiton.n.02", "name": "chiton"}, - {"id": 2957, "synset": "bivalve.n.01", "name": "bivalve"}, - {"id": 2958, "synset": "spat.n.03", "name": "spat"}, - {"id": 2959, "synset": "clam.n.01", "name": "clam"}, - {"id": 2960, "synset": "soft-shell_clam.n.02", "name": "soft-shell_clam"}, - {"id": 2961, "synset": "quahog.n.02", "name": "quahog"}, - {"id": 2962, "synset": "littleneck.n.02", "name": "littleneck"}, - {"id": 2963, "synset": "cherrystone.n.02", "name": "cherrystone"}, - {"id": 2964, "synset": "geoduck.n.01", "name": "geoduck"}, - {"id": 2965, "synset": "razor_clam.n.01", "name": "razor_clam"}, - {"id": 2966, "synset": "giant_clam.n.01", "name": "giant_clam"}, - {"id": 2967, "synset": "cockle.n.02", "name": "cockle"}, - {"id": 2968, "synset": "edible_cockle.n.01", "name": "edible_cockle"}, - {"id": 2969, "synset": "oyster.n.01", "name": "oyster"}, - {"id": 2970, "synset": "japanese_oyster.n.01", "name": "Japanese_oyster"}, - {"id": 2971, "synset": "virginia_oyster.n.01", "name": "Virginia_oyster"}, - {"id": 2972, "synset": "pearl_oyster.n.01", "name": "pearl_oyster"}, - {"id": 2973, "synset": "saddle_oyster.n.01", "name": "saddle_oyster"}, - {"id": 2974, "synset": "window_oyster.n.01", "name": "window_oyster"}, - {"id": 2975, "synset": "ark_shell.n.01", "name": "ark_shell"}, - {"id": 2976, "synset": "blood_clam.n.01", "name": "blood_clam"}, - {"id": 2977, "synset": "mussel.n.02", "name": "mussel"}, - {"id": 2978, "synset": "marine_mussel.n.01", "name": "marine_mussel"}, - {"id": 2979, "synset": "edible_mussel.n.01", "name": "edible_mussel"}, - {"id": 2980, "synset": "freshwater_mussel.n.01", "name": "freshwater_mussel"}, - {"id": 2981, "synset": "pearly-shelled_mussel.n.01", "name": "pearly-shelled_mussel"}, - {"id": 2982, "synset": "thin-shelled_mussel.n.01", "name": "thin-shelled_mussel"}, - {"id": 2983, "synset": "zebra_mussel.n.01", "name": "zebra_mussel"}, - {"id": 2984, "synset": "scallop.n.04", "name": "scallop"}, - {"id": 2985, "synset": "bay_scallop.n.02", "name": "bay_scallop"}, - {"id": 2986, "synset": "sea_scallop.n.02", "name": "sea_scallop"}, - {"id": 2987, "synset": "shipworm.n.01", "name": "shipworm"}, - {"id": 2988, "synset": "teredo.n.01", "name": "teredo"}, - {"id": 2989, "synset": "piddock.n.01", "name": "piddock"}, - {"id": 2990, "synset": "cephalopod.n.01", "name": "cephalopod"}, - {"id": 2991, "synset": "chambered_nautilus.n.01", "name": "chambered_nautilus"}, - {"id": 2992, "synset": "octopod.n.01", "name": "octopod"}, - {"id": 2993, "synset": "paper_nautilus.n.01", "name": "paper_nautilus"}, - {"id": 2994, "synset": "decapod.n.02", "name": "decapod"}, - {"id": 2995, "synset": "squid.n.02", "name": "squid"}, - {"id": 2996, "synset": "loligo.n.01", "name": "loligo"}, - {"id": 2997, "synset": "ommastrephes.n.01", "name": "ommastrephes"}, - {"id": 2998, "synset": "architeuthis.n.01", "name": "architeuthis"}, - {"id": 2999, "synset": "cuttlefish.n.01", "name": "cuttlefish"}, - {"id": 3000, "synset": "spirula.n.01", "name": "spirula"}, - {"id": 3001, "synset": "crustacean.n.01", "name": "crustacean"}, - {"id": 3002, "synset": "malacostracan_crustacean.n.01", "name": "malacostracan_crustacean"}, - {"id": 3003, "synset": "decapod_crustacean.n.01", "name": "decapod_crustacean"}, - {"id": 3004, "synset": "brachyuran.n.01", "name": "brachyuran"}, - {"id": 3005, "synset": "stone_crab.n.02", "name": "stone_crab"}, - {"id": 3006, "synset": "hard-shell_crab.n.01", "name": "hard-shell_crab"}, - {"id": 3007, "synset": "soft-shell_crab.n.02", "name": "soft-shell_crab"}, - {"id": 3008, "synset": "dungeness_crab.n.02", "name": "Dungeness_crab"}, - {"id": 3009, "synset": "rock_crab.n.01", "name": "rock_crab"}, - {"id": 3010, "synset": "jonah_crab.n.01", "name": "Jonah_crab"}, - {"id": 3011, "synset": "swimming_crab.n.01", "name": "swimming_crab"}, - {"id": 3012, "synset": "english_lady_crab.n.01", "name": "English_lady_crab"}, - {"id": 3013, "synset": "american_lady_crab.n.01", "name": "American_lady_crab"}, - {"id": 3014, "synset": "blue_crab.n.02", "name": "blue_crab"}, - {"id": 3015, "synset": "fiddler_crab.n.01", "name": "fiddler_crab"}, - {"id": 3016, "synset": "pea_crab.n.01", "name": "pea_crab"}, - {"id": 3017, "synset": "king_crab.n.03", "name": "king_crab"}, - {"id": 3018, "synset": "spider_crab.n.01", "name": "spider_crab"}, - {"id": 3019, "synset": "european_spider_crab.n.01", "name": "European_spider_crab"}, - {"id": 3020, "synset": "giant_crab.n.01", "name": "giant_crab"}, - {"id": 3021, "synset": "lobster.n.02", "name": "lobster"}, - {"id": 3022, "synset": "true_lobster.n.01", "name": "true_lobster"}, - {"id": 3023, "synset": "american_lobster.n.02", "name": "American_lobster"}, - {"id": 3024, "synset": "european_lobster.n.02", "name": "European_lobster"}, - {"id": 3025, "synset": "cape_lobster.n.01", "name": "Cape_lobster"}, - {"id": 3026, "synset": "norway_lobster.n.01", "name": "Norway_lobster"}, - {"id": 3027, "synset": "crayfish.n.03", "name": "crayfish"}, - {"id": 3028, "synset": "old_world_crayfish.n.01", "name": "Old_World_crayfish"}, - {"id": 3029, "synset": "american_crayfish.n.01", "name": "American_crayfish"}, - {"id": 3030, "synset": "hermit_crab.n.01", "name": "hermit_crab"}, - {"id": 3031, "synset": "shrimp.n.03", "name": "shrimp"}, - {"id": 3032, "synset": "snapping_shrimp.n.01", "name": "snapping_shrimp"}, - {"id": 3033, "synset": "prawn.n.02", "name": "prawn"}, - {"id": 3034, "synset": "long-clawed_prawn.n.01", "name": "long-clawed_prawn"}, - {"id": 3035, "synset": "tropical_prawn.n.01", "name": "tropical_prawn"}, - {"id": 3036, "synset": "krill.n.01", "name": "krill"}, - {"id": 3037, "synset": "euphausia_pacifica.n.01", "name": "Euphausia_pacifica"}, - {"id": 3038, "synset": "opossum_shrimp.n.01", "name": "opossum_shrimp"}, - {"id": 3039, "synset": "stomatopod.n.01", "name": "stomatopod"}, - {"id": 3040, "synset": "mantis_shrimp.n.01", "name": "mantis_shrimp"}, - {"id": 3041, "synset": "squilla.n.01", "name": "squilla"}, - {"id": 3042, "synset": "isopod.n.01", "name": "isopod"}, - {"id": 3043, "synset": "woodlouse.n.01", "name": "woodlouse"}, - {"id": 3044, "synset": "pill_bug.n.01", "name": "pill_bug"}, - {"id": 3045, "synset": "sow_bug.n.01", "name": "sow_bug"}, - {"id": 3046, "synset": "sea_louse.n.01", "name": "sea_louse"}, - {"id": 3047, "synset": "amphipod.n.01", "name": "amphipod"}, - {"id": 3048, "synset": "skeleton_shrimp.n.01", "name": "skeleton_shrimp"}, - {"id": 3049, "synset": "whale_louse.n.01", "name": "whale_louse"}, - {"id": 3050, "synset": "daphnia.n.01", "name": "daphnia"}, - {"id": 3051, "synset": "fairy_shrimp.n.01", "name": "fairy_shrimp"}, - {"id": 3052, "synset": "brine_shrimp.n.01", "name": "brine_shrimp"}, - {"id": 3053, "synset": "tadpole_shrimp.n.01", "name": "tadpole_shrimp"}, - {"id": 3054, "synset": "copepod.n.01", "name": "copepod"}, - {"id": 3055, "synset": "cyclops.n.02", "name": "cyclops"}, - {"id": 3056, "synset": "seed_shrimp.n.01", "name": "seed_shrimp"}, - {"id": 3057, "synset": "barnacle.n.01", "name": "barnacle"}, - {"id": 3058, "synset": "acorn_barnacle.n.01", "name": "acorn_barnacle"}, - {"id": 3059, "synset": "goose_barnacle.n.01", "name": "goose_barnacle"}, - {"id": 3060, "synset": "onychophoran.n.01", "name": "onychophoran"}, - {"id": 3061, "synset": "wading_bird.n.01", "name": "wading_bird"}, - {"id": 3062, "synset": "stork.n.01", "name": "stork"}, - {"id": 3063, "synset": "white_stork.n.01", "name": "white_stork"}, - {"id": 3064, "synset": "black_stork.n.01", "name": "black_stork"}, - {"id": 3065, "synset": "adjutant_bird.n.01", "name": "adjutant_bird"}, - {"id": 3066, "synset": "marabou.n.01", "name": "marabou"}, - {"id": 3067, "synset": "openbill.n.01", "name": "openbill"}, - {"id": 3068, "synset": "jabiru.n.03", "name": "jabiru"}, - {"id": 3069, "synset": "saddlebill.n.01", "name": "saddlebill"}, - {"id": 3070, "synset": "policeman_bird.n.01", "name": "policeman_bird"}, - {"id": 3071, "synset": "wood_ibis.n.02", "name": "wood_ibis"}, - {"id": 3072, "synset": "shoebill.n.01", "name": "shoebill"}, - {"id": 3073, "synset": "ibis.n.01", "name": "ibis"}, - {"id": 3074, "synset": "wood_ibis.n.01", "name": "wood_ibis"}, - {"id": 3075, "synset": "sacred_ibis.n.01", "name": "sacred_ibis"}, - {"id": 3076, "synset": "spoonbill.n.01", "name": "spoonbill"}, - {"id": 3077, "synset": "common_spoonbill.n.01", "name": "common_spoonbill"}, - {"id": 3078, "synset": "roseate_spoonbill.n.01", "name": "roseate_spoonbill"}, - {"id": 3079, "synset": "great_blue_heron.n.01", "name": "great_blue_heron"}, - {"id": 3080, "synset": "great_white_heron.n.03", "name": "great_white_heron"}, - {"id": 3081, "synset": "egret.n.01", "name": "egret"}, - {"id": 3082, "synset": "little_blue_heron.n.01", "name": "little_blue_heron"}, - {"id": 3083, "synset": "snowy_egret.n.01", "name": "snowy_egret"}, - {"id": 3084, "synset": "little_egret.n.01", "name": "little_egret"}, - {"id": 3085, "synset": "great_white_heron.n.02", "name": "great_white_heron"}, - {"id": 3086, "synset": "american_egret.n.01", "name": "American_egret"}, - {"id": 3087, "synset": "cattle_egret.n.01", "name": "cattle_egret"}, - {"id": 3088, "synset": "night_heron.n.01", "name": "night_heron"}, - {"id": 3089, "synset": "black-crowned_night_heron.n.01", "name": "black-crowned_night_heron"}, - {"id": 3090, "synset": "yellow-crowned_night_heron.n.01", "name": "yellow-crowned_night_heron"}, - {"id": 3091, "synset": "boatbill.n.01", "name": "boatbill"}, - {"id": 3092, "synset": "bittern.n.01", "name": "bittern"}, - {"id": 3093, "synset": "american_bittern.n.01", "name": "American_bittern"}, - {"id": 3094, "synset": "european_bittern.n.01", "name": "European_bittern"}, - {"id": 3095, "synset": "least_bittern.n.01", "name": "least_bittern"}, - {"id": 3096, "synset": "crane.n.05", "name": "crane"}, - {"id": 3097, "synset": "whooping_crane.n.01", "name": "whooping_crane"}, - {"id": 3098, "synset": "courlan.n.01", "name": "courlan"}, - {"id": 3099, "synset": "limpkin.n.01", "name": "limpkin"}, - {"id": 3100, "synset": "crested_cariama.n.01", "name": "crested_cariama"}, - {"id": 3101, "synset": "chunga.n.01", "name": "chunga"}, - {"id": 3102, "synset": "rail.n.05", "name": "rail"}, - {"id": 3103, "synset": "weka.n.01", "name": "weka"}, - {"id": 3104, "synset": "crake.n.01", "name": "crake"}, - {"id": 3105, "synset": "corncrake.n.01", "name": "corncrake"}, - {"id": 3106, "synset": "spotted_crake.n.01", "name": "spotted_crake"}, - {"id": 3107, "synset": "gallinule.n.01", "name": "gallinule"}, - {"id": 3108, "synset": "florida_gallinule.n.01", "name": "Florida_gallinule"}, - {"id": 3109, "synset": "moorhen.n.01", "name": "moorhen"}, - {"id": 3110, "synset": "purple_gallinule.n.01", "name": "purple_gallinule"}, - {"id": 3111, "synset": "european_gallinule.n.01", "name": "European_gallinule"}, - {"id": 3112, "synset": "american_gallinule.n.01", "name": "American_gallinule"}, - {"id": 3113, "synset": "notornis.n.01", "name": "notornis"}, - {"id": 3114, "synset": "coot.n.01", "name": "coot"}, - {"id": 3115, "synset": "american_coot.n.01", "name": "American_coot"}, - {"id": 3116, "synset": "old_world_coot.n.01", "name": "Old_World_coot"}, - {"id": 3117, "synset": "bustard.n.01", "name": "bustard"}, - {"id": 3118, "synset": "great_bustard.n.01", "name": "great_bustard"}, - {"id": 3119, "synset": "plain_turkey.n.01", "name": "plain_turkey"}, - {"id": 3120, "synset": "button_quail.n.01", "name": "button_quail"}, - {"id": 3121, "synset": "striped_button_quail.n.01", "name": "striped_button_quail"}, - {"id": 3122, "synset": "plain_wanderer.n.01", "name": "plain_wanderer"}, - {"id": 3123, "synset": "trumpeter.n.03", "name": "trumpeter"}, - {"id": 3124, "synset": "brazilian_trumpeter.n.01", "name": "Brazilian_trumpeter"}, - {"id": 3125, "synset": "shorebird.n.01", "name": "shorebird"}, - {"id": 3126, "synset": "plover.n.01", "name": "plover"}, - {"id": 3127, "synset": "piping_plover.n.01", "name": "piping_plover"}, - {"id": 3128, "synset": "killdeer.n.01", "name": "killdeer"}, - {"id": 3129, "synset": "dotterel.n.01", "name": "dotterel"}, - {"id": 3130, "synset": "golden_plover.n.01", "name": "golden_plover"}, - {"id": 3131, "synset": "lapwing.n.01", "name": "lapwing"}, - {"id": 3132, "synset": "turnstone.n.01", "name": "turnstone"}, - {"id": 3133, "synset": "ruddy_turnstone.n.01", "name": "ruddy_turnstone"}, - {"id": 3134, "synset": "black_turnstone.n.01", "name": "black_turnstone"}, - {"id": 3135, "synset": "sandpiper.n.01", "name": "sandpiper"}, - {"id": 3136, "synset": "surfbird.n.01", "name": "surfbird"}, - {"id": 3137, "synset": "european_sandpiper.n.01", "name": "European_sandpiper"}, - {"id": 3138, "synset": "spotted_sandpiper.n.01", "name": "spotted_sandpiper"}, - {"id": 3139, "synset": "least_sandpiper.n.01", "name": "least_sandpiper"}, - {"id": 3140, "synset": "red-backed_sandpiper.n.01", "name": "red-backed_sandpiper"}, - {"id": 3141, "synset": "greenshank.n.01", "name": "greenshank"}, - {"id": 3142, "synset": "redshank.n.01", "name": "redshank"}, - {"id": 3143, "synset": "yellowlegs.n.01", "name": "yellowlegs"}, - {"id": 3144, "synset": "greater_yellowlegs.n.01", "name": "greater_yellowlegs"}, - {"id": 3145, "synset": "lesser_yellowlegs.n.01", "name": "lesser_yellowlegs"}, - {"id": 3146, "synset": "pectoral_sandpiper.n.01", "name": "pectoral_sandpiper"}, - {"id": 3147, "synset": "knot.n.07", "name": "knot"}, - {"id": 3148, "synset": "curlew_sandpiper.n.01", "name": "curlew_sandpiper"}, - {"id": 3149, "synset": "sanderling.n.01", "name": "sanderling"}, - {"id": 3150, "synset": "upland_sandpiper.n.01", "name": "upland_sandpiper"}, - {"id": 3151, "synset": "ruff.n.03", "name": "ruff"}, - {"id": 3152, "synset": "reeve.n.01", "name": "reeve"}, - {"id": 3153, "synset": "tattler.n.02", "name": "tattler"}, - {"id": 3154, "synset": "polynesian_tattler.n.01", "name": "Polynesian_tattler"}, - {"id": 3155, "synset": "willet.n.01", "name": "willet"}, - {"id": 3156, "synset": "woodcock.n.01", "name": "woodcock"}, - {"id": 3157, "synset": "eurasian_woodcock.n.01", "name": "Eurasian_woodcock"}, - {"id": 3158, "synset": "american_woodcock.n.01", "name": "American_woodcock"}, - {"id": 3159, "synset": "snipe.n.01", "name": "snipe"}, - {"id": 3160, "synset": "whole_snipe.n.01", "name": "whole_snipe"}, - {"id": 3161, "synset": "wilson's_snipe.n.01", "name": "Wilson's_snipe"}, - {"id": 3162, "synset": "great_snipe.n.01", "name": "great_snipe"}, - {"id": 3163, "synset": "jacksnipe.n.01", "name": "jacksnipe"}, - {"id": 3164, "synset": "dowitcher.n.01", "name": "dowitcher"}, - {"id": 3165, "synset": "greyback.n.02", "name": "greyback"}, - {"id": 3166, "synset": "red-breasted_snipe.n.01", "name": "red-breasted_snipe"}, - {"id": 3167, "synset": "curlew.n.01", "name": "curlew"}, - {"id": 3168, "synset": "european_curlew.n.01", "name": "European_curlew"}, - {"id": 3169, "synset": "eskimo_curlew.n.01", "name": "Eskimo_curlew"}, - {"id": 3170, "synset": "godwit.n.01", "name": "godwit"}, - {"id": 3171, "synset": "hudsonian_godwit.n.01", "name": "Hudsonian_godwit"}, - {"id": 3172, "synset": "stilt.n.04", "name": "stilt"}, - {"id": 3173, "synset": "black-necked_stilt.n.01", "name": "black-necked_stilt"}, - {"id": 3174, "synset": "black-winged_stilt.n.01", "name": "black-winged_stilt"}, - {"id": 3175, "synset": "white-headed_stilt.n.01", "name": "white-headed_stilt"}, - {"id": 3176, "synset": "kaki.n.02", "name": "kaki"}, - {"id": 3177, "synset": "stilt.n.03", "name": "stilt"}, - {"id": 3178, "synset": "banded_stilt.n.01", "name": "banded_stilt"}, - {"id": 3179, "synset": "avocet.n.01", "name": "avocet"}, - {"id": 3180, "synset": "oystercatcher.n.01", "name": "oystercatcher"}, - {"id": 3181, "synset": "phalarope.n.01", "name": "phalarope"}, - {"id": 3182, "synset": "red_phalarope.n.01", "name": "red_phalarope"}, - {"id": 3183, "synset": "northern_phalarope.n.01", "name": "northern_phalarope"}, - {"id": 3184, "synset": "wilson's_phalarope.n.01", "name": "Wilson's_phalarope"}, - {"id": 3185, "synset": "pratincole.n.01", "name": "pratincole"}, - {"id": 3186, "synset": "courser.n.04", "name": "courser"}, - {"id": 3187, "synset": "cream-colored_courser.n.01", "name": "cream-colored_courser"}, - {"id": 3188, "synset": "crocodile_bird.n.01", "name": "crocodile_bird"}, - {"id": 3189, "synset": "stone_curlew.n.01", "name": "stone_curlew"}, - {"id": 3190, "synset": "coastal_diving_bird.n.01", "name": "coastal_diving_bird"}, - {"id": 3191, "synset": "larid.n.01", "name": "larid"}, - {"id": 3192, "synset": "mew.n.02", "name": "mew"}, - {"id": 3193, "synset": "black-backed_gull.n.01", "name": "black-backed_gull"}, - {"id": 3194, "synset": "herring_gull.n.01", "name": "herring_gull"}, - {"id": 3195, "synset": "laughing_gull.n.01", "name": "laughing_gull"}, - {"id": 3196, "synset": "ivory_gull.n.01", "name": "ivory_gull"}, - {"id": 3197, "synset": "kittiwake.n.01", "name": "kittiwake"}, - {"id": 3198, "synset": "tern.n.01", "name": "tern"}, - {"id": 3199, "synset": "sea_swallow.n.01", "name": "sea_swallow"}, - {"id": 3200, "synset": "skimmer.n.04", "name": "skimmer"}, - {"id": 3201, "synset": "jaeger.n.01", "name": "jaeger"}, - {"id": 3202, "synset": "parasitic_jaeger.n.01", "name": "parasitic_jaeger"}, - {"id": 3203, "synset": "skua.n.01", "name": "skua"}, - {"id": 3204, "synset": "great_skua.n.01", "name": "great_skua"}, - {"id": 3205, "synset": "auk.n.01", "name": "auk"}, - {"id": 3206, "synset": "auklet.n.01", "name": "auklet"}, - {"id": 3207, "synset": "razorbill.n.01", "name": "razorbill"}, - {"id": 3208, "synset": "little_auk.n.01", "name": "little_auk"}, - {"id": 3209, "synset": "guillemot.n.01", "name": "guillemot"}, - {"id": 3210, "synset": "black_guillemot.n.01", "name": "black_guillemot"}, - {"id": 3211, "synset": "pigeon_guillemot.n.01", "name": "pigeon_guillemot"}, - {"id": 3212, "synset": "murre.n.01", "name": "murre"}, - {"id": 3213, "synset": "common_murre.n.01", "name": "common_murre"}, - {"id": 3214, "synset": "thick-billed_murre.n.01", "name": "thick-billed_murre"}, - {"id": 3215, "synset": "atlantic_puffin.n.01", "name": "Atlantic_puffin"}, - {"id": 3216, "synset": "horned_puffin.n.01", "name": "horned_puffin"}, - {"id": 3217, "synset": "tufted_puffin.n.01", "name": "tufted_puffin"}, - {"id": 3218, "synset": "gaviiform_seabird.n.01", "name": "gaviiform_seabird"}, - {"id": 3219, "synset": "loon.n.02", "name": "loon"}, - {"id": 3220, "synset": "podicipitiform_seabird.n.01", "name": "podicipitiform_seabird"}, - {"id": 3221, "synset": "grebe.n.01", "name": "grebe"}, - {"id": 3222, "synset": "great_crested_grebe.n.01", "name": "great_crested_grebe"}, - {"id": 3223, "synset": "red-necked_grebe.n.01", "name": "red-necked_grebe"}, - {"id": 3224, "synset": "black-necked_grebe.n.01", "name": "black-necked_grebe"}, - {"id": 3225, "synset": "dabchick.n.01", "name": "dabchick"}, - {"id": 3226, "synset": "pied-billed_grebe.n.01", "name": "pied-billed_grebe"}, - {"id": 3227, "synset": "pelecaniform_seabird.n.01", "name": "pelecaniform_seabird"}, - {"id": 3228, "synset": "white_pelican.n.01", "name": "white_pelican"}, - {"id": 3229, "synset": "old_world_white_pelican.n.01", "name": "Old_world_white_pelican"}, - {"id": 3230, "synset": "frigate_bird.n.01", "name": "frigate_bird"}, - {"id": 3231, "synset": "gannet.n.01", "name": "gannet"}, - {"id": 3232, "synset": "solan.n.01", "name": "solan"}, - {"id": 3233, "synset": "booby.n.02", "name": "booby"}, - {"id": 3234, "synset": "cormorant.n.01", "name": "cormorant"}, - {"id": 3235, "synset": "snakebird.n.01", "name": "snakebird"}, - {"id": 3236, "synset": "water_turkey.n.01", "name": "water_turkey"}, - {"id": 3237, "synset": "tropic_bird.n.01", "name": "tropic_bird"}, - {"id": 3238, "synset": "sphenisciform_seabird.n.01", "name": "sphenisciform_seabird"}, - {"id": 3239, "synset": "adelie.n.01", "name": "Adelie"}, - {"id": 3240, "synset": "king_penguin.n.01", "name": "king_penguin"}, - {"id": 3241, "synset": "emperor_penguin.n.01", "name": "emperor_penguin"}, - {"id": 3242, "synset": "jackass_penguin.n.01", "name": "jackass_penguin"}, - {"id": 3243, "synset": "rock_hopper.n.01", "name": "rock_hopper"}, - {"id": 3244, "synset": "pelagic_bird.n.01", "name": "pelagic_bird"}, - {"id": 3245, "synset": "procellariiform_seabird.n.01", "name": "procellariiform_seabird"}, - {"id": 3246, "synset": "albatross.n.02", "name": "albatross"}, - {"id": 3247, "synset": "wandering_albatross.n.01", "name": "wandering_albatross"}, - {"id": 3248, "synset": "black-footed_albatross.n.01", "name": "black-footed_albatross"}, - {"id": 3249, "synset": "petrel.n.01", "name": "petrel"}, - {"id": 3250, "synset": "white-chinned_petrel.n.01", "name": "white-chinned_petrel"}, - {"id": 3251, "synset": "giant_petrel.n.01", "name": "giant_petrel"}, - {"id": 3252, "synset": "fulmar.n.01", "name": "fulmar"}, - {"id": 3253, "synset": "shearwater.n.01", "name": "shearwater"}, - {"id": 3254, "synset": "manx_shearwater.n.01", "name": "Manx_shearwater"}, - {"id": 3255, "synset": "storm_petrel.n.01", "name": "storm_petrel"}, - {"id": 3256, "synset": "stormy_petrel.n.01", "name": "stormy_petrel"}, - {"id": 3257, "synset": "mother_carey's_chicken.n.01", "name": "Mother_Carey's_chicken"}, - {"id": 3258, "synset": "diving_petrel.n.01", "name": "diving_petrel"}, - {"id": 3259, "synset": "aquatic_mammal.n.01", "name": "aquatic_mammal"}, - {"id": 3260, "synset": "cetacean.n.01", "name": "cetacean"}, - {"id": 3261, "synset": "whale.n.02", "name": "whale"}, - {"id": 3262, "synset": "baleen_whale.n.01", "name": "baleen_whale"}, - {"id": 3263, "synset": "right_whale.n.01", "name": "right_whale"}, - {"id": 3264, "synset": "bowhead.n.01", "name": "bowhead"}, - {"id": 3265, "synset": "rorqual.n.01", "name": "rorqual"}, - {"id": 3266, "synset": "blue_whale.n.01", "name": "blue_whale"}, - {"id": 3267, "synset": "finback.n.01", "name": "finback"}, - {"id": 3268, "synset": "sei_whale.n.01", "name": "sei_whale"}, - {"id": 3269, "synset": "lesser_rorqual.n.01", "name": "lesser_rorqual"}, - {"id": 3270, "synset": "humpback.n.03", "name": "humpback"}, - {"id": 3271, "synset": "grey_whale.n.01", "name": "grey_whale"}, - {"id": 3272, "synset": "toothed_whale.n.01", "name": "toothed_whale"}, - {"id": 3273, "synset": "sperm_whale.n.01", "name": "sperm_whale"}, - {"id": 3274, "synset": "pygmy_sperm_whale.n.01", "name": "pygmy_sperm_whale"}, - {"id": 3275, "synset": "dwarf_sperm_whale.n.01", "name": "dwarf_sperm_whale"}, - {"id": 3276, "synset": "beaked_whale.n.01", "name": "beaked_whale"}, - {"id": 3277, "synset": "bottle-nosed_whale.n.01", "name": "bottle-nosed_whale"}, - {"id": 3278, "synset": "common_dolphin.n.01", "name": "common_dolphin"}, - {"id": 3279, "synset": "bottlenose_dolphin.n.01", "name": "bottlenose_dolphin"}, - { - "id": 3280, - "synset": "atlantic_bottlenose_dolphin.n.01", - "name": "Atlantic_bottlenose_dolphin", - }, - {"id": 3281, "synset": "pacific_bottlenose_dolphin.n.01", "name": "Pacific_bottlenose_dolphin"}, - {"id": 3282, "synset": "porpoise.n.01", "name": "porpoise"}, - {"id": 3283, "synset": "harbor_porpoise.n.01", "name": "harbor_porpoise"}, - {"id": 3284, "synset": "vaquita.n.01", "name": "vaquita"}, - {"id": 3285, "synset": "grampus.n.02", "name": "grampus"}, - {"id": 3286, "synset": "killer_whale.n.01", "name": "killer_whale"}, - {"id": 3287, "synset": "pilot_whale.n.01", "name": "pilot_whale"}, - {"id": 3288, "synset": "river_dolphin.n.01", "name": "river_dolphin"}, - {"id": 3289, "synset": "narwhal.n.01", "name": "narwhal"}, - {"id": 3290, "synset": "white_whale.n.01", "name": "white_whale"}, - {"id": 3291, "synset": "sea_cow.n.01", "name": "sea_cow"}, - {"id": 3292, "synset": "dugong.n.01", "name": "dugong"}, - {"id": 3293, "synset": "steller's_sea_cow.n.01", "name": "Steller's_sea_cow"}, - {"id": 3294, "synset": "carnivore.n.01", "name": "carnivore"}, - {"id": 3295, "synset": "omnivore.n.02", "name": "omnivore"}, - {"id": 3296, "synset": "pinniped_mammal.n.01", "name": "pinniped_mammal"}, - {"id": 3297, "synset": "seal.n.09", "name": "seal"}, - {"id": 3298, "synset": "crabeater_seal.n.01", "name": "crabeater_seal"}, - {"id": 3299, "synset": "eared_seal.n.01", "name": "eared_seal"}, - {"id": 3300, "synset": "fur_seal.n.02", "name": "fur_seal"}, - {"id": 3301, "synset": "guadalupe_fur_seal.n.01", "name": "guadalupe_fur_seal"}, - {"id": 3302, "synset": "fur_seal.n.01", "name": "fur_seal"}, - {"id": 3303, "synset": "alaska_fur_seal.n.01", "name": "Alaska_fur_seal"}, - {"id": 3304, "synset": "sea_lion.n.01", "name": "sea_lion"}, - {"id": 3305, "synset": "south_american_sea_lion.n.01", "name": "South_American_sea_lion"}, - {"id": 3306, "synset": "california_sea_lion.n.01", "name": "California_sea_lion"}, - {"id": 3307, "synset": "australian_sea_lion.n.01", "name": "Australian_sea_lion"}, - {"id": 3308, "synset": "steller_sea_lion.n.01", "name": "Steller_sea_lion"}, - {"id": 3309, "synset": "earless_seal.n.01", "name": "earless_seal"}, - {"id": 3310, "synset": "harbor_seal.n.01", "name": "harbor_seal"}, - {"id": 3311, "synset": "harp_seal.n.01", "name": "harp_seal"}, - {"id": 3312, "synset": "elephant_seal.n.01", "name": "elephant_seal"}, - {"id": 3313, "synset": "bearded_seal.n.01", "name": "bearded_seal"}, - {"id": 3314, "synset": "hooded_seal.n.01", "name": "hooded_seal"}, - {"id": 3315, "synset": "atlantic_walrus.n.01", "name": "Atlantic_walrus"}, - {"id": 3316, "synset": "pacific_walrus.n.01", "name": "Pacific_walrus"}, - {"id": 3317, "synset": "fissipedia.n.01", "name": "Fissipedia"}, - {"id": 3318, "synset": "fissiped_mammal.n.01", "name": "fissiped_mammal"}, - {"id": 3319, "synset": "aardvark.n.01", "name": "aardvark"}, - {"id": 3320, "synset": "canine.n.02", "name": "canine"}, - {"id": 3321, "synset": "bitch.n.04", "name": "bitch"}, - {"id": 3322, "synset": "brood_bitch.n.01", "name": "brood_bitch"}, - {"id": 3323, "synset": "pooch.n.01", "name": "pooch"}, - {"id": 3324, "synset": "cur.n.01", "name": "cur"}, - {"id": 3325, "synset": "feist.n.01", "name": "feist"}, - {"id": 3326, "synset": "pariah_dog.n.01", "name": "pariah_dog"}, - {"id": 3327, "synset": "lapdog.n.01", "name": "lapdog"}, - {"id": 3328, "synset": "toy_dog.n.01", "name": "toy_dog"}, - {"id": 3329, "synset": "chihuahua.n.03", "name": "Chihuahua"}, - {"id": 3330, "synset": "japanese_spaniel.n.01", "name": "Japanese_spaniel"}, - {"id": 3331, "synset": "maltese_dog.n.01", "name": "Maltese_dog"}, - {"id": 3332, "synset": "pekinese.n.01", "name": "Pekinese"}, - {"id": 3333, "synset": "shih-tzu.n.01", "name": "Shih-Tzu"}, - {"id": 3334, "synset": "toy_spaniel.n.01", "name": "toy_spaniel"}, - {"id": 3335, "synset": "english_toy_spaniel.n.01", "name": "English_toy_spaniel"}, - {"id": 3336, "synset": "blenheim_spaniel.n.01", "name": "Blenheim_spaniel"}, - {"id": 3337, "synset": "king_charles_spaniel.n.01", "name": "King_Charles_spaniel"}, - {"id": 3338, "synset": "papillon.n.01", "name": "papillon"}, - {"id": 3339, "synset": "toy_terrier.n.01", "name": "toy_terrier"}, - {"id": 3340, "synset": "hunting_dog.n.01", "name": "hunting_dog"}, - {"id": 3341, "synset": "courser.n.03", "name": "courser"}, - {"id": 3342, "synset": "rhodesian_ridgeback.n.01", "name": "Rhodesian_ridgeback"}, - {"id": 3343, "synset": "hound.n.01", "name": "hound"}, - {"id": 3344, "synset": "afghan_hound.n.01", "name": "Afghan_hound"}, - {"id": 3345, "synset": "basset.n.01", "name": "basset"}, - {"id": 3346, "synset": "beagle.n.01", "name": "beagle"}, - {"id": 3347, "synset": "bloodhound.n.01", "name": "bloodhound"}, - {"id": 3348, "synset": "bluetick.n.01", "name": "bluetick"}, - {"id": 3349, "synset": "boarhound.n.01", "name": "boarhound"}, - {"id": 3350, "synset": "coonhound.n.01", "name": "coonhound"}, - {"id": 3351, "synset": "coondog.n.01", "name": "coondog"}, - {"id": 3352, "synset": "black-and-tan_coonhound.n.01", "name": "black-and-tan_coonhound"}, - {"id": 3353, "synset": "dachshund.n.01", "name": "dachshund"}, - {"id": 3354, "synset": "sausage_dog.n.01", "name": "sausage_dog"}, - {"id": 3355, "synset": "foxhound.n.01", "name": "foxhound"}, - {"id": 3356, "synset": "american_foxhound.n.01", "name": "American_foxhound"}, - {"id": 3357, "synset": "walker_hound.n.01", "name": "Walker_hound"}, - {"id": 3358, "synset": "english_foxhound.n.01", "name": "English_foxhound"}, - {"id": 3359, "synset": "harrier.n.02", "name": "harrier"}, - {"id": 3360, "synset": "plott_hound.n.01", "name": "Plott_hound"}, - {"id": 3361, "synset": "redbone.n.01", "name": "redbone"}, - {"id": 3362, "synset": "wolfhound.n.01", "name": "wolfhound"}, - {"id": 3363, "synset": "borzoi.n.01", "name": "borzoi"}, - {"id": 3364, "synset": "irish_wolfhound.n.01", "name": "Irish_wolfhound"}, - {"id": 3365, "synset": "greyhound.n.01", "name": "greyhound"}, - {"id": 3366, "synset": "italian_greyhound.n.01", "name": "Italian_greyhound"}, - {"id": 3367, "synset": "whippet.n.01", "name": "whippet"}, - {"id": 3368, "synset": "ibizan_hound.n.01", "name": "Ibizan_hound"}, - {"id": 3369, "synset": "norwegian_elkhound.n.01", "name": "Norwegian_elkhound"}, - {"id": 3370, "synset": "otterhound.n.01", "name": "otterhound"}, - {"id": 3371, "synset": "saluki.n.01", "name": "Saluki"}, - {"id": 3372, "synset": "scottish_deerhound.n.01", "name": "Scottish_deerhound"}, - {"id": 3373, "synset": "staghound.n.01", "name": "staghound"}, - {"id": 3374, "synset": "weimaraner.n.01", "name": "Weimaraner"}, - {"id": 3375, "synset": "terrier.n.01", "name": "terrier"}, - {"id": 3376, "synset": "bullterrier.n.01", "name": "bullterrier"}, - {"id": 3377, "synset": "staffordshire_bullterrier.n.01", "name": "Staffordshire_bullterrier"}, - { - "id": 3378, - "synset": "american_staffordshire_terrier.n.01", - "name": "American_Staffordshire_terrier", - }, - {"id": 3379, "synset": "bedlington_terrier.n.01", "name": "Bedlington_terrier"}, - {"id": 3380, "synset": "border_terrier.n.01", "name": "Border_terrier"}, - {"id": 3381, "synset": "kerry_blue_terrier.n.01", "name": "Kerry_blue_terrier"}, - {"id": 3382, "synset": "irish_terrier.n.01", "name": "Irish_terrier"}, - {"id": 3383, "synset": "norfolk_terrier.n.01", "name": "Norfolk_terrier"}, - {"id": 3384, "synset": "norwich_terrier.n.01", "name": "Norwich_terrier"}, - {"id": 3385, "synset": "yorkshire_terrier.n.01", "name": "Yorkshire_terrier"}, - {"id": 3386, "synset": "rat_terrier.n.01", "name": "rat_terrier"}, - {"id": 3387, "synset": "manchester_terrier.n.01", "name": "Manchester_terrier"}, - {"id": 3388, "synset": "toy_manchester.n.01", "name": "toy_Manchester"}, - {"id": 3389, "synset": "fox_terrier.n.01", "name": "fox_terrier"}, - {"id": 3390, "synset": "smooth-haired_fox_terrier.n.01", "name": "smooth-haired_fox_terrier"}, - {"id": 3391, "synset": "wire-haired_fox_terrier.n.01", "name": "wire-haired_fox_terrier"}, - {"id": 3392, "synset": "wirehair.n.01", "name": "wirehair"}, - {"id": 3393, "synset": "lakeland_terrier.n.01", "name": "Lakeland_terrier"}, - {"id": 3394, "synset": "welsh_terrier.n.01", "name": "Welsh_terrier"}, - {"id": 3395, "synset": "sealyham_terrier.n.01", "name": "Sealyham_terrier"}, - {"id": 3396, "synset": "airedale.n.01", "name": "Airedale"}, - {"id": 3397, "synset": "cairn.n.02", "name": "cairn"}, - {"id": 3398, "synset": "australian_terrier.n.01", "name": "Australian_terrier"}, - {"id": 3399, "synset": "dandie_dinmont.n.01", "name": "Dandie_Dinmont"}, - {"id": 3400, "synset": "boston_bull.n.01", "name": "Boston_bull"}, - {"id": 3401, "synset": "schnauzer.n.01", "name": "schnauzer"}, - {"id": 3402, "synset": "miniature_schnauzer.n.01", "name": "miniature_schnauzer"}, - {"id": 3403, "synset": "giant_schnauzer.n.01", "name": "giant_schnauzer"}, - {"id": 3404, "synset": "standard_schnauzer.n.01", "name": "standard_schnauzer"}, - {"id": 3405, "synset": "scotch_terrier.n.01", "name": "Scotch_terrier"}, - {"id": 3406, "synset": "tibetan_terrier.n.01", "name": "Tibetan_terrier"}, - {"id": 3407, "synset": "silky_terrier.n.01", "name": "silky_terrier"}, - {"id": 3408, "synset": "skye_terrier.n.01", "name": "Skye_terrier"}, - {"id": 3409, "synset": "clydesdale_terrier.n.01", "name": "Clydesdale_terrier"}, - { - "id": 3410, - "synset": "soft-coated_wheaten_terrier.n.01", - "name": "soft-coated_wheaten_terrier", - }, - { - "id": 3411, - "synset": "west_highland_white_terrier.n.01", - "name": "West_Highland_white_terrier", - }, - {"id": 3412, "synset": "lhasa.n.02", "name": "Lhasa"}, - {"id": 3413, "synset": "sporting_dog.n.01", "name": "sporting_dog"}, - {"id": 3414, "synset": "bird_dog.n.01", "name": "bird_dog"}, - {"id": 3415, "synset": "water_dog.n.02", "name": "water_dog"}, - {"id": 3416, "synset": "retriever.n.01", "name": "retriever"}, - {"id": 3417, "synset": "flat-coated_retriever.n.01", "name": "flat-coated_retriever"}, - {"id": 3418, "synset": "curly-coated_retriever.n.01", "name": "curly-coated_retriever"}, - {"id": 3419, "synset": "golden_retriever.n.01", "name": "golden_retriever"}, - {"id": 3420, "synset": "labrador_retriever.n.01", "name": "Labrador_retriever"}, - {"id": 3421, "synset": "chesapeake_bay_retriever.n.01", "name": "Chesapeake_Bay_retriever"}, - {"id": 3422, "synset": "pointer.n.04", "name": "pointer"}, - { - "id": 3423, - "synset": "german_short-haired_pointer.n.01", - "name": "German_short-haired_pointer", - }, - {"id": 3424, "synset": "setter.n.02", "name": "setter"}, - {"id": 3425, "synset": "vizsla.n.01", "name": "vizsla"}, - {"id": 3426, "synset": "english_setter.n.01", "name": "English_setter"}, - {"id": 3427, "synset": "irish_setter.n.01", "name": "Irish_setter"}, - {"id": 3428, "synset": "gordon_setter.n.01", "name": "Gordon_setter"}, - {"id": 3429, "synset": "spaniel.n.01", "name": "spaniel"}, - {"id": 3430, "synset": "brittany_spaniel.n.01", "name": "Brittany_spaniel"}, - {"id": 3431, "synset": "clumber.n.01", "name": "clumber"}, - {"id": 3432, "synset": "field_spaniel.n.01", "name": "field_spaniel"}, - {"id": 3433, "synset": "springer_spaniel.n.01", "name": "springer_spaniel"}, - {"id": 3434, "synset": "english_springer.n.01", "name": "English_springer"}, - {"id": 3435, "synset": "welsh_springer_spaniel.n.01", "name": "Welsh_springer_spaniel"}, - {"id": 3436, "synset": "cocker_spaniel.n.01", "name": "cocker_spaniel"}, - {"id": 3437, "synset": "sussex_spaniel.n.01", "name": "Sussex_spaniel"}, - {"id": 3438, "synset": "water_spaniel.n.01", "name": "water_spaniel"}, - {"id": 3439, "synset": "american_water_spaniel.n.01", "name": "American_water_spaniel"}, - {"id": 3440, "synset": "irish_water_spaniel.n.01", "name": "Irish_water_spaniel"}, - {"id": 3441, "synset": "griffon.n.03", "name": "griffon"}, - {"id": 3442, "synset": "working_dog.n.01", "name": "working_dog"}, - {"id": 3443, "synset": "watchdog.n.02", "name": "watchdog"}, - {"id": 3444, "synset": "kuvasz.n.01", "name": "kuvasz"}, - {"id": 3445, "synset": "attack_dog.n.01", "name": "attack_dog"}, - {"id": 3446, "synset": "housedog.n.01", "name": "housedog"}, - {"id": 3447, "synset": "schipperke.n.01", "name": "schipperke"}, - {"id": 3448, "synset": "belgian_sheepdog.n.01", "name": "Belgian_sheepdog"}, - {"id": 3449, "synset": "groenendael.n.01", "name": "groenendael"}, - {"id": 3450, "synset": "malinois.n.01", "name": "malinois"}, - {"id": 3451, "synset": "briard.n.01", "name": "briard"}, - {"id": 3452, "synset": "kelpie.n.02", "name": "kelpie"}, - {"id": 3453, "synset": "komondor.n.01", "name": "komondor"}, - {"id": 3454, "synset": "old_english_sheepdog.n.01", "name": "Old_English_sheepdog"}, - {"id": 3455, "synset": "shetland_sheepdog.n.01", "name": "Shetland_sheepdog"}, - {"id": 3456, "synset": "collie.n.01", "name": "collie"}, - {"id": 3457, "synset": "border_collie.n.01", "name": "Border_collie"}, - {"id": 3458, "synset": "bouvier_des_flandres.n.01", "name": "Bouvier_des_Flandres"}, - {"id": 3459, "synset": "rottweiler.n.01", "name": "Rottweiler"}, - {"id": 3460, "synset": "german_shepherd.n.01", "name": "German_shepherd"}, - {"id": 3461, "synset": "police_dog.n.01", "name": "police_dog"}, - {"id": 3462, "synset": "pinscher.n.01", "name": "pinscher"}, - {"id": 3463, "synset": "doberman.n.01", "name": "Doberman"}, - {"id": 3464, "synset": "miniature_pinscher.n.01", "name": "miniature_pinscher"}, - {"id": 3465, "synset": "sennenhunde.n.01", "name": "Sennenhunde"}, - {"id": 3466, "synset": "greater_swiss_mountain_dog.n.01", "name": "Greater_Swiss_Mountain_dog"}, - {"id": 3467, "synset": "bernese_mountain_dog.n.01", "name": "Bernese_mountain_dog"}, - {"id": 3468, "synset": "appenzeller.n.01", "name": "Appenzeller"}, - {"id": 3469, "synset": "entlebucher.n.01", "name": "EntleBucher"}, - {"id": 3470, "synset": "boxer.n.04", "name": "boxer"}, - {"id": 3471, "synset": "mastiff.n.01", "name": "mastiff"}, - {"id": 3472, "synset": "bull_mastiff.n.01", "name": "bull_mastiff"}, - {"id": 3473, "synset": "tibetan_mastiff.n.01", "name": "Tibetan_mastiff"}, - {"id": 3474, "synset": "french_bulldog.n.01", "name": "French_bulldog"}, - {"id": 3475, "synset": "great_dane.n.01", "name": "Great_Dane"}, - {"id": 3476, "synset": "guide_dog.n.01", "name": "guide_dog"}, - {"id": 3477, "synset": "seeing_eye_dog.n.01", "name": "Seeing_Eye_dog"}, - {"id": 3478, "synset": "hearing_dog.n.01", "name": "hearing_dog"}, - {"id": 3479, "synset": "saint_bernard.n.01", "name": "Saint_Bernard"}, - {"id": 3480, "synset": "seizure-alert_dog.n.01", "name": "seizure-alert_dog"}, - {"id": 3481, "synset": "sled_dog.n.01", "name": "sled_dog"}, - {"id": 3482, "synset": "eskimo_dog.n.01", "name": "Eskimo_dog"}, - {"id": 3483, "synset": "malamute.n.01", "name": "malamute"}, - {"id": 3484, "synset": "siberian_husky.n.01", "name": "Siberian_husky"}, - {"id": 3485, "synset": "liver-spotted_dalmatian.n.01", "name": "liver-spotted_dalmatian"}, - {"id": 3486, "synset": "affenpinscher.n.01", "name": "affenpinscher"}, - {"id": 3487, "synset": "basenji.n.01", "name": "basenji"}, - {"id": 3488, "synset": "leonberg.n.01", "name": "Leonberg"}, - {"id": 3489, "synset": "newfoundland.n.01", "name": "Newfoundland"}, - {"id": 3490, "synset": "great_pyrenees.n.01", "name": "Great_Pyrenees"}, - {"id": 3491, "synset": "spitz.n.01", "name": "spitz"}, - {"id": 3492, "synset": "samoyed.n.03", "name": "Samoyed"}, - {"id": 3493, "synset": "pomeranian.n.01", "name": "Pomeranian"}, - {"id": 3494, "synset": "chow.n.03", "name": "chow"}, - {"id": 3495, "synset": "keeshond.n.01", "name": "keeshond"}, - {"id": 3496, "synset": "griffon.n.02", "name": "griffon"}, - {"id": 3497, "synset": "brabancon_griffon.n.01", "name": "Brabancon_griffon"}, - {"id": 3498, "synset": "corgi.n.01", "name": "corgi"}, - {"id": 3499, "synset": "pembroke.n.01", "name": "Pembroke"}, - {"id": 3500, "synset": "cardigan.n.02", "name": "Cardigan"}, - {"id": 3501, "synset": "poodle.n.01", "name": "poodle"}, - {"id": 3502, "synset": "toy_poodle.n.01", "name": "toy_poodle"}, - {"id": 3503, "synset": "miniature_poodle.n.01", "name": "miniature_poodle"}, - {"id": 3504, "synset": "standard_poodle.n.01", "name": "standard_poodle"}, - {"id": 3505, "synset": "large_poodle.n.01", "name": "large_poodle"}, - {"id": 3506, "synset": "mexican_hairless.n.01", "name": "Mexican_hairless"}, - {"id": 3507, "synset": "timber_wolf.n.01", "name": "timber_wolf"}, - {"id": 3508, "synset": "white_wolf.n.01", "name": "white_wolf"}, - {"id": 3509, "synset": "red_wolf.n.01", "name": "red_wolf"}, - {"id": 3510, "synset": "coyote.n.01", "name": "coyote"}, - {"id": 3511, "synset": "coydog.n.01", "name": "coydog"}, - {"id": 3512, "synset": "jackal.n.01", "name": "jackal"}, - {"id": 3513, "synset": "wild_dog.n.01", "name": "wild_dog"}, - {"id": 3514, "synset": "dingo.n.01", "name": "dingo"}, - {"id": 3515, "synset": "dhole.n.01", "name": "dhole"}, - {"id": 3516, "synset": "crab-eating_dog.n.01", "name": "crab-eating_dog"}, - {"id": 3517, "synset": "raccoon_dog.n.01", "name": "raccoon_dog"}, - {"id": 3518, "synset": "african_hunting_dog.n.01", "name": "African_hunting_dog"}, - {"id": 3519, "synset": "hyena.n.01", "name": "hyena"}, - {"id": 3520, "synset": "striped_hyena.n.01", "name": "striped_hyena"}, - {"id": 3521, "synset": "brown_hyena.n.01", "name": "brown_hyena"}, - {"id": 3522, "synset": "spotted_hyena.n.01", "name": "spotted_hyena"}, - {"id": 3523, "synset": "aardwolf.n.01", "name": "aardwolf"}, - {"id": 3524, "synset": "fox.n.01", "name": "fox"}, - {"id": 3525, "synset": "vixen.n.02", "name": "vixen"}, - {"id": 3526, "synset": "reynard.n.01", "name": "Reynard"}, - {"id": 3527, "synset": "red_fox.n.03", "name": "red_fox"}, - {"id": 3528, "synset": "black_fox.n.01", "name": "black_fox"}, - {"id": 3529, "synset": "silver_fox.n.01", "name": "silver_fox"}, - {"id": 3530, "synset": "red_fox.n.02", "name": "red_fox"}, - {"id": 3531, "synset": "kit_fox.n.02", "name": "kit_fox"}, - {"id": 3532, "synset": "kit_fox.n.01", "name": "kit_fox"}, - {"id": 3533, "synset": "arctic_fox.n.01", "name": "Arctic_fox"}, - {"id": 3534, "synset": "blue_fox.n.01", "name": "blue_fox"}, - {"id": 3535, "synset": "grey_fox.n.01", "name": "grey_fox"}, - {"id": 3536, "synset": "feline.n.01", "name": "feline"}, - {"id": 3537, "synset": "domestic_cat.n.01", "name": "domestic_cat"}, - {"id": 3538, "synset": "kitty.n.04", "name": "kitty"}, - {"id": 3539, "synset": "mouser.n.01", "name": "mouser"}, - {"id": 3540, "synset": "alley_cat.n.01", "name": "alley_cat"}, - {"id": 3541, "synset": "stray.n.01", "name": "stray"}, - {"id": 3542, "synset": "tom.n.02", "name": "tom"}, - {"id": 3543, "synset": "gib.n.02", "name": "gib"}, - {"id": 3544, "synset": "tabby.n.02", "name": "tabby"}, - {"id": 3545, "synset": "tabby.n.01", "name": "tabby"}, - {"id": 3546, "synset": "tiger_cat.n.02", "name": "tiger_cat"}, - {"id": 3547, "synset": "tortoiseshell.n.03", "name": "tortoiseshell"}, - {"id": 3548, "synset": "persian_cat.n.01", "name": "Persian_cat"}, - {"id": 3549, "synset": "angora.n.04", "name": "Angora"}, - {"id": 3550, "synset": "siamese_cat.n.01", "name": "Siamese_cat"}, - {"id": 3551, "synset": "blue_point_siamese.n.01", "name": "blue_point_Siamese"}, - {"id": 3552, "synset": "burmese_cat.n.01", "name": "Burmese_cat"}, - {"id": 3553, "synset": "egyptian_cat.n.01", "name": "Egyptian_cat"}, - {"id": 3554, "synset": "maltese.n.03", "name": "Maltese"}, - {"id": 3555, "synset": "abyssinian.n.01", "name": "Abyssinian"}, - {"id": 3556, "synset": "manx.n.02", "name": "Manx"}, - {"id": 3557, "synset": "wildcat.n.03", "name": "wildcat"}, - {"id": 3558, "synset": "sand_cat.n.01", "name": "sand_cat"}, - {"id": 3559, "synset": "european_wildcat.n.01", "name": "European_wildcat"}, - {"id": 3560, "synset": "ocelot.n.01", "name": "ocelot"}, - {"id": 3561, "synset": "jaguarundi.n.01", "name": "jaguarundi"}, - {"id": 3562, "synset": "kaffir_cat.n.01", "name": "kaffir_cat"}, - {"id": 3563, "synset": "jungle_cat.n.01", "name": "jungle_cat"}, - {"id": 3564, "synset": "serval.n.01", "name": "serval"}, - {"id": 3565, "synset": "leopard_cat.n.01", "name": "leopard_cat"}, - {"id": 3566, "synset": "margay.n.01", "name": "margay"}, - {"id": 3567, "synset": "manul.n.01", "name": "manul"}, - {"id": 3568, "synset": "lynx.n.02", "name": "lynx"}, - {"id": 3569, "synset": "common_lynx.n.01", "name": "common_lynx"}, - {"id": 3570, "synset": "canada_lynx.n.01", "name": "Canada_lynx"}, - {"id": 3571, "synset": "bobcat.n.01", "name": "bobcat"}, - {"id": 3572, "synset": "spotted_lynx.n.01", "name": "spotted_lynx"}, - {"id": 3573, "synset": "caracal.n.01", "name": "caracal"}, - {"id": 3574, "synset": "big_cat.n.01", "name": "big_cat"}, - {"id": 3575, "synset": "leopard.n.02", "name": "leopard"}, - {"id": 3576, "synset": "leopardess.n.01", "name": "leopardess"}, - {"id": 3577, "synset": "panther.n.02", "name": "panther"}, - {"id": 3578, "synset": "snow_leopard.n.01", "name": "snow_leopard"}, - {"id": 3579, "synset": "jaguar.n.01", "name": "jaguar"}, - {"id": 3580, "synset": "lioness.n.01", "name": "lioness"}, - {"id": 3581, "synset": "lionet.n.01", "name": "lionet"}, - {"id": 3582, "synset": "bengal_tiger.n.01", "name": "Bengal_tiger"}, - {"id": 3583, "synset": "tigress.n.01", "name": "tigress"}, - {"id": 3584, "synset": "liger.n.01", "name": "liger"}, - {"id": 3585, "synset": "tiglon.n.01", "name": "tiglon"}, - {"id": 3586, "synset": "cheetah.n.01", "name": "cheetah"}, - {"id": 3587, "synset": "saber-toothed_tiger.n.01", "name": "saber-toothed_tiger"}, - {"id": 3588, "synset": "smiledon_californicus.n.01", "name": "Smiledon_californicus"}, - {"id": 3589, "synset": "brown_bear.n.01", "name": "brown_bear"}, - {"id": 3590, "synset": "bruin.n.01", "name": "bruin"}, - {"id": 3591, "synset": "syrian_bear.n.01", "name": "Syrian_bear"}, - {"id": 3592, "synset": "alaskan_brown_bear.n.01", "name": "Alaskan_brown_bear"}, - {"id": 3593, "synset": "american_black_bear.n.01", "name": "American_black_bear"}, - {"id": 3594, "synset": "cinnamon_bear.n.01", "name": "cinnamon_bear"}, - {"id": 3595, "synset": "asiatic_black_bear.n.01", "name": "Asiatic_black_bear"}, - {"id": 3596, "synset": "sloth_bear.n.01", "name": "sloth_bear"}, - {"id": 3597, "synset": "viverrine.n.01", "name": "viverrine"}, - {"id": 3598, "synset": "civet.n.01", "name": "civet"}, - {"id": 3599, "synset": "large_civet.n.01", "name": "large_civet"}, - {"id": 3600, "synset": "small_civet.n.01", "name": "small_civet"}, - {"id": 3601, "synset": "binturong.n.01", "name": "binturong"}, - {"id": 3602, "synset": "cryptoprocta.n.01", "name": "Cryptoprocta"}, - {"id": 3603, "synset": "fossa.n.03", "name": "fossa"}, - {"id": 3604, "synset": "fanaloka.n.01", "name": "fanaloka"}, - {"id": 3605, "synset": "genet.n.03", "name": "genet"}, - {"id": 3606, "synset": "banded_palm_civet.n.01", "name": "banded_palm_civet"}, - {"id": 3607, "synset": "mongoose.n.01", "name": "mongoose"}, - {"id": 3608, "synset": "indian_mongoose.n.01", "name": "Indian_mongoose"}, - {"id": 3609, "synset": "ichneumon.n.01", "name": "ichneumon"}, - {"id": 3610, "synset": "palm_cat.n.01", "name": "palm_cat"}, - {"id": 3611, "synset": "meerkat.n.01", "name": "meerkat"}, - {"id": 3612, "synset": "slender-tailed_meerkat.n.01", "name": "slender-tailed_meerkat"}, - {"id": 3613, "synset": "suricate.n.01", "name": "suricate"}, - {"id": 3614, "synset": "fruit_bat.n.01", "name": "fruit_bat"}, - {"id": 3615, "synset": "flying_fox.n.01", "name": "flying_fox"}, - {"id": 3616, "synset": "pteropus_capestratus.n.01", "name": "Pteropus_capestratus"}, - {"id": 3617, "synset": "pteropus_hypomelanus.n.01", "name": "Pteropus_hypomelanus"}, - {"id": 3618, "synset": "harpy.n.03", "name": "harpy"}, - {"id": 3619, "synset": "cynopterus_sphinx.n.01", "name": "Cynopterus_sphinx"}, - {"id": 3620, "synset": "carnivorous_bat.n.01", "name": "carnivorous_bat"}, - {"id": 3621, "synset": "mouse-eared_bat.n.01", "name": "mouse-eared_bat"}, - {"id": 3622, "synset": "leafnose_bat.n.01", "name": "leafnose_bat"}, - {"id": 3623, "synset": "macrotus.n.01", "name": "macrotus"}, - {"id": 3624, "synset": "spearnose_bat.n.01", "name": "spearnose_bat"}, - {"id": 3625, "synset": "phyllostomus_hastatus.n.01", "name": "Phyllostomus_hastatus"}, - {"id": 3626, "synset": "hognose_bat.n.01", "name": "hognose_bat"}, - {"id": 3627, "synset": "horseshoe_bat.n.02", "name": "horseshoe_bat"}, - {"id": 3628, "synset": "horseshoe_bat.n.01", "name": "horseshoe_bat"}, - {"id": 3629, "synset": "orange_bat.n.01", "name": "orange_bat"}, - {"id": 3630, "synset": "false_vampire.n.01", "name": "false_vampire"}, - {"id": 3631, "synset": "big-eared_bat.n.01", "name": "big-eared_bat"}, - {"id": 3632, "synset": "vespertilian_bat.n.01", "name": "vespertilian_bat"}, - {"id": 3633, "synset": "frosted_bat.n.01", "name": "frosted_bat"}, - {"id": 3634, "synset": "red_bat.n.01", "name": "red_bat"}, - {"id": 3635, "synset": "brown_bat.n.01", "name": "brown_bat"}, - {"id": 3636, "synset": "little_brown_bat.n.01", "name": "little_brown_bat"}, - {"id": 3637, "synset": "cave_myotis.n.01", "name": "cave_myotis"}, - {"id": 3638, "synset": "big_brown_bat.n.01", "name": "big_brown_bat"}, - {"id": 3639, "synset": "serotine.n.01", "name": "serotine"}, - {"id": 3640, "synset": "pallid_bat.n.01", "name": "pallid_bat"}, - {"id": 3641, "synset": "pipistrelle.n.01", "name": "pipistrelle"}, - {"id": 3642, "synset": "eastern_pipistrel.n.01", "name": "eastern_pipistrel"}, - {"id": 3643, "synset": "jackass_bat.n.01", "name": "jackass_bat"}, - {"id": 3644, "synset": "long-eared_bat.n.01", "name": "long-eared_bat"}, - {"id": 3645, "synset": "western_big-eared_bat.n.01", "name": "western_big-eared_bat"}, - {"id": 3646, "synset": "freetail.n.01", "name": "freetail"}, - {"id": 3647, "synset": "guano_bat.n.01", "name": "guano_bat"}, - {"id": 3648, "synset": "pocketed_bat.n.01", "name": "pocketed_bat"}, - {"id": 3649, "synset": "mastiff_bat.n.01", "name": "mastiff_bat"}, - {"id": 3650, "synset": "vampire_bat.n.01", "name": "vampire_bat"}, - {"id": 3651, "synset": "desmodus_rotundus.n.01", "name": "Desmodus_rotundus"}, - {"id": 3652, "synset": "hairy-legged_vampire_bat.n.01", "name": "hairy-legged_vampire_bat"}, - {"id": 3653, "synset": "predator.n.02", "name": "predator"}, - {"id": 3654, "synset": "prey.n.02", "name": "prey"}, - {"id": 3655, "synset": "game.n.04", "name": "game"}, - {"id": 3656, "synset": "big_game.n.01", "name": "big_game"}, - {"id": 3657, "synset": "game_bird.n.01", "name": "game_bird"}, - {"id": 3658, "synset": "fossorial_mammal.n.01", "name": "fossorial_mammal"}, - {"id": 3659, "synset": "tetrapod.n.01", "name": "tetrapod"}, - {"id": 3660, "synset": "quadruped.n.01", "name": "quadruped"}, - {"id": 3661, "synset": "hexapod.n.01", "name": "hexapod"}, - {"id": 3662, "synset": "biped.n.01", "name": "biped"}, - {"id": 3663, "synset": "insect.n.01", "name": "insect"}, - {"id": 3664, "synset": "social_insect.n.01", "name": "social_insect"}, - {"id": 3665, "synset": "holometabola.n.01", "name": "holometabola"}, - {"id": 3666, "synset": "defoliator.n.01", "name": "defoliator"}, - {"id": 3667, "synset": "pollinator.n.01", "name": "pollinator"}, - {"id": 3668, "synset": "gallfly.n.03", "name": "gallfly"}, - {"id": 3669, "synset": "scorpion_fly.n.01", "name": "scorpion_fly"}, - {"id": 3670, "synset": "hanging_fly.n.01", "name": "hanging_fly"}, - {"id": 3671, "synset": "collembolan.n.01", "name": "collembolan"}, - {"id": 3672, "synset": "tiger_beetle.n.01", "name": "tiger_beetle"}, - {"id": 3673, "synset": "two-spotted_ladybug.n.01", "name": "two-spotted_ladybug"}, - {"id": 3674, "synset": "mexican_bean_beetle.n.01", "name": "Mexican_bean_beetle"}, - {"id": 3675, "synset": "hippodamia_convergens.n.01", "name": "Hippodamia_convergens"}, - {"id": 3676, "synset": "vedalia.n.01", "name": "vedalia"}, - {"id": 3677, "synset": "ground_beetle.n.01", "name": "ground_beetle"}, - {"id": 3678, "synset": "bombardier_beetle.n.01", "name": "bombardier_beetle"}, - {"id": 3679, "synset": "calosoma.n.01", "name": "calosoma"}, - {"id": 3680, "synset": "searcher.n.03", "name": "searcher"}, - {"id": 3681, "synset": "firefly.n.02", "name": "firefly"}, - {"id": 3682, "synset": "glowworm.n.01", "name": "glowworm"}, - {"id": 3683, "synset": "long-horned_beetle.n.01", "name": "long-horned_beetle"}, - {"id": 3684, "synset": "sawyer.n.02", "name": "sawyer"}, - {"id": 3685, "synset": "pine_sawyer.n.01", "name": "pine_sawyer"}, - {"id": 3686, "synset": "leaf_beetle.n.01", "name": "leaf_beetle"}, - {"id": 3687, "synset": "flea_beetle.n.01", "name": "flea_beetle"}, - {"id": 3688, "synset": "colorado_potato_beetle.n.01", "name": "Colorado_potato_beetle"}, - {"id": 3689, "synset": "carpet_beetle.n.01", "name": "carpet_beetle"}, - {"id": 3690, "synset": "buffalo_carpet_beetle.n.01", "name": "buffalo_carpet_beetle"}, - {"id": 3691, "synset": "black_carpet_beetle.n.01", "name": "black_carpet_beetle"}, - {"id": 3692, "synset": "clerid_beetle.n.01", "name": "clerid_beetle"}, - {"id": 3693, "synset": "bee_beetle.n.01", "name": "bee_beetle"}, - {"id": 3694, "synset": "lamellicorn_beetle.n.01", "name": "lamellicorn_beetle"}, - {"id": 3695, "synset": "scarabaeid_beetle.n.01", "name": "scarabaeid_beetle"}, - {"id": 3696, "synset": "dung_beetle.n.01", "name": "dung_beetle"}, - {"id": 3697, "synset": "scarab.n.01", "name": "scarab"}, - {"id": 3698, "synset": "tumblebug.n.01", "name": "tumblebug"}, - {"id": 3699, "synset": "dorbeetle.n.01", "name": "dorbeetle"}, - {"id": 3700, "synset": "june_beetle.n.01", "name": "June_beetle"}, - {"id": 3701, "synset": "green_june_beetle.n.01", "name": "green_June_beetle"}, - {"id": 3702, "synset": "japanese_beetle.n.01", "name": "Japanese_beetle"}, - {"id": 3703, "synset": "oriental_beetle.n.01", "name": "Oriental_beetle"}, - {"id": 3704, "synset": "rhinoceros_beetle.n.01", "name": "rhinoceros_beetle"}, - {"id": 3705, "synset": "melolonthid_beetle.n.01", "name": "melolonthid_beetle"}, - {"id": 3706, "synset": "cockchafer.n.01", "name": "cockchafer"}, - {"id": 3707, "synset": "rose_chafer.n.02", "name": "rose_chafer"}, - {"id": 3708, "synset": "rose_chafer.n.01", "name": "rose_chafer"}, - {"id": 3709, "synset": "stag_beetle.n.01", "name": "stag_beetle"}, - {"id": 3710, "synset": "elaterid_beetle.n.01", "name": "elaterid_beetle"}, - {"id": 3711, "synset": "click_beetle.n.01", "name": "click_beetle"}, - {"id": 3712, "synset": "firefly.n.01", "name": "firefly"}, - {"id": 3713, "synset": "wireworm.n.01", "name": "wireworm"}, - {"id": 3714, "synset": "water_beetle.n.01", "name": "water_beetle"}, - {"id": 3715, "synset": "whirligig_beetle.n.01", "name": "whirligig_beetle"}, - {"id": 3716, "synset": "deathwatch_beetle.n.01", "name": "deathwatch_beetle"}, - {"id": 3717, "synset": "weevil.n.01", "name": "weevil"}, - {"id": 3718, "synset": "snout_beetle.n.01", "name": "snout_beetle"}, - {"id": 3719, "synset": "boll_weevil.n.01", "name": "boll_weevil"}, - {"id": 3720, "synset": "blister_beetle.n.01", "name": "blister_beetle"}, - {"id": 3721, "synset": "oil_beetle.n.01", "name": "oil_beetle"}, - {"id": 3722, "synset": "spanish_fly.n.01", "name": "Spanish_fly"}, - {"id": 3723, "synset": "dutch-elm_beetle.n.01", "name": "Dutch-elm_beetle"}, - {"id": 3724, "synset": "bark_beetle.n.01", "name": "bark_beetle"}, - {"id": 3725, "synset": "spruce_bark_beetle.n.01", "name": "spruce_bark_beetle"}, - {"id": 3726, "synset": "rove_beetle.n.01", "name": "rove_beetle"}, - {"id": 3727, "synset": "darkling_beetle.n.01", "name": "darkling_beetle"}, - {"id": 3728, "synset": "mealworm.n.01", "name": "mealworm"}, - {"id": 3729, "synset": "flour_beetle.n.01", "name": "flour_beetle"}, - {"id": 3730, "synset": "seed_beetle.n.01", "name": "seed_beetle"}, - {"id": 3731, "synset": "pea_weevil.n.01", "name": "pea_weevil"}, - {"id": 3732, "synset": "bean_weevil.n.01", "name": "bean_weevil"}, - {"id": 3733, "synset": "rice_weevil.n.01", "name": "rice_weevil"}, - {"id": 3734, "synset": "asian_longhorned_beetle.n.01", "name": "Asian_longhorned_beetle"}, - {"id": 3735, "synset": "web_spinner.n.01", "name": "web_spinner"}, - {"id": 3736, "synset": "louse.n.01", "name": "louse"}, - {"id": 3737, "synset": "common_louse.n.01", "name": "common_louse"}, - {"id": 3738, "synset": "head_louse.n.01", "name": "head_louse"}, - {"id": 3739, "synset": "body_louse.n.01", "name": "body_louse"}, - {"id": 3740, "synset": "crab_louse.n.01", "name": "crab_louse"}, - {"id": 3741, "synset": "bird_louse.n.01", "name": "bird_louse"}, - {"id": 3742, "synset": "flea.n.01", "name": "flea"}, - {"id": 3743, "synset": "pulex_irritans.n.01", "name": "Pulex_irritans"}, - {"id": 3744, "synset": "dog_flea.n.01", "name": "dog_flea"}, - {"id": 3745, "synset": "cat_flea.n.01", "name": "cat_flea"}, - {"id": 3746, "synset": "chigoe.n.01", "name": "chigoe"}, - {"id": 3747, "synset": "sticktight.n.02", "name": "sticktight"}, - {"id": 3748, "synset": "dipterous_insect.n.01", "name": "dipterous_insect"}, - {"id": 3749, "synset": "gall_midge.n.01", "name": "gall_midge"}, - {"id": 3750, "synset": "hessian_fly.n.01", "name": "Hessian_fly"}, - {"id": 3751, "synset": "fly.n.01", "name": "fly"}, - {"id": 3752, "synset": "housefly.n.01", "name": "housefly"}, - {"id": 3753, "synset": "tsetse_fly.n.01", "name": "tsetse_fly"}, - {"id": 3754, "synset": "blowfly.n.01", "name": "blowfly"}, - {"id": 3755, "synset": "bluebottle.n.02", "name": "bluebottle"}, - {"id": 3756, "synset": "greenbottle.n.01", "name": "greenbottle"}, - {"id": 3757, "synset": "flesh_fly.n.01", "name": "flesh_fly"}, - {"id": 3758, "synset": "tachina_fly.n.01", "name": "tachina_fly"}, - {"id": 3759, "synset": "gadfly.n.02", "name": "gadfly"}, - {"id": 3760, "synset": "botfly.n.01", "name": "botfly"}, - {"id": 3761, "synset": "human_botfly.n.01", "name": "human_botfly"}, - {"id": 3762, "synset": "sheep_botfly.n.01", "name": "sheep_botfly"}, - {"id": 3763, "synset": "warble_fly.n.01", "name": "warble_fly"}, - {"id": 3764, "synset": "horsefly.n.02", "name": "horsefly"}, - {"id": 3765, "synset": "bee_fly.n.01", "name": "bee_fly"}, - {"id": 3766, "synset": "robber_fly.n.01", "name": "robber_fly"}, - {"id": 3767, "synset": "fruit_fly.n.01", "name": "fruit_fly"}, - {"id": 3768, "synset": "apple_maggot.n.01", "name": "apple_maggot"}, - {"id": 3769, "synset": "mediterranean_fruit_fly.n.01", "name": "Mediterranean_fruit_fly"}, - {"id": 3770, "synset": "drosophila.n.01", "name": "drosophila"}, - {"id": 3771, "synset": "vinegar_fly.n.01", "name": "vinegar_fly"}, - {"id": 3772, "synset": "leaf_miner.n.01", "name": "leaf_miner"}, - {"id": 3773, "synset": "louse_fly.n.01", "name": "louse_fly"}, - {"id": 3774, "synset": "horse_tick.n.01", "name": "horse_tick"}, - {"id": 3775, "synset": "sheep_ked.n.01", "name": "sheep_ked"}, - {"id": 3776, "synset": "horn_fly.n.01", "name": "horn_fly"}, - {"id": 3777, "synset": "mosquito.n.01", "name": "mosquito"}, - {"id": 3778, "synset": "wiggler.n.02", "name": "wiggler"}, - {"id": 3779, "synset": "gnat.n.02", "name": "gnat"}, - {"id": 3780, "synset": "yellow-fever_mosquito.n.01", "name": "yellow-fever_mosquito"}, - {"id": 3781, "synset": "asian_tiger_mosquito.n.01", "name": "Asian_tiger_mosquito"}, - {"id": 3782, "synset": "anopheline.n.01", "name": "anopheline"}, - {"id": 3783, "synset": "malarial_mosquito.n.01", "name": "malarial_mosquito"}, - {"id": 3784, "synset": "common_mosquito.n.01", "name": "common_mosquito"}, - {"id": 3785, "synset": "culex_quinquefasciatus.n.01", "name": "Culex_quinquefasciatus"}, - {"id": 3786, "synset": "gnat.n.01", "name": "gnat"}, - {"id": 3787, "synset": "punkie.n.01", "name": "punkie"}, - {"id": 3788, "synset": "midge.n.01", "name": "midge"}, - {"id": 3789, "synset": "fungus_gnat.n.02", "name": "fungus_gnat"}, - {"id": 3790, "synset": "psychodid.n.01", "name": "psychodid"}, - {"id": 3791, "synset": "sand_fly.n.01", "name": "sand_fly"}, - {"id": 3792, "synset": "fungus_gnat.n.01", "name": "fungus_gnat"}, - {"id": 3793, "synset": "armyworm.n.03", "name": "armyworm"}, - {"id": 3794, "synset": "crane_fly.n.01", "name": "crane_fly"}, - {"id": 3795, "synset": "blackfly.n.02", "name": "blackfly"}, - {"id": 3796, "synset": "hymenopterous_insect.n.01", "name": "hymenopterous_insect"}, - {"id": 3797, "synset": "bee.n.01", "name": "bee"}, - {"id": 3798, "synset": "drone.n.01", "name": "drone"}, - {"id": 3799, "synset": "queen_bee.n.01", "name": "queen_bee"}, - {"id": 3800, "synset": "worker.n.03", "name": "worker"}, - {"id": 3801, "synset": "soldier.n.02", "name": "soldier"}, - {"id": 3802, "synset": "worker_bee.n.01", "name": "worker_bee"}, - {"id": 3803, "synset": "honeybee.n.01", "name": "honeybee"}, - {"id": 3804, "synset": "africanized_bee.n.01", "name": "Africanized_bee"}, - {"id": 3805, "synset": "black_bee.n.01", "name": "black_bee"}, - {"id": 3806, "synset": "carniolan_bee.n.01", "name": "Carniolan_bee"}, - {"id": 3807, "synset": "italian_bee.n.01", "name": "Italian_bee"}, - {"id": 3808, "synset": "carpenter_bee.n.01", "name": "carpenter_bee"}, - {"id": 3809, "synset": "bumblebee.n.01", "name": "bumblebee"}, - {"id": 3810, "synset": "cuckoo-bumblebee.n.01", "name": "cuckoo-bumblebee"}, - {"id": 3811, "synset": "andrena.n.01", "name": "andrena"}, - {"id": 3812, "synset": "nomia_melanderi.n.01", "name": "Nomia_melanderi"}, - {"id": 3813, "synset": "leaf-cutting_bee.n.01", "name": "leaf-cutting_bee"}, - {"id": 3814, "synset": "mason_bee.n.01", "name": "mason_bee"}, - {"id": 3815, "synset": "potter_bee.n.01", "name": "potter_bee"}, - {"id": 3816, "synset": "wasp.n.02", "name": "wasp"}, - {"id": 3817, "synset": "vespid.n.01", "name": "vespid"}, - {"id": 3818, "synset": "paper_wasp.n.01", "name": "paper_wasp"}, - {"id": 3819, "synset": "giant_hornet.n.01", "name": "giant_hornet"}, - {"id": 3820, "synset": "common_wasp.n.01", "name": "common_wasp"}, - {"id": 3821, "synset": "bald-faced_hornet.n.01", "name": "bald-faced_hornet"}, - {"id": 3822, "synset": "yellow_jacket.n.02", "name": "yellow_jacket"}, - {"id": 3823, "synset": "polistes_annularis.n.01", "name": "Polistes_annularis"}, - {"id": 3824, "synset": "mason_wasp.n.02", "name": "mason_wasp"}, - {"id": 3825, "synset": "potter_wasp.n.01", "name": "potter_wasp"}, - {"id": 3826, "synset": "mutillidae.n.01", "name": "Mutillidae"}, - {"id": 3827, "synset": "velvet_ant.n.01", "name": "velvet_ant"}, - {"id": 3828, "synset": "sphecoid_wasp.n.01", "name": "sphecoid_wasp"}, - {"id": 3829, "synset": "mason_wasp.n.01", "name": "mason_wasp"}, - {"id": 3830, "synset": "digger_wasp.n.01", "name": "digger_wasp"}, - {"id": 3831, "synset": "cicada_killer.n.01", "name": "cicada_killer"}, - {"id": 3832, "synset": "mud_dauber.n.01", "name": "mud_dauber"}, - {"id": 3833, "synset": "gall_wasp.n.01", "name": "gall_wasp"}, - {"id": 3834, "synset": "chalcid_fly.n.01", "name": "chalcid_fly"}, - {"id": 3835, "synset": "strawworm.n.02", "name": "strawworm"}, - {"id": 3836, "synset": "chalcis_fly.n.01", "name": "chalcis_fly"}, - {"id": 3837, "synset": "ichneumon_fly.n.01", "name": "ichneumon_fly"}, - {"id": 3838, "synset": "sawfly.n.01", "name": "sawfly"}, - {"id": 3839, "synset": "birch_leaf_miner.n.01", "name": "birch_leaf_miner"}, - {"id": 3840, "synset": "ant.n.01", "name": "ant"}, - {"id": 3841, "synset": "pharaoh_ant.n.01", "name": "pharaoh_ant"}, - {"id": 3842, "synset": "little_black_ant.n.01", "name": "little_black_ant"}, - {"id": 3843, "synset": "army_ant.n.01", "name": "army_ant"}, - {"id": 3844, "synset": "carpenter_ant.n.01", "name": "carpenter_ant"}, - {"id": 3845, "synset": "fire_ant.n.01", "name": "fire_ant"}, - {"id": 3846, "synset": "wood_ant.n.01", "name": "wood_ant"}, - {"id": 3847, "synset": "slave_ant.n.01", "name": "slave_ant"}, - {"id": 3848, "synset": "formica_fusca.n.01", "name": "Formica_fusca"}, - {"id": 3849, "synset": "slave-making_ant.n.01", "name": "slave-making_ant"}, - {"id": 3850, "synset": "sanguinary_ant.n.01", "name": "sanguinary_ant"}, - {"id": 3851, "synset": "bulldog_ant.n.01", "name": "bulldog_ant"}, - {"id": 3852, "synset": "amazon_ant.n.01", "name": "Amazon_ant"}, - {"id": 3853, "synset": "termite.n.01", "name": "termite"}, - {"id": 3854, "synset": "dry-wood_termite.n.01", "name": "dry-wood_termite"}, - {"id": 3855, "synset": "reticulitermes_lucifugus.n.01", "name": "Reticulitermes_lucifugus"}, - {"id": 3856, "synset": "mastotermes_darwiniensis.n.01", "name": "Mastotermes_darwiniensis"}, - { - "id": 3857, - "synset": "mastotermes_electrodominicus.n.01", - "name": "Mastotermes_electrodominicus", - }, - {"id": 3858, "synset": "powder-post_termite.n.01", "name": "powder-post_termite"}, - {"id": 3859, "synset": "orthopterous_insect.n.01", "name": "orthopterous_insect"}, - {"id": 3860, "synset": "grasshopper.n.01", "name": "grasshopper"}, - {"id": 3861, "synset": "short-horned_grasshopper.n.01", "name": "short-horned_grasshopper"}, - {"id": 3862, "synset": "locust.n.01", "name": "locust"}, - {"id": 3863, "synset": "migratory_locust.n.01", "name": "migratory_locust"}, - {"id": 3864, "synset": "migratory_grasshopper.n.01", "name": "migratory_grasshopper"}, - {"id": 3865, "synset": "long-horned_grasshopper.n.01", "name": "long-horned_grasshopper"}, - {"id": 3866, "synset": "katydid.n.01", "name": "katydid"}, - {"id": 3867, "synset": "mormon_cricket.n.01", "name": "mormon_cricket"}, - {"id": 3868, "synset": "sand_cricket.n.01", "name": "sand_cricket"}, - {"id": 3869, "synset": "cricket.n.01", "name": "cricket"}, - {"id": 3870, "synset": "mole_cricket.n.01", "name": "mole_cricket"}, - {"id": 3871, "synset": "european_house_cricket.n.01", "name": "European_house_cricket"}, - {"id": 3872, "synset": "field_cricket.n.01", "name": "field_cricket"}, - {"id": 3873, "synset": "tree_cricket.n.01", "name": "tree_cricket"}, - {"id": 3874, "synset": "snowy_tree_cricket.n.01", "name": "snowy_tree_cricket"}, - {"id": 3875, "synset": "phasmid.n.01", "name": "phasmid"}, - {"id": 3876, "synset": "walking_stick.n.02", "name": "walking_stick"}, - {"id": 3877, "synset": "diapheromera.n.01", "name": "diapheromera"}, - {"id": 3878, "synset": "walking_leaf.n.02", "name": "walking_leaf"}, - {"id": 3879, "synset": "oriental_cockroach.n.01", "name": "oriental_cockroach"}, - {"id": 3880, "synset": "american_cockroach.n.01", "name": "American_cockroach"}, - {"id": 3881, "synset": "australian_cockroach.n.01", "name": "Australian_cockroach"}, - {"id": 3882, "synset": "german_cockroach.n.01", "name": "German_cockroach"}, - {"id": 3883, "synset": "giant_cockroach.n.01", "name": "giant_cockroach"}, - {"id": 3884, "synset": "mantis.n.01", "name": "mantis"}, - {"id": 3885, "synset": "praying_mantis.n.01", "name": "praying_mantis"}, - {"id": 3886, "synset": "bug.n.01", "name": "bug"}, - {"id": 3887, "synset": "hemipterous_insect.n.01", "name": "hemipterous_insect"}, - {"id": 3888, "synset": "leaf_bug.n.01", "name": "leaf_bug"}, - {"id": 3889, "synset": "mirid_bug.n.01", "name": "mirid_bug"}, - {"id": 3890, "synset": "four-lined_plant_bug.n.01", "name": "four-lined_plant_bug"}, - {"id": 3891, "synset": "lygus_bug.n.01", "name": "lygus_bug"}, - {"id": 3892, "synset": "tarnished_plant_bug.n.01", "name": "tarnished_plant_bug"}, - {"id": 3893, "synset": "lace_bug.n.01", "name": "lace_bug"}, - {"id": 3894, "synset": "lygaeid.n.01", "name": "lygaeid"}, - {"id": 3895, "synset": "chinch_bug.n.01", "name": "chinch_bug"}, - {"id": 3896, "synset": "coreid_bug.n.01", "name": "coreid_bug"}, - {"id": 3897, "synset": "squash_bug.n.01", "name": "squash_bug"}, - {"id": 3898, "synset": "leaf-footed_bug.n.01", "name": "leaf-footed_bug"}, - {"id": 3899, "synset": "bedbug.n.01", "name": "bedbug"}, - {"id": 3900, "synset": "backswimmer.n.01", "name": "backswimmer"}, - {"id": 3901, "synset": "true_bug.n.01", "name": "true_bug"}, - {"id": 3902, "synset": "heteropterous_insect.n.01", "name": "heteropterous_insect"}, - {"id": 3903, "synset": "water_bug.n.01", "name": "water_bug"}, - {"id": 3904, "synset": "giant_water_bug.n.01", "name": "giant_water_bug"}, - {"id": 3905, "synset": "water_scorpion.n.01", "name": "water_scorpion"}, - {"id": 3906, "synset": "water_boatman.n.01", "name": "water_boatman"}, - {"id": 3907, "synset": "water_strider.n.01", "name": "water_strider"}, - {"id": 3908, "synset": "common_pond-skater.n.01", "name": "common_pond-skater"}, - {"id": 3909, "synset": "assassin_bug.n.01", "name": "assassin_bug"}, - {"id": 3910, "synset": "conenose.n.01", "name": "conenose"}, - {"id": 3911, "synset": "wheel_bug.n.01", "name": "wheel_bug"}, - {"id": 3912, "synset": "firebug.n.02", "name": "firebug"}, - {"id": 3913, "synset": "cotton_stainer.n.01", "name": "cotton_stainer"}, - {"id": 3914, "synset": "homopterous_insect.n.01", "name": "homopterous_insect"}, - {"id": 3915, "synset": "whitefly.n.01", "name": "whitefly"}, - {"id": 3916, "synset": "citrus_whitefly.n.01", "name": "citrus_whitefly"}, - {"id": 3917, "synset": "greenhouse_whitefly.n.01", "name": "greenhouse_whitefly"}, - {"id": 3918, "synset": "sweet-potato_whitefly.n.01", "name": "sweet-potato_whitefly"}, - {"id": 3919, "synset": "superbug.n.02", "name": "superbug"}, - {"id": 3920, "synset": "cotton_strain.n.01", "name": "cotton_strain"}, - {"id": 3921, "synset": "coccid_insect.n.01", "name": "coccid_insect"}, - {"id": 3922, "synset": "scale_insect.n.01", "name": "scale_insect"}, - {"id": 3923, "synset": "soft_scale.n.01", "name": "soft_scale"}, - {"id": 3924, "synset": "brown_soft_scale.n.01", "name": "brown_soft_scale"}, - {"id": 3925, "synset": "armored_scale.n.01", "name": "armored_scale"}, - {"id": 3926, "synset": "san_jose_scale.n.01", "name": "San_Jose_scale"}, - {"id": 3927, "synset": "cochineal_insect.n.01", "name": "cochineal_insect"}, - {"id": 3928, "synset": "mealybug.n.01", "name": "mealybug"}, - {"id": 3929, "synset": "citrophilous_mealybug.n.01", "name": "citrophilous_mealybug"}, - {"id": 3930, "synset": "comstock_mealybug.n.01", "name": "Comstock_mealybug"}, - {"id": 3931, "synset": "citrus_mealybug.n.01", "name": "citrus_mealybug"}, - {"id": 3932, "synset": "plant_louse.n.01", "name": "plant_louse"}, - {"id": 3933, "synset": "aphid.n.01", "name": "aphid"}, - {"id": 3934, "synset": "apple_aphid.n.01", "name": "apple_aphid"}, - {"id": 3935, "synset": "blackfly.n.01", "name": "blackfly"}, - {"id": 3936, "synset": "greenfly.n.01", "name": "greenfly"}, - {"id": 3937, "synset": "green_peach_aphid.n.01", "name": "green_peach_aphid"}, - {"id": 3938, "synset": "ant_cow.n.01", "name": "ant_cow"}, - {"id": 3939, "synset": "woolly_aphid.n.01", "name": "woolly_aphid"}, - {"id": 3940, "synset": "woolly_apple_aphid.n.01", "name": "woolly_apple_aphid"}, - {"id": 3941, "synset": "woolly_alder_aphid.n.01", "name": "woolly_alder_aphid"}, - {"id": 3942, "synset": "adelgid.n.01", "name": "adelgid"}, - {"id": 3943, "synset": "balsam_woolly_aphid.n.01", "name": "balsam_woolly_aphid"}, - {"id": 3944, "synset": "spruce_gall_aphid.n.01", "name": "spruce_gall_aphid"}, - {"id": 3945, "synset": "woolly_adelgid.n.01", "name": "woolly_adelgid"}, - {"id": 3946, "synset": "jumping_plant_louse.n.01", "name": "jumping_plant_louse"}, - {"id": 3947, "synset": "cicada.n.01", "name": "cicada"}, - {"id": 3948, "synset": "dog-day_cicada.n.01", "name": "dog-day_cicada"}, - {"id": 3949, "synset": "seventeen-year_locust.n.01", "name": "seventeen-year_locust"}, - {"id": 3950, "synset": "spittle_insect.n.01", "name": "spittle_insect"}, - {"id": 3951, "synset": "froghopper.n.01", "name": "froghopper"}, - {"id": 3952, "synset": "meadow_spittlebug.n.01", "name": "meadow_spittlebug"}, - {"id": 3953, "synset": "pine_spittlebug.n.01", "name": "pine_spittlebug"}, - {"id": 3954, "synset": "saratoga_spittlebug.n.01", "name": "Saratoga_spittlebug"}, - {"id": 3955, "synset": "leafhopper.n.01", "name": "leafhopper"}, - {"id": 3956, "synset": "plant_hopper.n.01", "name": "plant_hopper"}, - {"id": 3957, "synset": "treehopper.n.01", "name": "treehopper"}, - {"id": 3958, "synset": "lantern_fly.n.01", "name": "lantern_fly"}, - {"id": 3959, "synset": "psocopterous_insect.n.01", "name": "psocopterous_insect"}, - {"id": 3960, "synset": "psocid.n.01", "name": "psocid"}, - {"id": 3961, "synset": "bark-louse.n.01", "name": "bark-louse"}, - {"id": 3962, "synset": "booklouse.n.01", "name": "booklouse"}, - {"id": 3963, "synset": "common_booklouse.n.01", "name": "common_booklouse"}, - {"id": 3964, "synset": "ephemerid.n.01", "name": "ephemerid"}, - {"id": 3965, "synset": "mayfly.n.01", "name": "mayfly"}, - {"id": 3966, "synset": "stonefly.n.01", "name": "stonefly"}, - {"id": 3967, "synset": "neuropteron.n.01", "name": "neuropteron"}, - {"id": 3968, "synset": "ant_lion.n.02", "name": "ant_lion"}, - {"id": 3969, "synset": "doodlebug.n.03", "name": "doodlebug"}, - {"id": 3970, "synset": "lacewing.n.01", "name": "lacewing"}, - {"id": 3971, "synset": "aphid_lion.n.01", "name": "aphid_lion"}, - {"id": 3972, "synset": "green_lacewing.n.01", "name": "green_lacewing"}, - {"id": 3973, "synset": "brown_lacewing.n.01", "name": "brown_lacewing"}, - {"id": 3974, "synset": "dobson.n.02", "name": "dobson"}, - {"id": 3975, "synset": "hellgrammiate.n.01", "name": "hellgrammiate"}, - {"id": 3976, "synset": "fish_fly.n.01", "name": "fish_fly"}, - {"id": 3977, "synset": "alderfly.n.01", "name": "alderfly"}, - {"id": 3978, "synset": "snakefly.n.01", "name": "snakefly"}, - {"id": 3979, "synset": "mantispid.n.01", "name": "mantispid"}, - {"id": 3980, "synset": "odonate.n.01", "name": "odonate"}, - {"id": 3981, "synset": "damselfly.n.01", "name": "damselfly"}, - {"id": 3982, "synset": "trichopterous_insect.n.01", "name": "trichopterous_insect"}, - {"id": 3983, "synset": "caddis_fly.n.01", "name": "caddis_fly"}, - {"id": 3984, "synset": "caseworm.n.01", "name": "caseworm"}, - {"id": 3985, "synset": "caddisworm.n.01", "name": "caddisworm"}, - {"id": 3986, "synset": "thysanuran_insect.n.01", "name": "thysanuran_insect"}, - {"id": 3987, "synset": "bristletail.n.01", "name": "bristletail"}, - {"id": 3988, "synset": "silverfish.n.01", "name": "silverfish"}, - {"id": 3989, "synset": "firebrat.n.01", "name": "firebrat"}, - {"id": 3990, "synset": "jumping_bristletail.n.01", "name": "jumping_bristletail"}, - {"id": 3991, "synset": "thysanopter.n.01", "name": "thysanopter"}, - {"id": 3992, "synset": "thrips.n.01", "name": "thrips"}, - {"id": 3993, "synset": "tobacco_thrips.n.01", "name": "tobacco_thrips"}, - {"id": 3994, "synset": "onion_thrips.n.01", "name": "onion_thrips"}, - {"id": 3995, "synset": "earwig.n.01", "name": "earwig"}, - {"id": 3996, "synset": "common_european_earwig.n.01", "name": "common_European_earwig"}, - {"id": 3997, "synset": "lepidopterous_insect.n.01", "name": "lepidopterous_insect"}, - {"id": 3998, "synset": "nymphalid.n.01", "name": "nymphalid"}, - {"id": 3999, "synset": "mourning_cloak.n.01", "name": "mourning_cloak"}, - {"id": 4000, "synset": "tortoiseshell.n.02", "name": "tortoiseshell"}, - {"id": 4001, "synset": "painted_beauty.n.01", "name": "painted_beauty"}, - {"id": 4002, "synset": "admiral.n.02", "name": "admiral"}, - {"id": 4003, "synset": "red_admiral.n.01", "name": "red_admiral"}, - {"id": 4004, "synset": "white_admiral.n.02", "name": "white_admiral"}, - {"id": 4005, "synset": "banded_purple.n.01", "name": "banded_purple"}, - {"id": 4006, "synset": "red-spotted_purple.n.01", "name": "red-spotted_purple"}, - {"id": 4007, "synset": "viceroy.n.02", "name": "viceroy"}, - {"id": 4008, "synset": "anglewing.n.01", "name": "anglewing"}, - {"id": 4009, "synset": "ringlet.n.04", "name": "ringlet"}, - {"id": 4010, "synset": "comma.n.02", "name": "comma"}, - {"id": 4011, "synset": "fritillary.n.02", "name": "fritillary"}, - {"id": 4012, "synset": "silverspot.n.01", "name": "silverspot"}, - {"id": 4013, "synset": "emperor_butterfly.n.01", "name": "emperor_butterfly"}, - {"id": 4014, "synset": "purple_emperor.n.01", "name": "purple_emperor"}, - {"id": 4015, "synset": "peacock.n.01", "name": "peacock"}, - {"id": 4016, "synset": "danaid.n.01", "name": "danaid"}, - {"id": 4017, "synset": "monarch.n.02", "name": "monarch"}, - {"id": 4018, "synset": "pierid.n.01", "name": "pierid"}, - {"id": 4019, "synset": "cabbage_butterfly.n.01", "name": "cabbage_butterfly"}, - {"id": 4020, "synset": "small_white.n.01", "name": "small_white"}, - {"id": 4021, "synset": "large_white.n.01", "name": "large_white"}, - {"id": 4022, "synset": "southern_cabbage_butterfly.n.01", "name": "southern_cabbage_butterfly"}, - {"id": 4023, "synset": "sulphur_butterfly.n.01", "name": "sulphur_butterfly"}, - {"id": 4024, "synset": "lycaenid.n.01", "name": "lycaenid"}, - {"id": 4025, "synset": "blue.n.07", "name": "blue"}, - {"id": 4026, "synset": "copper.n.05", "name": "copper"}, - {"id": 4027, "synset": "american_copper.n.01", "name": "American_copper"}, - {"id": 4028, "synset": "hairstreak.n.01", "name": "hairstreak"}, - {"id": 4029, "synset": "strymon_melinus.n.01", "name": "Strymon_melinus"}, - {"id": 4030, "synset": "moth.n.01", "name": "moth"}, - {"id": 4031, "synset": "moth_miller.n.01", "name": "moth_miller"}, - {"id": 4032, "synset": "tortricid.n.01", "name": "tortricid"}, - {"id": 4033, "synset": "leaf_roller.n.01", "name": "leaf_roller"}, - {"id": 4034, "synset": "tea_tortrix.n.01", "name": "tea_tortrix"}, - {"id": 4035, "synset": "orange_tortrix.n.01", "name": "orange_tortrix"}, - {"id": 4036, "synset": "codling_moth.n.01", "name": "codling_moth"}, - {"id": 4037, "synset": "lymantriid.n.01", "name": "lymantriid"}, - {"id": 4038, "synset": "tussock_caterpillar.n.01", "name": "tussock_caterpillar"}, - {"id": 4039, "synset": "gypsy_moth.n.01", "name": "gypsy_moth"}, - {"id": 4040, "synset": "browntail.n.01", "name": "browntail"}, - {"id": 4041, "synset": "gold-tail_moth.n.01", "name": "gold-tail_moth"}, - {"id": 4042, "synset": "geometrid.n.01", "name": "geometrid"}, - {"id": 4043, "synset": "paleacrita_vernata.n.01", "name": "Paleacrita_vernata"}, - {"id": 4044, "synset": "alsophila_pometaria.n.01", "name": "Alsophila_pometaria"}, - {"id": 4045, "synset": "cankerworm.n.01", "name": "cankerworm"}, - {"id": 4046, "synset": "spring_cankerworm.n.01", "name": "spring_cankerworm"}, - {"id": 4047, "synset": "fall_cankerworm.n.01", "name": "fall_cankerworm"}, - {"id": 4048, "synset": "measuring_worm.n.01", "name": "measuring_worm"}, - {"id": 4049, "synset": "pyralid.n.01", "name": "pyralid"}, - {"id": 4050, "synset": "bee_moth.n.01", "name": "bee_moth"}, - {"id": 4051, "synset": "corn_borer.n.02", "name": "corn_borer"}, - {"id": 4052, "synset": "mediterranean_flour_moth.n.01", "name": "Mediterranean_flour_moth"}, - {"id": 4053, "synset": "tobacco_moth.n.01", "name": "tobacco_moth"}, - {"id": 4054, "synset": "almond_moth.n.01", "name": "almond_moth"}, - {"id": 4055, "synset": "raisin_moth.n.01", "name": "raisin_moth"}, - {"id": 4056, "synset": "tineoid.n.01", "name": "tineoid"}, - {"id": 4057, "synset": "tineid.n.01", "name": "tineid"}, - {"id": 4058, "synset": "clothes_moth.n.01", "name": "clothes_moth"}, - {"id": 4059, "synset": "casemaking_clothes_moth.n.01", "name": "casemaking_clothes_moth"}, - {"id": 4060, "synset": "webbing_clothes_moth.n.01", "name": "webbing_clothes_moth"}, - {"id": 4061, "synset": "carpet_moth.n.01", "name": "carpet_moth"}, - {"id": 4062, "synset": "gelechiid.n.01", "name": "gelechiid"}, - {"id": 4063, "synset": "grain_moth.n.01", "name": "grain_moth"}, - {"id": 4064, "synset": "angoumois_moth.n.01", "name": "angoumois_moth"}, - {"id": 4065, "synset": "potato_moth.n.01", "name": "potato_moth"}, - {"id": 4066, "synset": "potato_tuberworm.n.01", "name": "potato_tuberworm"}, - {"id": 4067, "synset": "noctuid_moth.n.01", "name": "noctuid_moth"}, - {"id": 4068, "synset": "cutworm.n.01", "name": "cutworm"}, - {"id": 4069, "synset": "underwing.n.01", "name": "underwing"}, - {"id": 4070, "synset": "red_underwing.n.01", "name": "red_underwing"}, - {"id": 4071, "synset": "antler_moth.n.01", "name": "antler_moth"}, - {"id": 4072, "synset": "heliothis_moth.n.01", "name": "heliothis_moth"}, - {"id": 4073, "synset": "army_cutworm.n.01", "name": "army_cutworm"}, - {"id": 4074, "synset": "armyworm.n.02", "name": "armyworm"}, - {"id": 4075, "synset": "armyworm.n.01", "name": "armyworm"}, - {"id": 4076, "synset": "spodoptera_exigua.n.02", "name": "Spodoptera_exigua"}, - {"id": 4077, "synset": "beet_armyworm.n.01", "name": "beet_armyworm"}, - {"id": 4078, "synset": "spodoptera_frugiperda.n.02", "name": "Spodoptera_frugiperda"}, - {"id": 4079, "synset": "fall_armyworm.n.01", "name": "fall_armyworm"}, - {"id": 4080, "synset": "hawkmoth.n.01", "name": "hawkmoth"}, - {"id": 4081, "synset": "manduca_sexta.n.02", "name": "Manduca_sexta"}, - {"id": 4082, "synset": "tobacco_hornworm.n.01", "name": "tobacco_hornworm"}, - {"id": 4083, "synset": "manduca_quinquemaculata.n.02", "name": "Manduca_quinquemaculata"}, - {"id": 4084, "synset": "tomato_hornworm.n.01", "name": "tomato_hornworm"}, - {"id": 4085, "synset": "death's-head_moth.n.01", "name": "death's-head_moth"}, - {"id": 4086, "synset": "bombycid.n.01", "name": "bombycid"}, - {"id": 4087, "synset": "domestic_silkworm_moth.n.01", "name": "domestic_silkworm_moth"}, - {"id": 4088, "synset": "silkworm.n.01", "name": "silkworm"}, - {"id": 4089, "synset": "saturniid.n.01", "name": "saturniid"}, - {"id": 4090, "synset": "emperor.n.03", "name": "emperor"}, - {"id": 4091, "synset": "imperial_moth.n.01", "name": "imperial_moth"}, - {"id": 4092, "synset": "giant_silkworm_moth.n.01", "name": "giant_silkworm_moth"}, - {"id": 4093, "synset": "silkworm.n.02", "name": "silkworm"}, - {"id": 4094, "synset": "luna_moth.n.01", "name": "luna_moth"}, - {"id": 4095, "synset": "cecropia.n.02", "name": "cecropia"}, - {"id": 4096, "synset": "cynthia_moth.n.01", "name": "cynthia_moth"}, - {"id": 4097, "synset": "ailanthus_silkworm.n.01", "name": "ailanthus_silkworm"}, - {"id": 4098, "synset": "io_moth.n.01", "name": "io_moth"}, - {"id": 4099, "synset": "polyphemus_moth.n.01", "name": "polyphemus_moth"}, - {"id": 4100, "synset": "pernyi_moth.n.01", "name": "pernyi_moth"}, - {"id": 4101, "synset": "tussah.n.01", "name": "tussah"}, - {"id": 4102, "synset": "atlas_moth.n.01", "name": "atlas_moth"}, - {"id": 4103, "synset": "arctiid.n.01", "name": "arctiid"}, - {"id": 4104, "synset": "tiger_moth.n.01", "name": "tiger_moth"}, - {"id": 4105, "synset": "cinnabar.n.02", "name": "cinnabar"}, - {"id": 4106, "synset": "lasiocampid.n.01", "name": "lasiocampid"}, - {"id": 4107, "synset": "eggar.n.01", "name": "eggar"}, - {"id": 4108, "synset": "tent-caterpillar_moth.n.02", "name": "tent-caterpillar_moth"}, - {"id": 4109, "synset": "tent_caterpillar.n.01", "name": "tent_caterpillar"}, - {"id": 4110, "synset": "tent-caterpillar_moth.n.01", "name": "tent-caterpillar_moth"}, - {"id": 4111, "synset": "forest_tent_caterpillar.n.01", "name": "forest_tent_caterpillar"}, - {"id": 4112, "synset": "lappet.n.03", "name": "lappet"}, - {"id": 4113, "synset": "lappet_caterpillar.n.01", "name": "lappet_caterpillar"}, - {"id": 4114, "synset": "webworm.n.01", "name": "webworm"}, - {"id": 4115, "synset": "webworm_moth.n.01", "name": "webworm_moth"}, - {"id": 4116, "synset": "hyphantria_cunea.n.02", "name": "Hyphantria_cunea"}, - {"id": 4117, "synset": "fall_webworm.n.01", "name": "fall_webworm"}, - {"id": 4118, "synset": "garden_webworm.n.01", "name": "garden_webworm"}, - {"id": 4119, "synset": "instar.n.01", "name": "instar"}, - {"id": 4120, "synset": "caterpillar.n.01", "name": "caterpillar"}, - {"id": 4121, "synset": "corn_borer.n.01", "name": "corn_borer"}, - {"id": 4122, "synset": "bollworm.n.01", "name": "bollworm"}, - {"id": 4123, "synset": "pink_bollworm.n.01", "name": "pink_bollworm"}, - {"id": 4124, "synset": "corn_earworm.n.01", "name": "corn_earworm"}, - {"id": 4125, "synset": "cabbageworm.n.01", "name": "cabbageworm"}, - {"id": 4126, "synset": "woolly_bear.n.01", "name": "woolly_bear"}, - {"id": 4127, "synset": "woolly_bear_moth.n.01", "name": "woolly_bear_moth"}, - {"id": 4128, "synset": "larva.n.01", "name": "larva"}, - {"id": 4129, "synset": "nymph.n.02", "name": "nymph"}, - {"id": 4130, "synset": "leptocephalus.n.01", "name": "leptocephalus"}, - {"id": 4131, "synset": "grub.n.02", "name": "grub"}, - {"id": 4132, "synset": "maggot.n.01", "name": "maggot"}, - {"id": 4133, "synset": "leatherjacket.n.03", "name": "leatherjacket"}, - {"id": 4134, "synset": "pupa.n.01", "name": "pupa"}, - {"id": 4135, "synset": "chrysalis.n.01", "name": "chrysalis"}, - {"id": 4136, "synset": "imago.n.02", "name": "imago"}, - {"id": 4137, "synset": "queen.n.01", "name": "queen"}, - {"id": 4138, "synset": "phoronid.n.01", "name": "phoronid"}, - {"id": 4139, "synset": "bryozoan.n.01", "name": "bryozoan"}, - {"id": 4140, "synset": "brachiopod.n.01", "name": "brachiopod"}, - {"id": 4141, "synset": "peanut_worm.n.01", "name": "peanut_worm"}, - {"id": 4142, "synset": "echinoderm.n.01", "name": "echinoderm"}, - {"id": 4143, "synset": "brittle_star.n.01", "name": "brittle_star"}, - {"id": 4144, "synset": "basket_star.n.01", "name": "basket_star"}, - {"id": 4145, "synset": "astrophyton_muricatum.n.01", "name": "Astrophyton_muricatum"}, - {"id": 4146, "synset": "sea_urchin.n.01", "name": "sea_urchin"}, - {"id": 4147, "synset": "edible_sea_urchin.n.01", "name": "edible_sea_urchin"}, - {"id": 4148, "synset": "sand_dollar.n.01", "name": "sand_dollar"}, - {"id": 4149, "synset": "heart_urchin.n.01", "name": "heart_urchin"}, - {"id": 4150, "synset": "crinoid.n.01", "name": "crinoid"}, - {"id": 4151, "synset": "sea_lily.n.01", "name": "sea_lily"}, - {"id": 4152, "synset": "feather_star.n.01", "name": "feather_star"}, - {"id": 4153, "synset": "sea_cucumber.n.01", "name": "sea_cucumber"}, - {"id": 4154, "synset": "trepang.n.01", "name": "trepang"}, - {"id": 4155, "synset": "duplicidentata.n.01", "name": "Duplicidentata"}, - {"id": 4156, "synset": "lagomorph.n.01", "name": "lagomorph"}, - {"id": 4157, "synset": "leporid.n.01", "name": "leporid"}, - {"id": 4158, "synset": "rabbit_ears.n.02", "name": "rabbit_ears"}, - {"id": 4159, "synset": "lapin.n.02", "name": "lapin"}, - {"id": 4160, "synset": "bunny.n.02", "name": "bunny"}, - {"id": 4161, "synset": "european_rabbit.n.01", "name": "European_rabbit"}, - {"id": 4162, "synset": "wood_rabbit.n.01", "name": "wood_rabbit"}, - {"id": 4163, "synset": "eastern_cottontail.n.01", "name": "eastern_cottontail"}, - {"id": 4164, "synset": "swamp_rabbit.n.02", "name": "swamp_rabbit"}, - {"id": 4165, "synset": "marsh_hare.n.01", "name": "marsh_hare"}, - {"id": 4166, "synset": "hare.n.01", "name": "hare"}, - {"id": 4167, "synset": "leveret.n.01", "name": "leveret"}, - {"id": 4168, "synset": "european_hare.n.01", "name": "European_hare"}, - {"id": 4169, "synset": "jackrabbit.n.01", "name": "jackrabbit"}, - {"id": 4170, "synset": "white-tailed_jackrabbit.n.01", "name": "white-tailed_jackrabbit"}, - {"id": 4171, "synset": "blacktail_jackrabbit.n.01", "name": "blacktail_jackrabbit"}, - {"id": 4172, "synset": "polar_hare.n.01", "name": "polar_hare"}, - {"id": 4173, "synset": "snowshoe_hare.n.01", "name": "snowshoe_hare"}, - {"id": 4174, "synset": "belgian_hare.n.01", "name": "Belgian_hare"}, - {"id": 4175, "synset": "angora.n.03", "name": "Angora"}, - {"id": 4176, "synset": "pika.n.01", "name": "pika"}, - {"id": 4177, "synset": "little_chief_hare.n.01", "name": "little_chief_hare"}, - {"id": 4178, "synset": "collared_pika.n.01", "name": "collared_pika"}, - {"id": 4179, "synset": "mouse.n.01", "name": "mouse"}, - {"id": 4180, "synset": "pocket_rat.n.01", "name": "pocket_rat"}, - {"id": 4181, "synset": "murine.n.01", "name": "murine"}, - {"id": 4182, "synset": "house_mouse.n.01", "name": "house_mouse"}, - {"id": 4183, "synset": "harvest_mouse.n.02", "name": "harvest_mouse"}, - {"id": 4184, "synset": "field_mouse.n.02", "name": "field_mouse"}, - {"id": 4185, "synset": "nude_mouse.n.01", "name": "nude_mouse"}, - {"id": 4186, "synset": "european_wood_mouse.n.01", "name": "European_wood_mouse"}, - {"id": 4187, "synset": "brown_rat.n.01", "name": "brown_rat"}, - {"id": 4188, "synset": "wharf_rat.n.02", "name": "wharf_rat"}, - {"id": 4189, "synset": "sewer_rat.n.01", "name": "sewer_rat"}, - {"id": 4190, "synset": "black_rat.n.01", "name": "black_rat"}, - {"id": 4191, "synset": "bandicoot_rat.n.01", "name": "bandicoot_rat"}, - {"id": 4192, "synset": "jerboa_rat.n.01", "name": "jerboa_rat"}, - {"id": 4193, "synset": "kangaroo_mouse.n.02", "name": "kangaroo_mouse"}, - {"id": 4194, "synset": "water_rat.n.03", "name": "water_rat"}, - {"id": 4195, "synset": "beaver_rat.n.01", "name": "beaver_rat"}, - {"id": 4196, "synset": "new_world_mouse.n.01", "name": "New_World_mouse"}, - {"id": 4197, "synset": "american_harvest_mouse.n.01", "name": "American_harvest_mouse"}, - {"id": 4198, "synset": "wood_mouse.n.01", "name": "wood_mouse"}, - {"id": 4199, "synset": "white-footed_mouse.n.01", "name": "white-footed_mouse"}, - {"id": 4200, "synset": "deer_mouse.n.01", "name": "deer_mouse"}, - {"id": 4201, "synset": "cactus_mouse.n.01", "name": "cactus_mouse"}, - {"id": 4202, "synset": "cotton_mouse.n.01", "name": "cotton_mouse"}, - {"id": 4203, "synset": "pygmy_mouse.n.01", "name": "pygmy_mouse"}, - {"id": 4204, "synset": "grasshopper_mouse.n.01", "name": "grasshopper_mouse"}, - {"id": 4205, "synset": "muskrat.n.02", "name": "muskrat"}, - {"id": 4206, "synset": "round-tailed_muskrat.n.01", "name": "round-tailed_muskrat"}, - {"id": 4207, "synset": "cotton_rat.n.01", "name": "cotton_rat"}, - {"id": 4208, "synset": "wood_rat.n.01", "name": "wood_rat"}, - {"id": 4209, "synset": "dusky-footed_wood_rat.n.01", "name": "dusky-footed_wood_rat"}, - {"id": 4210, "synset": "vole.n.01", "name": "vole"}, - {"id": 4211, "synset": "packrat.n.02", "name": "packrat"}, - {"id": 4212, "synset": "dusky-footed_woodrat.n.01", "name": "dusky-footed_woodrat"}, - {"id": 4213, "synset": "eastern_woodrat.n.01", "name": "eastern_woodrat"}, - {"id": 4214, "synset": "rice_rat.n.01", "name": "rice_rat"}, - {"id": 4215, "synset": "pine_vole.n.01", "name": "pine_vole"}, - {"id": 4216, "synset": "meadow_vole.n.01", "name": "meadow_vole"}, - {"id": 4217, "synset": "water_vole.n.02", "name": "water_vole"}, - {"id": 4218, "synset": "prairie_vole.n.01", "name": "prairie_vole"}, - {"id": 4219, "synset": "water_vole.n.01", "name": "water_vole"}, - {"id": 4220, "synset": "red-backed_mouse.n.01", "name": "red-backed_mouse"}, - {"id": 4221, "synset": "phenacomys.n.01", "name": "phenacomys"}, - {"id": 4222, "synset": "eurasian_hamster.n.01", "name": "Eurasian_hamster"}, - {"id": 4223, "synset": "golden_hamster.n.01", "name": "golden_hamster"}, - {"id": 4224, "synset": "gerbil.n.01", "name": "gerbil"}, - {"id": 4225, "synset": "jird.n.01", "name": "jird"}, - {"id": 4226, "synset": "tamarisk_gerbil.n.01", "name": "tamarisk_gerbil"}, - {"id": 4227, "synset": "sand_rat.n.02", "name": "sand_rat"}, - {"id": 4228, "synset": "lemming.n.01", "name": "lemming"}, - {"id": 4229, "synset": "european_lemming.n.01", "name": "European_lemming"}, - {"id": 4230, "synset": "brown_lemming.n.01", "name": "brown_lemming"}, - {"id": 4231, "synset": "grey_lemming.n.01", "name": "grey_lemming"}, - {"id": 4232, "synset": "pied_lemming.n.01", "name": "pied_lemming"}, - { - "id": 4233, - "synset": "hudson_bay_collared_lemming.n.01", - "name": "Hudson_bay_collared_lemming", - }, - {"id": 4234, "synset": "southern_bog_lemming.n.01", "name": "southern_bog_lemming"}, - {"id": 4235, "synset": "northern_bog_lemming.n.01", "name": "northern_bog_lemming"}, - {"id": 4236, "synset": "porcupine.n.01", "name": "porcupine"}, - {"id": 4237, "synset": "old_world_porcupine.n.01", "name": "Old_World_porcupine"}, - {"id": 4238, "synset": "brush-tailed_porcupine.n.01", "name": "brush-tailed_porcupine"}, - {"id": 4239, "synset": "long-tailed_porcupine.n.01", "name": "long-tailed_porcupine"}, - {"id": 4240, "synset": "new_world_porcupine.n.01", "name": "New_World_porcupine"}, - {"id": 4241, "synset": "canada_porcupine.n.01", "name": "Canada_porcupine"}, - {"id": 4242, "synset": "pocket_mouse.n.01", "name": "pocket_mouse"}, - {"id": 4243, "synset": "silky_pocket_mouse.n.01", "name": "silky_pocket_mouse"}, - {"id": 4244, "synset": "plains_pocket_mouse.n.01", "name": "plains_pocket_mouse"}, - {"id": 4245, "synset": "hispid_pocket_mouse.n.01", "name": "hispid_pocket_mouse"}, - {"id": 4246, "synset": "mexican_pocket_mouse.n.01", "name": "Mexican_pocket_mouse"}, - {"id": 4247, "synset": "kangaroo_rat.n.01", "name": "kangaroo_rat"}, - {"id": 4248, "synset": "ord_kangaroo_rat.n.01", "name": "Ord_kangaroo_rat"}, - {"id": 4249, "synset": "kangaroo_mouse.n.01", "name": "kangaroo_mouse"}, - {"id": 4250, "synset": "jumping_mouse.n.01", "name": "jumping_mouse"}, - {"id": 4251, "synset": "meadow_jumping_mouse.n.01", "name": "meadow_jumping_mouse"}, - {"id": 4252, "synset": "jerboa.n.01", "name": "jerboa"}, - {"id": 4253, "synset": "typical_jerboa.n.01", "name": "typical_jerboa"}, - {"id": 4254, "synset": "jaculus_jaculus.n.01", "name": "Jaculus_jaculus"}, - {"id": 4255, "synset": "dormouse.n.01", "name": "dormouse"}, - {"id": 4256, "synset": "loir.n.01", "name": "loir"}, - {"id": 4257, "synset": "hazel_mouse.n.01", "name": "hazel_mouse"}, - {"id": 4258, "synset": "lerot.n.01", "name": "lerot"}, - {"id": 4259, "synset": "gopher.n.04", "name": "gopher"}, - {"id": 4260, "synset": "plains_pocket_gopher.n.01", "name": "plains_pocket_gopher"}, - {"id": 4261, "synset": "southeastern_pocket_gopher.n.01", "name": "southeastern_pocket_gopher"}, - {"id": 4262, "synset": "valley_pocket_gopher.n.01", "name": "valley_pocket_gopher"}, - {"id": 4263, "synset": "northern_pocket_gopher.n.01", "name": "northern_pocket_gopher"}, - {"id": 4264, "synset": "tree_squirrel.n.01", "name": "tree_squirrel"}, - {"id": 4265, "synset": "eastern_grey_squirrel.n.01", "name": "eastern_grey_squirrel"}, - {"id": 4266, "synset": "western_grey_squirrel.n.01", "name": "western_grey_squirrel"}, - {"id": 4267, "synset": "fox_squirrel.n.01", "name": "fox_squirrel"}, - {"id": 4268, "synset": "black_squirrel.n.01", "name": "black_squirrel"}, - {"id": 4269, "synset": "red_squirrel.n.02", "name": "red_squirrel"}, - {"id": 4270, "synset": "american_red_squirrel.n.01", "name": "American_red_squirrel"}, - {"id": 4271, "synset": "chickeree.n.01", "name": "chickeree"}, - {"id": 4272, "synset": "antelope_squirrel.n.01", "name": "antelope_squirrel"}, - {"id": 4273, "synset": "ground_squirrel.n.02", "name": "ground_squirrel"}, - {"id": 4274, "synset": "mantled_ground_squirrel.n.01", "name": "mantled_ground_squirrel"}, - {"id": 4275, "synset": "suslik.n.01", "name": "suslik"}, - {"id": 4276, "synset": "flickertail.n.01", "name": "flickertail"}, - {"id": 4277, "synset": "rock_squirrel.n.01", "name": "rock_squirrel"}, - {"id": 4278, "synset": "arctic_ground_squirrel.n.01", "name": "Arctic_ground_squirrel"}, - {"id": 4279, "synset": "prairie_dog.n.01", "name": "prairie_dog"}, - {"id": 4280, "synset": "blacktail_prairie_dog.n.01", "name": "blacktail_prairie_dog"}, - {"id": 4281, "synset": "whitetail_prairie_dog.n.01", "name": "whitetail_prairie_dog"}, - {"id": 4282, "synset": "eastern_chipmunk.n.01", "name": "eastern_chipmunk"}, - {"id": 4283, "synset": "chipmunk.n.01", "name": "chipmunk"}, - {"id": 4284, "synset": "baronduki.n.01", "name": "baronduki"}, - {"id": 4285, "synset": "american_flying_squirrel.n.01", "name": "American_flying_squirrel"}, - {"id": 4286, "synset": "southern_flying_squirrel.n.01", "name": "southern_flying_squirrel"}, - {"id": 4287, "synset": "northern_flying_squirrel.n.01", "name": "northern_flying_squirrel"}, - {"id": 4288, "synset": "marmot.n.01", "name": "marmot"}, - {"id": 4289, "synset": "groundhog.n.01", "name": "groundhog"}, - {"id": 4290, "synset": "hoary_marmot.n.01", "name": "hoary_marmot"}, - {"id": 4291, "synset": "yellowbelly_marmot.n.01", "name": "yellowbelly_marmot"}, - {"id": 4292, "synset": "asiatic_flying_squirrel.n.01", "name": "Asiatic_flying_squirrel"}, - {"id": 4293, "synset": "beaver.n.07", "name": "beaver"}, - {"id": 4294, "synset": "old_world_beaver.n.01", "name": "Old_World_beaver"}, - {"id": 4295, "synset": "new_world_beaver.n.01", "name": "New_World_beaver"}, - {"id": 4296, "synset": "mountain_beaver.n.01", "name": "mountain_beaver"}, - {"id": 4297, "synset": "cavy.n.01", "name": "cavy"}, - {"id": 4298, "synset": "guinea_pig.n.02", "name": "guinea_pig"}, - {"id": 4299, "synset": "aperea.n.01", "name": "aperea"}, - {"id": 4300, "synset": "mara.n.02", "name": "mara"}, - {"id": 4301, "synset": "capybara.n.01", "name": "capybara"}, - {"id": 4302, "synset": "agouti.n.01", "name": "agouti"}, - {"id": 4303, "synset": "paca.n.01", "name": "paca"}, - {"id": 4304, "synset": "mountain_paca.n.01", "name": "mountain_paca"}, - {"id": 4305, "synset": "coypu.n.01", "name": "coypu"}, - {"id": 4306, "synset": "chinchilla.n.03", "name": "chinchilla"}, - {"id": 4307, "synset": "mountain_chinchilla.n.01", "name": "mountain_chinchilla"}, - {"id": 4308, "synset": "viscacha.n.01", "name": "viscacha"}, - {"id": 4309, "synset": "abrocome.n.01", "name": "abrocome"}, - {"id": 4310, "synset": "mole_rat.n.02", "name": "mole_rat"}, - {"id": 4311, "synset": "mole_rat.n.01", "name": "mole_rat"}, - {"id": 4312, "synset": "sand_rat.n.01", "name": "sand_rat"}, - {"id": 4313, "synset": "naked_mole_rat.n.01", "name": "naked_mole_rat"}, - {"id": 4314, "synset": "queen.n.09", "name": "queen"}, - {"id": 4315, "synset": "damaraland_mole_rat.n.01", "name": "Damaraland_mole_rat"}, - {"id": 4316, "synset": "ungulata.n.01", "name": "Ungulata"}, - {"id": 4317, "synset": "ungulate.n.01", "name": "ungulate"}, - {"id": 4318, "synset": "unguiculate.n.01", "name": "unguiculate"}, - {"id": 4319, "synset": "dinoceras.n.01", "name": "dinoceras"}, - {"id": 4320, "synset": "hyrax.n.01", "name": "hyrax"}, - {"id": 4321, "synset": "rock_hyrax.n.01", "name": "rock_hyrax"}, - {"id": 4322, "synset": "odd-toed_ungulate.n.01", "name": "odd-toed_ungulate"}, - {"id": 4323, "synset": "equine.n.01", "name": "equine"}, - {"id": 4324, "synset": "roan.n.02", "name": "roan"}, - {"id": 4325, "synset": "stablemate.n.01", "name": "stablemate"}, - {"id": 4326, "synset": "gee-gee.n.01", "name": "gee-gee"}, - {"id": 4327, "synset": "eohippus.n.01", "name": "eohippus"}, - {"id": 4328, "synset": "filly.n.01", "name": "filly"}, - {"id": 4329, "synset": "colt.n.01", "name": "colt"}, - {"id": 4330, "synset": "male_horse.n.01", "name": "male_horse"}, - {"id": 4331, "synset": "ridgeling.n.01", "name": "ridgeling"}, - {"id": 4332, "synset": "stallion.n.01", "name": "stallion"}, - {"id": 4333, "synset": "stud.n.04", "name": "stud"}, - {"id": 4334, "synset": "gelding.n.01", "name": "gelding"}, - {"id": 4335, "synset": "mare.n.01", "name": "mare"}, - {"id": 4336, "synset": "broodmare.n.01", "name": "broodmare"}, - {"id": 4337, "synset": "saddle_horse.n.01", "name": "saddle_horse"}, - {"id": 4338, "synset": "remount.n.01", "name": "remount"}, - {"id": 4339, "synset": "palfrey.n.01", "name": "palfrey"}, - {"id": 4340, "synset": "warhorse.n.03", "name": "warhorse"}, - {"id": 4341, "synset": "cavalry_horse.n.01", "name": "cavalry_horse"}, - {"id": 4342, "synset": "charger.n.01", "name": "charger"}, - {"id": 4343, "synset": "steed.n.01", "name": "steed"}, - {"id": 4344, "synset": "prancer.n.01", "name": "prancer"}, - {"id": 4345, "synset": "hack.n.08", "name": "hack"}, - {"id": 4346, "synset": "cow_pony.n.01", "name": "cow_pony"}, - {"id": 4347, "synset": "quarter_horse.n.01", "name": "quarter_horse"}, - {"id": 4348, "synset": "morgan.n.06", "name": "Morgan"}, - {"id": 4349, "synset": "tennessee_walker.n.01", "name": "Tennessee_walker"}, - {"id": 4350, "synset": "american_saddle_horse.n.01", "name": "American_saddle_horse"}, - {"id": 4351, "synset": "appaloosa.n.01", "name": "Appaloosa"}, - {"id": 4352, "synset": "arabian.n.02", "name": "Arabian"}, - {"id": 4353, "synset": "lippizan.n.01", "name": "Lippizan"}, - {"id": 4354, "synset": "pony.n.01", "name": "pony"}, - {"id": 4355, "synset": "polo_pony.n.01", "name": "polo_pony"}, - {"id": 4356, "synset": "mustang.n.01", "name": "mustang"}, - {"id": 4357, "synset": "bronco.n.01", "name": "bronco"}, - {"id": 4358, "synset": "bucking_bronco.n.01", "name": "bucking_bronco"}, - {"id": 4359, "synset": "buckskin.n.01", "name": "buckskin"}, - {"id": 4360, "synset": "crowbait.n.01", "name": "crowbait"}, - {"id": 4361, "synset": "dun.n.01", "name": "dun"}, - {"id": 4362, "synset": "grey.n.07", "name": "grey"}, - {"id": 4363, "synset": "wild_horse.n.01", "name": "wild_horse"}, - {"id": 4364, "synset": "tarpan.n.01", "name": "tarpan"}, - {"id": 4365, "synset": "przewalski's_horse.n.01", "name": "Przewalski's_horse"}, - {"id": 4366, "synset": "cayuse.n.01", "name": "cayuse"}, - {"id": 4367, "synset": "hack.n.07", "name": "hack"}, - {"id": 4368, "synset": "hack.n.06", "name": "hack"}, - {"id": 4369, "synset": "plow_horse.n.01", "name": "plow_horse"}, - {"id": 4370, "synset": "shetland_pony.n.01", "name": "Shetland_pony"}, - {"id": 4371, "synset": "welsh_pony.n.01", "name": "Welsh_pony"}, - {"id": 4372, "synset": "exmoor.n.02", "name": "Exmoor"}, - {"id": 4373, "synset": "racehorse.n.01", "name": "racehorse"}, - {"id": 4374, "synset": "thoroughbred.n.02", "name": "thoroughbred"}, - {"id": 4375, "synset": "steeplechaser.n.01", "name": "steeplechaser"}, - {"id": 4376, "synset": "racer.n.03", "name": "racer"}, - {"id": 4377, "synset": "finisher.n.06", "name": "finisher"}, - {"id": 4378, "synset": "pony.n.02", "name": "pony"}, - {"id": 4379, "synset": "yearling.n.02", "name": "yearling"}, - {"id": 4380, "synset": "dark_horse.n.02", "name": "dark_horse"}, - {"id": 4381, "synset": "mudder.n.01", "name": "mudder"}, - {"id": 4382, "synset": "nonstarter.n.02", "name": "nonstarter"}, - {"id": 4383, "synset": "stalking-horse.n.04", "name": "stalking-horse"}, - {"id": 4384, "synset": "harness_horse.n.01", "name": "harness_horse"}, - {"id": 4385, "synset": "cob.n.02", "name": "cob"}, - {"id": 4386, "synset": "hackney.n.02", "name": "hackney"}, - {"id": 4387, "synset": "workhorse.n.02", "name": "workhorse"}, - {"id": 4388, "synset": "draft_horse.n.01", "name": "draft_horse"}, - {"id": 4389, "synset": "packhorse.n.01", "name": "packhorse"}, - {"id": 4390, "synset": "carthorse.n.01", "name": "carthorse"}, - {"id": 4391, "synset": "clydesdale.n.01", "name": "Clydesdale"}, - {"id": 4392, "synset": "percheron.n.01", "name": "Percheron"}, - {"id": 4393, "synset": "farm_horse.n.01", "name": "farm_horse"}, - {"id": 4394, "synset": "shire.n.02", "name": "shire"}, - {"id": 4395, "synset": "pole_horse.n.02", "name": "pole_horse"}, - {"id": 4396, "synset": "post_horse.n.01", "name": "post_horse"}, - {"id": 4397, "synset": "coach_horse.n.01", "name": "coach_horse"}, - {"id": 4398, "synset": "pacer.n.02", "name": "pacer"}, - {"id": 4399, "synset": "pacer.n.01", "name": "pacer"}, - {"id": 4400, "synset": "trotting_horse.n.01", "name": "trotting_horse"}, - {"id": 4401, "synset": "pole_horse.n.01", "name": "pole_horse"}, - {"id": 4402, "synset": "stepper.n.03", "name": "stepper"}, - {"id": 4403, "synset": "chestnut.n.06", "name": "chestnut"}, - {"id": 4404, "synset": "liver_chestnut.n.01", "name": "liver_chestnut"}, - {"id": 4405, "synset": "bay.n.07", "name": "bay"}, - {"id": 4406, "synset": "sorrel.n.05", "name": "sorrel"}, - {"id": 4407, "synset": "palomino.n.01", "name": "palomino"}, - {"id": 4408, "synset": "pinto.n.01", "name": "pinto"}, - {"id": 4409, "synset": "ass.n.03", "name": "ass"}, - {"id": 4410, "synset": "burro.n.01", "name": "burro"}, - {"id": 4411, "synset": "moke.n.01", "name": "moke"}, - {"id": 4412, "synset": "jack.n.12", "name": "jack"}, - {"id": 4413, "synset": "jennet.n.01", "name": "jennet"}, - {"id": 4414, "synset": "mule.n.01", "name": "mule"}, - {"id": 4415, "synset": "hinny.n.01", "name": "hinny"}, - {"id": 4416, "synset": "wild_ass.n.01", "name": "wild_ass"}, - {"id": 4417, "synset": "african_wild_ass.n.01", "name": "African_wild_ass"}, - {"id": 4418, "synset": "kiang.n.01", "name": "kiang"}, - {"id": 4419, "synset": "onager.n.02", "name": "onager"}, - {"id": 4420, "synset": "chigetai.n.01", "name": "chigetai"}, - {"id": 4421, "synset": "common_zebra.n.01", "name": "common_zebra"}, - {"id": 4422, "synset": "mountain_zebra.n.01", "name": "mountain_zebra"}, - {"id": 4423, "synset": "grevy's_zebra.n.01", "name": "grevy's_zebra"}, - {"id": 4424, "synset": "quagga.n.01", "name": "quagga"}, - {"id": 4425, "synset": "indian_rhinoceros.n.01", "name": "Indian_rhinoceros"}, - {"id": 4426, "synset": "woolly_rhinoceros.n.01", "name": "woolly_rhinoceros"}, - {"id": 4427, "synset": "white_rhinoceros.n.01", "name": "white_rhinoceros"}, - {"id": 4428, "synset": "black_rhinoceros.n.01", "name": "black_rhinoceros"}, - {"id": 4429, "synset": "tapir.n.01", "name": "tapir"}, - {"id": 4430, "synset": "new_world_tapir.n.01", "name": "New_World_tapir"}, - {"id": 4431, "synset": "malayan_tapir.n.01", "name": "Malayan_tapir"}, - {"id": 4432, "synset": "even-toed_ungulate.n.01", "name": "even-toed_ungulate"}, - {"id": 4433, "synset": "swine.n.01", "name": "swine"}, - {"id": 4434, "synset": "piglet.n.01", "name": "piglet"}, - {"id": 4435, "synset": "sucking_pig.n.01", "name": "sucking_pig"}, - {"id": 4436, "synset": "porker.n.01", "name": "porker"}, - {"id": 4437, "synset": "boar.n.02", "name": "boar"}, - {"id": 4438, "synset": "sow.n.01", "name": "sow"}, - {"id": 4439, "synset": "razorback.n.01", "name": "razorback"}, - {"id": 4440, "synset": "wild_boar.n.01", "name": "wild_boar"}, - {"id": 4441, "synset": "babirusa.n.01", "name": "babirusa"}, - {"id": 4442, "synset": "warthog.n.01", "name": "warthog"}, - {"id": 4443, "synset": "peccary.n.01", "name": "peccary"}, - {"id": 4444, "synset": "collared_peccary.n.01", "name": "collared_peccary"}, - {"id": 4445, "synset": "white-lipped_peccary.n.01", "name": "white-lipped_peccary"}, - {"id": 4446, "synset": "ruminant.n.01", "name": "ruminant"}, - {"id": 4447, "synset": "bovid.n.01", "name": "bovid"}, - {"id": 4448, "synset": "bovine.n.01", "name": "bovine"}, - {"id": 4449, "synset": "ox.n.02", "name": "ox"}, - {"id": 4450, "synset": "cattle.n.01", "name": "cattle"}, - {"id": 4451, "synset": "ox.n.01", "name": "ox"}, - {"id": 4452, "synset": "stirk.n.01", "name": "stirk"}, - {"id": 4453, "synset": "bullock.n.02", "name": "bullock"}, - {"id": 4454, "synset": "bull.n.01", "name": "bull"}, - {"id": 4455, "synset": "cow.n.01", "name": "cow"}, - {"id": 4456, "synset": "heifer.n.01", "name": "heifer"}, - {"id": 4457, "synset": "bullock.n.01", "name": "bullock"}, - {"id": 4458, "synset": "dogie.n.01", "name": "dogie"}, - {"id": 4459, "synset": "maverick.n.02", "name": "maverick"}, - {"id": 4460, "synset": "longhorn.n.01", "name": "longhorn"}, - {"id": 4461, "synset": "brahman.n.04", "name": "Brahman"}, - {"id": 4462, "synset": "zebu.n.01", "name": "zebu"}, - {"id": 4463, "synset": "aurochs.n.02", "name": "aurochs"}, - {"id": 4464, "synset": "yak.n.02", "name": "yak"}, - {"id": 4465, "synset": "banteng.n.01", "name": "banteng"}, - {"id": 4466, "synset": "welsh.n.03", "name": "Welsh"}, - {"id": 4467, "synset": "red_poll.n.01", "name": "red_poll"}, - {"id": 4468, "synset": "santa_gertrudis.n.01", "name": "Santa_Gertrudis"}, - {"id": 4469, "synset": "aberdeen_angus.n.01", "name": "Aberdeen_Angus"}, - {"id": 4470, "synset": "africander.n.01", "name": "Africander"}, - {"id": 4471, "synset": "dairy_cattle.n.01", "name": "dairy_cattle"}, - {"id": 4472, "synset": "ayrshire.n.01", "name": "Ayrshire"}, - {"id": 4473, "synset": "brown_swiss.n.01", "name": "Brown_Swiss"}, - {"id": 4474, "synset": "charolais.n.01", "name": "Charolais"}, - {"id": 4475, "synset": "jersey.n.05", "name": "Jersey"}, - {"id": 4476, "synset": "devon.n.02", "name": "Devon"}, - {"id": 4477, "synset": "grade.n.09", "name": "grade"}, - {"id": 4478, "synset": "durham.n.02", "name": "Durham"}, - {"id": 4479, "synset": "milking_shorthorn.n.01", "name": "milking_shorthorn"}, - {"id": 4480, "synset": "galloway.n.02", "name": "Galloway"}, - {"id": 4481, "synset": "friesian.n.01", "name": "Friesian"}, - {"id": 4482, "synset": "guernsey.n.02", "name": "Guernsey"}, - {"id": 4483, "synset": "hereford.n.01", "name": "Hereford"}, - {"id": 4484, "synset": "cattalo.n.01", "name": "cattalo"}, - {"id": 4485, "synset": "old_world_buffalo.n.01", "name": "Old_World_buffalo"}, - {"id": 4486, "synset": "water_buffalo.n.01", "name": "water_buffalo"}, - {"id": 4487, "synset": "indian_buffalo.n.01", "name": "Indian_buffalo"}, - {"id": 4488, "synset": "carabao.n.01", "name": "carabao"}, - {"id": 4489, "synset": "anoa.n.01", "name": "anoa"}, - {"id": 4490, "synset": "tamarau.n.01", "name": "tamarau"}, - {"id": 4491, "synset": "cape_buffalo.n.01", "name": "Cape_buffalo"}, - {"id": 4492, "synset": "asian_wild_ox.n.01", "name": "Asian_wild_ox"}, - {"id": 4493, "synset": "gaur.n.01", "name": "gaur"}, - {"id": 4494, "synset": "gayal.n.01", "name": "gayal"}, - {"id": 4495, "synset": "bison.n.01", "name": "bison"}, - {"id": 4496, "synset": "american_bison.n.01", "name": "American_bison"}, - {"id": 4497, "synset": "wisent.n.01", "name": "wisent"}, - {"id": 4498, "synset": "musk_ox.n.01", "name": "musk_ox"}, - {"id": 4499, "synset": "ewe.n.03", "name": "ewe"}, - {"id": 4500, "synset": "wether.n.01", "name": "wether"}, - {"id": 4501, "synset": "lambkin.n.01", "name": "lambkin"}, - {"id": 4502, "synset": "baa-lamb.n.01", "name": "baa-lamb"}, - {"id": 4503, "synset": "hog.n.02", "name": "hog"}, - {"id": 4504, "synset": "teg.n.01", "name": "teg"}, - {"id": 4505, "synset": "persian_lamb.n.02", "name": "Persian_lamb"}, - {"id": 4506, "synset": "domestic_sheep.n.01", "name": "domestic_sheep"}, - {"id": 4507, "synset": "cotswold.n.01", "name": "Cotswold"}, - {"id": 4508, "synset": "hampshire.n.02", "name": "Hampshire"}, - {"id": 4509, "synset": "lincoln.n.03", "name": "Lincoln"}, - {"id": 4510, "synset": "exmoor.n.01", "name": "Exmoor"}, - {"id": 4511, "synset": "cheviot.n.01", "name": "Cheviot"}, - {"id": 4512, "synset": "broadtail.n.02", "name": "broadtail"}, - {"id": 4513, "synset": "longwool.n.01", "name": "longwool"}, - {"id": 4514, "synset": "merino.n.01", "name": "merino"}, - {"id": 4515, "synset": "rambouillet.n.01", "name": "Rambouillet"}, - {"id": 4516, "synset": "wild_sheep.n.01", "name": "wild_sheep"}, - {"id": 4517, "synset": "argali.n.01", "name": "argali"}, - {"id": 4518, "synset": "marco_polo_sheep.n.01", "name": "Marco_Polo_sheep"}, - {"id": 4519, "synset": "urial.n.01", "name": "urial"}, - {"id": 4520, "synset": "dall_sheep.n.01", "name": "Dall_sheep"}, - {"id": 4521, "synset": "mountain_sheep.n.01", "name": "mountain_sheep"}, - {"id": 4522, "synset": "bighorn.n.02", "name": "bighorn"}, - {"id": 4523, "synset": "mouflon.n.01", "name": "mouflon"}, - {"id": 4524, "synset": "aoudad.n.01", "name": "aoudad"}, - {"id": 4525, "synset": "kid.n.05", "name": "kid"}, - {"id": 4526, "synset": "billy.n.02", "name": "billy"}, - {"id": 4527, "synset": "nanny.n.02", "name": "nanny"}, - {"id": 4528, "synset": "domestic_goat.n.01", "name": "domestic_goat"}, - {"id": 4529, "synset": "cashmere_goat.n.01", "name": "Cashmere_goat"}, - {"id": 4530, "synset": "angora.n.02", "name": "Angora"}, - {"id": 4531, "synset": "wild_goat.n.01", "name": "wild_goat"}, - {"id": 4532, "synset": "bezoar_goat.n.01", "name": "bezoar_goat"}, - {"id": 4533, "synset": "markhor.n.01", "name": "markhor"}, - {"id": 4534, "synset": "ibex.n.01", "name": "ibex"}, - {"id": 4535, "synset": "goat_antelope.n.01", "name": "goat_antelope"}, - {"id": 4536, "synset": "mountain_goat.n.01", "name": "mountain_goat"}, - {"id": 4537, "synset": "goral.n.01", "name": "goral"}, - {"id": 4538, "synset": "serow.n.01", "name": "serow"}, - {"id": 4539, "synset": "chamois.n.02", "name": "chamois"}, - {"id": 4540, "synset": "takin.n.01", "name": "takin"}, - {"id": 4541, "synset": "antelope.n.01", "name": "antelope"}, - {"id": 4542, "synset": "blackbuck.n.01", "name": "blackbuck"}, - {"id": 4543, "synset": "gerenuk.n.01", "name": "gerenuk"}, - {"id": 4544, "synset": "addax.n.01", "name": "addax"}, - {"id": 4545, "synset": "gnu.n.01", "name": "gnu"}, - {"id": 4546, "synset": "dik-dik.n.01", "name": "dik-dik"}, - {"id": 4547, "synset": "hartebeest.n.01", "name": "hartebeest"}, - {"id": 4548, "synset": "sassaby.n.01", "name": "sassaby"}, - {"id": 4549, "synset": "impala.n.01", "name": "impala"}, - {"id": 4550, "synset": "thomson's_gazelle.n.01", "name": "Thomson's_gazelle"}, - {"id": 4551, "synset": "gazella_subgutturosa.n.01", "name": "Gazella_subgutturosa"}, - {"id": 4552, "synset": "springbok.n.01", "name": "springbok"}, - {"id": 4553, "synset": "bongo.n.02", "name": "bongo"}, - {"id": 4554, "synset": "kudu.n.01", "name": "kudu"}, - {"id": 4555, "synset": "greater_kudu.n.01", "name": "greater_kudu"}, - {"id": 4556, "synset": "lesser_kudu.n.01", "name": "lesser_kudu"}, - {"id": 4557, "synset": "harnessed_antelope.n.01", "name": "harnessed_antelope"}, - {"id": 4558, "synset": "nyala.n.02", "name": "nyala"}, - {"id": 4559, "synset": "mountain_nyala.n.01", "name": "mountain_nyala"}, - {"id": 4560, "synset": "bushbuck.n.01", "name": "bushbuck"}, - {"id": 4561, "synset": "nilgai.n.01", "name": "nilgai"}, - {"id": 4562, "synset": "sable_antelope.n.01", "name": "sable_antelope"}, - {"id": 4563, "synset": "saiga.n.01", "name": "saiga"}, - {"id": 4564, "synset": "steenbok.n.01", "name": "steenbok"}, - {"id": 4565, "synset": "eland.n.01", "name": "eland"}, - {"id": 4566, "synset": "common_eland.n.01", "name": "common_eland"}, - {"id": 4567, "synset": "giant_eland.n.01", "name": "giant_eland"}, - {"id": 4568, "synset": "kob.n.01", "name": "kob"}, - {"id": 4569, "synset": "lechwe.n.01", "name": "lechwe"}, - {"id": 4570, "synset": "waterbuck.n.01", "name": "waterbuck"}, - {"id": 4571, "synset": "puku.n.01", "name": "puku"}, - {"id": 4572, "synset": "oryx.n.01", "name": "oryx"}, - {"id": 4573, "synset": "gemsbok.n.01", "name": "gemsbok"}, - {"id": 4574, "synset": "forest_goat.n.01", "name": "forest_goat"}, - {"id": 4575, "synset": "pronghorn.n.01", "name": "pronghorn"}, - {"id": 4576, "synset": "stag.n.02", "name": "stag"}, - {"id": 4577, "synset": "royal.n.02", "name": "royal"}, - {"id": 4578, "synset": "pricket.n.02", "name": "pricket"}, - {"id": 4579, "synset": "fawn.n.02", "name": "fawn"}, - {"id": 4580, "synset": "red_deer.n.01", "name": "red_deer"}, - {"id": 4581, "synset": "hart.n.03", "name": "hart"}, - {"id": 4582, "synset": "hind.n.02", "name": "hind"}, - {"id": 4583, "synset": "brocket.n.02", "name": "brocket"}, - {"id": 4584, "synset": "sambar.n.01", "name": "sambar"}, - {"id": 4585, "synset": "wapiti.n.01", "name": "wapiti"}, - {"id": 4586, "synset": "japanese_deer.n.01", "name": "Japanese_deer"}, - {"id": 4587, "synset": "virginia_deer.n.01", "name": "Virginia_deer"}, - {"id": 4588, "synset": "mule_deer.n.01", "name": "mule_deer"}, - {"id": 4589, "synset": "black-tailed_deer.n.01", "name": "black-tailed_deer"}, - {"id": 4590, "synset": "fallow_deer.n.01", "name": "fallow_deer"}, - {"id": 4591, "synset": "roe_deer.n.01", "name": "roe_deer"}, - {"id": 4592, "synset": "roebuck.n.01", "name": "roebuck"}, - {"id": 4593, "synset": "caribou.n.01", "name": "caribou"}, - {"id": 4594, "synset": "woodland_caribou.n.01", "name": "woodland_caribou"}, - {"id": 4595, "synset": "barren_ground_caribou.n.01", "name": "barren_ground_caribou"}, - {"id": 4596, "synset": "brocket.n.01", "name": "brocket"}, - {"id": 4597, "synset": "muntjac.n.01", "name": "muntjac"}, - {"id": 4598, "synset": "musk_deer.n.01", "name": "musk_deer"}, - {"id": 4599, "synset": "pere_david's_deer.n.01", "name": "pere_david's_deer"}, - {"id": 4600, "synset": "chevrotain.n.01", "name": "chevrotain"}, - {"id": 4601, "synset": "kanchil.n.01", "name": "kanchil"}, - {"id": 4602, "synset": "napu.n.01", "name": "napu"}, - {"id": 4603, "synset": "water_chevrotain.n.01", "name": "water_chevrotain"}, - {"id": 4604, "synset": "arabian_camel.n.01", "name": "Arabian_camel"}, - {"id": 4605, "synset": "bactrian_camel.n.01", "name": "Bactrian_camel"}, - {"id": 4606, "synset": "llama.n.01", "name": "llama"}, - {"id": 4607, "synset": "domestic_llama.n.01", "name": "domestic_llama"}, - {"id": 4608, "synset": "guanaco.n.01", "name": "guanaco"}, - {"id": 4609, "synset": "alpaca.n.03", "name": "alpaca"}, - {"id": 4610, "synset": "vicuna.n.03", "name": "vicuna"}, - {"id": 4611, "synset": "okapi.n.01", "name": "okapi"}, - {"id": 4612, "synset": "musteline_mammal.n.01", "name": "musteline_mammal"}, - {"id": 4613, "synset": "weasel.n.02", "name": "weasel"}, - {"id": 4614, "synset": "ermine.n.02", "name": "ermine"}, - {"id": 4615, "synset": "stoat.n.01", "name": "stoat"}, - {"id": 4616, "synset": "new_world_least_weasel.n.01", "name": "New_World_least_weasel"}, - {"id": 4617, "synset": "old_world_least_weasel.n.01", "name": "Old_World_least_weasel"}, - {"id": 4618, "synset": "longtail_weasel.n.01", "name": "longtail_weasel"}, - {"id": 4619, "synset": "mink.n.03", "name": "mink"}, - {"id": 4620, "synset": "american_mink.n.01", "name": "American_mink"}, - {"id": 4621, "synset": "polecat.n.02", "name": "polecat"}, - {"id": 4622, "synset": "black-footed_ferret.n.01", "name": "black-footed_ferret"}, - {"id": 4623, "synset": "muishond.n.01", "name": "muishond"}, - {"id": 4624, "synset": "snake_muishond.n.01", "name": "snake_muishond"}, - {"id": 4625, "synset": "striped_muishond.n.01", "name": "striped_muishond"}, - {"id": 4626, "synset": "otter.n.02", "name": "otter"}, - {"id": 4627, "synset": "river_otter.n.01", "name": "river_otter"}, - {"id": 4628, "synset": "eurasian_otter.n.01", "name": "Eurasian_otter"}, - {"id": 4629, "synset": "sea_otter.n.01", "name": "sea_otter"}, - {"id": 4630, "synset": "skunk.n.04", "name": "skunk"}, - {"id": 4631, "synset": "striped_skunk.n.01", "name": "striped_skunk"}, - {"id": 4632, "synset": "hooded_skunk.n.01", "name": "hooded_skunk"}, - {"id": 4633, "synset": "hog-nosed_skunk.n.01", "name": "hog-nosed_skunk"}, - {"id": 4634, "synset": "spotted_skunk.n.01", "name": "spotted_skunk"}, - {"id": 4635, "synset": "badger.n.02", "name": "badger"}, - {"id": 4636, "synset": "american_badger.n.01", "name": "American_badger"}, - {"id": 4637, "synset": "eurasian_badger.n.01", "name": "Eurasian_badger"}, - {"id": 4638, "synset": "ratel.n.01", "name": "ratel"}, - {"id": 4639, "synset": "ferret_badger.n.01", "name": "ferret_badger"}, - {"id": 4640, "synset": "hog_badger.n.01", "name": "hog_badger"}, - {"id": 4641, "synset": "wolverine.n.03", "name": "wolverine"}, - {"id": 4642, "synset": "glutton.n.02", "name": "glutton"}, - {"id": 4643, "synset": "grison.n.01", "name": "grison"}, - {"id": 4644, "synset": "marten.n.01", "name": "marten"}, - {"id": 4645, "synset": "pine_marten.n.01", "name": "pine_marten"}, - {"id": 4646, "synset": "sable.n.05", "name": "sable"}, - {"id": 4647, "synset": "american_marten.n.01", "name": "American_marten"}, - {"id": 4648, "synset": "stone_marten.n.01", "name": "stone_marten"}, - {"id": 4649, "synset": "fisher.n.02", "name": "fisher"}, - {"id": 4650, "synset": "yellow-throated_marten.n.01", "name": "yellow-throated_marten"}, - {"id": 4651, "synset": "tayra.n.01", "name": "tayra"}, - {"id": 4652, "synset": "fictional_animal.n.01", "name": "fictional_animal"}, - {"id": 4653, "synset": "pachyderm.n.01", "name": "pachyderm"}, - {"id": 4654, "synset": "edentate.n.01", "name": "edentate"}, - {"id": 4655, "synset": "armadillo.n.01", "name": "armadillo"}, - {"id": 4656, "synset": "peba.n.01", "name": "peba"}, - {"id": 4657, "synset": "apar.n.01", "name": "apar"}, - {"id": 4658, "synset": "tatouay.n.01", "name": "tatouay"}, - {"id": 4659, "synset": "peludo.n.01", "name": "peludo"}, - {"id": 4660, "synset": "giant_armadillo.n.01", "name": "giant_armadillo"}, - {"id": 4661, "synset": "pichiciago.n.01", "name": "pichiciago"}, - {"id": 4662, "synset": "sloth.n.02", "name": "sloth"}, - {"id": 4663, "synset": "three-toed_sloth.n.01", "name": "three-toed_sloth"}, - {"id": 4664, "synset": "two-toed_sloth.n.02", "name": "two-toed_sloth"}, - {"id": 4665, "synset": "two-toed_sloth.n.01", "name": "two-toed_sloth"}, - {"id": 4666, "synset": "megatherian.n.01", "name": "megatherian"}, - {"id": 4667, "synset": "mylodontid.n.01", "name": "mylodontid"}, - {"id": 4668, "synset": "anteater.n.02", "name": "anteater"}, - {"id": 4669, "synset": "ant_bear.n.01", "name": "ant_bear"}, - {"id": 4670, "synset": "silky_anteater.n.01", "name": "silky_anteater"}, - {"id": 4671, "synset": "tamandua.n.01", "name": "tamandua"}, - {"id": 4672, "synset": "pangolin.n.01", "name": "pangolin"}, - {"id": 4673, "synset": "coronet.n.02", "name": "coronet"}, - {"id": 4674, "synset": "scapular.n.01", "name": "scapular"}, - {"id": 4675, "synset": "tadpole.n.01", "name": "tadpole"}, - {"id": 4676, "synset": "primate.n.02", "name": "primate"}, - {"id": 4677, "synset": "simian.n.01", "name": "simian"}, - {"id": 4678, "synset": "ape.n.01", "name": "ape"}, - {"id": 4679, "synset": "anthropoid.n.02", "name": "anthropoid"}, - {"id": 4680, "synset": "anthropoid_ape.n.01", "name": "anthropoid_ape"}, - {"id": 4681, "synset": "hominoid.n.01", "name": "hominoid"}, - {"id": 4682, "synset": "hominid.n.01", "name": "hominid"}, - {"id": 4683, "synset": "homo.n.02", "name": "homo"}, - {"id": 4684, "synset": "world.n.08", "name": "world"}, - {"id": 4685, "synset": "homo_erectus.n.01", "name": "Homo_erectus"}, - {"id": 4686, "synset": "pithecanthropus.n.01", "name": "Pithecanthropus"}, - {"id": 4687, "synset": "java_man.n.01", "name": "Java_man"}, - {"id": 4688, "synset": "peking_man.n.01", "name": "Peking_man"}, - {"id": 4689, "synset": "sinanthropus.n.01", "name": "Sinanthropus"}, - {"id": 4690, "synset": "homo_soloensis.n.01", "name": "Homo_soloensis"}, - {"id": 4691, "synset": "javanthropus.n.01", "name": "Javanthropus"}, - {"id": 4692, "synset": "homo_habilis.n.01", "name": "Homo_habilis"}, - {"id": 4693, "synset": "homo_sapiens.n.01", "name": "Homo_sapiens"}, - {"id": 4694, "synset": "neandertal_man.n.01", "name": "Neandertal_man"}, - {"id": 4695, "synset": "cro-magnon.n.01", "name": "Cro-magnon"}, - {"id": 4696, "synset": "homo_sapiens_sapiens.n.01", "name": "Homo_sapiens_sapiens"}, - {"id": 4697, "synset": "australopithecine.n.01", "name": "australopithecine"}, - {"id": 4698, "synset": "australopithecus_afarensis.n.01", "name": "Australopithecus_afarensis"}, - {"id": 4699, "synset": "australopithecus_africanus.n.01", "name": "Australopithecus_africanus"}, - {"id": 4700, "synset": "australopithecus_boisei.n.01", "name": "Australopithecus_boisei"}, - {"id": 4701, "synset": "zinjanthropus.n.01", "name": "Zinjanthropus"}, - {"id": 4702, "synset": "australopithecus_robustus.n.01", "name": "Australopithecus_robustus"}, - {"id": 4703, "synset": "paranthropus.n.01", "name": "Paranthropus"}, - {"id": 4704, "synset": "sivapithecus.n.01", "name": "Sivapithecus"}, - {"id": 4705, "synset": "rudapithecus.n.01", "name": "rudapithecus"}, - {"id": 4706, "synset": "proconsul.n.03", "name": "proconsul"}, - {"id": 4707, "synset": "aegyptopithecus.n.01", "name": "Aegyptopithecus"}, - {"id": 4708, "synset": "great_ape.n.01", "name": "great_ape"}, - {"id": 4709, "synset": "orangutan.n.01", "name": "orangutan"}, - {"id": 4710, "synset": "western_lowland_gorilla.n.01", "name": "western_lowland_gorilla"}, - {"id": 4711, "synset": "eastern_lowland_gorilla.n.01", "name": "eastern_lowland_gorilla"}, - {"id": 4712, "synset": "mountain_gorilla.n.01", "name": "mountain_gorilla"}, - {"id": 4713, "synset": "silverback.n.01", "name": "silverback"}, - {"id": 4714, "synset": "chimpanzee.n.01", "name": "chimpanzee"}, - {"id": 4715, "synset": "western_chimpanzee.n.01", "name": "western_chimpanzee"}, - {"id": 4716, "synset": "eastern_chimpanzee.n.01", "name": "eastern_chimpanzee"}, - {"id": 4717, "synset": "central_chimpanzee.n.01", "name": "central_chimpanzee"}, - {"id": 4718, "synset": "pygmy_chimpanzee.n.01", "name": "pygmy_chimpanzee"}, - {"id": 4719, "synset": "lesser_ape.n.01", "name": "lesser_ape"}, - {"id": 4720, "synset": "gibbon.n.02", "name": "gibbon"}, - {"id": 4721, "synset": "siamang.n.01", "name": "siamang"}, - {"id": 4722, "synset": "old_world_monkey.n.01", "name": "Old_World_monkey"}, - {"id": 4723, "synset": "guenon.n.01", "name": "guenon"}, - {"id": 4724, "synset": "talapoin.n.01", "name": "talapoin"}, - {"id": 4725, "synset": "grivet.n.01", "name": "grivet"}, - {"id": 4726, "synset": "vervet.n.01", "name": "vervet"}, - {"id": 4727, "synset": "green_monkey.n.01", "name": "green_monkey"}, - {"id": 4728, "synset": "mangabey.n.01", "name": "mangabey"}, - {"id": 4729, "synset": "patas.n.01", "name": "patas"}, - {"id": 4730, "synset": "chacma.n.01", "name": "chacma"}, - {"id": 4731, "synset": "mandrill.n.01", "name": "mandrill"}, - {"id": 4732, "synset": "drill.n.02", "name": "drill"}, - {"id": 4733, "synset": "macaque.n.01", "name": "macaque"}, - {"id": 4734, "synset": "rhesus.n.01", "name": "rhesus"}, - {"id": 4735, "synset": "bonnet_macaque.n.01", "name": "bonnet_macaque"}, - {"id": 4736, "synset": "barbary_ape.n.01", "name": "Barbary_ape"}, - {"id": 4737, "synset": "crab-eating_macaque.n.01", "name": "crab-eating_macaque"}, - {"id": 4738, "synset": "langur.n.01", "name": "langur"}, - {"id": 4739, "synset": "entellus.n.01", "name": "entellus"}, - {"id": 4740, "synset": "colobus.n.01", "name": "colobus"}, - {"id": 4741, "synset": "guereza.n.01", "name": "guereza"}, - {"id": 4742, "synset": "proboscis_monkey.n.01", "name": "proboscis_monkey"}, - {"id": 4743, "synset": "new_world_monkey.n.01", "name": "New_World_monkey"}, - {"id": 4744, "synset": "marmoset.n.01", "name": "marmoset"}, - {"id": 4745, "synset": "true_marmoset.n.01", "name": "true_marmoset"}, - {"id": 4746, "synset": "pygmy_marmoset.n.01", "name": "pygmy_marmoset"}, - {"id": 4747, "synset": "tamarin.n.01", "name": "tamarin"}, - {"id": 4748, "synset": "silky_tamarin.n.01", "name": "silky_tamarin"}, - {"id": 4749, "synset": "pinche.n.01", "name": "pinche"}, - {"id": 4750, "synset": "capuchin.n.02", "name": "capuchin"}, - {"id": 4751, "synset": "douroucouli.n.01", "name": "douroucouli"}, - {"id": 4752, "synset": "howler_monkey.n.01", "name": "howler_monkey"}, - {"id": 4753, "synset": "saki.n.03", "name": "saki"}, - {"id": 4754, "synset": "uakari.n.01", "name": "uakari"}, - {"id": 4755, "synset": "titi.n.03", "name": "titi"}, - {"id": 4756, "synset": "spider_monkey.n.01", "name": "spider_monkey"}, - {"id": 4757, "synset": "squirrel_monkey.n.01", "name": "squirrel_monkey"}, - {"id": 4758, "synset": "woolly_monkey.n.01", "name": "woolly_monkey"}, - {"id": 4759, "synset": "tree_shrew.n.01", "name": "tree_shrew"}, - {"id": 4760, "synset": "prosimian.n.01", "name": "prosimian"}, - {"id": 4761, "synset": "lemur.n.01", "name": "lemur"}, - {"id": 4762, "synset": "madagascar_cat.n.01", "name": "Madagascar_cat"}, - {"id": 4763, "synset": "aye-aye.n.01", "name": "aye-aye"}, - {"id": 4764, "synset": "slender_loris.n.01", "name": "slender_loris"}, - {"id": 4765, "synset": "slow_loris.n.01", "name": "slow_loris"}, - {"id": 4766, "synset": "potto.n.02", "name": "potto"}, - {"id": 4767, "synset": "angwantibo.n.01", "name": "angwantibo"}, - {"id": 4768, "synset": "galago.n.01", "name": "galago"}, - {"id": 4769, "synset": "indri.n.01", "name": "indri"}, - {"id": 4770, "synset": "woolly_indris.n.01", "name": "woolly_indris"}, - {"id": 4771, "synset": "tarsier.n.01", "name": "tarsier"}, - {"id": 4772, "synset": "tarsius_syrichta.n.01", "name": "Tarsius_syrichta"}, - {"id": 4773, "synset": "tarsius_glis.n.01", "name": "Tarsius_glis"}, - {"id": 4774, "synset": "flying_lemur.n.01", "name": "flying_lemur"}, - {"id": 4775, "synset": "cynocephalus_variegatus.n.01", "name": "Cynocephalus_variegatus"}, - {"id": 4776, "synset": "proboscidean.n.01", "name": "proboscidean"}, - {"id": 4777, "synset": "rogue_elephant.n.01", "name": "rogue_elephant"}, - {"id": 4778, "synset": "indian_elephant.n.01", "name": "Indian_elephant"}, - {"id": 4779, "synset": "african_elephant.n.01", "name": "African_elephant"}, - {"id": 4780, "synset": "woolly_mammoth.n.01", "name": "woolly_mammoth"}, - {"id": 4781, "synset": "columbian_mammoth.n.01", "name": "columbian_mammoth"}, - {"id": 4782, "synset": "imperial_mammoth.n.01", "name": "imperial_mammoth"}, - {"id": 4783, "synset": "mastodon.n.01", "name": "mastodon"}, - {"id": 4784, "synset": "plantigrade_mammal.n.01", "name": "plantigrade_mammal"}, - {"id": 4785, "synset": "digitigrade_mammal.n.01", "name": "digitigrade_mammal"}, - {"id": 4786, "synset": "procyonid.n.01", "name": "procyonid"}, - {"id": 4787, "synset": "raccoon.n.02", "name": "raccoon"}, - {"id": 4788, "synset": "common_raccoon.n.01", "name": "common_raccoon"}, - {"id": 4789, "synset": "crab-eating_raccoon.n.01", "name": "crab-eating_raccoon"}, - {"id": 4790, "synset": "bassarisk.n.01", "name": "bassarisk"}, - {"id": 4791, "synset": "kinkajou.n.01", "name": "kinkajou"}, - {"id": 4792, "synset": "coati.n.01", "name": "coati"}, - {"id": 4793, "synset": "lesser_panda.n.01", "name": "lesser_panda"}, - {"id": 4794, "synset": "twitterer.n.01", "name": "twitterer"}, - {"id": 4795, "synset": "fingerling.n.01", "name": "fingerling"}, - {"id": 4796, "synset": "game_fish.n.01", "name": "game_fish"}, - {"id": 4797, "synset": "food_fish.n.01", "name": "food_fish"}, - {"id": 4798, "synset": "rough_fish.n.01", "name": "rough_fish"}, - {"id": 4799, "synset": "groundfish.n.01", "name": "groundfish"}, - {"id": 4800, "synset": "young_fish.n.01", "name": "young_fish"}, - {"id": 4801, "synset": "parr.n.03", "name": "parr"}, - {"id": 4802, "synset": "mouthbreeder.n.01", "name": "mouthbreeder"}, - {"id": 4803, "synset": "spawner.n.01", "name": "spawner"}, - {"id": 4804, "synset": "barracouta.n.01", "name": "barracouta"}, - {"id": 4805, "synset": "crossopterygian.n.01", "name": "crossopterygian"}, - {"id": 4806, "synset": "coelacanth.n.01", "name": "coelacanth"}, - {"id": 4807, "synset": "lungfish.n.01", "name": "lungfish"}, - {"id": 4808, "synset": "ceratodus.n.01", "name": "ceratodus"}, - {"id": 4809, "synset": "catfish.n.03", "name": "catfish"}, - {"id": 4810, "synset": "silurid.n.01", "name": "silurid"}, - {"id": 4811, "synset": "european_catfish.n.01", "name": "European_catfish"}, - {"id": 4812, "synset": "electric_catfish.n.01", "name": "electric_catfish"}, - {"id": 4813, "synset": "bullhead.n.02", "name": "bullhead"}, - {"id": 4814, "synset": "horned_pout.n.01", "name": "horned_pout"}, - {"id": 4815, "synset": "brown_bullhead.n.01", "name": "brown_bullhead"}, - {"id": 4816, "synset": "channel_catfish.n.01", "name": "channel_catfish"}, - {"id": 4817, "synset": "blue_catfish.n.01", "name": "blue_catfish"}, - {"id": 4818, "synset": "flathead_catfish.n.01", "name": "flathead_catfish"}, - {"id": 4819, "synset": "armored_catfish.n.01", "name": "armored_catfish"}, - {"id": 4820, "synset": "sea_catfish.n.01", "name": "sea_catfish"}, - {"id": 4821, "synset": "gadoid.n.01", "name": "gadoid"}, - {"id": 4822, "synset": "cod.n.03", "name": "cod"}, - {"id": 4823, "synset": "codling.n.01", "name": "codling"}, - {"id": 4824, "synset": "atlantic_cod.n.01", "name": "Atlantic_cod"}, - {"id": 4825, "synset": "pacific_cod.n.01", "name": "Pacific_cod"}, - {"id": 4826, "synset": "whiting.n.06", "name": "whiting"}, - {"id": 4827, "synset": "burbot.n.01", "name": "burbot"}, - {"id": 4828, "synset": "haddock.n.02", "name": "haddock"}, - {"id": 4829, "synset": "pollack.n.03", "name": "pollack"}, - {"id": 4830, "synset": "hake.n.02", "name": "hake"}, - {"id": 4831, "synset": "silver_hake.n.01", "name": "silver_hake"}, - {"id": 4832, "synset": "ling.n.04", "name": "ling"}, - {"id": 4833, "synset": "cusk.n.02", "name": "cusk"}, - {"id": 4834, "synset": "grenadier.n.02", "name": "grenadier"}, - {"id": 4835, "synset": "eel.n.02", "name": "eel"}, - {"id": 4836, "synset": "elver.n.02", "name": "elver"}, - {"id": 4837, "synset": "common_eel.n.01", "name": "common_eel"}, - {"id": 4838, "synset": "tuna.n.04", "name": "tuna"}, - {"id": 4839, "synset": "moray.n.01", "name": "moray"}, - {"id": 4840, "synset": "conger.n.01", "name": "conger"}, - {"id": 4841, "synset": "teleost_fish.n.01", "name": "teleost_fish"}, - {"id": 4842, "synset": "beaked_salmon.n.01", "name": "beaked_salmon"}, - {"id": 4843, "synset": "clupeid_fish.n.01", "name": "clupeid_fish"}, - {"id": 4844, "synset": "whitebait.n.02", "name": "whitebait"}, - {"id": 4845, "synset": "brit.n.02", "name": "brit"}, - {"id": 4846, "synset": "shad.n.02", "name": "shad"}, - {"id": 4847, "synset": "common_american_shad.n.01", "name": "common_American_shad"}, - {"id": 4848, "synset": "river_shad.n.01", "name": "river_shad"}, - {"id": 4849, "synset": "allice_shad.n.01", "name": "allice_shad"}, - {"id": 4850, "synset": "alewife.n.02", "name": "alewife"}, - {"id": 4851, "synset": "menhaden.n.01", "name": "menhaden"}, - {"id": 4852, "synset": "herring.n.02", "name": "herring"}, - {"id": 4853, "synset": "atlantic_herring.n.01", "name": "Atlantic_herring"}, - {"id": 4854, "synset": "pacific_herring.n.01", "name": "Pacific_herring"}, - {"id": 4855, "synset": "sardine.n.02", "name": "sardine"}, - {"id": 4856, "synset": "sild.n.01", "name": "sild"}, - {"id": 4857, "synset": "brisling.n.02", "name": "brisling"}, - {"id": 4858, "synset": "pilchard.n.02", "name": "pilchard"}, - {"id": 4859, "synset": "pacific_sardine.n.01", "name": "Pacific_sardine"}, - {"id": 4860, "synset": "anchovy.n.02", "name": "anchovy"}, - {"id": 4861, "synset": "mediterranean_anchovy.n.01", "name": "mediterranean_anchovy"}, - {"id": 4862, "synset": "salmonid.n.01", "name": "salmonid"}, - {"id": 4863, "synset": "parr.n.02", "name": "parr"}, - {"id": 4864, "synset": "blackfish.n.02", "name": "blackfish"}, - {"id": 4865, "synset": "redfish.n.03", "name": "redfish"}, - {"id": 4866, "synset": "atlantic_salmon.n.02", "name": "Atlantic_salmon"}, - {"id": 4867, "synset": "landlocked_salmon.n.01", "name": "landlocked_salmon"}, - {"id": 4868, "synset": "sockeye.n.02", "name": "sockeye"}, - {"id": 4869, "synset": "chinook.n.05", "name": "chinook"}, - {"id": 4870, "synset": "coho.n.02", "name": "coho"}, - {"id": 4871, "synset": "trout.n.02", "name": "trout"}, - {"id": 4872, "synset": "brown_trout.n.01", "name": "brown_trout"}, - {"id": 4873, "synset": "rainbow_trout.n.02", "name": "rainbow_trout"}, - {"id": 4874, "synset": "sea_trout.n.03", "name": "sea_trout"}, - {"id": 4875, "synset": "lake_trout.n.02", "name": "lake_trout"}, - {"id": 4876, "synset": "brook_trout.n.02", "name": "brook_trout"}, - {"id": 4877, "synset": "char.n.03", "name": "char"}, - {"id": 4878, "synset": "arctic_char.n.01", "name": "Arctic_char"}, - {"id": 4879, "synset": "whitefish.n.03", "name": "whitefish"}, - {"id": 4880, "synset": "lake_whitefish.n.01", "name": "lake_whitefish"}, - {"id": 4881, "synset": "cisco.n.02", "name": "cisco"}, - {"id": 4882, "synset": "round_whitefish.n.01", "name": "round_whitefish"}, - {"id": 4883, "synset": "smelt.n.02", "name": "smelt"}, - {"id": 4884, "synset": "sparling.n.02", "name": "sparling"}, - {"id": 4885, "synset": "capelin.n.01", "name": "capelin"}, - {"id": 4886, "synset": "tarpon.n.01", "name": "tarpon"}, - {"id": 4887, "synset": "ladyfish.n.01", "name": "ladyfish"}, - {"id": 4888, "synset": "bonefish.n.01", "name": "bonefish"}, - {"id": 4889, "synset": "argentine.n.01", "name": "argentine"}, - {"id": 4890, "synset": "lanternfish.n.01", "name": "lanternfish"}, - {"id": 4891, "synset": "lizardfish.n.01", "name": "lizardfish"}, - {"id": 4892, "synset": "lancetfish.n.01", "name": "lancetfish"}, - {"id": 4893, "synset": "opah.n.01", "name": "opah"}, - {"id": 4894, "synset": "new_world_opah.n.01", "name": "New_World_opah"}, - {"id": 4895, "synset": "ribbonfish.n.02", "name": "ribbonfish"}, - {"id": 4896, "synset": "dealfish.n.01", "name": "dealfish"}, - {"id": 4897, "synset": "oarfish.n.01", "name": "oarfish"}, - {"id": 4898, "synset": "batfish.n.01", "name": "batfish"}, - {"id": 4899, "synset": "goosefish.n.01", "name": "goosefish"}, - {"id": 4900, "synset": "toadfish.n.01", "name": "toadfish"}, - {"id": 4901, "synset": "oyster_fish.n.01", "name": "oyster_fish"}, - {"id": 4902, "synset": "frogfish.n.01", "name": "frogfish"}, - {"id": 4903, "synset": "sargassum_fish.n.01", "name": "sargassum_fish"}, - {"id": 4904, "synset": "needlefish.n.01", "name": "needlefish"}, - {"id": 4905, "synset": "timucu.n.01", "name": "timucu"}, - {"id": 4906, "synset": "flying_fish.n.01", "name": "flying_fish"}, - {"id": 4907, "synset": "monoplane_flying_fish.n.01", "name": "monoplane_flying_fish"}, - {"id": 4908, "synset": "halfbeak.n.01", "name": "halfbeak"}, - {"id": 4909, "synset": "saury.n.01", "name": "saury"}, - {"id": 4910, "synset": "spiny-finned_fish.n.01", "name": "spiny-finned_fish"}, - {"id": 4911, "synset": "lingcod.n.02", "name": "lingcod"}, - {"id": 4912, "synset": "percoid_fish.n.01", "name": "percoid_fish"}, - {"id": 4913, "synset": "perch.n.07", "name": "perch"}, - {"id": 4914, "synset": "climbing_perch.n.01", "name": "climbing_perch"}, - {"id": 4915, "synset": "perch.n.06", "name": "perch"}, - {"id": 4916, "synset": "yellow_perch.n.01", "name": "yellow_perch"}, - {"id": 4917, "synset": "european_perch.n.01", "name": "European_perch"}, - {"id": 4918, "synset": "pike-perch.n.01", "name": "pike-perch"}, - {"id": 4919, "synset": "walleye.n.02", "name": "walleye"}, - {"id": 4920, "synset": "blue_pike.n.01", "name": "blue_pike"}, - {"id": 4921, "synset": "snail_darter.n.01", "name": "snail_darter"}, - {"id": 4922, "synset": "cusk-eel.n.01", "name": "cusk-eel"}, - {"id": 4923, "synset": "brotula.n.01", "name": "brotula"}, - {"id": 4924, "synset": "pearlfish.n.01", "name": "pearlfish"}, - {"id": 4925, "synset": "robalo.n.01", "name": "robalo"}, - {"id": 4926, "synset": "snook.n.01", "name": "snook"}, - {"id": 4927, "synset": "pike.n.05", "name": "pike"}, - {"id": 4928, "synset": "northern_pike.n.01", "name": "northern_pike"}, - {"id": 4929, "synset": "muskellunge.n.02", "name": "muskellunge"}, - {"id": 4930, "synset": "pickerel.n.02", "name": "pickerel"}, - {"id": 4931, "synset": "chain_pickerel.n.01", "name": "chain_pickerel"}, - {"id": 4932, "synset": "redfin_pickerel.n.01", "name": "redfin_pickerel"}, - {"id": 4933, "synset": "sunfish.n.03", "name": "sunfish"}, - {"id": 4934, "synset": "crappie.n.02", "name": "crappie"}, - {"id": 4935, "synset": "black_crappie.n.01", "name": "black_crappie"}, - {"id": 4936, "synset": "white_crappie.n.01", "name": "white_crappie"}, - {"id": 4937, "synset": "freshwater_bream.n.02", "name": "freshwater_bream"}, - {"id": 4938, "synset": "pumpkinseed.n.01", "name": "pumpkinseed"}, - {"id": 4939, "synset": "bluegill.n.01", "name": "bluegill"}, - {"id": 4940, "synset": "spotted_sunfish.n.01", "name": "spotted_sunfish"}, - {"id": 4941, "synset": "freshwater_bass.n.02", "name": "freshwater_bass"}, - {"id": 4942, "synset": "rock_bass.n.02", "name": "rock_bass"}, - {"id": 4943, "synset": "black_bass.n.02", "name": "black_bass"}, - {"id": 4944, "synset": "kentucky_black_bass.n.01", "name": "Kentucky_black_bass"}, - {"id": 4945, "synset": "smallmouth.n.01", "name": "smallmouth"}, - {"id": 4946, "synset": "largemouth.n.01", "name": "largemouth"}, - {"id": 4947, "synset": "bass.n.08", "name": "bass"}, - {"id": 4948, "synset": "serranid_fish.n.01", "name": "serranid_fish"}, - {"id": 4949, "synset": "white_perch.n.01", "name": "white_perch"}, - {"id": 4950, "synset": "yellow_bass.n.01", "name": "yellow_bass"}, - {"id": 4951, "synset": "blackmouth_bass.n.01", "name": "blackmouth_bass"}, - {"id": 4952, "synset": "rock_sea_bass.n.01", "name": "rock_sea_bass"}, - {"id": 4953, "synset": "striped_bass.n.02", "name": "striped_bass"}, - {"id": 4954, "synset": "stone_bass.n.01", "name": "stone_bass"}, - {"id": 4955, "synset": "grouper.n.02", "name": "grouper"}, - {"id": 4956, "synset": "hind.n.01", "name": "hind"}, - {"id": 4957, "synset": "rock_hind.n.01", "name": "rock_hind"}, - {"id": 4958, "synset": "creole-fish.n.01", "name": "creole-fish"}, - {"id": 4959, "synset": "jewfish.n.02", "name": "jewfish"}, - {"id": 4960, "synset": "soapfish.n.01", "name": "soapfish"}, - {"id": 4961, "synset": "surfperch.n.01", "name": "surfperch"}, - {"id": 4962, "synset": "rainbow_seaperch.n.01", "name": "rainbow_seaperch"}, - {"id": 4963, "synset": "bigeye.n.01", "name": "bigeye"}, - {"id": 4964, "synset": "catalufa.n.01", "name": "catalufa"}, - {"id": 4965, "synset": "cardinalfish.n.01", "name": "cardinalfish"}, - {"id": 4966, "synset": "flame_fish.n.01", "name": "flame_fish"}, - {"id": 4967, "synset": "tilefish.n.02", "name": "tilefish"}, - {"id": 4968, "synset": "bluefish.n.01", "name": "bluefish"}, - {"id": 4969, "synset": "cobia.n.01", "name": "cobia"}, - {"id": 4970, "synset": "remora.n.01", "name": "remora"}, - {"id": 4971, "synset": "sharksucker.n.01", "name": "sharksucker"}, - {"id": 4972, "synset": "whale_sucker.n.01", "name": "whale_sucker"}, - {"id": 4973, "synset": "carangid_fish.n.01", "name": "carangid_fish"}, - {"id": 4974, "synset": "jack.n.11", "name": "jack"}, - {"id": 4975, "synset": "crevalle_jack.n.01", "name": "crevalle_jack"}, - {"id": 4976, "synset": "yellow_jack.n.03", "name": "yellow_jack"}, - {"id": 4977, "synset": "runner.n.10", "name": "runner"}, - {"id": 4978, "synset": "rainbow_runner.n.01", "name": "rainbow_runner"}, - {"id": 4979, "synset": "leatherjacket.n.02", "name": "leatherjacket"}, - {"id": 4980, "synset": "threadfish.n.01", "name": "threadfish"}, - {"id": 4981, "synset": "moonfish.n.01", "name": "moonfish"}, - {"id": 4982, "synset": "lookdown.n.01", "name": "lookdown"}, - {"id": 4983, "synset": "amberjack.n.01", "name": "amberjack"}, - {"id": 4984, "synset": "yellowtail.n.02", "name": "yellowtail"}, - {"id": 4985, "synset": "kingfish.n.05", "name": "kingfish"}, - {"id": 4986, "synset": "pompano.n.02", "name": "pompano"}, - {"id": 4987, "synset": "florida_pompano.n.01", "name": "Florida_pompano"}, - {"id": 4988, "synset": "permit.n.03", "name": "permit"}, - {"id": 4989, "synset": "scad.n.01", "name": "scad"}, - {"id": 4990, "synset": "horse_mackerel.n.03", "name": "horse_mackerel"}, - {"id": 4991, "synset": "horse_mackerel.n.02", "name": "horse_mackerel"}, - {"id": 4992, "synset": "bigeye_scad.n.01", "name": "bigeye_scad"}, - {"id": 4993, "synset": "mackerel_scad.n.01", "name": "mackerel_scad"}, - {"id": 4994, "synset": "round_scad.n.01", "name": "round_scad"}, - {"id": 4995, "synset": "dolphinfish.n.02", "name": "dolphinfish"}, - {"id": 4996, "synset": "coryphaena_hippurus.n.01", "name": "Coryphaena_hippurus"}, - {"id": 4997, "synset": "coryphaena_equisetis.n.01", "name": "Coryphaena_equisetis"}, - {"id": 4998, "synset": "pomfret.n.01", "name": "pomfret"}, - {"id": 4999, "synset": "characin.n.01", "name": "characin"}, - {"id": 5000, "synset": "tetra.n.01", "name": "tetra"}, - {"id": 5001, "synset": "cardinal_tetra.n.01", "name": "cardinal_tetra"}, - {"id": 5002, "synset": "piranha.n.02", "name": "piranha"}, - {"id": 5003, "synset": "cichlid.n.01", "name": "cichlid"}, - {"id": 5004, "synset": "bolti.n.01", "name": "bolti"}, - {"id": 5005, "synset": "snapper.n.05", "name": "snapper"}, - {"id": 5006, "synset": "red_snapper.n.02", "name": "red_snapper"}, - {"id": 5007, "synset": "grey_snapper.n.01", "name": "grey_snapper"}, - {"id": 5008, "synset": "mutton_snapper.n.01", "name": "mutton_snapper"}, - {"id": 5009, "synset": "schoolmaster.n.03", "name": "schoolmaster"}, - {"id": 5010, "synset": "yellowtail.n.01", "name": "yellowtail"}, - {"id": 5011, "synset": "grunt.n.03", "name": "grunt"}, - {"id": 5012, "synset": "margate.n.01", "name": "margate"}, - {"id": 5013, "synset": "spanish_grunt.n.01", "name": "Spanish_grunt"}, - {"id": 5014, "synset": "tomtate.n.01", "name": "tomtate"}, - {"id": 5015, "synset": "cottonwick.n.01", "name": "cottonwick"}, - {"id": 5016, "synset": "sailor's-choice.n.02", "name": "sailor's-choice"}, - {"id": 5017, "synset": "porkfish.n.01", "name": "porkfish"}, - {"id": 5018, "synset": "pompon.n.02", "name": "pompon"}, - {"id": 5019, "synset": "pigfish.n.02", "name": "pigfish"}, - {"id": 5020, "synset": "sparid.n.01", "name": "sparid"}, - {"id": 5021, "synset": "sea_bream.n.02", "name": "sea_bream"}, - {"id": 5022, "synset": "porgy.n.02", "name": "porgy"}, - {"id": 5023, "synset": "red_porgy.n.01", "name": "red_porgy"}, - {"id": 5024, "synset": "european_sea_bream.n.01", "name": "European_sea_bream"}, - {"id": 5025, "synset": "atlantic_sea_bream.n.01", "name": "Atlantic_sea_bream"}, - {"id": 5026, "synset": "sheepshead.n.01", "name": "sheepshead"}, - {"id": 5027, "synset": "pinfish.n.01", "name": "pinfish"}, - {"id": 5028, "synset": "sheepshead_porgy.n.01", "name": "sheepshead_porgy"}, - {"id": 5029, "synset": "snapper.n.04", "name": "snapper"}, - {"id": 5030, "synset": "black_bream.n.01", "name": "black_bream"}, - {"id": 5031, "synset": "scup.n.04", "name": "scup"}, - {"id": 5032, "synset": "scup.n.03", "name": "scup"}, - {"id": 5033, "synset": "sciaenid_fish.n.01", "name": "sciaenid_fish"}, - {"id": 5034, "synset": "striped_drum.n.01", "name": "striped_drum"}, - {"id": 5035, "synset": "jackknife-fish.n.01", "name": "jackknife-fish"}, - {"id": 5036, "synset": "silver_perch.n.01", "name": "silver_perch"}, - {"id": 5037, "synset": "red_drum.n.01", "name": "red_drum"}, - {"id": 5038, "synset": "mulloway.n.01", "name": "mulloway"}, - {"id": 5039, "synset": "maigre.n.01", "name": "maigre"}, - {"id": 5040, "synset": "croaker.n.02", "name": "croaker"}, - {"id": 5041, "synset": "atlantic_croaker.n.01", "name": "Atlantic_croaker"}, - {"id": 5042, "synset": "yellowfin_croaker.n.01", "name": "yellowfin_croaker"}, - {"id": 5043, "synset": "whiting.n.04", "name": "whiting"}, - {"id": 5044, "synset": "kingfish.n.04", "name": "kingfish"}, - {"id": 5045, "synset": "king_whiting.n.01", "name": "king_whiting"}, - {"id": 5046, "synset": "northern_whiting.n.01", "name": "northern_whiting"}, - {"id": 5047, "synset": "corbina.n.01", "name": "corbina"}, - {"id": 5048, "synset": "white_croaker.n.02", "name": "white_croaker"}, - {"id": 5049, "synset": "white_croaker.n.01", "name": "white_croaker"}, - {"id": 5050, "synset": "sea_trout.n.02", "name": "sea_trout"}, - {"id": 5051, "synset": "weakfish.n.02", "name": "weakfish"}, - {"id": 5052, "synset": "spotted_weakfish.n.01", "name": "spotted_weakfish"}, - {"id": 5053, "synset": "mullet.n.03", "name": "mullet"}, - {"id": 5054, "synset": "goatfish.n.01", "name": "goatfish"}, - {"id": 5055, "synset": "red_goatfish.n.01", "name": "red_goatfish"}, - {"id": 5056, "synset": "yellow_goatfish.n.01", "name": "yellow_goatfish"}, - {"id": 5057, "synset": "mullet.n.02", "name": "mullet"}, - {"id": 5058, "synset": "striped_mullet.n.01", "name": "striped_mullet"}, - {"id": 5059, "synset": "white_mullet.n.01", "name": "white_mullet"}, - {"id": 5060, "synset": "liza.n.01", "name": "liza"}, - {"id": 5061, "synset": "silversides.n.01", "name": "silversides"}, - {"id": 5062, "synset": "jacksmelt.n.01", "name": "jacksmelt"}, - {"id": 5063, "synset": "barracuda.n.01", "name": "barracuda"}, - {"id": 5064, "synset": "great_barracuda.n.01", "name": "great_barracuda"}, - {"id": 5065, "synset": "sweeper.n.03", "name": "sweeper"}, - {"id": 5066, "synset": "sea_chub.n.01", "name": "sea_chub"}, - {"id": 5067, "synset": "bermuda_chub.n.01", "name": "Bermuda_chub"}, - {"id": 5068, "synset": "spadefish.n.01", "name": "spadefish"}, - {"id": 5069, "synset": "butterfly_fish.n.01", "name": "butterfly_fish"}, - {"id": 5070, "synset": "chaetodon.n.01", "name": "chaetodon"}, - {"id": 5071, "synset": "angelfish.n.01", "name": "angelfish"}, - {"id": 5072, "synset": "rock_beauty.n.01", "name": "rock_beauty"}, - {"id": 5073, "synset": "damselfish.n.01", "name": "damselfish"}, - {"id": 5074, "synset": "beaugregory.n.01", "name": "beaugregory"}, - {"id": 5075, "synset": "anemone_fish.n.01", "name": "anemone_fish"}, - {"id": 5076, "synset": "clown_anemone_fish.n.01", "name": "clown_anemone_fish"}, - {"id": 5077, "synset": "sergeant_major.n.02", "name": "sergeant_major"}, - {"id": 5078, "synset": "wrasse.n.01", "name": "wrasse"}, - {"id": 5079, "synset": "pigfish.n.01", "name": "pigfish"}, - {"id": 5080, "synset": "hogfish.n.01", "name": "hogfish"}, - {"id": 5081, "synset": "slippery_dick.n.01", "name": "slippery_dick"}, - {"id": 5082, "synset": "puddingwife.n.01", "name": "puddingwife"}, - {"id": 5083, "synset": "bluehead.n.01", "name": "bluehead"}, - {"id": 5084, "synset": "pearly_razorfish.n.01", "name": "pearly_razorfish"}, - {"id": 5085, "synset": "tautog.n.01", "name": "tautog"}, - {"id": 5086, "synset": "cunner.n.01", "name": "cunner"}, - {"id": 5087, "synset": "parrotfish.n.01", "name": "parrotfish"}, - {"id": 5088, "synset": "threadfin.n.01", "name": "threadfin"}, - {"id": 5089, "synset": "jawfish.n.01", "name": "jawfish"}, - {"id": 5090, "synset": "stargazer.n.03", "name": "stargazer"}, - {"id": 5091, "synset": "sand_stargazer.n.01", "name": "sand_stargazer"}, - {"id": 5092, "synset": "blenny.n.01", "name": "blenny"}, - {"id": 5093, "synset": "shanny.n.01", "name": "shanny"}, - {"id": 5094, "synset": "molly_miller.n.01", "name": "Molly_Miller"}, - {"id": 5095, "synset": "clinid.n.01", "name": "clinid"}, - {"id": 5096, "synset": "pikeblenny.n.01", "name": "pikeblenny"}, - {"id": 5097, "synset": "bluethroat_pikeblenny.n.01", "name": "bluethroat_pikeblenny"}, - {"id": 5098, "synset": "gunnel.n.02", "name": "gunnel"}, - {"id": 5099, "synset": "rock_gunnel.n.01", "name": "rock_gunnel"}, - {"id": 5100, "synset": "eelblenny.n.01", "name": "eelblenny"}, - {"id": 5101, "synset": "wrymouth.n.01", "name": "wrymouth"}, - {"id": 5102, "synset": "wolffish.n.01", "name": "wolffish"}, - {"id": 5103, "synset": "viviparous_eelpout.n.01", "name": "viviparous_eelpout"}, - {"id": 5104, "synset": "ocean_pout.n.01", "name": "ocean_pout"}, - {"id": 5105, "synset": "sand_lance.n.01", "name": "sand_lance"}, - {"id": 5106, "synset": "dragonet.n.01", "name": "dragonet"}, - {"id": 5107, "synset": "goby.n.01", "name": "goby"}, - {"id": 5108, "synset": "mudskipper.n.01", "name": "mudskipper"}, - {"id": 5109, "synset": "sleeper.n.08", "name": "sleeper"}, - {"id": 5110, "synset": "flathead.n.02", "name": "flathead"}, - {"id": 5111, "synset": "archerfish.n.01", "name": "archerfish"}, - {"id": 5112, "synset": "surgeonfish.n.01", "name": "surgeonfish"}, - {"id": 5113, "synset": "gempylid.n.01", "name": "gempylid"}, - {"id": 5114, "synset": "snake_mackerel.n.01", "name": "snake_mackerel"}, - {"id": 5115, "synset": "escolar.n.01", "name": "escolar"}, - {"id": 5116, "synset": "oilfish.n.01", "name": "oilfish"}, - {"id": 5117, "synset": "cutlassfish.n.01", "name": "cutlassfish"}, - {"id": 5118, "synset": "scombroid.n.01", "name": "scombroid"}, - {"id": 5119, "synset": "mackerel.n.02", "name": "mackerel"}, - {"id": 5120, "synset": "common_mackerel.n.01", "name": "common_mackerel"}, - {"id": 5121, "synset": "spanish_mackerel.n.03", "name": "Spanish_mackerel"}, - {"id": 5122, "synset": "chub_mackerel.n.01", "name": "chub_mackerel"}, - {"id": 5123, "synset": "wahoo.n.03", "name": "wahoo"}, - {"id": 5124, "synset": "spanish_mackerel.n.02", "name": "Spanish_mackerel"}, - {"id": 5125, "synset": "king_mackerel.n.01", "name": "king_mackerel"}, - {"id": 5126, "synset": "scomberomorus_maculatus.n.01", "name": "Scomberomorus_maculatus"}, - {"id": 5127, "synset": "cero.n.01", "name": "cero"}, - {"id": 5128, "synset": "sierra.n.02", "name": "sierra"}, - {"id": 5129, "synset": "tuna.n.03", "name": "tuna"}, - {"id": 5130, "synset": "albacore.n.02", "name": "albacore"}, - {"id": 5131, "synset": "bluefin.n.02", "name": "bluefin"}, - {"id": 5132, "synset": "yellowfin.n.01", "name": "yellowfin"}, - {"id": 5133, "synset": "bonito.n.03", "name": "bonito"}, - {"id": 5134, "synset": "skipjack.n.02", "name": "skipjack"}, - {"id": 5135, "synset": "chile_bonito.n.01", "name": "Chile_bonito"}, - {"id": 5136, "synset": "skipjack.n.01", "name": "skipjack"}, - {"id": 5137, "synset": "bonito.n.02", "name": "bonito"}, - {"id": 5138, "synset": "swordfish.n.02", "name": "swordfish"}, - {"id": 5139, "synset": "sailfish.n.02", "name": "sailfish"}, - {"id": 5140, "synset": "atlantic_sailfish.n.01", "name": "Atlantic_sailfish"}, - {"id": 5141, "synset": "billfish.n.02", "name": "billfish"}, - {"id": 5142, "synset": "marlin.n.01", "name": "marlin"}, - {"id": 5143, "synset": "blue_marlin.n.01", "name": "blue_marlin"}, - {"id": 5144, "synset": "black_marlin.n.01", "name": "black_marlin"}, - {"id": 5145, "synset": "striped_marlin.n.01", "name": "striped_marlin"}, - {"id": 5146, "synset": "white_marlin.n.01", "name": "white_marlin"}, - {"id": 5147, "synset": "spearfish.n.01", "name": "spearfish"}, - {"id": 5148, "synset": "louvar.n.01", "name": "louvar"}, - {"id": 5149, "synset": "dollarfish.n.01", "name": "dollarfish"}, - {"id": 5150, "synset": "palometa.n.01", "name": "palometa"}, - {"id": 5151, "synset": "harvestfish.n.01", "name": "harvestfish"}, - {"id": 5152, "synset": "driftfish.n.01", "name": "driftfish"}, - {"id": 5153, "synset": "barrelfish.n.01", "name": "barrelfish"}, - {"id": 5154, "synset": "clingfish.n.01", "name": "clingfish"}, - {"id": 5155, "synset": "tripletail.n.01", "name": "tripletail"}, - {"id": 5156, "synset": "atlantic_tripletail.n.01", "name": "Atlantic_tripletail"}, - {"id": 5157, "synset": "pacific_tripletail.n.01", "name": "Pacific_tripletail"}, - {"id": 5158, "synset": "mojarra.n.01", "name": "mojarra"}, - {"id": 5159, "synset": "yellowfin_mojarra.n.01", "name": "yellowfin_mojarra"}, - {"id": 5160, "synset": "silver_jenny.n.01", "name": "silver_jenny"}, - {"id": 5161, "synset": "whiting.n.03", "name": "whiting"}, - {"id": 5162, "synset": "ganoid.n.01", "name": "ganoid"}, - {"id": 5163, "synset": "bowfin.n.01", "name": "bowfin"}, - {"id": 5164, "synset": "paddlefish.n.01", "name": "paddlefish"}, - {"id": 5165, "synset": "chinese_paddlefish.n.01", "name": "Chinese_paddlefish"}, - {"id": 5166, "synset": "sturgeon.n.01", "name": "sturgeon"}, - {"id": 5167, "synset": "pacific_sturgeon.n.01", "name": "Pacific_sturgeon"}, - {"id": 5168, "synset": "beluga.n.01", "name": "beluga"}, - {"id": 5169, "synset": "gar.n.01", "name": "gar"}, - {"id": 5170, "synset": "scorpaenoid.n.01", "name": "scorpaenoid"}, - {"id": 5171, "synset": "scorpaenid.n.01", "name": "scorpaenid"}, - {"id": 5172, "synset": "scorpionfish.n.01", "name": "scorpionfish"}, - {"id": 5173, "synset": "plumed_scorpionfish.n.01", "name": "plumed_scorpionfish"}, - {"id": 5174, "synset": "lionfish.n.01", "name": "lionfish"}, - {"id": 5175, "synset": "stonefish.n.01", "name": "stonefish"}, - {"id": 5176, "synset": "rockfish.n.02", "name": "rockfish"}, - {"id": 5177, "synset": "copper_rockfish.n.01", "name": "copper_rockfish"}, - {"id": 5178, "synset": "vermillion_rockfish.n.01", "name": "vermillion_rockfish"}, - {"id": 5179, "synset": "red_rockfish.n.02", "name": "red_rockfish"}, - {"id": 5180, "synset": "rosefish.n.02", "name": "rosefish"}, - {"id": 5181, "synset": "bullhead.n.01", "name": "bullhead"}, - {"id": 5182, "synset": "miller's-thumb.n.01", "name": "miller's-thumb"}, - {"id": 5183, "synset": "sea_raven.n.01", "name": "sea_raven"}, - {"id": 5184, "synset": "lumpfish.n.01", "name": "lumpfish"}, - {"id": 5185, "synset": "lumpsucker.n.01", "name": "lumpsucker"}, - {"id": 5186, "synset": "pogge.n.01", "name": "pogge"}, - {"id": 5187, "synset": "greenling.n.01", "name": "greenling"}, - {"id": 5188, "synset": "kelp_greenling.n.01", "name": "kelp_greenling"}, - {"id": 5189, "synset": "painted_greenling.n.01", "name": "painted_greenling"}, - {"id": 5190, "synset": "flathead.n.01", "name": "flathead"}, - {"id": 5191, "synset": "gurnard.n.01", "name": "gurnard"}, - {"id": 5192, "synset": "tub_gurnard.n.01", "name": "tub_gurnard"}, - {"id": 5193, "synset": "sea_robin.n.01", "name": "sea_robin"}, - {"id": 5194, "synset": "northern_sea_robin.n.01", "name": "northern_sea_robin"}, - {"id": 5195, "synset": "flying_gurnard.n.01", "name": "flying_gurnard"}, - {"id": 5196, "synset": "plectognath.n.01", "name": "plectognath"}, - {"id": 5197, "synset": "triggerfish.n.01", "name": "triggerfish"}, - {"id": 5198, "synset": "queen_triggerfish.n.01", "name": "queen_triggerfish"}, - {"id": 5199, "synset": "filefish.n.01", "name": "filefish"}, - {"id": 5200, "synset": "leatherjacket.n.01", "name": "leatherjacket"}, - {"id": 5201, "synset": "boxfish.n.01", "name": "boxfish"}, - {"id": 5202, "synset": "cowfish.n.01", "name": "cowfish"}, - {"id": 5203, "synset": "spiny_puffer.n.01", "name": "spiny_puffer"}, - {"id": 5204, "synset": "porcupinefish.n.01", "name": "porcupinefish"}, - {"id": 5205, "synset": "balloonfish.n.01", "name": "balloonfish"}, - {"id": 5206, "synset": "burrfish.n.01", "name": "burrfish"}, - {"id": 5207, "synset": "ocean_sunfish.n.01", "name": "ocean_sunfish"}, - {"id": 5208, "synset": "sharptail_mola.n.01", "name": "sharptail_mola"}, - {"id": 5209, "synset": "flatfish.n.02", "name": "flatfish"}, - {"id": 5210, "synset": "flounder.n.02", "name": "flounder"}, - {"id": 5211, "synset": "righteye_flounder.n.01", "name": "righteye_flounder"}, - {"id": 5212, "synset": "plaice.n.02", "name": "plaice"}, - {"id": 5213, "synset": "european_flatfish.n.01", "name": "European_flatfish"}, - {"id": 5214, "synset": "yellowtail_flounder.n.02", "name": "yellowtail_flounder"}, - {"id": 5215, "synset": "winter_flounder.n.02", "name": "winter_flounder"}, - {"id": 5216, "synset": "lemon_sole.n.05", "name": "lemon_sole"}, - {"id": 5217, "synset": "american_plaice.n.01", "name": "American_plaice"}, - {"id": 5218, "synset": "halibut.n.02", "name": "halibut"}, - {"id": 5219, "synset": "atlantic_halibut.n.01", "name": "Atlantic_halibut"}, - {"id": 5220, "synset": "pacific_halibut.n.01", "name": "Pacific_halibut"}, - {"id": 5221, "synset": "lefteye_flounder.n.01", "name": "lefteye_flounder"}, - {"id": 5222, "synset": "southern_flounder.n.01", "name": "southern_flounder"}, - {"id": 5223, "synset": "summer_flounder.n.01", "name": "summer_flounder"}, - {"id": 5224, "synset": "whiff.n.02", "name": "whiff"}, - {"id": 5225, "synset": "horned_whiff.n.01", "name": "horned_whiff"}, - {"id": 5226, "synset": "sand_dab.n.02", "name": "sand_dab"}, - {"id": 5227, "synset": "windowpane.n.02", "name": "windowpane"}, - {"id": 5228, "synset": "brill.n.01", "name": "brill"}, - {"id": 5229, "synset": "turbot.n.02", "name": "turbot"}, - {"id": 5230, "synset": "tonguefish.n.01", "name": "tonguefish"}, - {"id": 5231, "synset": "sole.n.04", "name": "sole"}, - {"id": 5232, "synset": "european_sole.n.01", "name": "European_sole"}, - {"id": 5233, "synset": "english_sole.n.02", "name": "English_sole"}, - {"id": 5234, "synset": "hogchoker.n.01", "name": "hogchoker"}, - {"id": 5235, "synset": "aba.n.02", "name": "aba"}, - {"id": 5236, "synset": "abacus.n.02", "name": "abacus"}, - {"id": 5237, "synset": "abandoned_ship.n.01", "name": "abandoned_ship"}, - {"id": 5238, "synset": "a_battery.n.01", "name": "A_battery"}, - {"id": 5239, "synset": "abattoir.n.01", "name": "abattoir"}, - {"id": 5240, "synset": "abaya.n.01", "name": "abaya"}, - {"id": 5241, "synset": "abbe_condenser.n.01", "name": "Abbe_condenser"}, - {"id": 5242, "synset": "abbey.n.03", "name": "abbey"}, - {"id": 5243, "synset": "abbey.n.02", "name": "abbey"}, - {"id": 5244, "synset": "abbey.n.01", "name": "abbey"}, - {"id": 5245, "synset": "abney_level.n.01", "name": "Abney_level"}, - {"id": 5246, "synset": "abrader.n.01", "name": "abrader"}, - {"id": 5247, "synset": "abrading_stone.n.01", "name": "abrading_stone"}, - {"id": 5248, "synset": "abutment.n.02", "name": "abutment"}, - {"id": 5249, "synset": "abutment_arch.n.01", "name": "abutment_arch"}, - {"id": 5250, "synset": "academic_costume.n.01", "name": "academic_costume"}, - {"id": 5251, "synset": "academic_gown.n.01", "name": "academic_gown"}, - {"id": 5252, "synset": "accelerator.n.02", "name": "accelerator"}, - {"id": 5253, "synset": "accelerator.n.04", "name": "accelerator"}, - {"id": 5254, "synset": "accelerator.n.01", "name": "accelerator"}, - {"id": 5255, "synset": "accelerometer.n.01", "name": "accelerometer"}, - {"id": 5256, "synset": "accessory.n.01", "name": "accessory"}, - {"id": 5257, "synset": "accommodating_lens_implant.n.01", "name": "accommodating_lens_implant"}, - {"id": 5258, "synset": "accommodation.n.04", "name": "accommodation"}, - {"id": 5259, "synset": "accordion.n.01", "name": "accordion"}, - {"id": 5260, "synset": "acetate_disk.n.01", "name": "acetate_disk"}, - {"id": 5261, "synset": "acetate_rayon.n.01", "name": "acetate_rayon"}, - {"id": 5262, "synset": "achromatic_lens.n.01", "name": "achromatic_lens"}, - {"id": 5263, "synset": "acoustic_delay_line.n.01", "name": "acoustic_delay_line"}, - {"id": 5264, "synset": "acoustic_device.n.01", "name": "acoustic_device"}, - {"id": 5265, "synset": "acoustic_guitar.n.01", "name": "acoustic_guitar"}, - {"id": 5266, "synset": "acoustic_modem.n.01", "name": "acoustic_modem"}, - {"id": 5267, "synset": "acropolis.n.01", "name": "acropolis"}, - {"id": 5268, "synset": "acrylic.n.04", "name": "acrylic"}, - {"id": 5269, "synset": "acrylic.n.03", "name": "acrylic"}, - {"id": 5270, "synset": "actinometer.n.01", "name": "actinometer"}, - {"id": 5271, "synset": "action.n.07", "name": "action"}, - {"id": 5272, "synset": "active_matrix_screen.n.01", "name": "active_matrix_screen"}, - {"id": 5273, "synset": "actuator.n.01", "name": "actuator"}, - {"id": 5274, "synset": "adapter.n.02", "name": "adapter"}, - {"id": 5275, "synset": "adder.n.02", "name": "adder"}, - {"id": 5276, "synset": "adding_machine.n.01", "name": "adding_machine"}, - {"id": 5277, "synset": "addressing_machine.n.01", "name": "addressing_machine"}, - {"id": 5278, "synset": "adhesive_bandage.n.01", "name": "adhesive_bandage"}, - {"id": 5279, "synset": "adit.n.01", "name": "adit"}, - {"id": 5280, "synset": "adjoining_room.n.01", "name": "adjoining_room"}, - {"id": 5281, "synset": "adjustable_wrench.n.01", "name": "adjustable_wrench"}, - {"id": 5282, "synset": "adobe.n.02", "name": "adobe"}, - {"id": 5283, "synset": "adz.n.01", "name": "adz"}, - {"id": 5284, "synset": "aeolian_harp.n.01", "name": "aeolian_harp"}, - {"id": 5285, "synset": "aerator.n.01", "name": "aerator"}, - {"id": 5286, "synset": "aerial_torpedo.n.01", "name": "aerial_torpedo"}, - {"id": 5287, "synset": "aertex.n.01", "name": "Aertex"}, - {"id": 5288, "synset": "afghan.n.01", "name": "afghan"}, - {"id": 5289, "synset": "afro-wig.n.01", "name": "Afro-wig"}, - {"id": 5290, "synset": "afterburner.n.01", "name": "afterburner"}, - {"id": 5291, "synset": "after-shave.n.01", "name": "after-shave"}, - {"id": 5292, "synset": "agateware.n.01", "name": "agateware"}, - {"id": 5293, "synset": "agglomerator.n.01", "name": "agglomerator"}, - {"id": 5294, "synset": "aglet.n.02", "name": "aglet"}, - {"id": 5295, "synset": "aglet.n.01", "name": "aglet"}, - {"id": 5296, "synset": "agora.n.03", "name": "agora"}, - {"id": 5297, "synset": "aigrette.n.01", "name": "aigrette"}, - {"id": 5298, "synset": "aileron.n.01", "name": "aileron"}, - {"id": 5299, "synset": "air_bag.n.01", "name": "air_bag"}, - {"id": 5300, "synset": "airbrake.n.02", "name": "airbrake"}, - {"id": 5301, "synset": "airbrush.n.01", "name": "airbrush"}, - {"id": 5302, "synset": "airbus.n.01", "name": "airbus"}, - {"id": 5303, "synset": "air_compressor.n.01", "name": "air_compressor"}, - {"id": 5304, "synset": "aircraft.n.01", "name": "aircraft"}, - {"id": 5305, "synset": "aircraft_carrier.n.01", "name": "aircraft_carrier"}, - {"id": 5306, "synset": "aircraft_engine.n.01", "name": "aircraft_engine"}, - {"id": 5307, "synset": "air_cushion.n.02", "name": "air_cushion"}, - {"id": 5308, "synset": "airdock.n.01", "name": "airdock"}, - {"id": 5309, "synset": "airfield.n.01", "name": "airfield"}, - {"id": 5310, "synset": "air_filter.n.01", "name": "air_filter"}, - {"id": 5311, "synset": "airfoil.n.01", "name": "airfoil"}, - {"id": 5312, "synset": "airframe.n.01", "name": "airframe"}, - {"id": 5313, "synset": "air_gun.n.01", "name": "air_gun"}, - {"id": 5314, "synset": "air_hammer.n.01", "name": "air_hammer"}, - {"id": 5315, "synset": "air_horn.n.01", "name": "air_horn"}, - {"id": 5316, "synset": "airing_cupboard.n.01", "name": "airing_cupboard"}, - {"id": 5317, "synset": "airliner.n.01", "name": "airliner"}, - {"id": 5318, "synset": "airmailer.n.01", "name": "airmailer"}, - {"id": 5319, "synset": "airplane_propeller.n.01", "name": "airplane_propeller"}, - {"id": 5320, "synset": "airport.n.01", "name": "airport"}, - {"id": 5321, "synset": "air_pump.n.01", "name": "air_pump"}, - {"id": 5322, "synset": "air_search_radar.n.01", "name": "air_search_radar"}, - {"id": 5323, "synset": "airship.n.01", "name": "airship"}, - {"id": 5324, "synset": "air_terminal.n.01", "name": "air_terminal"}, - {"id": 5325, "synset": "air-to-air_missile.n.01", "name": "air-to-air_missile"}, - {"id": 5326, "synset": "air-to-ground_missile.n.01", "name": "air-to-ground_missile"}, - {"id": 5327, "synset": "aisle.n.03", "name": "aisle"}, - {"id": 5328, "synset": "aladdin's_lamp.n.01", "name": "Aladdin's_lamp"}, - {"id": 5329, "synset": "alarm.n.02", "name": "alarm"}, - {"id": 5330, "synset": "alb.n.01", "name": "alb"}, - {"id": 5331, "synset": "alcazar.n.01", "name": "alcazar"}, - {"id": 5332, "synset": "alcohol_thermometer.n.01", "name": "alcohol_thermometer"}, - {"id": 5333, "synset": "alehouse.n.01", "name": "alehouse"}, - {"id": 5334, "synset": "alembic.n.01", "name": "alembic"}, - {"id": 5335, "synset": "algometer.n.01", "name": "algometer"}, - {"id": 5336, "synset": "alidade.n.02", "name": "alidade"}, - {"id": 5337, "synset": "alidade.n.01", "name": "alidade"}, - {"id": 5338, "synset": "a-line.n.01", "name": "A-line"}, - {"id": 5339, "synset": "allen_screw.n.01", "name": "Allen_screw"}, - {"id": 5340, "synset": "allen_wrench.n.01", "name": "Allen_wrench"}, - {"id": 5341, "synset": "alligator_wrench.n.01", "name": "alligator_wrench"}, - {"id": 5342, "synset": "alms_dish.n.01", "name": "alms_dish"}, - {"id": 5343, "synset": "alpaca.n.02", "name": "alpaca"}, - {"id": 5344, "synset": "alpenstock.n.01", "name": "alpenstock"}, - {"id": 5345, "synset": "altar.n.02", "name": "altar"}, - {"id": 5346, "synset": "altar.n.01", "name": "altar"}, - {"id": 5347, "synset": "altarpiece.n.01", "name": "altarpiece"}, - {"id": 5348, "synset": "altazimuth.n.01", "name": "altazimuth"}, - {"id": 5349, "synset": "alternator.n.01", "name": "alternator"}, - {"id": 5350, "synset": "altimeter.n.01", "name": "altimeter"}, - {"id": 5351, "synset": "amati.n.02", "name": "Amati"}, - {"id": 5352, "synset": "amen_corner.n.01", "name": "amen_corner"}, - {"id": 5353, "synset": "american_organ.n.01", "name": "American_organ"}, - {"id": 5354, "synset": "ammeter.n.01", "name": "ammeter"}, - {"id": 5355, "synset": "ammonia_clock.n.01", "name": "ammonia_clock"}, - {"id": 5356, "synset": "ammunition.n.01", "name": "ammunition"}, - {"id": 5357, "synset": "amphibian.n.02", "name": "amphibian"}, - {"id": 5358, "synset": "amphibian.n.01", "name": "amphibian"}, - {"id": 5359, "synset": "amphitheater.n.02", "name": "amphitheater"}, - {"id": 5360, "synset": "amphitheater.n.01", "name": "amphitheater"}, - {"id": 5361, "synset": "amphora.n.01", "name": "amphora"}, - {"id": 5362, "synset": "ampulla.n.02", "name": "ampulla"}, - {"id": 5363, "synset": "amusement_arcade.n.01", "name": "amusement_arcade"}, - {"id": 5364, "synset": "analog_clock.n.01", "name": "analog_clock"}, - {"id": 5365, "synset": "analog_computer.n.01", "name": "analog_computer"}, - {"id": 5366, "synset": "analog_watch.n.01", "name": "analog_watch"}, - {"id": 5367, "synset": "analytical_balance.n.01", "name": "analytical_balance"}, - {"id": 5368, "synset": "analyzer.n.01", "name": "analyzer"}, - {"id": 5369, "synset": "anamorphosis.n.02", "name": "anamorphosis"}, - {"id": 5370, "synset": "anastigmat.n.01", "name": "anastigmat"}, - {"id": 5371, "synset": "anchor.n.01", "name": "anchor"}, - {"id": 5372, "synset": "anchor_chain.n.01", "name": "anchor_chain"}, - {"id": 5373, "synset": "anchor_light.n.01", "name": "anchor_light"}, - {"id": 5374, "synset": "and_circuit.n.01", "name": "AND_circuit"}, - {"id": 5375, "synset": "andiron.n.01", "name": "andiron"}, - {"id": 5376, "synset": "android.n.01", "name": "android"}, - {"id": 5377, "synset": "anechoic_chamber.n.01", "name": "anechoic_chamber"}, - {"id": 5378, "synset": "anemometer.n.01", "name": "anemometer"}, - {"id": 5379, "synset": "aneroid_barometer.n.01", "name": "aneroid_barometer"}, - {"id": 5380, "synset": "angiocardiogram.n.01", "name": "angiocardiogram"}, - {"id": 5381, "synset": "angioscope.n.01", "name": "angioscope"}, - {"id": 5382, "synset": "angle_bracket.n.02", "name": "angle_bracket"}, - {"id": 5383, "synset": "angledozer.n.01", "name": "angledozer"}, - {"id": 5384, "synset": "ankle_brace.n.01", "name": "ankle_brace"}, - {"id": 5385, "synset": "anklet.n.02", "name": "anklet"}, - {"id": 5386, "synset": "anklet.n.01", "name": "anklet"}, - {"id": 5387, "synset": "ankus.n.01", "name": "ankus"}, - {"id": 5388, "synset": "anode.n.01", "name": "anode"}, - {"id": 5389, "synset": "anode.n.02", "name": "anode"}, - {"id": 5390, "synset": "answering_machine.n.01", "name": "answering_machine"}, - {"id": 5391, "synset": "anteroom.n.01", "name": "anteroom"}, - {"id": 5392, "synset": "antiaircraft.n.01", "name": "antiaircraft"}, - {"id": 5393, "synset": "antiballistic_missile.n.01", "name": "antiballistic_missile"}, - {"id": 5394, "synset": "antifouling_paint.n.01", "name": "antifouling_paint"}, - {"id": 5395, "synset": "anti-g_suit.n.01", "name": "anti-G_suit"}, - {"id": 5396, "synset": "antimacassar.n.01", "name": "antimacassar"}, - {"id": 5397, "synset": "antiperspirant.n.01", "name": "antiperspirant"}, - {"id": 5398, "synset": "anti-submarine_rocket.n.01", "name": "anti-submarine_rocket"}, - {"id": 5399, "synset": "anvil.n.01", "name": "anvil"}, - {"id": 5400, "synset": "ao_dai.n.01", "name": "ao_dai"}, - {"id": 5401, "synset": "apadana.n.01", "name": "apadana"}, - {"id": 5402, "synset": "apartment.n.01", "name": "apartment"}, - {"id": 5403, "synset": "apartment_building.n.01", "name": "apartment_building"}, - {"id": 5404, "synset": "aperture.n.03", "name": "aperture"}, - {"id": 5405, "synset": "aperture.n.01", "name": "aperture"}, - {"id": 5406, "synset": "apiary.n.01", "name": "apiary"}, - {"id": 5407, "synset": "apparatus.n.01", "name": "apparatus"}, - {"id": 5408, "synset": "apparel.n.01", "name": "apparel"}, - {"id": 5409, "synset": "applecart.n.02", "name": "applecart"}, - {"id": 5410, "synset": "appliance.n.02", "name": "appliance"}, - {"id": 5411, "synset": "appliance.n.01", "name": "appliance"}, - {"id": 5412, "synset": "applicator.n.01", "name": "applicator"}, - {"id": 5413, "synset": "appointment.n.03", "name": "appointment"}, - {"id": 5414, "synset": "apron_string.n.01", "name": "apron_string"}, - {"id": 5415, "synset": "apse.n.01", "name": "apse"}, - {"id": 5416, "synset": "aqualung.n.01", "name": "aqualung"}, - {"id": 5417, "synset": "aquaplane.n.01", "name": "aquaplane"}, - {"id": 5418, "synset": "arabesque.n.02", "name": "arabesque"}, - {"id": 5419, "synset": "arbor.n.03", "name": "arbor"}, - {"id": 5420, "synset": "arcade.n.02", "name": "arcade"}, - {"id": 5421, "synset": "arch.n.04", "name": "arch"}, - {"id": 5422, "synset": "architecture.n.01", "name": "architecture"}, - {"id": 5423, "synset": "architrave.n.02", "name": "architrave"}, - {"id": 5424, "synset": "arch_support.n.01", "name": "arch_support"}, - {"id": 5425, "synset": "arc_lamp.n.01", "name": "arc_lamp"}, - {"id": 5426, "synset": "area.n.05", "name": "area"}, - {"id": 5427, "synset": "areaway.n.01", "name": "areaway"}, - {"id": 5428, "synset": "argyle.n.03", "name": "argyle"}, - {"id": 5429, "synset": "ark.n.02", "name": "ark"}, - {"id": 5430, "synset": "arm.n.04", "name": "arm"}, - {"id": 5431, "synset": "armament.n.01", "name": "armament"}, - {"id": 5432, "synset": "armature.n.01", "name": "armature"}, - {"id": 5433, "synset": "armet.n.01", "name": "armet"}, - {"id": 5434, "synset": "arm_guard.n.01", "name": "arm_guard"}, - {"id": 5435, "synset": "armhole.n.01", "name": "armhole"}, - {"id": 5436, "synset": "armilla.n.02", "name": "armilla"}, - {"id": 5437, "synset": "armlet.n.01", "name": "armlet"}, - {"id": 5438, "synset": "armored_car.n.02", "name": "armored_car"}, - {"id": 5439, "synset": "armored_car.n.01", "name": "armored_car"}, - {"id": 5440, "synset": "armored_personnel_carrier.n.01", "name": "armored_personnel_carrier"}, - {"id": 5441, "synset": "armored_vehicle.n.01", "name": "armored_vehicle"}, - {"id": 5442, "synset": "armor_plate.n.01", "name": "armor_plate"}, - {"id": 5443, "synset": "armory.n.04", "name": "armory"}, - {"id": 5444, "synset": "armrest.n.01", "name": "armrest"}, - {"id": 5445, "synset": "arquebus.n.01", "name": "arquebus"}, - {"id": 5446, "synset": "array.n.04", "name": "array"}, - {"id": 5447, "synset": "array.n.03", "name": "array"}, - {"id": 5448, "synset": "arrester.n.01", "name": "arrester"}, - {"id": 5449, "synset": "arrow.n.02", "name": "arrow"}, - {"id": 5450, "synset": "arsenal.n.01", "name": "arsenal"}, - {"id": 5451, "synset": "arterial_road.n.01", "name": "arterial_road"}, - {"id": 5452, "synset": "arthrogram.n.01", "name": "arthrogram"}, - {"id": 5453, "synset": "arthroscope.n.01", "name": "arthroscope"}, - {"id": 5454, "synset": "artificial_heart.n.01", "name": "artificial_heart"}, - {"id": 5455, "synset": "artificial_horizon.n.01", "name": "artificial_horizon"}, - {"id": 5456, "synset": "artificial_joint.n.01", "name": "artificial_joint"}, - {"id": 5457, "synset": "artificial_kidney.n.01", "name": "artificial_kidney"}, - {"id": 5458, "synset": "artificial_skin.n.01", "name": "artificial_skin"}, - {"id": 5459, "synset": "artillery.n.01", "name": "artillery"}, - {"id": 5460, "synset": "artillery_shell.n.01", "name": "artillery_shell"}, - {"id": 5461, "synset": "artist's_loft.n.01", "name": "artist's_loft"}, - {"id": 5462, "synset": "art_school.n.01", "name": "art_school"}, - {"id": 5463, "synset": "ascot.n.01", "name": "ascot"}, - {"id": 5464, "synset": "ash-pan.n.01", "name": "ash-pan"}, - {"id": 5465, "synset": "aspergill.n.01", "name": "aspergill"}, - {"id": 5466, "synset": "aspersorium.n.01", "name": "aspersorium"}, - {"id": 5467, "synset": "aspirator.n.01", "name": "aspirator"}, - {"id": 5468, "synset": "aspirin_powder.n.01", "name": "aspirin_powder"}, - {"id": 5469, "synset": "assault_gun.n.02", "name": "assault_gun"}, - {"id": 5470, "synset": "assault_rifle.n.01", "name": "assault_rifle"}, - {"id": 5471, "synset": "assegai.n.01", "name": "assegai"}, - {"id": 5472, "synset": "assembly.n.01", "name": "assembly"}, - {"id": 5473, "synset": "assembly.n.05", "name": "assembly"}, - {"id": 5474, "synset": "assembly_hall.n.01", "name": "assembly_hall"}, - {"id": 5475, "synset": "assembly_plant.n.01", "name": "assembly_plant"}, - {"id": 5476, "synset": "astatic_coils.n.01", "name": "astatic_coils"}, - {"id": 5477, "synset": "astatic_galvanometer.n.01", "name": "astatic_galvanometer"}, - {"id": 5478, "synset": "astrodome.n.01", "name": "astrodome"}, - {"id": 5479, "synset": "astrolabe.n.01", "name": "astrolabe"}, - {"id": 5480, "synset": "astronomical_telescope.n.01", "name": "astronomical_telescope"}, - {"id": 5481, "synset": "astronomy_satellite.n.01", "name": "astronomy_satellite"}, - {"id": 5482, "synset": "athenaeum.n.02", "name": "athenaeum"}, - {"id": 5483, "synset": "athletic_sock.n.01", "name": "athletic_sock"}, - {"id": 5484, "synset": "athletic_supporter.n.01", "name": "athletic_supporter"}, - {"id": 5485, "synset": "atlas.n.04", "name": "atlas"}, - {"id": 5486, "synset": "atmometer.n.01", "name": "atmometer"}, - {"id": 5487, "synset": "atom_bomb.n.01", "name": "atom_bomb"}, - {"id": 5488, "synset": "atomic_clock.n.01", "name": "atomic_clock"}, - {"id": 5489, "synset": "atomic_pile.n.01", "name": "atomic_pile"}, - {"id": 5490, "synset": "atrium.n.02", "name": "atrium"}, - {"id": 5491, "synset": "attache_case.n.01", "name": "attache_case"}, - {"id": 5492, "synset": "attachment.n.04", "name": "attachment"}, - {"id": 5493, "synset": "attack_submarine.n.01", "name": "attack_submarine"}, - {"id": 5494, "synset": "attenuator.n.01", "name": "attenuator"}, - {"id": 5495, "synset": "attic.n.04", "name": "attic"}, - {"id": 5496, "synset": "attic_fan.n.01", "name": "attic_fan"}, - {"id": 5497, "synset": "attire.n.01", "name": "attire"}, - {"id": 5498, "synset": "audio_amplifier.n.01", "name": "audio_amplifier"}, - {"id": 5499, "synset": "audiocassette.n.01", "name": "audiocassette"}, - {"id": 5500, "synset": "audio_cd.n.01", "name": "audio_CD"}, - {"id": 5501, "synset": "audiometer.n.01", "name": "audiometer"}, - {"id": 5502, "synset": "audio_system.n.01", "name": "audio_system"}, - {"id": 5503, "synset": "audiotape.n.02", "name": "audiotape"}, - {"id": 5504, "synset": "audiotape.n.01", "name": "audiotape"}, - {"id": 5505, "synset": "audiovisual.n.01", "name": "audiovisual"}, - {"id": 5506, "synset": "auditorium.n.01", "name": "auditorium"}, - {"id": 5507, "synset": "auger.n.02", "name": "auger"}, - {"id": 5508, "synset": "autobahn.n.01", "name": "autobahn"}, - {"id": 5509, "synset": "autoclave.n.01", "name": "autoclave"}, - {"id": 5510, "synset": "autofocus.n.01", "name": "autofocus"}, - {"id": 5511, "synset": "autogiro.n.01", "name": "autogiro"}, - {"id": 5512, "synset": "autoinjector.n.01", "name": "autoinjector"}, - {"id": 5513, "synset": "autoloader.n.01", "name": "autoloader"}, - {"id": 5514, "synset": "automat.n.02", "name": "automat"}, - {"id": 5515, "synset": "automat.n.01", "name": "automat"}, - {"id": 5516, "synset": "automatic_choke.n.01", "name": "automatic_choke"}, - {"id": 5517, "synset": "automatic_firearm.n.01", "name": "automatic_firearm"}, - {"id": 5518, "synset": "automatic_pistol.n.01", "name": "automatic_pistol"}, - {"id": 5519, "synset": "automatic_rifle.n.01", "name": "automatic_rifle"}, - {"id": 5520, "synset": "automatic_transmission.n.01", "name": "automatic_transmission"}, - {"id": 5521, "synset": "automation.n.03", "name": "automation"}, - {"id": 5522, "synset": "automaton.n.02", "name": "automaton"}, - {"id": 5523, "synset": "automobile_engine.n.01", "name": "automobile_engine"}, - {"id": 5524, "synset": "automobile_factory.n.01", "name": "automobile_factory"}, - {"id": 5525, "synset": "automobile_horn.n.01", "name": "automobile_horn"}, - {"id": 5526, "synset": "autopilot.n.02", "name": "autopilot"}, - {"id": 5527, "synset": "autoradiograph.n.01", "name": "autoradiograph"}, - {"id": 5528, "synset": "autostrada.n.01", "name": "autostrada"}, - {"id": 5529, "synset": "auxiliary_boiler.n.01", "name": "auxiliary_boiler"}, - {"id": 5530, "synset": "auxiliary_engine.n.01", "name": "auxiliary_engine"}, - {"id": 5531, "synset": "auxiliary_pump.n.01", "name": "auxiliary_pump"}, - { - "id": 5532, - "synset": "auxiliary_research_submarine.n.01", - "name": "auxiliary_research_submarine", - }, - {"id": 5533, "synset": "auxiliary_storage.n.01", "name": "auxiliary_storage"}, - {"id": 5534, "synset": "aviary.n.01", "name": "aviary"}, - {"id": 5535, "synset": "awl.n.01", "name": "awl"}, - {"id": 5536, "synset": "ax_handle.n.01", "name": "ax_handle"}, - {"id": 5537, "synset": "ax_head.n.01", "name": "ax_head"}, - {"id": 5538, "synset": "axis.n.06", "name": "axis"}, - {"id": 5539, "synset": "axle.n.01", "name": "axle"}, - {"id": 5540, "synset": "axle_bar.n.01", "name": "axle_bar"}, - {"id": 5541, "synset": "axletree.n.01", "name": "axletree"}, - {"id": 5542, "synset": "babushka.n.01", "name": "babushka"}, - {"id": 5543, "synset": "baby_bed.n.01", "name": "baby_bed"}, - {"id": 5544, "synset": "baby_grand.n.01", "name": "baby_grand"}, - {"id": 5545, "synset": "baby_powder.n.01", "name": "baby_powder"}, - {"id": 5546, "synset": "baby_shoe.n.01", "name": "baby_shoe"}, - {"id": 5547, "synset": "back.n.08", "name": "back"}, - {"id": 5548, "synset": "back.n.07", "name": "back"}, - {"id": 5549, "synset": "backbench.n.01", "name": "backbench"}, - {"id": 5550, "synset": "backboard.n.02", "name": "backboard"}, - {"id": 5551, "synset": "backbone.n.05", "name": "backbone"}, - {"id": 5552, "synset": "back_brace.n.01", "name": "back_brace"}, - {"id": 5553, "synset": "backgammon_board.n.01", "name": "backgammon_board"}, - {"id": 5554, "synset": "background.n.07", "name": "background"}, - {"id": 5555, "synset": "backhoe.n.01", "name": "backhoe"}, - {"id": 5556, "synset": "backlighting.n.01", "name": "backlighting"}, - {"id": 5557, "synset": "backpacking_tent.n.01", "name": "backpacking_tent"}, - {"id": 5558, "synset": "backplate.n.01", "name": "backplate"}, - {"id": 5559, "synset": "back_porch.n.01", "name": "back_porch"}, - {"id": 5560, "synset": "backsaw.n.01", "name": "backsaw"}, - {"id": 5561, "synset": "backscratcher.n.02", "name": "backscratcher"}, - {"id": 5562, "synset": "backseat.n.02", "name": "backseat"}, - {"id": 5563, "synset": "backspace_key.n.01", "name": "backspace_key"}, - {"id": 5564, "synset": "backstairs.n.01", "name": "backstairs"}, - {"id": 5565, "synset": "backstay.n.01", "name": "backstay"}, - {"id": 5566, "synset": "backstop.n.02", "name": "backstop"}, - {"id": 5567, "synset": "backsword.n.02", "name": "backsword"}, - {"id": 5568, "synset": "backup_system.n.01", "name": "backup_system"}, - {"id": 5569, "synset": "badminton_court.n.01", "name": "badminton_court"}, - {"id": 5570, "synset": "badminton_equipment.n.01", "name": "badminton_equipment"}, - {"id": 5571, "synset": "badminton_racket.n.01", "name": "badminton_racket"}, - {"id": 5572, "synset": "bag.n.01", "name": "bag"}, - {"id": 5573, "synset": "baggage.n.01", "name": "baggage"}, - {"id": 5574, "synset": "baggage.n.03", "name": "baggage"}, - {"id": 5575, "synset": "baggage_car.n.01", "name": "baggage_car"}, - {"id": 5576, "synset": "baggage_claim.n.01", "name": "baggage_claim"}, - {"id": 5577, "synset": "bailey.n.04", "name": "bailey"}, - {"id": 5578, "synset": "bailey.n.03", "name": "bailey"}, - {"id": 5579, "synset": "bailey_bridge.n.01", "name": "Bailey_bridge"}, - {"id": 5580, "synset": "bain-marie.n.01", "name": "bain-marie"}, - {"id": 5581, "synset": "baize.n.01", "name": "baize"}, - {"id": 5582, "synset": "bakery.n.01", "name": "bakery"}, - {"id": 5583, "synset": "balaclava.n.01", "name": "balaclava"}, - {"id": 5584, "synset": "balalaika.n.01", "name": "balalaika"}, - {"id": 5585, "synset": "balance.n.12", "name": "balance"}, - {"id": 5586, "synset": "balance_beam.n.01", "name": "balance_beam"}, - {"id": 5587, "synset": "balance_wheel.n.01", "name": "balance_wheel"}, - {"id": 5588, "synset": "balbriggan.n.01", "name": "balbriggan"}, - {"id": 5589, "synset": "balcony.n.02", "name": "balcony"}, - {"id": 5590, "synset": "balcony.n.01", "name": "balcony"}, - {"id": 5591, "synset": "baldachin.n.01", "name": "baldachin"}, - {"id": 5592, "synset": "baldric.n.01", "name": "baldric"}, - {"id": 5593, "synset": "bale.n.01", "name": "bale"}, - {"id": 5594, "synset": "baling_wire.n.01", "name": "baling_wire"}, - {"id": 5595, "synset": "ball.n.01", "name": "ball"}, - {"id": 5596, "synset": "ball_and_chain.n.01", "name": "ball_and_chain"}, - {"id": 5597, "synset": "ball-and-socket_joint.n.02", "name": "ball-and-socket_joint"}, - {"id": 5598, "synset": "ballast.n.05", "name": "ballast"}, - {"id": 5599, "synset": "ball_bearing.n.01", "name": "ball_bearing"}, - {"id": 5600, "synset": "ball_cartridge.n.01", "name": "ball_cartridge"}, - {"id": 5601, "synset": "ballcock.n.01", "name": "ballcock"}, - {"id": 5602, "synset": "balldress.n.01", "name": "balldress"}, - {"id": 5603, "synset": "ball_gown.n.01", "name": "ball_gown"}, - {"id": 5604, "synset": "ballistic_galvanometer.n.01", "name": "ballistic_galvanometer"}, - {"id": 5605, "synset": "ballistic_missile.n.01", "name": "ballistic_missile"}, - {"id": 5606, "synset": "ballistic_pendulum.n.01", "name": "ballistic_pendulum"}, - {"id": 5607, "synset": "ballistocardiograph.n.01", "name": "ballistocardiograph"}, - {"id": 5608, "synset": "balloon_bomb.n.01", "name": "balloon_bomb"}, - {"id": 5609, "synset": "balloon_sail.n.01", "name": "balloon_sail"}, - {"id": 5610, "synset": "ballot_box.n.01", "name": "ballot_box"}, - {"id": 5611, "synset": "ballpark.n.01", "name": "ballpark"}, - {"id": 5612, "synset": "ball-peen_hammer.n.01", "name": "ball-peen_hammer"}, - {"id": 5613, "synset": "ballpoint.n.01", "name": "ballpoint"}, - {"id": 5614, "synset": "ballroom.n.01", "name": "ballroom"}, - {"id": 5615, "synset": "ball_valve.n.01", "name": "ball_valve"}, - {"id": 5616, "synset": "balsa_raft.n.01", "name": "balsa_raft"}, - {"id": 5617, "synset": "baluster.n.01", "name": "baluster"}, - {"id": 5618, "synset": "banana_boat.n.01", "name": "banana_boat"}, - {"id": 5619, "synset": "band.n.13", "name": "band"}, - {"id": 5620, "synset": "bandbox.n.01", "name": "bandbox"}, - {"id": 5621, "synset": "banderilla.n.01", "name": "banderilla"}, - {"id": 5622, "synset": "bandoleer.n.01", "name": "bandoleer"}, - {"id": 5623, "synset": "bandoneon.n.01", "name": "bandoneon"}, - {"id": 5624, "synset": "bandsaw.n.01", "name": "bandsaw"}, - {"id": 5625, "synset": "bandwagon.n.02", "name": "bandwagon"}, - {"id": 5626, "synset": "bangalore_torpedo.n.01", "name": "bangalore_torpedo"}, - {"id": 5627, "synset": "bangle.n.02", "name": "bangle"}, - {"id": 5628, "synset": "bannister.n.02", "name": "bannister"}, - {"id": 5629, "synset": "banquette.n.01", "name": "banquette"}, - {"id": 5630, "synset": "banyan.n.02", "name": "banyan"}, - {"id": 5631, "synset": "baptismal_font.n.01", "name": "baptismal_font"}, - {"id": 5632, "synset": "bar.n.03", "name": "bar"}, - {"id": 5633, "synset": "bar.n.02", "name": "bar"}, - {"id": 5634, "synset": "barbecue.n.03", "name": "barbecue"}, - {"id": 5635, "synset": "barbed_wire.n.01", "name": "barbed_wire"}, - {"id": 5636, "synset": "barber_chair.n.01", "name": "barber_chair"}, - {"id": 5637, "synset": "barbershop.n.01", "name": "barbershop"}, - {"id": 5638, "synset": "barbette_carriage.n.01", "name": "barbette_carriage"}, - {"id": 5639, "synset": "barbican.n.01", "name": "barbican"}, - {"id": 5640, "synset": "bar_bit.n.01", "name": "bar_bit"}, - {"id": 5641, "synset": "bareboat.n.01", "name": "bareboat"}, - {"id": 5642, "synset": "barge_pole.n.01", "name": "barge_pole"}, - {"id": 5643, "synset": "baritone.n.03", "name": "baritone"}, - {"id": 5644, "synset": "bark.n.03", "name": "bark"}, - {"id": 5645, "synset": "bar_magnet.n.01", "name": "bar_magnet"}, - {"id": 5646, "synset": "bar_mask.n.01", "name": "bar_mask"}, - {"id": 5647, "synset": "barn.n.01", "name": "barn"}, - {"id": 5648, "synset": "barndoor.n.01", "name": "barndoor"}, - {"id": 5649, "synset": "barn_door.n.01", "name": "barn_door"}, - {"id": 5650, "synset": "barnyard.n.01", "name": "barnyard"}, - {"id": 5651, "synset": "barograph.n.01", "name": "barograph"}, - {"id": 5652, "synset": "barometer.n.01", "name": "barometer"}, - {"id": 5653, "synset": "barong.n.01", "name": "barong"}, - {"id": 5654, "synset": "barouche.n.01", "name": "barouche"}, - {"id": 5655, "synset": "bar_printer.n.01", "name": "bar_printer"}, - {"id": 5656, "synset": "barrack.n.01", "name": "barrack"}, - {"id": 5657, "synset": "barrage_balloon.n.01", "name": "barrage_balloon"}, - {"id": 5658, "synset": "barrel.n.01", "name": "barrel"}, - {"id": 5659, "synset": "barrelhouse.n.01", "name": "barrelhouse"}, - {"id": 5660, "synset": "barrel_knot.n.01", "name": "barrel_knot"}, - {"id": 5661, "synset": "barrel_organ.n.01", "name": "barrel_organ"}, - {"id": 5662, "synset": "barrel_vault.n.01", "name": "barrel_vault"}, - {"id": 5663, "synset": "barricade.n.02", "name": "barricade"}, - {"id": 5664, "synset": "barrier.n.01", "name": "barrier"}, - {"id": 5665, "synset": "barroom.n.01", "name": "barroom"}, - {"id": 5666, "synset": "bascule.n.01", "name": "bascule"}, - {"id": 5667, "synset": "base.n.08", "name": "base"}, - {"id": 5668, "synset": "baseball_equipment.n.01", "name": "baseball_equipment"}, - {"id": 5669, "synset": "basement.n.01", "name": "basement"}, - {"id": 5670, "synset": "basement.n.02", "name": "basement"}, - { - "id": 5671, - "synset": "basic_point_defense_missile_system.n.01", - "name": "basic_point_defense_missile_system", - }, - {"id": 5672, "synset": "basilica.n.02", "name": "basilica"}, - {"id": 5673, "synset": "basilica.n.01", "name": "basilica"}, - {"id": 5674, "synset": "basilisk.n.02", "name": "basilisk"}, - {"id": 5675, "synset": "basin.n.01", "name": "basin"}, - {"id": 5676, "synset": "basinet.n.01", "name": "basinet"}, - {"id": 5677, "synset": "basket.n.03", "name": "basket"}, - {"id": 5678, "synset": "basketball_court.n.01", "name": "basketball_court"}, - {"id": 5679, "synset": "basketball_equipment.n.01", "name": "basketball_equipment"}, - {"id": 5680, "synset": "basket_weave.n.01", "name": "basket_weave"}, - {"id": 5681, "synset": "bass.n.07", "name": "bass"}, - {"id": 5682, "synset": "bass_clarinet.n.01", "name": "bass_clarinet"}, - {"id": 5683, "synset": "bass_drum.n.01", "name": "bass_drum"}, - {"id": 5684, "synset": "basset_horn.n.01", "name": "basset_horn"}, - {"id": 5685, "synset": "bass_fiddle.n.01", "name": "bass_fiddle"}, - {"id": 5686, "synset": "bass_guitar.n.01", "name": "bass_guitar"}, - {"id": 5687, "synset": "bassinet.n.01", "name": "bassinet"}, - {"id": 5688, "synset": "bassinet.n.02", "name": "bassinet"}, - {"id": 5689, "synset": "bassoon.n.01", "name": "bassoon"}, - {"id": 5690, "synset": "baster.n.03", "name": "baster"}, - {"id": 5691, "synset": "bastinado.n.01", "name": "bastinado"}, - {"id": 5692, "synset": "bastion.n.03", "name": "bastion"}, - {"id": 5693, "synset": "bastion.n.02", "name": "bastion"}, - {"id": 5694, "synset": "bat.n.05", "name": "bat"}, - {"id": 5695, "synset": "bath.n.01", "name": "bath"}, - {"id": 5696, "synset": "bath_chair.n.01", "name": "bath_chair"}, - {"id": 5697, "synset": "bathhouse.n.02", "name": "bathhouse"}, - {"id": 5698, "synset": "bathhouse.n.01", "name": "bathhouse"}, - {"id": 5699, "synset": "bathing_cap.n.01", "name": "bathing_cap"}, - {"id": 5700, "synset": "bath_oil.n.01", "name": "bath_oil"}, - {"id": 5701, "synset": "bathroom.n.01", "name": "bathroom"}, - {"id": 5702, "synset": "bath_salts.n.01", "name": "bath_salts"}, - {"id": 5703, "synset": "bathyscaphe.n.01", "name": "bathyscaphe"}, - {"id": 5704, "synset": "bathysphere.n.01", "name": "bathysphere"}, - {"id": 5705, "synset": "batik.n.01", "name": "batik"}, - {"id": 5706, "synset": "batiste.n.01", "name": "batiste"}, - {"id": 5707, "synset": "baton.n.01", "name": "baton"}, - {"id": 5708, "synset": "baton.n.05", "name": "baton"}, - {"id": 5709, "synset": "baton.n.04", "name": "baton"}, - {"id": 5710, "synset": "baton.n.03", "name": "baton"}, - {"id": 5711, "synset": "battering_ram.n.01", "name": "battering_ram"}, - {"id": 5712, "synset": "batter's_box.n.01", "name": "batter's_box"}, - {"id": 5713, "synset": "battery.n.05", "name": "battery"}, - {"id": 5714, "synset": "batting_cage.n.01", "name": "batting_cage"}, - {"id": 5715, "synset": "batting_glove.n.01", "name": "batting_glove"}, - {"id": 5716, "synset": "batting_helmet.n.01", "name": "batting_helmet"}, - {"id": 5717, "synset": "battle-ax.n.01", "name": "battle-ax"}, - {"id": 5718, "synset": "battle_cruiser.n.01", "name": "battle_cruiser"}, - {"id": 5719, "synset": "battle_dress.n.01", "name": "battle_dress"}, - {"id": 5720, "synset": "battlement.n.01", "name": "battlement"}, - {"id": 5721, "synset": "battleship.n.01", "name": "battleship"}, - {"id": 5722, "synset": "battle_sight.n.01", "name": "battle_sight"}, - {"id": 5723, "synset": "bay.n.05", "name": "bay"}, - {"id": 5724, "synset": "bay.n.04", "name": "bay"}, - {"id": 5725, "synset": "bayonet.n.01", "name": "bayonet"}, - {"id": 5726, "synset": "bay_rum.n.01", "name": "bay_rum"}, - {"id": 5727, "synset": "bay_window.n.02", "name": "bay_window"}, - {"id": 5728, "synset": "bazaar.n.01", "name": "bazaar"}, - {"id": 5729, "synset": "bazaar.n.02", "name": "bazaar"}, - {"id": 5730, "synset": "bazooka.n.01", "name": "bazooka"}, - {"id": 5731, "synset": "b_battery.n.01", "name": "B_battery"}, - {"id": 5732, "synset": "bb_gun.n.01", "name": "BB_gun"}, - {"id": 5733, "synset": "beach_house.n.01", "name": "beach_house"}, - {"id": 5734, "synset": "beach_towel.n.01", "name": "beach_towel"}, - {"id": 5735, "synset": "beach_wagon.n.01", "name": "beach_wagon"}, - {"id": 5736, "synset": "beachwear.n.01", "name": "beachwear"}, - {"id": 5737, "synset": "beacon.n.03", "name": "beacon"}, - {"id": 5738, "synset": "beading_plane.n.01", "name": "beading_plane"}, - {"id": 5739, "synset": "beaker.n.02", "name": "beaker"}, - {"id": 5740, "synset": "beaker.n.01", "name": "beaker"}, - {"id": 5741, "synset": "beam.n.02", "name": "beam"}, - {"id": 5742, "synset": "beam_balance.n.01", "name": "beam_balance"}, - {"id": 5743, "synset": "bearing.n.06", "name": "bearing"}, - {"id": 5744, "synset": "bearing_rein.n.01", "name": "bearing_rein"}, - {"id": 5745, "synset": "bearing_wall.n.01", "name": "bearing_wall"}, - {"id": 5746, "synset": "bearskin.n.02", "name": "bearskin"}, - {"id": 5747, "synset": "beater.n.02", "name": "beater"}, - {"id": 5748, "synset": "beating-reed_instrument.n.01", "name": "beating-reed_instrument"}, - {"id": 5749, "synset": "beaver.n.06", "name": "beaver"}, - {"id": 5750, "synset": "beaver.n.05", "name": "beaver"}, - {"id": 5751, "synset": "beckman_thermometer.n.01", "name": "Beckman_thermometer"}, - {"id": 5752, "synset": "bed.n.08", "name": "bed"}, - {"id": 5753, "synset": "bed_and_breakfast.n.01", "name": "bed_and_breakfast"}, - {"id": 5754, "synset": "bedclothes.n.01", "name": "bedclothes"}, - {"id": 5755, "synset": "bedford_cord.n.01", "name": "Bedford_cord"}, - {"id": 5756, "synset": "bed_jacket.n.01", "name": "bed_jacket"}, - {"id": 5757, "synset": "bedpost.n.01", "name": "bedpost"}, - {"id": 5758, "synset": "bedroll.n.01", "name": "bedroll"}, - {"id": 5759, "synset": "bedroom.n.01", "name": "bedroom"}, - {"id": 5760, "synset": "bedroom_furniture.n.01", "name": "bedroom_furniture"}, - {"id": 5761, "synset": "bedsitting_room.n.01", "name": "bedsitting_room"}, - {"id": 5762, "synset": "bedspring.n.01", "name": "bedspring"}, - {"id": 5763, "synset": "bedstead.n.01", "name": "bedstead"}, - {"id": 5764, "synset": "beefcake.n.01", "name": "beefcake"}, - {"id": 5765, "synset": "beehive.n.04", "name": "beehive"}, - {"id": 5766, "synset": "beer_barrel.n.01", "name": "beer_barrel"}, - {"id": 5767, "synset": "beer_garden.n.01", "name": "beer_garden"}, - {"id": 5768, "synset": "beer_glass.n.01", "name": "beer_glass"}, - {"id": 5769, "synset": "beer_hall.n.01", "name": "beer_hall"}, - {"id": 5770, "synset": "beer_mat.n.01", "name": "beer_mat"}, - {"id": 5771, "synset": "beer_mug.n.01", "name": "beer_mug"}, - {"id": 5772, "synset": "belaying_pin.n.01", "name": "belaying_pin"}, - {"id": 5773, "synset": "belfry.n.02", "name": "belfry"}, - {"id": 5774, "synset": "bell_arch.n.01", "name": "bell_arch"}, - {"id": 5775, "synset": "bellarmine.n.02", "name": "bellarmine"}, - {"id": 5776, "synset": "bellbottom_trousers.n.01", "name": "bellbottom_trousers"}, - {"id": 5777, "synset": "bell_cote.n.01", "name": "bell_cote"}, - {"id": 5778, "synset": "bell_foundry.n.01", "name": "bell_foundry"}, - {"id": 5779, "synset": "bell_gable.n.01", "name": "bell_gable"}, - {"id": 5780, "synset": "bell_jar.n.01", "name": "bell_jar"}, - {"id": 5781, "synset": "bellows.n.01", "name": "bellows"}, - {"id": 5782, "synset": "bellpull.n.01", "name": "bellpull"}, - {"id": 5783, "synset": "bell_push.n.01", "name": "bell_push"}, - {"id": 5784, "synset": "bell_seat.n.01", "name": "bell_seat"}, - {"id": 5785, "synset": "bell_tent.n.01", "name": "bell_tent"}, - {"id": 5786, "synset": "bell_tower.n.01", "name": "bell_tower"}, - {"id": 5787, "synset": "bellyband.n.01", "name": "bellyband"}, - {"id": 5788, "synset": "belt.n.06", "name": "belt"}, - {"id": 5789, "synset": "belting.n.01", "name": "belting"}, - {"id": 5790, "synset": "bench_clamp.n.01", "name": "bench_clamp"}, - {"id": 5791, "synset": "bench_hook.n.01", "name": "bench_hook"}, - {"id": 5792, "synset": "bench_lathe.n.01", "name": "bench_lathe"}, - {"id": 5793, "synset": "bench_press.n.02", "name": "bench_press"}, - {"id": 5794, "synset": "bender.n.01", "name": "bender"}, - {"id": 5795, "synset": "berlin.n.03", "name": "berlin"}, - {"id": 5796, "synset": "bermuda_shorts.n.01", "name": "Bermuda_shorts"}, - {"id": 5797, "synset": "berth.n.03", "name": "berth"}, - {"id": 5798, "synset": "besom.n.01", "name": "besom"}, - {"id": 5799, "synset": "bessemer_converter.n.01", "name": "Bessemer_converter"}, - {"id": 5800, "synset": "bethel.n.01", "name": "bethel"}, - {"id": 5801, "synset": "betting_shop.n.01", "name": "betting_shop"}, - {"id": 5802, "synset": "bevatron.n.01", "name": "bevatron"}, - {"id": 5803, "synset": "bevel.n.02", "name": "bevel"}, - {"id": 5804, "synset": "bevel_gear.n.01", "name": "bevel_gear"}, - {"id": 5805, "synset": "b-flat_clarinet.n.01", "name": "B-flat_clarinet"}, - {"id": 5806, "synset": "bib.n.01", "name": "bib"}, - {"id": 5807, "synset": "bib-and-tucker.n.01", "name": "bib-and-tucker"}, - {"id": 5808, "synset": "bicorn.n.01", "name": "bicorn"}, - {"id": 5809, "synset": "bicycle-built-for-two.n.01", "name": "bicycle-built-for-two"}, - {"id": 5810, "synset": "bicycle_chain.n.01", "name": "bicycle_chain"}, - {"id": 5811, "synset": "bicycle_clip.n.01", "name": "bicycle_clip"}, - {"id": 5812, "synset": "bicycle_pump.n.01", "name": "bicycle_pump"}, - {"id": 5813, "synset": "bicycle_rack.n.01", "name": "bicycle_rack"}, - {"id": 5814, "synset": "bicycle_seat.n.01", "name": "bicycle_seat"}, - {"id": 5815, "synset": "bicycle_wheel.n.01", "name": "bicycle_wheel"}, - {"id": 5816, "synset": "bidet.n.01", "name": "bidet"}, - {"id": 5817, "synset": "bier.n.02", "name": "bier"}, - {"id": 5818, "synset": "bier.n.01", "name": "bier"}, - {"id": 5819, "synset": "bi-fold_door.n.01", "name": "bi-fold_door"}, - {"id": 5820, "synset": "bifocals.n.01", "name": "bifocals"}, - {"id": 5821, "synset": "big_blue.n.01", "name": "Big_Blue"}, - {"id": 5822, "synset": "big_board.n.02", "name": "big_board"}, - {"id": 5823, "synset": "bight.n.04", "name": "bight"}, - {"id": 5824, "synset": "bikini.n.02", "name": "bikini"}, - {"id": 5825, "synset": "bikini_pants.n.01", "name": "bikini_pants"}, - {"id": 5826, "synset": "bilge.n.02", "name": "bilge"}, - {"id": 5827, "synset": "bilge_keel.n.01", "name": "bilge_keel"}, - {"id": 5828, "synset": "bilge_pump.n.01", "name": "bilge_pump"}, - {"id": 5829, "synset": "bilge_well.n.01", "name": "bilge_well"}, - {"id": 5830, "synset": "bill.n.08", "name": "bill"}, - {"id": 5831, "synset": "billiard_ball.n.01", "name": "billiard_ball"}, - {"id": 5832, "synset": "billiard_room.n.01", "name": "billiard_room"}, - {"id": 5833, "synset": "bin.n.01", "name": "bin"}, - {"id": 5834, "synset": "binder.n.04", "name": "binder"}, - {"id": 5835, "synset": "bindery.n.01", "name": "bindery"}, - {"id": 5836, "synset": "binding.n.05", "name": "binding"}, - {"id": 5837, "synset": "bin_liner.n.01", "name": "bin_liner"}, - {"id": 5838, "synset": "binnacle.n.01", "name": "binnacle"}, - {"id": 5839, "synset": "binocular_microscope.n.01", "name": "binocular_microscope"}, - {"id": 5840, "synset": "biochip.n.01", "name": "biochip"}, - {"id": 5841, "synset": "biohazard_suit.n.01", "name": "biohazard_suit"}, - {"id": 5842, "synset": "bioscope.n.02", "name": "bioscope"}, - {"id": 5843, "synset": "biplane.n.01", "name": "biplane"}, - {"id": 5844, "synset": "birch.n.03", "name": "birch"}, - {"id": 5845, "synset": "birchbark_canoe.n.01", "name": "birchbark_canoe"}, - {"id": 5846, "synset": "birdcall.n.02", "name": "birdcall"}, - {"id": 5847, "synset": "bird_shot.n.01", "name": "bird_shot"}, - {"id": 5848, "synset": "biretta.n.01", "name": "biretta"}, - {"id": 5849, "synset": "bishop.n.03", "name": "bishop"}, - {"id": 5850, "synset": "bistro.n.01", "name": "bistro"}, - {"id": 5851, "synset": "bit.n.11", "name": "bit"}, - {"id": 5852, "synset": "bit.n.05", "name": "bit"}, - {"id": 5853, "synset": "bite_plate.n.01", "name": "bite_plate"}, - {"id": 5854, "synset": "bitewing.n.01", "name": "bitewing"}, - {"id": 5855, "synset": "bitumastic.n.01", "name": "bitumastic"}, - {"id": 5856, "synset": "black.n.07", "name": "black"}, - {"id": 5857, "synset": "black.n.06", "name": "black"}, - {"id": 5858, "synset": "blackboard_eraser.n.01", "name": "blackboard_eraser"}, - {"id": 5859, "synset": "black_box.n.01", "name": "black_box"}, - {"id": 5860, "synset": "blackface.n.01", "name": "blackface"}, - {"id": 5861, "synset": "blackjack.n.02", "name": "blackjack"}, - {"id": 5862, "synset": "black_tie.n.02", "name": "black_tie"}, - {"id": 5863, "synset": "blackwash.n.03", "name": "blackwash"}, - {"id": 5864, "synset": "bladder.n.02", "name": "bladder"}, - {"id": 5865, "synset": "blade.n.09", "name": "blade"}, - {"id": 5866, "synset": "blade.n.08", "name": "blade"}, - {"id": 5867, "synset": "blade.n.07", "name": "blade"}, - {"id": 5868, "synset": "blank.n.04", "name": "blank"}, - {"id": 5869, "synset": "blast_furnace.n.01", "name": "blast_furnace"}, - {"id": 5870, "synset": "blasting_cap.n.01", "name": "blasting_cap"}, - {"id": 5871, "synset": "blind.n.03", "name": "blind"}, - {"id": 5872, "synset": "blind_curve.n.01", "name": "blind_curve"}, - {"id": 5873, "synset": "blindfold.n.01", "name": "blindfold"}, - {"id": 5874, "synset": "bling.n.01", "name": "bling"}, - {"id": 5875, "synset": "blister_pack.n.01", "name": "blister_pack"}, - {"id": 5876, "synset": "block.n.05", "name": "block"}, - {"id": 5877, "synset": "blockade.n.02", "name": "blockade"}, - {"id": 5878, "synset": "blockade-runner.n.01", "name": "blockade-runner"}, - {"id": 5879, "synset": "block_and_tackle.n.01", "name": "block_and_tackle"}, - {"id": 5880, "synset": "blockbuster.n.01", "name": "blockbuster"}, - {"id": 5881, "synset": "blockhouse.n.01", "name": "blockhouse"}, - {"id": 5882, "synset": "block_plane.n.01", "name": "block_plane"}, - {"id": 5883, "synset": "bloodmobile.n.01", "name": "bloodmobile"}, - {"id": 5884, "synset": "bloomers.n.01", "name": "bloomers"}, - {"id": 5885, "synset": "blower.n.01", "name": "blower"}, - {"id": 5886, "synset": "blowtorch.n.01", "name": "blowtorch"}, - {"id": 5887, "synset": "blucher.n.02", "name": "blucher"}, - {"id": 5888, "synset": "bludgeon.n.01", "name": "bludgeon"}, - {"id": 5889, "synset": "blue.n.02", "name": "blue"}, - {"id": 5890, "synset": "blue_chip.n.02", "name": "blue_chip"}, - {"id": 5891, "synset": "blunderbuss.n.01", "name": "blunderbuss"}, - {"id": 5892, "synset": "blunt_file.n.01", "name": "blunt_file"}, - {"id": 5893, "synset": "boarding.n.02", "name": "boarding"}, - {"id": 5894, "synset": "boarding_house.n.01", "name": "boarding_house"}, - {"id": 5895, "synset": "boardroom.n.01", "name": "boardroom"}, - {"id": 5896, "synset": "boards.n.02", "name": "boards"}, - {"id": 5897, "synset": "boater.n.01", "name": "boater"}, - {"id": 5898, "synset": "boat_hook.n.01", "name": "boat_hook"}, - {"id": 5899, "synset": "boathouse.n.01", "name": "boathouse"}, - {"id": 5900, "synset": "boatswain's_chair.n.01", "name": "boatswain's_chair"}, - {"id": 5901, "synset": "boat_train.n.01", "name": "boat_train"}, - {"id": 5902, "synset": "boatyard.n.01", "name": "boatyard"}, - {"id": 5903, "synset": "bobsled.n.02", "name": "bobsled"}, - {"id": 5904, "synset": "bobsled.n.01", "name": "bobsled"}, - {"id": 5905, "synset": "bocce_ball.n.01", "name": "bocce_ball"}, - {"id": 5906, "synset": "bodega.n.01", "name": "bodega"}, - {"id": 5907, "synset": "bodice.n.01", "name": "bodice"}, - {"id": 5908, "synset": "bodkin.n.04", "name": "bodkin"}, - {"id": 5909, "synset": "bodkin.n.03", "name": "bodkin"}, - {"id": 5910, "synset": "bodkin.n.02", "name": "bodkin"}, - {"id": 5911, "synset": "body.n.11", "name": "body"}, - {"id": 5912, "synset": "body_armor.n.01", "name": "body_armor"}, - {"id": 5913, "synset": "body_lotion.n.01", "name": "body_lotion"}, - {"id": 5914, "synset": "body_stocking.n.01", "name": "body_stocking"}, - {"id": 5915, "synset": "body_plethysmograph.n.01", "name": "body_plethysmograph"}, - {"id": 5916, "synset": "body_pad.n.01", "name": "body_pad"}, - {"id": 5917, "synset": "bodywork.n.01", "name": "bodywork"}, - {"id": 5918, "synset": "bofors_gun.n.01", "name": "Bofors_gun"}, - {"id": 5919, "synset": "bogy.n.01", "name": "bogy"}, - {"id": 5920, "synset": "boiler.n.01", "name": "boiler"}, - {"id": 5921, "synset": "boiling_water_reactor.n.01", "name": "boiling_water_reactor"}, - {"id": 5922, "synset": "bolero.n.02", "name": "bolero"}, - {"id": 5923, "synset": "bollard.n.01", "name": "bollard"}, - {"id": 5924, "synset": "bolo.n.02", "name": "bolo"}, - {"id": 5925, "synset": "bolt.n.02", "name": "bolt"}, - {"id": 5926, "synset": "bolt_cutter.n.01", "name": "bolt_cutter"}, - {"id": 5927, "synset": "bomb.n.01", "name": "bomb"}, - {"id": 5928, "synset": "bombazine.n.01", "name": "bombazine"}, - {"id": 5929, "synset": "bomb_calorimeter.n.01", "name": "bomb_calorimeter"}, - {"id": 5930, "synset": "bomber.n.01", "name": "bomber"}, - {"id": 5931, "synset": "bomber_jacket.n.01", "name": "bomber_jacket"}, - {"id": 5932, "synset": "bomblet.n.01", "name": "bomblet"}, - {"id": 5933, "synset": "bomb_rack.n.01", "name": "bomb_rack"}, - {"id": 5934, "synset": "bombshell.n.03", "name": "bombshell"}, - {"id": 5935, "synset": "bomb_shelter.n.01", "name": "bomb_shelter"}, - {"id": 5936, "synset": "bone-ash_cup.n.01", "name": "bone-ash_cup"}, - {"id": 5937, "synset": "bone_china.n.01", "name": "bone_china"}, - {"id": 5938, "synset": "bones.n.01", "name": "bones"}, - {"id": 5939, "synset": "boneshaker.n.01", "name": "boneshaker"}, - {"id": 5940, "synset": "bongo.n.01", "name": "bongo"}, - {"id": 5941, "synset": "book.n.11", "name": "book"}, - {"id": 5942, "synset": "book_bag.n.01", "name": "book_bag"}, - {"id": 5943, "synset": "bookbindery.n.01", "name": "bookbindery"}, - {"id": 5944, "synset": "bookend.n.01", "name": "bookend"}, - {"id": 5945, "synset": "bookmobile.n.01", "name": "bookmobile"}, - {"id": 5946, "synset": "bookshelf.n.01", "name": "bookshelf"}, - {"id": 5947, "synset": "bookshop.n.01", "name": "bookshop"}, - {"id": 5948, "synset": "boom.n.05", "name": "boom"}, - {"id": 5949, "synset": "boomerang.n.01", "name": "boomerang"}, - {"id": 5950, "synset": "booster.n.05", "name": "booster"}, - {"id": 5951, "synset": "booster.n.04", "name": "booster"}, - {"id": 5952, "synset": "boot.n.04", "name": "boot"}, - {"id": 5953, "synset": "boot_camp.n.01", "name": "boot_camp"}, - {"id": 5954, "synset": "bootee.n.01", "name": "bootee"}, - {"id": 5955, "synset": "booth.n.02", "name": "booth"}, - {"id": 5956, "synset": "booth.n.04", "name": "booth"}, - {"id": 5957, "synset": "booth.n.01", "name": "booth"}, - {"id": 5958, "synset": "boothose.n.01", "name": "boothose"}, - {"id": 5959, "synset": "bootjack.n.01", "name": "bootjack"}, - {"id": 5960, "synset": "bootlace.n.01", "name": "bootlace"}, - {"id": 5961, "synset": "bootleg.n.02", "name": "bootleg"}, - {"id": 5962, "synset": "bootstrap.n.01", "name": "bootstrap"}, - {"id": 5963, "synset": "bore_bit.n.01", "name": "bore_bit"}, - {"id": 5964, "synset": "boron_chamber.n.01", "name": "boron_chamber"}, - {"id": 5965, "synset": "borstal.n.01", "name": "borstal"}, - {"id": 5966, "synset": "bosom.n.03", "name": "bosom"}, - {"id": 5967, "synset": "boston_rocker.n.01", "name": "Boston_rocker"}, - {"id": 5968, "synset": "bota.n.01", "name": "bota"}, - {"id": 5969, "synset": "bottle.n.03", "name": "bottle"}, - {"id": 5970, "synset": "bottle_bank.n.01", "name": "bottle_bank"}, - {"id": 5971, "synset": "bottlebrush.n.01", "name": "bottlebrush"}, - {"id": 5972, "synset": "bottlecap.n.01", "name": "bottlecap"}, - {"id": 5973, "synset": "bottling_plant.n.01", "name": "bottling_plant"}, - {"id": 5974, "synset": "bottom.n.07", "name": "bottom"}, - {"id": 5975, "synset": "boucle.n.01", "name": "boucle"}, - {"id": 5976, "synset": "boudoir.n.01", "name": "boudoir"}, - {"id": 5977, "synset": "boulle.n.01", "name": "boulle"}, - {"id": 5978, "synset": "bouncing_betty.n.01", "name": "bouncing_betty"}, - {"id": 5979, "synset": "boutique.n.01", "name": "boutique"}, - {"id": 5980, "synset": "boutonniere.n.01", "name": "boutonniere"}, - {"id": 5981, "synset": "bow.n.02", "name": "bow"}, - {"id": 5982, "synset": "bow.n.01", "name": "bow"}, - {"id": 5983, "synset": "bow_and_arrow.n.01", "name": "bow_and_arrow"}, - {"id": 5984, "synset": "bowed_stringed_instrument.n.01", "name": "bowed_stringed_instrument"}, - {"id": 5985, "synset": "bowie_knife.n.01", "name": "Bowie_knife"}, - {"id": 5986, "synset": "bowl.n.01", "name": "bowl"}, - {"id": 5987, "synset": "bowl.n.07", "name": "bowl"}, - {"id": 5988, "synset": "bowline.n.01", "name": "bowline"}, - {"id": 5989, "synset": "bowling_alley.n.01", "name": "bowling_alley"}, - {"id": 5990, "synset": "bowling_equipment.n.01", "name": "bowling_equipment"}, - {"id": 5991, "synset": "bowling_pin.n.01", "name": "bowling_pin"}, - {"id": 5992, "synset": "bowling_shoe.n.01", "name": "bowling_shoe"}, - {"id": 5993, "synset": "bowsprit.n.01", "name": "bowsprit"}, - {"id": 5994, "synset": "bowstring.n.01", "name": "bowstring"}, - {"id": 5995, "synset": "box.n.02", "name": "box"}, - {"id": 5996, "synset": "box.n.08", "name": "box"}, - {"id": 5997, "synset": "box_beam.n.01", "name": "box_beam"}, - {"id": 5998, "synset": "box_camera.n.01", "name": "box_camera"}, - {"id": 5999, "synset": "boxcar.n.01", "name": "boxcar"}, - {"id": 6000, "synset": "box_coat.n.01", "name": "box_coat"}, - {"id": 6001, "synset": "boxing_equipment.n.01", "name": "boxing_equipment"}, - {"id": 6002, "synset": "box_office.n.02", "name": "box_office"}, - {"id": 6003, "synset": "box_spring.n.01", "name": "box_spring"}, - {"id": 6004, "synset": "box_wrench.n.01", "name": "box_wrench"}, - {"id": 6005, "synset": "brace.n.09", "name": "brace"}, - {"id": 6006, "synset": "brace.n.07", "name": "brace"}, - {"id": 6007, "synset": "brace.n.01", "name": "brace"}, - {"id": 6008, "synset": "brace_and_bit.n.01", "name": "brace_and_bit"}, - {"id": 6009, "synset": "bracer.n.01", "name": "bracer"}, - {"id": 6010, "synset": "brace_wrench.n.01", "name": "brace_wrench"}, - {"id": 6011, "synset": "bracket.n.04", "name": "bracket"}, - {"id": 6012, "synset": "bradawl.n.01", "name": "bradawl"}, - {"id": 6013, "synset": "brake.n.01", "name": "brake"}, - {"id": 6014, "synset": "brake.n.05", "name": "brake"}, - {"id": 6015, "synset": "brake_band.n.01", "name": "brake_band"}, - {"id": 6016, "synset": "brake_cylinder.n.01", "name": "brake_cylinder"}, - {"id": 6017, "synset": "brake_disk.n.01", "name": "brake_disk"}, - {"id": 6018, "synset": "brake_drum.n.01", "name": "brake_drum"}, - {"id": 6019, "synset": "brake_lining.n.01", "name": "brake_lining"}, - {"id": 6020, "synset": "brake_pad.n.01", "name": "brake_pad"}, - {"id": 6021, "synset": "brake_pedal.n.01", "name": "brake_pedal"}, - {"id": 6022, "synset": "brake_shoe.n.01", "name": "brake_shoe"}, - {"id": 6023, "synset": "brake_system.n.01", "name": "brake_system"}, - {"id": 6024, "synset": "brass.n.02", "name": "brass"}, - {"id": 6025, "synset": "brass.n.05", "name": "brass"}, - {"id": 6026, "synset": "brassard.n.01", "name": "brassard"}, - {"id": 6027, "synset": "brasserie.n.01", "name": "brasserie"}, - {"id": 6028, "synset": "brassie.n.01", "name": "brassie"}, - {"id": 6029, "synset": "brass_knucks.n.01", "name": "brass_knucks"}, - {"id": 6030, "synset": "brattice.n.01", "name": "brattice"}, - {"id": 6031, "synset": "brazier.n.01", "name": "brazier"}, - {"id": 6032, "synset": "breadbasket.n.03", "name": "breadbasket"}, - {"id": 6033, "synset": "bread_knife.n.01", "name": "bread_knife"}, - {"id": 6034, "synset": "breakable.n.01", "name": "breakable"}, - {"id": 6035, "synset": "breakfast_area.n.01", "name": "breakfast_area"}, - {"id": 6036, "synset": "breakfast_table.n.01", "name": "breakfast_table"}, - {"id": 6037, "synset": "breakwater.n.01", "name": "breakwater"}, - {"id": 6038, "synset": "breast_drill.n.01", "name": "breast_drill"}, - {"id": 6039, "synset": "breast_implant.n.01", "name": "breast_implant"}, - {"id": 6040, "synset": "breastplate.n.01", "name": "breastplate"}, - {"id": 6041, "synset": "breast_pocket.n.01", "name": "breast_pocket"}, - {"id": 6042, "synset": "breathalyzer.n.01", "name": "breathalyzer"}, - {"id": 6043, "synset": "breechblock.n.01", "name": "breechblock"}, - {"id": 6044, "synset": "breeches.n.01", "name": "breeches"}, - {"id": 6045, "synset": "breeches_buoy.n.01", "name": "breeches_buoy"}, - {"id": 6046, "synset": "breechloader.n.01", "name": "breechloader"}, - {"id": 6047, "synset": "breeder_reactor.n.01", "name": "breeder_reactor"}, - {"id": 6048, "synset": "bren.n.01", "name": "Bren"}, - {"id": 6049, "synset": "brewpub.n.01", "name": "brewpub"}, - {"id": 6050, "synset": "brick.n.01", "name": "brick"}, - {"id": 6051, "synset": "brickkiln.n.01", "name": "brickkiln"}, - {"id": 6052, "synset": "bricklayer's_hammer.n.01", "name": "bricklayer's_hammer"}, - {"id": 6053, "synset": "brick_trowel.n.01", "name": "brick_trowel"}, - {"id": 6054, "synset": "brickwork.n.01", "name": "brickwork"}, - {"id": 6055, "synset": "bridge.n.01", "name": "bridge"}, - {"id": 6056, "synset": "bridge.n.08", "name": "bridge"}, - {"id": 6057, "synset": "bridle.n.01", "name": "bridle"}, - {"id": 6058, "synset": "bridle_path.n.01", "name": "bridle_path"}, - {"id": 6059, "synset": "bridoon.n.01", "name": "bridoon"}, - {"id": 6060, "synset": "briefcase_bomb.n.01", "name": "briefcase_bomb"}, - {"id": 6061, "synset": "briefcase_computer.n.01", "name": "briefcase_computer"}, - {"id": 6062, "synset": "briefs.n.01", "name": "briefs"}, - {"id": 6063, "synset": "brig.n.02", "name": "brig"}, - {"id": 6064, "synset": "brig.n.01", "name": "brig"}, - {"id": 6065, "synset": "brigandine.n.01", "name": "brigandine"}, - {"id": 6066, "synset": "brigantine.n.01", "name": "brigantine"}, - {"id": 6067, "synset": "brilliantine.n.01", "name": "brilliantine"}, - {"id": 6068, "synset": "brilliant_pebble.n.01", "name": "brilliant_pebble"}, - {"id": 6069, "synset": "brim.n.02", "name": "brim"}, - {"id": 6070, "synset": "bristle_brush.n.01", "name": "bristle_brush"}, - {"id": 6071, "synset": "britches.n.01", "name": "britches"}, - {"id": 6072, "synset": "broad_arrow.n.03", "name": "broad_arrow"}, - {"id": 6073, "synset": "broadax.n.01", "name": "broadax"}, - {"id": 6074, "synset": "brochette.n.01", "name": "brochette"}, - {"id": 6075, "synset": "broadcaster.n.02", "name": "broadcaster"}, - {"id": 6076, "synset": "broadcloth.n.02", "name": "broadcloth"}, - {"id": 6077, "synset": "broadcloth.n.01", "name": "broadcloth"}, - {"id": 6078, "synset": "broad_hatchet.n.01", "name": "broad_hatchet"}, - {"id": 6079, "synset": "broadloom.n.01", "name": "broadloom"}, - {"id": 6080, "synset": "broadside.n.03", "name": "broadside"}, - {"id": 6081, "synset": "broadsword.n.01", "name": "broadsword"}, - {"id": 6082, "synset": "brocade.n.01", "name": "brocade"}, - {"id": 6083, "synset": "brogan.n.01", "name": "brogan"}, - {"id": 6084, "synset": "broiler.n.01", "name": "broiler"}, - {"id": 6085, "synset": "broken_arch.n.01", "name": "broken_arch"}, - {"id": 6086, "synset": "bronchoscope.n.01", "name": "bronchoscope"}, - {"id": 6087, "synset": "broom_closet.n.01", "name": "broom_closet"}, - {"id": 6088, "synset": "broomstick.n.01", "name": "broomstick"}, - {"id": 6089, "synset": "brougham.n.01", "name": "brougham"}, - {"id": 6090, "synset": "browning_automatic_rifle.n.01", "name": "Browning_automatic_rifle"}, - {"id": 6091, "synset": "browning_machine_gun.n.01", "name": "Browning_machine_gun"}, - {"id": 6092, "synset": "brownstone.n.02", "name": "brownstone"}, - {"id": 6093, "synset": "brunch_coat.n.01", "name": "brunch_coat"}, - {"id": 6094, "synset": "brush.n.02", "name": "brush"}, - {"id": 6095, "synset": "brussels_carpet.n.01", "name": "Brussels_carpet"}, - {"id": 6096, "synset": "brussels_lace.n.01", "name": "Brussels_lace"}, - {"id": 6097, "synset": "bubble.n.04", "name": "bubble"}, - {"id": 6098, "synset": "bubble_chamber.n.01", "name": "bubble_chamber"}, - {"id": 6099, "synset": "bubble_jet_printer.n.01", "name": "bubble_jet_printer"}, - {"id": 6100, "synset": "buckboard.n.01", "name": "buckboard"}, - {"id": 6101, "synset": "bucket_seat.n.01", "name": "bucket_seat"}, - {"id": 6102, "synset": "bucket_shop.n.02", "name": "bucket_shop"}, - {"id": 6103, "synset": "buckle.n.01", "name": "buckle"}, - {"id": 6104, "synset": "buckram.n.01", "name": "buckram"}, - {"id": 6105, "synset": "bucksaw.n.01", "name": "bucksaw"}, - {"id": 6106, "synset": "buckskins.n.01", "name": "buckskins"}, - {"id": 6107, "synset": "buff.n.05", "name": "buff"}, - {"id": 6108, "synset": "buffer.n.05", "name": "buffer"}, - {"id": 6109, "synset": "buffer.n.04", "name": "buffer"}, - {"id": 6110, "synset": "buffet.n.01", "name": "buffet"}, - {"id": 6111, "synset": "buffing_wheel.n.01", "name": "buffing_wheel"}, - {"id": 6112, "synset": "bugle.n.01", "name": "bugle"}, - {"id": 6113, "synset": "building.n.01", "name": "building"}, - {"id": 6114, "synset": "building_complex.n.01", "name": "building_complex"}, - {"id": 6115, "synset": "bulldog_clip.n.01", "name": "bulldog_clip"}, - {"id": 6116, "synset": "bulldog_wrench.n.01", "name": "bulldog_wrench"}, - {"id": 6117, "synset": "bullet.n.01", "name": "bullet"}, - {"id": 6118, "synset": "bullion.n.02", "name": "bullion"}, - {"id": 6119, "synset": "bullnose.n.01", "name": "bullnose"}, - {"id": 6120, "synset": "bullpen.n.02", "name": "bullpen"}, - {"id": 6121, "synset": "bullpen.n.01", "name": "bullpen"}, - {"id": 6122, "synset": "bullring.n.01", "name": "bullring"}, - {"id": 6123, "synset": "bulwark.n.02", "name": "bulwark"}, - {"id": 6124, "synset": "bumboat.n.01", "name": "bumboat"}, - {"id": 6125, "synset": "bumper.n.02", "name": "bumper"}, - {"id": 6126, "synset": "bumper.n.01", "name": "bumper"}, - {"id": 6127, "synset": "bumper_car.n.01", "name": "bumper_car"}, - {"id": 6128, "synset": "bumper_guard.n.01", "name": "bumper_guard"}, - {"id": 6129, "synset": "bumper_jack.n.01", "name": "bumper_jack"}, - {"id": 6130, "synset": "bundle.n.02", "name": "bundle"}, - {"id": 6131, "synset": "bung.n.01", "name": "bung"}, - {"id": 6132, "synset": "bungalow.n.01", "name": "bungalow"}, - {"id": 6133, "synset": "bungee.n.01", "name": "bungee"}, - {"id": 6134, "synset": "bunghole.n.02", "name": "bunghole"}, - {"id": 6135, "synset": "bunk.n.03", "name": "bunk"}, - {"id": 6136, "synset": "bunk.n.01", "name": "bunk"}, - {"id": 6137, "synset": "bunker.n.01", "name": "bunker"}, - {"id": 6138, "synset": "bunker.n.03", "name": "bunker"}, - {"id": 6139, "synset": "bunker.n.02", "name": "bunker"}, - {"id": 6140, "synset": "bunsen_burner.n.01", "name": "bunsen_burner"}, - {"id": 6141, "synset": "bunting.n.01", "name": "bunting"}, - {"id": 6142, "synset": "bur.n.02", "name": "bur"}, - {"id": 6143, "synset": "burberry.n.01", "name": "Burberry"}, - {"id": 6144, "synset": "burette.n.01", "name": "burette"}, - {"id": 6145, "synset": "burglar_alarm.n.02", "name": "burglar_alarm"}, - {"id": 6146, "synset": "burial_chamber.n.01", "name": "burial_chamber"}, - {"id": 6147, "synset": "burial_garment.n.01", "name": "burial_garment"}, - {"id": 6148, "synset": "burial_mound.n.01", "name": "burial_mound"}, - {"id": 6149, "synset": "burin.n.01", "name": "burin"}, - {"id": 6150, "synset": "burqa.n.01", "name": "burqa"}, - {"id": 6151, "synset": "burlap.n.01", "name": "burlap"}, - {"id": 6152, "synset": "burn_bag.n.01", "name": "burn_bag"}, - {"id": 6153, "synset": "burner.n.01", "name": "burner"}, - {"id": 6154, "synset": "burnous.n.01", "name": "burnous"}, - {"id": 6155, "synset": "burp_gun.n.01", "name": "burp_gun"}, - {"id": 6156, "synset": "burr.n.04", "name": "burr"}, - {"id": 6157, "synset": "bushel_basket.n.01", "name": "bushel_basket"}, - {"id": 6158, "synset": "bushing.n.02", "name": "bushing"}, - {"id": 6159, "synset": "bush_jacket.n.01", "name": "bush_jacket"}, - {"id": 6160, "synset": "business_suit.n.01", "name": "business_suit"}, - {"id": 6161, "synset": "buskin.n.01", "name": "buskin"}, - {"id": 6162, "synset": "bustier.n.01", "name": "bustier"}, - {"id": 6163, "synset": "bustle.n.02", "name": "bustle"}, - {"id": 6164, "synset": "butcher_knife.n.01", "name": "butcher_knife"}, - {"id": 6165, "synset": "butcher_shop.n.01", "name": "butcher_shop"}, - {"id": 6166, "synset": "butter_dish.n.01", "name": "butter_dish"}, - {"id": 6167, "synset": "butterfly_valve.n.01", "name": "butterfly_valve"}, - {"id": 6168, "synset": "butter_knife.n.01", "name": "butter_knife"}, - {"id": 6169, "synset": "butt_hinge.n.01", "name": "butt_hinge"}, - {"id": 6170, "synset": "butt_joint.n.01", "name": "butt_joint"}, - {"id": 6171, "synset": "buttonhook.n.01", "name": "buttonhook"}, - {"id": 6172, "synset": "buttress.n.01", "name": "buttress"}, - {"id": 6173, "synset": "butt_shaft.n.01", "name": "butt_shaft"}, - {"id": 6174, "synset": "butt_weld.n.01", "name": "butt_weld"}, - {"id": 6175, "synset": "buzz_bomb.n.01", "name": "buzz_bomb"}, - {"id": 6176, "synset": "buzzer.n.02", "name": "buzzer"}, - {"id": 6177, "synset": "bvd.n.01", "name": "BVD"}, - {"id": 6178, "synset": "bypass_condenser.n.01", "name": "bypass_condenser"}, - {"id": 6179, "synset": "byway.n.01", "name": "byway"}, - {"id": 6180, "synset": "cab.n.02", "name": "cab"}, - {"id": 6181, "synset": "cab.n.01", "name": "cab"}, - {"id": 6182, "synset": "cabaret.n.01", "name": "cabaret"}, - {"id": 6183, "synset": "caber.n.01", "name": "caber"}, - {"id": 6184, "synset": "cabin.n.03", "name": "cabin"}, - {"id": 6185, "synset": "cabin.n.02", "name": "cabin"}, - {"id": 6186, "synset": "cabin_class.n.01", "name": "cabin_class"}, - {"id": 6187, "synset": "cabin_cruiser.n.01", "name": "cabin_cruiser"}, - {"id": 6188, "synset": "cabinet.n.04", "name": "cabinet"}, - {"id": 6189, "synset": "cabinetwork.n.01", "name": "cabinetwork"}, - {"id": 6190, "synset": "cabin_liner.n.01", "name": "cabin_liner"}, - {"id": 6191, "synset": "cable.n.06", "name": "cable"}, - {"id": 6192, "synset": "cable.n.02", "name": "cable"}, - {"id": 6193, "synset": "cable_car.n.01", "name": "cable_car"}, - {"id": 6194, "synset": "cache.n.03", "name": "cache"}, - {"id": 6195, "synset": "caddy.n.01", "name": "caddy"}, - {"id": 6196, "synset": "caesium_clock.n.01", "name": "caesium_clock"}, - {"id": 6197, "synset": "cafe.n.01", "name": "cafe"}, - {"id": 6198, "synset": "cafeteria.n.01", "name": "cafeteria"}, - {"id": 6199, "synset": "cafeteria_tray.n.01", "name": "cafeteria_tray"}, - {"id": 6200, "synset": "caff.n.01", "name": "caff"}, - {"id": 6201, "synset": "caftan.n.02", "name": "caftan"}, - {"id": 6202, "synset": "caftan.n.01", "name": "caftan"}, - {"id": 6203, "synset": "cage.n.01", "name": "cage"}, - {"id": 6204, "synset": "cage.n.04", "name": "cage"}, - {"id": 6205, "synset": "cagoule.n.01", "name": "cagoule"}, - {"id": 6206, "synset": "caisson.n.02", "name": "caisson"}, - {"id": 6207, "synset": "calash.n.02", "name": "calash"}, - {"id": 6208, "synset": "calceus.n.01", "name": "calceus"}, - {"id": 6209, "synset": "calcimine.n.01", "name": "calcimine"}, - {"id": 6210, "synset": "caldron.n.01", "name": "caldron"}, - {"id": 6211, "synset": "calico.n.01", "name": "calico"}, - {"id": 6212, "synset": "caliper.n.01", "name": "caliper"}, - {"id": 6213, "synset": "call-board.n.01", "name": "call-board"}, - {"id": 6214, "synset": "call_center.n.01", "name": "call_center"}, - {"id": 6215, "synset": "caller_id.n.01", "name": "caller_ID"}, - {"id": 6216, "synset": "calliope.n.02", "name": "calliope"}, - {"id": 6217, "synset": "calorimeter.n.01", "name": "calorimeter"}, - {"id": 6218, "synset": "calpac.n.01", "name": "calpac"}, - {"id": 6219, "synset": "camail.n.01", "name": "camail"}, - {"id": 6220, "synset": "camber_arch.n.01", "name": "camber_arch"}, - {"id": 6221, "synset": "cambric.n.01", "name": "cambric"}, - {"id": 6222, "synset": "camel's_hair.n.01", "name": "camel's_hair"}, - {"id": 6223, "synset": "camera_lucida.n.01", "name": "camera_lucida"}, - {"id": 6224, "synset": "camera_obscura.n.01", "name": "camera_obscura"}, - {"id": 6225, "synset": "camera_tripod.n.01", "name": "camera_tripod"}, - {"id": 6226, "synset": "camise.n.01", "name": "camise"}, - {"id": 6227, "synset": "camisole.n.02", "name": "camisole"}, - {"id": 6228, "synset": "camisole.n.01", "name": "camisole"}, - {"id": 6229, "synset": "camlet.n.02", "name": "camlet"}, - {"id": 6230, "synset": "camouflage.n.03", "name": "camouflage"}, - {"id": 6231, "synset": "camouflage.n.02", "name": "camouflage"}, - {"id": 6232, "synset": "camp.n.01", "name": "camp"}, - {"id": 6233, "synset": "camp.n.03", "name": "camp"}, - {"id": 6234, "synset": "camp.n.07", "name": "camp"}, - {"id": 6235, "synset": "campaign_hat.n.01", "name": "campaign_hat"}, - {"id": 6236, "synset": "campanile.n.01", "name": "campanile"}, - {"id": 6237, "synset": "camp_chair.n.01", "name": "camp_chair"}, - {"id": 6238, "synset": "camper_trailer.n.01", "name": "camper_trailer"}, - {"id": 6239, "synset": "campstool.n.01", "name": "campstool"}, - {"id": 6240, "synset": "camshaft.n.01", "name": "camshaft"}, - {"id": 6241, "synset": "canal.n.03", "name": "canal"}, - {"id": 6242, "synset": "canal_boat.n.01", "name": "canal_boat"}, - {"id": 6243, "synset": "candelabrum.n.01", "name": "candelabrum"}, - {"id": 6244, "synset": "candid_camera.n.01", "name": "candid_camera"}, - {"id": 6245, "synset": "candlepin.n.01", "name": "candlepin"}, - {"id": 6246, "synset": "candlesnuffer.n.01", "name": "candlesnuffer"}, - {"id": 6247, "synset": "candlewick.n.02", "name": "candlewick"}, - {"id": 6248, "synset": "candy_thermometer.n.01", "name": "candy_thermometer"}, - {"id": 6249, "synset": "cane.n.03", "name": "cane"}, - {"id": 6250, "synset": "cangue.n.01", "name": "cangue"}, - {"id": 6251, "synset": "cannery.n.01", "name": "cannery"}, - {"id": 6252, "synset": "cannikin.n.02", "name": "cannikin"}, - {"id": 6253, "synset": "cannikin.n.01", "name": "cannikin"}, - {"id": 6254, "synset": "cannon.n.01", "name": "cannon"}, - {"id": 6255, "synset": "cannon.n.04", "name": "cannon"}, - {"id": 6256, "synset": "cannon.n.03", "name": "cannon"}, - {"id": 6257, "synset": "cannon.n.02", "name": "cannon"}, - {"id": 6258, "synset": "cannonball.n.01", "name": "cannonball"}, - {"id": 6259, "synset": "canopic_jar.n.01", "name": "canopic_jar"}, - {"id": 6260, "synset": "canopy.n.03", "name": "canopy"}, - {"id": 6261, "synset": "canopy.n.02", "name": "canopy"}, - {"id": 6262, "synset": "canopy.n.01", "name": "canopy"}, - {"id": 6263, "synset": "canteen.n.05", "name": "canteen"}, - {"id": 6264, "synset": "canteen.n.04", "name": "canteen"}, - {"id": 6265, "synset": "canteen.n.03", "name": "canteen"}, - {"id": 6266, "synset": "canteen.n.02", "name": "canteen"}, - {"id": 6267, "synset": "cant_hook.n.01", "name": "cant_hook"}, - {"id": 6268, "synset": "cantilever.n.01", "name": "cantilever"}, - {"id": 6269, "synset": "cantilever_bridge.n.01", "name": "cantilever_bridge"}, - {"id": 6270, "synset": "cantle.n.01", "name": "cantle"}, - {"id": 6271, "synset": "canton_crepe.n.01", "name": "Canton_crepe"}, - {"id": 6272, "synset": "canvas.n.01", "name": "canvas"}, - {"id": 6273, "synset": "canvas.n.06", "name": "canvas"}, - {"id": 6274, "synset": "canvas_tent.n.01", "name": "canvas_tent"}, - {"id": 6275, "synset": "cap.n.04", "name": "cap"}, - {"id": 6276, "synset": "capacitor.n.01", "name": "capacitor"}, - {"id": 6277, "synset": "caparison.n.01", "name": "caparison"}, - {"id": 6278, "synset": "capital_ship.n.01", "name": "capital_ship"}, - {"id": 6279, "synset": "capitol.n.01", "name": "capitol"}, - {"id": 6280, "synset": "cap_opener.n.01", "name": "cap_opener"}, - {"id": 6281, "synset": "capote.n.02", "name": "capote"}, - {"id": 6282, "synset": "capote.n.01", "name": "capote"}, - {"id": 6283, "synset": "cap_screw.n.01", "name": "cap_screw"}, - {"id": 6284, "synset": "capstan.n.01", "name": "capstan"}, - {"id": 6285, "synset": "capstone.n.02", "name": "capstone"}, - {"id": 6286, "synset": "capsule.n.01", "name": "capsule"}, - {"id": 6287, "synset": "captain's_chair.n.01", "name": "captain's_chair"}, - {"id": 6288, "synset": "carabiner.n.01", "name": "carabiner"}, - {"id": 6289, "synset": "carafe.n.01", "name": "carafe"}, - {"id": 6290, "synset": "caravansary.n.01", "name": "caravansary"}, - {"id": 6291, "synset": "carbine.n.01", "name": "carbine"}, - {"id": 6292, "synset": "car_bomb.n.01", "name": "car_bomb"}, - {"id": 6293, "synset": "carbon_arc_lamp.n.01", "name": "carbon_arc_lamp"}, - {"id": 6294, "synset": "carboy.n.01", "name": "carboy"}, - {"id": 6295, "synset": "carburetor.n.01", "name": "carburetor"}, - {"id": 6296, "synset": "car_carrier.n.01", "name": "car_carrier"}, - {"id": 6297, "synset": "cardcase.n.01", "name": "cardcase"}, - {"id": 6298, "synset": "cardiac_monitor.n.01", "name": "cardiac_monitor"}, - {"id": 6299, "synset": "card_index.n.01", "name": "card_index"}, - {"id": 6300, "synset": "cardiograph.n.01", "name": "cardiograph"}, - {"id": 6301, "synset": "cardioid_microphone.n.01", "name": "cardioid_microphone"}, - {"id": 6302, "synset": "car_door.n.01", "name": "car_door"}, - {"id": 6303, "synset": "cardroom.n.01", "name": "cardroom"}, - {"id": 6304, "synset": "card_table.n.02", "name": "card_table"}, - {"id": 6305, "synset": "card_table.n.01", "name": "card_table"}, - {"id": 6306, "synset": "car-ferry.n.01", "name": "car-ferry"}, - {"id": 6307, "synset": "cargo_area.n.01", "name": "cargo_area"}, - {"id": 6308, "synset": "cargo_container.n.01", "name": "cargo_container"}, - {"id": 6309, "synset": "cargo_door.n.01", "name": "cargo_door"}, - {"id": 6310, "synset": "cargo_hatch.n.01", "name": "cargo_hatch"}, - {"id": 6311, "synset": "cargo_helicopter.n.01", "name": "cargo_helicopter"}, - {"id": 6312, "synset": "cargo_liner.n.01", "name": "cargo_liner"}, - {"id": 6313, "synset": "carillon.n.01", "name": "carillon"}, - {"id": 6314, "synset": "car_mirror.n.01", "name": "car_mirror"}, - {"id": 6315, "synset": "caroche.n.01", "name": "caroche"}, - {"id": 6316, "synset": "carousel.n.02", "name": "carousel"}, - {"id": 6317, "synset": "carpenter's_hammer.n.01", "name": "carpenter's_hammer"}, - {"id": 6318, "synset": "carpenter's_kit.n.01", "name": "carpenter's_kit"}, - {"id": 6319, "synset": "carpenter's_level.n.01", "name": "carpenter's_level"}, - {"id": 6320, "synset": "carpenter's_mallet.n.01", "name": "carpenter's_mallet"}, - {"id": 6321, "synset": "carpenter's_rule.n.01", "name": "carpenter's_rule"}, - {"id": 6322, "synset": "carpenter's_square.n.01", "name": "carpenter's_square"}, - {"id": 6323, "synset": "carpetbag.n.01", "name": "carpetbag"}, - {"id": 6324, "synset": "carpet_beater.n.01", "name": "carpet_beater"}, - {"id": 6325, "synset": "carpet_loom.n.01", "name": "carpet_loom"}, - {"id": 6326, "synset": "carpet_pad.n.01", "name": "carpet_pad"}, - {"id": 6327, "synset": "carpet_sweeper.n.01", "name": "carpet_sweeper"}, - {"id": 6328, "synset": "carpet_tack.n.01", "name": "carpet_tack"}, - {"id": 6329, "synset": "carport.n.01", "name": "carport"}, - {"id": 6330, "synset": "carrack.n.01", "name": "carrack"}, - {"id": 6331, "synset": "carrel.n.02", "name": "carrel"}, - {"id": 6332, "synset": "carriage.n.04", "name": "carriage"}, - {"id": 6333, "synset": "carriage_bolt.n.01", "name": "carriage_bolt"}, - {"id": 6334, "synset": "carriageway.n.01", "name": "carriageway"}, - {"id": 6335, "synset": "carriage_wrench.n.01", "name": "carriage_wrench"}, - {"id": 6336, "synset": "carrick_bend.n.01", "name": "carrick_bend"}, - {"id": 6337, "synset": "carrier.n.10", "name": "carrier"}, - {"id": 6338, "synset": "carrycot.n.01", "name": "carrycot"}, - {"id": 6339, "synset": "car_seat.n.01", "name": "car_seat"}, - {"id": 6340, "synset": "car_tire.n.01", "name": "car_tire"}, - {"id": 6341, "synset": "cartouche.n.01", "name": "cartouche"}, - {"id": 6342, "synset": "car_train.n.01", "name": "car_train"}, - {"id": 6343, "synset": "cartridge.n.01", "name": "cartridge"}, - {"id": 6344, "synset": "cartridge.n.04", "name": "cartridge"}, - {"id": 6345, "synset": "cartridge_belt.n.01", "name": "cartridge_belt"}, - {"id": 6346, "synset": "cartridge_extractor.n.01", "name": "cartridge_extractor"}, - {"id": 6347, "synset": "cartridge_fuse.n.01", "name": "cartridge_fuse"}, - {"id": 6348, "synset": "cartridge_holder.n.01", "name": "cartridge_holder"}, - {"id": 6349, "synset": "cartwheel.n.01", "name": "cartwheel"}, - {"id": 6350, "synset": "carving_fork.n.01", "name": "carving_fork"}, - {"id": 6351, "synset": "carving_knife.n.01", "name": "carving_knife"}, - {"id": 6352, "synset": "car_wheel.n.01", "name": "car_wheel"}, - {"id": 6353, "synset": "caryatid.n.01", "name": "caryatid"}, - {"id": 6354, "synset": "cascade_liquefier.n.01", "name": "cascade_liquefier"}, - {"id": 6355, "synset": "cascade_transformer.n.01", "name": "cascade_transformer"}, - {"id": 6356, "synset": "case.n.05", "name": "case"}, - {"id": 6357, "synset": "case.n.20", "name": "case"}, - {"id": 6358, "synset": "case.n.18", "name": "case"}, - {"id": 6359, "synset": "casein_paint.n.01", "name": "casein_paint"}, - {"id": 6360, "synset": "case_knife.n.02", "name": "case_knife"}, - {"id": 6361, "synset": "case_knife.n.01", "name": "case_knife"}, - {"id": 6362, "synset": "casement.n.01", "name": "casement"}, - {"id": 6363, "synset": "casement_window.n.01", "name": "casement_window"}, - {"id": 6364, "synset": "casern.n.01", "name": "casern"}, - {"id": 6365, "synset": "case_shot.n.01", "name": "case_shot"}, - {"id": 6366, "synset": "cash_bar.n.01", "name": "cash_bar"}, - {"id": 6367, "synset": "cashbox.n.01", "name": "cashbox"}, - {"id": 6368, "synset": "cash_machine.n.01", "name": "cash_machine"}, - {"id": 6369, "synset": "cashmere.n.01", "name": "cashmere"}, - {"id": 6370, "synset": "casing.n.03", "name": "casing"}, - {"id": 6371, "synset": "casino.n.01", "name": "casino"}, - {"id": 6372, "synset": "casket.n.02", "name": "casket"}, - {"id": 6373, "synset": "casque.n.01", "name": "casque"}, - {"id": 6374, "synset": "casquet.n.01", "name": "casquet"}, - {"id": 6375, "synset": "cassegrainian_telescope.n.01", "name": "Cassegrainian_telescope"}, - {"id": 6376, "synset": "casserole.n.02", "name": "casserole"}, - {"id": 6377, "synset": "cassette_deck.n.01", "name": "cassette_deck"}, - {"id": 6378, "synset": "cassette_player.n.01", "name": "cassette_player"}, - {"id": 6379, "synset": "cassette_recorder.n.01", "name": "cassette_recorder"}, - {"id": 6380, "synset": "cassette_tape.n.01", "name": "cassette_tape"}, - {"id": 6381, "synset": "cassock.n.01", "name": "cassock"}, - {"id": 6382, "synset": "caster.n.03", "name": "caster"}, - {"id": 6383, "synset": "caster.n.02", "name": "caster"}, - {"id": 6384, "synset": "castle.n.02", "name": "castle"}, - {"id": 6385, "synset": "castle.n.03", "name": "castle"}, - {"id": 6386, "synset": "catacomb.n.01", "name": "catacomb"}, - {"id": 6387, "synset": "catafalque.n.01", "name": "catafalque"}, - {"id": 6388, "synset": "catalytic_converter.n.01", "name": "catalytic_converter"}, - {"id": 6389, "synset": "catalytic_cracker.n.01", "name": "catalytic_cracker"}, - {"id": 6390, "synset": "catamaran.n.01", "name": "catamaran"}, - {"id": 6391, "synset": "catapult.n.03", "name": "catapult"}, - {"id": 6392, "synset": "catapult.n.02", "name": "catapult"}, - {"id": 6393, "synset": "catboat.n.01", "name": "catboat"}, - {"id": 6394, "synset": "cat_box.n.01", "name": "cat_box"}, - {"id": 6395, "synset": "catch.n.07", "name": "catch"}, - {"id": 6396, "synset": "catchall.n.01", "name": "catchall"}, - {"id": 6397, "synset": "catcher's_mask.n.01", "name": "catcher's_mask"}, - {"id": 6398, "synset": "catchment.n.01", "name": "catchment"}, - {"id": 6399, "synset": "caterpillar.n.02", "name": "Caterpillar"}, - {"id": 6400, "synset": "cathedra.n.01", "name": "cathedra"}, - {"id": 6401, "synset": "cathedral.n.01", "name": "cathedral"}, - {"id": 6402, "synset": "cathedral.n.02", "name": "cathedral"}, - {"id": 6403, "synset": "catheter.n.01", "name": "catheter"}, - {"id": 6404, "synset": "cathode.n.01", "name": "cathode"}, - {"id": 6405, "synset": "cathode-ray_tube.n.01", "name": "cathode-ray_tube"}, - {"id": 6406, "synset": "cat-o'-nine-tails.n.01", "name": "cat-o'-nine-tails"}, - {"id": 6407, "synset": "cat's-paw.n.02", "name": "cat's-paw"}, - {"id": 6408, "synset": "catsup_bottle.n.01", "name": "catsup_bottle"}, - {"id": 6409, "synset": "cattle_car.n.01", "name": "cattle_car"}, - {"id": 6410, "synset": "cattle_guard.n.01", "name": "cattle_guard"}, - {"id": 6411, "synset": "cattleship.n.01", "name": "cattleship"}, - {"id": 6412, "synset": "cautery.n.01", "name": "cautery"}, - {"id": 6413, "synset": "cavalier_hat.n.01", "name": "cavalier_hat"}, - {"id": 6414, "synset": "cavalry_sword.n.01", "name": "cavalry_sword"}, - {"id": 6415, "synset": "cavetto.n.01", "name": "cavetto"}, - {"id": 6416, "synset": "cavity_wall.n.01", "name": "cavity_wall"}, - {"id": 6417, "synset": "c_battery.n.01", "name": "C_battery"}, - {"id": 6418, "synset": "c-clamp.n.01", "name": "C-clamp"}, - {"id": 6419, "synset": "cd_drive.n.01", "name": "CD_drive"}, - {"id": 6420, "synset": "cd-r.n.01", "name": "CD-R"}, - {"id": 6421, "synset": "cd-rom.n.01", "name": "CD-ROM"}, - {"id": 6422, "synset": "cd-rom_drive.n.01", "name": "CD-ROM_drive"}, - {"id": 6423, "synset": "cedar_chest.n.01", "name": "cedar_chest"}, - {"id": 6424, "synset": "ceiling.n.01", "name": "ceiling"}, - {"id": 6425, "synset": "celesta.n.01", "name": "celesta"}, - {"id": 6426, "synset": "cell.n.03", "name": "cell"}, - {"id": 6427, "synset": "cell.n.07", "name": "cell"}, - {"id": 6428, "synset": "cellar.n.03", "name": "cellar"}, - {"id": 6429, "synset": "cellblock.n.01", "name": "cellblock"}, - {"id": 6430, "synset": "cello.n.01", "name": "cello"}, - {"id": 6431, "synset": "cellophane.n.01", "name": "cellophane"}, - {"id": 6432, "synset": "cellulose_tape.n.01", "name": "cellulose_tape"}, - {"id": 6433, "synset": "cenotaph.n.01", "name": "cenotaph"}, - {"id": 6434, "synset": "censer.n.01", "name": "censer"}, - {"id": 6435, "synset": "center.n.03", "name": "center"}, - {"id": 6436, "synset": "center_punch.n.01", "name": "center_punch"}, - {"id": 6437, "synset": "centigrade_thermometer.n.01", "name": "Centigrade_thermometer"}, - {"id": 6438, "synset": "central_processing_unit.n.01", "name": "central_processing_unit"}, - {"id": 6439, "synset": "centrifugal_pump.n.01", "name": "centrifugal_pump"}, - {"id": 6440, "synset": "centrifuge.n.01", "name": "centrifuge"}, - {"id": 6441, "synset": "ceramic.n.01", "name": "ceramic"}, - {"id": 6442, "synset": "ceramic_ware.n.01", "name": "ceramic_ware"}, - {"id": 6443, "synset": "cereal_bowl.n.01", "name": "cereal_bowl"}, - {"id": 6444, "synset": "cereal_box.n.01", "name": "cereal_box"}, - {"id": 6445, "synset": "cerecloth.n.01", "name": "cerecloth"}, - {"id": 6446, "synset": "cesspool.n.01", "name": "cesspool"}, - {"id": 6447, "synset": "chachka.n.02", "name": "chachka"}, - {"id": 6448, "synset": "chador.n.01", "name": "chador"}, - {"id": 6449, "synset": "chafing_dish.n.01", "name": "chafing_dish"}, - {"id": 6450, "synset": "chain.n.03", "name": "chain"}, - {"id": 6451, "synset": "chain.n.05", "name": "chain"}, - {"id": 6452, "synset": "chainlink_fence.n.01", "name": "chainlink_fence"}, - {"id": 6453, "synset": "chain_printer.n.01", "name": "chain_printer"}, - {"id": 6454, "synset": "chain_saw.n.01", "name": "chain_saw"}, - {"id": 6455, "synset": "chain_store.n.01", "name": "chain_store"}, - {"id": 6456, "synset": "chain_tongs.n.01", "name": "chain_tongs"}, - {"id": 6457, "synset": "chain_wrench.n.01", "name": "chain_wrench"}, - {"id": 6458, "synset": "chair.n.05", "name": "chair"}, - {"id": 6459, "synset": "chair_of_state.n.01", "name": "chair_of_state"}, - {"id": 6460, "synset": "chairlift.n.01", "name": "chairlift"}, - {"id": 6461, "synset": "chaise.n.02", "name": "chaise"}, - {"id": 6462, "synset": "chalet.n.01", "name": "chalet"}, - {"id": 6463, "synset": "chalk.n.04", "name": "chalk"}, - {"id": 6464, "synset": "challis.n.01", "name": "challis"}, - {"id": 6465, "synset": "chamberpot.n.01", "name": "chamberpot"}, - {"id": 6466, "synset": "chambray.n.01", "name": "chambray"}, - {"id": 6467, "synset": "chamfer_bit.n.01", "name": "chamfer_bit"}, - {"id": 6468, "synset": "chamfer_plane.n.01", "name": "chamfer_plane"}, - {"id": 6469, "synset": "chamois_cloth.n.01", "name": "chamois_cloth"}, - {"id": 6470, "synset": "chancel.n.01", "name": "chancel"}, - {"id": 6471, "synset": "chancellery.n.01", "name": "chancellery"}, - {"id": 6472, "synset": "chancery.n.02", "name": "chancery"}, - {"id": 6473, "synset": "chandlery.n.01", "name": "chandlery"}, - {"id": 6474, "synset": "chanfron.n.01", "name": "chanfron"}, - {"id": 6475, "synset": "chanter.n.01", "name": "chanter"}, - {"id": 6476, "synset": "chantry.n.02", "name": "chantry"}, - {"id": 6477, "synset": "chapel.n.01", "name": "chapel"}, - {"id": 6478, "synset": "chapterhouse.n.02", "name": "chapterhouse"}, - {"id": 6479, "synset": "chapterhouse.n.01", "name": "chapterhouse"}, - {"id": 6480, "synset": "character_printer.n.01", "name": "character_printer"}, - {"id": 6481, "synset": "charcuterie.n.01", "name": "charcuterie"}, - { - "id": 6482, - "synset": "charge-exchange_accelerator.n.01", - "name": "charge-exchange_accelerator", - }, - {"id": 6483, "synset": "charger.n.02", "name": "charger"}, - {"id": 6484, "synset": "chariot.n.01", "name": "chariot"}, - {"id": 6485, "synset": "chariot.n.02", "name": "chariot"}, - {"id": 6486, "synset": "charnel_house.n.01", "name": "charnel_house"}, - {"id": 6487, "synset": "chassis.n.03", "name": "chassis"}, - {"id": 6488, "synset": "chassis.n.02", "name": "chassis"}, - {"id": 6489, "synset": "chasuble.n.01", "name": "chasuble"}, - {"id": 6490, "synset": "chateau.n.01", "name": "chateau"}, - {"id": 6491, "synset": "chatelaine.n.02", "name": "chatelaine"}, - {"id": 6492, "synset": "checker.n.03", "name": "checker"}, - {"id": 6493, "synset": "checkout.n.03", "name": "checkout"}, - {"id": 6494, "synset": "cheekpiece.n.01", "name": "cheekpiece"}, - {"id": 6495, "synset": "cheeseboard.n.01", "name": "cheeseboard"}, - {"id": 6496, "synset": "cheesecloth.n.01", "name": "cheesecloth"}, - {"id": 6497, "synset": "cheese_cutter.n.01", "name": "cheese_cutter"}, - {"id": 6498, "synset": "cheese_press.n.01", "name": "cheese_press"}, - {"id": 6499, "synset": "chemical_bomb.n.01", "name": "chemical_bomb"}, - {"id": 6500, "synset": "chemical_plant.n.01", "name": "chemical_plant"}, - {"id": 6501, "synset": "chemical_reactor.n.01", "name": "chemical_reactor"}, - {"id": 6502, "synset": "chemise.n.02", "name": "chemise"}, - {"id": 6503, "synset": "chemise.n.01", "name": "chemise"}, - {"id": 6504, "synset": "chenille.n.02", "name": "chenille"}, - {"id": 6505, "synset": "chessman.n.01", "name": "chessman"}, - {"id": 6506, "synset": "chest.n.02", "name": "chest"}, - {"id": 6507, "synset": "chesterfield.n.02", "name": "chesterfield"}, - {"id": 6508, "synset": "chest_of_drawers.n.01", "name": "chest_of_drawers"}, - {"id": 6509, "synset": "chest_protector.n.01", "name": "chest_protector"}, - {"id": 6510, "synset": "cheval-de-frise.n.01", "name": "cheval-de-frise"}, - {"id": 6511, "synset": "cheval_glass.n.01", "name": "cheval_glass"}, - {"id": 6512, "synset": "chicane.n.02", "name": "chicane"}, - {"id": 6513, "synset": "chicken_coop.n.01", "name": "chicken_coop"}, - {"id": 6514, "synset": "chicken_wire.n.01", "name": "chicken_wire"}, - {"id": 6515, "synset": "chicken_yard.n.01", "name": "chicken_yard"}, - {"id": 6516, "synset": "chiffon.n.01", "name": "chiffon"}, - {"id": 6517, "synset": "chiffonier.n.01", "name": "chiffonier"}, - {"id": 6518, "synset": "child's_room.n.01", "name": "child's_room"}, - {"id": 6519, "synset": "chimney_breast.n.01", "name": "chimney_breast"}, - {"id": 6520, "synset": "chimney_corner.n.01", "name": "chimney_corner"}, - {"id": 6521, "synset": "china.n.02", "name": "china"}, - {"id": 6522, "synset": "china_cabinet.n.01", "name": "china_cabinet"}, - {"id": 6523, "synset": "chinchilla.n.02", "name": "chinchilla"}, - {"id": 6524, "synset": "chinese_lantern.n.01", "name": "Chinese_lantern"}, - {"id": 6525, "synset": "chinese_puzzle.n.01", "name": "Chinese_puzzle"}, - {"id": 6526, "synset": "chinning_bar.n.01", "name": "chinning_bar"}, - {"id": 6527, "synset": "chino.n.02", "name": "chino"}, - {"id": 6528, "synset": "chino.n.01", "name": "chino"}, - {"id": 6529, "synset": "chin_rest.n.01", "name": "chin_rest"}, - {"id": 6530, "synset": "chin_strap.n.01", "name": "chin_strap"}, - {"id": 6531, "synset": "chintz.n.01", "name": "chintz"}, - {"id": 6532, "synset": "chip.n.07", "name": "chip"}, - {"id": 6533, "synset": "chisel.n.01", "name": "chisel"}, - {"id": 6534, "synset": "chlamys.n.02", "name": "chlamys"}, - {"id": 6535, "synset": "choir.n.03", "name": "choir"}, - {"id": 6536, "synset": "choir_loft.n.01", "name": "choir_loft"}, - {"id": 6537, "synset": "choke.n.02", "name": "choke"}, - {"id": 6538, "synset": "choke.n.01", "name": "choke"}, - {"id": 6539, "synset": "chokey.n.01", "name": "chokey"}, - {"id": 6540, "synset": "choo-choo.n.01", "name": "choo-choo"}, - {"id": 6541, "synset": "chopine.n.01", "name": "chopine"}, - {"id": 6542, "synset": "chordophone.n.01", "name": "chordophone"}, - {"id": 6543, "synset": "christmas_stocking.n.01", "name": "Christmas_stocking"}, - {"id": 6544, "synset": "chronograph.n.01", "name": "chronograph"}, - {"id": 6545, "synset": "chronometer.n.01", "name": "chronometer"}, - {"id": 6546, "synset": "chronoscope.n.01", "name": "chronoscope"}, - {"id": 6547, "synset": "chuck.n.03", "name": "chuck"}, - {"id": 6548, "synset": "chuck_wagon.n.01", "name": "chuck_wagon"}, - {"id": 6549, "synset": "chukka.n.02", "name": "chukka"}, - {"id": 6550, "synset": "church.n.02", "name": "church"}, - {"id": 6551, "synset": "church_bell.n.01", "name": "church_bell"}, - {"id": 6552, "synset": "church_hat.n.01", "name": "church_hat"}, - {"id": 6553, "synset": "church_key.n.01", "name": "church_key"}, - {"id": 6554, "synset": "church_tower.n.01", "name": "church_tower"}, - {"id": 6555, "synset": "churidars.n.01", "name": "churidars"}, - {"id": 6556, "synset": "churn.n.01", "name": "churn"}, - {"id": 6557, "synset": "ciderpress.n.01", "name": "ciderpress"}, - {"id": 6558, "synset": "cigar_band.n.01", "name": "cigar_band"}, - {"id": 6559, "synset": "cigar_cutter.n.01", "name": "cigar_cutter"}, - {"id": 6560, "synset": "cigarette_butt.n.01", "name": "cigarette_butt"}, - {"id": 6561, "synset": "cigarette_holder.n.01", "name": "cigarette_holder"}, - {"id": 6562, "synset": "cigar_lighter.n.01", "name": "cigar_lighter"}, - {"id": 6563, "synset": "cinch.n.02", "name": "cinch"}, - {"id": 6564, "synset": "cinema.n.02", "name": "cinema"}, - {"id": 6565, "synset": "cinquefoil.n.02", "name": "cinquefoil"}, - {"id": 6566, "synset": "circle.n.08", "name": "circle"}, - {"id": 6567, "synset": "circlet.n.02", "name": "circlet"}, - {"id": 6568, "synset": "circuit.n.01", "name": "circuit"}, - {"id": 6569, "synset": "circuit_board.n.01", "name": "circuit_board"}, - {"id": 6570, "synset": "circuit_breaker.n.01", "name": "circuit_breaker"}, - {"id": 6571, "synset": "circuitry.n.01", "name": "circuitry"}, - {"id": 6572, "synset": "circular_plane.n.01", "name": "circular_plane"}, - {"id": 6573, "synset": "circular_saw.n.01", "name": "circular_saw"}, - {"id": 6574, "synset": "circus_tent.n.01", "name": "circus_tent"}, - {"id": 6575, "synset": "cistern.n.03", "name": "cistern"}, - {"id": 6576, "synset": "cittern.n.01", "name": "cittern"}, - {"id": 6577, "synset": "city_hall.n.01", "name": "city_hall"}, - {"id": 6578, "synset": "cityscape.n.02", "name": "cityscape"}, - {"id": 6579, "synset": "city_university.n.01", "name": "city_university"}, - {"id": 6580, "synset": "civies.n.01", "name": "civies"}, - {"id": 6581, "synset": "civilian_clothing.n.01", "name": "civilian_clothing"}, - {"id": 6582, "synset": "clack_valve.n.01", "name": "clack_valve"}, - {"id": 6583, "synset": "clamp.n.01", "name": "clamp"}, - {"id": 6584, "synset": "clamshell.n.02", "name": "clamshell"}, - {"id": 6585, "synset": "clapper.n.03", "name": "clapper"}, - {"id": 6586, "synset": "clapperboard.n.01", "name": "clapperboard"}, - {"id": 6587, "synset": "clarence.n.01", "name": "clarence"}, - {"id": 6588, "synset": "clark_cell.n.01", "name": "Clark_cell"}, - {"id": 6589, "synset": "clasp_knife.n.01", "name": "clasp_knife"}, - {"id": 6590, "synset": "classroom.n.01", "name": "classroom"}, - {"id": 6591, "synset": "clavichord.n.01", "name": "clavichord"}, - {"id": 6592, "synset": "clavier.n.02", "name": "clavier"}, - {"id": 6593, "synset": "clay_pigeon.n.01", "name": "clay_pigeon"}, - {"id": 6594, "synset": "claymore_mine.n.01", "name": "claymore_mine"}, - {"id": 6595, "synset": "claymore.n.01", "name": "claymore"}, - {"id": 6596, "synset": "cleaners.n.01", "name": "cleaners"}, - {"id": 6597, "synset": "cleaning_implement.n.01", "name": "cleaning_implement"}, - {"id": 6598, "synset": "cleaning_pad.n.01", "name": "cleaning_pad"}, - {"id": 6599, "synset": "clean_room.n.01", "name": "clean_room"}, - {"id": 6600, "synset": "clearway.n.01", "name": "clearway"}, - {"id": 6601, "synset": "cleat.n.01", "name": "cleat"}, - {"id": 6602, "synset": "cleats.n.01", "name": "cleats"}, - {"id": 6603, "synset": "cleaver.n.01", "name": "cleaver"}, - {"id": 6604, "synset": "clerestory.n.01", "name": "clerestory"}, - {"id": 6605, "synset": "clevis.n.01", "name": "clevis"}, - {"id": 6606, "synset": "clews.n.01", "name": "clews"}, - {"id": 6607, "synset": "cliff_dwelling.n.01", "name": "cliff_dwelling"}, - {"id": 6608, "synset": "climbing_frame.n.01", "name": "climbing_frame"}, - {"id": 6609, "synset": "clinch.n.03", "name": "clinch"}, - {"id": 6610, "synset": "clinch.n.02", "name": "clinch"}, - {"id": 6611, "synset": "clincher.n.03", "name": "clincher"}, - {"id": 6612, "synset": "clinic.n.03", "name": "clinic"}, - {"id": 6613, "synset": "clinical_thermometer.n.01", "name": "clinical_thermometer"}, - {"id": 6614, "synset": "clinker.n.02", "name": "clinker"}, - {"id": 6615, "synset": "clinometer.n.01", "name": "clinometer"}, - {"id": 6616, "synset": "clip_lead.n.01", "name": "clip_lead"}, - {"id": 6617, "synset": "clip-on.n.01", "name": "clip-on"}, - {"id": 6618, "synset": "clipper.n.04", "name": "clipper"}, - {"id": 6619, "synset": "clipper.n.02", "name": "clipper"}, - {"id": 6620, "synset": "cloak.n.01", "name": "cloak"}, - {"id": 6621, "synset": "cloakroom.n.02", "name": "cloakroom"}, - {"id": 6622, "synset": "cloche.n.02", "name": "cloche"}, - {"id": 6623, "synset": "cloche.n.01", "name": "cloche"}, - {"id": 6624, "synset": "clock_pendulum.n.01", "name": "clock_pendulum"}, - {"id": 6625, "synset": "clock_radio.n.01", "name": "clock_radio"}, - {"id": 6626, "synset": "clockwork.n.01", "name": "clockwork"}, - {"id": 6627, "synset": "clog.n.01", "name": "clog"}, - {"id": 6628, "synset": "cloisonne.n.01", "name": "cloisonne"}, - {"id": 6629, "synset": "cloister.n.02", "name": "cloister"}, - {"id": 6630, "synset": "closed_circuit.n.01", "name": "closed_circuit"}, - {"id": 6631, "synset": "closed-circuit_television.n.01", "name": "closed-circuit_television"}, - {"id": 6632, "synset": "closed_loop.n.01", "name": "closed_loop"}, - {"id": 6633, "synset": "closet.n.04", "name": "closet"}, - {"id": 6634, "synset": "closeup_lens.n.01", "name": "closeup_lens"}, - {"id": 6635, "synset": "cloth_cap.n.01", "name": "cloth_cap"}, - {"id": 6636, "synset": "cloth_covering.n.01", "name": "cloth_covering"}, - {"id": 6637, "synset": "clothesbrush.n.01", "name": "clothesbrush"}, - {"id": 6638, "synset": "clothes_closet.n.01", "name": "clothes_closet"}, - {"id": 6639, "synset": "clothes_dryer.n.01", "name": "clothes_dryer"}, - {"id": 6640, "synset": "clotheshorse.n.01", "name": "clotheshorse"}, - {"id": 6641, "synset": "clothes_tree.n.01", "name": "clothes_tree"}, - {"id": 6642, "synset": "clothing.n.01", "name": "clothing"}, - {"id": 6643, "synset": "clothing_store.n.01", "name": "clothing_store"}, - {"id": 6644, "synset": "clout_nail.n.01", "name": "clout_nail"}, - {"id": 6645, "synset": "clove_hitch.n.01", "name": "clove_hitch"}, - {"id": 6646, "synset": "club_car.n.01", "name": "club_car"}, - {"id": 6647, "synset": "clubroom.n.01", "name": "clubroom"}, - {"id": 6648, "synset": "cluster_bomb.n.01", "name": "cluster_bomb"}, - {"id": 6649, "synset": "clutch.n.07", "name": "clutch"}, - {"id": 6650, "synset": "clutch.n.06", "name": "clutch"}, - {"id": 6651, "synset": "coach.n.04", "name": "coach"}, - {"id": 6652, "synset": "coach_house.n.01", "name": "coach_house"}, - {"id": 6653, "synset": "coal_car.n.01", "name": "coal_car"}, - {"id": 6654, "synset": "coal_chute.n.01", "name": "coal_chute"}, - {"id": 6655, "synset": "coal_house.n.01", "name": "coal_house"}, - {"id": 6656, "synset": "coal_shovel.n.01", "name": "coal_shovel"}, - {"id": 6657, "synset": "coaming.n.01", "name": "coaming"}, - {"id": 6658, "synset": "coaster_brake.n.01", "name": "coaster_brake"}, - {"id": 6659, "synset": "coat_button.n.01", "name": "coat_button"}, - {"id": 6660, "synset": "coat_closet.n.01", "name": "coat_closet"}, - {"id": 6661, "synset": "coatdress.n.01", "name": "coatdress"}, - {"id": 6662, "synset": "coatee.n.01", "name": "coatee"}, - {"id": 6663, "synset": "coating.n.01", "name": "coating"}, - {"id": 6664, "synset": "coating.n.03", "name": "coating"}, - {"id": 6665, "synset": "coat_of_paint.n.01", "name": "coat_of_paint"}, - {"id": 6666, "synset": "coattail.n.01", "name": "coattail"}, - {"id": 6667, "synset": "coaxial_cable.n.01", "name": "coaxial_cable"}, - {"id": 6668, "synset": "cobweb.n.03", "name": "cobweb"}, - {"id": 6669, "synset": "cobweb.n.01", "name": "cobweb"}, - { - "id": 6670, - "synset": "cockcroft_and_walton_accelerator.n.01", - "name": "Cockcroft_and_Walton_accelerator", - }, - {"id": 6671, "synset": "cocked_hat.n.01", "name": "cocked_hat"}, - {"id": 6672, "synset": "cockhorse.n.01", "name": "cockhorse"}, - {"id": 6673, "synset": "cockleshell.n.01", "name": "cockleshell"}, - {"id": 6674, "synset": "cockpit.n.01", "name": "cockpit"}, - {"id": 6675, "synset": "cockpit.n.03", "name": "cockpit"}, - {"id": 6676, "synset": "cockpit.n.02", "name": "cockpit"}, - {"id": 6677, "synset": "cockscomb.n.03", "name": "cockscomb"}, - {"id": 6678, "synset": "cocktail_dress.n.01", "name": "cocktail_dress"}, - {"id": 6679, "synset": "cocktail_lounge.n.01", "name": "cocktail_lounge"}, - {"id": 6680, "synset": "cocktail_shaker.n.01", "name": "cocktail_shaker"}, - {"id": 6681, "synset": "cocotte.n.02", "name": "cocotte"}, - {"id": 6682, "synset": "codpiece.n.01", "name": "codpiece"}, - {"id": 6683, "synset": "coelostat.n.01", "name": "coelostat"}, - {"id": 6684, "synset": "coffee_can.n.01", "name": "coffee_can"}, - {"id": 6685, "synset": "coffee_cup.n.01", "name": "coffee_cup"}, - {"id": 6686, "synset": "coffee_filter.n.01", "name": "coffee_filter"}, - {"id": 6687, "synset": "coffee_mill.n.01", "name": "coffee_mill"}, - {"id": 6688, "synset": "coffee_mug.n.01", "name": "coffee_mug"}, - {"id": 6689, "synset": "coffee_stall.n.01", "name": "coffee_stall"}, - {"id": 6690, "synset": "coffee_urn.n.01", "name": "coffee_urn"}, - {"id": 6691, "synset": "coffer.n.02", "name": "coffer"}, - {"id": 6692, "synset": "coffey_still.n.01", "name": "Coffey_still"}, - {"id": 6693, "synset": "coffin.n.01", "name": "coffin"}, - {"id": 6694, "synset": "cog.n.02", "name": "cog"}, - {"id": 6695, "synset": "coif.n.02", "name": "coif"}, - {"id": 6696, "synset": "coil.n.01", "name": "coil"}, - {"id": 6697, "synset": "coil.n.06", "name": "coil"}, - {"id": 6698, "synset": "coil.n.03", "name": "coil"}, - {"id": 6699, "synset": "coil_spring.n.01", "name": "coil_spring"}, - {"id": 6700, "synset": "coin_box.n.01", "name": "coin_box"}, - {"id": 6701, "synset": "cold_cathode.n.01", "name": "cold_cathode"}, - {"id": 6702, "synset": "cold_chisel.n.01", "name": "cold_chisel"}, - {"id": 6703, "synset": "cold_cream.n.01", "name": "cold_cream"}, - {"id": 6704, "synset": "cold_frame.n.01", "name": "cold_frame"}, - {"id": 6705, "synset": "collar.n.01", "name": "collar"}, - {"id": 6706, "synset": "collar.n.03", "name": "collar"}, - {"id": 6707, "synset": "college.n.03", "name": "college"}, - {"id": 6708, "synset": "collet.n.02", "name": "collet"}, - {"id": 6709, "synset": "collider.n.01", "name": "collider"}, - {"id": 6710, "synset": "colliery.n.01", "name": "colliery"}, - {"id": 6711, "synset": "collimator.n.02", "name": "collimator"}, - {"id": 6712, "synset": "collimator.n.01", "name": "collimator"}, - {"id": 6713, "synset": "cologne.n.02", "name": "cologne"}, - {"id": 6714, "synset": "colonnade.n.01", "name": "colonnade"}, - {"id": 6715, "synset": "colonoscope.n.01", "name": "colonoscope"}, - {"id": 6716, "synset": "colorimeter.n.01", "name": "colorimeter"}, - {"id": 6717, "synset": "colors.n.02", "name": "colors"}, - {"id": 6718, "synset": "color_television.n.01", "name": "color_television"}, - {"id": 6719, "synset": "color_tube.n.01", "name": "color_tube"}, - {"id": 6720, "synset": "color_wash.n.01", "name": "color_wash"}, - {"id": 6721, "synset": "colt.n.02", "name": "Colt"}, - {"id": 6722, "synset": "colter.n.01", "name": "colter"}, - {"id": 6723, "synset": "columbarium.n.03", "name": "columbarium"}, - {"id": 6724, "synset": "columbarium.n.02", "name": "columbarium"}, - {"id": 6725, "synset": "column.n.07", "name": "column"}, - {"id": 6726, "synset": "column.n.06", "name": "column"}, - {"id": 6727, "synset": "comb.n.01", "name": "comb"}, - {"id": 6728, "synset": "comb.n.03", "name": "comb"}, - {"id": 6729, "synset": "comber.n.03", "name": "comber"}, - {"id": 6730, "synset": "combination_plane.n.01", "name": "combination_plane"}, - {"id": 6731, "synset": "combine.n.01", "name": "combine"}, - {"id": 6732, "synset": "command_module.n.01", "name": "command_module"}, - {"id": 6733, "synset": "commissary.n.01", "name": "commissary"}, - {"id": 6734, "synset": "commissary.n.02", "name": "commissary"}, - {"id": 6735, "synset": "commodity.n.01", "name": "commodity"}, - {"id": 6736, "synset": "common_ax.n.01", "name": "common_ax"}, - {"id": 6737, "synset": "common_room.n.01", "name": "common_room"}, - {"id": 6738, "synset": "communications_satellite.n.01", "name": "communications_satellite"}, - {"id": 6739, "synset": "communication_system.n.01", "name": "communication_system"}, - {"id": 6740, "synset": "community_center.n.01", "name": "community_center"}, - {"id": 6741, "synset": "commutator.n.01", "name": "commutator"}, - {"id": 6742, "synset": "commuter.n.01", "name": "commuter"}, - {"id": 6743, "synset": "compact.n.01", "name": "compact"}, - {"id": 6744, "synset": "compact.n.03", "name": "compact"}, - {"id": 6745, "synset": "compact_disk.n.01", "name": "compact_disk"}, - {"id": 6746, "synset": "compact-disk_burner.n.01", "name": "compact-disk_burner"}, - {"id": 6747, "synset": "companionway.n.01", "name": "companionway"}, - {"id": 6748, "synset": "compartment.n.02", "name": "compartment"}, - {"id": 6749, "synset": "compartment.n.01", "name": "compartment"}, - {"id": 6750, "synset": "compass.n.04", "name": "compass"}, - {"id": 6751, "synset": "compass_card.n.01", "name": "compass_card"}, - {"id": 6752, "synset": "compass_saw.n.01", "name": "compass_saw"}, - {"id": 6753, "synset": "compound.n.03", "name": "compound"}, - {"id": 6754, "synset": "compound_lens.n.01", "name": "compound_lens"}, - {"id": 6755, "synset": "compound_lever.n.01", "name": "compound_lever"}, - {"id": 6756, "synset": "compound_microscope.n.01", "name": "compound_microscope"}, - {"id": 6757, "synset": "compress.n.01", "name": "compress"}, - {"id": 6758, "synset": "compression_bandage.n.01", "name": "compression_bandage"}, - {"id": 6759, "synset": "compressor.n.01", "name": "compressor"}, - {"id": 6760, "synset": "computer.n.01", "name": "computer"}, - {"id": 6761, "synset": "computer_circuit.n.01", "name": "computer_circuit"}, - { - "id": 6762, - "synset": "computerized_axial_tomography_scanner.n.01", - "name": "computerized_axial_tomography_scanner", - }, - {"id": 6763, "synset": "computer_monitor.n.01", "name": "computer_monitor"}, - {"id": 6764, "synset": "computer_network.n.01", "name": "computer_network"}, - {"id": 6765, "synset": "computer_screen.n.01", "name": "computer_screen"}, - {"id": 6766, "synset": "computer_store.n.01", "name": "computer_store"}, - {"id": 6767, "synset": "computer_system.n.01", "name": "computer_system"}, - {"id": 6768, "synset": "concentration_camp.n.01", "name": "concentration_camp"}, - {"id": 6769, "synset": "concert_grand.n.01", "name": "concert_grand"}, - {"id": 6770, "synset": "concert_hall.n.01", "name": "concert_hall"}, - {"id": 6771, "synset": "concertina.n.02", "name": "concertina"}, - {"id": 6772, "synset": "concertina.n.01", "name": "concertina"}, - {"id": 6773, "synset": "concrete_mixer.n.01", "name": "concrete_mixer"}, - {"id": 6774, "synset": "condensation_pump.n.01", "name": "condensation_pump"}, - {"id": 6775, "synset": "condenser.n.04", "name": "condenser"}, - {"id": 6776, "synset": "condenser.n.03", "name": "condenser"}, - {"id": 6777, "synset": "condenser.n.02", "name": "condenser"}, - {"id": 6778, "synset": "condenser_microphone.n.01", "name": "condenser_microphone"}, - {"id": 6779, "synset": "condominium.n.02", "name": "condominium"}, - {"id": 6780, "synset": "condominium.n.01", "name": "condominium"}, - {"id": 6781, "synset": "conductor.n.04", "name": "conductor"}, - {"id": 6782, "synset": "cone_clutch.n.01", "name": "cone_clutch"}, - {"id": 6783, "synset": "confectionery.n.02", "name": "confectionery"}, - {"id": 6784, "synset": "conference_center.n.01", "name": "conference_center"}, - {"id": 6785, "synset": "conference_room.n.01", "name": "conference_room"}, - {"id": 6786, "synset": "conference_table.n.01", "name": "conference_table"}, - {"id": 6787, "synset": "confessional.n.01", "name": "confessional"}, - {"id": 6788, "synset": "conformal_projection.n.01", "name": "conformal_projection"}, - {"id": 6789, "synset": "congress_boot.n.01", "name": "congress_boot"}, - {"id": 6790, "synset": "conic_projection.n.01", "name": "conic_projection"}, - {"id": 6791, "synset": "connecting_rod.n.01", "name": "connecting_rod"}, - {"id": 6792, "synset": "connecting_room.n.01", "name": "connecting_room"}, - {"id": 6793, "synset": "connection.n.03", "name": "connection"}, - {"id": 6794, "synset": "conning_tower.n.02", "name": "conning_tower"}, - {"id": 6795, "synset": "conning_tower.n.01", "name": "conning_tower"}, - {"id": 6796, "synset": "conservatory.n.03", "name": "conservatory"}, - {"id": 6797, "synset": "conservatory.n.02", "name": "conservatory"}, - {"id": 6798, "synset": "console.n.03", "name": "console"}, - {"id": 6799, "synset": "console.n.02", "name": "console"}, - {"id": 6800, "synset": "console_table.n.01", "name": "console_table"}, - {"id": 6801, "synset": "consulate.n.01", "name": "consulate"}, - {"id": 6802, "synset": "contact.n.07", "name": "contact"}, - {"id": 6803, "synset": "contact.n.09", "name": "contact"}, - {"id": 6804, "synset": "container.n.01", "name": "container"}, - {"id": 6805, "synset": "container_ship.n.01", "name": "container_ship"}, - {"id": 6806, "synset": "containment.n.02", "name": "containment"}, - {"id": 6807, "synset": "contrabassoon.n.01", "name": "contrabassoon"}, - {"id": 6808, "synset": "control_center.n.01", "name": "control_center"}, - {"id": 6809, "synset": "control_circuit.n.01", "name": "control_circuit"}, - {"id": 6810, "synset": "control_key.n.01", "name": "control_key"}, - {"id": 6811, "synset": "control_panel.n.01", "name": "control_panel"}, - {"id": 6812, "synset": "control_rod.n.01", "name": "control_rod"}, - {"id": 6813, "synset": "control_room.n.01", "name": "control_room"}, - {"id": 6814, "synset": "control_system.n.01", "name": "control_system"}, - {"id": 6815, "synset": "control_tower.n.01", "name": "control_tower"}, - {"id": 6816, "synset": "convector.n.01", "name": "convector"}, - {"id": 6817, "synset": "convenience_store.n.01", "name": "convenience_store"}, - {"id": 6818, "synset": "convent.n.01", "name": "convent"}, - {"id": 6819, "synset": "conventicle.n.02", "name": "conventicle"}, - {"id": 6820, "synset": "converging_lens.n.01", "name": "converging_lens"}, - {"id": 6821, "synset": "converter.n.01", "name": "converter"}, - {"id": 6822, "synset": "conveyance.n.03", "name": "conveyance"}, - {"id": 6823, "synset": "conveyer_belt.n.01", "name": "conveyer_belt"}, - {"id": 6824, "synset": "cookfire.n.01", "name": "cookfire"}, - {"id": 6825, "synset": "cookhouse.n.02", "name": "cookhouse"}, - {"id": 6826, "synset": "cookie_cutter.n.01", "name": "cookie_cutter"}, - {"id": 6827, "synset": "cookie_jar.n.01", "name": "cookie_jar"}, - {"id": 6828, "synset": "cookie_sheet.n.01", "name": "cookie_sheet"}, - {"id": 6829, "synset": "cookstove.n.01", "name": "cookstove"}, - {"id": 6830, "synset": "coolant_system.n.01", "name": "coolant_system"}, - {"id": 6831, "synset": "cooling_system.n.02", "name": "cooling_system"}, - {"id": 6832, "synset": "cooling_system.n.01", "name": "cooling_system"}, - {"id": 6833, "synset": "cooling_tower.n.01", "name": "cooling_tower"}, - {"id": 6834, "synset": "coonskin_cap.n.01", "name": "coonskin_cap"}, - {"id": 6835, "synset": "cope.n.02", "name": "cope"}, - {"id": 6836, "synset": "coping_saw.n.01", "name": "coping_saw"}, - {"id": 6837, "synset": "copperware.n.01", "name": "copperware"}, - {"id": 6838, "synset": "copyholder.n.01", "name": "copyholder"}, - {"id": 6839, "synset": "coquille.n.02", "name": "coquille"}, - {"id": 6840, "synset": "coracle.n.01", "name": "coracle"}, - {"id": 6841, "synset": "corbel.n.01", "name": "corbel"}, - {"id": 6842, "synset": "corbel_arch.n.01", "name": "corbel_arch"}, - {"id": 6843, "synset": "corbel_step.n.01", "name": "corbel_step"}, - {"id": 6844, "synset": "corbie_gable.n.01", "name": "corbie_gable"}, - {"id": 6845, "synset": "cord.n.04", "name": "cord"}, - {"id": 6846, "synset": "cord.n.03", "name": "cord"}, - {"id": 6847, "synset": "cordage.n.02", "name": "cordage"}, - {"id": 6848, "synset": "cords.n.01", "name": "cords"}, - {"id": 6849, "synset": "core.n.10", "name": "core"}, - {"id": 6850, "synset": "core_bit.n.01", "name": "core_bit"}, - {"id": 6851, "synset": "core_drill.n.01", "name": "core_drill"}, - {"id": 6852, "synset": "corer.n.01", "name": "corer"}, - {"id": 6853, "synset": "corker.n.02", "name": "corker"}, - {"id": 6854, "synset": "corncrib.n.01", "name": "corncrib"}, - {"id": 6855, "synset": "corner.n.11", "name": "corner"}, - {"id": 6856, "synset": "corner.n.03", "name": "corner"}, - {"id": 6857, "synset": "corner_post.n.01", "name": "corner_post"}, - {"id": 6858, "synset": "cornice.n.03", "name": "cornice"}, - {"id": 6859, "synset": "cornice.n.02", "name": "cornice"}, - {"id": 6860, "synset": "correctional_institution.n.01", "name": "correctional_institution"}, - {"id": 6861, "synset": "corrugated_fastener.n.01", "name": "corrugated_fastener"}, - {"id": 6862, "synset": "corselet.n.01", "name": "corselet"}, - {"id": 6863, "synset": "cosmetic.n.01", "name": "cosmetic"}, - {"id": 6864, "synset": "cosmotron.n.01", "name": "cosmotron"}, - {"id": 6865, "synset": "costume.n.01", "name": "costume"}, - {"id": 6866, "synset": "costume.n.02", "name": "costume"}, - {"id": 6867, "synset": "costume.n.03", "name": "costume"}, - {"id": 6868, "synset": "cosy.n.01", "name": "cosy"}, - {"id": 6869, "synset": "cot.n.03", "name": "cot"}, - {"id": 6870, "synset": "cottage_tent.n.01", "name": "cottage_tent"}, - {"id": 6871, "synset": "cotter.n.03", "name": "cotter"}, - {"id": 6872, "synset": "cotter_pin.n.01", "name": "cotter_pin"}, - {"id": 6873, "synset": "cotton.n.02", "name": "cotton"}, - {"id": 6874, "synset": "cotton_flannel.n.01", "name": "cotton_flannel"}, - {"id": 6875, "synset": "cotton_mill.n.01", "name": "cotton_mill"}, - {"id": 6876, "synset": "couch.n.03", "name": "couch"}, - {"id": 6877, "synset": "couch.n.02", "name": "couch"}, - {"id": 6878, "synset": "couchette.n.01", "name": "couchette"}, - {"id": 6879, "synset": "coude_telescope.n.01", "name": "coude_telescope"}, - {"id": 6880, "synset": "counter.n.01", "name": "counter"}, - {"id": 6881, "synset": "counter.n.03", "name": "counter"}, - {"id": 6882, "synset": "counter.n.02", "name": "counter"}, - {"id": 6883, "synset": "counterbore.n.01", "name": "counterbore"}, - {"id": 6884, "synset": "counter_tube.n.01", "name": "counter_tube"}, - {"id": 6885, "synset": "country_house.n.01", "name": "country_house"}, - {"id": 6886, "synset": "country_store.n.01", "name": "country_store"}, - {"id": 6887, "synset": "coupe.n.01", "name": "coupe"}, - {"id": 6888, "synset": "coupling.n.02", "name": "coupling"}, - {"id": 6889, "synset": "court.n.10", "name": "court"}, - {"id": 6890, "synset": "court.n.04", "name": "court"}, - {"id": 6891, "synset": "court.n.02", "name": "court"}, - {"id": 6892, "synset": "court.n.09", "name": "court"}, - {"id": 6893, "synset": "courtelle.n.01", "name": "Courtelle"}, - {"id": 6894, "synset": "courthouse.n.02", "name": "courthouse"}, - {"id": 6895, "synset": "courthouse.n.01", "name": "courthouse"}, - {"id": 6896, "synset": "covered_bridge.n.01", "name": "covered_bridge"}, - {"id": 6897, "synset": "covered_couch.n.01", "name": "covered_couch"}, - {"id": 6898, "synset": "covered_wagon.n.01", "name": "covered_wagon"}, - {"id": 6899, "synset": "covering.n.02", "name": "covering"}, - {"id": 6900, "synset": "coverlet.n.01", "name": "coverlet"}, - {"id": 6901, "synset": "cover_plate.n.01", "name": "cover_plate"}, - {"id": 6902, "synset": "cowbarn.n.01", "name": "cowbarn"}, - {"id": 6903, "synset": "cowboy_boot.n.01", "name": "cowboy_boot"}, - {"id": 6904, "synset": "cowhide.n.03", "name": "cowhide"}, - {"id": 6905, "synset": "cowl.n.02", "name": "cowl"}, - {"id": 6906, "synset": "cow_pen.n.01", "name": "cow_pen"}, - {"id": 6907, "synset": "cpu_board.n.01", "name": "CPU_board"}, - {"id": 6908, "synset": "crackle.n.02", "name": "crackle"}, - {"id": 6909, "synset": "cradle.n.01", "name": "cradle"}, - {"id": 6910, "synset": "craft.n.02", "name": "craft"}, - {"id": 6911, "synset": "cramp.n.03", "name": "cramp"}, - {"id": 6912, "synset": "crampon.n.02", "name": "crampon"}, - {"id": 6913, "synset": "crampon.n.01", "name": "crampon"}, - {"id": 6914, "synset": "crane.n.04", "name": "crane"}, - {"id": 6915, "synset": "craniometer.n.01", "name": "craniometer"}, - {"id": 6916, "synset": "crank.n.04", "name": "crank"}, - {"id": 6917, "synset": "crankcase.n.01", "name": "crankcase"}, - {"id": 6918, "synset": "crankshaft.n.01", "name": "crankshaft"}, - {"id": 6919, "synset": "crash_barrier.n.01", "name": "crash_barrier"}, - {"id": 6920, "synset": "crash_helmet.n.01", "name": "crash_helmet"}, - {"id": 6921, "synset": "cravat.n.01", "name": "cravat"}, - {"id": 6922, "synset": "crazy_quilt.n.01", "name": "crazy_quilt"}, - {"id": 6923, "synset": "cream.n.03", "name": "cream"}, - {"id": 6924, "synset": "creche.n.01", "name": "creche"}, - {"id": 6925, "synset": "creche.n.02", "name": "creche"}, - {"id": 6926, "synset": "credenza.n.01", "name": "credenza"}, - {"id": 6927, "synset": "creel.n.01", "name": "creel"}, - {"id": 6928, "synset": "crematory.n.02", "name": "crematory"}, - {"id": 6929, "synset": "crematory.n.01", "name": "crematory"}, - {"id": 6930, "synset": "crepe.n.03", "name": "crepe"}, - {"id": 6931, "synset": "crepe_de_chine.n.01", "name": "crepe_de_Chine"}, - {"id": 6932, "synset": "crescent_wrench.n.01", "name": "crescent_wrench"}, - {"id": 6933, "synset": "cretonne.n.01", "name": "cretonne"}, - {"id": 6934, "synset": "crib.n.03", "name": "crib"}, - {"id": 6935, "synset": "cricket_ball.n.01", "name": "cricket_ball"}, - {"id": 6936, "synset": "cricket_bat.n.01", "name": "cricket_bat"}, - {"id": 6937, "synset": "cricket_equipment.n.01", "name": "cricket_equipment"}, - {"id": 6938, "synset": "cringle.n.01", "name": "cringle"}, - {"id": 6939, "synset": "crinoline.n.03", "name": "crinoline"}, - {"id": 6940, "synset": "crinoline.n.02", "name": "crinoline"}, - {"id": 6941, "synset": "crochet_needle.n.01", "name": "crochet_needle"}, - {"id": 6942, "synset": "crock_pot.n.01", "name": "Crock_Pot"}, - {"id": 6943, "synset": "crook.n.03", "name": "crook"}, - {"id": 6944, "synset": "crookes_radiometer.n.01", "name": "Crookes_radiometer"}, - {"id": 6945, "synset": "crookes_tube.n.01", "name": "Crookes_tube"}, - {"id": 6946, "synset": "croquet_ball.n.01", "name": "croquet_ball"}, - {"id": 6947, "synset": "croquet_equipment.n.01", "name": "croquet_equipment"}, - {"id": 6948, "synset": "croquet_mallet.n.01", "name": "croquet_mallet"}, - {"id": 6949, "synset": "cross.n.01", "name": "cross"}, - {"id": 6950, "synset": "crossbar.n.03", "name": "crossbar"}, - {"id": 6951, "synset": "crossbar.n.02", "name": "crossbar"}, - {"id": 6952, "synset": "crossbench.n.01", "name": "crossbench"}, - {"id": 6953, "synset": "cross_bit.n.01", "name": "cross_bit"}, - {"id": 6954, "synset": "crossbow.n.01", "name": "crossbow"}, - {"id": 6955, "synset": "crosscut_saw.n.01", "name": "crosscut_saw"}, - {"id": 6956, "synset": "crossjack.n.01", "name": "crossjack"}, - {"id": 6957, "synset": "crosspiece.n.02", "name": "crosspiece"}, - {"id": 6958, "synset": "crotchet.n.04", "name": "crotchet"}, - {"id": 6959, "synset": "croupier's_rake.n.01", "name": "croupier's_rake"}, - {"id": 6960, "synset": "crown.n.11", "name": "crown"}, - {"id": 6961, "synset": "crown_jewels.n.01", "name": "crown_jewels"}, - {"id": 6962, "synset": "crown_lens.n.01", "name": "crown_lens"}, - {"id": 6963, "synset": "crow's_nest.n.01", "name": "crow's_nest"}, - {"id": 6964, "synset": "crucible.n.01", "name": "crucible"}, - {"id": 6965, "synset": "cruet.n.01", "name": "cruet"}, - {"id": 6966, "synset": "cruet-stand.n.01", "name": "cruet-stand"}, - {"id": 6967, "synset": "cruise_control.n.01", "name": "cruise_control"}, - {"id": 6968, "synset": "cruise_missile.n.01", "name": "cruise_missile"}, - {"id": 6969, "synset": "cruiser.n.02", "name": "cruiser"}, - {"id": 6970, "synset": "crupper.n.01", "name": "crupper"}, - {"id": 6971, "synset": "cruse.n.01", "name": "cruse"}, - {"id": 6972, "synset": "crusher.n.01", "name": "crusher"}, - {"id": 6973, "synset": "cryometer.n.01", "name": "cryometer"}, - {"id": 6974, "synset": "cryoscope.n.01", "name": "cryoscope"}, - {"id": 6975, "synset": "cryostat.n.01", "name": "cryostat"}, - {"id": 6976, "synset": "crypt.n.01", "name": "crypt"}, - {"id": 6977, "synset": "crystal.n.06", "name": "crystal"}, - {"id": 6978, "synset": "crystal_detector.n.01", "name": "crystal_detector"}, - {"id": 6979, "synset": "crystal_microphone.n.01", "name": "crystal_microphone"}, - {"id": 6980, "synset": "crystal_oscillator.n.01", "name": "crystal_oscillator"}, - {"id": 6981, "synset": "crystal_set.n.01", "name": "crystal_set"}, - {"id": 6982, "synset": "cubitiere.n.01", "name": "cubitiere"}, - {"id": 6983, "synset": "cucking_stool.n.01", "name": "cucking_stool"}, - {"id": 6984, "synset": "cuckoo_clock.n.01", "name": "cuckoo_clock"}, - {"id": 6985, "synset": "cuddy.n.01", "name": "cuddy"}, - {"id": 6986, "synset": "cudgel.n.01", "name": "cudgel"}, - {"id": 6987, "synset": "cue.n.04", "name": "cue"}, - {"id": 6988, "synset": "cue_ball.n.01", "name": "cue_ball"}, - {"id": 6989, "synset": "cuff.n.01", "name": "cuff"}, - {"id": 6990, "synset": "cuirass.n.01", "name": "cuirass"}, - {"id": 6991, "synset": "cuisse.n.01", "name": "cuisse"}, - {"id": 6992, "synset": "cul.n.01", "name": "cul"}, - {"id": 6993, "synset": "culdoscope.n.01", "name": "culdoscope"}, - {"id": 6994, "synset": "cullis.n.01", "name": "cullis"}, - {"id": 6995, "synset": "culotte.n.01", "name": "culotte"}, - {"id": 6996, "synset": "cultivator.n.02", "name": "cultivator"}, - {"id": 6997, "synset": "culverin.n.02", "name": "culverin"}, - {"id": 6998, "synset": "culverin.n.01", "name": "culverin"}, - {"id": 6999, "synset": "culvert.n.01", "name": "culvert"}, - {"id": 7000, "synset": "cup_hook.n.01", "name": "cup_hook"}, - {"id": 7001, "synset": "cupola.n.02", "name": "cupola"}, - {"id": 7002, "synset": "cupola.n.01", "name": "cupola"}, - {"id": 7003, "synset": "curb.n.02", "name": "curb"}, - {"id": 7004, "synset": "curb_roof.n.01", "name": "curb_roof"}, - {"id": 7005, "synset": "curbstone.n.01", "name": "curbstone"}, - {"id": 7006, "synset": "curette.n.01", "name": "curette"}, - {"id": 7007, "synset": "currycomb.n.01", "name": "currycomb"}, - {"id": 7008, "synset": "cursor.n.01", "name": "cursor"}, - {"id": 7009, "synset": "customhouse.n.01", "name": "customhouse"}, - {"id": 7010, "synset": "cutaway.n.01", "name": "cutaway"}, - {"id": 7011, "synset": "cutlas.n.01", "name": "cutlas"}, - {"id": 7012, "synset": "cutoff.n.03", "name": "cutoff"}, - {"id": 7013, "synset": "cutout.n.01", "name": "cutout"}, - {"id": 7014, "synset": "cutter.n.06", "name": "cutter"}, - {"id": 7015, "synset": "cutter.n.05", "name": "cutter"}, - {"id": 7016, "synset": "cutting_implement.n.01", "name": "cutting_implement"}, - {"id": 7017, "synset": "cutting_room.n.01", "name": "cutting_room"}, - {"id": 7018, "synset": "cutty_stool.n.01", "name": "cutty_stool"}, - {"id": 7019, "synset": "cutwork.n.01", "name": "cutwork"}, - {"id": 7020, "synset": "cybercafe.n.01", "name": "cybercafe"}, - {"id": 7021, "synset": "cyclopean_masonry.n.01", "name": "cyclopean_masonry"}, - {"id": 7022, "synset": "cyclostyle.n.01", "name": "cyclostyle"}, - {"id": 7023, "synset": "cyclotron.n.01", "name": "cyclotron"}, - {"id": 7024, "synset": "cylinder.n.03", "name": "cylinder"}, - {"id": 7025, "synset": "cylinder_lock.n.01", "name": "cylinder_lock"}, - {"id": 7026, "synset": "dacha.n.01", "name": "dacha"}, - {"id": 7027, "synset": "dacron.n.01", "name": "Dacron"}, - {"id": 7028, "synset": "dado.n.02", "name": "dado"}, - {"id": 7029, "synset": "dado_plane.n.01", "name": "dado_plane"}, - {"id": 7030, "synset": "dairy.n.01", "name": "dairy"}, - {"id": 7031, "synset": "dais.n.01", "name": "dais"}, - {"id": 7032, "synset": "daisy_print_wheel.n.01", "name": "daisy_print_wheel"}, - {"id": 7033, "synset": "daisywheel_printer.n.01", "name": "daisywheel_printer"}, - {"id": 7034, "synset": "dam.n.01", "name": "dam"}, - {"id": 7035, "synset": "damask.n.02", "name": "damask"}, - {"id": 7036, "synset": "dampener.n.01", "name": "dampener"}, - {"id": 7037, "synset": "damper.n.02", "name": "damper"}, - {"id": 7038, "synset": "damper_block.n.01", "name": "damper_block"}, - {"id": 7039, "synset": "dark_lantern.n.01", "name": "dark_lantern"}, - {"id": 7040, "synset": "darkroom.n.01", "name": "darkroom"}, - {"id": 7041, "synset": "darning_needle.n.01", "name": "darning_needle"}, - {"id": 7042, "synset": "dart.n.02", "name": "dart"}, - {"id": 7043, "synset": "dart.n.01", "name": "dart"}, - {"id": 7044, "synset": "dashboard.n.02", "name": "dashboard"}, - {"id": 7045, "synset": "dashiki.n.01", "name": "dashiki"}, - {"id": 7046, "synset": "dash-pot.n.01", "name": "dash-pot"}, - {"id": 7047, "synset": "data_converter.n.01", "name": "data_converter"}, - {"id": 7048, "synset": "data_input_device.n.01", "name": "data_input_device"}, - {"id": 7049, "synset": "data_multiplexer.n.01", "name": "data_multiplexer"}, - {"id": 7050, "synset": "data_system.n.01", "name": "data_system"}, - {"id": 7051, "synset": "davenport.n.03", "name": "davenport"}, - {"id": 7052, "synset": "davenport.n.02", "name": "davenport"}, - {"id": 7053, "synset": "davit.n.01", "name": "davit"}, - {"id": 7054, "synset": "daybed.n.01", "name": "daybed"}, - {"id": 7055, "synset": "daybook.n.02", "name": "daybook"}, - {"id": 7056, "synset": "day_nursery.n.01", "name": "day_nursery"}, - {"id": 7057, "synset": "day_school.n.03", "name": "day_school"}, - {"id": 7058, "synset": "dead_axle.n.01", "name": "dead_axle"}, - {"id": 7059, "synset": "deadeye.n.02", "name": "deadeye"}, - {"id": 7060, "synset": "deadhead.n.02", "name": "deadhead"}, - {"id": 7061, "synset": "deanery.n.01", "name": "deanery"}, - {"id": 7062, "synset": "deathbed.n.02", "name": "deathbed"}, - {"id": 7063, "synset": "death_camp.n.01", "name": "death_camp"}, - {"id": 7064, "synset": "death_house.n.01", "name": "death_house"}, - {"id": 7065, "synset": "death_knell.n.02", "name": "death_knell"}, - {"id": 7066, "synset": "death_seat.n.01", "name": "death_seat"}, - {"id": 7067, "synset": "deck.n.02", "name": "deck"}, - {"id": 7068, "synset": "deck.n.04", "name": "deck"}, - {"id": 7069, "synset": "deck-house.n.01", "name": "deck-house"}, - {"id": 7070, "synset": "deckle.n.02", "name": "deckle"}, - {"id": 7071, "synset": "deckle_edge.n.01", "name": "deckle_edge"}, - {"id": 7072, "synset": "declinometer.n.01", "name": "declinometer"}, - {"id": 7073, "synset": "decoder.n.02", "name": "decoder"}, - {"id": 7074, "synset": "decolletage.n.01", "name": "decolletage"}, - {"id": 7075, "synset": "decoupage.n.01", "name": "decoupage"}, - {"id": 7076, "synset": "dedicated_file_server.n.01", "name": "dedicated_file_server"}, - {"id": 7077, "synset": "deep-freeze.n.01", "name": "deep-freeze"}, - {"id": 7078, "synset": "deerstalker.n.01", "name": "deerstalker"}, - {"id": 7079, "synset": "defense_system.n.01", "name": "defense_system"}, - {"id": 7080, "synset": "defensive_structure.n.01", "name": "defensive_structure"}, - {"id": 7081, "synset": "defibrillator.n.01", "name": "defibrillator"}, - {"id": 7082, "synset": "defilade.n.01", "name": "defilade"}, - {"id": 7083, "synset": "deflector.n.01", "name": "deflector"}, - {"id": 7084, "synset": "delayed_action.n.01", "name": "delayed_action"}, - {"id": 7085, "synset": "delay_line.n.01", "name": "delay_line"}, - {"id": 7086, "synset": "delft.n.01", "name": "delft"}, - {"id": 7087, "synset": "delicatessen.n.02", "name": "delicatessen"}, - {"id": 7088, "synset": "delivery_truck.n.01", "name": "delivery_truck"}, - {"id": 7089, "synset": "delta_wing.n.01", "name": "delta_wing"}, - {"id": 7090, "synset": "demijohn.n.01", "name": "demijohn"}, - {"id": 7091, "synset": "demitasse.n.02", "name": "demitasse"}, - {"id": 7092, "synset": "den.n.04", "name": "den"}, - {"id": 7093, "synset": "denim.n.02", "name": "denim"}, - {"id": 7094, "synset": "densimeter.n.01", "name": "densimeter"}, - {"id": 7095, "synset": "densitometer.n.01", "name": "densitometer"}, - {"id": 7096, "synset": "dental_appliance.n.01", "name": "dental_appliance"}, - {"id": 7097, "synset": "dental_implant.n.01", "name": "dental_implant"}, - {"id": 7098, "synset": "dentist's_drill.n.01", "name": "dentist's_drill"}, - {"id": 7099, "synset": "denture.n.01", "name": "denture"}, - {"id": 7100, "synset": "deodorant.n.01", "name": "deodorant"}, - {"id": 7101, "synset": "department_store.n.01", "name": "department_store"}, - {"id": 7102, "synset": "departure_lounge.n.01", "name": "departure_lounge"}, - {"id": 7103, "synset": "depilatory.n.02", "name": "depilatory"}, - {"id": 7104, "synset": "depressor.n.03", "name": "depressor"}, - {"id": 7105, "synset": "depth_finder.n.01", "name": "depth_finder"}, - {"id": 7106, "synset": "depth_gauge.n.01", "name": "depth_gauge"}, - {"id": 7107, "synset": "derrick.n.02", "name": "derrick"}, - {"id": 7108, "synset": "derrick.n.01", "name": "derrick"}, - {"id": 7109, "synset": "derringer.n.01", "name": "derringer"}, - {"id": 7110, "synset": "desk_phone.n.01", "name": "desk_phone"}, - {"id": 7111, "synset": "desktop_computer.n.01", "name": "desktop_computer"}, - {"id": 7112, "synset": "dessert_spoon.n.01", "name": "dessert_spoon"}, - {"id": 7113, "synset": "destroyer.n.01", "name": "destroyer"}, - {"id": 7114, "synset": "destroyer_escort.n.01", "name": "destroyer_escort"}, - {"id": 7115, "synset": "detached_house.n.01", "name": "detached_house"}, - {"id": 7116, "synset": "detector.n.01", "name": "detector"}, - {"id": 7117, "synset": "detector.n.03", "name": "detector"}, - {"id": 7118, "synset": "detention_home.n.01", "name": "detention_home"}, - {"id": 7119, "synset": "detonating_fuse.n.01", "name": "detonating_fuse"}, - {"id": 7120, "synset": "detonator.n.01", "name": "detonator"}, - {"id": 7121, "synset": "developer.n.02", "name": "developer"}, - {"id": 7122, "synset": "device.n.01", "name": "device"}, - {"id": 7123, "synset": "dewar_flask.n.01", "name": "Dewar_flask"}, - {"id": 7124, "synset": "dhoti.n.01", "name": "dhoti"}, - {"id": 7125, "synset": "dhow.n.01", "name": "dhow"}, - {"id": 7126, "synset": "dial.n.04", "name": "dial"}, - {"id": 7127, "synset": "dial.n.03", "name": "dial"}, - {"id": 7128, "synset": "dial.n.02", "name": "dial"}, - {"id": 7129, "synset": "dialog_box.n.01", "name": "dialog_box"}, - {"id": 7130, "synset": "dial_telephone.n.01", "name": "dial_telephone"}, - {"id": 7131, "synset": "dialyzer.n.01", "name": "dialyzer"}, - {"id": 7132, "synset": "diamante.n.02", "name": "diamante"}, - {"id": 7133, "synset": "diaper.n.02", "name": "diaper"}, - {"id": 7134, "synset": "diaphone.n.01", "name": "diaphone"}, - {"id": 7135, "synset": "diaphragm.n.01", "name": "diaphragm"}, - {"id": 7136, "synset": "diaphragm.n.04", "name": "diaphragm"}, - {"id": 7137, "synset": "diathermy_machine.n.01", "name": "diathermy_machine"}, - {"id": 7138, "synset": "dibble.n.01", "name": "dibble"}, - {"id": 7139, "synset": "dice_cup.n.01", "name": "dice_cup"}, - {"id": 7140, "synset": "dicer.n.01", "name": "dicer"}, - {"id": 7141, "synset": "dickey.n.02", "name": "dickey"}, - {"id": 7142, "synset": "dickey.n.01", "name": "dickey"}, - {"id": 7143, "synset": "dictaphone.n.01", "name": "Dictaphone"}, - {"id": 7144, "synset": "die.n.03", "name": "die"}, - {"id": 7145, "synset": "diesel.n.02", "name": "diesel"}, - {"id": 7146, "synset": "diesel-electric_locomotive.n.01", "name": "diesel-electric_locomotive"}, - { - "id": 7147, - "synset": "diesel-hydraulic_locomotive.n.01", - "name": "diesel-hydraulic_locomotive", - }, - {"id": 7148, "synset": "diesel_locomotive.n.01", "name": "diesel_locomotive"}, - {"id": 7149, "synset": "diestock.n.01", "name": "diestock"}, - {"id": 7150, "synset": "differential_analyzer.n.01", "name": "differential_analyzer"}, - {"id": 7151, "synset": "differential_gear.n.01", "name": "differential_gear"}, - {"id": 7152, "synset": "diffuser.n.02", "name": "diffuser"}, - {"id": 7153, "synset": "diffuser.n.01", "name": "diffuser"}, - {"id": 7154, "synset": "digester.n.01", "name": "digester"}, - {"id": 7155, "synset": "diggings.n.02", "name": "diggings"}, - {"id": 7156, "synset": "digital-analog_converter.n.01", "name": "digital-analog_converter"}, - {"id": 7157, "synset": "digital_audiotape.n.01", "name": "digital_audiotape"}, - {"id": 7158, "synset": "digital_camera.n.01", "name": "digital_camera"}, - {"id": 7159, "synset": "digital_clock.n.01", "name": "digital_clock"}, - {"id": 7160, "synset": "digital_computer.n.01", "name": "digital_computer"}, - {"id": 7161, "synset": "digital_display.n.01", "name": "digital_display"}, - {"id": 7162, "synset": "digital_subscriber_line.n.01", "name": "digital_subscriber_line"}, - {"id": 7163, "synset": "digital_voltmeter.n.01", "name": "digital_voltmeter"}, - {"id": 7164, "synset": "digital_watch.n.01", "name": "digital_watch"}, - {"id": 7165, "synset": "digitizer.n.01", "name": "digitizer"}, - {"id": 7166, "synset": "dilator.n.03", "name": "dilator"}, - {"id": 7167, "synset": "dildo.n.01", "name": "dildo"}, - {"id": 7168, "synset": "dimity.n.01", "name": "dimity"}, - {"id": 7169, "synset": "dimmer.n.01", "name": "dimmer"}, - {"id": 7170, "synset": "diner.n.03", "name": "diner"}, - {"id": 7171, "synset": "dinette.n.01", "name": "dinette"}, - {"id": 7172, "synset": "dining_area.n.01", "name": "dining_area"}, - {"id": 7173, "synset": "dining_car.n.01", "name": "dining_car"}, - {"id": 7174, "synset": "dining-hall.n.01", "name": "dining-hall"}, - {"id": 7175, "synset": "dining_room.n.01", "name": "dining_room"}, - {"id": 7176, "synset": "dining-room_furniture.n.01", "name": "dining-room_furniture"}, - {"id": 7177, "synset": "dining-room_table.n.01", "name": "dining-room_table"}, - {"id": 7178, "synset": "dinner_bell.n.01", "name": "dinner_bell"}, - {"id": 7179, "synset": "dinner_dress.n.01", "name": "dinner_dress"}, - {"id": 7180, "synset": "dinner_napkin.n.01", "name": "dinner_napkin"}, - {"id": 7181, "synset": "dinner_pail.n.01", "name": "dinner_pail"}, - {"id": 7182, "synset": "dinner_table.n.01", "name": "dinner_table"}, - {"id": 7183, "synset": "dinner_theater.n.01", "name": "dinner_theater"}, - {"id": 7184, "synset": "diode.n.02", "name": "diode"}, - {"id": 7185, "synset": "diode.n.01", "name": "diode"}, - {"id": 7186, "synset": "dip.n.07", "name": "dip"}, - {"id": 7187, "synset": "diplomatic_building.n.01", "name": "diplomatic_building"}, - {"id": 7188, "synset": "dipole.n.02", "name": "dipole"}, - {"id": 7189, "synset": "dipper.n.01", "name": "dipper"}, - {"id": 7190, "synset": "dipstick.n.01", "name": "dipstick"}, - {"id": 7191, "synset": "dip_switch.n.01", "name": "DIP_switch"}, - {"id": 7192, "synset": "directional_antenna.n.01", "name": "directional_antenna"}, - {"id": 7193, "synset": "directional_microphone.n.01", "name": "directional_microphone"}, - {"id": 7194, "synset": "direction_finder.n.01", "name": "direction_finder"}, - {"id": 7195, "synset": "dirk.n.01", "name": "dirk"}, - {"id": 7196, "synset": "dirndl.n.02", "name": "dirndl"}, - {"id": 7197, "synset": "dirndl.n.01", "name": "dirndl"}, - {"id": 7198, "synset": "dirty_bomb.n.01", "name": "dirty_bomb"}, - {"id": 7199, "synset": "discharge_lamp.n.01", "name": "discharge_lamp"}, - {"id": 7200, "synset": "discharge_pipe.n.01", "name": "discharge_pipe"}, - {"id": 7201, "synset": "disco.n.02", "name": "disco"}, - {"id": 7202, "synset": "discount_house.n.01", "name": "discount_house"}, - {"id": 7203, "synset": "discus.n.02", "name": "discus"}, - {"id": 7204, "synset": "disguise.n.02", "name": "disguise"}, - {"id": 7205, "synset": "dishpan.n.01", "name": "dishpan"}, - {"id": 7206, "synset": "dish_rack.n.01", "name": "dish_rack"}, - {"id": 7207, "synset": "disk.n.02", "name": "disk"}, - {"id": 7208, "synset": "disk_brake.n.01", "name": "disk_brake"}, - {"id": 7209, "synset": "disk_clutch.n.01", "name": "disk_clutch"}, - {"id": 7210, "synset": "disk_controller.n.01", "name": "disk_controller"}, - {"id": 7211, "synset": "disk_drive.n.01", "name": "disk_drive"}, - {"id": 7212, "synset": "diskette.n.01", "name": "diskette"}, - {"id": 7213, "synset": "disk_harrow.n.01", "name": "disk_harrow"}, - {"id": 7214, "synset": "dispatch_case.n.01", "name": "dispatch_case"}, - {"id": 7215, "synset": "dispensary.n.01", "name": "dispensary"}, - {"id": 7216, "synset": "display.n.06", "name": "display"}, - {"id": 7217, "synset": "display_adapter.n.01", "name": "display_adapter"}, - {"id": 7218, "synset": "display_panel.n.01", "name": "display_panel"}, - {"id": 7219, "synset": "display_window.n.01", "name": "display_window"}, - {"id": 7220, "synset": "disposal.n.04", "name": "disposal"}, - {"id": 7221, "synset": "disrupting_explosive.n.01", "name": "disrupting_explosive"}, - {"id": 7222, "synset": "distaff.n.02", "name": "distaff"}, - {"id": 7223, "synset": "distillery.n.01", "name": "distillery"}, - {"id": 7224, "synset": "distributor.n.04", "name": "distributor"}, - {"id": 7225, "synset": "distributor_cam.n.01", "name": "distributor_cam"}, - {"id": 7226, "synset": "distributor_cap.n.01", "name": "distributor_cap"}, - {"id": 7227, "synset": "distributor_housing.n.01", "name": "distributor_housing"}, - {"id": 7228, "synset": "distributor_point.n.01", "name": "distributor_point"}, - {"id": 7229, "synset": "ditch.n.01", "name": "ditch"}, - {"id": 7230, "synset": "ditch_spade.n.01", "name": "ditch_spade"}, - {"id": 7231, "synset": "ditty_bag.n.01", "name": "ditty_bag"}, - {"id": 7232, "synset": "divan.n.01", "name": "divan"}, - {"id": 7233, "synset": "divan.n.04", "name": "divan"}, - {"id": 7234, "synset": "dive_bomber.n.01", "name": "dive_bomber"}, - {"id": 7235, "synset": "diverging_lens.n.01", "name": "diverging_lens"}, - {"id": 7236, "synset": "divided_highway.n.01", "name": "divided_highway"}, - {"id": 7237, "synset": "divider.n.04", "name": "divider"}, - {"id": 7238, "synset": "diving_bell.n.01", "name": "diving_bell"}, - {"id": 7239, "synset": "divining_rod.n.01", "name": "divining_rod"}, - {"id": 7240, "synset": "diving_suit.n.01", "name": "diving_suit"}, - {"id": 7241, "synset": "dixie.n.02", "name": "dixie"}, - {"id": 7242, "synset": "dock.n.05", "name": "dock"}, - {"id": 7243, "synset": "doeskin.n.02", "name": "doeskin"}, - {"id": 7244, "synset": "dogcart.n.01", "name": "dogcart"}, - {"id": 7245, "synset": "doggie_bag.n.01", "name": "doggie_bag"}, - {"id": 7246, "synset": "dogsled.n.01", "name": "dogsled"}, - {"id": 7247, "synset": "dog_wrench.n.01", "name": "dog_wrench"}, - {"id": 7248, "synset": "doily.n.01", "name": "doily"}, - {"id": 7249, "synset": "dolly.n.02", "name": "dolly"}, - {"id": 7250, "synset": "dolman.n.02", "name": "dolman"}, - {"id": 7251, "synset": "dolman.n.01", "name": "dolman"}, - {"id": 7252, "synset": "dolman_sleeve.n.01", "name": "dolman_sleeve"}, - {"id": 7253, "synset": "dolmen.n.01", "name": "dolmen"}, - {"id": 7254, "synset": "dome.n.04", "name": "dome"}, - {"id": 7255, "synset": "dome.n.03", "name": "dome"}, - {"id": 7256, "synset": "domino.n.03", "name": "domino"}, - {"id": 7257, "synset": "dongle.n.01", "name": "dongle"}, - {"id": 7258, "synset": "donkey_jacket.n.01", "name": "donkey_jacket"}, - {"id": 7259, "synset": "door.n.01", "name": "door"}, - {"id": 7260, "synset": "door.n.05", "name": "door"}, - {"id": 7261, "synset": "door.n.04", "name": "door"}, - {"id": 7262, "synset": "doorbell.n.01", "name": "doorbell"}, - {"id": 7263, "synset": "doorframe.n.01", "name": "doorframe"}, - {"id": 7264, "synset": "doorjamb.n.01", "name": "doorjamb"}, - {"id": 7265, "synset": "doorlock.n.01", "name": "doorlock"}, - {"id": 7266, "synset": "doornail.n.01", "name": "doornail"}, - {"id": 7267, "synset": "doorplate.n.01", "name": "doorplate"}, - {"id": 7268, "synset": "doorsill.n.01", "name": "doorsill"}, - {"id": 7269, "synset": "doorstop.n.01", "name": "doorstop"}, - {"id": 7270, "synset": "doppler_radar.n.01", "name": "Doppler_radar"}, - {"id": 7271, "synset": "dormer.n.01", "name": "dormer"}, - {"id": 7272, "synset": "dormer_window.n.01", "name": "dormer_window"}, - {"id": 7273, "synset": "dormitory.n.01", "name": "dormitory"}, - {"id": 7274, "synset": "dormitory.n.02", "name": "dormitory"}, - {"id": 7275, "synset": "dosemeter.n.01", "name": "dosemeter"}, - {"id": 7276, "synset": "dossal.n.01", "name": "dossal"}, - {"id": 7277, "synset": "dot_matrix_printer.n.01", "name": "dot_matrix_printer"}, - {"id": 7278, "synset": "double_bed.n.01", "name": "double_bed"}, - {"id": 7279, "synset": "double-bitted_ax.n.01", "name": "double-bitted_ax"}, - {"id": 7280, "synset": "double_boiler.n.01", "name": "double_boiler"}, - {"id": 7281, "synset": "double-breasted_jacket.n.01", "name": "double-breasted_jacket"}, - {"id": 7282, "synset": "double-breasted_suit.n.01", "name": "double-breasted_suit"}, - {"id": 7283, "synset": "double_door.n.01", "name": "double_door"}, - {"id": 7284, "synset": "double_glazing.n.01", "name": "double_glazing"}, - {"id": 7285, "synset": "double-hung_window.n.01", "name": "double-hung_window"}, - {"id": 7286, "synset": "double_knit.n.01", "name": "double_knit"}, - {"id": 7287, "synset": "doubler.n.01", "name": "doubler"}, - {"id": 7288, "synset": "double_reed.n.02", "name": "double_reed"}, - {"id": 7289, "synset": "double-reed_instrument.n.01", "name": "double-reed_instrument"}, - {"id": 7290, "synset": "doublet.n.01", "name": "doublet"}, - {"id": 7291, "synset": "doubletree.n.01", "name": "doubletree"}, - {"id": 7292, "synset": "douche.n.01", "name": "douche"}, - {"id": 7293, "synset": "dovecote.n.01", "name": "dovecote"}, - {"id": 7294, "synset": "dover's_powder.n.01", "name": "Dover's_powder"}, - {"id": 7295, "synset": "dovetail.n.01", "name": "dovetail"}, - {"id": 7296, "synset": "dovetail_plane.n.01", "name": "dovetail_plane"}, - {"id": 7297, "synset": "dowel.n.01", "name": "dowel"}, - {"id": 7298, "synset": "downstage.n.01", "name": "downstage"}, - {"id": 7299, "synset": "drafting_instrument.n.01", "name": "drafting_instrument"}, - {"id": 7300, "synset": "drafting_table.n.01", "name": "drafting_table"}, - {"id": 7301, "synset": "dragunov.n.01", "name": "Dragunov"}, - {"id": 7302, "synset": "drainage_ditch.n.01", "name": "drainage_ditch"}, - {"id": 7303, "synset": "drainage_system.n.01", "name": "drainage_system"}, - {"id": 7304, "synset": "drain_basket.n.01", "name": "drain_basket"}, - {"id": 7305, "synset": "drainplug.n.01", "name": "drainplug"}, - {"id": 7306, "synset": "drape.n.03", "name": "drape"}, - {"id": 7307, "synset": "drapery.n.02", "name": "drapery"}, - {"id": 7308, "synset": "drawbar.n.01", "name": "drawbar"}, - {"id": 7309, "synset": "drawbridge.n.01", "name": "drawbridge"}, - {"id": 7310, "synset": "drawing_chalk.n.01", "name": "drawing_chalk"}, - {"id": 7311, "synset": "drawing_room.n.01", "name": "drawing_room"}, - {"id": 7312, "synset": "drawing_room.n.02", "name": "drawing_room"}, - {"id": 7313, "synset": "drawknife.n.01", "name": "drawknife"}, - {"id": 7314, "synset": "drawstring_bag.n.01", "name": "drawstring_bag"}, - {"id": 7315, "synset": "dray.n.01", "name": "dray"}, - {"id": 7316, "synset": "dreadnought.n.01", "name": "dreadnought"}, - {"id": 7317, "synset": "dredge.n.01", "name": "dredge"}, - {"id": 7318, "synset": "dredger.n.01", "name": "dredger"}, - {"id": 7319, "synset": "dredging_bucket.n.01", "name": "dredging_bucket"}, - {"id": 7320, "synset": "dress_blues.n.01", "name": "dress_blues"}, - {"id": 7321, "synset": "dressing.n.04", "name": "dressing"}, - {"id": 7322, "synset": "dressing_case.n.01", "name": "dressing_case"}, - {"id": 7323, "synset": "dressing_gown.n.01", "name": "dressing_gown"}, - {"id": 7324, "synset": "dressing_room.n.01", "name": "dressing_room"}, - {"id": 7325, "synset": "dressing_sack.n.01", "name": "dressing_sack"}, - {"id": 7326, "synset": "dressing_table.n.01", "name": "dressing_table"}, - {"id": 7327, "synset": "dress_rack.n.01", "name": "dress_rack"}, - {"id": 7328, "synset": "dress_shirt.n.01", "name": "dress_shirt"}, - {"id": 7329, "synset": "dress_uniform.n.01", "name": "dress_uniform"}, - {"id": 7330, "synset": "drift_net.n.01", "name": "drift_net"}, - {"id": 7331, "synset": "electric_drill.n.01", "name": "electric_drill"}, - {"id": 7332, "synset": "drilling_platform.n.01", "name": "drilling_platform"}, - {"id": 7333, "synset": "drill_press.n.01", "name": "drill_press"}, - {"id": 7334, "synset": "drill_rig.n.01", "name": "drill_rig"}, - {"id": 7335, "synset": "drinking_fountain.n.01", "name": "drinking_fountain"}, - {"id": 7336, "synset": "drinking_vessel.n.01", "name": "drinking_vessel"}, - {"id": 7337, "synset": "drip_loop.n.01", "name": "drip_loop"}, - {"id": 7338, "synset": "drip_mat.n.01", "name": "drip_mat"}, - {"id": 7339, "synset": "drip_pan.n.02", "name": "drip_pan"}, - {"id": 7340, "synset": "dripping_pan.n.01", "name": "dripping_pan"}, - {"id": 7341, "synset": "drip_pot.n.01", "name": "drip_pot"}, - {"id": 7342, "synset": "drive.n.02", "name": "drive"}, - {"id": 7343, "synset": "drive.n.10", "name": "drive"}, - {"id": 7344, "synset": "drive_line.n.01", "name": "drive_line"}, - {"id": 7345, "synset": "driver.n.05", "name": "driver"}, - {"id": 7346, "synset": "driveshaft.n.01", "name": "driveshaft"}, - {"id": 7347, "synset": "driveway.n.01", "name": "driveway"}, - {"id": 7348, "synset": "driving_iron.n.01", "name": "driving_iron"}, - {"id": 7349, "synset": "driving_wheel.n.01", "name": "driving_wheel"}, - {"id": 7350, "synset": "drogue.n.04", "name": "drogue"}, - {"id": 7351, "synset": "drogue_parachute.n.01", "name": "drogue_parachute"}, - {"id": 7352, "synset": "drone.n.05", "name": "drone"}, - {"id": 7353, "synset": "drop_arch.n.01", "name": "drop_arch"}, - {"id": 7354, "synset": "drop_cloth.n.02", "name": "drop_cloth"}, - {"id": 7355, "synset": "drop_curtain.n.01", "name": "drop_curtain"}, - {"id": 7356, "synset": "drop_forge.n.01", "name": "drop_forge"}, - {"id": 7357, "synset": "drop-leaf_table.n.01", "name": "drop-leaf_table"}, - {"id": 7358, "synset": "droshky.n.01", "name": "droshky"}, - {"id": 7359, "synset": "drove.n.03", "name": "drove"}, - {"id": 7360, "synset": "drugget.n.01", "name": "drugget"}, - {"id": 7361, "synset": "drugstore.n.01", "name": "drugstore"}, - {"id": 7362, "synset": "drum.n.04", "name": "drum"}, - {"id": 7363, "synset": "drum_brake.n.01", "name": "drum_brake"}, - {"id": 7364, "synset": "drumhead.n.01", "name": "drumhead"}, - {"id": 7365, "synset": "drum_printer.n.01", "name": "drum_printer"}, - {"id": 7366, "synset": "drum_sander.n.01", "name": "drum_sander"}, - {"id": 7367, "synset": "dry_battery.n.01", "name": "dry_battery"}, - {"id": 7368, "synset": "dry-bulb_thermometer.n.01", "name": "dry-bulb_thermometer"}, - {"id": 7369, "synset": "dry_cell.n.01", "name": "dry_cell"}, - {"id": 7370, "synset": "dry_dock.n.01", "name": "dry_dock"}, - {"id": 7371, "synset": "dryer.n.01", "name": "dryer"}, - {"id": 7372, "synset": "dry_fly.n.01", "name": "dry_fly"}, - {"id": 7373, "synset": "dry_kiln.n.01", "name": "dry_kiln"}, - {"id": 7374, "synset": "dry_masonry.n.01", "name": "dry_masonry"}, - {"id": 7375, "synset": "dry_point.n.02", "name": "dry_point"}, - {"id": 7376, "synset": "dry_wall.n.02", "name": "dry_wall"}, - {"id": 7377, "synset": "dual_scan_display.n.01", "name": "dual_scan_display"}, - {"id": 7378, "synset": "duck.n.04", "name": "duck"}, - {"id": 7379, "synset": "duckboard.n.01", "name": "duckboard"}, - {"id": 7380, "synset": "duckpin.n.01", "name": "duckpin"}, - {"id": 7381, "synset": "dudeen.n.01", "name": "dudeen"}, - {"id": 7382, "synset": "duffel.n.02", "name": "duffel"}, - {"id": 7383, "synset": "duffel_coat.n.01", "name": "duffel_coat"}, - {"id": 7384, "synset": "dugout.n.01", "name": "dugout"}, - {"id": 7385, "synset": "dugout_canoe.n.01", "name": "dugout_canoe"}, - {"id": 7386, "synset": "dulciana.n.01", "name": "dulciana"}, - {"id": 7387, "synset": "dulcimer.n.02", "name": "dulcimer"}, - {"id": 7388, "synset": "dulcimer.n.01", "name": "dulcimer"}, - {"id": 7389, "synset": "dumb_bomb.n.01", "name": "dumb_bomb"}, - {"id": 7390, "synset": "dumbwaiter.n.01", "name": "dumbwaiter"}, - {"id": 7391, "synset": "dumdum.n.01", "name": "dumdum"}, - {"id": 7392, "synset": "dumpcart.n.01", "name": "dumpcart"}, - {"id": 7393, "synset": "dump_truck.n.01", "name": "dump_truck"}, - {"id": 7394, "synset": "dumpy_level.n.01", "name": "Dumpy_level"}, - {"id": 7395, "synset": "dunce_cap.n.01", "name": "dunce_cap"}, - {"id": 7396, "synset": "dune_buggy.n.01", "name": "dune_buggy"}, - {"id": 7397, "synset": "dungeon.n.02", "name": "dungeon"}, - {"id": 7398, "synset": "duplex_apartment.n.01", "name": "duplex_apartment"}, - {"id": 7399, "synset": "duplex_house.n.01", "name": "duplex_house"}, - {"id": 7400, "synset": "duplicator.n.01", "name": "duplicator"}, - {"id": 7401, "synset": "dust_bag.n.01", "name": "dust_bag"}, - {"id": 7402, "synset": "dustcloth.n.01", "name": "dustcloth"}, - {"id": 7403, "synset": "dust_cover.n.03", "name": "dust_cover"}, - {"id": 7404, "synset": "dust_cover.n.02", "name": "dust_cover"}, - {"id": 7405, "synset": "dustmop.n.01", "name": "dustmop"}, - {"id": 7406, "synset": "dutch_oven.n.01", "name": "Dutch_oven"}, - {"id": 7407, "synset": "dutch_oven.n.02", "name": "Dutch_oven"}, - {"id": 7408, "synset": "dwelling.n.01", "name": "dwelling"}, - {"id": 7409, "synset": "dye-works.n.01", "name": "dye-works"}, - {"id": 7410, "synset": "dynamo.n.01", "name": "dynamo"}, - {"id": 7411, "synset": "dynamometer.n.01", "name": "dynamometer"}, - {"id": 7412, "synset": "eames_chair.n.01", "name": "Eames_chair"}, - {"id": 7413, "synset": "earflap.n.01", "name": "earflap"}, - {"id": 7414, "synset": "early_warning_radar.n.01", "name": "early_warning_radar"}, - {"id": 7415, "synset": "early_warning_system.n.01", "name": "early_warning_system"}, - {"id": 7416, "synset": "earmuff.n.01", "name": "earmuff"}, - {"id": 7417, "synset": "earplug.n.02", "name": "earplug"}, - {"id": 7418, "synset": "earthenware.n.01", "name": "earthenware"}, - {"id": 7419, "synset": "earthwork.n.01", "name": "earthwork"}, - {"id": 7420, "synset": "easy_chair.n.01", "name": "easy_chair"}, - {"id": 7421, "synset": "eaves.n.01", "name": "eaves"}, - {"id": 7422, "synset": "ecclesiastical_attire.n.01", "name": "ecclesiastical_attire"}, - {"id": 7423, "synset": "echinus.n.01", "name": "echinus"}, - {"id": 7424, "synset": "echocardiograph.n.01", "name": "echocardiograph"}, - {"id": 7425, "synset": "edger.n.02", "name": "edger"}, - {"id": 7426, "synset": "edge_tool.n.01", "name": "edge_tool"}, - {"id": 7427, "synset": "efficiency_apartment.n.01", "name": "efficiency_apartment"}, - {"id": 7428, "synset": "egg-and-dart.n.01", "name": "egg-and-dart"}, - {"id": 7429, "synset": "egg_timer.n.01", "name": "egg_timer"}, - {"id": 7430, "synset": "eiderdown.n.01", "name": "eiderdown"}, - {"id": 7431, "synset": "eight_ball.n.01", "name": "eight_ball"}, - {"id": 7432, "synset": "ejection_seat.n.01", "name": "ejection_seat"}, - {"id": 7433, "synset": "elastic.n.02", "name": "elastic"}, - {"id": 7434, "synset": "elastic_bandage.n.01", "name": "elastic_bandage"}, - {"id": 7435, "synset": "elastoplast.n.01", "name": "Elastoplast"}, - {"id": 7436, "synset": "elbow.n.04", "name": "elbow"}, - {"id": 7437, "synset": "elbow_pad.n.01", "name": "elbow_pad"}, - {"id": 7438, "synset": "electric.n.01", "name": "electric"}, - {"id": 7439, "synset": "electrical_cable.n.01", "name": "electrical_cable"}, - {"id": 7440, "synset": "electrical_contact.n.01", "name": "electrical_contact"}, - {"id": 7441, "synset": "electrical_converter.n.01", "name": "electrical_converter"}, - {"id": 7442, "synset": "electrical_device.n.01", "name": "electrical_device"}, - {"id": 7443, "synset": "electrical_system.n.02", "name": "electrical_system"}, - {"id": 7444, "synset": "electric_bell.n.01", "name": "electric_bell"}, - {"id": 7445, "synset": "electric_blanket.n.01", "name": "electric_blanket"}, - {"id": 7446, "synset": "electric_clock.n.01", "name": "electric_clock"}, - {"id": 7447, "synset": "electric-discharge_lamp.n.01", "name": "electric-discharge_lamp"}, - {"id": 7448, "synset": "electric_fan.n.01", "name": "electric_fan"}, - {"id": 7449, "synset": "electric_frying_pan.n.01", "name": "electric_frying_pan"}, - {"id": 7450, "synset": "electric_furnace.n.01", "name": "electric_furnace"}, - {"id": 7451, "synset": "electric_guitar.n.01", "name": "electric_guitar"}, - {"id": 7452, "synset": "electric_hammer.n.01", "name": "electric_hammer"}, - {"id": 7453, "synset": "electric_heater.n.01", "name": "electric_heater"}, - {"id": 7454, "synset": "electric_lamp.n.01", "name": "electric_lamp"}, - {"id": 7455, "synset": "electric_locomotive.n.01", "name": "electric_locomotive"}, - {"id": 7456, "synset": "electric_meter.n.01", "name": "electric_meter"}, - {"id": 7457, "synset": "electric_mixer.n.01", "name": "electric_mixer"}, - {"id": 7458, "synset": "electric_motor.n.01", "name": "electric_motor"}, - {"id": 7459, "synset": "electric_organ.n.01", "name": "electric_organ"}, - {"id": 7460, "synset": "electric_range.n.01", "name": "electric_range"}, - {"id": 7461, "synset": "electric_toothbrush.n.01", "name": "electric_toothbrush"}, - {"id": 7462, "synset": "electric_typewriter.n.01", "name": "electric_typewriter"}, - { - "id": 7463, - "synset": "electro-acoustic_transducer.n.01", - "name": "electro-acoustic_transducer", - }, - {"id": 7464, "synset": "electrode.n.01", "name": "electrode"}, - {"id": 7465, "synset": "electrodynamometer.n.01", "name": "electrodynamometer"}, - {"id": 7466, "synset": "electroencephalograph.n.01", "name": "electroencephalograph"}, - {"id": 7467, "synset": "electrograph.n.01", "name": "electrograph"}, - {"id": 7468, "synset": "electrolytic.n.01", "name": "electrolytic"}, - {"id": 7469, "synset": "electrolytic_cell.n.01", "name": "electrolytic_cell"}, - {"id": 7470, "synset": "electromagnet.n.01", "name": "electromagnet"}, - {"id": 7471, "synset": "electrometer.n.01", "name": "electrometer"}, - {"id": 7472, "synset": "electromyograph.n.01", "name": "electromyograph"}, - {"id": 7473, "synset": "electron_accelerator.n.01", "name": "electron_accelerator"}, - {"id": 7474, "synset": "electron_gun.n.01", "name": "electron_gun"}, - {"id": 7475, "synset": "electronic_balance.n.01", "name": "electronic_balance"}, - {"id": 7476, "synset": "electronic_converter.n.01", "name": "electronic_converter"}, - {"id": 7477, "synset": "electronic_device.n.01", "name": "electronic_device"}, - {"id": 7478, "synset": "electronic_equipment.n.01", "name": "electronic_equipment"}, - {"id": 7479, "synset": "electronic_fetal_monitor.n.01", "name": "electronic_fetal_monitor"}, - {"id": 7480, "synset": "electronic_instrument.n.01", "name": "electronic_instrument"}, - {"id": 7481, "synset": "electronic_voltmeter.n.01", "name": "electronic_voltmeter"}, - {"id": 7482, "synset": "electron_microscope.n.01", "name": "electron_microscope"}, - {"id": 7483, "synset": "electron_multiplier.n.01", "name": "electron_multiplier"}, - {"id": 7484, "synset": "electrophorus.n.01", "name": "electrophorus"}, - {"id": 7485, "synset": "electroscope.n.01", "name": "electroscope"}, - {"id": 7486, "synset": "electrostatic_generator.n.01", "name": "electrostatic_generator"}, - {"id": 7487, "synset": "electrostatic_printer.n.01", "name": "electrostatic_printer"}, - {"id": 7488, "synset": "elevator.n.01", "name": "elevator"}, - {"id": 7489, "synset": "elevator.n.02", "name": "elevator"}, - {"id": 7490, "synset": "elevator_shaft.n.01", "name": "elevator_shaft"}, - {"id": 7491, "synset": "embankment.n.01", "name": "embankment"}, - {"id": 7492, "synset": "embassy.n.01", "name": "embassy"}, - {"id": 7493, "synset": "embellishment.n.02", "name": "embellishment"}, - {"id": 7494, "synset": "emergency_room.n.01", "name": "emergency_room"}, - {"id": 7495, "synset": "emesis_basin.n.01", "name": "emesis_basin"}, - {"id": 7496, "synset": "emitter.n.01", "name": "emitter"}, - {"id": 7497, "synset": "empty.n.01", "name": "empty"}, - {"id": 7498, "synset": "emulsion.n.02", "name": "emulsion"}, - {"id": 7499, "synset": "enamel.n.04", "name": "enamel"}, - {"id": 7500, "synset": "enamel.n.03", "name": "enamel"}, - {"id": 7501, "synset": "enamelware.n.01", "name": "enamelware"}, - {"id": 7502, "synset": "encaustic.n.01", "name": "encaustic"}, - {"id": 7503, "synset": "encephalogram.n.02", "name": "encephalogram"}, - {"id": 7504, "synset": "enclosure.n.01", "name": "enclosure"}, - {"id": 7505, "synset": "endoscope.n.01", "name": "endoscope"}, - {"id": 7506, "synset": "energizer.n.02", "name": "energizer"}, - {"id": 7507, "synset": "engine.n.01", "name": "engine"}, - {"id": 7508, "synset": "engine.n.04", "name": "engine"}, - {"id": 7509, "synset": "engineering.n.03", "name": "engineering"}, - {"id": 7510, "synset": "enginery.n.01", "name": "enginery"}, - {"id": 7511, "synset": "english_horn.n.01", "name": "English_horn"}, - {"id": 7512, "synset": "english_saddle.n.01", "name": "English_saddle"}, - {"id": 7513, "synset": "enlarger.n.01", "name": "enlarger"}, - {"id": 7514, "synset": "ensemble.n.05", "name": "ensemble"}, - {"id": 7515, "synset": "ensign.n.03", "name": "ensign"}, - {"id": 7516, "synset": "entablature.n.01", "name": "entablature"}, - {"id": 7517, "synset": "entertainment_center.n.01", "name": "entertainment_center"}, - {"id": 7518, "synset": "entrenching_tool.n.01", "name": "entrenching_tool"}, - {"id": 7519, "synset": "entrenchment.n.01", "name": "entrenchment"}, - {"id": 7520, "synset": "envelope.n.02", "name": "envelope"}, - {"id": 7521, "synset": "envelope.n.06", "name": "envelope"}, - {"id": 7522, "synset": "eolith.n.01", "name": "eolith"}, - {"id": 7523, "synset": "epauliere.n.01", "name": "epauliere"}, - {"id": 7524, "synset": "epee.n.01", "name": "epee"}, - {"id": 7525, "synset": "epergne.n.01", "name": "epergne"}, - {"id": 7526, "synset": "epicyclic_train.n.01", "name": "epicyclic_train"}, - {"id": 7527, "synset": "epidiascope.n.01", "name": "epidiascope"}, - {"id": 7528, "synset": "epilating_wax.n.01", "name": "epilating_wax"}, - {"id": 7529, "synset": "equalizer.n.01", "name": "equalizer"}, - {"id": 7530, "synset": "equatorial.n.01", "name": "equatorial"}, - {"id": 7531, "synset": "equipment.n.01", "name": "equipment"}, - { - "id": 7532, - "synset": "erasable_programmable_read-only_memory.n.01", - "name": "erasable_programmable_read-only_memory", - }, - {"id": 7533, "synset": "erecting_prism.n.01", "name": "erecting_prism"}, - {"id": 7534, "synset": "erection.n.02", "name": "erection"}, - {"id": 7535, "synset": "erlenmeyer_flask.n.01", "name": "Erlenmeyer_flask"}, - {"id": 7536, "synset": "escape_hatch.n.01", "name": "escape_hatch"}, - {"id": 7537, "synset": "escapement.n.01", "name": "escapement"}, - {"id": 7538, "synset": "escape_wheel.n.01", "name": "escape_wheel"}, - {"id": 7539, "synset": "escarpment.n.02", "name": "escarpment"}, - {"id": 7540, "synset": "escutcheon.n.03", "name": "escutcheon"}, - {"id": 7541, "synset": "esophagoscope.n.01", "name": "esophagoscope"}, - {"id": 7542, "synset": "espadrille.n.01", "name": "espadrille"}, - {"id": 7543, "synset": "espalier.n.01", "name": "espalier"}, - {"id": 7544, "synset": "espresso_maker.n.01", "name": "espresso_maker"}, - {"id": 7545, "synset": "espresso_shop.n.01", "name": "espresso_shop"}, - {"id": 7546, "synset": "establishment.n.04", "name": "establishment"}, - {"id": 7547, "synset": "estaminet.n.01", "name": "estaminet"}, - {"id": 7548, "synset": "estradiol_patch.n.01", "name": "estradiol_patch"}, - {"id": 7549, "synset": "etagere.n.01", "name": "etagere"}, - {"id": 7550, "synset": "etamine.n.01", "name": "etamine"}, - {"id": 7551, "synset": "etching.n.02", "name": "etching"}, - {"id": 7552, "synset": "ethernet.n.01", "name": "ethernet"}, - {"id": 7553, "synset": "ethernet_cable.n.01", "name": "ethernet_cable"}, - {"id": 7554, "synset": "eton_jacket.n.01", "name": "Eton_jacket"}, - {"id": 7555, "synset": "etui.n.01", "name": "etui"}, - {"id": 7556, "synset": "eudiometer.n.01", "name": "eudiometer"}, - {"id": 7557, "synset": "euphonium.n.01", "name": "euphonium"}, - {"id": 7558, "synset": "evaporative_cooler.n.01", "name": "evaporative_cooler"}, - {"id": 7559, "synset": "evening_bag.n.01", "name": "evening_bag"}, - {"id": 7560, "synset": "exercise_bike.n.01", "name": "exercise_bike"}, - {"id": 7561, "synset": "exercise_device.n.01", "name": "exercise_device"}, - {"id": 7562, "synset": "exhaust.n.02", "name": "exhaust"}, - {"id": 7563, "synset": "exhaust_fan.n.01", "name": "exhaust_fan"}, - {"id": 7564, "synset": "exhaust_valve.n.01", "name": "exhaust_valve"}, - {"id": 7565, "synset": "exhibition_hall.n.01", "name": "exhibition_hall"}, - {"id": 7566, "synset": "exocet.n.01", "name": "Exocet"}, - {"id": 7567, "synset": "expansion_bit.n.01", "name": "expansion_bit"}, - {"id": 7568, "synset": "expansion_bolt.n.01", "name": "expansion_bolt"}, - {"id": 7569, "synset": "explosive_detection_system.n.01", "name": "explosive_detection_system"}, - {"id": 7570, "synset": "explosive_device.n.01", "name": "explosive_device"}, - {"id": 7571, "synset": "explosive_trace_detection.n.01", "name": "explosive_trace_detection"}, - {"id": 7572, "synset": "express.n.02", "name": "express"}, - {"id": 7573, "synset": "extension.n.10", "name": "extension"}, - {"id": 7574, "synset": "extension_cord.n.01", "name": "extension_cord"}, - {"id": 7575, "synset": "external-combustion_engine.n.01", "name": "external-combustion_engine"}, - {"id": 7576, "synset": "external_drive.n.01", "name": "external_drive"}, - {"id": 7577, "synset": "extractor.n.01", "name": "extractor"}, - {"id": 7578, "synset": "eyebrow_pencil.n.01", "name": "eyebrow_pencil"}, - {"id": 7579, "synset": "eyecup.n.01", "name": "eyecup"}, - {"id": 7580, "synset": "eyeliner.n.01", "name": "eyeliner"}, - {"id": 7581, "synset": "eyepiece.n.01", "name": "eyepiece"}, - {"id": 7582, "synset": "eyeshadow.n.01", "name": "eyeshadow"}, - {"id": 7583, "synset": "fabric.n.01", "name": "fabric"}, - {"id": 7584, "synset": "facade.n.01", "name": "facade"}, - {"id": 7585, "synset": "face_guard.n.01", "name": "face_guard"}, - {"id": 7586, "synset": "face_mask.n.01", "name": "face_mask"}, - {"id": 7587, "synset": "faceplate.n.01", "name": "faceplate"}, - {"id": 7588, "synset": "face_powder.n.01", "name": "face_powder"}, - {"id": 7589, "synset": "face_veil.n.01", "name": "face_veil"}, - {"id": 7590, "synset": "facing.n.03", "name": "facing"}, - {"id": 7591, "synset": "facing.n.01", "name": "facing"}, - {"id": 7592, "synset": "facing.n.02", "name": "facing"}, - {"id": 7593, "synset": "facsimile.n.02", "name": "facsimile"}, - {"id": 7594, "synset": "factory.n.01", "name": "factory"}, - {"id": 7595, "synset": "factory_ship.n.01", "name": "factory_ship"}, - {"id": 7596, "synset": "fagot.n.02", "name": "fagot"}, - {"id": 7597, "synset": "fagot_stitch.n.01", "name": "fagot_stitch"}, - {"id": 7598, "synset": "fahrenheit_thermometer.n.01", "name": "Fahrenheit_thermometer"}, - {"id": 7599, "synset": "faience.n.01", "name": "faience"}, - {"id": 7600, "synset": "faille.n.01", "name": "faille"}, - {"id": 7601, "synset": "fairlead.n.01", "name": "fairlead"}, - {"id": 7602, "synset": "fairy_light.n.01", "name": "fairy_light"}, - {"id": 7603, "synset": "falchion.n.01", "name": "falchion"}, - {"id": 7604, "synset": "fallboard.n.01", "name": "fallboard"}, - {"id": 7605, "synset": "fallout_shelter.n.01", "name": "fallout_shelter"}, - {"id": 7606, "synset": "false_face.n.01", "name": "false_face"}, - {"id": 7607, "synset": "false_teeth.n.01", "name": "false_teeth"}, - {"id": 7608, "synset": "family_room.n.01", "name": "family_room"}, - {"id": 7609, "synset": "fan_belt.n.01", "name": "fan_belt"}, - {"id": 7610, "synset": "fan_blade.n.01", "name": "fan_blade"}, - {"id": 7611, "synset": "fancy_dress.n.01", "name": "fancy_dress"}, - {"id": 7612, "synset": "fanion.n.01", "name": "fanion"}, - {"id": 7613, "synset": "fanlight.n.03", "name": "fanlight"}, - {"id": 7614, "synset": "fanjet.n.02", "name": "fanjet"}, - {"id": 7615, "synset": "fanjet.n.01", "name": "fanjet"}, - {"id": 7616, "synset": "fanny_pack.n.01", "name": "fanny_pack"}, - {"id": 7617, "synset": "fan_tracery.n.01", "name": "fan_tracery"}, - {"id": 7618, "synset": "fan_vaulting.n.01", "name": "fan_vaulting"}, - {"id": 7619, "synset": "farm_building.n.01", "name": "farm_building"}, - {"id": 7620, "synset": "farmer's_market.n.01", "name": "farmer's_market"}, - {"id": 7621, "synset": "farmhouse.n.01", "name": "farmhouse"}, - {"id": 7622, "synset": "farm_machine.n.01", "name": "farm_machine"}, - {"id": 7623, "synset": "farmplace.n.01", "name": "farmplace"}, - {"id": 7624, "synset": "farmyard.n.01", "name": "farmyard"}, - {"id": 7625, "synset": "farthingale.n.01", "name": "farthingale"}, - {"id": 7626, "synset": "fastener.n.02", "name": "fastener"}, - {"id": 7627, "synset": "fast_reactor.n.01", "name": "fast_reactor"}, - {"id": 7628, "synset": "fat_farm.n.01", "name": "fat_farm"}, - {"id": 7629, "synset": "fatigues.n.01", "name": "fatigues"}, - {"id": 7630, "synset": "fauld.n.01", "name": "fauld"}, - {"id": 7631, "synset": "fauteuil.n.01", "name": "fauteuil"}, - {"id": 7632, "synset": "feather_boa.n.01", "name": "feather_boa"}, - {"id": 7633, "synset": "featheredge.n.01", "name": "featheredge"}, - {"id": 7634, "synset": "feedback_circuit.n.01", "name": "feedback_circuit"}, - {"id": 7635, "synset": "feedlot.n.01", "name": "feedlot"}, - {"id": 7636, "synset": "fell.n.02", "name": "fell"}, - {"id": 7637, "synset": "felloe.n.01", "name": "felloe"}, - {"id": 7638, "synset": "felt.n.01", "name": "felt"}, - {"id": 7639, "synset": "felt-tip_pen.n.01", "name": "felt-tip_pen"}, - {"id": 7640, "synset": "felucca.n.01", "name": "felucca"}, - {"id": 7641, "synset": "fence.n.01", "name": "fence"}, - {"id": 7642, "synset": "fencing_mask.n.01", "name": "fencing_mask"}, - {"id": 7643, "synset": "fencing_sword.n.01", "name": "fencing_sword"}, - {"id": 7644, "synset": "fender.n.01", "name": "fender"}, - {"id": 7645, "synset": "fender.n.02", "name": "fender"}, - {"id": 7646, "synset": "ferrule.n.01", "name": "ferrule"}, - {"id": 7647, "synset": "ferule.n.01", "name": "ferule"}, - {"id": 7648, "synset": "festoon.n.01", "name": "festoon"}, - {"id": 7649, "synset": "fetoscope.n.01", "name": "fetoscope"}, - {"id": 7650, "synset": "fetter.n.01", "name": "fetter"}, - {"id": 7651, "synset": "fez.n.02", "name": "fez"}, - {"id": 7652, "synset": "fiber.n.05", "name": "fiber"}, - {"id": 7653, "synset": "fiber_optic_cable.n.01", "name": "fiber_optic_cable"}, - {"id": 7654, "synset": "fiberscope.n.01", "name": "fiberscope"}, - {"id": 7655, "synset": "fichu.n.01", "name": "fichu"}, - {"id": 7656, "synset": "fiddlestick.n.01", "name": "fiddlestick"}, - {"id": 7657, "synset": "field_artillery.n.01", "name": "field_artillery"}, - {"id": 7658, "synset": "field_coil.n.01", "name": "field_coil"}, - {"id": 7659, "synset": "field-effect_transistor.n.01", "name": "field-effect_transistor"}, - {"id": 7660, "synset": "field-emission_microscope.n.01", "name": "field-emission_microscope"}, - {"id": 7661, "synset": "field_glass.n.01", "name": "field_glass"}, - {"id": 7662, "synset": "field_hockey_ball.n.01", "name": "field_hockey_ball"}, - {"id": 7663, "synset": "field_hospital.n.01", "name": "field_hospital"}, - {"id": 7664, "synset": "field_house.n.01", "name": "field_house"}, - {"id": 7665, "synset": "field_lens.n.01", "name": "field_lens"}, - {"id": 7666, "synset": "field_magnet.n.01", "name": "field_magnet"}, - { - "id": 7667, - "synset": "field-sequential_color_television.n.01", - "name": "field-sequential_color_television", - }, - {"id": 7668, "synset": "field_tent.n.01", "name": "field_tent"}, - {"id": 7669, "synset": "fieldwork.n.01", "name": "fieldwork"}, - {"id": 7670, "synset": "fife.n.01", "name": "fife"}, - {"id": 7671, "synset": "fifth_wheel.n.02", "name": "fifth_wheel"}, - {"id": 7672, "synset": "fighting_chair.n.01", "name": "fighting_chair"}, - {"id": 7673, "synset": "fig_leaf.n.02", "name": "fig_leaf"}, - {"id": 7674, "synset": "figure_eight.n.01", "name": "figure_eight"}, - {"id": 7675, "synset": "figure_loom.n.01", "name": "figure_loom"}, - {"id": 7676, "synset": "figure_skate.n.01", "name": "figure_skate"}, - {"id": 7677, "synset": "filament.n.04", "name": "filament"}, - {"id": 7678, "synset": "filature.n.01", "name": "filature"}, - {"id": 7679, "synset": "file_folder.n.01", "name": "file_folder"}, - {"id": 7680, "synset": "file_server.n.01", "name": "file_server"}, - {"id": 7681, "synset": "filigree.n.01", "name": "filigree"}, - {"id": 7682, "synset": "filling.n.05", "name": "filling"}, - {"id": 7683, "synset": "film.n.03", "name": "film"}, - {"id": 7684, "synset": "film.n.05", "name": "film"}, - {"id": 7685, "synset": "film_advance.n.01", "name": "film_advance"}, - {"id": 7686, "synset": "filter.n.01", "name": "filter"}, - {"id": 7687, "synset": "filter.n.02", "name": "filter"}, - {"id": 7688, "synset": "finder.n.03", "name": "finder"}, - {"id": 7689, "synset": "finery.n.01", "name": "finery"}, - {"id": 7690, "synset": "fine-tooth_comb.n.01", "name": "fine-tooth_comb"}, - {"id": 7691, "synset": "finger.n.03", "name": "finger"}, - {"id": 7692, "synset": "fingerboard.n.03", "name": "fingerboard"}, - {"id": 7693, "synset": "finger_bowl.n.01", "name": "finger_bowl"}, - {"id": 7694, "synset": "finger_paint.n.01", "name": "finger_paint"}, - {"id": 7695, "synset": "finger-painting.n.01", "name": "finger-painting"}, - {"id": 7696, "synset": "finger_plate.n.01", "name": "finger_plate"}, - {"id": 7697, "synset": "fingerstall.n.01", "name": "fingerstall"}, - {"id": 7698, "synset": "finish_coat.n.02", "name": "finish_coat"}, - {"id": 7699, "synset": "finish_coat.n.01", "name": "finish_coat"}, - {"id": 7700, "synset": "finisher.n.05", "name": "finisher"}, - {"id": 7701, "synset": "fin_keel.n.01", "name": "fin_keel"}, - {"id": 7702, "synset": "fipple.n.01", "name": "fipple"}, - {"id": 7703, "synset": "fipple_flute.n.01", "name": "fipple_flute"}, - {"id": 7704, "synset": "fire.n.04", "name": "fire"}, - {"id": 7705, "synset": "firearm.n.01", "name": "firearm"}, - {"id": 7706, "synset": "fire_bell.n.01", "name": "fire_bell"}, - {"id": 7707, "synset": "fireboat.n.01", "name": "fireboat"}, - {"id": 7708, "synset": "firebox.n.01", "name": "firebox"}, - {"id": 7709, "synset": "firebrick.n.01", "name": "firebrick"}, - {"id": 7710, "synset": "fire_control_radar.n.01", "name": "fire_control_radar"}, - {"id": 7711, "synset": "fire_control_system.n.01", "name": "fire_control_system"}, - {"id": 7712, "synset": "fire_iron.n.01", "name": "fire_iron"}, - {"id": 7713, "synset": "fireman's_ax.n.01", "name": "fireman's_ax"}, - {"id": 7714, "synset": "fire_screen.n.01", "name": "fire_screen"}, - {"id": 7715, "synset": "fire_tongs.n.01", "name": "fire_tongs"}, - {"id": 7716, "synset": "fire_tower.n.01", "name": "fire_tower"}, - {"id": 7717, "synset": "firewall.n.02", "name": "firewall"}, - {"id": 7718, "synset": "firing_chamber.n.01", "name": "firing_chamber"}, - {"id": 7719, "synset": "firing_pin.n.01", "name": "firing_pin"}, - {"id": 7720, "synset": "firkin.n.02", "name": "firkin"}, - {"id": 7721, "synset": "firmer_chisel.n.01", "name": "firmer_chisel"}, - {"id": 7722, "synset": "first-aid_station.n.01", "name": "first-aid_station"}, - {"id": 7723, "synset": "first_base.n.01", "name": "first_base"}, - {"id": 7724, "synset": "first_class.n.03", "name": "first_class"}, - {"id": 7725, "synset": "fisherman's_bend.n.01", "name": "fisherman's_bend"}, - {"id": 7726, "synset": "fisherman's_knot.n.01", "name": "fisherman's_knot"}, - {"id": 7727, "synset": "fisherman's_lure.n.01", "name": "fisherman's_lure"}, - {"id": 7728, "synset": "fishhook.n.01", "name": "fishhook"}, - {"id": 7729, "synset": "fishing_boat.n.01", "name": "fishing_boat"}, - {"id": 7730, "synset": "fishing_gear.n.01", "name": "fishing_gear"}, - {"id": 7731, "synset": "fish_joint.n.01", "name": "fish_joint"}, - {"id": 7732, "synset": "fish_knife.n.01", "name": "fish_knife"}, - {"id": 7733, "synset": "fishnet.n.01", "name": "fishnet"}, - {"id": 7734, "synset": "fish_slice.n.01", "name": "fish_slice"}, - {"id": 7735, "synset": "fitment.n.01", "name": "fitment"}, - {"id": 7736, "synset": "fixative.n.02", "name": "fixative"}, - {"id": 7737, "synset": "fixer-upper.n.01", "name": "fixer-upper"}, - {"id": 7738, "synset": "flageolet.n.02", "name": "flageolet"}, - {"id": 7739, "synset": "flagon.n.01", "name": "flagon"}, - {"id": 7740, "synset": "flagship.n.02", "name": "flagship"}, - {"id": 7741, "synset": "flail.n.01", "name": "flail"}, - {"id": 7742, "synset": "flambeau.n.01", "name": "flambeau"}, - {"id": 7743, "synset": "flamethrower.n.01", "name": "flamethrower"}, - {"id": 7744, "synset": "flange.n.01", "name": "flange"}, - {"id": 7745, "synset": "flannel.n.03", "name": "flannel"}, - {"id": 7746, "synset": "flannelette.n.01", "name": "flannelette"}, - {"id": 7747, "synset": "flap.n.05", "name": "flap"}, - {"id": 7748, "synset": "flash.n.09", "name": "flash"}, - {"id": 7749, "synset": "flash_camera.n.01", "name": "flash_camera"}, - {"id": 7750, "synset": "flasher.n.02", "name": "flasher"}, - {"id": 7751, "synset": "flashlight_battery.n.01", "name": "flashlight_battery"}, - {"id": 7752, "synset": "flash_memory.n.01", "name": "flash_memory"}, - {"id": 7753, "synset": "flask.n.01", "name": "flask"}, - {"id": 7754, "synset": "flat_arch.n.01", "name": "flat_arch"}, - {"id": 7755, "synset": "flatbed.n.02", "name": "flatbed"}, - {"id": 7756, "synset": "flatbed_press.n.01", "name": "flatbed_press"}, - {"id": 7757, "synset": "flat_bench.n.01", "name": "flat_bench"}, - {"id": 7758, "synset": "flatcar.n.01", "name": "flatcar"}, - {"id": 7759, "synset": "flat_file.n.01", "name": "flat_file"}, - {"id": 7760, "synset": "flatlet.n.01", "name": "flatlet"}, - {"id": 7761, "synset": "flat_panel_display.n.01", "name": "flat_panel_display"}, - {"id": 7762, "synset": "flats.n.01", "name": "flats"}, - {"id": 7763, "synset": "flat_tip_screwdriver.n.01", "name": "flat_tip_screwdriver"}, - { - "id": 7764, - "synset": "fleet_ballistic_missile_submarine.n.01", - "name": "fleet_ballistic_missile_submarine", - }, - {"id": 7765, "synset": "fleur-de-lis.n.02", "name": "fleur-de-lis"}, - {"id": 7766, "synset": "flight_simulator.n.01", "name": "flight_simulator"}, - {"id": 7767, "synset": "flintlock.n.02", "name": "flintlock"}, - {"id": 7768, "synset": "flintlock.n.01", "name": "flintlock"}, - {"id": 7769, "synset": "float.n.05", "name": "float"}, - {"id": 7770, "synset": "floating_dock.n.01", "name": "floating_dock"}, - {"id": 7771, "synset": "floatplane.n.01", "name": "floatplane"}, - {"id": 7772, "synset": "flood.n.03", "name": "flood"}, - {"id": 7773, "synset": "floor.n.01", "name": "floor"}, - {"id": 7774, "synset": "floor.n.02", "name": "floor"}, - {"id": 7775, "synset": "floor.n.09", "name": "floor"}, - {"id": 7776, "synset": "floorboard.n.02", "name": "floorboard"}, - {"id": 7777, "synset": "floor_cover.n.01", "name": "floor_cover"}, - {"id": 7778, "synset": "floor_joist.n.01", "name": "floor_joist"}, - {"id": 7779, "synset": "floor_lamp.n.01", "name": "floor_lamp"}, - {"id": 7780, "synset": "flophouse.n.01", "name": "flophouse"}, - {"id": 7781, "synset": "florist.n.02", "name": "florist"}, - {"id": 7782, "synset": "floss.n.01", "name": "floss"}, - {"id": 7783, "synset": "flotsam.n.01", "name": "flotsam"}, - {"id": 7784, "synset": "flour_bin.n.01", "name": "flour_bin"}, - {"id": 7785, "synset": "flour_mill.n.01", "name": "flour_mill"}, - {"id": 7786, "synset": "flowerbed.n.01", "name": "flowerbed"}, - {"id": 7787, "synset": "flugelhorn.n.01", "name": "flugelhorn"}, - {"id": 7788, "synset": "fluid_drive.n.01", "name": "fluid_drive"}, - {"id": 7789, "synset": "fluid_flywheel.n.01", "name": "fluid_flywheel"}, - {"id": 7790, "synset": "flume.n.02", "name": "flume"}, - {"id": 7791, "synset": "fluorescent_lamp.n.01", "name": "fluorescent_lamp"}, - {"id": 7792, "synset": "fluoroscope.n.01", "name": "fluoroscope"}, - {"id": 7793, "synset": "flush_toilet.n.01", "name": "flush_toilet"}, - {"id": 7794, "synset": "flute.n.01", "name": "flute"}, - {"id": 7795, "synset": "flux_applicator.n.01", "name": "flux_applicator"}, - {"id": 7796, "synset": "fluxmeter.n.01", "name": "fluxmeter"}, - {"id": 7797, "synset": "fly.n.05", "name": "fly"}, - {"id": 7798, "synset": "flying_boat.n.01", "name": "flying_boat"}, - {"id": 7799, "synset": "flying_buttress.n.01", "name": "flying_buttress"}, - {"id": 7800, "synset": "flying_carpet.n.01", "name": "flying_carpet"}, - {"id": 7801, "synset": "flying_jib.n.01", "name": "flying_jib"}, - {"id": 7802, "synset": "fly_rod.n.01", "name": "fly_rod"}, - {"id": 7803, "synset": "fly_tent.n.01", "name": "fly_tent"}, - {"id": 7804, "synset": "flytrap.n.01", "name": "flytrap"}, - {"id": 7805, "synset": "flywheel.n.01", "name": "flywheel"}, - {"id": 7806, "synset": "fob.n.03", "name": "fob"}, - {"id": 7807, "synset": "foghorn.n.02", "name": "foghorn"}, - {"id": 7808, "synset": "foglamp.n.01", "name": "foglamp"}, - {"id": 7809, "synset": "foil.n.05", "name": "foil"}, - {"id": 7810, "synset": "fold.n.06", "name": "fold"}, - {"id": 7811, "synset": "folder.n.02", "name": "folder"}, - {"id": 7812, "synset": "folding_door.n.01", "name": "folding_door"}, - {"id": 7813, "synset": "folding_saw.n.01", "name": "folding_saw"}, - {"id": 7814, "synset": "food_court.n.01", "name": "food_court"}, - {"id": 7815, "synset": "food_hamper.n.01", "name": "food_hamper"}, - {"id": 7816, "synset": "foot.n.11", "name": "foot"}, - {"id": 7817, "synset": "footage.n.01", "name": "footage"}, - {"id": 7818, "synset": "football_stadium.n.01", "name": "football_stadium"}, - {"id": 7819, "synset": "footbath.n.01", "name": "footbath"}, - {"id": 7820, "synset": "foot_brake.n.01", "name": "foot_brake"}, - {"id": 7821, "synset": "footbridge.n.01", "name": "footbridge"}, - {"id": 7822, "synset": "foothold.n.02", "name": "foothold"}, - {"id": 7823, "synset": "footlocker.n.01", "name": "footlocker"}, - {"id": 7824, "synset": "foot_rule.n.01", "name": "foot_rule"}, - {"id": 7825, "synset": "footwear.n.02", "name": "footwear"}, - {"id": 7826, "synset": "footwear.n.01", "name": "footwear"}, - {"id": 7827, "synset": "forceps.n.01", "name": "forceps"}, - {"id": 7828, "synset": "force_pump.n.01", "name": "force_pump"}, - {"id": 7829, "synset": "fore-and-after.n.01", "name": "fore-and-after"}, - {"id": 7830, "synset": "fore-and-aft_sail.n.01", "name": "fore-and-aft_sail"}, - {"id": 7831, "synset": "forecastle.n.01", "name": "forecastle"}, - {"id": 7832, "synset": "forecourt.n.01", "name": "forecourt"}, - {"id": 7833, "synset": "foredeck.n.01", "name": "foredeck"}, - {"id": 7834, "synset": "fore_edge.n.01", "name": "fore_edge"}, - {"id": 7835, "synset": "foreground.n.02", "name": "foreground"}, - {"id": 7836, "synset": "foremast.n.01", "name": "foremast"}, - {"id": 7837, "synset": "fore_plane.n.01", "name": "fore_plane"}, - {"id": 7838, "synset": "foresail.n.01", "name": "foresail"}, - {"id": 7839, "synset": "forestay.n.01", "name": "forestay"}, - {"id": 7840, "synset": "foretop.n.01", "name": "foretop"}, - {"id": 7841, "synset": "fore-topmast.n.01", "name": "fore-topmast"}, - {"id": 7842, "synset": "fore-topsail.n.01", "name": "fore-topsail"}, - {"id": 7843, "synset": "forge.n.01", "name": "forge"}, - {"id": 7844, "synset": "fork.n.04", "name": "fork"}, - {"id": 7845, "synset": "formalwear.n.01", "name": "formalwear"}, - {"id": 7846, "synset": "formica.n.01", "name": "Formica"}, - {"id": 7847, "synset": "fortification.n.01", "name": "fortification"}, - {"id": 7848, "synset": "fortress.n.01", "name": "fortress"}, - {"id": 7849, "synset": "forty-five.n.01", "name": "forty-five"}, - {"id": 7850, "synset": "foucault_pendulum.n.01", "name": "Foucault_pendulum"}, - {"id": 7851, "synset": "foulard.n.01", "name": "foulard"}, - {"id": 7852, "synset": "foul-weather_gear.n.01", "name": "foul-weather_gear"}, - {"id": 7853, "synset": "foundation_garment.n.01", "name": "foundation_garment"}, - {"id": 7854, "synset": "foundry.n.01", "name": "foundry"}, - {"id": 7855, "synset": "fountain.n.01", "name": "fountain"}, - {"id": 7856, "synset": "fountain_pen.n.01", "name": "fountain_pen"}, - {"id": 7857, "synset": "four-in-hand.n.01", "name": "four-in-hand"}, - {"id": 7858, "synset": "four-poster.n.01", "name": "four-poster"}, - {"id": 7859, "synset": "four-pounder.n.01", "name": "four-pounder"}, - {"id": 7860, "synset": "four-stroke_engine.n.01", "name": "four-stroke_engine"}, - {"id": 7861, "synset": "four-wheel_drive.n.02", "name": "four-wheel_drive"}, - {"id": 7862, "synset": "four-wheel_drive.n.01", "name": "four-wheel_drive"}, - {"id": 7863, "synset": "four-wheeler.n.01", "name": "four-wheeler"}, - {"id": 7864, "synset": "fowling_piece.n.01", "name": "fowling_piece"}, - {"id": 7865, "synset": "foxhole.n.01", "name": "foxhole"}, - {"id": 7866, "synset": "fragmentation_bomb.n.01", "name": "fragmentation_bomb"}, - {"id": 7867, "synset": "frail.n.02", "name": "frail"}, - {"id": 7868, "synset": "fraise.n.02", "name": "fraise"}, - {"id": 7869, "synset": "frame.n.10", "name": "frame"}, - {"id": 7870, "synset": "frame.n.01", "name": "frame"}, - {"id": 7871, "synset": "frame_buffer.n.01", "name": "frame_buffer"}, - {"id": 7872, "synset": "framework.n.03", "name": "framework"}, - {"id": 7873, "synset": "francis_turbine.n.01", "name": "Francis_turbine"}, - {"id": 7874, "synset": "franking_machine.n.01", "name": "franking_machine"}, - {"id": 7875, "synset": "free_house.n.01", "name": "free_house"}, - {"id": 7876, "synset": "free-reed.n.01", "name": "free-reed"}, - {"id": 7877, "synset": "free-reed_instrument.n.01", "name": "free-reed_instrument"}, - {"id": 7878, "synset": "freewheel.n.01", "name": "freewheel"}, - {"id": 7879, "synset": "freight_elevator.n.01", "name": "freight_elevator"}, - {"id": 7880, "synset": "freight_liner.n.01", "name": "freight_liner"}, - {"id": 7881, "synset": "freight_train.n.01", "name": "freight_train"}, - {"id": 7882, "synset": "french_door.n.01", "name": "French_door"}, - {"id": 7883, "synset": "french_horn.n.01", "name": "French_horn"}, - {"id": 7884, "synset": "french_polish.n.02", "name": "French_polish"}, - {"id": 7885, "synset": "french_roof.n.01", "name": "French_roof"}, - {"id": 7886, "synset": "french_window.n.01", "name": "French_window"}, - {"id": 7887, "synset": "fresnel_lens.n.01", "name": "Fresnel_lens"}, - {"id": 7888, "synset": "fret.n.04", "name": "fret"}, - {"id": 7889, "synset": "friary.n.01", "name": "friary"}, - {"id": 7890, "synset": "friction_clutch.n.01", "name": "friction_clutch"}, - {"id": 7891, "synset": "frieze.n.02", "name": "frieze"}, - {"id": 7892, "synset": "frieze.n.01", "name": "frieze"}, - {"id": 7893, "synset": "frigate.n.02", "name": "frigate"}, - {"id": 7894, "synset": "frigate.n.01", "name": "frigate"}, - {"id": 7895, "synset": "frill.n.03", "name": "frill"}, - {"id": 7896, "synset": "frock.n.01", "name": "frock"}, - {"id": 7897, "synset": "frock_coat.n.01", "name": "frock_coat"}, - {"id": 7898, "synset": "frontlet.n.01", "name": "frontlet"}, - {"id": 7899, "synset": "front_porch.n.01", "name": "front_porch"}, - {"id": 7900, "synset": "front_projector.n.01", "name": "front_projector"}, - {"id": 7901, "synset": "fruit_machine.n.01", "name": "fruit_machine"}, - {"id": 7902, "synset": "fuel_filter.n.01", "name": "fuel_filter"}, - {"id": 7903, "synset": "fuel_gauge.n.01", "name": "fuel_gauge"}, - {"id": 7904, "synset": "fuel_injection.n.01", "name": "fuel_injection"}, - {"id": 7905, "synset": "fuel_system.n.01", "name": "fuel_system"}, - {"id": 7906, "synset": "full-dress_uniform.n.01", "name": "full-dress_uniform"}, - {"id": 7907, "synset": "full_metal_jacket.n.01", "name": "full_metal_jacket"}, - {"id": 7908, "synset": "full_skirt.n.01", "name": "full_skirt"}, - {"id": 7909, "synset": "fumigator.n.02", "name": "fumigator"}, - {"id": 7910, "synset": "funeral_home.n.01", "name": "funeral_home"}, - {"id": 7911, "synset": "funny_wagon.n.01", "name": "funny_wagon"}, - {"id": 7912, "synset": "fur.n.03", "name": "fur"}, - {"id": 7913, "synset": "fur_coat.n.01", "name": "fur_coat"}, - {"id": 7914, "synset": "fur_hat.n.01", "name": "fur_hat"}, - {"id": 7915, "synset": "furnace.n.01", "name": "furnace"}, - {"id": 7916, "synset": "furnace_lining.n.01", "name": "furnace_lining"}, - {"id": 7917, "synset": "furnace_room.n.01", "name": "furnace_room"}, - {"id": 7918, "synset": "furnishing.n.02", "name": "furnishing"}, - {"id": 7919, "synset": "furnishing.n.01", "name": "furnishing"}, - {"id": 7920, "synset": "furniture.n.01", "name": "furniture"}, - {"id": 7921, "synset": "fur-piece.n.01", "name": "fur-piece"}, - {"id": 7922, "synset": "furrow.n.01", "name": "furrow"}, - {"id": 7923, "synset": "fuse.n.01", "name": "fuse"}, - {"id": 7924, "synset": "fusee_drive.n.01", "name": "fusee_drive"}, - {"id": 7925, "synset": "fuselage.n.01", "name": "fuselage"}, - {"id": 7926, "synset": "fusil.n.01", "name": "fusil"}, - {"id": 7927, "synset": "fustian.n.02", "name": "fustian"}, - {"id": 7928, "synset": "gabardine.n.01", "name": "gabardine"}, - {"id": 7929, "synset": "gable.n.01", "name": "gable"}, - {"id": 7930, "synset": "gable_roof.n.01", "name": "gable_roof"}, - {"id": 7931, "synset": "gadgetry.n.01", "name": "gadgetry"}, - {"id": 7932, "synset": "gaff.n.03", "name": "gaff"}, - {"id": 7933, "synset": "gaff.n.02", "name": "gaff"}, - {"id": 7934, "synset": "gaff.n.01", "name": "gaff"}, - {"id": 7935, "synset": "gaffsail.n.01", "name": "gaffsail"}, - {"id": 7936, "synset": "gaff_topsail.n.01", "name": "gaff_topsail"}, - {"id": 7937, "synset": "gaiter.n.03", "name": "gaiter"}, - {"id": 7938, "synset": "gaiter.n.02", "name": "gaiter"}, - {"id": 7939, "synset": "galilean_telescope.n.01", "name": "Galilean_telescope"}, - {"id": 7940, "synset": "galleon.n.01", "name": "galleon"}, - {"id": 7941, "synset": "gallery.n.04", "name": "gallery"}, - {"id": 7942, "synset": "gallery.n.03", "name": "gallery"}, - {"id": 7943, "synset": "galley.n.04", "name": "galley"}, - {"id": 7944, "synset": "galley.n.03", "name": "galley"}, - {"id": 7945, "synset": "galley.n.02", "name": "galley"}, - {"id": 7946, "synset": "gallows.n.01", "name": "gallows"}, - {"id": 7947, "synset": "gallows_tree.n.01", "name": "gallows_tree"}, - {"id": 7948, "synset": "galvanometer.n.01", "name": "galvanometer"}, - {"id": 7949, "synset": "gambling_house.n.01", "name": "gambling_house"}, - {"id": 7950, "synset": "gambrel.n.01", "name": "gambrel"}, - {"id": 7951, "synset": "game.n.09", "name": "game"}, - {"id": 7952, "synset": "gamebag.n.01", "name": "gamebag"}, - {"id": 7953, "synset": "game_equipment.n.01", "name": "game_equipment"}, - {"id": 7954, "synset": "gaming_table.n.01", "name": "gaming_table"}, - {"id": 7955, "synset": "gamp.n.01", "name": "gamp"}, - {"id": 7956, "synset": "gangplank.n.01", "name": "gangplank"}, - {"id": 7957, "synset": "gangsaw.n.01", "name": "gangsaw"}, - {"id": 7958, "synset": "gangway.n.01", "name": "gangway"}, - {"id": 7959, "synset": "gantlet.n.04", "name": "gantlet"}, - {"id": 7960, "synset": "gantry.n.01", "name": "gantry"}, - {"id": 7961, "synset": "garage.n.01", "name": "garage"}, - {"id": 7962, "synset": "garage.n.02", "name": "garage"}, - {"id": 7963, "synset": "garand_rifle.n.01", "name": "Garand_rifle"}, - {"id": 7964, "synset": "garboard.n.01", "name": "garboard"}, - {"id": 7965, "synset": "garden.n.01", "name": "garden"}, - {"id": 7966, "synset": "garden.n.03", "name": "garden"}, - {"id": 7967, "synset": "garden_rake.n.01", "name": "garden_rake"}, - {"id": 7968, "synset": "garden_spade.n.01", "name": "garden_spade"}, - {"id": 7969, "synset": "garden_tool.n.01", "name": "garden_tool"}, - {"id": 7970, "synset": "garden_trowel.n.01", "name": "garden_trowel"}, - {"id": 7971, "synset": "gargoyle.n.01", "name": "gargoyle"}, - {"id": 7972, "synset": "garibaldi.n.02", "name": "garibaldi"}, - {"id": 7973, "synset": "garlic_press.n.01", "name": "garlic_press"}, - {"id": 7974, "synset": "garment.n.01", "name": "garment"}, - {"id": 7975, "synset": "garment_bag.n.01", "name": "garment_bag"}, - {"id": 7976, "synset": "garrison_cap.n.01", "name": "garrison_cap"}, - {"id": 7977, "synset": "garrote.n.01", "name": "garrote"}, - {"id": 7978, "synset": "garter.n.01", "name": "garter"}, - {"id": 7979, "synset": "garter_belt.n.01", "name": "garter_belt"}, - {"id": 7980, "synset": "garter_stitch.n.01", "name": "garter_stitch"}, - {"id": 7981, "synset": "gas_guzzler.n.01", "name": "gas_guzzler"}, - {"id": 7982, "synset": "gas_shell.n.01", "name": "gas_shell"}, - {"id": 7983, "synset": "gas_bracket.n.01", "name": "gas_bracket"}, - {"id": 7984, "synset": "gas_burner.n.01", "name": "gas_burner"}, - {"id": 7985, "synset": "gas-cooled_reactor.n.01", "name": "gas-cooled_reactor"}, - {"id": 7986, "synset": "gas-discharge_tube.n.01", "name": "gas-discharge_tube"}, - {"id": 7987, "synset": "gas_engine.n.01", "name": "gas_engine"}, - {"id": 7988, "synset": "gas_fixture.n.01", "name": "gas_fixture"}, - {"id": 7989, "synset": "gas_furnace.n.01", "name": "gas_furnace"}, - {"id": 7990, "synset": "gas_gun.n.01", "name": "gas_gun"}, - {"id": 7991, "synset": "gas_heater.n.01", "name": "gas_heater"}, - {"id": 7992, "synset": "gas_holder.n.01", "name": "gas_holder"}, - {"id": 7993, "synset": "gasket.n.01", "name": "gasket"}, - {"id": 7994, "synset": "gas_lamp.n.01", "name": "gas_lamp"}, - {"id": 7995, "synset": "gas_maser.n.01", "name": "gas_maser"}, - {"id": 7996, "synset": "gas_meter.n.01", "name": "gas_meter"}, - {"id": 7997, "synset": "gasoline_engine.n.01", "name": "gasoline_engine"}, - {"id": 7998, "synset": "gasoline_gauge.n.01", "name": "gasoline_gauge"}, - {"id": 7999, "synset": "gas_oven.n.02", "name": "gas_oven"}, - {"id": 8000, "synset": "gas_oven.n.01", "name": "gas_oven"}, - {"id": 8001, "synset": "gas_pump.n.01", "name": "gas_pump"}, - {"id": 8002, "synset": "gas_range.n.01", "name": "gas_range"}, - {"id": 8003, "synset": "gas_ring.n.01", "name": "gas_ring"}, - {"id": 8004, "synset": "gas_tank.n.01", "name": "gas_tank"}, - {"id": 8005, "synset": "gas_thermometer.n.01", "name": "gas_thermometer"}, - {"id": 8006, "synset": "gastroscope.n.01", "name": "gastroscope"}, - {"id": 8007, "synset": "gas_turbine.n.01", "name": "gas_turbine"}, - {"id": 8008, "synset": "gas-turbine_ship.n.01", "name": "gas-turbine_ship"}, - {"id": 8009, "synset": "gat.n.01", "name": "gat"}, - {"id": 8010, "synset": "gate.n.01", "name": "gate"}, - {"id": 8011, "synset": "gatehouse.n.01", "name": "gatehouse"}, - {"id": 8012, "synset": "gateleg_table.n.01", "name": "gateleg_table"}, - {"id": 8013, "synset": "gatepost.n.01", "name": "gatepost"}, - {"id": 8014, "synset": "gathered_skirt.n.01", "name": "gathered_skirt"}, - {"id": 8015, "synset": "gatling_gun.n.01", "name": "Gatling_gun"}, - {"id": 8016, "synset": "gauge.n.01", "name": "gauge"}, - {"id": 8017, "synset": "gauntlet.n.03", "name": "gauntlet"}, - {"id": 8018, "synset": "gauntlet.n.02", "name": "gauntlet"}, - {"id": 8019, "synset": "gauze.n.02", "name": "gauze"}, - {"id": 8020, "synset": "gauze.n.01", "name": "gauze"}, - {"id": 8021, "synset": "gavel.n.01", "name": "gavel"}, - {"id": 8022, "synset": "gazebo.n.01", "name": "gazebo"}, - {"id": 8023, "synset": "gear.n.01", "name": "gear"}, - {"id": 8024, "synset": "gear.n.04", "name": "gear"}, - {"id": 8025, "synset": "gear.n.03", "name": "gear"}, - {"id": 8026, "synset": "gearbox.n.01", "name": "gearbox"}, - {"id": 8027, "synset": "gearing.n.01", "name": "gearing"}, - {"id": 8028, "synset": "gearset.n.01", "name": "gearset"}, - {"id": 8029, "synset": "gearshift.n.01", "name": "gearshift"}, - {"id": 8030, "synset": "geiger_counter.n.01", "name": "Geiger_counter"}, - {"id": 8031, "synset": "geiger_tube.n.01", "name": "Geiger_tube"}, - {"id": 8032, "synset": "gene_chip.n.01", "name": "gene_chip"}, - {"id": 8033, "synset": "general-purpose_bomb.n.01", "name": "general-purpose_bomb"}, - {"id": 8034, "synset": "generator.n.01", "name": "generator"}, - {"id": 8035, "synset": "generator.n.04", "name": "generator"}, - {"id": 8036, "synset": "geneva_gown.n.01", "name": "Geneva_gown"}, - {"id": 8037, "synset": "geodesic_dome.n.01", "name": "geodesic_dome"}, - {"id": 8038, "synset": "georgette.n.01", "name": "georgette"}, - {"id": 8039, "synset": "gharry.n.01", "name": "gharry"}, - {"id": 8040, "synset": "ghat.n.01", "name": "ghat"}, - {"id": 8041, "synset": "ghetto_blaster.n.01", "name": "ghetto_blaster"}, - {"id": 8042, "synset": "gift_shop.n.01", "name": "gift_shop"}, - {"id": 8043, "synset": "gift_wrapping.n.01", "name": "gift_wrapping"}, - {"id": 8044, "synset": "gig.n.05", "name": "gig"}, - {"id": 8045, "synset": "gig.n.04", "name": "gig"}, - {"id": 8046, "synset": "gig.n.01", "name": "gig"}, - {"id": 8047, "synset": "gig.n.03", "name": "gig"}, - {"id": 8048, "synset": "gildhall.n.01", "name": "gildhall"}, - {"id": 8049, "synset": "gill_net.n.01", "name": "gill_net"}, - {"id": 8050, "synset": "gilt.n.01", "name": "gilt"}, - {"id": 8051, "synset": "gimbal.n.01", "name": "gimbal"}, - {"id": 8052, "synset": "gingham.n.01", "name": "gingham"}, - {"id": 8053, "synset": "girandole.n.01", "name": "girandole"}, - {"id": 8054, "synset": "girder.n.01", "name": "girder"}, - {"id": 8055, "synset": "glass.n.07", "name": "glass"}, - {"id": 8056, "synset": "glass_cutter.n.03", "name": "glass_cutter"}, - {"id": 8057, "synset": "glasses_case.n.01", "name": "glasses_case"}, - {"id": 8058, "synset": "glebe_house.n.01", "name": "glebe_house"}, - {"id": 8059, "synset": "glengarry.n.01", "name": "Glengarry"}, - {"id": 8060, "synset": "glider.n.01", "name": "glider"}, - {"id": 8061, "synset": "global_positioning_system.n.01", "name": "Global_Positioning_System"}, - {"id": 8062, "synset": "glockenspiel.n.01", "name": "glockenspiel"}, - {"id": 8063, "synset": "glory_hole.n.01", "name": "glory_hole"}, - {"id": 8064, "synset": "glove_compartment.n.01", "name": "glove_compartment"}, - {"id": 8065, "synset": "glow_lamp.n.01", "name": "glow_lamp"}, - {"id": 8066, "synset": "glow_tube.n.01", "name": "glow_tube"}, - {"id": 8067, "synset": "glyptic_art.n.01", "name": "glyptic_art"}, - {"id": 8068, "synset": "glyptics.n.01", "name": "glyptics"}, - {"id": 8069, "synset": "gnomon.n.01", "name": "gnomon"}, - {"id": 8070, "synset": "goal.n.03", "name": "goal"}, - {"id": 8071, "synset": "goalmouth.n.01", "name": "goalmouth"}, - {"id": 8072, "synset": "goalpost.n.01", "name": "goalpost"}, - {"id": 8073, "synset": "goblet.n.01", "name": "goblet"}, - {"id": 8074, "synset": "godown.n.01", "name": "godown"}, - {"id": 8075, "synset": "go-kart.n.01", "name": "go-kart"}, - {"id": 8076, "synset": "gold_plate.n.02", "name": "gold_plate"}, - {"id": 8077, "synset": "golf_bag.n.01", "name": "golf_bag"}, - {"id": 8078, "synset": "golf_ball.n.01", "name": "golf_ball"}, - {"id": 8079, "synset": "golf-club_head.n.01", "name": "golf-club_head"}, - {"id": 8080, "synset": "golf_equipment.n.01", "name": "golf_equipment"}, - {"id": 8081, "synset": "golf_glove.n.01", "name": "golf_glove"}, - {"id": 8082, "synset": "golliwog.n.01", "name": "golliwog"}, - {"id": 8083, "synset": "gong.n.01", "name": "gong"}, - {"id": 8084, "synset": "goniometer.n.01", "name": "goniometer"}, - {"id": 8085, "synset": "gordian_knot.n.02", "name": "Gordian_knot"}, - {"id": 8086, "synset": "gorget.n.01", "name": "gorget"}, - {"id": 8087, "synset": "gossamer.n.01", "name": "gossamer"}, - {"id": 8088, "synset": "gothic_arch.n.01", "name": "Gothic_arch"}, - {"id": 8089, "synset": "gouache.n.01", "name": "gouache"}, - {"id": 8090, "synset": "gouge.n.02", "name": "gouge"}, - {"id": 8091, "synset": "gourd.n.01", "name": "gourd"}, - {"id": 8092, "synset": "government_building.n.01", "name": "government_building"}, - {"id": 8093, "synset": "government_office.n.01", "name": "government_office"}, - {"id": 8094, "synset": "gown.n.01", "name": "gown"}, - {"id": 8095, "synset": "gown.n.05", "name": "gown"}, - {"id": 8096, "synset": "gown.n.04", "name": "gown"}, - {"id": 8097, "synset": "grab.n.01", "name": "grab"}, - {"id": 8098, "synset": "grab_bag.n.02", "name": "grab_bag"}, - {"id": 8099, "synset": "grab_bar.n.01", "name": "grab_bar"}, - {"id": 8100, "synset": "grace_cup.n.01", "name": "grace_cup"}, - {"id": 8101, "synset": "grade_separation.n.01", "name": "grade_separation"}, - {"id": 8102, "synset": "graduated_cylinder.n.01", "name": "graduated_cylinder"}, - {"id": 8103, "synset": "graffito.n.01", "name": "graffito"}, - {"id": 8104, "synset": "gramophone.n.01", "name": "gramophone"}, - {"id": 8105, "synset": "granary.n.01", "name": "granary"}, - {"id": 8106, "synset": "grandfather_clock.n.01", "name": "grandfather_clock"}, - {"id": 8107, "synset": "grand_piano.n.01", "name": "grand_piano"}, - {"id": 8108, "synset": "graniteware.n.01", "name": "graniteware"}, - {"id": 8109, "synset": "granny_knot.n.01", "name": "granny_knot"}, - {"id": 8110, "synset": "grape_arbor.n.01", "name": "grape_arbor"}, - {"id": 8111, "synset": "grapnel.n.02", "name": "grapnel"}, - {"id": 8112, "synset": "grapnel.n.01", "name": "grapnel"}, - {"id": 8113, "synset": "grass_skirt.n.01", "name": "grass_skirt"}, - {"id": 8114, "synset": "grate.n.01", "name": "grate"}, - {"id": 8115, "synset": "grate.n.03", "name": "grate"}, - {"id": 8116, "synset": "graver.n.01", "name": "graver"}, - {"id": 8117, "synset": "gravimeter.n.02", "name": "gravimeter"}, - {"id": 8118, "synset": "gravure.n.03", "name": "gravure"}, - {"id": 8119, "synset": "grey.n.06", "name": "grey"}, - {"id": 8120, "synset": "grease-gun.n.01", "name": "grease-gun"}, - {"id": 8121, "synset": "greasepaint.n.01", "name": "greasepaint"}, - {"id": 8122, "synset": "greasy_spoon.n.01", "name": "greasy_spoon"}, - {"id": 8123, "synset": "greatcoat.n.01", "name": "greatcoat"}, - {"id": 8124, "synset": "great_hall.n.01", "name": "great_hall"}, - {"id": 8125, "synset": "greave.n.01", "name": "greave"}, - {"id": 8126, "synset": "greengrocery.n.02", "name": "greengrocery"}, - {"id": 8127, "synset": "greenhouse.n.01", "name": "greenhouse"}, - {"id": 8128, "synset": "grenade.n.01", "name": "grenade"}, - {"id": 8129, "synset": "grid.n.05", "name": "grid"}, - {"id": 8130, "synset": "grille.n.02", "name": "grille"}, - {"id": 8131, "synset": "grillroom.n.01", "name": "grillroom"}, - {"id": 8132, "synset": "grinder.n.04", "name": "grinder"}, - {"id": 8133, "synset": "grinding_wheel.n.01", "name": "grinding_wheel"}, - {"id": 8134, "synset": "grindstone.n.01", "name": "grindstone"}, - {"id": 8135, "synset": "gripsack.n.01", "name": "gripsack"}, - {"id": 8136, "synset": "gristmill.n.01", "name": "gristmill"}, - {"id": 8137, "synset": "grocery_store.n.01", "name": "grocery_store"}, - {"id": 8138, "synset": "grogram.n.01", "name": "grogram"}, - {"id": 8139, "synset": "groined_vault.n.01", "name": "groined_vault"}, - {"id": 8140, "synset": "groover.n.01", "name": "groover"}, - {"id": 8141, "synset": "grosgrain.n.01", "name": "grosgrain"}, - {"id": 8142, "synset": "gros_point.n.01", "name": "gros_point"}, - {"id": 8143, "synset": "ground.n.09", "name": "ground"}, - {"id": 8144, "synset": "ground_bait.n.01", "name": "ground_bait"}, - {"id": 8145, "synset": "ground_control.n.01", "name": "ground_control"}, - {"id": 8146, "synset": "ground_floor.n.01", "name": "ground_floor"}, - {"id": 8147, "synset": "groundsheet.n.01", "name": "groundsheet"}, - {"id": 8148, "synset": "g-string.n.01", "name": "G-string"}, - {"id": 8149, "synset": "guard.n.03", "name": "guard"}, - {"id": 8150, "synset": "guard_boat.n.01", "name": "guard_boat"}, - {"id": 8151, "synset": "guardroom.n.02", "name": "guardroom"}, - {"id": 8152, "synset": "guardroom.n.01", "name": "guardroom"}, - {"id": 8153, "synset": "guard_ship.n.01", "name": "guard_ship"}, - {"id": 8154, "synset": "guard's_van.n.01", "name": "guard's_van"}, - {"id": 8155, "synset": "gueridon.n.01", "name": "gueridon"}, - {"id": 8156, "synset": "guarnerius.n.03", "name": "Guarnerius"}, - {"id": 8157, "synset": "guesthouse.n.01", "name": "guesthouse"}, - {"id": 8158, "synset": "guestroom.n.01", "name": "guestroom"}, - {"id": 8159, "synset": "guidance_system.n.01", "name": "guidance_system"}, - {"id": 8160, "synset": "guided_missile.n.01", "name": "guided_missile"}, - {"id": 8161, "synset": "guided_missile_cruiser.n.01", "name": "guided_missile_cruiser"}, - {"id": 8162, "synset": "guided_missile_frigate.n.01", "name": "guided_missile_frigate"}, - {"id": 8163, "synset": "guildhall.n.01", "name": "guildhall"}, - {"id": 8164, "synset": "guilloche.n.01", "name": "guilloche"}, - {"id": 8165, "synset": "guillotine.n.02", "name": "guillotine"}, - {"id": 8166, "synset": "guimpe.n.02", "name": "guimpe"}, - {"id": 8167, "synset": "guimpe.n.01", "name": "guimpe"}, - {"id": 8168, "synset": "guitar_pick.n.01", "name": "guitar_pick"}, - {"id": 8169, "synset": "gulag.n.01", "name": "gulag"}, - {"id": 8170, "synset": "gunboat.n.01", "name": "gunboat"}, - {"id": 8171, "synset": "gun_carriage.n.01", "name": "gun_carriage"}, - {"id": 8172, "synset": "gun_case.n.01", "name": "gun_case"}, - {"id": 8173, "synset": "gun_emplacement.n.01", "name": "gun_emplacement"}, - {"id": 8174, "synset": "gun_enclosure.n.01", "name": "gun_enclosure"}, - {"id": 8175, "synset": "gunlock.n.01", "name": "gunlock"}, - {"id": 8176, "synset": "gunnery.n.01", "name": "gunnery"}, - {"id": 8177, "synset": "gunnysack.n.01", "name": "gunnysack"}, - {"id": 8178, "synset": "gun_pendulum.n.01", "name": "gun_pendulum"}, - {"id": 8179, "synset": "gun_room.n.01", "name": "gun_room"}, - {"id": 8180, "synset": "gunsight.n.01", "name": "gunsight"}, - {"id": 8181, "synset": "gun_trigger.n.01", "name": "gun_trigger"}, - {"id": 8182, "synset": "gurney.n.01", "name": "gurney"}, - {"id": 8183, "synset": "gusher.n.01", "name": "gusher"}, - {"id": 8184, "synset": "gusset.n.03", "name": "gusset"}, - {"id": 8185, "synset": "gusset.n.02", "name": "gusset"}, - {"id": 8186, "synset": "guy.n.03", "name": "guy"}, - {"id": 8187, "synset": "gymnastic_apparatus.n.01", "name": "gymnastic_apparatus"}, - {"id": 8188, "synset": "gym_shoe.n.01", "name": "gym_shoe"}, - {"id": 8189, "synset": "gym_suit.n.01", "name": "gym_suit"}, - {"id": 8190, "synset": "gymslip.n.01", "name": "gymslip"}, - {"id": 8191, "synset": "gypsy_cab.n.01", "name": "gypsy_cab"}, - {"id": 8192, "synset": "gyrocompass.n.01", "name": "gyrocompass"}, - {"id": 8193, "synset": "gyroscope.n.01", "name": "gyroscope"}, - {"id": 8194, "synset": "gyrostabilizer.n.01", "name": "gyrostabilizer"}, - {"id": 8195, "synset": "habergeon.n.01", "name": "habergeon"}, - {"id": 8196, "synset": "habit.n.03", "name": "habit"}, - {"id": 8197, "synset": "habit.n.05", "name": "habit"}, - {"id": 8198, "synset": "hacienda.n.02", "name": "hacienda"}, - {"id": 8199, "synset": "hacksaw.n.01", "name": "hacksaw"}, - {"id": 8200, "synset": "haft.n.01", "name": "haft"}, - {"id": 8201, "synset": "haircloth.n.01", "name": "haircloth"}, - {"id": 8202, "synset": "hairdressing.n.01", "name": "hairdressing"}, - {"id": 8203, "synset": "hairpiece.n.01", "name": "hairpiece"}, - {"id": 8204, "synset": "hair_shirt.n.01", "name": "hair_shirt"}, - {"id": 8205, "synset": "hair_slide.n.01", "name": "hair_slide"}, - {"id": 8206, "synset": "hair_spray.n.01", "name": "hair_spray"}, - {"id": 8207, "synset": "hairspring.n.01", "name": "hairspring"}, - {"id": 8208, "synset": "hair_trigger.n.01", "name": "hair_trigger"}, - {"id": 8209, "synset": "halberd.n.01", "name": "halberd"}, - {"id": 8210, "synset": "half_binding.n.01", "name": "half_binding"}, - {"id": 8211, "synset": "half_hatchet.n.01", "name": "half_hatchet"}, - {"id": 8212, "synset": "half_hitch.n.01", "name": "half_hitch"}, - {"id": 8213, "synset": "half_track.n.01", "name": "half_track"}, - {"id": 8214, "synset": "hall.n.13", "name": "hall"}, - {"id": 8215, "synset": "hall.n.03", "name": "hall"}, - {"id": 8216, "synset": "hall.n.12", "name": "hall"}, - {"id": 8217, "synset": "hall_of_fame.n.01", "name": "Hall_of_Fame"}, - {"id": 8218, "synset": "hall_of_residence.n.01", "name": "hall_of_residence"}, - {"id": 8219, "synset": "hallstand.n.01", "name": "hallstand"}, - {"id": 8220, "synset": "halter.n.01", "name": "halter"}, - {"id": 8221, "synset": "hame.n.01", "name": "hame"}, - {"id": 8222, "synset": "hammer.n.07", "name": "hammer"}, - {"id": 8223, "synset": "hammer.n.05", "name": "hammer"}, - {"id": 8224, "synset": "hammerhead.n.02", "name": "hammerhead"}, - {"id": 8225, "synset": "hand.n.08", "name": "hand"}, - {"id": 8226, "synset": "handball.n.01", "name": "handball"}, - {"id": 8227, "synset": "handbarrow.n.01", "name": "handbarrow"}, - {"id": 8228, "synset": "handbell.n.01", "name": "handbell"}, - {"id": 8229, "synset": "handbow.n.01", "name": "handbow"}, - {"id": 8230, "synset": "hand_brake.n.01", "name": "hand_brake"}, - {"id": 8231, "synset": "hand_calculator.n.01", "name": "hand_calculator"}, - {"id": 8232, "synset": "handcar.n.01", "name": "handcar"}, - {"id": 8233, "synset": "hand_cream.n.01", "name": "hand_cream"}, - {"id": 8234, "synset": "hand_drill.n.01", "name": "hand_drill"}, - {"id": 8235, "synset": "hand_glass.n.02", "name": "hand_glass"}, - {"id": 8236, "synset": "hand_grenade.n.01", "name": "hand_grenade"}, - {"id": 8237, "synset": "hand-held_computer.n.01", "name": "hand-held_computer"}, - {"id": 8238, "synset": "handhold.n.01", "name": "handhold"}, - {"id": 8239, "synset": "handlebar.n.01", "name": "handlebar"}, - {"id": 8240, "synset": "handloom.n.01", "name": "handloom"}, - {"id": 8241, "synset": "hand_lotion.n.01", "name": "hand_lotion"}, - {"id": 8242, "synset": "hand_luggage.n.01", "name": "hand_luggage"}, - {"id": 8243, "synset": "hand-me-down.n.01", "name": "hand-me-down"}, - {"id": 8244, "synset": "hand_mower.n.01", "name": "hand_mower"}, - {"id": 8245, "synset": "hand_pump.n.01", "name": "hand_pump"}, - {"id": 8246, "synset": "handrest.n.01", "name": "handrest"}, - {"id": 8247, "synset": "handset.n.01", "name": "handset"}, - {"id": 8248, "synset": "hand_shovel.n.01", "name": "hand_shovel"}, - {"id": 8249, "synset": "handspike.n.01", "name": "handspike"}, - {"id": 8250, "synset": "handstamp.n.01", "name": "handstamp"}, - {"id": 8251, "synset": "hand_throttle.n.01", "name": "hand_throttle"}, - {"id": 8252, "synset": "hand_tool.n.01", "name": "hand_tool"}, - {"id": 8253, "synset": "hand_truck.n.01", "name": "hand_truck"}, - {"id": 8254, "synset": "handwear.n.01", "name": "handwear"}, - {"id": 8255, "synset": "handwheel.n.02", "name": "handwheel"}, - {"id": 8256, "synset": "handwheel.n.01", "name": "handwheel"}, - {"id": 8257, "synset": "hangar_queen.n.01", "name": "hangar_queen"}, - {"id": 8258, "synset": "hanger.n.02", "name": "hanger"}, - {"id": 8259, "synset": "hang_glider.n.02", "name": "hang_glider"}, - {"id": 8260, "synset": "hangman's_rope.n.01", "name": "hangman's_rope"}, - {"id": 8261, "synset": "hank.n.01", "name": "hank"}, - {"id": 8262, "synset": "hansom.n.01", "name": "hansom"}, - {"id": 8263, "synset": "harbor.n.02", "name": "harbor"}, - {"id": 8264, "synset": "hard_disc.n.01", "name": "hard_disc"}, - {"id": 8265, "synset": "hard_hat.n.02", "name": "hard_hat"}, - {"id": 8266, "synset": "hardtop.n.01", "name": "hardtop"}, - {"id": 8267, "synset": "hardware.n.02", "name": "hardware"}, - {"id": 8268, "synset": "hardware_store.n.01", "name": "hardware_store"}, - {"id": 8269, "synset": "harmonica.n.01", "name": "harmonica"}, - {"id": 8270, "synset": "harness.n.02", "name": "harness"}, - {"id": 8271, "synset": "harness.n.01", "name": "harness"}, - {"id": 8272, "synset": "harp.n.01", "name": "harp"}, - {"id": 8273, "synset": "harp.n.02", "name": "harp"}, - {"id": 8274, "synset": "harpoon.n.01", "name": "harpoon"}, - {"id": 8275, "synset": "harpoon_gun.n.01", "name": "harpoon_gun"}, - {"id": 8276, "synset": "harpoon_log.n.01", "name": "harpoon_log"}, - {"id": 8277, "synset": "harpsichord.n.01", "name": "harpsichord"}, - {"id": 8278, "synset": "harris_tweed.n.01", "name": "Harris_Tweed"}, - {"id": 8279, "synset": "harrow.n.01", "name": "harrow"}, - {"id": 8280, "synset": "harvester.n.02", "name": "harvester"}, - {"id": 8281, "synset": "hash_house.n.01", "name": "hash_house"}, - {"id": 8282, "synset": "hasp.n.01", "name": "hasp"}, - {"id": 8283, "synset": "hatch.n.03", "name": "hatch"}, - {"id": 8284, "synset": "hatchback.n.02", "name": "hatchback"}, - {"id": 8285, "synset": "hatchback.n.01", "name": "hatchback"}, - {"id": 8286, "synset": "hatchel.n.01", "name": "hatchel"}, - {"id": 8287, "synset": "hatchet.n.02", "name": "hatchet"}, - {"id": 8288, "synset": "hatpin.n.01", "name": "hatpin"}, - {"id": 8289, "synset": "hauberk.n.01", "name": "hauberk"}, - {"id": 8290, "synset": "hawaiian_guitar.n.01", "name": "Hawaiian_guitar"}, - {"id": 8291, "synset": "hawse.n.01", "name": "hawse"}, - {"id": 8292, "synset": "hawser.n.01", "name": "hawser"}, - {"id": 8293, "synset": "hawser_bend.n.01", "name": "hawser_bend"}, - {"id": 8294, "synset": "hay_bale.n.01", "name": "hay_bale"}, - {"id": 8295, "synset": "hayfork.n.01", "name": "hayfork"}, - {"id": 8296, "synset": "hayloft.n.01", "name": "hayloft"}, - {"id": 8297, "synset": "haymaker.n.01", "name": "haymaker"}, - {"id": 8298, "synset": "hayrack.n.02", "name": "hayrack"}, - {"id": 8299, "synset": "hayrack.n.01", "name": "hayrack"}, - {"id": 8300, "synset": "hazard.n.03", "name": "hazard"}, - {"id": 8301, "synset": "head.n.31", "name": "head"}, - {"id": 8302, "synset": "head.n.30", "name": "head"}, - {"id": 8303, "synset": "head.n.29", "name": "head"}, - {"id": 8304, "synset": "headdress.n.01", "name": "headdress"}, - {"id": 8305, "synset": "header.n.05", "name": "header"}, - {"id": 8306, "synset": "header.n.04", "name": "header"}, - {"id": 8307, "synset": "header.n.03", "name": "header"}, - {"id": 8308, "synset": "header.n.02", "name": "header"}, - {"id": 8309, "synset": "headfast.n.01", "name": "headfast"}, - {"id": 8310, "synset": "head_gasket.n.01", "name": "head_gasket"}, - {"id": 8311, "synset": "head_gate.n.02", "name": "head_gate"}, - {"id": 8312, "synset": "headgear.n.03", "name": "headgear"}, - {"id": 8313, "synset": "headpiece.n.02", "name": "headpiece"}, - {"id": 8314, "synset": "headpin.n.01", "name": "headpin"}, - {"id": 8315, "synset": "headquarters.n.01", "name": "headquarters"}, - {"id": 8316, "synset": "headrace.n.01", "name": "headrace"}, - {"id": 8317, "synset": "headrest.n.02", "name": "headrest"}, - {"id": 8318, "synset": "headsail.n.01", "name": "headsail"}, - {"id": 8319, "synset": "head_shop.n.01", "name": "head_shop"}, - {"id": 8320, "synset": "headstock.n.01", "name": "headstock"}, - {"id": 8321, "synset": "health_spa.n.01", "name": "health_spa"}, - {"id": 8322, "synset": "hearing_aid.n.02", "name": "hearing_aid"}, - {"id": 8323, "synset": "hearing_aid.n.01", "name": "hearing_aid"}, - {"id": 8324, "synset": "hearse.n.01", "name": "hearse"}, - {"id": 8325, "synset": "hearth.n.02", "name": "hearth"}, - {"id": 8326, "synset": "hearthrug.n.01", "name": "hearthrug"}, - {"id": 8327, "synset": "heart-lung_machine.n.01", "name": "heart-lung_machine"}, - {"id": 8328, "synset": "heat_engine.n.01", "name": "heat_engine"}, - {"id": 8329, "synset": "heat_exchanger.n.01", "name": "heat_exchanger"}, - {"id": 8330, "synset": "heating_pad.n.01", "name": "heating_pad"}, - {"id": 8331, "synset": "heat_lamp.n.01", "name": "heat_lamp"}, - {"id": 8332, "synset": "heat_pump.n.01", "name": "heat_pump"}, - {"id": 8333, "synset": "heat-seeking_missile.n.01", "name": "heat-seeking_missile"}, - {"id": 8334, "synset": "heat_shield.n.01", "name": "heat_shield"}, - {"id": 8335, "synset": "heat_sink.n.01", "name": "heat_sink"}, - {"id": 8336, "synset": "heaume.n.01", "name": "heaume"}, - {"id": 8337, "synset": "heaver.n.01", "name": "heaver"}, - {"id": 8338, "synset": "heavier-than-air_craft.n.01", "name": "heavier-than-air_craft"}, - {"id": 8339, "synset": "heckelphone.n.01", "name": "heckelphone"}, - {"id": 8340, "synset": "hectograph.n.01", "name": "hectograph"}, - {"id": 8341, "synset": "hedge.n.01", "name": "hedge"}, - {"id": 8342, "synset": "hedge_trimmer.n.01", "name": "hedge_trimmer"}, - {"id": 8343, "synset": "helicon.n.01", "name": "helicon"}, - {"id": 8344, "synset": "heliograph.n.01", "name": "heliograph"}, - {"id": 8345, "synset": "heliometer.n.01", "name": "heliometer"}, - {"id": 8346, "synset": "helm.n.01", "name": "helm"}, - {"id": 8347, "synset": "helmet.n.01", "name": "helmet"}, - {"id": 8348, "synset": "hematocrit.n.02", "name": "hematocrit"}, - {"id": 8349, "synset": "hemming-stitch.n.01", "name": "hemming-stitch"}, - {"id": 8350, "synset": "hemostat.n.01", "name": "hemostat"}, - {"id": 8351, "synset": "hemstitch.n.01", "name": "hemstitch"}, - {"id": 8352, "synset": "henroost.n.01", "name": "henroost"}, - {"id": 8353, "synset": "heraldry.n.02", "name": "heraldry"}, - {"id": 8354, "synset": "hermitage.n.01", "name": "hermitage"}, - {"id": 8355, "synset": "herringbone.n.01", "name": "herringbone"}, - {"id": 8356, "synset": "herringbone.n.02", "name": "herringbone"}, - {"id": 8357, "synset": "herschelian_telescope.n.01", "name": "Herschelian_telescope"}, - {"id": 8358, "synset": "hessian_boot.n.01", "name": "Hessian_boot"}, - {"id": 8359, "synset": "heterodyne_receiver.n.01", "name": "heterodyne_receiver"}, - {"id": 8360, "synset": "hibachi.n.01", "name": "hibachi"}, - {"id": 8361, "synset": "hideaway.n.02", "name": "hideaway"}, - {"id": 8362, "synset": "hi-fi.n.01", "name": "hi-fi"}, - {"id": 8363, "synset": "high_altar.n.01", "name": "high_altar"}, - {"id": 8364, "synset": "high-angle_gun.n.01", "name": "high-angle_gun"}, - {"id": 8365, "synset": "highball_glass.n.01", "name": "highball_glass"}, - {"id": 8366, "synset": "highboard.n.01", "name": "highboard"}, - {"id": 8367, "synset": "highboy.n.01", "name": "highboy"}, - {"id": 8368, "synset": "high_gear.n.01", "name": "high_gear"}, - {"id": 8369, "synset": "high-hat_cymbal.n.01", "name": "high-hat_cymbal"}, - {"id": 8370, "synset": "highlighter.n.02", "name": "highlighter"}, - {"id": 8371, "synset": "highlighter.n.01", "name": "highlighter"}, - {"id": 8372, "synset": "high-pass_filter.n.01", "name": "high-pass_filter"}, - {"id": 8373, "synset": "high-rise.n.01", "name": "high-rise"}, - {"id": 8374, "synset": "high_table.n.01", "name": "high_table"}, - {"id": 8375, "synset": "high-warp_loom.n.01", "name": "high-warp_loom"}, - {"id": 8376, "synset": "hijab.n.01", "name": "hijab"}, - {"id": 8377, "synset": "hinging_post.n.01", "name": "hinging_post"}, - {"id": 8378, "synset": "hip_boot.n.01", "name": "hip_boot"}, - {"id": 8379, "synset": "hipflask.n.01", "name": "hipflask"}, - {"id": 8380, "synset": "hip_pad.n.01", "name": "hip_pad"}, - {"id": 8381, "synset": "hip_pocket.n.01", "name": "hip_pocket"}, - {"id": 8382, "synset": "hippodrome.n.01", "name": "hippodrome"}, - {"id": 8383, "synset": "hip_roof.n.01", "name": "hip_roof"}, - {"id": 8384, "synset": "hitch.n.05", "name": "hitch"}, - {"id": 8385, "synset": "hitch.n.04", "name": "hitch"}, - {"id": 8386, "synset": "hitching_post.n.01", "name": "hitching_post"}, - {"id": 8387, "synset": "hitchrack.n.01", "name": "hitchrack"}, - {"id": 8388, "synset": "hob.n.03", "name": "hob"}, - {"id": 8389, "synset": "hobble_skirt.n.01", "name": "hobble_skirt"}, - {"id": 8390, "synset": "hockey_skate.n.01", "name": "hockey_skate"}, - {"id": 8391, "synset": "hod.n.01", "name": "hod"}, - {"id": 8392, "synset": "hodoscope.n.01", "name": "hodoscope"}, - {"id": 8393, "synset": "hoe.n.01", "name": "hoe"}, - {"id": 8394, "synset": "hoe_handle.n.01", "name": "hoe_handle"}, - {"id": 8395, "synset": "hogshead.n.02", "name": "hogshead"}, - {"id": 8396, "synset": "hoist.n.01", "name": "hoist"}, - {"id": 8397, "synset": "hold.n.07", "name": "hold"}, - {"id": 8398, "synset": "holder.n.01", "name": "holder"}, - {"id": 8399, "synset": "holding_cell.n.01", "name": "holding_cell"}, - {"id": 8400, "synset": "holding_device.n.01", "name": "holding_device"}, - {"id": 8401, "synset": "holding_pen.n.01", "name": "holding_pen"}, - {"id": 8402, "synset": "hollowware.n.01", "name": "hollowware"}, - {"id": 8403, "synset": "holster.n.01", "name": "holster"}, - {"id": 8404, "synset": "holster.n.02", "name": "holster"}, - {"id": 8405, "synset": "holy_of_holies.n.02", "name": "holy_of_holies"}, - {"id": 8406, "synset": "home.n.09", "name": "home"}, - {"id": 8407, "synset": "home_appliance.n.01", "name": "home_appliance"}, - {"id": 8408, "synset": "home_computer.n.01", "name": "home_computer"}, - {"id": 8409, "synset": "home_room.n.01", "name": "home_room"}, - {"id": 8410, "synset": "homespun.n.01", "name": "homespun"}, - {"id": 8411, "synset": "homestead.n.03", "name": "homestead"}, - {"id": 8412, "synset": "home_theater.n.01", "name": "home_theater"}, - {"id": 8413, "synset": "homing_torpedo.n.01", "name": "homing_torpedo"}, - {"id": 8414, "synset": "hone.n.01", "name": "hone"}, - {"id": 8415, "synset": "honeycomb.n.02", "name": "honeycomb"}, - {"id": 8416, "synset": "hood.n.09", "name": "hood"}, - {"id": 8417, "synset": "hood.n.08", "name": "hood"}, - {"id": 8418, "synset": "hood.n.07", "name": "hood"}, - {"id": 8419, "synset": "hood.n.05", "name": "hood"}, - {"id": 8420, "synset": "hood_latch.n.01", "name": "hood_latch"}, - {"id": 8421, "synset": "hook.n.04", "name": "hook"}, - {"id": 8422, "synset": "hook.n.01", "name": "hook"}, - {"id": 8423, "synset": "hook_and_eye.n.01", "name": "hook_and_eye"}, - {"id": 8424, "synset": "hookup.n.02", "name": "hookup"}, - {"id": 8425, "synset": "hookup.n.01", "name": "hookup"}, - {"id": 8426, "synset": "hook_wrench.n.01", "name": "hook_wrench"}, - {"id": 8427, "synset": "hoopskirt.n.01", "name": "hoopskirt"}, - {"id": 8428, "synset": "hoosegow.n.01", "name": "hoosegow"}, - {"id": 8429, "synset": "hoover.n.04", "name": "Hoover"}, - {"id": 8430, "synset": "hope_chest.n.01", "name": "hope_chest"}, - {"id": 8431, "synset": "hopper.n.01", "name": "hopper"}, - {"id": 8432, "synset": "hopsacking.n.01", "name": "hopsacking"}, - {"id": 8433, "synset": "horizontal_bar.n.01", "name": "horizontal_bar"}, - {"id": 8434, "synset": "horizontal_stabilizer.n.01", "name": "horizontal_stabilizer"}, - {"id": 8435, "synset": "horizontal_tail.n.01", "name": "horizontal_tail"}, - {"id": 8436, "synset": "horn.n.09", "name": "horn"}, - {"id": 8437, "synset": "horn.n.01", "name": "horn"}, - {"id": 8438, "synset": "horn.n.08", "name": "horn"}, - {"id": 8439, "synset": "horn_button.n.01", "name": "horn_button"}, - {"id": 8440, "synset": "hornpipe.n.03", "name": "hornpipe"}, - {"id": 8441, "synset": "horse.n.02", "name": "horse"}, - {"id": 8442, "synset": "horsebox.n.01", "name": "horsebox"}, - {"id": 8443, "synset": "horsecar.n.01", "name": "horsecar"}, - {"id": 8444, "synset": "horse_cart.n.01", "name": "horse_cart"}, - {"id": 8445, "synset": "horsecloth.n.01", "name": "horsecloth"}, - {"id": 8446, "synset": "horse-drawn_vehicle.n.01", "name": "horse-drawn_vehicle"}, - {"id": 8447, "synset": "horsehair.n.02", "name": "horsehair"}, - {"id": 8448, "synset": "horsehair_wig.n.01", "name": "horsehair_wig"}, - {"id": 8449, "synset": "horseless_carriage.n.01", "name": "horseless_carriage"}, - {"id": 8450, "synset": "horse_pistol.n.01", "name": "horse_pistol"}, - {"id": 8451, "synset": "horseshoe.n.02", "name": "horseshoe"}, - {"id": 8452, "synset": "horseshoe.n.01", "name": "horseshoe"}, - {"id": 8453, "synset": "horse-trail.n.01", "name": "horse-trail"}, - {"id": 8454, "synset": "horsewhip.n.01", "name": "horsewhip"}, - {"id": 8455, "synset": "hose.n.02", "name": "hose"}, - {"id": 8456, "synset": "hosiery.n.01", "name": "hosiery"}, - {"id": 8457, "synset": "hospice.n.01", "name": "hospice"}, - {"id": 8458, "synset": "hospital.n.01", "name": "hospital"}, - {"id": 8459, "synset": "hospital_bed.n.01", "name": "hospital_bed"}, - {"id": 8460, "synset": "hospital_room.n.01", "name": "hospital_room"}, - {"id": 8461, "synset": "hospital_ship.n.01", "name": "hospital_ship"}, - {"id": 8462, "synset": "hospital_train.n.01", "name": "hospital_train"}, - {"id": 8463, "synset": "hostel.n.02", "name": "hostel"}, - {"id": 8464, "synset": "hostel.n.01", "name": "hostel"}, - {"id": 8465, "synset": "hotel.n.01", "name": "hotel"}, - {"id": 8466, "synset": "hotel-casino.n.02", "name": "hotel-casino"}, - {"id": 8467, "synset": "hotel-casino.n.01", "name": "hotel-casino"}, - {"id": 8468, "synset": "hotel_room.n.01", "name": "hotel_room"}, - {"id": 8469, "synset": "hot_line.n.01", "name": "hot_line"}, - {"id": 8470, "synset": "hot_pants.n.02", "name": "hot_pants"}, - {"id": 8471, "synset": "hot_rod.n.01", "name": "hot_rod"}, - {"id": 8472, "synset": "hot_spot.n.03", "name": "hot_spot"}, - {"id": 8473, "synset": "hot_tub.n.01", "name": "hot_tub"}, - {"id": 8474, "synset": "hot-water_bottle.n.01", "name": "hot-water_bottle"}, - {"id": 8475, "synset": "houndstooth_check.n.01", "name": "houndstooth_check"}, - {"id": 8476, "synset": "hour_hand.n.01", "name": "hour_hand"}, - {"id": 8477, "synset": "house.n.01", "name": "house"}, - {"id": 8478, "synset": "house.n.12", "name": "house"}, - {"id": 8479, "synset": "houselights.n.01", "name": "houselights"}, - {"id": 8480, "synset": "house_of_cards.n.02", "name": "house_of_cards"}, - {"id": 8481, "synset": "house_of_correction.n.01", "name": "house_of_correction"}, - {"id": 8482, "synset": "house_paint.n.01", "name": "house_paint"}, - {"id": 8483, "synset": "housetop.n.01", "name": "housetop"}, - {"id": 8484, "synset": "housing.n.01", "name": "housing"}, - {"id": 8485, "synset": "hovel.n.01", "name": "hovel"}, - {"id": 8486, "synset": "hovercraft.n.01", "name": "hovercraft"}, - {"id": 8487, "synset": "howdah.n.01", "name": "howdah"}, - {"id": 8488, "synset": "huarache.n.01", "name": "huarache"}, - {"id": 8489, "synset": "hub-and-spoke.n.01", "name": "hub-and-spoke"}, - {"id": 8490, "synset": "hubcap.n.01", "name": "hubcap"}, - {"id": 8491, "synset": "huck.n.01", "name": "huck"}, - {"id": 8492, "synset": "hug-me-tight.n.01", "name": "hug-me-tight"}, - {"id": 8493, "synset": "hula-hoop.n.01", "name": "hula-hoop"}, - {"id": 8494, "synset": "hulk.n.02", "name": "hulk"}, - {"id": 8495, "synset": "hull.n.06", "name": "hull"}, - {"id": 8496, "synset": "humeral_veil.n.01", "name": "humeral_veil"}, - {"id": 8497, "synset": "humvee.n.01", "name": "Humvee"}, - {"id": 8498, "synset": "hunter.n.04", "name": "hunter"}, - {"id": 8499, "synset": "hunting_knife.n.01", "name": "hunting_knife"}, - {"id": 8500, "synset": "hurdle.n.01", "name": "hurdle"}, - {"id": 8501, "synset": "hurricane_deck.n.01", "name": "hurricane_deck"}, - {"id": 8502, "synset": "hurricane_lamp.n.01", "name": "hurricane_lamp"}, - {"id": 8503, "synset": "hut.n.01", "name": "hut"}, - {"id": 8504, "synset": "hutch.n.01", "name": "hutch"}, - {"id": 8505, "synset": "hutment.n.01", "name": "hutment"}, - {"id": 8506, "synset": "hydraulic_brake.n.01", "name": "hydraulic_brake"}, - {"id": 8507, "synset": "hydraulic_press.n.01", "name": "hydraulic_press"}, - {"id": 8508, "synset": "hydraulic_pump.n.01", "name": "hydraulic_pump"}, - {"id": 8509, "synset": "hydraulic_system.n.01", "name": "hydraulic_system"}, - {"id": 8510, "synset": "hydraulic_transmission.n.01", "name": "hydraulic_transmission"}, - {"id": 8511, "synset": "hydroelectric_turbine.n.01", "name": "hydroelectric_turbine"}, - {"id": 8512, "synset": "hydrofoil.n.02", "name": "hydrofoil"}, - {"id": 8513, "synset": "hydrofoil.n.01", "name": "hydrofoil"}, - {"id": 8514, "synset": "hydrogen_bomb.n.01", "name": "hydrogen_bomb"}, - {"id": 8515, "synset": "hydrometer.n.01", "name": "hydrometer"}, - {"id": 8516, "synset": "hygrodeik.n.01", "name": "hygrodeik"}, - {"id": 8517, "synset": "hygrometer.n.01", "name": "hygrometer"}, - {"id": 8518, "synset": "hygroscope.n.01", "name": "hygroscope"}, - {"id": 8519, "synset": "hyperbaric_chamber.n.01", "name": "hyperbaric_chamber"}, - {"id": 8520, "synset": "hypercoaster.n.01", "name": "hypercoaster"}, - {"id": 8521, "synset": "hypermarket.n.01", "name": "hypermarket"}, - {"id": 8522, "synset": "hypodermic_needle.n.01", "name": "hypodermic_needle"}, - {"id": 8523, "synset": "hypodermic_syringe.n.01", "name": "hypodermic_syringe"}, - {"id": 8524, "synset": "hypsometer.n.01", "name": "hypsometer"}, - {"id": 8525, "synset": "hysterosalpingogram.n.01", "name": "hysterosalpingogram"}, - {"id": 8526, "synset": "i-beam.n.01", "name": "I-beam"}, - {"id": 8527, "synset": "ice_ax.n.01", "name": "ice_ax"}, - {"id": 8528, "synset": "iceboat.n.02", "name": "iceboat"}, - {"id": 8529, "synset": "icebreaker.n.01", "name": "icebreaker"}, - {"id": 8530, "synset": "iced-tea_spoon.n.01", "name": "iced-tea_spoon"}, - {"id": 8531, "synset": "ice_hockey_rink.n.01", "name": "ice_hockey_rink"}, - {"id": 8532, "synset": "ice_machine.n.01", "name": "ice_machine"}, - {"id": 8533, "synset": "icepick.n.01", "name": "icepick"}, - {"id": 8534, "synset": "ice_rink.n.01", "name": "ice_rink"}, - {"id": 8535, "synset": "ice_tongs.n.01", "name": "ice_tongs"}, - {"id": 8536, "synset": "icetray.n.01", "name": "icetray"}, - {"id": 8537, "synset": "iconoscope.n.01", "name": "iconoscope"}, - {"id": 8538, "synset": "identikit.n.01", "name": "Identikit"}, - {"id": 8539, "synset": "idle_pulley.n.01", "name": "idle_pulley"}, - {"id": 8540, "synset": "igloo.n.01", "name": "igloo"}, - {"id": 8541, "synset": "ignition_coil.n.01", "name": "ignition_coil"}, - {"id": 8542, "synset": "ignition_key.n.01", "name": "ignition_key"}, - {"id": 8543, "synset": "ignition_switch.n.01", "name": "ignition_switch"}, - {"id": 8544, "synset": "imaret.n.01", "name": "imaret"}, - {"id": 8545, "synset": "immovable_bandage.n.01", "name": "immovable_bandage"}, - {"id": 8546, "synset": "impact_printer.n.01", "name": "impact_printer"}, - {"id": 8547, "synset": "impeller.n.01", "name": "impeller"}, - {"id": 8548, "synset": "implant.n.01", "name": "implant"}, - {"id": 8549, "synset": "implement.n.01", "name": "implement"}, - {"id": 8550, "synset": "impression.n.07", "name": "impression"}, - {"id": 8551, "synset": "imprint.n.05", "name": "imprint"}, - { - "id": 8552, - "synset": "improvised_explosive_device.n.01", - "name": "improvised_explosive_device", - }, - {"id": 8553, "synset": "impulse_turbine.n.01", "name": "impulse_turbine"}, - {"id": 8554, "synset": "in-basket.n.01", "name": "in-basket"}, - {"id": 8555, "synset": "incendiary_bomb.n.01", "name": "incendiary_bomb"}, - {"id": 8556, "synset": "incinerator.n.01", "name": "incinerator"}, - {"id": 8557, "synset": "inclined_plane.n.01", "name": "inclined_plane"}, - {"id": 8558, "synset": "inclinometer.n.02", "name": "inclinometer"}, - {"id": 8559, "synset": "inclinometer.n.01", "name": "inclinometer"}, - {"id": 8560, "synset": "incrustation.n.03", "name": "incrustation"}, - {"id": 8561, "synset": "incubator.n.01", "name": "incubator"}, - {"id": 8562, "synset": "index_register.n.01", "name": "index_register"}, - {"id": 8563, "synset": "indiaman.n.01", "name": "Indiaman"}, - {"id": 8564, "synset": "indian_club.n.01", "name": "Indian_club"}, - {"id": 8565, "synset": "indicator.n.03", "name": "indicator"}, - {"id": 8566, "synset": "induction_coil.n.01", "name": "induction_coil"}, - {"id": 8567, "synset": "inductor.n.01", "name": "inductor"}, - {"id": 8568, "synset": "industrial_watercourse.n.01", "name": "industrial_watercourse"}, - {"id": 8569, "synset": "inertial_guidance_system.n.01", "name": "inertial_guidance_system"}, - {"id": 8570, "synset": "inflater.n.01", "name": "inflater"}, - {"id": 8571, "synset": "injector.n.01", "name": "injector"}, - {"id": 8572, "synset": "ink_bottle.n.01", "name": "ink_bottle"}, - {"id": 8573, "synset": "ink_eraser.n.01", "name": "ink_eraser"}, - {"id": 8574, "synset": "ink-jet_printer.n.01", "name": "ink-jet_printer"}, - {"id": 8575, "synset": "inkle.n.01", "name": "inkle"}, - {"id": 8576, "synset": "inkstand.n.02", "name": "inkstand"}, - {"id": 8577, "synset": "inkwell.n.01", "name": "inkwell"}, - {"id": 8578, "synset": "inlay.n.01", "name": "inlay"}, - {"id": 8579, "synset": "inside_caliper.n.01", "name": "inside_caliper"}, - {"id": 8580, "synset": "insole.n.01", "name": "insole"}, - {"id": 8581, "synset": "instep.n.02", "name": "instep"}, - {"id": 8582, "synset": "instillator.n.01", "name": "instillator"}, - {"id": 8583, "synset": "institution.n.02", "name": "institution"}, - {"id": 8584, "synset": "instrument.n.01", "name": "instrument"}, - {"id": 8585, "synset": "instrument_of_punishment.n.01", "name": "instrument_of_punishment"}, - {"id": 8586, "synset": "instrument_of_torture.n.01", "name": "instrument_of_torture"}, - {"id": 8587, "synset": "intaglio.n.02", "name": "intaglio"}, - {"id": 8588, "synset": "intake_valve.n.01", "name": "intake_valve"}, - {"id": 8589, "synset": "integrated_circuit.n.01", "name": "integrated_circuit"}, - {"id": 8590, "synset": "integrator.n.01", "name": "integrator"}, - {"id": 8591, "synset": "intelnet.n.01", "name": "Intelnet"}, - {"id": 8592, "synset": "interceptor.n.01", "name": "interceptor"}, - {"id": 8593, "synset": "interchange.n.01", "name": "interchange"}, - {"id": 8594, "synset": "intercommunication_system.n.01", "name": "intercommunication_system"}, - { - "id": 8595, - "synset": "intercontinental_ballistic_missile.n.01", - "name": "intercontinental_ballistic_missile", - }, - {"id": 8596, "synset": "interface.n.04", "name": "interface"}, - {"id": 8597, "synset": "interferometer.n.01", "name": "interferometer"}, - {"id": 8598, "synset": "interior_door.n.01", "name": "interior_door"}, - {"id": 8599, "synset": "internal-combustion_engine.n.01", "name": "internal-combustion_engine"}, - {"id": 8600, "synset": "internal_drive.n.01", "name": "internal_drive"}, - {"id": 8601, "synset": "internet.n.01", "name": "internet"}, - {"id": 8602, "synset": "interphone.n.01", "name": "interphone"}, - {"id": 8603, "synset": "interrupter.n.01", "name": "interrupter"}, - {"id": 8604, "synset": "intersection.n.02", "name": "intersection"}, - {"id": 8605, "synset": "interstice.n.02", "name": "interstice"}, - {"id": 8606, "synset": "intraocular_lens.n.01", "name": "intraocular_lens"}, - {"id": 8607, "synset": "intravenous_pyelogram.n.01", "name": "intravenous_pyelogram"}, - {"id": 8608, "synset": "inverter.n.01", "name": "inverter"}, - {"id": 8609, "synset": "ion_engine.n.01", "name": "ion_engine"}, - {"id": 8610, "synset": "ionization_chamber.n.01", "name": "ionization_chamber"}, - {"id": 8611, "synset": "video_ipod.n.01", "name": "video_iPod"}, - {"id": 8612, "synset": "iron.n.02", "name": "iron"}, - {"id": 8613, "synset": "iron.n.03", "name": "iron"}, - {"id": 8614, "synset": "irons.n.01", "name": "irons"}, - {"id": 8615, "synset": "ironclad.n.01", "name": "ironclad"}, - {"id": 8616, "synset": "iron_foundry.n.01", "name": "iron_foundry"}, - {"id": 8617, "synset": "iron_horse.n.01", "name": "iron_horse"}, - {"id": 8618, "synset": "ironing.n.01", "name": "ironing"}, - {"id": 8619, "synset": "iron_lung.n.01", "name": "iron_lung"}, - {"id": 8620, "synset": "ironmongery.n.01", "name": "ironmongery"}, - {"id": 8621, "synset": "ironworks.n.01", "name": "ironworks"}, - {"id": 8622, "synset": "irrigation_ditch.n.01", "name": "irrigation_ditch"}, - {"id": 8623, "synset": "izar.n.01", "name": "izar"}, - {"id": 8624, "synset": "jabot.n.01", "name": "jabot"}, - {"id": 8625, "synset": "jack.n.10", "name": "jack"}, - {"id": 8626, "synset": "jack.n.07", "name": "jack"}, - {"id": 8627, "synset": "jack.n.06", "name": "jack"}, - {"id": 8628, "synset": "jack.n.05", "name": "jack"}, - {"id": 8629, "synset": "jacket.n.02", "name": "jacket"}, - {"id": 8630, "synset": "jacket.n.05", "name": "jacket"}, - {"id": 8631, "synset": "jack-in-the-box.n.01", "name": "jack-in-the-box"}, - {"id": 8632, "synset": "jack-o'-lantern.n.02", "name": "jack-o'-lantern"}, - {"id": 8633, "synset": "jack_plane.n.01", "name": "jack_plane"}, - {"id": 8634, "synset": "jacob's_ladder.n.02", "name": "Jacob's_ladder"}, - {"id": 8635, "synset": "jaconet.n.01", "name": "jaconet"}, - {"id": 8636, "synset": "jacquard_loom.n.01", "name": "Jacquard_loom"}, - {"id": 8637, "synset": "jacquard.n.02", "name": "jacquard"}, - {"id": 8638, "synset": "jag.n.03", "name": "jag"}, - {"id": 8639, "synset": "jail.n.01", "name": "jail"}, - {"id": 8640, "synset": "jalousie.n.02", "name": "jalousie"}, - {"id": 8641, "synset": "jamb.n.01", "name": "jamb"}, - {"id": 8642, "synset": "jammer.n.01", "name": "jammer"}, - {"id": 8643, "synset": "jampot.n.01", "name": "jampot"}, - {"id": 8644, "synset": "japan.n.04", "name": "japan"}, - {"id": 8645, "synset": "jarvik_heart.n.01", "name": "Jarvik_heart"}, - {"id": 8646, "synset": "jaunting_car.n.01", "name": "jaunting_car"}, - {"id": 8647, "synset": "javelin.n.02", "name": "javelin"}, - {"id": 8648, "synset": "jaw.n.03", "name": "jaw"}, - {"id": 8649, "synset": "jaws_of_life.n.01", "name": "Jaws_of_Life"}, - {"id": 8650, "synset": "jellaba.n.01", "name": "jellaba"}, - {"id": 8651, "synset": "jerkin.n.01", "name": "jerkin"}, - {"id": 8652, "synset": "jeroboam.n.02", "name": "jeroboam"}, - {"id": 8653, "synset": "jersey.n.04", "name": "jersey"}, - {"id": 8654, "synset": "jet_bridge.n.01", "name": "jet_bridge"}, - {"id": 8655, "synset": "jet_engine.n.01", "name": "jet_engine"}, - {"id": 8656, "synset": "jetliner.n.01", "name": "jetliner"}, - {"id": 8657, "synset": "jeweler's_glass.n.01", "name": "jeweler's_glass"}, - {"id": 8658, "synset": "jewelled_headdress.n.01", "name": "jewelled_headdress"}, - {"id": 8659, "synset": "jew's_harp.n.01", "name": "jew's_harp"}, - {"id": 8660, "synset": "jib.n.01", "name": "jib"}, - {"id": 8661, "synset": "jibboom.n.01", "name": "jibboom"}, - {"id": 8662, "synset": "jig.n.03", "name": "jig"}, - {"id": 8663, "synset": "jig.n.02", "name": "jig"}, - {"id": 8664, "synset": "jiggermast.n.01", "name": "jiggermast"}, - {"id": 8665, "synset": "jigsaw.n.02", "name": "jigsaw"}, - {"id": 8666, "synset": "jigsaw_puzzle.n.01", "name": "jigsaw_puzzle"}, - {"id": 8667, "synset": "jinrikisha.n.01", "name": "jinrikisha"}, - {"id": 8668, "synset": "jobcentre.n.01", "name": "jobcentre"}, - {"id": 8669, "synset": "jodhpurs.n.01", "name": "jodhpurs"}, - {"id": 8670, "synset": "jodhpur.n.01", "name": "jodhpur"}, - {"id": 8671, "synset": "joinery.n.01", "name": "joinery"}, - {"id": 8672, "synset": "joint.n.05", "name": "joint"}, - { - "id": 8673, - "synset": "joint_direct_attack_munition.n.01", - "name": "Joint_Direct_Attack_Munition", - }, - {"id": 8674, "synset": "jointer.n.01", "name": "jointer"}, - {"id": 8675, "synset": "joist.n.01", "name": "joist"}, - {"id": 8676, "synset": "jolly_boat.n.01", "name": "jolly_boat"}, - {"id": 8677, "synset": "jorum.n.01", "name": "jorum"}, - {"id": 8678, "synset": "joss_house.n.01", "name": "joss_house"}, - {"id": 8679, "synset": "journal_bearing.n.01", "name": "journal_bearing"}, - {"id": 8680, "synset": "journal_box.n.01", "name": "journal_box"}, - {"id": 8681, "synset": "jungle_gym.n.01", "name": "jungle_gym"}, - {"id": 8682, "synset": "junk.n.02", "name": "junk"}, - {"id": 8683, "synset": "jug.n.01", "name": "jug"}, - {"id": 8684, "synset": "jukebox.n.01", "name": "jukebox"}, - {"id": 8685, "synset": "jumbojet.n.01", "name": "jumbojet"}, - {"id": 8686, "synset": "jumper.n.07", "name": "jumper"}, - {"id": 8687, "synset": "jumper.n.06", "name": "jumper"}, - {"id": 8688, "synset": "jumper.n.05", "name": "jumper"}, - {"id": 8689, "synset": "jumper.n.04", "name": "jumper"}, - {"id": 8690, "synset": "jumper_cable.n.01", "name": "jumper_cable"}, - {"id": 8691, "synset": "jump_seat.n.01", "name": "jump_seat"}, - {"id": 8692, "synset": "jump_suit.n.02", "name": "jump_suit"}, - {"id": 8693, "synset": "junction.n.01", "name": "junction"}, - {"id": 8694, "synset": "junction.n.04", "name": "junction"}, - {"id": 8695, "synset": "junction_barrier.n.01", "name": "junction_barrier"}, - {"id": 8696, "synset": "junk_shop.n.01", "name": "junk_shop"}, - {"id": 8697, "synset": "jury_box.n.01", "name": "jury_box"}, - {"id": 8698, "synset": "jury_mast.n.01", "name": "jury_mast"}, - {"id": 8699, "synset": "kachina.n.03", "name": "kachina"}, - {"id": 8700, "synset": "kaffiyeh.n.01", "name": "kaffiyeh"}, - {"id": 8701, "synset": "kalansuwa.n.01", "name": "kalansuwa"}, - {"id": 8702, "synset": "kalashnikov.n.01", "name": "Kalashnikov"}, - {"id": 8703, "synset": "kameez.n.01", "name": "kameez"}, - {"id": 8704, "synset": "kanzu.n.01", "name": "kanzu"}, - {"id": 8705, "synset": "katharometer.n.01", "name": "katharometer"}, - {"id": 8706, "synset": "kazoo.n.01", "name": "kazoo"}, - {"id": 8707, "synset": "keel.n.03", "name": "keel"}, - {"id": 8708, "synset": "keelboat.n.01", "name": "keelboat"}, - {"id": 8709, "synset": "keelson.n.01", "name": "keelson"}, - {"id": 8710, "synset": "keep.n.02", "name": "keep"}, - {"id": 8711, "synset": "kepi.n.01", "name": "kepi"}, - {"id": 8712, "synset": "keratoscope.n.01", "name": "keratoscope"}, - {"id": 8713, "synset": "kerchief.n.01", "name": "kerchief"}, - {"id": 8714, "synset": "ketch.n.01", "name": "ketch"}, - {"id": 8715, "synset": "kettle.n.04", "name": "kettle"}, - {"id": 8716, "synset": "key.n.15", "name": "key"}, - {"id": 8717, "synset": "keyboard.n.01", "name": "keyboard"}, - {"id": 8718, "synset": "keyboard_buffer.n.01", "name": "keyboard_buffer"}, - {"id": 8719, "synset": "keyboard_instrument.n.01", "name": "keyboard_instrument"}, - {"id": 8720, "synset": "keyhole.n.01", "name": "keyhole"}, - {"id": 8721, "synset": "keyhole_saw.n.01", "name": "keyhole_saw"}, - {"id": 8722, "synset": "khadi.n.01", "name": "khadi"}, - {"id": 8723, "synset": "khaki.n.01", "name": "khaki"}, - {"id": 8724, "synset": "khakis.n.01", "name": "khakis"}, - {"id": 8725, "synset": "khimar.n.01", "name": "khimar"}, - {"id": 8726, "synset": "khukuri.n.01", "name": "khukuri"}, - {"id": 8727, "synset": "kick_pleat.n.01", "name": "kick_pleat"}, - {"id": 8728, "synset": "kicksorter.n.01", "name": "kicksorter"}, - {"id": 8729, "synset": "kickstand.n.01", "name": "kickstand"}, - {"id": 8730, "synset": "kick_starter.n.01", "name": "kick_starter"}, - {"id": 8731, "synset": "kid_glove.n.01", "name": "kid_glove"}, - {"id": 8732, "synset": "kiln.n.01", "name": "kiln"}, - {"id": 8733, "synset": "kinescope.n.01", "name": "kinescope"}, - {"id": 8734, "synset": "kinetoscope.n.01", "name": "Kinetoscope"}, - {"id": 8735, "synset": "king.n.10", "name": "king"}, - {"id": 8736, "synset": "king.n.08", "name": "king"}, - {"id": 8737, "synset": "kingbolt.n.01", "name": "kingbolt"}, - {"id": 8738, "synset": "king_post.n.01", "name": "king_post"}, - {"id": 8739, "synset": "kipp's_apparatus.n.01", "name": "Kipp's_apparatus"}, - {"id": 8740, "synset": "kirk.n.01", "name": "kirk"}, - {"id": 8741, "synset": "kirpan.n.01", "name": "kirpan"}, - {"id": 8742, "synset": "kirtle.n.02", "name": "kirtle"}, - {"id": 8743, "synset": "kirtle.n.01", "name": "kirtle"}, - {"id": 8744, "synset": "kit.n.02", "name": "kit"}, - {"id": 8745, "synset": "kit.n.01", "name": "kit"}, - {"id": 8746, "synset": "kitbag.n.01", "name": "kitbag"}, - {"id": 8747, "synset": "kitchen.n.01", "name": "kitchen"}, - {"id": 8748, "synset": "kitchen_appliance.n.01", "name": "kitchen_appliance"}, - {"id": 8749, "synset": "kitchenette.n.01", "name": "kitchenette"}, - {"id": 8750, "synset": "kitchen_utensil.n.01", "name": "kitchen_utensil"}, - {"id": 8751, "synset": "kitchenware.n.01", "name": "kitchenware"}, - {"id": 8752, "synset": "kite_balloon.n.01", "name": "kite_balloon"}, - {"id": 8753, "synset": "klaxon.n.01", "name": "klaxon"}, - {"id": 8754, "synset": "klieg_light.n.01", "name": "klieg_light"}, - {"id": 8755, "synset": "klystron.n.01", "name": "klystron"}, - {"id": 8756, "synset": "knee_brace.n.01", "name": "knee_brace"}, - {"id": 8757, "synset": "knee-high.n.01", "name": "knee-high"}, - {"id": 8758, "synset": "knee_piece.n.01", "name": "knee_piece"}, - {"id": 8759, "synset": "knife.n.02", "name": "knife"}, - {"id": 8760, "synset": "knife_blade.n.01", "name": "knife_blade"}, - {"id": 8761, "synset": "knight.n.02", "name": "knight"}, - {"id": 8762, "synset": "knit.n.01", "name": "knit"}, - {"id": 8763, "synset": "knitting_machine.n.01", "name": "knitting_machine"}, - {"id": 8764, "synset": "knitwear.n.01", "name": "knitwear"}, - {"id": 8765, "synset": "knob.n.01", "name": "knob"}, - {"id": 8766, "synset": "knob.n.04", "name": "knob"}, - {"id": 8767, "synset": "knobble.n.01", "name": "knobble"}, - {"id": 8768, "synset": "knobkerrie.n.01", "name": "knobkerrie"}, - {"id": 8769, "synset": "knot.n.02", "name": "knot"}, - {"id": 8770, "synset": "knuckle_joint.n.02", "name": "knuckle_joint"}, - {"id": 8771, "synset": "kohl.n.01", "name": "kohl"}, - {"id": 8772, "synset": "koto.n.01", "name": "koto"}, - {"id": 8773, "synset": "kraal.n.02", "name": "kraal"}, - {"id": 8774, "synset": "kremlin.n.02", "name": "kremlin"}, - {"id": 8775, "synset": "kris.n.01", "name": "kris"}, - {"id": 8776, "synset": "krummhorn.n.01", "name": "krummhorn"}, - {"id": 8777, "synset": "kundt's_tube.n.01", "name": "Kundt's_tube"}, - {"id": 8778, "synset": "kurdistan.n.02", "name": "Kurdistan"}, - {"id": 8779, "synset": "kurta.n.01", "name": "kurta"}, - {"id": 8780, "synset": "kylix.n.01", "name": "kylix"}, - {"id": 8781, "synset": "kymograph.n.01", "name": "kymograph"}, - {"id": 8782, "synset": "lab_bench.n.01", "name": "lab_bench"}, - {"id": 8783, "synset": "lace.n.02", "name": "lace"}, - {"id": 8784, "synset": "lacquer.n.02", "name": "lacquer"}, - {"id": 8785, "synset": "lacquerware.n.01", "name": "lacquerware"}, - {"id": 8786, "synset": "lacrosse_ball.n.01", "name": "lacrosse_ball"}, - {"id": 8787, "synset": "ladder-back.n.02", "name": "ladder-back"}, - {"id": 8788, "synset": "ladder-back.n.01", "name": "ladder-back"}, - {"id": 8789, "synset": "ladder_truck.n.01", "name": "ladder_truck"}, - {"id": 8790, "synset": "ladies'_room.n.01", "name": "ladies'_room"}, - {"id": 8791, "synset": "lady_chapel.n.01", "name": "lady_chapel"}, - {"id": 8792, "synset": "lagerphone.n.01", "name": "lagerphone"}, - {"id": 8793, "synset": "lag_screw.n.01", "name": "lag_screw"}, - {"id": 8794, "synset": "lake_dwelling.n.01", "name": "lake_dwelling"}, - {"id": 8795, "synset": "lally.n.01", "name": "lally"}, - {"id": 8796, "synset": "lamasery.n.01", "name": "lamasery"}, - {"id": 8797, "synset": "lambrequin.n.02", "name": "lambrequin"}, - {"id": 8798, "synset": "lame.n.02", "name": "lame"}, - {"id": 8799, "synset": "laminar_flow_clean_room.n.01", "name": "laminar_flow_clean_room"}, - {"id": 8800, "synset": "laminate.n.01", "name": "laminate"}, - {"id": 8801, "synset": "lamination.n.01", "name": "lamination"}, - {"id": 8802, "synset": "lamp.n.01", "name": "lamp"}, - {"id": 8803, "synset": "lamp_house.n.01", "name": "lamp_house"}, - {"id": 8804, "synset": "lanai.n.02", "name": "lanai"}, - {"id": 8805, "synset": "lancet_arch.n.01", "name": "lancet_arch"}, - {"id": 8806, "synset": "lancet_window.n.01", "name": "lancet_window"}, - {"id": 8807, "synset": "landau.n.02", "name": "landau"}, - {"id": 8808, "synset": "lander.n.02", "name": "lander"}, - {"id": 8809, "synset": "landing_craft.n.01", "name": "landing_craft"}, - {"id": 8810, "synset": "landing_flap.n.01", "name": "landing_flap"}, - {"id": 8811, "synset": "landing_gear.n.01", "name": "landing_gear"}, - {"id": 8812, "synset": "landing_net.n.01", "name": "landing_net"}, - {"id": 8813, "synset": "landing_skid.n.01", "name": "landing_skid"}, - {"id": 8814, "synset": "land_line.n.01", "name": "land_line"}, - {"id": 8815, "synset": "land_mine.n.01", "name": "land_mine"}, - {"id": 8816, "synset": "land_office.n.01", "name": "land_office"}, - {"id": 8817, "synset": "lanolin.n.02", "name": "lanolin"}, - {"id": 8818, "synset": "lanyard.n.01", "name": "lanyard"}, - {"id": 8819, "synset": "lap.n.03", "name": "lap"}, - {"id": 8820, "synset": "laparoscope.n.01", "name": "laparoscope"}, - {"id": 8821, "synset": "lapboard.n.01", "name": "lapboard"}, - {"id": 8822, "synset": "lapel.n.01", "name": "lapel"}, - {"id": 8823, "synset": "lap_joint.n.01", "name": "lap_joint"}, - {"id": 8824, "synset": "laryngoscope.n.01", "name": "laryngoscope"}, - {"id": 8825, "synset": "laser.n.01", "name": "laser"}, - {"id": 8826, "synset": "laser-guided_bomb.n.01", "name": "laser-guided_bomb"}, - {"id": 8827, "synset": "laser_printer.n.01", "name": "laser_printer"}, - {"id": 8828, "synset": "lash.n.02", "name": "lash"}, - {"id": 8829, "synset": "lashing.n.02", "name": "lashing"}, - {"id": 8830, "synset": "lasso.n.02", "name": "lasso"}, - {"id": 8831, "synset": "latch.n.01", "name": "latch"}, - {"id": 8832, "synset": "latchet.n.01", "name": "latchet"}, - {"id": 8833, "synset": "latchkey.n.01", "name": "latchkey"}, - {"id": 8834, "synset": "lateen.n.01", "name": "lateen"}, - {"id": 8835, "synset": "latex_paint.n.01", "name": "latex_paint"}, - {"id": 8836, "synset": "lath.n.01", "name": "lath"}, - {"id": 8837, "synset": "lathe.n.01", "name": "lathe"}, - {"id": 8838, "synset": "latrine.n.01", "name": "latrine"}, - {"id": 8839, "synset": "lattice.n.03", "name": "lattice"}, - {"id": 8840, "synset": "launch.n.01", "name": "launch"}, - {"id": 8841, "synset": "launcher.n.01", "name": "launcher"}, - {"id": 8842, "synset": "laundry.n.01", "name": "laundry"}, - {"id": 8843, "synset": "laundry_cart.n.01", "name": "laundry_cart"}, - {"id": 8844, "synset": "laundry_truck.n.01", "name": "laundry_truck"}, - {"id": 8845, "synset": "lavalava.n.01", "name": "lavalava"}, - {"id": 8846, "synset": "lavaliere.n.01", "name": "lavaliere"}, - {"id": 8847, "synset": "laver.n.02", "name": "laver"}, - {"id": 8848, "synset": "lawn_chair.n.01", "name": "lawn_chair"}, - {"id": 8849, "synset": "lawn_furniture.n.01", "name": "lawn_furniture"}, - {"id": 8850, "synset": "layette.n.01", "name": "layette"}, - {"id": 8851, "synset": "lead-acid_battery.n.01", "name": "lead-acid_battery"}, - {"id": 8852, "synset": "lead-in.n.02", "name": "lead-in"}, - {"id": 8853, "synset": "leading_rein.n.01", "name": "leading_rein"}, - {"id": 8854, "synset": "lead_pencil.n.01", "name": "lead_pencil"}, - {"id": 8855, "synset": "leaf_spring.n.01", "name": "leaf_spring"}, - {"id": 8856, "synset": "lean-to.n.01", "name": "lean-to"}, - {"id": 8857, "synset": "lean-to_tent.n.01", "name": "lean-to_tent"}, - {"id": 8858, "synset": "leash.n.01", "name": "leash"}, - {"id": 8859, "synset": "leatherette.n.01", "name": "leatherette"}, - {"id": 8860, "synset": "leather_strip.n.01", "name": "leather_strip"}, - {"id": 8861, "synset": "leclanche_cell.n.01", "name": "Leclanche_cell"}, - {"id": 8862, "synset": "lectern.n.01", "name": "lectern"}, - {"id": 8863, "synset": "lecture_room.n.01", "name": "lecture_room"}, - {"id": 8864, "synset": "lederhosen.n.01", "name": "lederhosen"}, - {"id": 8865, "synset": "ledger_board.n.01", "name": "ledger_board"}, - {"id": 8866, "synset": "leg.n.07", "name": "leg"}, - {"id": 8867, "synset": "leg.n.03", "name": "leg"}, - {"id": 8868, "synset": "leiden_jar.n.01", "name": "Leiden_jar"}, - {"id": 8869, "synset": "leisure_wear.n.01", "name": "leisure_wear"}, - {"id": 8870, "synset": "lens.n.01", "name": "lens"}, - {"id": 8871, "synset": "lens.n.05", "name": "lens"}, - {"id": 8872, "synset": "lens_cap.n.01", "name": "lens_cap"}, - {"id": 8873, "synset": "lens_implant.n.01", "name": "lens_implant"}, - {"id": 8874, "synset": "leotard.n.01", "name": "leotard"}, - {"id": 8875, "synset": "letter_case.n.01", "name": "letter_case"}, - {"id": 8876, "synset": "letter_opener.n.01", "name": "letter_opener"}, - {"id": 8877, "synset": "levee.n.03", "name": "levee"}, - {"id": 8878, "synset": "level.n.05", "name": "level"}, - {"id": 8879, "synset": "lever.n.01", "name": "lever"}, - {"id": 8880, "synset": "lever.n.03", "name": "lever"}, - {"id": 8881, "synset": "lever.n.02", "name": "lever"}, - {"id": 8882, "synset": "lever_lock.n.01", "name": "lever_lock"}, - {"id": 8883, "synset": "levi's.n.01", "name": "Levi's"}, - {"id": 8884, "synset": "liberty_ship.n.01", "name": "Liberty_ship"}, - {"id": 8885, "synset": "library.n.01", "name": "library"}, - {"id": 8886, "synset": "library.n.05", "name": "library"}, - {"id": 8887, "synset": "lid.n.02", "name": "lid"}, - {"id": 8888, "synset": "liebig_condenser.n.01", "name": "Liebig_condenser"}, - {"id": 8889, "synset": "lie_detector.n.01", "name": "lie_detector"}, - {"id": 8890, "synset": "lifeboat.n.01", "name": "lifeboat"}, - {"id": 8891, "synset": "life_office.n.01", "name": "life_office"}, - {"id": 8892, "synset": "life_preserver.n.01", "name": "life_preserver"}, - {"id": 8893, "synset": "life-support_system.n.02", "name": "life-support_system"}, - {"id": 8894, "synset": "life-support_system.n.01", "name": "life-support_system"}, - {"id": 8895, "synset": "lifting_device.n.01", "name": "lifting_device"}, - {"id": 8896, "synset": "lift_pump.n.01", "name": "lift_pump"}, - {"id": 8897, "synset": "ligament.n.02", "name": "ligament"}, - {"id": 8898, "synset": "ligature.n.03", "name": "ligature"}, - {"id": 8899, "synset": "light.n.02", "name": "light"}, - {"id": 8900, "synset": "light_arm.n.01", "name": "light_arm"}, - {"id": 8901, "synset": "light_circuit.n.01", "name": "light_circuit"}, - {"id": 8902, "synset": "light-emitting_diode.n.01", "name": "light-emitting_diode"}, - {"id": 8903, "synset": "lighter.n.02", "name": "lighter"}, - {"id": 8904, "synset": "lighter-than-air_craft.n.01", "name": "lighter-than-air_craft"}, - {"id": 8905, "synset": "light_filter.n.01", "name": "light_filter"}, - {"id": 8906, "synset": "lighting.n.02", "name": "lighting"}, - {"id": 8907, "synset": "light_machine_gun.n.01", "name": "light_machine_gun"}, - {"id": 8908, "synset": "light_meter.n.01", "name": "light_meter"}, - {"id": 8909, "synset": "light_microscope.n.01", "name": "light_microscope"}, - {"id": 8910, "synset": "light_pen.n.01", "name": "light_pen"}, - {"id": 8911, "synset": "lightship.n.01", "name": "lightship"}, - {"id": 8912, "synset": "lilo.n.01", "name": "Lilo"}, - {"id": 8913, "synset": "limber.n.01", "name": "limber"}, - {"id": 8914, "synset": "limekiln.n.01", "name": "limekiln"}, - {"id": 8915, "synset": "limiter.n.01", "name": "limiter"}, - {"id": 8916, "synset": "linear_accelerator.n.01", "name": "linear_accelerator"}, - {"id": 8917, "synset": "linen.n.01", "name": "linen"}, - {"id": 8918, "synset": "line_printer.n.01", "name": "line_printer"}, - {"id": 8919, "synset": "liner.n.04", "name": "liner"}, - {"id": 8920, "synset": "liner.n.03", "name": "liner"}, - {"id": 8921, "synset": "lingerie.n.01", "name": "lingerie"}, - {"id": 8922, "synset": "lining.n.01", "name": "lining"}, - {"id": 8923, "synset": "link.n.09", "name": "link"}, - {"id": 8924, "synset": "linkage.n.03", "name": "linkage"}, - {"id": 8925, "synset": "link_trainer.n.01", "name": "Link_trainer"}, - {"id": 8926, "synset": "linocut.n.02", "name": "linocut"}, - {"id": 8927, "synset": "linoleum_knife.n.01", "name": "linoleum_knife"}, - {"id": 8928, "synset": "linotype.n.01", "name": "Linotype"}, - {"id": 8929, "synset": "linsey-woolsey.n.01", "name": "linsey-woolsey"}, - {"id": 8930, "synset": "linstock.n.01", "name": "linstock"}, - {"id": 8931, "synset": "lion-jaw_forceps.n.01", "name": "lion-jaw_forceps"}, - {"id": 8932, "synset": "lip-gloss.n.01", "name": "lip-gloss"}, - {"id": 8933, "synset": "lipstick.n.01", "name": "lipstick"}, - {"id": 8934, "synset": "liqueur_glass.n.01", "name": "liqueur_glass"}, - {"id": 8935, "synset": "liquid_crystal_display.n.01", "name": "liquid_crystal_display"}, - {"id": 8936, "synset": "liquid_metal_reactor.n.01", "name": "liquid_metal_reactor"}, - {"id": 8937, "synset": "lisle.n.01", "name": "lisle"}, - {"id": 8938, "synset": "lister.n.03", "name": "lister"}, - {"id": 8939, "synset": "litterbin.n.01", "name": "litterbin"}, - {"id": 8940, "synset": "little_theater.n.01", "name": "little_theater"}, - {"id": 8941, "synset": "live_axle.n.01", "name": "live_axle"}, - {"id": 8942, "synset": "living_quarters.n.01", "name": "living_quarters"}, - {"id": 8943, "synset": "living_room.n.01", "name": "living_room"}, - {"id": 8944, "synset": "load.n.09", "name": "load"}, - {"id": 8945, "synset": "loafer.n.02", "name": "Loafer"}, - {"id": 8946, "synset": "loaner.n.02", "name": "loaner"}, - {"id": 8947, "synset": "lobe.n.04", "name": "lobe"}, - {"id": 8948, "synset": "lobster_pot.n.01", "name": "lobster_pot"}, - {"id": 8949, "synset": "local.n.01", "name": "local"}, - {"id": 8950, "synset": "local_area_network.n.01", "name": "local_area_network"}, - {"id": 8951, "synset": "local_oscillator.n.01", "name": "local_oscillator"}, - {"id": 8952, "synset": "lochaber_ax.n.01", "name": "Lochaber_ax"}, - {"id": 8953, "synset": "lock.n.01", "name": "lock"}, - {"id": 8954, "synset": "lock.n.05", "name": "lock"}, - {"id": 8955, "synset": "lock.n.04", "name": "lock"}, - {"id": 8956, "synset": "lock.n.03", "name": "lock"}, - {"id": 8957, "synset": "lockage.n.02", "name": "lockage"}, - {"id": 8958, "synset": "locker.n.02", "name": "locker"}, - {"id": 8959, "synset": "locker_room.n.01", "name": "locker_room"}, - {"id": 8960, "synset": "locket.n.01", "name": "locket"}, - {"id": 8961, "synset": "lock-gate.n.01", "name": "lock-gate"}, - {"id": 8962, "synset": "locking_pliers.n.01", "name": "locking_pliers"}, - {"id": 8963, "synset": "lockring.n.01", "name": "lockring"}, - {"id": 8964, "synset": "lockstitch.n.01", "name": "lockstitch"}, - {"id": 8965, "synset": "lockup.n.01", "name": "lockup"}, - {"id": 8966, "synset": "locomotive.n.01", "name": "locomotive"}, - {"id": 8967, "synset": "lodge.n.05", "name": "lodge"}, - {"id": 8968, "synset": "lodge.n.04", "name": "lodge"}, - {"id": 8969, "synset": "lodge.n.03", "name": "lodge"}, - {"id": 8970, "synset": "lodging_house.n.01", "name": "lodging_house"}, - {"id": 8971, "synset": "loft.n.02", "name": "loft"}, - {"id": 8972, "synset": "loft.n.04", "name": "loft"}, - {"id": 8973, "synset": "loft.n.01", "name": "loft"}, - {"id": 8974, "synset": "log_cabin.n.01", "name": "log_cabin"}, - {"id": 8975, "synset": "loggia.n.01", "name": "loggia"}, - {"id": 8976, "synset": "longbow.n.01", "name": "longbow"}, - {"id": 8977, "synset": "long_iron.n.01", "name": "long_iron"}, - {"id": 8978, "synset": "long_johns.n.01", "name": "long_johns"}, - {"id": 8979, "synset": "long_sleeve.n.01", "name": "long_sleeve"}, - {"id": 8980, "synset": "long_tom.n.01", "name": "long_tom"}, - {"id": 8981, "synset": "long_trousers.n.01", "name": "long_trousers"}, - {"id": 8982, "synset": "long_underwear.n.01", "name": "long_underwear"}, - {"id": 8983, "synset": "looking_glass.n.01", "name": "looking_glass"}, - {"id": 8984, "synset": "lookout.n.03", "name": "lookout"}, - {"id": 8985, "synset": "loom.n.01", "name": "loom"}, - {"id": 8986, "synset": "loop_knot.n.01", "name": "loop_knot"}, - {"id": 8987, "synset": "lorgnette.n.01", "name": "lorgnette"}, - {"id": 8988, "synset": "lorraine_cross.n.01", "name": "Lorraine_cross"}, - {"id": 8989, "synset": "lorry.n.02", "name": "lorry"}, - {"id": 8990, "synset": "lota.n.01", "name": "lota"}, - {"id": 8991, "synset": "lotion.n.01", "name": "lotion"}, - {"id": 8992, "synset": "lounge.n.02", "name": "lounge"}, - {"id": 8993, "synset": "lounger.n.03", "name": "lounger"}, - {"id": 8994, "synset": "lounging_jacket.n.01", "name": "lounging_jacket"}, - {"id": 8995, "synset": "lounging_pajama.n.01", "name": "lounging_pajama"}, - {"id": 8996, "synset": "loungewear.n.01", "name": "loungewear"}, - {"id": 8997, "synset": "loupe.n.01", "name": "loupe"}, - {"id": 8998, "synset": "louvered_window.n.01", "name": "louvered_window"}, - {"id": 8999, "synset": "love_knot.n.01", "name": "love_knot"}, - {"id": 9000, "synset": "loving_cup.n.01", "name": "loving_cup"}, - {"id": 9001, "synset": "lowboy.n.01", "name": "lowboy"}, - {"id": 9002, "synset": "low-pass_filter.n.01", "name": "low-pass_filter"}, - {"id": 9003, "synset": "low-warp-loom.n.01", "name": "low-warp-loom"}, - {"id": 9004, "synset": "lp.n.01", "name": "LP"}, - {"id": 9005, "synset": "l-plate.n.01", "name": "L-plate"}, - {"id": 9006, "synset": "lubber's_hole.n.01", "name": "lubber's_hole"}, - {"id": 9007, "synset": "lubricating_system.n.01", "name": "lubricating_system"}, - {"id": 9008, "synset": "luff.n.01", "name": "luff"}, - {"id": 9009, "synset": "lug.n.03", "name": "lug"}, - {"id": 9010, "synset": "luge.n.01", "name": "luge"}, - {"id": 9011, "synset": "luger.n.01", "name": "Luger"}, - {"id": 9012, "synset": "luggage_carrier.n.01", "name": "luggage_carrier"}, - {"id": 9013, "synset": "luggage_compartment.n.01", "name": "luggage_compartment"}, - {"id": 9014, "synset": "luggage_rack.n.01", "name": "luggage_rack"}, - {"id": 9015, "synset": "lugger.n.01", "name": "lugger"}, - {"id": 9016, "synset": "lugsail.n.01", "name": "lugsail"}, - {"id": 9017, "synset": "lug_wrench.n.01", "name": "lug_wrench"}, - {"id": 9018, "synset": "lumberjack.n.02", "name": "lumberjack"}, - {"id": 9019, "synset": "lumbermill.n.01", "name": "lumbermill"}, - {"id": 9020, "synset": "lunar_excursion_module.n.01", "name": "lunar_excursion_module"}, - {"id": 9021, "synset": "lunchroom.n.01", "name": "lunchroom"}, - {"id": 9022, "synset": "lunette.n.01", "name": "lunette"}, - {"id": 9023, "synset": "lungi.n.01", "name": "lungi"}, - {"id": 9024, "synset": "lunula.n.02", "name": "lunula"}, - {"id": 9025, "synset": "lusterware.n.01", "name": "lusterware"}, - {"id": 9026, "synset": "lute.n.02", "name": "lute"}, - {"id": 9027, "synset": "luxury_liner.n.01", "name": "luxury_liner"}, - {"id": 9028, "synset": "lyceum.n.02", "name": "lyceum"}, - {"id": 9029, "synset": "lychgate.n.01", "name": "lychgate"}, - {"id": 9030, "synset": "lyre.n.01", "name": "lyre"}, - {"id": 9031, "synset": "machete.n.01", "name": "machete"}, - {"id": 9032, "synset": "machicolation.n.01", "name": "machicolation"}, - {"id": 9033, "synset": "machine.n.01", "name": "machine"}, - {"id": 9034, "synset": "machine.n.04", "name": "machine"}, - {"id": 9035, "synset": "machine_bolt.n.01", "name": "machine_bolt"}, - {"id": 9036, "synset": "machinery.n.01", "name": "machinery"}, - {"id": 9037, "synset": "machine_screw.n.01", "name": "machine_screw"}, - {"id": 9038, "synset": "machine_tool.n.01", "name": "machine_tool"}, - {"id": 9039, "synset": "machinist's_vise.n.01", "name": "machinist's_vise"}, - {"id": 9040, "synset": "machmeter.n.01", "name": "machmeter"}, - {"id": 9041, "synset": "mackinaw.n.04", "name": "mackinaw"}, - {"id": 9042, "synset": "mackinaw.n.03", "name": "mackinaw"}, - {"id": 9043, "synset": "mackinaw.n.01", "name": "mackinaw"}, - {"id": 9044, "synset": "mackintosh.n.01", "name": "mackintosh"}, - {"id": 9045, "synset": "macrame.n.01", "name": "macrame"}, - {"id": 9046, "synset": "madras.n.03", "name": "madras"}, - {"id": 9047, "synset": "mae_west.n.02", "name": "Mae_West"}, - {"id": 9048, "synset": "magazine_rack.n.01", "name": "magazine_rack"}, - {"id": 9049, "synset": "magic_lantern.n.01", "name": "magic_lantern"}, - {"id": 9050, "synset": "magnetic_bottle.n.01", "name": "magnetic_bottle"}, - {"id": 9051, "synset": "magnetic_compass.n.01", "name": "magnetic_compass"}, - {"id": 9052, "synset": "magnetic_core_memory.n.01", "name": "magnetic_core_memory"}, - {"id": 9053, "synset": "magnetic_disk.n.01", "name": "magnetic_disk"}, - {"id": 9054, "synset": "magnetic_head.n.01", "name": "magnetic_head"}, - {"id": 9055, "synset": "magnetic_mine.n.01", "name": "magnetic_mine"}, - {"id": 9056, "synset": "magnetic_needle.n.01", "name": "magnetic_needle"}, - {"id": 9057, "synset": "magnetic_recorder.n.01", "name": "magnetic_recorder"}, - {"id": 9058, "synset": "magnetic_stripe.n.01", "name": "magnetic_stripe"}, - {"id": 9059, "synset": "magnetic_tape.n.01", "name": "magnetic_tape"}, - {"id": 9060, "synset": "magneto.n.01", "name": "magneto"}, - {"id": 9061, "synset": "magnetometer.n.01", "name": "magnetometer"}, - {"id": 9062, "synset": "magnetron.n.01", "name": "magnetron"}, - {"id": 9063, "synset": "magnifier.n.01", "name": "magnifier"}, - {"id": 9064, "synset": "magnum.n.01", "name": "magnum"}, - {"id": 9065, "synset": "magnus_hitch.n.01", "name": "magnus_hitch"}, - {"id": 9066, "synset": "mail.n.03", "name": "mail"}, - {"id": 9067, "synset": "mailbag.n.02", "name": "mailbag"}, - {"id": 9068, "synset": "mailbag.n.01", "name": "mailbag"}, - {"id": 9069, "synset": "mailboat.n.01", "name": "mailboat"}, - {"id": 9070, "synset": "mail_car.n.01", "name": "mail_car"}, - {"id": 9071, "synset": "maildrop.n.01", "name": "maildrop"}, - {"id": 9072, "synset": "mailer.n.04", "name": "mailer"}, - {"id": 9073, "synset": "maillot.n.02", "name": "maillot"}, - {"id": 9074, "synset": "maillot.n.01", "name": "maillot"}, - {"id": 9075, "synset": "mailsorter.n.01", "name": "mailsorter"}, - {"id": 9076, "synset": "mail_train.n.01", "name": "mail_train"}, - {"id": 9077, "synset": "mainframe.n.01", "name": "mainframe"}, - {"id": 9078, "synset": "mainmast.n.01", "name": "mainmast"}, - {"id": 9079, "synset": "main_rotor.n.01", "name": "main_rotor"}, - {"id": 9080, "synset": "mainsail.n.01", "name": "mainsail"}, - {"id": 9081, "synset": "mainspring.n.01", "name": "mainspring"}, - {"id": 9082, "synset": "main-topmast.n.01", "name": "main-topmast"}, - {"id": 9083, "synset": "main-topsail.n.01", "name": "main-topsail"}, - {"id": 9084, "synset": "main_yard.n.01", "name": "main_yard"}, - {"id": 9085, "synset": "maisonette.n.02", "name": "maisonette"}, - {"id": 9086, "synset": "majolica.n.01", "name": "majolica"}, - {"id": 9087, "synset": "makeup.n.01", "name": "makeup"}, - {"id": 9088, "synset": "maksutov_telescope.n.01", "name": "Maksutov_telescope"}, - {"id": 9089, "synset": "malacca.n.02", "name": "malacca"}, - {"id": 9090, "synset": "mallet.n.03", "name": "mallet"}, - {"id": 9091, "synset": "mallet.n.02", "name": "mallet"}, - {"id": 9092, "synset": "mammogram.n.01", "name": "mammogram"}, - {"id": 9093, "synset": "mandola.n.01", "name": "mandola"}, - {"id": 9094, "synset": "mandolin.n.01", "name": "mandolin"}, - {"id": 9095, "synset": "mangle.n.01", "name": "mangle"}, - {"id": 9096, "synset": "manhole_cover.n.01", "name": "manhole_cover"}, - {"id": 9097, "synset": "man-of-war.n.01", "name": "man-of-war"}, - {"id": 9098, "synset": "manometer.n.01", "name": "manometer"}, - {"id": 9099, "synset": "manor.n.01", "name": "manor"}, - {"id": 9100, "synset": "manor_hall.n.01", "name": "manor_hall"}, - {"id": 9101, "synset": "manpad.n.01", "name": "MANPAD"}, - {"id": 9102, "synset": "mansard.n.01", "name": "mansard"}, - {"id": 9103, "synset": "manse.n.02", "name": "manse"}, - {"id": 9104, "synset": "mansion.n.02", "name": "mansion"}, - {"id": 9105, "synset": "mantel.n.01", "name": "mantel"}, - {"id": 9106, "synset": "mantelet.n.02", "name": "mantelet"}, - {"id": 9107, "synset": "mantilla.n.01", "name": "mantilla"}, - {"id": 9108, "synset": "mao_jacket.n.01", "name": "Mao_jacket"}, - {"id": 9109, "synset": "maquiladora.n.01", "name": "maquiladora"}, - {"id": 9110, "synset": "maraca.n.01", "name": "maraca"}, - {"id": 9111, "synset": "marble.n.02", "name": "marble"}, - {"id": 9112, "synset": "marching_order.n.01", "name": "marching_order"}, - {"id": 9113, "synset": "marimba.n.01", "name": "marimba"}, - {"id": 9114, "synset": "marina.n.01", "name": "marina"}, - {"id": 9115, "synset": "marketplace.n.02", "name": "marketplace"}, - {"id": 9116, "synset": "marlinespike.n.01", "name": "marlinespike"}, - {"id": 9117, "synset": "marocain.n.01", "name": "marocain"}, - {"id": 9118, "synset": "marquee.n.02", "name": "marquee"}, - {"id": 9119, "synset": "marquetry.n.01", "name": "marquetry"}, - {"id": 9120, "synset": "marriage_bed.n.01", "name": "marriage_bed"}, - {"id": 9121, "synset": "martello_tower.n.01", "name": "martello_tower"}, - {"id": 9122, "synset": "martingale.n.01", "name": "martingale"}, - {"id": 9123, "synset": "mascara.n.01", "name": "mascara"}, - {"id": 9124, "synset": "maser.n.01", "name": "maser"}, - {"id": 9125, "synset": "mashie.n.01", "name": "mashie"}, - {"id": 9126, "synset": "mashie_niblick.n.01", "name": "mashie_niblick"}, - {"id": 9127, "synset": "masjid.n.01", "name": "masjid"}, - {"id": 9128, "synset": "mask.n.01", "name": "mask"}, - {"id": 9129, "synset": "masonite.n.01", "name": "Masonite"}, - {"id": 9130, "synset": "mason_jar.n.01", "name": "Mason_jar"}, - {"id": 9131, "synset": "masonry.n.01", "name": "masonry"}, - {"id": 9132, "synset": "mason's_level.n.01", "name": "mason's_level"}, - {"id": 9133, "synset": "massage_parlor.n.02", "name": "massage_parlor"}, - {"id": 9134, "synset": "massage_parlor.n.01", "name": "massage_parlor"}, - {"id": 9135, "synset": "mass_spectrograph.n.01", "name": "mass_spectrograph"}, - {"id": 9136, "synset": "mass_spectrometer.n.01", "name": "mass_spectrometer"}, - {"id": 9137, "synset": "mast.n.04", "name": "mast"}, - {"id": 9138, "synset": "mastaba.n.01", "name": "mastaba"}, - {"id": 9139, "synset": "master_bedroom.n.01", "name": "master_bedroom"}, - {"id": 9140, "synset": "masterpiece.n.01", "name": "masterpiece"}, - {"id": 9141, "synset": "mat.n.01", "name": "mat"}, - {"id": 9142, "synset": "match.n.01", "name": "match"}, - {"id": 9143, "synset": "match.n.03", "name": "match"}, - {"id": 9144, "synset": "matchboard.n.01", "name": "matchboard"}, - {"id": 9145, "synset": "matchbook.n.01", "name": "matchbook"}, - {"id": 9146, "synset": "matchlock.n.01", "name": "matchlock"}, - {"id": 9147, "synset": "match_plane.n.01", "name": "match_plane"}, - {"id": 9148, "synset": "matchstick.n.01", "name": "matchstick"}, - {"id": 9149, "synset": "material.n.04", "name": "material"}, - {"id": 9150, "synset": "materiel.n.01", "name": "materiel"}, - {"id": 9151, "synset": "maternity_hospital.n.01", "name": "maternity_hospital"}, - {"id": 9152, "synset": "maternity_ward.n.01", "name": "maternity_ward"}, - {"id": 9153, "synset": "matrix.n.06", "name": "matrix"}, - {"id": 9154, "synset": "matthew_walker.n.01", "name": "Matthew_Walker"}, - {"id": 9155, "synset": "matting.n.01", "name": "matting"}, - {"id": 9156, "synset": "mattock.n.01", "name": "mattock"}, - {"id": 9157, "synset": "mattress_cover.n.01", "name": "mattress_cover"}, - {"id": 9158, "synset": "maul.n.01", "name": "maul"}, - {"id": 9159, "synset": "maulstick.n.01", "name": "maulstick"}, - {"id": 9160, "synset": "mauser.n.02", "name": "Mauser"}, - {"id": 9161, "synset": "mausoleum.n.01", "name": "mausoleum"}, - {"id": 9162, "synset": "maxi.n.01", "name": "maxi"}, - {"id": 9163, "synset": "maxim_gun.n.01", "name": "Maxim_gun"}, - { - "id": 9164, - "synset": "maximum_and_minimum_thermometer.n.01", - "name": "maximum_and_minimum_thermometer", - }, - {"id": 9165, "synset": "maypole.n.01", "name": "maypole"}, - {"id": 9166, "synset": "maze.n.01", "name": "maze"}, - {"id": 9167, "synset": "mazer.n.01", "name": "mazer"}, - {"id": 9168, "synset": "means.n.02", "name": "means"}, - {"id": 9169, "synset": "measure.n.09", "name": "measure"}, - {"id": 9170, "synset": "measuring_instrument.n.01", "name": "measuring_instrument"}, - {"id": 9171, "synset": "meat_counter.n.01", "name": "meat_counter"}, - {"id": 9172, "synset": "meat_grinder.n.01", "name": "meat_grinder"}, - {"id": 9173, "synset": "meat_hook.n.01", "name": "meat_hook"}, - {"id": 9174, "synset": "meat_house.n.02", "name": "meat_house"}, - {"id": 9175, "synset": "meat_safe.n.01", "name": "meat_safe"}, - {"id": 9176, "synset": "meat_thermometer.n.01", "name": "meat_thermometer"}, - {"id": 9177, "synset": "mechanical_device.n.01", "name": "mechanical_device"}, - {"id": 9178, "synset": "mechanical_piano.n.01", "name": "mechanical_piano"}, - {"id": 9179, "synset": "mechanical_system.n.01", "name": "mechanical_system"}, - {"id": 9180, "synset": "mechanism.n.05", "name": "mechanism"}, - {"id": 9181, "synset": "medical_building.n.01", "name": "medical_building"}, - {"id": 9182, "synset": "medical_instrument.n.01", "name": "medical_instrument"}, - {"id": 9183, "synset": "medicine_ball.n.01", "name": "medicine_ball"}, - {"id": 9184, "synset": "medicine_chest.n.01", "name": "medicine_chest"}, - {"id": 9185, "synset": "medline.n.01", "name": "MEDLINE"}, - {"id": 9186, "synset": "megalith.n.01", "name": "megalith"}, - {"id": 9187, "synset": "megaphone.n.01", "name": "megaphone"}, - {"id": 9188, "synset": "memorial.n.03", "name": "memorial"}, - {"id": 9189, "synset": "memory.n.04", "name": "memory"}, - {"id": 9190, "synset": "memory_chip.n.01", "name": "memory_chip"}, - {"id": 9191, "synset": "memory_device.n.01", "name": "memory_device"}, - {"id": 9192, "synset": "menagerie.n.02", "name": "menagerie"}, - {"id": 9193, "synset": "mending.n.01", "name": "mending"}, - {"id": 9194, "synset": "menhir.n.01", "name": "menhir"}, - {"id": 9195, "synset": "menorah.n.02", "name": "menorah"}, - {"id": 9196, "synset": "menorah.n.01", "name": "Menorah"}, - {"id": 9197, "synset": "man's_clothing.n.01", "name": "man's_clothing"}, - {"id": 9198, "synset": "men's_room.n.01", "name": "men's_room"}, - {"id": 9199, "synset": "mercantile_establishment.n.01", "name": "mercantile_establishment"}, - {"id": 9200, "synset": "mercury_barometer.n.01", "name": "mercury_barometer"}, - {"id": 9201, "synset": "mercury_cell.n.01", "name": "mercury_cell"}, - {"id": 9202, "synset": "mercury_thermometer.n.01", "name": "mercury_thermometer"}, - {"id": 9203, "synset": "mercury-vapor_lamp.n.01", "name": "mercury-vapor_lamp"}, - {"id": 9204, "synset": "mercy_seat.n.02", "name": "mercy_seat"}, - {"id": 9205, "synset": "merlon.n.01", "name": "merlon"}, - {"id": 9206, "synset": "mess.n.05", "name": "mess"}, - {"id": 9207, "synset": "mess_jacket.n.01", "name": "mess_jacket"}, - {"id": 9208, "synset": "mess_kit.n.01", "name": "mess_kit"}, - {"id": 9209, "synset": "messuage.n.01", "name": "messuage"}, - {"id": 9210, "synset": "metal_detector.n.01", "name": "metal_detector"}, - {"id": 9211, "synset": "metallic.n.01", "name": "metallic"}, - {"id": 9212, "synset": "metal_screw.n.01", "name": "metal_screw"}, - {"id": 9213, "synset": "metal_wood.n.01", "name": "metal_wood"}, - {"id": 9214, "synset": "meteorological_balloon.n.01", "name": "meteorological_balloon"}, - {"id": 9215, "synset": "meter.n.02", "name": "meter"}, - {"id": 9216, "synset": "meterstick.n.01", "name": "meterstick"}, - {"id": 9217, "synset": "metronome.n.01", "name": "metronome"}, - {"id": 9218, "synset": "mezzanine.n.02", "name": "mezzanine"}, - {"id": 9219, "synset": "mezzanine.n.01", "name": "mezzanine"}, - {"id": 9220, "synset": "microbalance.n.01", "name": "microbalance"}, - {"id": 9221, "synset": "microbrewery.n.01", "name": "microbrewery"}, - {"id": 9222, "synset": "microfiche.n.01", "name": "microfiche"}, - {"id": 9223, "synset": "microfilm.n.01", "name": "microfilm"}, - {"id": 9224, "synset": "micrometer.n.02", "name": "micrometer"}, - {"id": 9225, "synset": "microprocessor.n.01", "name": "microprocessor"}, - {"id": 9226, "synset": "microtome.n.01", "name": "microtome"}, - { - "id": 9227, - "synset": "microwave_diathermy_machine.n.01", - "name": "microwave_diathermy_machine", - }, - { - "id": 9228, - "synset": "microwave_linear_accelerator.n.01", - "name": "microwave_linear_accelerator", - }, - {"id": 9229, "synset": "middy.n.01", "name": "middy"}, - {"id": 9230, "synset": "midiron.n.01", "name": "midiron"}, - {"id": 9231, "synset": "mihrab.n.02", "name": "mihrab"}, - {"id": 9232, "synset": "mihrab.n.01", "name": "mihrab"}, - {"id": 9233, "synset": "military_hospital.n.01", "name": "military_hospital"}, - {"id": 9234, "synset": "military_quarters.n.01", "name": "military_quarters"}, - {"id": 9235, "synset": "military_uniform.n.01", "name": "military_uniform"}, - {"id": 9236, "synset": "military_vehicle.n.01", "name": "military_vehicle"}, - {"id": 9237, "synset": "milk_bar.n.01", "name": "milk_bar"}, - {"id": 9238, "synset": "milk_float.n.01", "name": "milk_float"}, - {"id": 9239, "synset": "milking_machine.n.01", "name": "milking_machine"}, - {"id": 9240, "synset": "milking_stool.n.01", "name": "milking_stool"}, - {"id": 9241, "synset": "milk_wagon.n.01", "name": "milk_wagon"}, - {"id": 9242, "synset": "mill.n.04", "name": "mill"}, - {"id": 9243, "synset": "milldam.n.01", "name": "milldam"}, - {"id": 9244, "synset": "miller.n.05", "name": "miller"}, - {"id": 9245, "synset": "milliammeter.n.01", "name": "milliammeter"}, - {"id": 9246, "synset": "millinery.n.02", "name": "millinery"}, - {"id": 9247, "synset": "millinery.n.01", "name": "millinery"}, - {"id": 9248, "synset": "milling.n.01", "name": "milling"}, - {"id": 9249, "synset": "millivoltmeter.n.01", "name": "millivoltmeter"}, - {"id": 9250, "synset": "millstone.n.03", "name": "millstone"}, - {"id": 9251, "synset": "millstone.n.02", "name": "millstone"}, - {"id": 9252, "synset": "millwheel.n.01", "name": "millwheel"}, - {"id": 9253, "synset": "mimeograph.n.01", "name": "mimeograph"}, - {"id": 9254, "synset": "minaret.n.01", "name": "minaret"}, - {"id": 9255, "synset": "mincer.n.01", "name": "mincer"}, - {"id": 9256, "synset": "mine.n.02", "name": "mine"}, - {"id": 9257, "synset": "mine_detector.n.01", "name": "mine_detector"}, - {"id": 9258, "synset": "minelayer.n.01", "name": "minelayer"}, - {"id": 9259, "synset": "mineshaft.n.01", "name": "mineshaft"}, - {"id": 9260, "synset": "minibar.n.01", "name": "minibar"}, - {"id": 9261, "synset": "minibike.n.01", "name": "minibike"}, - {"id": 9262, "synset": "minibus.n.01", "name": "minibus"}, - {"id": 9263, "synset": "minicar.n.01", "name": "minicar"}, - {"id": 9264, "synset": "minicomputer.n.01", "name": "minicomputer"}, - {"id": 9265, "synset": "ministry.n.02", "name": "ministry"}, - {"id": 9266, "synset": "miniskirt.n.01", "name": "miniskirt"}, - {"id": 9267, "synset": "minisub.n.01", "name": "minisub"}, - {"id": 9268, "synset": "miniver.n.01", "name": "miniver"}, - {"id": 9269, "synset": "mink.n.02", "name": "mink"}, - {"id": 9270, "synset": "minster.n.01", "name": "minster"}, - {"id": 9271, "synset": "mint.n.06", "name": "mint"}, - {"id": 9272, "synset": "minute_hand.n.01", "name": "minute_hand"}, - {"id": 9273, "synset": "minuteman.n.02", "name": "Minuteman"}, - {"id": 9274, "synset": "missile.n.01", "name": "missile"}, - {"id": 9275, "synset": "missile_defense_system.n.01", "name": "missile_defense_system"}, - {"id": 9276, "synset": "miter_box.n.01", "name": "miter_box"}, - {"id": 9277, "synset": "miter_joint.n.01", "name": "miter_joint"}, - {"id": 9278, "synset": "mixer.n.03", "name": "mixer"}, - {"id": 9279, "synset": "mixing_bowl.n.01", "name": "mixing_bowl"}, - {"id": 9280, "synset": "mixing_faucet.n.01", "name": "mixing_faucet"}, - {"id": 9281, "synset": "mizzen.n.02", "name": "mizzen"}, - {"id": 9282, "synset": "mizzenmast.n.01", "name": "mizzenmast"}, - {"id": 9283, "synset": "mobcap.n.01", "name": "mobcap"}, - {"id": 9284, "synset": "mobile_home.n.01", "name": "mobile_home"}, - {"id": 9285, "synset": "moccasin.n.01", "name": "moccasin"}, - {"id": 9286, "synset": "mock-up.n.01", "name": "mock-up"}, - {"id": 9287, "synset": "mod_con.n.01", "name": "mod_con"}, - {"id": 9288, "synset": "model_t.n.01", "name": "Model_T"}, - {"id": 9289, "synset": "modem.n.01", "name": "modem"}, - {"id": 9290, "synset": "modillion.n.01", "name": "modillion"}, - {"id": 9291, "synset": "module.n.03", "name": "module"}, - {"id": 9292, "synset": "module.n.02", "name": "module"}, - {"id": 9293, "synset": "mohair.n.01", "name": "mohair"}, - {"id": 9294, "synset": "moire.n.01", "name": "moire"}, - {"id": 9295, "synset": "mold.n.02", "name": "mold"}, - {"id": 9296, "synset": "moldboard.n.01", "name": "moldboard"}, - {"id": 9297, "synset": "moldboard_plow.n.01", "name": "moldboard_plow"}, - {"id": 9298, "synset": "moleskin.n.01", "name": "moleskin"}, - {"id": 9299, "synset": "molotov_cocktail.n.01", "name": "Molotov_cocktail"}, - {"id": 9300, "synset": "monastery.n.01", "name": "monastery"}, - {"id": 9301, "synset": "monastic_habit.n.01", "name": "monastic_habit"}, - {"id": 9302, "synset": "moneybag.n.01", "name": "moneybag"}, - {"id": 9303, "synset": "money_belt.n.01", "name": "money_belt"}, - {"id": 9304, "synset": "monitor.n.06", "name": "monitor"}, - {"id": 9305, "synset": "monitor.n.05", "name": "monitor"}, - {"id": 9306, "synset": "monkey-wrench.n.01", "name": "monkey-wrench"}, - {"id": 9307, "synset": "monk's_cloth.n.01", "name": "monk's_cloth"}, - {"id": 9308, "synset": "monochrome.n.01", "name": "monochrome"}, - {"id": 9309, "synset": "monocle.n.01", "name": "monocle"}, - {"id": 9310, "synset": "monofocal_lens_implant.n.01", "name": "monofocal_lens_implant"}, - {"id": 9311, "synset": "monoplane.n.01", "name": "monoplane"}, - {"id": 9312, "synset": "monotype.n.02", "name": "monotype"}, - {"id": 9313, "synset": "monstrance.n.02", "name": "monstrance"}, - {"id": 9314, "synset": "mooring_tower.n.01", "name": "mooring_tower"}, - {"id": 9315, "synset": "moorish_arch.n.01", "name": "Moorish_arch"}, - {"id": 9316, "synset": "moped.n.01", "name": "moped"}, - {"id": 9317, "synset": "mop_handle.n.01", "name": "mop_handle"}, - {"id": 9318, "synset": "moquette.n.01", "name": "moquette"}, - {"id": 9319, "synset": "morgue.n.01", "name": "morgue"}, - {"id": 9320, "synset": "morion.n.01", "name": "morion"}, - {"id": 9321, "synset": "morning_dress.n.02", "name": "morning_dress"}, - {"id": 9322, "synset": "morning_dress.n.01", "name": "morning_dress"}, - {"id": 9323, "synset": "morning_room.n.01", "name": "morning_room"}, - {"id": 9324, "synset": "morris_chair.n.01", "name": "Morris_chair"}, - {"id": 9325, "synset": "mortar.n.01", "name": "mortar"}, - {"id": 9326, "synset": "mortar.n.03", "name": "mortar"}, - {"id": 9327, "synset": "mortarboard.n.02", "name": "mortarboard"}, - {"id": 9328, "synset": "mortise_joint.n.02", "name": "mortise_joint"}, - {"id": 9329, "synset": "mosaic.n.05", "name": "mosaic"}, - {"id": 9330, "synset": "mosque.n.01", "name": "mosque"}, - {"id": 9331, "synset": "mosquito_net.n.01", "name": "mosquito_net"}, - {"id": 9332, "synset": "motel.n.01", "name": "motel"}, - {"id": 9333, "synset": "motel_room.n.01", "name": "motel_room"}, - {"id": 9334, "synset": "mother_hubbard.n.01", "name": "Mother_Hubbard"}, - {"id": 9335, "synset": "motion-picture_camera.n.01", "name": "motion-picture_camera"}, - {"id": 9336, "synset": "motion-picture_film.n.01", "name": "motion-picture_film"}, - {"id": 9337, "synset": "motley.n.03", "name": "motley"}, - {"id": 9338, "synset": "motley.n.02", "name": "motley"}, - {"id": 9339, "synset": "motorboat.n.01", "name": "motorboat"}, - {"id": 9340, "synset": "motor_hotel.n.01", "name": "motor_hotel"}, - {"id": 9341, "synset": "motorized_wheelchair.n.01", "name": "motorized_wheelchair"}, - {"id": 9342, "synset": "mound.n.04", "name": "mound"}, - {"id": 9343, "synset": "mount.n.04", "name": "mount"}, - {"id": 9344, "synset": "mountain_bike.n.01", "name": "mountain_bike"}, - {"id": 9345, "synset": "mountain_tent.n.01", "name": "mountain_tent"}, - {"id": 9346, "synset": "mouse_button.n.01", "name": "mouse_button"}, - {"id": 9347, "synset": "mousetrap.n.01", "name": "mousetrap"}, - {"id": 9348, "synset": "mousse.n.03", "name": "mousse"}, - {"id": 9349, "synset": "mouthpiece.n.06", "name": "mouthpiece"}, - {"id": 9350, "synset": "mouthpiece.n.02", "name": "mouthpiece"}, - {"id": 9351, "synset": "mouthpiece.n.04", "name": "mouthpiece"}, - {"id": 9352, "synset": "movement.n.10", "name": "movement"}, - {"id": 9353, "synset": "movie_projector.n.01", "name": "movie_projector"}, - {"id": 9354, "synset": "moving-coil_galvanometer.n.01", "name": "moving-coil_galvanometer"}, - {"id": 9355, "synset": "moving_van.n.01", "name": "moving_van"}, - {"id": 9356, "synset": "mud_brick.n.01", "name": "mud_brick"}, - {"id": 9357, "synset": "mudguard.n.01", "name": "mudguard"}, - {"id": 9358, "synset": "mudhif.n.01", "name": "mudhif"}, - {"id": 9359, "synset": "muff.n.01", "name": "muff"}, - {"id": 9360, "synset": "muffle.n.01", "name": "muffle"}, - {"id": 9361, "synset": "muffler.n.02", "name": "muffler"}, - {"id": 9362, "synset": "mufti.n.02", "name": "mufti"}, - {"id": 9363, "synset": "mulch.n.01", "name": "mulch"}, - {"id": 9364, "synset": "mule.n.02", "name": "mule"}, - {"id": 9365, "synset": "multichannel_recorder.n.01", "name": "multichannel_recorder"}, - {"id": 9366, "synset": "multiengine_airplane.n.01", "name": "multiengine_airplane"}, - {"id": 9367, "synset": "multiplex.n.02", "name": "multiplex"}, - {"id": 9368, "synset": "multiplexer.n.01", "name": "multiplexer"}, - {"id": 9369, "synset": "multiprocessor.n.01", "name": "multiprocessor"}, - {"id": 9370, "synset": "multistage_rocket.n.01", "name": "multistage_rocket"}, - {"id": 9371, "synset": "munition.n.02", "name": "munition"}, - {"id": 9372, "synset": "murphy_bed.n.01", "name": "Murphy_bed"}, - {"id": 9373, "synset": "musette.n.01", "name": "musette"}, - {"id": 9374, "synset": "musette_pipe.n.01", "name": "musette_pipe"}, - {"id": 9375, "synset": "museum.n.01", "name": "museum"}, - {"id": 9376, "synset": "mushroom_anchor.n.01", "name": "mushroom_anchor"}, - {"id": 9377, "synset": "music_box.n.01", "name": "music_box"}, - {"id": 9378, "synset": "music_hall.n.01", "name": "music_hall"}, - {"id": 9379, "synset": "music_school.n.02", "name": "music_school"}, - {"id": 9380, "synset": "music_stand.n.01", "name": "music_stand"}, - {"id": 9381, "synset": "musket.n.01", "name": "musket"}, - {"id": 9382, "synset": "musket_ball.n.01", "name": "musket_ball"}, - {"id": 9383, "synset": "muslin.n.01", "name": "muslin"}, - {"id": 9384, "synset": "mustache_cup.n.01", "name": "mustache_cup"}, - {"id": 9385, "synset": "mustard_plaster.n.01", "name": "mustard_plaster"}, - {"id": 9386, "synset": "mute.n.02", "name": "mute"}, - {"id": 9387, "synset": "muzzle_loader.n.01", "name": "muzzle_loader"}, - {"id": 9388, "synset": "muzzle.n.03", "name": "muzzle"}, - {"id": 9389, "synset": "myelogram.n.01", "name": "myelogram"}, - {"id": 9390, "synset": "nacelle.n.01", "name": "nacelle"}, - {"id": 9391, "synset": "nail.n.02", "name": "nail"}, - {"id": 9392, "synset": "nailbrush.n.01", "name": "nailbrush"}, - {"id": 9393, "synset": "nailhead.n.02", "name": "nailhead"}, - {"id": 9394, "synset": "nailhead.n.01", "name": "nailhead"}, - {"id": 9395, "synset": "nail_polish.n.01", "name": "nail_polish"}, - {"id": 9396, "synset": "nainsook.n.01", "name": "nainsook"}, - {"id": 9397, "synset": "napier's_bones.n.01", "name": "Napier's_bones"}, - {"id": 9398, "synset": "nard.n.01", "name": "nard"}, - {"id": 9399, "synset": "narrowbody_aircraft.n.01", "name": "narrowbody_aircraft"}, - {"id": 9400, "synset": "narrow_wale.n.01", "name": "narrow_wale"}, - {"id": 9401, "synset": "narthex.n.02", "name": "narthex"}, - {"id": 9402, "synset": "narthex.n.01", "name": "narthex"}, - {"id": 9403, "synset": "nasotracheal_tube.n.01", "name": "nasotracheal_tube"}, - {"id": 9404, "synset": "national_monument.n.01", "name": "national_monument"}, - {"id": 9405, "synset": "nautilus.n.01", "name": "nautilus"}, - {"id": 9406, "synset": "navigational_system.n.01", "name": "navigational_system"}, - {"id": 9407, "synset": "naval_equipment.n.01", "name": "naval_equipment"}, - {"id": 9408, "synset": "naval_gun.n.01", "name": "naval_gun"}, - {"id": 9409, "synset": "naval_missile.n.01", "name": "naval_missile"}, - {"id": 9410, "synset": "naval_radar.n.01", "name": "naval_radar"}, - {"id": 9411, "synset": "naval_tactical_data_system.n.01", "name": "naval_tactical_data_system"}, - {"id": 9412, "synset": "naval_weaponry.n.01", "name": "naval_weaponry"}, - {"id": 9413, "synset": "nave.n.01", "name": "nave"}, - {"id": 9414, "synset": "navigational_instrument.n.01", "name": "navigational_instrument"}, - {"id": 9415, "synset": "nebuchadnezzar.n.02", "name": "nebuchadnezzar"}, - {"id": 9416, "synset": "neckband.n.01", "name": "neckband"}, - {"id": 9417, "synset": "neck_brace.n.01", "name": "neck_brace"}, - {"id": 9418, "synset": "neckcloth.n.01", "name": "neckcloth"}, - {"id": 9419, "synset": "necklet.n.01", "name": "necklet"}, - {"id": 9420, "synset": "neckline.n.01", "name": "neckline"}, - {"id": 9421, "synset": "neckpiece.n.01", "name": "neckpiece"}, - {"id": 9422, "synset": "neckwear.n.01", "name": "neckwear"}, - {"id": 9423, "synset": "needle.n.02", "name": "needle"}, - {"id": 9424, "synset": "needlenose_pliers.n.01", "name": "needlenose_pliers"}, - {"id": 9425, "synset": "needlework.n.01", "name": "needlework"}, - {"id": 9426, "synset": "negative.n.02", "name": "negative"}, - {"id": 9427, "synset": "negative_magnetic_pole.n.01", "name": "negative_magnetic_pole"}, - {"id": 9428, "synset": "negative_pole.n.01", "name": "negative_pole"}, - {"id": 9429, "synset": "negligee.n.01", "name": "negligee"}, - {"id": 9430, "synset": "neolith.n.01", "name": "neolith"}, - {"id": 9431, "synset": "neon_lamp.n.01", "name": "neon_lamp"}, - {"id": 9432, "synset": "nephoscope.n.01", "name": "nephoscope"}, - {"id": 9433, "synset": "nest.n.05", "name": "nest"}, - {"id": 9434, "synset": "nest_egg.n.02", "name": "nest_egg"}, - {"id": 9435, "synset": "net.n.06", "name": "net"}, - {"id": 9436, "synset": "net.n.02", "name": "net"}, - {"id": 9437, "synset": "net.n.05", "name": "net"}, - {"id": 9438, "synset": "net.n.04", "name": "net"}, - {"id": 9439, "synset": "network.n.05", "name": "network"}, - {"id": 9440, "synset": "network.n.04", "name": "network"}, - {"id": 9441, "synset": "neutron_bomb.n.01", "name": "neutron_bomb"}, - {"id": 9442, "synset": "newel.n.02", "name": "newel"}, - {"id": 9443, "synset": "newel_post.n.01", "name": "newel_post"}, - {"id": 9444, "synset": "newspaper.n.03", "name": "newspaper"}, - {"id": 9445, "synset": "newsroom.n.03", "name": "newsroom"}, - {"id": 9446, "synset": "newsroom.n.02", "name": "newsroom"}, - {"id": 9447, "synset": "newtonian_telescope.n.01", "name": "Newtonian_telescope"}, - {"id": 9448, "synset": "nib.n.01", "name": "nib"}, - {"id": 9449, "synset": "niblick.n.01", "name": "niblick"}, - {"id": 9450, "synset": "nicad.n.01", "name": "nicad"}, - {"id": 9451, "synset": "nickel-iron_battery.n.01", "name": "nickel-iron_battery"}, - {"id": 9452, "synset": "nicol_prism.n.01", "name": "Nicol_prism"}, - {"id": 9453, "synset": "night_bell.n.01", "name": "night_bell"}, - {"id": 9454, "synset": "nightcap.n.02", "name": "nightcap"}, - {"id": 9455, "synset": "nightgown.n.01", "name": "nightgown"}, - {"id": 9456, "synset": "night_latch.n.01", "name": "night_latch"}, - {"id": 9457, "synset": "night-light.n.01", "name": "night-light"}, - {"id": 9458, "synset": "nightshirt.n.01", "name": "nightshirt"}, - {"id": 9459, "synset": "ninepin.n.01", "name": "ninepin"}, - {"id": 9460, "synset": "ninepin_ball.n.01", "name": "ninepin_ball"}, - {"id": 9461, "synset": "ninon.n.01", "name": "ninon"}, - {"id": 9462, "synset": "nipple.n.02", "name": "nipple"}, - {"id": 9463, "synset": "nipple_shield.n.01", "name": "nipple_shield"}, - {"id": 9464, "synset": "niqab.n.01", "name": "niqab"}, - {"id": 9465, "synset": "nissen_hut.n.01", "name": "Nissen_hut"}, - {"id": 9466, "synset": "nogging.n.01", "name": "nogging"}, - {"id": 9467, "synset": "noisemaker.n.01", "name": "noisemaker"}, - {"id": 9468, "synset": "nonsmoker.n.02", "name": "nonsmoker"}, - {"id": 9469, "synset": "non-volatile_storage.n.01", "name": "non-volatile_storage"}, - {"id": 9470, "synset": "norfolk_jacket.n.01", "name": "Norfolk_jacket"}, - {"id": 9471, "synset": "noria.n.01", "name": "noria"}, - {"id": 9472, "synset": "nose_flute.n.01", "name": "nose_flute"}, - {"id": 9473, "synset": "nosewheel.n.01", "name": "nosewheel"}, - {"id": 9474, "synset": "notebook.n.02", "name": "notebook"}, - {"id": 9475, "synset": "nuclear-powered_ship.n.01", "name": "nuclear-powered_ship"}, - {"id": 9476, "synset": "nuclear_reactor.n.01", "name": "nuclear_reactor"}, - {"id": 9477, "synset": "nuclear_rocket.n.01", "name": "nuclear_rocket"}, - {"id": 9478, "synset": "nuclear_weapon.n.01", "name": "nuclear_weapon"}, - {"id": 9479, "synset": "nude.n.01", "name": "nude"}, - {"id": 9480, "synset": "numdah.n.01", "name": "numdah"}, - {"id": 9481, "synset": "nun's_habit.n.01", "name": "nun's_habit"}, - {"id": 9482, "synset": "nursery.n.01", "name": "nursery"}, - {"id": 9483, "synset": "nut_and_bolt.n.01", "name": "nut_and_bolt"}, - {"id": 9484, "synset": "nylon.n.02", "name": "nylon"}, - {"id": 9485, "synset": "nylons.n.01", "name": "nylons"}, - {"id": 9486, "synset": "oast.n.01", "name": "oast"}, - {"id": 9487, "synset": "oast_house.n.01", "name": "oast_house"}, - {"id": 9488, "synset": "obelisk.n.01", "name": "obelisk"}, - {"id": 9489, "synset": "object_ball.n.01", "name": "object_ball"}, - {"id": 9490, "synset": "objective.n.02", "name": "objective"}, - {"id": 9491, "synset": "oblique_bandage.n.01", "name": "oblique_bandage"}, - {"id": 9492, "synset": "oboe.n.01", "name": "oboe"}, - {"id": 9493, "synset": "oboe_da_caccia.n.01", "name": "oboe_da_caccia"}, - {"id": 9494, "synset": "oboe_d'amore.n.01", "name": "oboe_d'amore"}, - {"id": 9495, "synset": "observation_dome.n.01", "name": "observation_dome"}, - {"id": 9496, "synset": "observatory.n.01", "name": "observatory"}, - {"id": 9497, "synset": "obstacle.n.02", "name": "obstacle"}, - {"id": 9498, "synset": "obturator.n.01", "name": "obturator"}, - {"id": 9499, "synset": "ocarina.n.01", "name": "ocarina"}, - {"id": 9500, "synset": "octant.n.01", "name": "octant"}, - {"id": 9501, "synset": "odd-leg_caliper.n.01", "name": "odd-leg_caliper"}, - {"id": 9502, "synset": "odometer.n.01", "name": "odometer"}, - {"id": 9503, "synset": "oeil_de_boeuf.n.01", "name": "oeil_de_boeuf"}, - {"id": 9504, "synset": "office.n.01", "name": "office"}, - {"id": 9505, "synset": "office_building.n.01", "name": "office_building"}, - {"id": 9506, "synset": "office_furniture.n.01", "name": "office_furniture"}, - {"id": 9507, "synset": "officer's_mess.n.01", "name": "officer's_mess"}, - {"id": 9508, "synset": "off-line_equipment.n.01", "name": "off-line_equipment"}, - {"id": 9509, "synset": "ogee.n.01", "name": "ogee"}, - {"id": 9510, "synset": "ogee_arch.n.01", "name": "ogee_arch"}, - {"id": 9511, "synset": "ohmmeter.n.01", "name": "ohmmeter"}, - {"id": 9512, "synset": "oil.n.02", "name": "oil"}, - {"id": 9513, "synset": "oilcan.n.01", "name": "oilcan"}, - {"id": 9514, "synset": "oilcloth.n.01", "name": "oilcloth"}, - {"id": 9515, "synset": "oil_filter.n.01", "name": "oil_filter"}, - {"id": 9516, "synset": "oil_heater.n.01", "name": "oil_heater"}, - {"id": 9517, "synset": "oil_paint.n.01", "name": "oil_paint"}, - {"id": 9518, "synset": "oil_pump.n.01", "name": "oil_pump"}, - {"id": 9519, "synset": "oil_refinery.n.01", "name": "oil_refinery"}, - {"id": 9520, "synset": "oilskin.n.01", "name": "oilskin"}, - {"id": 9521, "synset": "oil_slick.n.01", "name": "oil_slick"}, - {"id": 9522, "synset": "oilstone.n.01", "name": "oilstone"}, - {"id": 9523, "synset": "oil_tanker.n.01", "name": "oil_tanker"}, - {"id": 9524, "synset": "old_school_tie.n.01", "name": "old_school_tie"}, - {"id": 9525, "synset": "olive_drab.n.03", "name": "olive_drab"}, - {"id": 9526, "synset": "olive_drab.n.02", "name": "olive_drab"}, - {"id": 9527, "synset": "olympian_zeus.n.01", "name": "Olympian_Zeus"}, - {"id": 9528, "synset": "omelet_pan.n.01", "name": "omelet_pan"}, - {"id": 9529, "synset": "omnidirectional_antenna.n.01", "name": "omnidirectional_antenna"}, - {"id": 9530, "synset": "omnirange.n.01", "name": "omnirange"}, - {"id": 9531, "synset": "onion_dome.n.01", "name": "onion_dome"}, - {"id": 9532, "synset": "open-air_market.n.01", "name": "open-air_market"}, - {"id": 9533, "synset": "open_circuit.n.01", "name": "open_circuit"}, - {"id": 9534, "synset": "open-end_wrench.n.01", "name": "open-end_wrench"}, - {"id": 9535, "synset": "opener.n.03", "name": "opener"}, - {"id": 9536, "synset": "open-hearth_furnace.n.01", "name": "open-hearth_furnace"}, - {"id": 9537, "synset": "openside_plane.n.01", "name": "openside_plane"}, - {"id": 9538, "synset": "open_sight.n.01", "name": "open_sight"}, - {"id": 9539, "synset": "openwork.n.01", "name": "openwork"}, - {"id": 9540, "synset": "opera.n.03", "name": "opera"}, - {"id": 9541, "synset": "opera_cloak.n.01", "name": "opera_cloak"}, - {"id": 9542, "synset": "operating_microscope.n.01", "name": "operating_microscope"}, - {"id": 9543, "synset": "operating_room.n.01", "name": "operating_room"}, - {"id": 9544, "synset": "operating_table.n.01", "name": "operating_table"}, - {"id": 9545, "synset": "ophthalmoscope.n.01", "name": "ophthalmoscope"}, - {"id": 9546, "synset": "optical_device.n.01", "name": "optical_device"}, - {"id": 9547, "synset": "optical_disk.n.01", "name": "optical_disk"}, - {"id": 9548, "synset": "optical_instrument.n.01", "name": "optical_instrument"}, - {"id": 9549, "synset": "optical_pyrometer.n.01", "name": "optical_pyrometer"}, - {"id": 9550, "synset": "optical_telescope.n.01", "name": "optical_telescope"}, - {"id": 9551, "synset": "orchestra_pit.n.01", "name": "orchestra_pit"}, - {"id": 9552, "synset": "ordinary.n.04", "name": "ordinary"}, - {"id": 9553, "synset": "organ.n.05", "name": "organ"}, - {"id": 9554, "synset": "organdy.n.01", "name": "organdy"}, - { - "id": 9555, - "synset": "organic_light-emitting_diode.n.01", - "name": "organic_light-emitting_diode", - }, - {"id": 9556, "synset": "organ_loft.n.01", "name": "organ_loft"}, - {"id": 9557, "synset": "organ_pipe.n.01", "name": "organ_pipe"}, - {"id": 9558, "synset": "organza.n.01", "name": "organza"}, - {"id": 9559, "synset": "oriel.n.01", "name": "oriel"}, - {"id": 9560, "synset": "oriflamme.n.02", "name": "oriflamme"}, - {"id": 9561, "synset": "o_ring.n.01", "name": "O_ring"}, - {"id": 9562, "synset": "orlon.n.01", "name": "Orlon"}, - {"id": 9563, "synset": "orlop_deck.n.01", "name": "orlop_deck"}, - {"id": 9564, "synset": "orphanage.n.02", "name": "orphanage"}, - {"id": 9565, "synset": "orphrey.n.01", "name": "orphrey"}, - {"id": 9566, "synset": "orrery.n.01", "name": "orrery"}, - {"id": 9567, "synset": "orthicon.n.01", "name": "orthicon"}, - {"id": 9568, "synset": "orthochromatic_film.n.01", "name": "orthochromatic_film"}, - {"id": 9569, "synset": "orthopter.n.01", "name": "orthopter"}, - {"id": 9570, "synset": "orthoscope.n.01", "name": "orthoscope"}, - {"id": 9571, "synset": "oscillograph.n.01", "name": "oscillograph"}, - {"id": 9572, "synset": "oscilloscope.n.01", "name": "oscilloscope"}, - {"id": 9573, "synset": "ossuary.n.01", "name": "ossuary"}, - {"id": 9574, "synset": "otoscope.n.01", "name": "otoscope"}, - {"id": 9575, "synset": "oubliette.n.01", "name": "oubliette"}, - {"id": 9576, "synset": "out-basket.n.01", "name": "out-basket"}, - {"id": 9577, "synset": "outboard_motor.n.01", "name": "outboard_motor"}, - {"id": 9578, "synset": "outboard_motorboat.n.01", "name": "outboard_motorboat"}, - {"id": 9579, "synset": "outbuilding.n.01", "name": "outbuilding"}, - {"id": 9580, "synset": "outerwear.n.01", "name": "outerwear"}, - {"id": 9581, "synset": "outfall.n.01", "name": "outfall"}, - {"id": 9582, "synset": "outfit.n.02", "name": "outfit"}, - {"id": 9583, "synset": "outfitter.n.02", "name": "outfitter"}, - {"id": 9584, "synset": "outhouse.n.01", "name": "outhouse"}, - {"id": 9585, "synset": "output_device.n.01", "name": "output_device"}, - {"id": 9586, "synset": "outrigger.n.01", "name": "outrigger"}, - {"id": 9587, "synset": "outrigger_canoe.n.01", "name": "outrigger_canoe"}, - {"id": 9588, "synset": "outside_caliper.n.01", "name": "outside_caliper"}, - {"id": 9589, "synset": "outside_mirror.n.01", "name": "outside_mirror"}, - {"id": 9590, "synset": "outwork.n.01", "name": "outwork"}, - {"id": 9591, "synset": "oven_thermometer.n.01", "name": "oven_thermometer"}, - {"id": 9592, "synset": "overall.n.02", "name": "overall"}, - {"id": 9593, "synset": "overcoat.n.02", "name": "overcoat"}, - {"id": 9594, "synset": "overdrive.n.02", "name": "overdrive"}, - {"id": 9595, "synset": "overgarment.n.01", "name": "overgarment"}, - {"id": 9596, "synset": "overhand_knot.n.01", "name": "overhand_knot"}, - {"id": 9597, "synset": "overhang.n.01", "name": "overhang"}, - {"id": 9598, "synset": "overhead_projector.n.01", "name": "overhead_projector"}, - {"id": 9599, "synset": "overmantel.n.01", "name": "overmantel"}, - {"id": 9600, "synset": "overnighter.n.02", "name": "overnighter"}, - {"id": 9601, "synset": "overpass.n.01", "name": "overpass"}, - {"id": 9602, "synset": "override.n.01", "name": "override"}, - {"id": 9603, "synset": "overshoe.n.01", "name": "overshoe"}, - {"id": 9604, "synset": "overskirt.n.01", "name": "overskirt"}, - {"id": 9605, "synset": "oxbow.n.03", "name": "oxbow"}, - {"id": 9606, "synset": "oxbridge.n.01", "name": "Oxbridge"}, - {"id": 9607, "synset": "oxcart.n.01", "name": "oxcart"}, - {"id": 9608, "synset": "oxeye.n.03", "name": "oxeye"}, - {"id": 9609, "synset": "oxford.n.04", "name": "oxford"}, - {"id": 9610, "synset": "oximeter.n.01", "name": "oximeter"}, - {"id": 9611, "synset": "oxyacetylene_torch.n.01", "name": "oxyacetylene_torch"}, - {"id": 9612, "synset": "oxygen_mask.n.01", "name": "oxygen_mask"}, - {"id": 9613, "synset": "oyster_bar.n.01", "name": "oyster_bar"}, - {"id": 9614, "synset": "oyster_bed.n.01", "name": "oyster_bed"}, - {"id": 9615, "synset": "pace_car.n.01", "name": "pace_car"}, - {"id": 9616, "synset": "pacemaker.n.03", "name": "pacemaker"}, - {"id": 9617, "synset": "pack.n.03", "name": "pack"}, - {"id": 9618, "synset": "pack.n.09", "name": "pack"}, - {"id": 9619, "synset": "pack.n.07", "name": "pack"}, - {"id": 9620, "synset": "package.n.02", "name": "package"}, - {"id": 9621, "synset": "package_store.n.01", "name": "package_store"}, - {"id": 9622, "synset": "packaging.n.03", "name": "packaging"}, - {"id": 9623, "synset": "packing_box.n.02", "name": "packing_box"}, - {"id": 9624, "synset": "packinghouse.n.02", "name": "packinghouse"}, - {"id": 9625, "synset": "packinghouse.n.01", "name": "packinghouse"}, - {"id": 9626, "synset": "packing_needle.n.01", "name": "packing_needle"}, - {"id": 9627, "synset": "packsaddle.n.01", "name": "packsaddle"}, - {"id": 9628, "synset": "paddle.n.02", "name": "paddle"}, - {"id": 9629, "synset": "paddle.n.01", "name": "paddle"}, - {"id": 9630, "synset": "paddle_box.n.01", "name": "paddle_box"}, - {"id": 9631, "synset": "paddle_steamer.n.01", "name": "paddle_steamer"}, - {"id": 9632, "synset": "paddlewheel.n.01", "name": "paddlewheel"}, - {"id": 9633, "synset": "paddock.n.01", "name": "paddock"}, - {"id": 9634, "synset": "page_printer.n.01", "name": "page_printer"}, - {"id": 9635, "synset": "paint.n.01", "name": "paint"}, - {"id": 9636, "synset": "paintball.n.01", "name": "paintball"}, - {"id": 9637, "synset": "paintball_gun.n.01", "name": "paintball_gun"}, - {"id": 9638, "synset": "paintbox.n.01", "name": "paintbox"}, - {"id": 9639, "synset": "paisley.n.01", "name": "paisley"}, - {"id": 9640, "synset": "pajama.n.01", "name": "pajama"}, - {"id": 9641, "synset": "palace.n.04", "name": "palace"}, - {"id": 9642, "synset": "palace.n.01", "name": "palace"}, - {"id": 9643, "synset": "palace.n.03", "name": "palace"}, - {"id": 9644, "synset": "palanquin.n.01", "name": "palanquin"}, - {"id": 9645, "synset": "paleolith.n.01", "name": "paleolith"}, - {"id": 9646, "synset": "palestra.n.01", "name": "palestra"}, - {"id": 9647, "synset": "palette_knife.n.01", "name": "palette_knife"}, - {"id": 9648, "synset": "palisade.n.01", "name": "palisade"}, - {"id": 9649, "synset": "pallet.n.03", "name": "pallet"}, - {"id": 9650, "synset": "pallette.n.01", "name": "pallette"}, - {"id": 9651, "synset": "pallium.n.04", "name": "pallium"}, - {"id": 9652, "synset": "pallium.n.03", "name": "pallium"}, - {"id": 9653, "synset": "pancake_turner.n.01", "name": "pancake_turner"}, - {"id": 9654, "synset": "panchromatic_film.n.01", "name": "panchromatic_film"}, - {"id": 9655, "synset": "panda_car.n.01", "name": "panda_car"}, - {"id": 9656, "synset": "paneling.n.01", "name": "paneling"}, - {"id": 9657, "synset": "panhandle.n.02", "name": "panhandle"}, - {"id": 9658, "synset": "panic_button.n.01", "name": "panic_button"}, - {"id": 9659, "synset": "pannier.n.02", "name": "pannier"}, - {"id": 9660, "synset": "pannier.n.01", "name": "pannier"}, - {"id": 9661, "synset": "pannikin.n.01", "name": "pannikin"}, - {"id": 9662, "synset": "panopticon.n.02", "name": "panopticon"}, - {"id": 9663, "synset": "panopticon.n.01", "name": "panopticon"}, - {"id": 9664, "synset": "panpipe.n.01", "name": "panpipe"}, - {"id": 9665, "synset": "pantaloon.n.03", "name": "pantaloon"}, - {"id": 9666, "synset": "pantechnicon.n.01", "name": "pantechnicon"}, - {"id": 9667, "synset": "pantheon.n.03", "name": "pantheon"}, - {"id": 9668, "synset": "pantheon.n.02", "name": "pantheon"}, - {"id": 9669, "synset": "pantie.n.01", "name": "pantie"}, - {"id": 9670, "synset": "panting.n.02", "name": "panting"}, - {"id": 9671, "synset": "pant_leg.n.01", "name": "pant_leg"}, - {"id": 9672, "synset": "pantograph.n.01", "name": "pantograph"}, - {"id": 9673, "synset": "pantry.n.01", "name": "pantry"}, - {"id": 9674, "synset": "pants_suit.n.01", "name": "pants_suit"}, - {"id": 9675, "synset": "panty_girdle.n.01", "name": "panty_girdle"}, - {"id": 9676, "synset": "panzer.n.01", "name": "panzer"}, - {"id": 9677, "synset": "paper_chain.n.01", "name": "paper_chain"}, - {"id": 9678, "synset": "paper_clip.n.01", "name": "paper_clip"}, - {"id": 9679, "synset": "paper_cutter.n.01", "name": "paper_cutter"}, - {"id": 9680, "synset": "paper_fastener.n.01", "name": "paper_fastener"}, - {"id": 9681, "synset": "paper_feed.n.01", "name": "paper_feed"}, - {"id": 9682, "synset": "paper_mill.n.01", "name": "paper_mill"}, - {"id": 9683, "synset": "parabolic_mirror.n.01", "name": "parabolic_mirror"}, - {"id": 9684, "synset": "parabolic_reflector.n.01", "name": "parabolic_reflector"}, - {"id": 9685, "synset": "parallel_bars.n.01", "name": "parallel_bars"}, - {"id": 9686, "synset": "parallel_circuit.n.01", "name": "parallel_circuit"}, - {"id": 9687, "synset": "parallel_interface.n.01", "name": "parallel_interface"}, - {"id": 9688, "synset": "parang.n.01", "name": "parang"}, - {"id": 9689, "synset": "parapet.n.02", "name": "parapet"}, - {"id": 9690, "synset": "parapet.n.01", "name": "parapet"}, - {"id": 9691, "synset": "parer.n.02", "name": "parer"}, - {"id": 9692, "synset": "parfait_glass.n.01", "name": "parfait_glass"}, - {"id": 9693, "synset": "pargeting.n.02", "name": "pargeting"}, - {"id": 9694, "synset": "pari-mutuel_machine.n.01", "name": "pari-mutuel_machine"}, - {"id": 9695, "synset": "park_bench.n.01", "name": "park_bench"}, - {"id": 9696, "synset": "parlor.n.01", "name": "parlor"}, - {"id": 9697, "synset": "parquet.n.01", "name": "parquet"}, - {"id": 9698, "synset": "parquetry.n.01", "name": "parquetry"}, - {"id": 9699, "synset": "parsonage.n.01", "name": "parsonage"}, - {"id": 9700, "synset": "parsons_table.n.01", "name": "Parsons_table"}, - {"id": 9701, "synset": "partial_denture.n.01", "name": "partial_denture"}, - {"id": 9702, "synset": "particle_detector.n.01", "name": "particle_detector"}, - {"id": 9703, "synset": "partition.n.01", "name": "partition"}, - {"id": 9704, "synset": "parts_bin.n.01", "name": "parts_bin"}, - {"id": 9705, "synset": "party_line.n.02", "name": "party_line"}, - {"id": 9706, "synset": "party_wall.n.01", "name": "party_wall"}, - {"id": 9707, "synset": "parvis.n.01", "name": "parvis"}, - {"id": 9708, "synset": "passenger_train.n.01", "name": "passenger_train"}, - {"id": 9709, "synset": "passenger_van.n.01", "name": "passenger_van"}, - {"id": 9710, "synset": "passe-partout.n.02", "name": "passe-partout"}, - {"id": 9711, "synset": "passive_matrix_display.n.01", "name": "passive_matrix_display"}, - {"id": 9712, "synset": "passkey.n.01", "name": "passkey"}, - {"id": 9713, "synset": "pass-through.n.01", "name": "pass-through"}, - {"id": 9714, "synset": "pastry_cart.n.01", "name": "pastry_cart"}, - {"id": 9715, "synset": "patch.n.03", "name": "patch"}, - {"id": 9716, "synset": "patchcord.n.01", "name": "patchcord"}, - {"id": 9717, "synset": "patchouli.n.02", "name": "patchouli"}, - {"id": 9718, "synset": "patch_pocket.n.01", "name": "patch_pocket"}, - {"id": 9719, "synset": "patchwork.n.02", "name": "patchwork"}, - {"id": 9720, "synset": "patent_log.n.01", "name": "patent_log"}, - {"id": 9721, "synset": "paternoster.n.02", "name": "paternoster"}, - {"id": 9722, "synset": "patina.n.01", "name": "patina"}, - {"id": 9723, "synset": "patio.n.01", "name": "patio"}, - {"id": 9724, "synset": "patisserie.n.01", "name": "patisserie"}, - {"id": 9725, "synset": "patka.n.01", "name": "patka"}, - {"id": 9726, "synset": "patrol_boat.n.01", "name": "patrol_boat"}, - {"id": 9727, "synset": "patty-pan.n.01", "name": "patty-pan"}, - {"id": 9728, "synset": "pave.n.01", "name": "pave"}, - {"id": 9729, "synset": "pavilion.n.01", "name": "pavilion"}, - {"id": 9730, "synset": "pavior.n.01", "name": "pavior"}, - {"id": 9731, "synset": "pavis.n.01", "name": "pavis"}, - {"id": 9732, "synset": "pawn.n.03", "name": "pawn"}, - {"id": 9733, "synset": "pawnbroker's_shop.n.01", "name": "pawnbroker's_shop"}, - {"id": 9734, "synset": "pay-phone.n.01", "name": "pay-phone"}, - {"id": 9735, "synset": "pc_board.n.01", "name": "PC_board"}, - {"id": 9736, "synset": "peach_orchard.n.01", "name": "peach_orchard"}, - {"id": 9737, "synset": "pea_jacket.n.01", "name": "pea_jacket"}, - {"id": 9738, "synset": "peavey.n.01", "name": "peavey"}, - {"id": 9739, "synset": "pectoral.n.02", "name": "pectoral"}, - {"id": 9740, "synset": "pedal.n.02", "name": "pedal"}, - {"id": 9741, "synset": "pedal_pusher.n.01", "name": "pedal_pusher"}, - {"id": 9742, "synset": "pedestal.n.03", "name": "pedestal"}, - {"id": 9743, "synset": "pedestal_table.n.01", "name": "pedestal_table"}, - {"id": 9744, "synset": "pedestrian_crossing.n.01", "name": "pedestrian_crossing"}, - {"id": 9745, "synset": "pedicab.n.01", "name": "pedicab"}, - {"id": 9746, "synset": "pediment.n.01", "name": "pediment"}, - {"id": 9747, "synset": "pedometer.n.01", "name": "pedometer"}, - {"id": 9748, "synset": "peep_sight.n.01", "name": "peep_sight"}, - {"id": 9749, "synset": "peg.n.01", "name": "peg"}, - {"id": 9750, "synset": "peg.n.06", "name": "peg"}, - {"id": 9751, "synset": "peg.n.05", "name": "peg"}, - {"id": 9752, "synset": "pelham.n.01", "name": "Pelham"}, - {"id": 9753, "synset": "pelican_crossing.n.01", "name": "pelican_crossing"}, - {"id": 9754, "synset": "pelisse.n.01", "name": "pelisse"}, - {"id": 9755, "synset": "pelvimeter.n.01", "name": "pelvimeter"}, - {"id": 9756, "synset": "penal_colony.n.01", "name": "penal_colony"}, - {"id": 9757, "synset": "penal_institution.n.01", "name": "penal_institution"}, - {"id": 9758, "synset": "penalty_box.n.01", "name": "penalty_box"}, - {"id": 9759, "synset": "pen-and-ink.n.01", "name": "pen-and-ink"}, - {"id": 9760, "synset": "pencil.n.04", "name": "pencil"}, - {"id": 9761, "synset": "pendant_earring.n.01", "name": "pendant_earring"}, - {"id": 9762, "synset": "pendulum_clock.n.01", "name": "pendulum_clock"}, - {"id": 9763, "synset": "pendulum_watch.n.01", "name": "pendulum_watch"}, - {"id": 9764, "synset": "penetration_bomb.n.01", "name": "penetration_bomb"}, - {"id": 9765, "synset": "penile_implant.n.01", "name": "penile_implant"}, - {"id": 9766, "synset": "penitentiary.n.01", "name": "penitentiary"}, - {"id": 9767, "synset": "penknife.n.01", "name": "penknife"}, - {"id": 9768, "synset": "penlight.n.01", "name": "penlight"}, - {"id": 9769, "synset": "pennant.n.03", "name": "pennant"}, - {"id": 9770, "synset": "pennywhistle.n.01", "name": "pennywhistle"}, - {"id": 9771, "synset": "penthouse.n.01", "name": "penthouse"}, - {"id": 9772, "synset": "pentode.n.01", "name": "pentode"}, - {"id": 9773, "synset": "peplos.n.01", "name": "peplos"}, - {"id": 9774, "synset": "peplum.n.01", "name": "peplum"}, - {"id": 9775, "synset": "pepper_shaker.n.01", "name": "pepper_shaker"}, - {"id": 9776, "synset": "pepper_spray.n.01", "name": "pepper_spray"}, - {"id": 9777, "synset": "percale.n.01", "name": "percale"}, - {"id": 9778, "synset": "percolator.n.01", "name": "percolator"}, - {"id": 9779, "synset": "percussion_cap.n.01", "name": "percussion_cap"}, - {"id": 9780, "synset": "percussion_instrument.n.01", "name": "percussion_instrument"}, - {"id": 9781, "synset": "perforation.n.01", "name": "perforation"}, - {"id": 9782, "synset": "perfumery.n.03", "name": "perfumery"}, - {"id": 9783, "synset": "perfumery.n.02", "name": "perfumery"}, - {"id": 9784, "synset": "perfumery.n.01", "name": "perfumery"}, - {"id": 9785, "synset": "peripheral.n.01", "name": "peripheral"}, - {"id": 9786, "synset": "periscope.n.01", "name": "periscope"}, - {"id": 9787, "synset": "peristyle.n.01", "name": "peristyle"}, - {"id": 9788, "synset": "periwig.n.01", "name": "periwig"}, - {"id": 9789, "synset": "permanent_press.n.01", "name": "permanent_press"}, - {"id": 9790, "synset": "perpetual_motion_machine.n.01", "name": "perpetual_motion_machine"}, - {"id": 9791, "synset": "personal_computer.n.01", "name": "personal_computer"}, - {"id": 9792, "synset": "personal_digital_assistant.n.01", "name": "personal_digital_assistant"}, - {"id": 9793, "synset": "personnel_carrier.n.01", "name": "personnel_carrier"}, - {"id": 9794, "synset": "pestle.n.03", "name": "pestle"}, - {"id": 9795, "synset": "pestle.n.02", "name": "pestle"}, - {"id": 9796, "synset": "petcock.n.01", "name": "petcock"}, - {"id": 9797, "synset": "petri_dish.n.01", "name": "Petri_dish"}, - {"id": 9798, "synset": "petrolatum_gauze.n.01", "name": "petrolatum_gauze"}, - {"id": 9799, "synset": "pet_shop.n.01", "name": "pet_shop"}, - {"id": 9800, "synset": "petticoat.n.01", "name": "petticoat"}, - {"id": 9801, "synset": "phial.n.01", "name": "phial"}, - {"id": 9802, "synset": "phillips_screw.n.01", "name": "Phillips_screw"}, - {"id": 9803, "synset": "phillips_screwdriver.n.01", "name": "Phillips_screwdriver"}, - {"id": 9804, "synset": "phonograph_needle.n.01", "name": "phonograph_needle"}, - {"id": 9805, "synset": "photocathode.n.01", "name": "photocathode"}, - {"id": 9806, "synset": "photocoagulator.n.01", "name": "photocoagulator"}, - {"id": 9807, "synset": "photocopier.n.01", "name": "photocopier"}, - {"id": 9808, "synset": "photographic_equipment.n.01", "name": "photographic_equipment"}, - {"id": 9809, "synset": "photographic_paper.n.01", "name": "photographic_paper"}, - {"id": 9810, "synset": "photometer.n.01", "name": "photometer"}, - {"id": 9811, "synset": "photomicrograph.n.01", "name": "photomicrograph"}, - {"id": 9812, "synset": "photostat.n.02", "name": "Photostat"}, - {"id": 9813, "synset": "photostat.n.01", "name": "photostat"}, - {"id": 9814, "synset": "physical_pendulum.n.01", "name": "physical_pendulum"}, - {"id": 9815, "synset": "piano_action.n.01", "name": "piano_action"}, - {"id": 9816, "synset": "piano_keyboard.n.01", "name": "piano_keyboard"}, - {"id": 9817, "synset": "piano_wire.n.01", "name": "piano_wire"}, - {"id": 9818, "synset": "piccolo.n.01", "name": "piccolo"}, - {"id": 9819, "synset": "pick.n.07", "name": "pick"}, - {"id": 9820, "synset": "pick.n.06", "name": "pick"}, - {"id": 9821, "synset": "pick.n.05", "name": "pick"}, - {"id": 9822, "synset": "pickelhaube.n.01", "name": "pickelhaube"}, - {"id": 9823, "synset": "picket_boat.n.01", "name": "picket_boat"}, - {"id": 9824, "synset": "picket_fence.n.01", "name": "picket_fence"}, - {"id": 9825, "synset": "picket_ship.n.01", "name": "picket_ship"}, - {"id": 9826, "synset": "pickle_barrel.n.01", "name": "pickle_barrel"}, - {"id": 9827, "synset": "picture_frame.n.01", "name": "picture_frame"}, - {"id": 9828, "synset": "picture_hat.n.01", "name": "picture_hat"}, - {"id": 9829, "synset": "picture_rail.n.01", "name": "picture_rail"}, - {"id": 9830, "synset": "picture_window.n.01", "name": "picture_window"}, - {"id": 9831, "synset": "piece_of_cloth.n.01", "name": "piece_of_cloth"}, - {"id": 9832, "synset": "pied-a-terre.n.01", "name": "pied-a-terre"}, - {"id": 9833, "synset": "pier.n.03", "name": "pier"}, - {"id": 9834, "synset": "pier.n.02", "name": "pier"}, - {"id": 9835, "synset": "pier_arch.n.01", "name": "pier_arch"}, - {"id": 9836, "synset": "pier_glass.n.01", "name": "pier_glass"}, - {"id": 9837, "synset": "pier_table.n.01", "name": "pier_table"}, - {"id": 9838, "synset": "pieta.n.01", "name": "pieta"}, - {"id": 9839, "synset": "piezometer.n.01", "name": "piezometer"}, - {"id": 9840, "synset": "pig_bed.n.01", "name": "pig_bed"}, - {"id": 9841, "synset": "piggery.n.01", "name": "piggery"}, - {"id": 9842, "synset": "pilaster.n.01", "name": "pilaster"}, - {"id": 9843, "synset": "pile.n.06", "name": "pile"}, - {"id": 9844, "synset": "pile_driver.n.01", "name": "pile_driver"}, - {"id": 9845, "synset": "pill_bottle.n.01", "name": "pill_bottle"}, - {"id": 9846, "synset": "pillbox.n.01", "name": "pillbox"}, - {"id": 9847, "synset": "pillion.n.01", "name": "pillion"}, - {"id": 9848, "synset": "pillory.n.01", "name": "pillory"}, - {"id": 9849, "synset": "pillow_block.n.01", "name": "pillow_block"}, - {"id": 9850, "synset": "pillow_lace.n.01", "name": "pillow_lace"}, - {"id": 9851, "synset": "pillow_sham.n.01", "name": "pillow_sham"}, - {"id": 9852, "synset": "pilot_bit.n.01", "name": "pilot_bit"}, - {"id": 9853, "synset": "pilot_boat.n.01", "name": "pilot_boat"}, - {"id": 9854, "synset": "pilot_burner.n.01", "name": "pilot_burner"}, - {"id": 9855, "synset": "pilot_cloth.n.01", "name": "pilot_cloth"}, - {"id": 9856, "synset": "pilot_engine.n.01", "name": "pilot_engine"}, - {"id": 9857, "synset": "pilothouse.n.01", "name": "pilothouse"}, - {"id": 9858, "synset": "pilot_light.n.02", "name": "pilot_light"}, - {"id": 9859, "synset": "pin.n.08", "name": "pin"}, - {"id": 9860, "synset": "pin.n.07", "name": "pin"}, - {"id": 9861, "synset": "pinata.n.01", "name": "pinata"}, - {"id": 9862, "synset": "pinball_machine.n.01", "name": "pinball_machine"}, - {"id": 9863, "synset": "pince-nez.n.01", "name": "pince-nez"}, - {"id": 9864, "synset": "pincer.n.01", "name": "pincer"}, - {"id": 9865, "synset": "pinch_bar.n.01", "name": "pinch_bar"}, - {"id": 9866, "synset": "pincurl_clip.n.01", "name": "pincurl_clip"}, - {"id": 9867, "synset": "pinfold.n.01", "name": "pinfold"}, - {"id": 9868, "synset": "pinhead.n.02", "name": "pinhead"}, - {"id": 9869, "synset": "pinion.n.01", "name": "pinion"}, - {"id": 9870, "synset": "pinnacle.n.01", "name": "pinnacle"}, - {"id": 9871, "synset": "pinprick.n.02", "name": "pinprick"}, - {"id": 9872, "synset": "pinstripe.n.03", "name": "pinstripe"}, - {"id": 9873, "synset": "pinstripe.n.02", "name": "pinstripe"}, - {"id": 9874, "synset": "pinstripe.n.01", "name": "pinstripe"}, - {"id": 9875, "synset": "pintle.n.01", "name": "pintle"}, - {"id": 9876, "synset": "pinwheel.n.02", "name": "pinwheel"}, - {"id": 9877, "synset": "tabor_pipe.n.01", "name": "tabor_pipe"}, - {"id": 9878, "synset": "pipe.n.04", "name": "pipe"}, - {"id": 9879, "synset": "pipe_bomb.n.01", "name": "pipe_bomb"}, - {"id": 9880, "synset": "pipe_cleaner.n.01", "name": "pipe_cleaner"}, - {"id": 9881, "synset": "pipe_cutter.n.01", "name": "pipe_cutter"}, - {"id": 9882, "synset": "pipefitting.n.01", "name": "pipefitting"}, - {"id": 9883, "synset": "pipet.n.01", "name": "pipet"}, - {"id": 9884, "synset": "pipe_vise.n.01", "name": "pipe_vise"}, - {"id": 9885, "synset": "pipe_wrench.n.01", "name": "pipe_wrench"}, - {"id": 9886, "synset": "pique.n.01", "name": "pique"}, - {"id": 9887, "synset": "pirate.n.03", "name": "pirate"}, - {"id": 9888, "synset": "piste.n.02", "name": "piste"}, - {"id": 9889, "synset": "pistol_grip.n.01", "name": "pistol_grip"}, - {"id": 9890, "synset": "piston.n.02", "name": "piston"}, - {"id": 9891, "synset": "piston_ring.n.01", "name": "piston_ring"}, - {"id": 9892, "synset": "piston_rod.n.01", "name": "piston_rod"}, - {"id": 9893, "synset": "pit.n.07", "name": "pit"}, - {"id": 9894, "synset": "pitching_wedge.n.01", "name": "pitching_wedge"}, - {"id": 9895, "synset": "pitch_pipe.n.01", "name": "pitch_pipe"}, - {"id": 9896, "synset": "pith_hat.n.01", "name": "pith_hat"}, - {"id": 9897, "synset": "piton.n.01", "name": "piton"}, - {"id": 9898, "synset": "pitot-static_tube.n.01", "name": "Pitot-static_tube"}, - {"id": 9899, "synset": "pitot_tube.n.01", "name": "Pitot_tube"}, - {"id": 9900, "synset": "pitsaw.n.01", "name": "pitsaw"}, - {"id": 9901, "synset": "pivot.n.02", "name": "pivot"}, - {"id": 9902, "synset": "pivoting_window.n.01", "name": "pivoting_window"}, - {"id": 9903, "synset": "pizzeria.n.01", "name": "pizzeria"}, - {"id": 9904, "synset": "place_of_business.n.01", "name": "place_of_business"}, - {"id": 9905, "synset": "place_of_worship.n.01", "name": "place_of_worship"}, - {"id": 9906, "synset": "placket.n.01", "name": "placket"}, - {"id": 9907, "synset": "planchet.n.01", "name": "planchet"}, - {"id": 9908, "synset": "plane.n.05", "name": "plane"}, - {"id": 9909, "synset": "plane.n.04", "name": "plane"}, - {"id": 9910, "synset": "plane_seat.n.01", "name": "plane_seat"}, - {"id": 9911, "synset": "planetarium.n.03", "name": "planetarium"}, - {"id": 9912, "synset": "planetarium.n.02", "name": "planetarium"}, - {"id": 9913, "synset": "planetarium.n.01", "name": "planetarium"}, - {"id": 9914, "synset": "planetary_gear.n.01", "name": "planetary_gear"}, - {"id": 9915, "synset": "plank-bed.n.01", "name": "plank-bed"}, - {"id": 9916, "synset": "planking.n.02", "name": "planking"}, - {"id": 9917, "synset": "planner.n.02", "name": "planner"}, - {"id": 9918, "synset": "plant.n.01", "name": "plant"}, - {"id": 9919, "synset": "planter.n.03", "name": "planter"}, - {"id": 9920, "synset": "plaster.n.05", "name": "plaster"}, - {"id": 9921, "synset": "plasterboard.n.01", "name": "plasterboard"}, - {"id": 9922, "synset": "plastering_trowel.n.01", "name": "plastering_trowel"}, - {"id": 9923, "synset": "plastic_bag.n.01", "name": "plastic_bag"}, - {"id": 9924, "synset": "plastic_bomb.n.01", "name": "plastic_bomb"}, - {"id": 9925, "synset": "plastic_laminate.n.01", "name": "plastic_laminate"}, - {"id": 9926, "synset": "plastic_wrap.n.01", "name": "plastic_wrap"}, - {"id": 9927, "synset": "plastron.n.03", "name": "plastron"}, - {"id": 9928, "synset": "plastron.n.02", "name": "plastron"}, - {"id": 9929, "synset": "plastron.n.01", "name": "plastron"}, - {"id": 9930, "synset": "plate.n.14", "name": "plate"}, - {"id": 9931, "synset": "plate.n.13", "name": "plate"}, - {"id": 9932, "synset": "plate.n.12", "name": "plate"}, - {"id": 9933, "synset": "platen.n.03", "name": "platen"}, - {"id": 9934, "synset": "platen.n.01", "name": "platen"}, - {"id": 9935, "synset": "plate_rack.n.01", "name": "plate_rack"}, - {"id": 9936, "synset": "plate_rail.n.01", "name": "plate_rail"}, - {"id": 9937, "synset": "platform.n.01", "name": "platform"}, - {"id": 9938, "synset": "platform.n.04", "name": "platform"}, - {"id": 9939, "synset": "platform.n.03", "name": "platform"}, - {"id": 9940, "synset": "platform_bed.n.01", "name": "platform_bed"}, - {"id": 9941, "synset": "platform_rocker.n.01", "name": "platform_rocker"}, - {"id": 9942, "synset": "plating.n.01", "name": "plating"}, - {"id": 9943, "synset": "playback.n.02", "name": "playback"}, - {"id": 9944, "synset": "playbox.n.01", "name": "playbox"}, - {"id": 9945, "synset": "playground.n.02", "name": "playground"}, - {"id": 9946, "synset": "playsuit.n.01", "name": "playsuit"}, - {"id": 9947, "synset": "plaza.n.02", "name": "plaza"}, - {"id": 9948, "synset": "pleat.n.01", "name": "pleat"}, - {"id": 9949, "synset": "plenum.n.02", "name": "plenum"}, - {"id": 9950, "synset": "plethysmograph.n.01", "name": "plethysmograph"}, - {"id": 9951, "synset": "pleximeter.n.01", "name": "pleximeter"}, - {"id": 9952, "synset": "plexor.n.01", "name": "plexor"}, - {"id": 9953, "synset": "plimsoll.n.02", "name": "plimsoll"}, - {"id": 9954, "synset": "plotter.n.04", "name": "plotter"}, - {"id": 9955, "synset": "plug.n.01", "name": "plug"}, - {"id": 9956, "synset": "plug.n.05", "name": "plug"}, - {"id": 9957, "synset": "plug_fuse.n.01", "name": "plug_fuse"}, - {"id": 9958, "synset": "plughole.n.01", "name": "plughole"}, - {"id": 9959, "synset": "plumb_bob.n.01", "name": "plumb_bob"}, - {"id": 9960, "synset": "plumb_level.n.01", "name": "plumb_level"}, - {"id": 9961, "synset": "plunger.n.03", "name": "plunger"}, - {"id": 9962, "synset": "plus_fours.n.01", "name": "plus_fours"}, - {"id": 9963, "synset": "plush.n.01", "name": "plush"}, - {"id": 9964, "synset": "plywood.n.01", "name": "plywood"}, - {"id": 9965, "synset": "pneumatic_drill.n.01", "name": "pneumatic_drill"}, - {"id": 9966, "synset": "p-n_junction.n.01", "name": "p-n_junction"}, - {"id": 9967, "synset": "p-n-p_transistor.n.01", "name": "p-n-p_transistor"}, - {"id": 9968, "synset": "poacher.n.02", "name": "poacher"}, - {"id": 9969, "synset": "pocket.n.01", "name": "pocket"}, - {"id": 9970, "synset": "pocket_battleship.n.01", "name": "pocket_battleship"}, - {"id": 9971, "synset": "pocketcomb.n.01", "name": "pocketcomb"}, - {"id": 9972, "synset": "pocket_flap.n.01", "name": "pocket_flap"}, - {"id": 9973, "synset": "pocket-handkerchief.n.01", "name": "pocket-handkerchief"}, - {"id": 9974, "synset": "pod.n.04", "name": "pod"}, - {"id": 9975, "synset": "pogo_stick.n.01", "name": "pogo_stick"}, - {"id": 9976, "synset": "point-and-shoot_camera.n.01", "name": "point-and-shoot_camera"}, - {"id": 9977, "synset": "pointed_arch.n.01", "name": "pointed_arch"}, - {"id": 9978, "synset": "pointing_trowel.n.01", "name": "pointing_trowel"}, - {"id": 9979, "synset": "point_lace.n.01", "name": "point_lace"}, - {"id": 9980, "synset": "polarimeter.n.01", "name": "polarimeter"}, - {"id": 9981, "synset": "polaroid.n.01", "name": "Polaroid"}, - {"id": 9982, "synset": "polaroid_camera.n.01", "name": "Polaroid_camera"}, - {"id": 9983, "synset": "pole.n.09", "name": "pole"}, - {"id": 9984, "synset": "poleax.n.02", "name": "poleax"}, - {"id": 9985, "synset": "poleax.n.01", "name": "poleax"}, - {"id": 9986, "synset": "police_boat.n.01", "name": "police_boat"}, - {"id": 9987, "synset": "police_van.n.01", "name": "police_van"}, - {"id": 9988, "synset": "polling_booth.n.01", "name": "polling_booth"}, - {"id": 9989, "synset": "polo_ball.n.01", "name": "polo_ball"}, - {"id": 9990, "synset": "polo_mallet.n.01", "name": "polo_mallet"}, - {"id": 9991, "synset": "polonaise.n.01", "name": "polonaise"}, - {"id": 9992, "synset": "polyester.n.03", "name": "polyester"}, - {"id": 9993, "synset": "polygraph.n.01", "name": "polygraph"}, - {"id": 9994, "synset": "pomade.n.01", "name": "pomade"}, - {"id": 9995, "synset": "pommel_horse.n.01", "name": "pommel_horse"}, - {"id": 9996, "synset": "pongee.n.01", "name": "pongee"}, - {"id": 9997, "synset": "poniard.n.01", "name": "poniard"}, - {"id": 9998, "synset": "pontifical.n.01", "name": "pontifical"}, - {"id": 9999, "synset": "pontoon.n.01", "name": "pontoon"}, - {"id": 10000, "synset": "pontoon_bridge.n.01", "name": "pontoon_bridge"}, - {"id": 10001, "synset": "pony_cart.n.01", "name": "pony_cart"}, - {"id": 10002, "synset": "pool_ball.n.01", "name": "pool_ball"}, - {"id": 10003, "synset": "poolroom.n.01", "name": "poolroom"}, - {"id": 10004, "synset": "poop_deck.n.01", "name": "poop_deck"}, - {"id": 10005, "synset": "poor_box.n.01", "name": "poor_box"}, - {"id": 10006, "synset": "poorhouse.n.01", "name": "poorhouse"}, - {"id": 10007, "synset": "pop_bottle.n.01", "name": "pop_bottle"}, - {"id": 10008, "synset": "popgun.n.01", "name": "popgun"}, - {"id": 10009, "synset": "poplin.n.01", "name": "poplin"}, - {"id": 10010, "synset": "popper.n.03", "name": "popper"}, - {"id": 10011, "synset": "poppet.n.01", "name": "poppet"}, - {"id": 10012, "synset": "pop_tent.n.01", "name": "pop_tent"}, - {"id": 10013, "synset": "porcelain.n.01", "name": "porcelain"}, - {"id": 10014, "synset": "porch.n.01", "name": "porch"}, - {"id": 10015, "synset": "porkpie.n.01", "name": "porkpie"}, - {"id": 10016, "synset": "porringer.n.01", "name": "porringer"}, - {"id": 10017, "synset": "portable.n.01", "name": "portable"}, - {"id": 10018, "synset": "portable_computer.n.01", "name": "portable_computer"}, - {"id": 10019, "synset": "portable_circular_saw.n.01", "name": "portable_circular_saw"}, - {"id": 10020, "synset": "portcullis.n.01", "name": "portcullis"}, - {"id": 10021, "synset": "porte-cochere.n.02", "name": "porte-cochere"}, - {"id": 10022, "synset": "porte-cochere.n.01", "name": "porte-cochere"}, - {"id": 10023, "synset": "portfolio.n.01", "name": "portfolio"}, - {"id": 10024, "synset": "porthole.n.01", "name": "porthole"}, - {"id": 10025, "synset": "portico.n.01", "name": "portico"}, - {"id": 10026, "synset": "portiere.n.01", "name": "portiere"}, - {"id": 10027, "synset": "portmanteau.n.02", "name": "portmanteau"}, - {"id": 10028, "synset": "portrait_camera.n.01", "name": "portrait_camera"}, - {"id": 10029, "synset": "portrait_lens.n.01", "name": "portrait_lens"}, - {"id": 10030, "synset": "positive_pole.n.02", "name": "positive_pole"}, - {"id": 10031, "synset": "positive_pole.n.01", "name": "positive_pole"}, - { - "id": 10032, - "synset": "positron_emission_tomography_scanner.n.01", - "name": "positron_emission_tomography_scanner", - }, - {"id": 10033, "synset": "post.n.04", "name": "post"}, - {"id": 10034, "synset": "postage_meter.n.01", "name": "postage_meter"}, - {"id": 10035, "synset": "post_and_lintel.n.01", "name": "post_and_lintel"}, - {"id": 10036, "synset": "post_chaise.n.01", "name": "post_chaise"}, - {"id": 10037, "synset": "postern.n.01", "name": "postern"}, - {"id": 10038, "synset": "post_exchange.n.01", "name": "post_exchange"}, - {"id": 10039, "synset": "posthole_digger.n.01", "name": "posthole_digger"}, - {"id": 10040, "synset": "post_horn.n.01", "name": "post_horn"}, - {"id": 10041, "synset": "posthouse.n.01", "name": "posthouse"}, - {"id": 10042, "synset": "potbelly.n.02", "name": "potbelly"}, - {"id": 10043, "synset": "potemkin_village.n.01", "name": "Potemkin_village"}, - {"id": 10044, "synset": "potential_divider.n.01", "name": "potential_divider"}, - {"id": 10045, "synset": "potentiometer.n.02", "name": "potentiometer"}, - {"id": 10046, "synset": "potentiometer.n.01", "name": "potentiometer"}, - {"id": 10047, "synset": "potpourri.n.03", "name": "potpourri"}, - {"id": 10048, "synset": "potsherd.n.01", "name": "potsherd"}, - {"id": 10049, "synset": "potter's_wheel.n.01", "name": "potter's_wheel"}, - {"id": 10050, "synset": "pottle.n.01", "name": "pottle"}, - {"id": 10051, "synset": "potty_seat.n.01", "name": "potty_seat"}, - {"id": 10052, "synset": "poultice.n.01", "name": "poultice"}, - {"id": 10053, "synset": "pound.n.13", "name": "pound"}, - {"id": 10054, "synset": "pound_net.n.01", "name": "pound_net"}, - {"id": 10055, "synset": "powder.n.03", "name": "powder"}, - {"id": 10056, "synset": "powder_and_shot.n.01", "name": "powder_and_shot"}, - {"id": 10057, "synset": "powdered_mustard.n.01", "name": "powdered_mustard"}, - {"id": 10058, "synset": "powder_horn.n.01", "name": "powder_horn"}, - {"id": 10059, "synset": "powder_keg.n.02", "name": "powder_keg"}, - {"id": 10060, "synset": "power_brake.n.01", "name": "power_brake"}, - {"id": 10061, "synset": "power_cord.n.01", "name": "power_cord"}, - {"id": 10062, "synset": "power_drill.n.01", "name": "power_drill"}, - {"id": 10063, "synset": "power_line.n.01", "name": "power_line"}, - {"id": 10064, "synset": "power_loom.n.01", "name": "power_loom"}, - {"id": 10065, "synset": "power_mower.n.01", "name": "power_mower"}, - {"id": 10066, "synset": "power_pack.n.01", "name": "power_pack"}, - {"id": 10067, "synset": "power_saw.n.01", "name": "power_saw"}, - {"id": 10068, "synset": "power_steering.n.01", "name": "power_steering"}, - {"id": 10069, "synset": "power_takeoff.n.01", "name": "power_takeoff"}, - {"id": 10070, "synset": "power_tool.n.01", "name": "power_tool"}, - {"id": 10071, "synset": "praetorium.n.01", "name": "praetorium"}, - {"id": 10072, "synset": "prayer_rug.n.01", "name": "prayer_rug"}, - {"id": 10073, "synset": "prayer_shawl.n.01", "name": "prayer_shawl"}, - {"id": 10074, "synset": "precipitator.n.01", "name": "precipitator"}, - {"id": 10075, "synset": "prefab.n.01", "name": "prefab"}, - {"id": 10076, "synset": "presbytery.n.01", "name": "presbytery"}, - {"id": 10077, "synset": "presence_chamber.n.01", "name": "presence_chamber"}, - {"id": 10078, "synset": "press.n.07", "name": "press"}, - {"id": 10079, "synset": "press.n.03", "name": "press"}, - {"id": 10080, "synset": "press.n.06", "name": "press"}, - {"id": 10081, "synset": "press_box.n.01", "name": "press_box"}, - {"id": 10082, "synset": "press_gallery.n.01", "name": "press_gallery"}, - {"id": 10083, "synset": "press_of_sail.n.01", "name": "press_of_sail"}, - {"id": 10084, "synset": "pressure_cabin.n.01", "name": "pressure_cabin"}, - {"id": 10085, "synset": "pressure_cooker.n.01", "name": "pressure_cooker"}, - {"id": 10086, "synset": "pressure_dome.n.01", "name": "pressure_dome"}, - {"id": 10087, "synset": "pressure_gauge.n.01", "name": "pressure_gauge"}, - {"id": 10088, "synset": "pressurized_water_reactor.n.01", "name": "pressurized_water_reactor"}, - {"id": 10089, "synset": "pressure_suit.n.01", "name": "pressure_suit"}, - {"id": 10090, "synset": "pricket.n.01", "name": "pricket"}, - {"id": 10091, "synset": "prie-dieu.n.01", "name": "prie-dieu"}, - {"id": 10092, "synset": "primary_coil.n.01", "name": "primary_coil"}, - {"id": 10093, "synset": "primus_stove.n.01", "name": "Primus_stove"}, - {"id": 10094, "synset": "prince_albert.n.02", "name": "Prince_Albert"}, - {"id": 10095, "synset": "print.n.06", "name": "print"}, - {"id": 10096, "synset": "print_buffer.n.01", "name": "print_buffer"}, - {"id": 10097, "synset": "printed_circuit.n.01", "name": "printed_circuit"}, - {"id": 10098, "synset": "printer.n.02", "name": "printer"}, - {"id": 10099, "synset": "printer_cable.n.01", "name": "printer_cable"}, - {"id": 10100, "synset": "priory.n.01", "name": "priory"}, - {"id": 10101, "synset": "prison.n.01", "name": "prison"}, - {"id": 10102, "synset": "prison_camp.n.01", "name": "prison_camp"}, - {"id": 10103, "synset": "privateer.n.02", "name": "privateer"}, - {"id": 10104, "synset": "private_line.n.01", "name": "private_line"}, - {"id": 10105, "synset": "privet_hedge.n.01", "name": "privet_hedge"}, - {"id": 10106, "synset": "probe.n.02", "name": "probe"}, - {"id": 10107, "synset": "proctoscope.n.01", "name": "proctoscope"}, - {"id": 10108, "synset": "prod.n.02", "name": "prod"}, - {"id": 10109, "synset": "production_line.n.01", "name": "production_line"}, - {"id": 10110, "synset": "projector.n.01", "name": "projector"}, - {"id": 10111, "synset": "prolonge.n.01", "name": "prolonge"}, - {"id": 10112, "synset": "prolonge_knot.n.01", "name": "prolonge_knot"}, - {"id": 10113, "synset": "prompter.n.02", "name": "prompter"}, - {"id": 10114, "synset": "prong.n.01", "name": "prong"}, - {"id": 10115, "synset": "propeller_plane.n.01", "name": "propeller_plane"}, - {"id": 10116, "synset": "propjet.n.01", "name": "propjet"}, - {"id": 10117, "synset": "proportional_counter_tube.n.01", "name": "proportional_counter_tube"}, - {"id": 10118, "synset": "propulsion_system.n.01", "name": "propulsion_system"}, - {"id": 10119, "synset": "proscenium.n.02", "name": "proscenium"}, - {"id": 10120, "synset": "proscenium_arch.n.01", "name": "proscenium_arch"}, - {"id": 10121, "synset": "prosthesis.n.01", "name": "prosthesis"}, - {"id": 10122, "synset": "protective_covering.n.01", "name": "protective_covering"}, - {"id": 10123, "synset": "protective_garment.n.01", "name": "protective_garment"}, - {"id": 10124, "synset": "proton_accelerator.n.01", "name": "proton_accelerator"}, - {"id": 10125, "synset": "protractor.n.01", "name": "protractor"}, - {"id": 10126, "synset": "pruner.n.02", "name": "pruner"}, - {"id": 10127, "synset": "pruning_knife.n.01", "name": "pruning_knife"}, - {"id": 10128, "synset": "pruning_saw.n.01", "name": "pruning_saw"}, - {"id": 10129, "synset": "pruning_shears.n.01", "name": "pruning_shears"}, - {"id": 10130, "synset": "psaltery.n.01", "name": "psaltery"}, - {"id": 10131, "synset": "psychrometer.n.01", "name": "psychrometer"}, - {"id": 10132, "synset": "pt_boat.n.01", "name": "PT_boat"}, - {"id": 10133, "synset": "public_address_system.n.01", "name": "public_address_system"}, - {"id": 10134, "synset": "public_house.n.01", "name": "public_house"}, - {"id": 10135, "synset": "public_toilet.n.01", "name": "public_toilet"}, - {"id": 10136, "synset": "public_transport.n.01", "name": "public_transport"}, - {"id": 10137, "synset": "public_works.n.01", "name": "public_works"}, - {"id": 10138, "synset": "puck.n.02", "name": "puck"}, - {"id": 10139, "synset": "pull.n.04", "name": "pull"}, - {"id": 10140, "synset": "pullback.n.01", "name": "pullback"}, - {"id": 10141, "synset": "pull_chain.n.01", "name": "pull_chain"}, - {"id": 10142, "synset": "pulley.n.01", "name": "pulley"}, - {"id": 10143, "synset": "pull-off.n.01", "name": "pull-off"}, - {"id": 10144, "synset": "pullman.n.01", "name": "Pullman"}, - {"id": 10145, "synset": "pullover.n.01", "name": "pullover"}, - {"id": 10146, "synset": "pull-through.n.01", "name": "pull-through"}, - {"id": 10147, "synset": "pulse_counter.n.01", "name": "pulse_counter"}, - {"id": 10148, "synset": "pulse_generator.n.01", "name": "pulse_generator"}, - {"id": 10149, "synset": "pulse_timing_circuit.n.01", "name": "pulse_timing_circuit"}, - {"id": 10150, "synset": "pump.n.01", "name": "pump"}, - {"id": 10151, "synset": "pump.n.03", "name": "pump"}, - {"id": 10152, "synset": "pump_action.n.01", "name": "pump_action"}, - {"id": 10153, "synset": "pump_house.n.01", "name": "pump_house"}, - {"id": 10154, "synset": "pump_room.n.01", "name": "pump_room"}, - {"id": 10155, "synset": "pump-type_pliers.n.01", "name": "pump-type_pliers"}, - {"id": 10156, "synset": "pump_well.n.01", "name": "pump_well"}, - {"id": 10157, "synset": "punchboard.n.01", "name": "punchboard"}, - {"id": 10158, "synset": "punch_bowl.n.01", "name": "punch_bowl"}, - {"id": 10159, "synset": "punching_bag.n.02", "name": "punching_bag"}, - {"id": 10160, "synset": "punch_pliers.n.01", "name": "punch_pliers"}, - {"id": 10161, "synset": "punch_press.n.01", "name": "punch_press"}, - {"id": 10162, "synset": "punnet.n.01", "name": "punnet"}, - {"id": 10163, "synset": "punt.n.02", "name": "punt"}, - {"id": 10164, "synset": "pup_tent.n.01", "name": "pup_tent"}, - {"id": 10165, "synset": "purdah.n.03", "name": "purdah"}, - {"id": 10166, "synset": "purifier.n.01", "name": "purifier"}, - {"id": 10167, "synset": "purl.n.02", "name": "purl"}, - {"id": 10168, "synset": "purse.n.03", "name": "purse"}, - {"id": 10169, "synset": "push-bike.n.01", "name": "push-bike"}, - {"id": 10170, "synset": "push_broom.n.01", "name": "push_broom"}, - {"id": 10171, "synset": "push_button.n.01", "name": "push_button"}, - {"id": 10172, "synset": "push-button_radio.n.01", "name": "push-button_radio"}, - {"id": 10173, "synset": "pusher.n.04", "name": "pusher"}, - {"id": 10174, "synset": "put-put.n.01", "name": "put-put"}, - {"id": 10175, "synset": "puttee.n.01", "name": "puttee"}, - {"id": 10176, "synset": "putter.n.02", "name": "putter"}, - {"id": 10177, "synset": "putty_knife.n.01", "name": "putty_knife"}, - {"id": 10178, "synset": "puzzle.n.02", "name": "puzzle"}, - {"id": 10179, "synset": "pylon.n.02", "name": "pylon"}, - {"id": 10180, "synset": "pylon.n.01", "name": "pylon"}, - {"id": 10181, "synset": "pyramidal_tent.n.01", "name": "pyramidal_tent"}, - {"id": 10182, "synset": "pyrograph.n.01", "name": "pyrograph"}, - {"id": 10183, "synset": "pyrometer.n.01", "name": "pyrometer"}, - {"id": 10184, "synset": "pyrometric_cone.n.01", "name": "pyrometric_cone"}, - {"id": 10185, "synset": "pyrostat.n.01", "name": "pyrostat"}, - {"id": 10186, "synset": "pyx.n.02", "name": "pyx"}, - {"id": 10187, "synset": "pyx.n.01", "name": "pyx"}, - {"id": 10188, "synset": "pyxis.n.03", "name": "pyxis"}, - {"id": 10189, "synset": "quad.n.04", "name": "quad"}, - {"id": 10190, "synset": "quadrant.n.04", "name": "quadrant"}, - {"id": 10191, "synset": "quadraphony.n.01", "name": "quadraphony"}, - {"id": 10192, "synset": "quartering.n.02", "name": "quartering"}, - {"id": 10193, "synset": "quarterstaff.n.01", "name": "quarterstaff"}, - {"id": 10194, "synset": "quartz_battery.n.01", "name": "quartz_battery"}, - {"id": 10195, "synset": "quartz_lamp.n.01", "name": "quartz_lamp"}, - {"id": 10196, "synset": "queen.n.08", "name": "queen"}, - {"id": 10197, "synset": "queen.n.07", "name": "queen"}, - {"id": 10198, "synset": "queen_post.n.01", "name": "queen_post"}, - {"id": 10199, "synset": "quern.n.01", "name": "quern"}, - {"id": 10200, "synset": "quill.n.01", "name": "quill"}, - {"id": 10201, "synset": "quilted_bedspread.n.01", "name": "quilted_bedspread"}, - {"id": 10202, "synset": "quilting.n.02", "name": "quilting"}, - {"id": 10203, "synset": "quipu.n.01", "name": "quipu"}, - {"id": 10204, "synset": "quirk_molding.n.01", "name": "quirk_molding"}, - {"id": 10205, "synset": "quirt.n.01", "name": "quirt"}, - {"id": 10206, "synset": "quiver.n.03", "name": "quiver"}, - {"id": 10207, "synset": "quoin.n.02", "name": "quoin"}, - {"id": 10208, "synset": "quoit.n.01", "name": "quoit"}, - {"id": 10209, "synset": "qwerty_keyboard.n.01", "name": "QWERTY_keyboard"}, - {"id": 10210, "synset": "rabbet.n.01", "name": "rabbet"}, - {"id": 10211, "synset": "rabbet_joint.n.01", "name": "rabbet_joint"}, - {"id": 10212, "synset": "rabbit_ears.n.01", "name": "rabbit_ears"}, - {"id": 10213, "synset": "rabbit_hutch.n.01", "name": "rabbit_hutch"}, - {"id": 10214, "synset": "raceabout.n.01", "name": "raceabout"}, - {"id": 10215, "synset": "raceway.n.01", "name": "raceway"}, - {"id": 10216, "synset": "racing_boat.n.01", "name": "racing_boat"}, - {"id": 10217, "synset": "racing_gig.n.01", "name": "racing_gig"}, - {"id": 10218, "synset": "racing_skiff.n.01", "name": "racing_skiff"}, - {"id": 10219, "synset": "rack.n.05", "name": "rack"}, - {"id": 10220, "synset": "rack.n.01", "name": "rack"}, - {"id": 10221, "synset": "rack.n.04", "name": "rack"}, - {"id": 10222, "synset": "rack_and_pinion.n.01", "name": "rack_and_pinion"}, - {"id": 10223, "synset": "racquetball.n.01", "name": "racquetball"}, - {"id": 10224, "synset": "radial.n.01", "name": "radial"}, - {"id": 10225, "synset": "radial_engine.n.01", "name": "radial_engine"}, - {"id": 10226, "synset": "radiation_pyrometer.n.01", "name": "radiation_pyrometer"}, - {"id": 10227, "synset": "radiator.n.02", "name": "radiator"}, - {"id": 10228, "synset": "radiator_cap.n.01", "name": "radiator_cap"}, - {"id": 10229, "synset": "radiator_hose.n.01", "name": "radiator_hose"}, - {"id": 10230, "synset": "radio.n.03", "name": "radio"}, - {"id": 10231, "synset": "radio_antenna.n.01", "name": "radio_antenna"}, - {"id": 10232, "synset": "radio_chassis.n.01", "name": "radio_chassis"}, - {"id": 10233, "synset": "radio_compass.n.01", "name": "radio_compass"}, - {"id": 10234, "synset": "radiogram.n.02", "name": "radiogram"}, - {"id": 10235, "synset": "radio_interferometer.n.01", "name": "radio_interferometer"}, - {"id": 10236, "synset": "radio_link.n.01", "name": "radio_link"}, - {"id": 10237, "synset": "radiometer.n.01", "name": "radiometer"}, - {"id": 10238, "synset": "radiomicrometer.n.01", "name": "radiomicrometer"}, - {"id": 10239, "synset": "radio-phonograph.n.01", "name": "radio-phonograph"}, - {"id": 10240, "synset": "radiotelegraph.n.02", "name": "radiotelegraph"}, - {"id": 10241, "synset": "radiotelephone.n.02", "name": "radiotelephone"}, - {"id": 10242, "synset": "radio_telescope.n.01", "name": "radio_telescope"}, - {"id": 10243, "synset": "radiotherapy_equipment.n.01", "name": "radiotherapy_equipment"}, - {"id": 10244, "synset": "radio_transmitter.n.01", "name": "radio_transmitter"}, - {"id": 10245, "synset": "radome.n.01", "name": "radome"}, - {"id": 10246, "synset": "rafter.n.01", "name": "rafter"}, - {"id": 10247, "synset": "raft_foundation.n.01", "name": "raft_foundation"}, - {"id": 10248, "synset": "rag.n.01", "name": "rag"}, - {"id": 10249, "synset": "ragbag.n.02", "name": "ragbag"}, - {"id": 10250, "synset": "raglan.n.01", "name": "raglan"}, - {"id": 10251, "synset": "raglan_sleeve.n.01", "name": "raglan_sleeve"}, - {"id": 10252, "synset": "rail.n.04", "name": "rail"}, - {"id": 10253, "synset": "rail_fence.n.01", "name": "rail_fence"}, - {"id": 10254, "synset": "railhead.n.01", "name": "railhead"}, - {"id": 10255, "synset": "railing.n.01", "name": "railing"}, - {"id": 10256, "synset": "railing.n.02", "name": "railing"}, - {"id": 10257, "synset": "railroad_bed.n.01", "name": "railroad_bed"}, - {"id": 10258, "synset": "railroad_tunnel.n.01", "name": "railroad_tunnel"}, - {"id": 10259, "synset": "rain_barrel.n.01", "name": "rain_barrel"}, - {"id": 10260, "synset": "rain_gauge.n.01", "name": "rain_gauge"}, - {"id": 10261, "synset": "rain_stick.n.01", "name": "rain_stick"}, - {"id": 10262, "synset": "rake.n.03", "name": "rake"}, - {"id": 10263, "synset": "rake_handle.n.01", "name": "rake_handle"}, - {"id": 10264, "synset": "ram_disk.n.01", "name": "RAM_disk"}, - {"id": 10265, "synset": "ramekin.n.02", "name": "ramekin"}, - {"id": 10266, "synset": "ramjet.n.01", "name": "ramjet"}, - {"id": 10267, "synset": "rammer.n.01", "name": "rammer"}, - {"id": 10268, "synset": "ramp.n.01", "name": "ramp"}, - {"id": 10269, "synset": "rampant_arch.n.01", "name": "rampant_arch"}, - {"id": 10270, "synset": "rampart.n.01", "name": "rampart"}, - {"id": 10271, "synset": "ramrod.n.01", "name": "ramrod"}, - {"id": 10272, "synset": "ramrod.n.03", "name": "ramrod"}, - {"id": 10273, "synset": "ranch.n.01", "name": "ranch"}, - {"id": 10274, "synset": "ranch_house.n.01", "name": "ranch_house"}, - {"id": 10275, "synset": "random-access_memory.n.01", "name": "random-access_memory"}, - {"id": 10276, "synset": "rangefinder.n.01", "name": "rangefinder"}, - {"id": 10277, "synset": "range_hood.n.01", "name": "range_hood"}, - {"id": 10278, "synset": "range_pole.n.01", "name": "range_pole"}, - {"id": 10279, "synset": "rapier.n.01", "name": "rapier"}, - {"id": 10280, "synset": "rariora.n.01", "name": "rariora"}, - {"id": 10281, "synset": "rasp.n.02", "name": "rasp"}, - {"id": 10282, "synset": "ratchet.n.01", "name": "ratchet"}, - {"id": 10283, "synset": "ratchet_wheel.n.01", "name": "ratchet_wheel"}, - {"id": 10284, "synset": "rathskeller.n.01", "name": "rathskeller"}, - {"id": 10285, "synset": "ratline.n.01", "name": "ratline"}, - {"id": 10286, "synset": "rat-tail_file.n.01", "name": "rat-tail_file"}, - {"id": 10287, "synset": "rattan.n.03", "name": "rattan"}, - {"id": 10288, "synset": "rattrap.n.03", "name": "rattrap"}, - {"id": 10289, "synset": "rayon.n.01", "name": "rayon"}, - {"id": 10290, "synset": "razor.n.01", "name": "razor"}, - { - "id": 10291, - "synset": "reaction-propulsion_engine.n.01", - "name": "reaction-propulsion_engine", - }, - {"id": 10292, "synset": "reaction_turbine.n.01", "name": "reaction_turbine"}, - {"id": 10293, "synset": "reactor.n.01", "name": "reactor"}, - {"id": 10294, "synset": "reading_lamp.n.01", "name": "reading_lamp"}, - {"id": 10295, "synset": "reading_room.n.01", "name": "reading_room"}, - {"id": 10296, "synset": "read-only_memory.n.01", "name": "read-only_memory"}, - {"id": 10297, "synset": "read-only_memory_chip.n.01", "name": "read-only_memory_chip"}, - {"id": 10298, "synset": "readout.n.03", "name": "readout"}, - {"id": 10299, "synset": "read/write_head.n.01", "name": "read/write_head"}, - {"id": 10300, "synset": "ready-to-wear.n.01", "name": "ready-to-wear"}, - {"id": 10301, "synset": "real_storage.n.01", "name": "real_storage"}, - {"id": 10302, "synset": "reamer.n.02", "name": "reamer"}, - {"id": 10303, "synset": "reaumur_thermometer.n.01", "name": "Reaumur_thermometer"}, - {"id": 10304, "synset": "rebozo.n.01", "name": "rebozo"}, - {"id": 10305, "synset": "receiver.n.01", "name": "receiver"}, - {"id": 10306, "synset": "receptacle.n.01", "name": "receptacle"}, - {"id": 10307, "synset": "reception_desk.n.01", "name": "reception_desk"}, - {"id": 10308, "synset": "reception_room.n.01", "name": "reception_room"}, - {"id": 10309, "synset": "recess.n.04", "name": "recess"}, - {"id": 10310, "synset": "reciprocating_engine.n.01", "name": "reciprocating_engine"}, - {"id": 10311, "synset": "reconnaissance_plane.n.01", "name": "reconnaissance_plane"}, - {"id": 10312, "synset": "reconnaissance_vehicle.n.01", "name": "reconnaissance_vehicle"}, - {"id": 10313, "synset": "record_changer.n.01", "name": "record_changer"}, - {"id": 10314, "synset": "recorder.n.01", "name": "recorder"}, - {"id": 10315, "synset": "recording.n.03", "name": "recording"}, - {"id": 10316, "synset": "recording_system.n.01", "name": "recording_system"}, - {"id": 10317, "synset": "record_sleeve.n.01", "name": "record_sleeve"}, - {"id": 10318, "synset": "recovery_room.n.01", "name": "recovery_room"}, - {"id": 10319, "synset": "recreational_vehicle.n.01", "name": "recreational_vehicle"}, - {"id": 10320, "synset": "recreation_room.n.01", "name": "recreation_room"}, - {"id": 10321, "synset": "recycling_bin.n.01", "name": "recycling_bin"}, - {"id": 10322, "synset": "recycling_plant.n.01", "name": "recycling_plant"}, - {"id": 10323, "synset": "redbrick_university.n.01", "name": "redbrick_university"}, - {"id": 10324, "synset": "red_carpet.n.01", "name": "red_carpet"}, - {"id": 10325, "synset": "redoubt.n.02", "name": "redoubt"}, - {"id": 10326, "synset": "redoubt.n.01", "name": "redoubt"}, - {"id": 10327, "synset": "reduction_gear.n.01", "name": "reduction_gear"}, - {"id": 10328, "synset": "reed_pipe.n.01", "name": "reed_pipe"}, - {"id": 10329, "synset": "reed_stop.n.01", "name": "reed_stop"}, - {"id": 10330, "synset": "reef_knot.n.01", "name": "reef_knot"}, - {"id": 10331, "synset": "reel.n.03", "name": "reel"}, - {"id": 10332, "synset": "reel.n.01", "name": "reel"}, - {"id": 10333, "synset": "refectory.n.01", "name": "refectory"}, - {"id": 10334, "synset": "refectory_table.n.01", "name": "refectory_table"}, - {"id": 10335, "synset": "refinery.n.01", "name": "refinery"}, - {"id": 10336, "synset": "reflecting_telescope.n.01", "name": "reflecting_telescope"}, - {"id": 10337, "synset": "reflectometer.n.01", "name": "reflectometer"}, - {"id": 10338, "synset": "reflex_camera.n.01", "name": "reflex_camera"}, - {"id": 10339, "synset": "reflux_condenser.n.01", "name": "reflux_condenser"}, - {"id": 10340, "synset": "reformatory.n.01", "name": "reformatory"}, - {"id": 10341, "synset": "reformer.n.02", "name": "reformer"}, - {"id": 10342, "synset": "refracting_telescope.n.01", "name": "refracting_telescope"}, - {"id": 10343, "synset": "refractometer.n.01", "name": "refractometer"}, - {"id": 10344, "synset": "refrigeration_system.n.01", "name": "refrigeration_system"}, - {"id": 10345, "synset": "refrigerator.n.01", "name": "refrigerator"}, - {"id": 10346, "synset": "refrigerator_car.n.01", "name": "refrigerator_car"}, - {"id": 10347, "synset": "refuge.n.03", "name": "refuge"}, - {"id": 10348, "synset": "regalia.n.01", "name": "regalia"}, - {"id": 10349, "synset": "regimentals.n.01", "name": "regimentals"}, - {"id": 10350, "synset": "regulator.n.01", "name": "regulator"}, - {"id": 10351, "synset": "rein.n.01", "name": "rein"}, - {"id": 10352, "synset": "relay.n.05", "name": "relay"}, - {"id": 10353, "synset": "release.n.08", "name": "release"}, - {"id": 10354, "synset": "religious_residence.n.01", "name": "religious_residence"}, - {"id": 10355, "synset": "reliquary.n.01", "name": "reliquary"}, - {"id": 10356, "synset": "remote_terminal.n.01", "name": "remote_terminal"}, - {"id": 10357, "synset": "removable_disk.n.01", "name": "removable_disk"}, - {"id": 10358, "synset": "rendering.n.05", "name": "rendering"}, - {"id": 10359, "synset": "rep.n.02", "name": "rep"}, - {"id": 10360, "synset": "repair_shop.n.01", "name": "repair_shop"}, - {"id": 10361, "synset": "repeater.n.04", "name": "repeater"}, - {"id": 10362, "synset": "repeating_firearm.n.01", "name": "repeating_firearm"}, - {"id": 10363, "synset": "repository.n.03", "name": "repository"}, - {"id": 10364, "synset": "reproducer.n.01", "name": "reproducer"}, - {"id": 10365, "synset": "rerebrace.n.01", "name": "rerebrace"}, - {"id": 10366, "synset": "rescue_equipment.n.01", "name": "rescue_equipment"}, - {"id": 10367, "synset": "research_center.n.01", "name": "research_center"}, - {"id": 10368, "synset": "reseau.n.02", "name": "reseau"}, - {"id": 10369, "synset": "reservoir.n.03", "name": "reservoir"}, - {"id": 10370, "synset": "reset.n.01", "name": "reset"}, - {"id": 10371, "synset": "reset_button.n.01", "name": "reset_button"}, - {"id": 10372, "synset": "residence.n.02", "name": "residence"}, - {"id": 10373, "synset": "resistance_pyrometer.n.01", "name": "resistance_pyrometer"}, - {"id": 10374, "synset": "resistor.n.01", "name": "resistor"}, - {"id": 10375, "synset": "resonator.n.03", "name": "resonator"}, - {"id": 10376, "synset": "resonator.n.01", "name": "resonator"}, - {"id": 10377, "synset": "resort_hotel.n.02", "name": "resort_hotel"}, - {"id": 10378, "synset": "respirator.n.01", "name": "respirator"}, - {"id": 10379, "synset": "restaurant.n.01", "name": "restaurant"}, - {"id": 10380, "synset": "rest_house.n.01", "name": "rest_house"}, - {"id": 10381, "synset": "restraint.n.06", "name": "restraint"}, - {"id": 10382, "synset": "resuscitator.n.01", "name": "resuscitator"}, - {"id": 10383, "synset": "retainer.n.03", "name": "retainer"}, - {"id": 10384, "synset": "retaining_wall.n.01", "name": "retaining_wall"}, - {"id": 10385, "synset": "reticle.n.01", "name": "reticle"}, - {"id": 10386, "synset": "reticulation.n.02", "name": "reticulation"}, - {"id": 10387, "synset": "reticule.n.01", "name": "reticule"}, - {"id": 10388, "synset": "retort.n.02", "name": "retort"}, - {"id": 10389, "synset": "retractor.n.01", "name": "retractor"}, - {"id": 10390, "synset": "return_key.n.01", "name": "return_key"}, - {"id": 10391, "synset": "reverberatory_furnace.n.01", "name": "reverberatory_furnace"}, - {"id": 10392, "synset": "revers.n.01", "name": "revers"}, - {"id": 10393, "synset": "reverse.n.02", "name": "reverse"}, - {"id": 10394, "synset": "reversible.n.01", "name": "reversible"}, - {"id": 10395, "synset": "revetment.n.02", "name": "revetment"}, - {"id": 10396, "synset": "revetment.n.01", "name": "revetment"}, - {"id": 10397, "synset": "revolver.n.01", "name": "revolver"}, - {"id": 10398, "synset": "revolving_door.n.02", "name": "revolving_door"}, - {"id": 10399, "synset": "rheometer.n.01", "name": "rheometer"}, - {"id": 10400, "synset": "rheostat.n.01", "name": "rheostat"}, - {"id": 10401, "synset": "rhinoscope.n.01", "name": "rhinoscope"}, - {"id": 10402, "synset": "rib.n.01", "name": "rib"}, - {"id": 10403, "synset": "riband.n.01", "name": "riband"}, - {"id": 10404, "synset": "ribbed_vault.n.01", "name": "ribbed_vault"}, - {"id": 10405, "synset": "ribbing.n.01", "name": "ribbing"}, - {"id": 10406, "synset": "ribbon_development.n.01", "name": "ribbon_development"}, - {"id": 10407, "synset": "rib_joint_pliers.n.01", "name": "rib_joint_pliers"}, - {"id": 10408, "synset": "ricer.n.01", "name": "ricer"}, - {"id": 10409, "synset": "riddle.n.02", "name": "riddle"}, - {"id": 10410, "synset": "ride.n.02", "name": "ride"}, - {"id": 10411, "synset": "ridge.n.06", "name": "ridge"}, - {"id": 10412, "synset": "ridge_rope.n.01", "name": "ridge_rope"}, - {"id": 10413, "synset": "riding_boot.n.01", "name": "riding_boot"}, - {"id": 10414, "synset": "riding_crop.n.01", "name": "riding_crop"}, - {"id": 10415, "synset": "riding_mower.n.01", "name": "riding_mower"}, - {"id": 10416, "synset": "rifle_ball.n.01", "name": "rifle_ball"}, - {"id": 10417, "synset": "rifle_grenade.n.01", "name": "rifle_grenade"}, - {"id": 10418, "synset": "rig.n.01", "name": "rig"}, - {"id": 10419, "synset": "rigger.n.02", "name": "rigger"}, - {"id": 10420, "synset": "rigger.n.04", "name": "rigger"}, - {"id": 10421, "synset": "rigging.n.01", "name": "rigging"}, - {"id": 10422, "synset": "rigout.n.01", "name": "rigout"}, - {"id": 10423, "synset": "ringlet.n.03", "name": "ringlet"}, - {"id": 10424, "synset": "rings.n.01", "name": "rings"}, - {"id": 10425, "synset": "rink.n.01", "name": "rink"}, - {"id": 10426, "synset": "riot_gun.n.01", "name": "riot_gun"}, - {"id": 10427, "synset": "ripcord.n.02", "name": "ripcord"}, - {"id": 10428, "synset": "ripcord.n.01", "name": "ripcord"}, - {"id": 10429, "synset": "ripping_bar.n.01", "name": "ripping_bar"}, - {"id": 10430, "synset": "ripping_chisel.n.01", "name": "ripping_chisel"}, - {"id": 10431, "synset": "ripsaw.n.01", "name": "ripsaw"}, - {"id": 10432, "synset": "riser.n.03", "name": "riser"}, - {"id": 10433, "synset": "riser.n.02", "name": "riser"}, - {"id": 10434, "synset": "ritz.n.03", "name": "Ritz"}, - {"id": 10435, "synset": "rivet.n.02", "name": "rivet"}, - {"id": 10436, "synset": "riveting_machine.n.01", "name": "riveting_machine"}, - {"id": 10437, "synset": "roach_clip.n.01", "name": "roach_clip"}, - {"id": 10438, "synset": "road.n.01", "name": "road"}, - {"id": 10439, "synset": "roadbed.n.01", "name": "roadbed"}, - {"id": 10440, "synset": "roadblock.n.02", "name": "roadblock"}, - {"id": 10441, "synset": "roadhouse.n.01", "name": "roadhouse"}, - {"id": 10442, "synset": "roadster.n.01", "name": "roadster"}, - {"id": 10443, "synset": "roadway.n.01", "name": "roadway"}, - {"id": 10444, "synset": "roaster.n.04", "name": "roaster"}, - {"id": 10445, "synset": "robotics_equipment.n.01", "name": "robotics_equipment"}, - {"id": 10446, "synset": "rochon_prism.n.01", "name": "Rochon_prism"}, - {"id": 10447, "synset": "rock_bit.n.01", "name": "rock_bit"}, - {"id": 10448, "synset": "rocker.n.07", "name": "rocker"}, - {"id": 10449, "synset": "rocker.n.05", "name": "rocker"}, - {"id": 10450, "synset": "rocker_arm.n.01", "name": "rocker_arm"}, - {"id": 10451, "synset": "rocket.n.02", "name": "rocket"}, - {"id": 10452, "synset": "rocket.n.01", "name": "rocket"}, - {"id": 10453, "synset": "rod.n.01", "name": "rod"}, - {"id": 10454, "synset": "rodeo.n.02", "name": "rodeo"}, - {"id": 10455, "synset": "roll.n.04", "name": "roll"}, - {"id": 10456, "synset": "roller.n.04", "name": "roller"}, - {"id": 10457, "synset": "roller.n.03", "name": "roller"}, - {"id": 10458, "synset": "roller_bandage.n.01", "name": "roller_bandage"}, - {"id": 10459, "synset": "in-line_skate.n.01", "name": "in-line_skate"}, - {"id": 10460, "synset": "roller_blind.n.01", "name": "roller_blind"}, - {"id": 10461, "synset": "roller_coaster.n.02", "name": "roller_coaster"}, - {"id": 10462, "synset": "roller_towel.n.01", "name": "roller_towel"}, - {"id": 10463, "synset": "roll_film.n.01", "name": "roll_film"}, - {"id": 10464, "synset": "rolling_hitch.n.01", "name": "rolling_hitch"}, - {"id": 10465, "synset": "rolling_mill.n.01", "name": "rolling_mill"}, - {"id": 10466, "synset": "rolling_stock.n.01", "name": "rolling_stock"}, - {"id": 10467, "synset": "roll-on.n.02", "name": "roll-on"}, - {"id": 10468, "synset": "roll-on.n.01", "name": "roll-on"}, - {"id": 10469, "synset": "roll-on_roll-off.n.01", "name": "roll-on_roll-off"}, - {"id": 10470, "synset": "rolodex.n.01", "name": "Rolodex"}, - {"id": 10471, "synset": "roman_arch.n.01", "name": "Roman_arch"}, - {"id": 10472, "synset": "roman_building.n.01", "name": "Roman_building"}, - {"id": 10473, "synset": "romper.n.02", "name": "romper"}, - {"id": 10474, "synset": "rood_screen.n.01", "name": "rood_screen"}, - {"id": 10475, "synset": "roof.n.01", "name": "roof"}, - {"id": 10476, "synset": "roof.n.02", "name": "roof"}, - {"id": 10477, "synset": "roofing.n.01", "name": "roofing"}, - {"id": 10478, "synset": "room.n.01", "name": "room"}, - {"id": 10479, "synset": "roomette.n.01", "name": "roomette"}, - {"id": 10480, "synset": "room_light.n.01", "name": "room_light"}, - {"id": 10481, "synset": "roost.n.01", "name": "roost"}, - {"id": 10482, "synset": "rope.n.01", "name": "rope"}, - {"id": 10483, "synset": "rope_bridge.n.01", "name": "rope_bridge"}, - {"id": 10484, "synset": "rope_tow.n.01", "name": "rope_tow"}, - {"id": 10485, "synset": "rose_water.n.01", "name": "rose_water"}, - {"id": 10486, "synset": "rose_window.n.01", "name": "rose_window"}, - {"id": 10487, "synset": "rosin_bag.n.01", "name": "rosin_bag"}, - {"id": 10488, "synset": "rotary_actuator.n.01", "name": "rotary_actuator"}, - {"id": 10489, "synset": "rotary_engine.n.01", "name": "rotary_engine"}, - {"id": 10490, "synset": "rotary_press.n.01", "name": "rotary_press"}, - {"id": 10491, "synset": "rotating_mechanism.n.01", "name": "rotating_mechanism"}, - {"id": 10492, "synset": "rotating_shaft.n.01", "name": "rotating_shaft"}, - {"id": 10493, "synset": "rotisserie.n.02", "name": "rotisserie"}, - {"id": 10494, "synset": "rotisserie.n.01", "name": "rotisserie"}, - {"id": 10495, "synset": "rotor.n.03", "name": "rotor"}, - {"id": 10496, "synset": "rotor.n.01", "name": "rotor"}, - {"id": 10497, "synset": "rotor.n.02", "name": "rotor"}, - {"id": 10498, "synset": "rotor_blade.n.01", "name": "rotor_blade"}, - {"id": 10499, "synset": "rotor_head.n.01", "name": "rotor_head"}, - {"id": 10500, "synset": "rotunda.n.02", "name": "rotunda"}, - {"id": 10501, "synset": "rotunda.n.01", "name": "rotunda"}, - {"id": 10502, "synset": "rouge.n.01", "name": "rouge"}, - {"id": 10503, "synset": "roughcast.n.02", "name": "roughcast"}, - {"id": 10504, "synset": "rouleau.n.02", "name": "rouleau"}, - {"id": 10505, "synset": "roulette.n.02", "name": "roulette"}, - {"id": 10506, "synset": "roulette_ball.n.01", "name": "roulette_ball"}, - {"id": 10507, "synset": "roulette_wheel.n.01", "name": "roulette_wheel"}, - {"id": 10508, "synset": "round.n.01", "name": "round"}, - {"id": 10509, "synset": "round_arch.n.01", "name": "round_arch"}, - {"id": 10510, "synset": "round-bottom_flask.n.01", "name": "round-bottom_flask"}, - {"id": 10511, "synset": "roundel.n.02", "name": "roundel"}, - {"id": 10512, "synset": "round_file.n.01", "name": "round_file"}, - {"id": 10513, "synset": "roundhouse.n.01", "name": "roundhouse"}, - {"id": 10514, "synset": "router.n.03", "name": "router"}, - {"id": 10515, "synset": "router_plane.n.01", "name": "router_plane"}, - {"id": 10516, "synset": "rowel.n.01", "name": "rowel"}, - {"id": 10517, "synset": "row_house.n.01", "name": "row_house"}, - {"id": 10518, "synset": "rowing_boat.n.01", "name": "rowing_boat"}, - {"id": 10519, "synset": "rowlock_arch.n.01", "name": "rowlock_arch"}, - {"id": 10520, "synset": "royal.n.01", "name": "royal"}, - {"id": 10521, "synset": "royal_mast.n.01", "name": "royal_mast"}, - {"id": 10522, "synset": "rubber_boot.n.01", "name": "rubber_boot"}, - {"id": 10523, "synset": "rubber_bullet.n.01", "name": "rubber_bullet"}, - {"id": 10524, "synset": "rubber_eraser.n.01", "name": "rubber_eraser"}, - {"id": 10525, "synset": "rudder.n.02", "name": "rudder"}, - {"id": 10526, "synset": "rudder.n.01", "name": "rudder"}, - {"id": 10527, "synset": "rudder_blade.n.01", "name": "rudder_blade"}, - {"id": 10528, "synset": "rug.n.01", "name": "rug"}, - {"id": 10529, "synset": "rugby_ball.n.01", "name": "rugby_ball"}, - {"id": 10530, "synset": "ruin.n.02", "name": "ruin"}, - {"id": 10531, "synset": "rule.n.12", "name": "rule"}, - {"id": 10532, "synset": "rumble.n.02", "name": "rumble"}, - {"id": 10533, "synset": "rumble_seat.n.01", "name": "rumble_seat"}, - {"id": 10534, "synset": "rummer.n.01", "name": "rummer"}, - {"id": 10535, "synset": "rumpus_room.n.01", "name": "rumpus_room"}, - {"id": 10536, "synset": "runcible_spoon.n.01", "name": "runcible_spoon"}, - {"id": 10537, "synset": "rundle.n.01", "name": "rundle"}, - {"id": 10538, "synset": "running_shoe.n.01", "name": "running_shoe"}, - {"id": 10539, "synset": "running_suit.n.01", "name": "running_suit"}, - {"id": 10540, "synset": "runway.n.04", "name": "runway"}, - {"id": 10541, "synset": "rushlight.n.01", "name": "rushlight"}, - {"id": 10542, "synset": "russet.n.01", "name": "russet"}, - {"id": 10543, "synset": "rya.n.01", "name": "rya"}, - {"id": 10544, "synset": "saber.n.01", "name": "saber"}, - {"id": 10545, "synset": "saber_saw.n.01", "name": "saber_saw"}, - {"id": 10546, "synset": "sable.n.04", "name": "sable"}, - {"id": 10547, "synset": "sable.n.01", "name": "sable"}, - {"id": 10548, "synset": "sable_coat.n.01", "name": "sable_coat"}, - {"id": 10549, "synset": "sabot.n.01", "name": "sabot"}, - {"id": 10550, "synset": "sachet.n.01", "name": "sachet"}, - {"id": 10551, "synset": "sack.n.05", "name": "sack"}, - {"id": 10552, "synset": "sackbut.n.01", "name": "sackbut"}, - {"id": 10553, "synset": "sackcloth.n.02", "name": "sackcloth"}, - {"id": 10554, "synset": "sackcloth.n.01", "name": "sackcloth"}, - {"id": 10555, "synset": "sack_coat.n.01", "name": "sack_coat"}, - {"id": 10556, "synset": "sacking.n.01", "name": "sacking"}, - {"id": 10557, "synset": "saddle_oxford.n.01", "name": "saddle_oxford"}, - {"id": 10558, "synset": "saddlery.n.02", "name": "saddlery"}, - {"id": 10559, "synset": "saddle_seat.n.01", "name": "saddle_seat"}, - {"id": 10560, "synset": "saddle_stitch.n.01", "name": "saddle_stitch"}, - {"id": 10561, "synset": "safe.n.01", "name": "safe"}, - {"id": 10562, "synset": "safe.n.02", "name": "safe"}, - {"id": 10563, "synset": "safe-deposit.n.01", "name": "safe-deposit"}, - {"id": 10564, "synset": "safe_house.n.01", "name": "safe_house"}, - {"id": 10565, "synset": "safety_arch.n.01", "name": "safety_arch"}, - {"id": 10566, "synset": "safety_belt.n.01", "name": "safety_belt"}, - {"id": 10567, "synset": "safety_bicycle.n.01", "name": "safety_bicycle"}, - {"id": 10568, "synset": "safety_bolt.n.01", "name": "safety_bolt"}, - {"id": 10569, "synset": "safety_curtain.n.01", "name": "safety_curtain"}, - {"id": 10570, "synset": "safety_fuse.n.01", "name": "safety_fuse"}, - {"id": 10571, "synset": "safety_lamp.n.01", "name": "safety_lamp"}, - {"id": 10572, "synset": "safety_match.n.01", "name": "safety_match"}, - {"id": 10573, "synset": "safety_net.n.02", "name": "safety_net"}, - {"id": 10574, "synset": "safety_rail.n.01", "name": "safety_rail"}, - {"id": 10575, "synset": "safety_razor.n.01", "name": "safety_razor"}, - {"id": 10576, "synset": "safety_valve.n.01", "name": "safety_valve"}, - {"id": 10577, "synset": "sail.n.03", "name": "sail"}, - {"id": 10578, "synset": "sailboat.n.01", "name": "sailboat"}, - {"id": 10579, "synset": "sailcloth.n.01", "name": "sailcloth"}, - {"id": 10580, "synset": "sailing_vessel.n.01", "name": "sailing_vessel"}, - {"id": 10581, "synset": "sailing_warship.n.01", "name": "sailing_warship"}, - {"id": 10582, "synset": "sailor_cap.n.01", "name": "sailor_cap"}, - {"id": 10583, "synset": "sailor_suit.n.01", "name": "sailor_suit"}, - {"id": 10584, "synset": "salad_bar.n.01", "name": "salad_bar"}, - {"id": 10585, "synset": "salad_bowl.n.02", "name": "salad_bowl"}, - {"id": 10586, "synset": "salinometer.n.01", "name": "salinometer"}, - {"id": 10587, "synset": "sallet.n.01", "name": "sallet"}, - {"id": 10588, "synset": "salon.n.03", "name": "salon"}, - {"id": 10589, "synset": "salon.n.01", "name": "salon"}, - {"id": 10590, "synset": "salon.n.02", "name": "salon"}, - {"id": 10591, "synset": "saltbox.n.01", "name": "saltbox"}, - {"id": 10592, "synset": "saltcellar.n.01", "name": "saltcellar"}, - {"id": 10593, "synset": "saltworks.n.01", "name": "saltworks"}, - {"id": 10594, "synset": "salver.n.01", "name": "salver"}, - {"id": 10595, "synset": "salwar.n.01", "name": "salwar"}, - {"id": 10596, "synset": "sam_browne_belt.n.01", "name": "Sam_Browne_belt"}, - {"id": 10597, "synset": "samisen.n.01", "name": "samisen"}, - {"id": 10598, "synset": "samite.n.01", "name": "samite"}, - {"id": 10599, "synset": "samovar.n.01", "name": "samovar"}, - {"id": 10600, "synset": "sampan.n.01", "name": "sampan"}, - {"id": 10601, "synset": "sandbag.n.01", "name": "sandbag"}, - {"id": 10602, "synset": "sandblaster.n.01", "name": "sandblaster"}, - {"id": 10603, "synset": "sandbox.n.01", "name": "sandbox"}, - {"id": 10604, "synset": "sandglass.n.01", "name": "sandglass"}, - {"id": 10605, "synset": "sand_wedge.n.01", "name": "sand_wedge"}, - {"id": 10606, "synset": "sandwich_board.n.01", "name": "sandwich_board"}, - {"id": 10607, "synset": "sanitary_napkin.n.01", "name": "sanitary_napkin"}, - {"id": 10608, "synset": "cling_film.n.01", "name": "cling_film"}, - {"id": 10609, "synset": "sarcenet.n.01", "name": "sarcenet"}, - {"id": 10610, "synset": "sarcophagus.n.01", "name": "sarcophagus"}, - {"id": 10611, "synset": "sari.n.01", "name": "sari"}, - {"id": 10612, "synset": "sarong.n.01", "name": "sarong"}, - {"id": 10613, "synset": "sash.n.01", "name": "sash"}, - {"id": 10614, "synset": "sash_fastener.n.01", "name": "sash_fastener"}, - {"id": 10615, "synset": "sash_window.n.01", "name": "sash_window"}, - {"id": 10616, "synset": "sateen.n.01", "name": "sateen"}, - {"id": 10617, "synset": "satellite.n.01", "name": "satellite"}, - {"id": 10618, "synset": "satellite_receiver.n.01", "name": "satellite_receiver"}, - {"id": 10619, "synset": "satellite_television.n.01", "name": "satellite_television"}, - {"id": 10620, "synset": "satellite_transmitter.n.01", "name": "satellite_transmitter"}, - {"id": 10621, "synset": "satin.n.01", "name": "satin"}, - {"id": 10622, "synset": "saturday_night_special.n.01", "name": "Saturday_night_special"}, - {"id": 10623, "synset": "saucepot.n.01", "name": "saucepot"}, - {"id": 10624, "synset": "sauna.n.01", "name": "sauna"}, - {"id": 10625, "synset": "savings_bank.n.02", "name": "savings_bank"}, - {"id": 10626, "synset": "saw.n.02", "name": "saw"}, - {"id": 10627, "synset": "sawed-off_shotgun.n.01", "name": "sawed-off_shotgun"}, - {"id": 10628, "synset": "sawmill.n.01", "name": "sawmill"}, - {"id": 10629, "synset": "saw_set.n.01", "name": "saw_set"}, - {"id": 10630, "synset": "saxhorn.n.01", "name": "saxhorn"}, - {"id": 10631, "synset": "scabbard.n.01", "name": "scabbard"}, - {"id": 10632, "synset": "scaffolding.n.01", "name": "scaffolding"}, - {"id": 10633, "synset": "scale.n.08", "name": "scale"}, - {"id": 10634, "synset": "scaler.n.01", "name": "scaler"}, - {"id": 10635, "synset": "scaling_ladder.n.01", "name": "scaling_ladder"}, - {"id": 10636, "synset": "scalpel.n.01", "name": "scalpel"}, - {"id": 10637, "synset": "scanner.n.04", "name": "scanner"}, - {"id": 10638, "synset": "scanner.n.03", "name": "scanner"}, - {"id": 10639, "synset": "scanner.n.02", "name": "scanner"}, - {"id": 10640, "synset": "scantling.n.01", "name": "scantling"}, - {"id": 10641, "synset": "scarf_joint.n.01", "name": "scarf_joint"}, - {"id": 10642, "synset": "scatter_rug.n.01", "name": "scatter_rug"}, - {"id": 10643, "synset": "scauper.n.01", "name": "scauper"}, - {"id": 10644, "synset": "schmidt_telescope.n.01", "name": "Schmidt_telescope"}, - {"id": 10645, "synset": "school.n.02", "name": "school"}, - {"id": 10646, "synset": "schoolbag.n.01", "name": "schoolbag"}, - {"id": 10647, "synset": "school_bell.n.01", "name": "school_bell"}, - {"id": 10648, "synset": "school_ship.n.01", "name": "school_ship"}, - {"id": 10649, "synset": "school_system.n.01", "name": "school_system"}, - {"id": 10650, "synset": "schooner.n.02", "name": "schooner"}, - {"id": 10651, "synset": "schooner.n.01", "name": "schooner"}, - {"id": 10652, "synset": "scientific_instrument.n.01", "name": "scientific_instrument"}, - {"id": 10653, "synset": "scimitar.n.01", "name": "scimitar"}, - {"id": 10654, "synset": "scintillation_counter.n.01", "name": "scintillation_counter"}, - {"id": 10655, "synset": "sclerometer.n.01", "name": "sclerometer"}, - {"id": 10656, "synset": "scoinson_arch.n.01", "name": "scoinson_arch"}, - {"id": 10657, "synset": "sconce.n.04", "name": "sconce"}, - {"id": 10658, "synset": "sconce.n.03", "name": "sconce"}, - {"id": 10659, "synset": "scoop.n.06", "name": "scoop"}, - {"id": 10660, "synset": "scooter.n.02", "name": "scooter"}, - {"id": 10661, "synset": "scouring_pad.n.01", "name": "scouring_pad"}, - {"id": 10662, "synset": "scow.n.02", "name": "scow"}, - {"id": 10663, "synset": "scow.n.01", "name": "scow"}, - {"id": 10664, "synset": "scratcher.n.03", "name": "scratcher"}, - {"id": 10665, "synset": "screen.n.05", "name": "screen"}, - {"id": 10666, "synset": "screen.n.04", "name": "screen"}, - {"id": 10667, "synset": "screen.n.09", "name": "screen"}, - {"id": 10668, "synset": "screen.n.03", "name": "screen"}, - {"id": 10669, "synset": "screen_door.n.01", "name": "screen_door"}, - {"id": 10670, "synset": "screening.n.02", "name": "screening"}, - {"id": 10671, "synset": "screw.n.04", "name": "screw"}, - {"id": 10672, "synset": "screw.n.03", "name": "screw"}, - {"id": 10673, "synset": "screw.n.02", "name": "screw"}, - {"id": 10674, "synset": "screw_eye.n.01", "name": "screw_eye"}, - {"id": 10675, "synset": "screw_key.n.01", "name": "screw_key"}, - {"id": 10676, "synset": "screw_thread.n.01", "name": "screw_thread"}, - {"id": 10677, "synset": "screwtop.n.01", "name": "screwtop"}, - {"id": 10678, "synset": "screw_wrench.n.01", "name": "screw_wrench"}, - {"id": 10679, "synset": "scriber.n.01", "name": "scriber"}, - {"id": 10680, "synset": "scrim.n.01", "name": "scrim"}, - {"id": 10681, "synset": "scrimshaw.n.01", "name": "scrimshaw"}, - {"id": 10682, "synset": "scriptorium.n.01", "name": "scriptorium"}, - {"id": 10683, "synset": "scrubber.n.03", "name": "scrubber"}, - {"id": 10684, "synset": "scrub_plane.n.01", "name": "scrub_plane"}, - {"id": 10685, "synset": "scuffer.n.01", "name": "scuffer"}, - {"id": 10686, "synset": "scuffle.n.02", "name": "scuffle"}, - {"id": 10687, "synset": "scull.n.02", "name": "scull"}, - {"id": 10688, "synset": "scull.n.01", "name": "scull"}, - {"id": 10689, "synset": "scullery.n.01", "name": "scullery"}, - {"id": 10690, "synset": "scuttle.n.01", "name": "scuttle"}, - {"id": 10691, "synset": "scyphus.n.01", "name": "scyphus"}, - {"id": 10692, "synset": "scythe.n.01", "name": "scythe"}, - {"id": 10693, "synset": "seabag.n.01", "name": "seabag"}, - {"id": 10694, "synset": "sea_boat.n.01", "name": "sea_boat"}, - {"id": 10695, "synset": "sea_chest.n.01", "name": "sea_chest"}, - {"id": 10696, "synset": "sealing_wax.n.01", "name": "sealing_wax"}, - {"id": 10697, "synset": "sealskin.n.02", "name": "sealskin"}, - {"id": 10698, "synset": "seam.n.01", "name": "seam"}, - {"id": 10699, "synset": "searchlight.n.01", "name": "searchlight"}, - {"id": 10700, "synset": "searing_iron.n.01", "name": "searing_iron"}, - {"id": 10701, "synset": "seat.n.04", "name": "seat"}, - {"id": 10702, "synset": "seat.n.03", "name": "seat"}, - {"id": 10703, "synset": "seat.n.09", "name": "seat"}, - {"id": 10704, "synset": "seat_belt.n.01", "name": "seat_belt"}, - {"id": 10705, "synset": "secateurs.n.01", "name": "secateurs"}, - {"id": 10706, "synset": "secondary_coil.n.01", "name": "secondary_coil"}, - {"id": 10707, "synset": "second_balcony.n.01", "name": "second_balcony"}, - {"id": 10708, "synset": "second_base.n.01", "name": "second_base"}, - {"id": 10709, "synset": "second_hand.n.02", "name": "second_hand"}, - {"id": 10710, "synset": "secretary.n.04", "name": "secretary"}, - {"id": 10711, "synset": "sectional.n.01", "name": "sectional"}, - {"id": 10712, "synset": "security_blanket.n.02", "name": "security_blanket"}, - {"id": 10713, "synset": "security_system.n.02", "name": "security_system"}, - {"id": 10714, "synset": "security_system.n.01", "name": "security_system"}, - {"id": 10715, "synset": "sedan.n.01", "name": "sedan"}, - {"id": 10716, "synset": "sedan.n.02", "name": "sedan"}, - {"id": 10717, "synset": "seeder.n.02", "name": "seeder"}, - {"id": 10718, "synset": "seeker.n.02", "name": "seeker"}, - {"id": 10719, "synset": "seersucker.n.01", "name": "seersucker"}, - {"id": 10720, "synset": "segmental_arch.n.01", "name": "segmental_arch"}, - {"id": 10721, "synset": "segway.n.01", "name": "Segway"}, - {"id": 10722, "synset": "seidel.n.01", "name": "seidel"}, - {"id": 10723, "synset": "seine.n.02", "name": "seine"}, - {"id": 10724, "synset": "seismograph.n.01", "name": "seismograph"}, - {"id": 10725, "synset": "selector.n.02", "name": "selector"}, - {"id": 10726, "synset": "selenium_cell.n.01", "name": "selenium_cell"}, - {"id": 10727, "synset": "self-propelled_vehicle.n.01", "name": "self-propelled_vehicle"}, - { - "id": 10728, - "synset": "self-registering_thermometer.n.01", - "name": "self-registering_thermometer", - }, - {"id": 10729, "synset": "self-starter.n.02", "name": "self-starter"}, - {"id": 10730, "synset": "selsyn.n.01", "name": "selsyn"}, - {"id": 10731, "synset": "selvage.n.02", "name": "selvage"}, - {"id": 10732, "synset": "semaphore.n.01", "name": "semaphore"}, - {"id": 10733, "synset": "semiautomatic_firearm.n.01", "name": "semiautomatic_firearm"}, - {"id": 10734, "synset": "semiautomatic_pistol.n.01", "name": "semiautomatic_pistol"}, - {"id": 10735, "synset": "semiconductor_device.n.01", "name": "semiconductor_device"}, - {"id": 10736, "synset": "semi-detached_house.n.01", "name": "semi-detached_house"}, - {"id": 10737, "synset": "semigloss.n.01", "name": "semigloss"}, - {"id": 10738, "synset": "semitrailer.n.01", "name": "semitrailer"}, - {"id": 10739, "synset": "sennit.n.01", "name": "sennit"}, - {"id": 10740, "synset": "sensitometer.n.01", "name": "sensitometer"}, - {"id": 10741, "synset": "sentry_box.n.01", "name": "sentry_box"}, - {"id": 10742, "synset": "separate.n.02", "name": "separate"}, - {"id": 10743, "synset": "septic_tank.n.01", "name": "septic_tank"}, - {"id": 10744, "synset": "sequence.n.03", "name": "sequence"}, - {"id": 10745, "synset": "sequencer.n.01", "name": "sequencer"}, - {"id": 10746, "synset": "serape.n.01", "name": "serape"}, - {"id": 10747, "synset": "serge.n.01", "name": "serge"}, - {"id": 10748, "synset": "serger.n.01", "name": "serger"}, - {"id": 10749, "synset": "serial_port.n.01", "name": "serial_port"}, - {"id": 10750, "synset": "serpent.n.03", "name": "serpent"}, - {"id": 10751, "synset": "serration.n.03", "name": "serration"}, - {"id": 10752, "synset": "server.n.04", "name": "server"}, - {"id": 10753, "synset": "server.n.03", "name": "server"}, - {"id": 10754, "synset": "service_club.n.02", "name": "service_club"}, - {"id": 10755, "synset": "serving_cart.n.01", "name": "serving_cart"}, - {"id": 10756, "synset": "serving_dish.n.01", "name": "serving_dish"}, - {"id": 10757, "synset": "servo.n.01", "name": "servo"}, - {"id": 10758, "synset": "set.n.13", "name": "set"}, - {"id": 10759, "synset": "set_gun.n.01", "name": "set_gun"}, - {"id": 10760, "synset": "setscrew.n.02", "name": "setscrew"}, - {"id": 10761, "synset": "setscrew.n.01", "name": "setscrew"}, - {"id": 10762, "synset": "set_square.n.01", "name": "set_square"}, - {"id": 10763, "synset": "settee.n.02", "name": "settee"}, - {"id": 10764, "synset": "settle.n.01", "name": "settle"}, - {"id": 10765, "synset": "settlement_house.n.01", "name": "settlement_house"}, - {"id": 10766, "synset": "seventy-eight.n.02", "name": "seventy-eight"}, - { - "id": 10767, - "synset": "seven_wonders_of_the_ancient_world.n.01", - "name": "Seven_Wonders_of_the_Ancient_World", - }, - {"id": 10768, "synset": "sewage_disposal_plant.n.01", "name": "sewage_disposal_plant"}, - {"id": 10769, "synset": "sewer.n.01", "name": "sewer"}, - {"id": 10770, "synset": "sewing_basket.n.01", "name": "sewing_basket"}, - {"id": 10771, "synset": "sewing_kit.n.01", "name": "sewing_kit"}, - {"id": 10772, "synset": "sewing_needle.n.01", "name": "sewing_needle"}, - {"id": 10773, "synset": "sewing_room.n.01", "name": "sewing_room"}, - {"id": 10774, "synset": "sextant.n.02", "name": "sextant"}, - {"id": 10775, "synset": "sgraffito.n.01", "name": "sgraffito"}, - {"id": 10776, "synset": "shackle.n.01", "name": "shackle"}, - {"id": 10777, "synset": "shackle.n.02", "name": "shackle"}, - {"id": 10778, "synset": "shade.n.03", "name": "shade"}, - {"id": 10779, "synset": "shadow_box.n.01", "name": "shadow_box"}, - {"id": 10780, "synset": "shaft.n.03", "name": "shaft"}, - {"id": 10781, "synset": "shag_rug.n.01", "name": "shag_rug"}, - {"id": 10782, "synset": "shank.n.04", "name": "shank"}, - {"id": 10783, "synset": "shank.n.03", "name": "shank"}, - {"id": 10784, "synset": "shantung.n.01", "name": "shantung"}, - {"id": 10785, "synset": "shaper.n.02", "name": "shaper"}, - {"id": 10786, "synset": "shaping_tool.n.01", "name": "shaping_tool"}, - {"id": 10787, "synset": "sharkskin.n.01", "name": "sharkskin"}, - {"id": 10788, "synset": "shaving_brush.n.01", "name": "shaving_brush"}, - {"id": 10789, "synset": "shaving_foam.n.01", "name": "shaving_foam"}, - {"id": 10790, "synset": "shawm.n.01", "name": "shawm"}, - {"id": 10791, "synset": "sheath.n.01", "name": "sheath"}, - {"id": 10792, "synset": "sheathing.n.01", "name": "sheathing"}, - {"id": 10793, "synset": "shed.n.01", "name": "shed"}, - {"id": 10794, "synset": "sheep_bell.n.01", "name": "sheep_bell"}, - {"id": 10795, "synset": "sheepshank.n.01", "name": "sheepshank"}, - {"id": 10796, "synset": "sheepskin_coat.n.01", "name": "sheepskin_coat"}, - {"id": 10797, "synset": "sheepwalk.n.01", "name": "sheepwalk"}, - {"id": 10798, "synset": "sheet.n.03", "name": "sheet"}, - {"id": 10799, "synset": "sheet_bend.n.01", "name": "sheet_bend"}, - {"id": 10800, "synset": "sheeting.n.01", "name": "sheeting"}, - {"id": 10801, "synset": "sheet_pile.n.01", "name": "sheet_pile"}, - {"id": 10802, "synset": "sheetrock.n.01", "name": "Sheetrock"}, - {"id": 10803, "synset": "shelf.n.01", "name": "shelf"}, - {"id": 10804, "synset": "shelf_bracket.n.01", "name": "shelf_bracket"}, - {"id": 10805, "synset": "shell.n.01", "name": "shell"}, - {"id": 10806, "synset": "shell.n.08", "name": "shell"}, - {"id": 10807, "synset": "shell.n.07", "name": "shell"}, - {"id": 10808, "synset": "shellac.n.02", "name": "shellac"}, - {"id": 10809, "synset": "shelter.n.01", "name": "shelter"}, - {"id": 10810, "synset": "shelter.n.02", "name": "shelter"}, - {"id": 10811, "synset": "shelter.n.05", "name": "shelter"}, - {"id": 10812, "synset": "sheltered_workshop.n.01", "name": "sheltered_workshop"}, - {"id": 10813, "synset": "sheraton.n.01", "name": "Sheraton"}, - {"id": 10814, "synset": "shield.n.01", "name": "shield"}, - {"id": 10815, "synset": "shielding.n.03", "name": "shielding"}, - {"id": 10816, "synset": "shift_key.n.01", "name": "shift_key"}, - {"id": 10817, "synset": "shillelagh.n.01", "name": "shillelagh"}, - {"id": 10818, "synset": "shim.n.01", "name": "shim"}, - {"id": 10819, "synset": "shingle.n.03", "name": "shingle"}, - {"id": 10820, "synset": "shin_guard.n.01", "name": "shin_guard"}, - {"id": 10821, "synset": "ship.n.01", "name": "ship"}, - {"id": 10822, "synset": "shipboard_system.n.01", "name": "shipboard_system"}, - {"id": 10823, "synset": "shipping.n.02", "name": "shipping"}, - {"id": 10824, "synset": "shipping_room.n.01", "name": "shipping_room"}, - { - "id": 10825, - "synset": "ship-towed_long-range_acoustic_detection_system.n.01", - "name": "ship-towed_long-range_acoustic_detection_system", - }, - {"id": 10826, "synset": "shipwreck.n.01", "name": "shipwreck"}, - {"id": 10827, "synset": "shirt_button.n.01", "name": "shirt_button"}, - {"id": 10828, "synset": "shirtdress.n.01", "name": "shirtdress"}, - {"id": 10829, "synset": "shirtfront.n.01", "name": "shirtfront"}, - {"id": 10830, "synset": "shirting.n.01", "name": "shirting"}, - {"id": 10831, "synset": "shirtsleeve.n.01", "name": "shirtsleeve"}, - {"id": 10832, "synset": "shirttail.n.02", "name": "shirttail"}, - {"id": 10833, "synset": "shirtwaist.n.01", "name": "shirtwaist"}, - {"id": 10834, "synset": "shiv.n.01", "name": "shiv"}, - {"id": 10835, "synset": "shock_absorber.n.01", "name": "shock_absorber"}, - {"id": 10836, "synset": "shoe.n.02", "name": "shoe"}, - {"id": 10837, "synset": "shoebox.n.02", "name": "shoebox"}, - {"id": 10838, "synset": "shoehorn.n.01", "name": "shoehorn"}, - {"id": 10839, "synset": "shoe_shop.n.01", "name": "shoe_shop"}, - {"id": 10840, "synset": "shoetree.n.01", "name": "shoetree"}, - {"id": 10841, "synset": "shofar.n.01", "name": "shofar"}, - {"id": 10842, "synset": "shoji.n.01", "name": "shoji"}, - {"id": 10843, "synset": "shooting_brake.n.01", "name": "shooting_brake"}, - {"id": 10844, "synset": "shooting_lodge.n.01", "name": "shooting_lodge"}, - {"id": 10845, "synset": "shooting_stick.n.01", "name": "shooting_stick"}, - {"id": 10846, "synset": "shop.n.01", "name": "shop"}, - {"id": 10847, "synset": "shop_bell.n.01", "name": "shop_bell"}, - {"id": 10848, "synset": "shopping_basket.n.01", "name": "shopping_basket"}, - {"id": 10849, "synset": "short_circuit.n.01", "name": "short_circuit"}, - {"id": 10850, "synset": "short_iron.n.01", "name": "short_iron"}, - {"id": 10851, "synset": "short_sleeve.n.01", "name": "short_sleeve"}, - { - "id": 10852, - "synset": "shortwave_diathermy_machine.n.01", - "name": "shortwave_diathermy_machine", - }, - {"id": 10853, "synset": "shot.n.12", "name": "shot"}, - {"id": 10854, "synset": "shotgun.n.01", "name": "shotgun"}, - {"id": 10855, "synset": "shotgun_shell.n.01", "name": "shotgun_shell"}, - {"id": 10856, "synset": "shot_tower.n.01", "name": "shot_tower"}, - {"id": 10857, "synset": "shoulder.n.04", "name": "shoulder"}, - {"id": 10858, "synset": "shouldered_arch.n.01", "name": "shouldered_arch"}, - {"id": 10859, "synset": "shoulder_holster.n.01", "name": "shoulder_holster"}, - {"id": 10860, "synset": "shoulder_pad.n.01", "name": "shoulder_pad"}, - {"id": 10861, "synset": "shoulder_patch.n.01", "name": "shoulder_patch"}, - {"id": 10862, "synset": "shovel.n.03", "name": "shovel"}, - {"id": 10863, "synset": "shovel_hat.n.01", "name": "shovel_hat"}, - {"id": 10864, "synset": "showboat.n.01", "name": "showboat"}, - {"id": 10865, "synset": "shower_room.n.01", "name": "shower_room"}, - {"id": 10866, "synset": "shower_stall.n.01", "name": "shower_stall"}, - {"id": 10867, "synset": "showroom.n.01", "name": "showroom"}, - {"id": 10868, "synset": "shrapnel.n.01", "name": "shrapnel"}, - {"id": 10869, "synset": "shrimper.n.01", "name": "shrimper"}, - {"id": 10870, "synset": "shrine.n.01", "name": "shrine"}, - {"id": 10871, "synset": "shrink-wrap.n.01", "name": "shrink-wrap"}, - {"id": 10872, "synset": "shunt.n.03", "name": "shunt"}, - {"id": 10873, "synset": "shunt.n.02", "name": "shunt"}, - {"id": 10874, "synset": "shunter.n.01", "name": "shunter"}, - {"id": 10875, "synset": "shutter.n.02", "name": "shutter"}, - {"id": 10876, "synset": "shutter.n.01", "name": "shutter"}, - {"id": 10877, "synset": "shuttle.n.03", "name": "shuttle"}, - {"id": 10878, "synset": "shuttle.n.02", "name": "shuttle"}, - {"id": 10879, "synset": "shuttle_bus.n.01", "name": "shuttle_bus"}, - {"id": 10880, "synset": "shuttlecock.n.01", "name": "shuttlecock"}, - {"id": 10881, "synset": "shuttle_helicopter.n.01", "name": "shuttle_helicopter"}, - {"id": 10882, "synset": "sibley_tent.n.01", "name": "Sibley_tent"}, - {"id": 10883, "synset": "sickbay.n.01", "name": "sickbay"}, - {"id": 10884, "synset": "sickbed.n.01", "name": "sickbed"}, - {"id": 10885, "synset": "sickle.n.01", "name": "sickle"}, - {"id": 10886, "synset": "sickroom.n.01", "name": "sickroom"}, - {"id": 10887, "synset": "sideboard.n.02", "name": "sideboard"}, - {"id": 10888, "synset": "sidecar.n.02", "name": "sidecar"}, - {"id": 10889, "synset": "side_chapel.n.01", "name": "side_chapel"}, - {"id": 10890, "synset": "sidelight.n.01", "name": "sidelight"}, - {"id": 10891, "synset": "sidesaddle.n.01", "name": "sidesaddle"}, - {"id": 10892, "synset": "sidewalk.n.01", "name": "sidewalk"}, - {"id": 10893, "synset": "sidewall.n.02", "name": "sidewall"}, - {"id": 10894, "synset": "side-wheeler.n.01", "name": "side-wheeler"}, - {"id": 10895, "synset": "sidewinder.n.02", "name": "sidewinder"}, - {"id": 10896, "synset": "sieve.n.01", "name": "sieve"}, - {"id": 10897, "synset": "sifter.n.01", "name": "sifter"}, - {"id": 10898, "synset": "sights.n.01", "name": "sights"}, - {"id": 10899, "synset": "sigmoidoscope.n.01", "name": "sigmoidoscope"}, - {"id": 10900, "synset": "signal_box.n.01", "name": "signal_box"}, - {"id": 10901, "synset": "signaling_device.n.01", "name": "signaling_device"}, - {"id": 10902, "synset": "silencer.n.02", "name": "silencer"}, - {"id": 10903, "synset": "silent_butler.n.01", "name": "silent_butler"}, - {"id": 10904, "synset": "silex.n.02", "name": "Silex"}, - {"id": 10905, "synset": "silk.n.01", "name": "silk"}, - {"id": 10906, "synset": "silks.n.01", "name": "silks"}, - {"id": 10907, "synset": "silver_plate.n.02", "name": "silver_plate"}, - {"id": 10908, "synset": "silverpoint.n.01", "name": "silverpoint"}, - {"id": 10909, "synset": "simple_pendulum.n.01", "name": "simple_pendulum"}, - {"id": 10910, "synset": "simulator.n.01", "name": "simulator"}, - {"id": 10911, "synset": "single_bed.n.01", "name": "single_bed"}, - {"id": 10912, "synset": "single-breasted_jacket.n.01", "name": "single-breasted_jacket"}, - {"id": 10913, "synset": "single-breasted_suit.n.01", "name": "single-breasted_suit"}, - {"id": 10914, "synset": "single_prop.n.01", "name": "single_prop"}, - {"id": 10915, "synset": "single-reed_instrument.n.01", "name": "single-reed_instrument"}, - {"id": 10916, "synset": "single-rotor_helicopter.n.01", "name": "single-rotor_helicopter"}, - {"id": 10917, "synset": "singlestick.n.01", "name": "singlestick"}, - {"id": 10918, "synset": "singlet.n.01", "name": "singlet"}, - {"id": 10919, "synset": "siren.n.04", "name": "siren"}, - {"id": 10920, "synset": "sister_ship.n.01", "name": "sister_ship"}, - {"id": 10921, "synset": "sitar.n.01", "name": "sitar"}, - {"id": 10922, "synset": "sitz_bath.n.01", "name": "sitz_bath"}, - {"id": 10923, "synset": "six-pack.n.01", "name": "six-pack"}, - {"id": 10924, "synset": "skate.n.01", "name": "skate"}, - {"id": 10925, "synset": "skeg.n.01", "name": "skeg"}, - {"id": 10926, "synset": "skein.n.01", "name": "skein"}, - {"id": 10927, "synset": "skeleton.n.04", "name": "skeleton"}, - {"id": 10928, "synset": "skeleton_key.n.01", "name": "skeleton_key"}, - {"id": 10929, "synset": "skep.n.02", "name": "skep"}, - {"id": 10930, "synset": "skep.n.01", "name": "skep"}, - {"id": 10931, "synset": "sketch.n.01", "name": "sketch"}, - {"id": 10932, "synset": "sketcher.n.02", "name": "sketcher"}, - {"id": 10933, "synset": "skew_arch.n.01", "name": "skew_arch"}, - {"id": 10934, "synset": "ski_binding.n.01", "name": "ski_binding"}, - {"id": 10935, "synset": "skibob.n.01", "name": "skibob"}, - {"id": 10936, "synset": "ski_cap.n.01", "name": "ski_cap"}, - {"id": 10937, "synset": "skidder.n.03", "name": "skidder"}, - {"id": 10938, "synset": "skid_lid.n.01", "name": "skid_lid"}, - {"id": 10939, "synset": "skiff.n.01", "name": "skiff"}, - {"id": 10940, "synset": "ski_jump.n.01", "name": "ski_jump"}, - {"id": 10941, "synset": "ski_lodge.n.01", "name": "ski_lodge"}, - {"id": 10942, "synset": "ski_mask.n.01", "name": "ski_mask"}, - {"id": 10943, "synset": "skimmer.n.02", "name": "skimmer"}, - {"id": 10944, "synset": "ski-plane.n.01", "name": "ski-plane"}, - {"id": 10945, "synset": "ski_rack.n.01", "name": "ski_rack"}, - {"id": 10946, "synset": "skirt.n.01", "name": "skirt"}, - {"id": 10947, "synset": "ski_tow.n.01", "name": "ski_tow"}, - {"id": 10948, "synset": "skivvies.n.01", "name": "Skivvies"}, - {"id": 10949, "synset": "skybox.n.01", "name": "skybox"}, - {"id": 10950, "synset": "skyhook.n.02", "name": "skyhook"}, - {"id": 10951, "synset": "skylight.n.01", "name": "skylight"}, - {"id": 10952, "synset": "skysail.n.01", "name": "skysail"}, - {"id": 10953, "synset": "skyscraper.n.01", "name": "skyscraper"}, - {"id": 10954, "synset": "skywalk.n.01", "name": "skywalk"}, - {"id": 10955, "synset": "slacks.n.01", "name": "slacks"}, - {"id": 10956, "synset": "slack_suit.n.01", "name": "slack_suit"}, - {"id": 10957, "synset": "slasher.n.02", "name": "slasher"}, - {"id": 10958, "synset": "slash_pocket.n.01", "name": "slash_pocket"}, - {"id": 10959, "synset": "slat.n.01", "name": "slat"}, - {"id": 10960, "synset": "slate.n.01", "name": "slate"}, - {"id": 10961, "synset": "slate_pencil.n.01", "name": "slate_pencil"}, - {"id": 10962, "synset": "slate_roof.n.01", "name": "slate_roof"}, - {"id": 10963, "synset": "sleeper.n.07", "name": "sleeper"}, - {"id": 10964, "synset": "sleeper.n.06", "name": "sleeper"}, - {"id": 10965, "synset": "sleeping_car.n.01", "name": "sleeping_car"}, - {"id": 10966, "synset": "sleeve.n.01", "name": "sleeve"}, - {"id": 10967, "synset": "sleeve.n.02", "name": "sleeve"}, - {"id": 10968, "synset": "sleigh_bed.n.01", "name": "sleigh_bed"}, - {"id": 10969, "synset": "sleigh_bell.n.01", "name": "sleigh_bell"}, - {"id": 10970, "synset": "slice_bar.n.01", "name": "slice_bar"}, - {"id": 10971, "synset": "slicer.n.03", "name": "slicer"}, - {"id": 10972, "synset": "slicer.n.02", "name": "slicer"}, - {"id": 10973, "synset": "slide.n.04", "name": "slide"}, - {"id": 10974, "synset": "slide_fastener.n.01", "name": "slide_fastener"}, - {"id": 10975, "synset": "slide_projector.n.01", "name": "slide_projector"}, - {"id": 10976, "synset": "slide_rule.n.01", "name": "slide_rule"}, - {"id": 10977, "synset": "slide_valve.n.01", "name": "slide_valve"}, - {"id": 10978, "synset": "sliding_door.n.01", "name": "sliding_door"}, - {"id": 10979, "synset": "sliding_seat.n.01", "name": "sliding_seat"}, - {"id": 10980, "synset": "sliding_window.n.01", "name": "sliding_window"}, - {"id": 10981, "synset": "sling.n.04", "name": "sling"}, - {"id": 10982, "synset": "slingback.n.01", "name": "slingback"}, - {"id": 10983, "synset": "slinger_ring.n.01", "name": "slinger_ring"}, - {"id": 10984, "synset": "slip_clutch.n.01", "name": "slip_clutch"}, - {"id": 10985, "synset": "slipcover.n.01", "name": "slipcover"}, - {"id": 10986, "synset": "slip-joint_pliers.n.01", "name": "slip-joint_pliers"}, - {"id": 10987, "synset": "slipknot.n.01", "name": "slipknot"}, - {"id": 10988, "synset": "slip-on.n.01", "name": "slip-on"}, - {"id": 10989, "synset": "slip_ring.n.01", "name": "slip_ring"}, - {"id": 10990, "synset": "slit_lamp.n.01", "name": "slit_lamp"}, - {"id": 10991, "synset": "slit_trench.n.01", "name": "slit_trench"}, - {"id": 10992, "synset": "sloop.n.01", "name": "sloop"}, - {"id": 10993, "synset": "sloop_of_war.n.01", "name": "sloop_of_war"}, - {"id": 10994, "synset": "slop_basin.n.01", "name": "slop_basin"}, - {"id": 10995, "synset": "slop_pail.n.01", "name": "slop_pail"}, - {"id": 10996, "synset": "slops.n.02", "name": "slops"}, - {"id": 10997, "synset": "slopshop.n.01", "name": "slopshop"}, - {"id": 10998, "synset": "slot.n.07", "name": "slot"}, - {"id": 10999, "synset": "slot_machine.n.01", "name": "slot_machine"}, - {"id": 11000, "synset": "sluice.n.01", "name": "sluice"}, - {"id": 11001, "synset": "smack.n.03", "name": "smack"}, - {"id": 11002, "synset": "small_boat.n.01", "name": "small_boat"}, - { - "id": 11003, - "synset": "small_computer_system_interface.n.01", - "name": "small_computer_system_interface", - }, - {"id": 11004, "synset": "small_ship.n.01", "name": "small_ship"}, - {"id": 11005, "synset": "small_stores.n.01", "name": "small_stores"}, - {"id": 11006, "synset": "smart_bomb.n.01", "name": "smart_bomb"}, - {"id": 11007, "synset": "smelling_bottle.n.01", "name": "smelling_bottle"}, - {"id": 11008, "synset": "smocking.n.01", "name": "smocking"}, - {"id": 11009, "synset": "smoke_bomb.n.01", "name": "smoke_bomb"}, - {"id": 11010, "synset": "smokehouse.n.01", "name": "smokehouse"}, - {"id": 11011, "synset": "smoker.n.03", "name": "smoker"}, - {"id": 11012, "synset": "smoke_screen.n.01", "name": "smoke_screen"}, - {"id": 11013, "synset": "smoking_room.n.01", "name": "smoking_room"}, - {"id": 11014, "synset": "smoothbore.n.01", "name": "smoothbore"}, - {"id": 11015, "synset": "smooth_plane.n.01", "name": "smooth_plane"}, - {"id": 11016, "synset": "snack_bar.n.01", "name": "snack_bar"}, - {"id": 11017, "synset": "snaffle.n.01", "name": "snaffle"}, - {"id": 11018, "synset": "snap.n.10", "name": "snap"}, - {"id": 11019, "synset": "snap_brim.n.01", "name": "snap_brim"}, - {"id": 11020, "synset": "snap-brim_hat.n.01", "name": "snap-brim_hat"}, - {"id": 11021, "synset": "snare.n.05", "name": "snare"}, - {"id": 11022, "synset": "snare_drum.n.01", "name": "snare_drum"}, - {"id": 11023, "synset": "snatch_block.n.01", "name": "snatch_block"}, - {"id": 11024, "synset": "snifter.n.01", "name": "snifter"}, - {"id": 11025, "synset": "sniper_rifle.n.01", "name": "sniper_rifle"}, - {"id": 11026, "synset": "snips.n.01", "name": "snips"}, - {"id": 11027, "synset": "sno-cat.n.01", "name": "Sno-cat"}, - {"id": 11028, "synset": "snood.n.01", "name": "snood"}, - {"id": 11029, "synset": "snorkel.n.02", "name": "snorkel"}, - {"id": 11030, "synset": "snorkel.n.01", "name": "snorkel"}, - {"id": 11031, "synset": "snowbank.n.01", "name": "snowbank"}, - {"id": 11032, "synset": "snowplow.n.01", "name": "snowplow"}, - {"id": 11033, "synset": "snowshoe.n.01", "name": "snowshoe"}, - {"id": 11034, "synset": "snowsuit.n.01", "name": "snowsuit"}, - {"id": 11035, "synset": "snow_thrower.n.01", "name": "snow_thrower"}, - {"id": 11036, "synset": "snuffbox.n.01", "name": "snuffbox"}, - {"id": 11037, "synset": "snuffer.n.01", "name": "snuffer"}, - {"id": 11038, "synset": "snuffers.n.01", "name": "snuffers"}, - {"id": 11039, "synset": "soapbox.n.01", "name": "soapbox"}, - {"id": 11040, "synset": "soap_dish.n.01", "name": "soap_dish"}, - {"id": 11041, "synset": "soap_dispenser.n.01", "name": "soap_dispenser"}, - {"id": 11042, "synset": "soap_pad.n.01", "name": "soap_pad"}, - {"id": 11043, "synset": "socket.n.02", "name": "socket"}, - {"id": 11044, "synset": "socket_wrench.n.01", "name": "socket_wrench"}, - {"id": 11045, "synset": "socle.n.01", "name": "socle"}, - {"id": 11046, "synset": "soda_can.n.01", "name": "soda_can"}, - {"id": 11047, "synset": "soda_fountain.n.02", "name": "soda_fountain"}, - {"id": 11048, "synset": "soda_fountain.n.01", "name": "soda_fountain"}, - {"id": 11049, "synset": "sod_house.n.01", "name": "sod_house"}, - {"id": 11050, "synset": "sodium-vapor_lamp.n.01", "name": "sodium-vapor_lamp"}, - {"id": 11051, "synset": "soffit.n.01", "name": "soffit"}, - {"id": 11052, "synset": "soft_pedal.n.01", "name": "soft_pedal"}, - {"id": 11053, "synset": "soil_pipe.n.01", "name": "soil_pipe"}, - {"id": 11054, "synset": "solar_cell.n.01", "name": "solar_cell"}, - {"id": 11055, "synset": "solar_dish.n.01", "name": "solar_dish"}, - {"id": 11056, "synset": "solar_heater.n.01", "name": "solar_heater"}, - {"id": 11057, "synset": "solar_house.n.01", "name": "solar_house"}, - {"id": 11058, "synset": "solar_telescope.n.01", "name": "solar_telescope"}, - {"id": 11059, "synset": "solar_thermal_system.n.01", "name": "solar_thermal_system"}, - {"id": 11060, "synset": "soldering_iron.n.01", "name": "soldering_iron"}, - {"id": 11061, "synset": "solenoid.n.01", "name": "solenoid"}, - {"id": 11062, "synset": "solleret.n.01", "name": "solleret"}, - {"id": 11063, "synset": "sonic_depth_finder.n.01", "name": "sonic_depth_finder"}, - {"id": 11064, "synset": "sonogram.n.01", "name": "sonogram"}, - {"id": 11065, "synset": "sonograph.n.01", "name": "sonograph"}, - {"id": 11066, "synset": "sorter.n.02", "name": "sorter"}, - {"id": 11067, "synset": "souk.n.01", "name": "souk"}, - {"id": 11068, "synset": "sound_bow.n.01", "name": "sound_bow"}, - {"id": 11069, "synset": "soundbox.n.01", "name": "soundbox"}, - {"id": 11070, "synset": "sound_camera.n.01", "name": "sound_camera"}, - {"id": 11071, "synset": "sounder.n.01", "name": "sounder"}, - {"id": 11072, "synset": "sound_film.n.01", "name": "sound_film"}, - {"id": 11073, "synset": "sounding_board.n.02", "name": "sounding_board"}, - {"id": 11074, "synset": "sounding_rocket.n.01", "name": "sounding_rocket"}, - {"id": 11075, "synset": "sound_recording.n.01", "name": "sound_recording"}, - {"id": 11076, "synset": "sound_spectrograph.n.01", "name": "sound_spectrograph"}, - {"id": 11077, "synset": "soup_ladle.n.01", "name": "soup_ladle"}, - {"id": 11078, "synset": "source_of_illumination.n.01", "name": "source_of_illumination"}, - {"id": 11079, "synset": "sourdine.n.02", "name": "sourdine"}, - {"id": 11080, "synset": "soutache.n.01", "name": "soutache"}, - {"id": 11081, "synset": "soutane.n.01", "name": "soutane"}, - {"id": 11082, "synset": "sou'wester.n.02", "name": "sou'wester"}, - {"id": 11083, "synset": "soybean_future.n.01", "name": "soybean_future"}, - {"id": 11084, "synset": "space_bar.n.01", "name": "space_bar"}, - {"id": 11085, "synset": "space_capsule.n.01", "name": "space_capsule"}, - {"id": 11086, "synset": "spacecraft.n.01", "name": "spacecraft"}, - {"id": 11087, "synset": "space_heater.n.01", "name": "space_heater"}, - {"id": 11088, "synset": "space_helmet.n.01", "name": "space_helmet"}, - {"id": 11089, "synset": "space_rocket.n.01", "name": "space_rocket"}, - {"id": 11090, "synset": "space_station.n.01", "name": "space_station"}, - {"id": 11091, "synset": "spacesuit.n.01", "name": "spacesuit"}, - {"id": 11092, "synset": "spade.n.02", "name": "spade"}, - {"id": 11093, "synset": "spade_bit.n.01", "name": "spade_bit"}, - {"id": 11094, "synset": "spaghetti_junction.n.01", "name": "spaghetti_junction"}, - {"id": 11095, "synset": "spandau.n.01", "name": "Spandau"}, - {"id": 11096, "synset": "spandex.n.01", "name": "spandex"}, - {"id": 11097, "synset": "spandrel.n.01", "name": "spandrel"}, - {"id": 11098, "synset": "spanker.n.02", "name": "spanker"}, - {"id": 11099, "synset": "spar.n.02", "name": "spar"}, - {"id": 11100, "synset": "sparge_pipe.n.01", "name": "sparge_pipe"}, - {"id": 11101, "synset": "spark_arrester.n.02", "name": "spark_arrester"}, - {"id": 11102, "synset": "spark_arrester.n.01", "name": "spark_arrester"}, - {"id": 11103, "synset": "spark_chamber.n.01", "name": "spark_chamber"}, - {"id": 11104, "synset": "spark_coil.n.01", "name": "spark_coil"}, - {"id": 11105, "synset": "spark_gap.n.01", "name": "spark_gap"}, - {"id": 11106, "synset": "spark_lever.n.01", "name": "spark_lever"}, - {"id": 11107, "synset": "spark_plug.n.01", "name": "spark_plug"}, - {"id": 11108, "synset": "sparkplug_wrench.n.01", "name": "sparkplug_wrench"}, - {"id": 11109, "synset": "spark_transmitter.n.01", "name": "spark_transmitter"}, - {"id": 11110, "synset": "spat.n.02", "name": "spat"}, - {"id": 11111, "synset": "spatula.n.01", "name": "spatula"}, - {"id": 11112, "synset": "speakerphone.n.01", "name": "speakerphone"}, - {"id": 11113, "synset": "speaking_trumpet.n.01", "name": "speaking_trumpet"}, - {"id": 11114, "synset": "spear.n.02", "name": "spear"}, - {"id": 11115, "synset": "specialty_store.n.01", "name": "specialty_store"}, - {"id": 11116, "synset": "specimen_bottle.n.01", "name": "specimen_bottle"}, - {"id": 11117, "synset": "spectacle.n.02", "name": "spectacle"}, - {"id": 11118, "synset": "spectator_pump.n.01", "name": "spectator_pump"}, - {"id": 11119, "synset": "spectrograph.n.01", "name": "spectrograph"}, - {"id": 11120, "synset": "spectrophotometer.n.01", "name": "spectrophotometer"}, - {"id": 11121, "synset": "spectroscope.n.01", "name": "spectroscope"}, - {"id": 11122, "synset": "speculum.n.02", "name": "speculum"}, - {"id": 11123, "synset": "speedboat.n.01", "name": "speedboat"}, - {"id": 11124, "synset": "speed_bump.n.01", "name": "speed_bump"}, - {"id": 11125, "synset": "speedometer.n.01", "name": "speedometer"}, - {"id": 11126, "synset": "speed_skate.n.01", "name": "speed_skate"}, - {"id": 11127, "synset": "spherometer.n.01", "name": "spherometer"}, - {"id": 11128, "synset": "sphygmomanometer.n.01", "name": "sphygmomanometer"}, - {"id": 11129, "synset": "spicemill.n.01", "name": "spicemill"}, - {"id": 11130, "synset": "spider.n.03", "name": "spider"}, - {"id": 11131, "synset": "spider_web.n.01", "name": "spider_web"}, - {"id": 11132, "synset": "spike.n.02", "name": "spike"}, - {"id": 11133, "synset": "spike.n.11", "name": "spike"}, - {"id": 11134, "synset": "spindle.n.04", "name": "spindle"}, - {"id": 11135, "synset": "spindle.n.03", "name": "spindle"}, - {"id": 11136, "synset": "spindle.n.02", "name": "spindle"}, - {"id": 11137, "synset": "spin_dryer.n.01", "name": "spin_dryer"}, - {"id": 11138, "synset": "spinet.n.02", "name": "spinet"}, - {"id": 11139, "synset": "spinet.n.01", "name": "spinet"}, - {"id": 11140, "synset": "spinnaker.n.01", "name": "spinnaker"}, - {"id": 11141, "synset": "spinner.n.03", "name": "spinner"}, - {"id": 11142, "synset": "spinning_frame.n.01", "name": "spinning_frame"}, - {"id": 11143, "synset": "spinning_jenny.n.01", "name": "spinning_jenny"}, - {"id": 11144, "synset": "spinning_machine.n.01", "name": "spinning_machine"}, - {"id": 11145, "synset": "spinning_rod.n.01", "name": "spinning_rod"}, - {"id": 11146, "synset": "spinning_wheel.n.01", "name": "spinning_wheel"}, - {"id": 11147, "synset": "spiral_bandage.n.01", "name": "spiral_bandage"}, - { - "id": 11148, - "synset": "spiral_ratchet_screwdriver.n.01", - "name": "spiral_ratchet_screwdriver", - }, - {"id": 11149, "synset": "spiral_spring.n.01", "name": "spiral_spring"}, - {"id": 11150, "synset": "spirit_lamp.n.01", "name": "spirit_lamp"}, - {"id": 11151, "synset": "spirit_stove.n.01", "name": "spirit_stove"}, - {"id": 11152, "synset": "spirometer.n.01", "name": "spirometer"}, - {"id": 11153, "synset": "spit.n.03", "name": "spit"}, - {"id": 11154, "synset": "spittoon.n.01", "name": "spittoon"}, - {"id": 11155, "synset": "splashboard.n.02", "name": "splashboard"}, - {"id": 11156, "synset": "splasher.n.01", "name": "splasher"}, - {"id": 11157, "synset": "splice.n.01", "name": "splice"}, - {"id": 11158, "synset": "splicer.n.03", "name": "splicer"}, - {"id": 11159, "synset": "splint.n.02", "name": "splint"}, - {"id": 11160, "synset": "split_rail.n.01", "name": "split_rail"}, - {"id": 11161, "synset": "spode.n.02", "name": "Spode"}, - {"id": 11162, "synset": "spoiler.n.05", "name": "spoiler"}, - {"id": 11163, "synset": "spoiler.n.04", "name": "spoiler"}, - {"id": 11164, "synset": "spoke.n.01", "name": "spoke"}, - {"id": 11165, "synset": "spokeshave.n.01", "name": "spokeshave"}, - {"id": 11166, "synset": "sponge_cloth.n.01", "name": "sponge_cloth"}, - {"id": 11167, "synset": "sponge_mop.n.01", "name": "sponge_mop"}, - {"id": 11168, "synset": "spoon.n.03", "name": "spoon"}, - {"id": 11169, "synset": "spork.n.01", "name": "Spork"}, - {"id": 11170, "synset": "sporran.n.01", "name": "sporran"}, - {"id": 11171, "synset": "sport_kite.n.01", "name": "sport_kite"}, - {"id": 11172, "synset": "sports_car.n.01", "name": "sports_car"}, - {"id": 11173, "synset": "sports_equipment.n.01", "name": "sports_equipment"}, - {"id": 11174, "synset": "sports_implement.n.01", "name": "sports_implement"}, - {"id": 11175, "synset": "sport_utility.n.01", "name": "sport_utility"}, - {"id": 11176, "synset": "spot.n.07", "name": "spot"}, - {"id": 11177, "synset": "spot_weld.n.01", "name": "spot_weld"}, - {"id": 11178, "synset": "spouter.n.02", "name": "spouter"}, - {"id": 11179, "synset": "sprag.n.01", "name": "sprag"}, - {"id": 11180, "synset": "spray_gun.n.01", "name": "spray_gun"}, - {"id": 11181, "synset": "spray_paint.n.01", "name": "spray_paint"}, - {"id": 11182, "synset": "spreader.n.01", "name": "spreader"}, - {"id": 11183, "synset": "sprig.n.02", "name": "sprig"}, - {"id": 11184, "synset": "spring.n.02", "name": "spring"}, - {"id": 11185, "synset": "spring_balance.n.01", "name": "spring_balance"}, - {"id": 11186, "synset": "springboard.n.01", "name": "springboard"}, - {"id": 11187, "synset": "sprinkler.n.01", "name": "sprinkler"}, - {"id": 11188, "synset": "sprinkler_system.n.01", "name": "sprinkler_system"}, - {"id": 11189, "synset": "sprit.n.01", "name": "sprit"}, - {"id": 11190, "synset": "spritsail.n.01", "name": "spritsail"}, - {"id": 11191, "synset": "sprocket.n.02", "name": "sprocket"}, - {"id": 11192, "synset": "sprocket.n.01", "name": "sprocket"}, - {"id": 11193, "synset": "spun_yarn.n.01", "name": "spun_yarn"}, - {"id": 11194, "synset": "spur.n.04", "name": "spur"}, - {"id": 11195, "synset": "spur_gear.n.01", "name": "spur_gear"}, - {"id": 11196, "synset": "sputnik.n.01", "name": "sputnik"}, - {"id": 11197, "synset": "spy_satellite.n.01", "name": "spy_satellite"}, - {"id": 11198, "synset": "squad_room.n.01", "name": "squad_room"}, - {"id": 11199, "synset": "square.n.08", "name": "square"}, - {"id": 11200, "synset": "square_knot.n.01", "name": "square_knot"}, - {"id": 11201, "synset": "square-rigger.n.01", "name": "square-rigger"}, - {"id": 11202, "synset": "square_sail.n.01", "name": "square_sail"}, - {"id": 11203, "synset": "squash_ball.n.01", "name": "squash_ball"}, - {"id": 11204, "synset": "squash_racket.n.01", "name": "squash_racket"}, - {"id": 11205, "synset": "squawk_box.n.01", "name": "squawk_box"}, - {"id": 11206, "synset": "squeegee.n.01", "name": "squeegee"}, - {"id": 11207, "synset": "squeezer.n.01", "name": "squeezer"}, - {"id": 11208, "synset": "squelch_circuit.n.01", "name": "squelch_circuit"}, - {"id": 11209, "synset": "squinch.n.01", "name": "squinch"}, - {"id": 11210, "synset": "stabilizer.n.03", "name": "stabilizer"}, - {"id": 11211, "synset": "stabilizer.n.02", "name": "stabilizer"}, - {"id": 11212, "synset": "stabilizer_bar.n.01", "name": "stabilizer_bar"}, - {"id": 11213, "synset": "stable.n.01", "name": "stable"}, - {"id": 11214, "synset": "stable_gear.n.01", "name": "stable_gear"}, - {"id": 11215, "synset": "stabling.n.01", "name": "stabling"}, - {"id": 11216, "synset": "stacks.n.02", "name": "stacks"}, - {"id": 11217, "synset": "staddle.n.01", "name": "staddle"}, - {"id": 11218, "synset": "stadium.n.01", "name": "stadium"}, - {"id": 11219, "synset": "stage.n.03", "name": "stage"}, - {"id": 11220, "synset": "stained-glass_window.n.01", "name": "stained-glass_window"}, - {"id": 11221, "synset": "stair-carpet.n.01", "name": "stair-carpet"}, - {"id": 11222, "synset": "stair-rod.n.01", "name": "stair-rod"}, - {"id": 11223, "synset": "stairwell.n.01", "name": "stairwell"}, - {"id": 11224, "synset": "stake.n.05", "name": "stake"}, - {"id": 11225, "synset": "stall.n.03", "name": "stall"}, - {"id": 11226, "synset": "stall.n.01", "name": "stall"}, - {"id": 11227, "synset": "stamp.n.08", "name": "stamp"}, - {"id": 11228, "synset": "stamp_mill.n.01", "name": "stamp_mill"}, - {"id": 11229, "synset": "stamping_machine.n.01", "name": "stamping_machine"}, - {"id": 11230, "synset": "stanchion.n.01", "name": "stanchion"}, - {"id": 11231, "synset": "stand.n.04", "name": "stand"}, - {"id": 11232, "synset": "standard.n.05", "name": "standard"}, - {"id": 11233, "synset": "standard_cell.n.01", "name": "standard_cell"}, - {"id": 11234, "synset": "standard_transmission.n.01", "name": "standard_transmission"}, - {"id": 11235, "synset": "standing_press.n.01", "name": "standing_press"}, - {"id": 11236, "synset": "stanhope.n.01", "name": "stanhope"}, - {"id": 11237, "synset": "stanley_steamer.n.01", "name": "Stanley_Steamer"}, - {"id": 11238, "synset": "staple.n.05", "name": "staple"}, - {"id": 11239, "synset": "staple.n.04", "name": "staple"}, - {"id": 11240, "synset": "staple_gun.n.01", "name": "staple_gun"}, - {"id": 11241, "synset": "starship.n.01", "name": "starship"}, - {"id": 11242, "synset": "starter.n.01", "name": "starter"}, - {"id": 11243, "synset": "starting_gate.n.01", "name": "starting_gate"}, - {"id": 11244, "synset": "stassano_furnace.n.01", "name": "Stassano_furnace"}, - {"id": 11245, "synset": "statehouse.n.01", "name": "Statehouse"}, - {"id": 11246, "synset": "stately_home.n.01", "name": "stately_home"}, - {"id": 11247, "synset": "state_prison.n.01", "name": "state_prison"}, - {"id": 11248, "synset": "stateroom.n.01", "name": "stateroom"}, - {"id": 11249, "synset": "static_tube.n.01", "name": "static_tube"}, - {"id": 11250, "synset": "station.n.01", "name": "station"}, - {"id": 11251, "synset": "stator.n.01", "name": "stator"}, - {"id": 11252, "synset": "stay.n.05", "name": "stay"}, - {"id": 11253, "synset": "staysail.n.01", "name": "staysail"}, - {"id": 11254, "synset": "steakhouse.n.01", "name": "steakhouse"}, - {"id": 11255, "synset": "stealth_aircraft.n.01", "name": "stealth_aircraft"}, - {"id": 11256, "synset": "stealth_bomber.n.01", "name": "stealth_bomber"}, - {"id": 11257, "synset": "stealth_fighter.n.01", "name": "stealth_fighter"}, - {"id": 11258, "synset": "steam_bath.n.01", "name": "steam_bath"}, - {"id": 11259, "synset": "steamboat.n.01", "name": "steamboat"}, - {"id": 11260, "synset": "steam_chest.n.01", "name": "steam_chest"}, - {"id": 11261, "synset": "steam_engine.n.01", "name": "steam_engine"}, - {"id": 11262, "synset": "steamer.n.03", "name": "steamer"}, - {"id": 11263, "synset": "steamer.n.02", "name": "steamer"}, - {"id": 11264, "synset": "steam_iron.n.01", "name": "steam_iron"}, - {"id": 11265, "synset": "steam_locomotive.n.01", "name": "steam_locomotive"}, - {"id": 11266, "synset": "steamroller.n.02", "name": "steamroller"}, - {"id": 11267, "synset": "steam_shovel.n.01", "name": "steam_shovel"}, - {"id": 11268, "synset": "steam_turbine.n.01", "name": "steam_turbine"}, - {"id": 11269, "synset": "steam_whistle.n.01", "name": "steam_whistle"}, - {"id": 11270, "synset": "steel.n.03", "name": "steel"}, - {"id": 11271, "synset": "steel_arch_bridge.n.01", "name": "steel_arch_bridge"}, - {"id": 11272, "synset": "steel_drum.n.01", "name": "steel_drum"}, - {"id": 11273, "synset": "steel_mill.n.01", "name": "steel_mill"}, - {"id": 11274, "synset": "steel-wool_pad.n.01", "name": "steel-wool_pad"}, - {"id": 11275, "synset": "steelyard.n.01", "name": "steelyard"}, - {"id": 11276, "synset": "steeple.n.01", "name": "steeple"}, - {"id": 11277, "synset": "steerage.n.01", "name": "steerage"}, - {"id": 11278, "synset": "steering_gear.n.01", "name": "steering_gear"}, - {"id": 11279, "synset": "steering_linkage.n.01", "name": "steering_linkage"}, - {"id": 11280, "synset": "steering_system.n.01", "name": "steering_system"}, - {"id": 11281, "synset": "stele.n.02", "name": "stele"}, - {"id": 11282, "synset": "stem-winder.n.01", "name": "stem-winder"}, - {"id": 11283, "synset": "stencil.n.01", "name": "stencil"}, - {"id": 11284, "synset": "sten_gun.n.01", "name": "Sten_gun"}, - {"id": 11285, "synset": "stenograph.n.02", "name": "stenograph"}, - {"id": 11286, "synset": "step.n.04", "name": "step"}, - {"id": 11287, "synset": "step-down_transformer.n.01", "name": "step-down_transformer"}, - {"id": 11288, "synset": "step-up_transformer.n.01", "name": "step-up_transformer"}, - {"id": 11289, "synset": "stereoscope.n.01", "name": "stereoscope"}, - {"id": 11290, "synset": "stern_chaser.n.01", "name": "stern_chaser"}, - {"id": 11291, "synset": "sternpost.n.01", "name": "sternpost"}, - {"id": 11292, "synset": "sternwheeler.n.01", "name": "sternwheeler"}, - {"id": 11293, "synset": "stethoscope.n.01", "name": "stethoscope"}, - {"id": 11294, "synset": "stewing_pan.n.01", "name": "stewing_pan"}, - {"id": 11295, "synset": "stick.n.01", "name": "stick"}, - {"id": 11296, "synset": "stick.n.07", "name": "stick"}, - {"id": 11297, "synset": "stick.n.03", "name": "stick"}, - {"id": 11298, "synset": "stick.n.06", "name": "stick"}, - {"id": 11299, "synset": "stile.n.01", "name": "stile"}, - {"id": 11300, "synset": "stiletto.n.01", "name": "stiletto"}, - {"id": 11301, "synset": "still.n.03", "name": "still"}, - {"id": 11302, "synset": "stillroom.n.01", "name": "stillroom"}, - {"id": 11303, "synset": "stillson_wrench.n.01", "name": "Stillson_wrench"}, - {"id": 11304, "synset": "stilt.n.02", "name": "stilt"}, - {"id": 11305, "synset": "stinger.n.03", "name": "Stinger"}, - {"id": 11306, "synset": "stink_bomb.n.01", "name": "stink_bomb"}, - {"id": 11307, "synset": "stirrup_pump.n.01", "name": "stirrup_pump"}, - {"id": 11308, "synset": "stob.n.01", "name": "stob"}, - {"id": 11309, "synset": "stock.n.03", "name": "stock"}, - {"id": 11310, "synset": "stockade.n.01", "name": "stockade"}, - {"id": 11311, "synset": "stockcar.n.01", "name": "stockcar"}, - {"id": 11312, "synset": "stock_car.n.02", "name": "stock_car"}, - {"id": 11313, "synset": "stockinet.n.01", "name": "stockinet"}, - {"id": 11314, "synset": "stocking.n.01", "name": "stocking"}, - {"id": 11315, "synset": "stock-in-trade.n.01", "name": "stock-in-trade"}, - {"id": 11316, "synset": "stockpot.n.01", "name": "stockpot"}, - {"id": 11317, "synset": "stockroom.n.01", "name": "stockroom"}, - {"id": 11318, "synset": "stocks.n.03", "name": "stocks"}, - {"id": 11319, "synset": "stock_saddle.n.01", "name": "stock_saddle"}, - {"id": 11320, "synset": "stockyard.n.01", "name": "stockyard"}, - {"id": 11321, "synset": "stole.n.01", "name": "stole"}, - {"id": 11322, "synset": "stomacher.n.01", "name": "stomacher"}, - {"id": 11323, "synset": "stomach_pump.n.01", "name": "stomach_pump"}, - {"id": 11324, "synset": "stone_wall.n.01", "name": "stone_wall"}, - {"id": 11325, "synset": "stoneware.n.01", "name": "stoneware"}, - {"id": 11326, "synset": "stonework.n.01", "name": "stonework"}, - {"id": 11327, "synset": "stoop.n.03", "name": "stoop"}, - {"id": 11328, "synset": "stop_bath.n.01", "name": "stop_bath"}, - {"id": 11329, "synset": "stopcock.n.01", "name": "stopcock"}, - {"id": 11330, "synset": "stopper_knot.n.01", "name": "stopper_knot"}, - {"id": 11331, "synset": "stopwatch.n.01", "name": "stopwatch"}, - {"id": 11332, "synset": "storage_battery.n.01", "name": "storage_battery"}, - {"id": 11333, "synset": "storage_cell.n.01", "name": "storage_cell"}, - {"id": 11334, "synset": "storage_ring.n.01", "name": "storage_ring"}, - {"id": 11335, "synset": "storage_space.n.01", "name": "storage_space"}, - {"id": 11336, "synset": "storeroom.n.01", "name": "storeroom"}, - {"id": 11337, "synset": "storm_cellar.n.01", "name": "storm_cellar"}, - {"id": 11338, "synset": "storm_door.n.01", "name": "storm_door"}, - {"id": 11339, "synset": "storm_window.n.01", "name": "storm_window"}, - {"id": 11340, "synset": "stoup.n.02", "name": "stoup"}, - {"id": 11341, "synset": "stoup.n.01", "name": "stoup"}, - {"id": 11342, "synset": "stove.n.02", "name": "stove"}, - {"id": 11343, "synset": "stove_bolt.n.01", "name": "stove_bolt"}, - {"id": 11344, "synset": "stovepipe.n.01", "name": "stovepipe"}, - {"id": 11345, "synset": "stovepipe_iron.n.01", "name": "stovepipe_iron"}, - {"id": 11346, "synset": "stradavarius.n.01", "name": "Stradavarius"}, - {"id": 11347, "synset": "straight_chair.n.01", "name": "straight_chair"}, - {"id": 11348, "synset": "straightedge.n.01", "name": "straightedge"}, - {"id": 11349, "synset": "straightener.n.01", "name": "straightener"}, - {"id": 11350, "synset": "straight_flute.n.01", "name": "straight_flute"}, - {"id": 11351, "synset": "straight_pin.n.01", "name": "straight_pin"}, - {"id": 11352, "synset": "straight_razor.n.01", "name": "straight_razor"}, - {"id": 11353, "synset": "straitjacket.n.02", "name": "straitjacket"}, - {"id": 11354, "synset": "strap.n.04", "name": "strap"}, - {"id": 11355, "synset": "strap_hinge.n.01", "name": "strap_hinge"}, - {"id": 11356, "synset": "strapless.n.01", "name": "strapless"}, - {"id": 11357, "synset": "streamer_fly.n.01", "name": "streamer_fly"}, - {"id": 11358, "synset": "streamliner.n.01", "name": "streamliner"}, - {"id": 11359, "synset": "street.n.01", "name": "street"}, - {"id": 11360, "synset": "street.n.02", "name": "street"}, - {"id": 11361, "synset": "streetcar.n.01", "name": "streetcar"}, - {"id": 11362, "synset": "street_clothes.n.01", "name": "street_clothes"}, - {"id": 11363, "synset": "stretcher.n.03", "name": "stretcher"}, - {"id": 11364, "synset": "stretcher.n.01", "name": "stretcher"}, - {"id": 11365, "synset": "stretch_pants.n.01", "name": "stretch_pants"}, - {"id": 11366, "synset": "strickle.n.02", "name": "strickle"}, - {"id": 11367, "synset": "strickle.n.01", "name": "strickle"}, - {"id": 11368, "synset": "stringed_instrument.n.01", "name": "stringed_instrument"}, - {"id": 11369, "synset": "stringer.n.04", "name": "stringer"}, - {"id": 11370, "synset": "stringer.n.03", "name": "stringer"}, - {"id": 11371, "synset": "string_tie.n.01", "name": "string_tie"}, - {"id": 11372, "synset": "strip.n.05", "name": "strip"}, - {"id": 11373, "synset": "strip_lighting.n.01", "name": "strip_lighting"}, - {"id": 11374, "synset": "strip_mall.n.01", "name": "strip_mall"}, - {"id": 11375, "synset": "stroboscope.n.01", "name": "stroboscope"}, - {"id": 11376, "synset": "strongbox.n.01", "name": "strongbox"}, - {"id": 11377, "synset": "stronghold.n.01", "name": "stronghold"}, - {"id": 11378, "synset": "strongroom.n.01", "name": "strongroom"}, - {"id": 11379, "synset": "strop.n.01", "name": "strop"}, - {"id": 11380, "synset": "structural_member.n.01", "name": "structural_member"}, - {"id": 11381, "synset": "structure.n.01", "name": "structure"}, - {"id": 11382, "synset": "student_center.n.01", "name": "student_center"}, - {"id": 11383, "synset": "student_lamp.n.01", "name": "student_lamp"}, - {"id": 11384, "synset": "student_union.n.01", "name": "student_union"}, - {"id": 11385, "synset": "stud_finder.n.01", "name": "stud_finder"}, - {"id": 11386, "synset": "studio_apartment.n.01", "name": "studio_apartment"}, - {"id": 11387, "synset": "studio_couch.n.01", "name": "studio_couch"}, - {"id": 11388, "synset": "study.n.05", "name": "study"}, - {"id": 11389, "synset": "study_hall.n.02", "name": "study_hall"}, - {"id": 11390, "synset": "stuffing_nut.n.01", "name": "stuffing_nut"}, - {"id": 11391, "synset": "stump.n.03", "name": "stump"}, - {"id": 11392, "synset": "stun_gun.n.01", "name": "stun_gun"}, - {"id": 11393, "synset": "stupa.n.01", "name": "stupa"}, - {"id": 11394, "synset": "sty.n.02", "name": "sty"}, - {"id": 11395, "synset": "stylus.n.01", "name": "stylus"}, - {"id": 11396, "synset": "sub-assembly.n.01", "name": "sub-assembly"}, - {"id": 11397, "synset": "subcompact.n.01", "name": "subcompact"}, - {"id": 11398, "synset": "submachine_gun.n.01", "name": "submachine_gun"}, - {"id": 11399, "synset": "submarine.n.01", "name": "submarine"}, - {"id": 11400, "synset": "submarine_torpedo.n.01", "name": "submarine_torpedo"}, - {"id": 11401, "synset": "submersible.n.02", "name": "submersible"}, - {"id": 11402, "synset": "submersible.n.01", "name": "submersible"}, - {"id": 11403, "synset": "subtracter.n.02", "name": "subtracter"}, - {"id": 11404, "synset": "subway_token.n.01", "name": "subway_token"}, - {"id": 11405, "synset": "subway_train.n.01", "name": "subway_train"}, - {"id": 11406, "synset": "suction_cup.n.01", "name": "suction_cup"}, - {"id": 11407, "synset": "suction_pump.n.01", "name": "suction_pump"}, - {"id": 11408, "synset": "sudatorium.n.01", "name": "sudatorium"}, - {"id": 11409, "synset": "suede_cloth.n.01", "name": "suede_cloth"}, - {"id": 11410, "synset": "sugar_refinery.n.01", "name": "sugar_refinery"}, - {"id": 11411, "synset": "sugar_spoon.n.01", "name": "sugar_spoon"}, - {"id": 11412, "synset": "suite.n.02", "name": "suite"}, - {"id": 11413, "synset": "suiting.n.01", "name": "suiting"}, - {"id": 11414, "synset": "sulky.n.01", "name": "sulky"}, - {"id": 11415, "synset": "summer_house.n.01", "name": "summer_house"}, - {"id": 11416, "synset": "sumo_ring.n.01", "name": "sumo_ring"}, - {"id": 11417, "synset": "sump.n.01", "name": "sump"}, - {"id": 11418, "synset": "sump_pump.n.01", "name": "sump_pump"}, - {"id": 11419, "synset": "sunbonnet.n.01", "name": "sunbonnet"}, - {"id": 11420, "synset": "sunday_best.n.01", "name": "Sunday_best"}, - {"id": 11421, "synset": "sun_deck.n.01", "name": "sun_deck"}, - {"id": 11422, "synset": "sundial.n.01", "name": "sundial"}, - {"id": 11423, "synset": "sundress.n.01", "name": "sundress"}, - {"id": 11424, "synset": "sundries.n.01", "name": "sundries"}, - {"id": 11425, "synset": "sun_gear.n.01", "name": "sun_gear"}, - {"id": 11426, "synset": "sunglass.n.01", "name": "sunglass"}, - {"id": 11427, "synset": "sunlamp.n.01", "name": "sunlamp"}, - {"id": 11428, "synset": "sun_parlor.n.01", "name": "sun_parlor"}, - {"id": 11429, "synset": "sunroof.n.01", "name": "sunroof"}, - {"id": 11430, "synset": "sunscreen.n.01", "name": "sunscreen"}, - {"id": 11431, "synset": "sunsuit.n.01", "name": "sunsuit"}, - {"id": 11432, "synset": "supercharger.n.01", "name": "supercharger"}, - {"id": 11433, "synset": "supercomputer.n.01", "name": "supercomputer"}, - { - "id": 11434, - "synset": "superconducting_supercollider.n.01", - "name": "superconducting_supercollider", - }, - {"id": 11435, "synset": "superhighway.n.02", "name": "superhighway"}, - {"id": 11436, "synset": "supermarket.n.01", "name": "supermarket"}, - {"id": 11437, "synset": "superstructure.n.01", "name": "superstructure"}, - {"id": 11438, "synset": "supertanker.n.01", "name": "supertanker"}, - {"id": 11439, "synset": "supper_club.n.01", "name": "supper_club"}, - {"id": 11440, "synset": "supplejack.n.01", "name": "supplejack"}, - {"id": 11441, "synset": "supply_chamber.n.01", "name": "supply_chamber"}, - {"id": 11442, "synset": "supply_closet.n.01", "name": "supply_closet"}, - {"id": 11443, "synset": "support.n.10", "name": "support"}, - {"id": 11444, "synset": "support.n.07", "name": "support"}, - {"id": 11445, "synset": "support_column.n.01", "name": "support_column"}, - {"id": 11446, "synset": "support_hose.n.01", "name": "support_hose"}, - {"id": 11447, "synset": "supporting_structure.n.01", "name": "supporting_structure"}, - {"id": 11448, "synset": "supporting_tower.n.01", "name": "supporting_tower"}, - {"id": 11449, "synset": "surcoat.n.02", "name": "surcoat"}, - {"id": 11450, "synset": "surface_gauge.n.01", "name": "surface_gauge"}, - {"id": 11451, "synset": "surface_lift.n.01", "name": "surface_lift"}, - {"id": 11452, "synset": "surface_search_radar.n.01", "name": "surface_search_radar"}, - {"id": 11453, "synset": "surface_ship.n.01", "name": "surface_ship"}, - {"id": 11454, "synset": "surface-to-air_missile.n.01", "name": "surface-to-air_missile"}, - { - "id": 11455, - "synset": "surface-to-air_missile_system.n.01", - "name": "surface-to-air_missile_system", - }, - {"id": 11456, "synset": "surfboat.n.01", "name": "surfboat"}, - {"id": 11457, "synset": "surcoat.n.01", "name": "surcoat"}, - {"id": 11458, "synset": "surgeon's_knot.n.01", "name": "surgeon's_knot"}, - {"id": 11459, "synset": "surgery.n.02", "name": "surgery"}, - {"id": 11460, "synset": "surge_suppressor.n.01", "name": "surge_suppressor"}, - {"id": 11461, "synset": "surgical_dressing.n.01", "name": "surgical_dressing"}, - {"id": 11462, "synset": "surgical_instrument.n.01", "name": "surgical_instrument"}, - {"id": 11463, "synset": "surgical_knife.n.01", "name": "surgical_knife"}, - {"id": 11464, "synset": "surplice.n.01", "name": "surplice"}, - {"id": 11465, "synset": "surrey.n.02", "name": "surrey"}, - {"id": 11466, "synset": "surtout.n.01", "name": "surtout"}, - {"id": 11467, "synset": "surveillance_system.n.01", "name": "surveillance_system"}, - {"id": 11468, "synset": "surveying_instrument.n.01", "name": "surveying_instrument"}, - {"id": 11469, "synset": "surveyor's_level.n.01", "name": "surveyor's_level"}, - {"id": 11470, "synset": "sushi_bar.n.01", "name": "sushi_bar"}, - {"id": 11471, "synset": "suspension.n.05", "name": "suspension"}, - {"id": 11472, "synset": "suspension_bridge.n.01", "name": "suspension_bridge"}, - {"id": 11473, "synset": "suspensory.n.01", "name": "suspensory"}, - {"id": 11474, "synset": "sustaining_pedal.n.01", "name": "sustaining_pedal"}, - {"id": 11475, "synset": "suture.n.02", "name": "suture"}, - {"id": 11476, "synset": "swab.n.01", "name": "swab"}, - {"id": 11477, "synset": "swaddling_clothes.n.01", "name": "swaddling_clothes"}, - {"id": 11478, "synset": "swag.n.03", "name": "swag"}, - {"id": 11479, "synset": "swage_block.n.01", "name": "swage_block"}, - {"id": 11480, "synset": "swagger_stick.n.01", "name": "swagger_stick"}, - {"id": 11481, "synset": "swallow-tailed_coat.n.01", "name": "swallow-tailed_coat"}, - {"id": 11482, "synset": "swamp_buggy.n.01", "name": "swamp_buggy"}, - {"id": 11483, "synset": "swan's_down.n.01", "name": "swan's_down"}, - {"id": 11484, "synset": "swathe.n.01", "name": "swathe"}, - {"id": 11485, "synset": "swatter.n.01", "name": "swatter"}, - {"id": 11486, "synset": "sweat_bag.n.01", "name": "sweat_bag"}, - {"id": 11487, "synset": "sweatband.n.01", "name": "sweatband"}, - {"id": 11488, "synset": "sweatshop.n.01", "name": "sweatshop"}, - {"id": 11489, "synset": "sweat_suit.n.01", "name": "sweat_suit"}, - {"id": 11490, "synset": "sweep.n.04", "name": "sweep"}, - {"id": 11491, "synset": "sweep_hand.n.01", "name": "sweep_hand"}, - {"id": 11492, "synset": "swimming_trunks.n.01", "name": "swimming_trunks"}, - {"id": 11493, "synset": "swing.n.02", "name": "swing"}, - {"id": 11494, "synset": "swing_door.n.01", "name": "swing_door"}, - {"id": 11495, "synset": "switch.n.01", "name": "switch"}, - {"id": 11496, "synset": "switchblade.n.01", "name": "switchblade"}, - {"id": 11497, "synset": "switch_engine.n.01", "name": "switch_engine"}, - {"id": 11498, "synset": "swivel.n.01", "name": "swivel"}, - {"id": 11499, "synset": "swivel_chair.n.01", "name": "swivel_chair"}, - {"id": 11500, "synset": "swizzle_stick.n.01", "name": "swizzle_stick"}, - {"id": 11501, "synset": "sword_cane.n.01", "name": "sword_cane"}, - {"id": 11502, "synset": "s_wrench.n.01", "name": "S_wrench"}, - {"id": 11503, "synset": "synagogue.n.01", "name": "synagogue"}, - {"id": 11504, "synset": "synchrocyclotron.n.01", "name": "synchrocyclotron"}, - {"id": 11505, "synset": "synchroflash.n.01", "name": "synchroflash"}, - {"id": 11506, "synset": "synchromesh.n.01", "name": "synchromesh"}, - {"id": 11507, "synset": "synchronous_converter.n.01", "name": "synchronous_converter"}, - {"id": 11508, "synset": "synchronous_motor.n.01", "name": "synchronous_motor"}, - {"id": 11509, "synset": "synchrotron.n.01", "name": "synchrotron"}, - {"id": 11510, "synset": "synchroscope.n.01", "name": "synchroscope"}, - {"id": 11511, "synset": "synthesizer.n.02", "name": "synthesizer"}, - {"id": 11512, "synset": "system.n.01", "name": "system"}, - {"id": 11513, "synset": "tabard.n.01", "name": "tabard"}, - {"id": 11514, "synset": "tabernacle.n.02", "name": "Tabernacle"}, - {"id": 11515, "synset": "tabi.n.01", "name": "tabi"}, - {"id": 11516, "synset": "tab_key.n.01", "name": "tab_key"}, - {"id": 11517, "synset": "table.n.03", "name": "table"}, - {"id": 11518, "synset": "tablefork.n.01", "name": "tablefork"}, - {"id": 11519, "synset": "table_knife.n.01", "name": "table_knife"}, - {"id": 11520, "synset": "table_saw.n.01", "name": "table_saw"}, - {"id": 11521, "synset": "tablespoon.n.02", "name": "tablespoon"}, - {"id": 11522, "synset": "tablet-armed_chair.n.01", "name": "tablet-armed_chair"}, - {"id": 11523, "synset": "table-tennis_racquet.n.01", "name": "table-tennis_racquet"}, - {"id": 11524, "synset": "tabletop.n.01", "name": "tabletop"}, - {"id": 11525, "synset": "tableware.n.01", "name": "tableware"}, - {"id": 11526, "synset": "tabor.n.01", "name": "tabor"}, - {"id": 11527, "synset": "taboret.n.01", "name": "taboret"}, - {"id": 11528, "synset": "tachistoscope.n.01", "name": "tachistoscope"}, - {"id": 11529, "synset": "tachograph.n.01", "name": "tachograph"}, - {"id": 11530, "synset": "tachymeter.n.01", "name": "tachymeter"}, - {"id": 11531, "synset": "tack.n.02", "name": "tack"}, - {"id": 11532, "synset": "tack_hammer.n.01", "name": "tack_hammer"}, - {"id": 11533, "synset": "taffeta.n.01", "name": "taffeta"}, - {"id": 11534, "synset": "taffrail.n.01", "name": "taffrail"}, - {"id": 11535, "synset": "tailgate.n.01", "name": "tailgate"}, - {"id": 11536, "synset": "tailor-made.n.01", "name": "tailor-made"}, - {"id": 11537, "synset": "tailor's_chalk.n.01", "name": "tailor's_chalk"}, - {"id": 11538, "synset": "tailpipe.n.01", "name": "tailpipe"}, - {"id": 11539, "synset": "tail_rotor.n.01", "name": "tail_rotor"}, - {"id": 11540, "synset": "tailstock.n.01", "name": "tailstock"}, - {"id": 11541, "synset": "take-up.n.01", "name": "take-up"}, - {"id": 11542, "synset": "talaria.n.01", "name": "talaria"}, - {"id": 11543, "synset": "talcum.n.02", "name": "talcum"}, - {"id": 11544, "synset": "tam.n.01", "name": "tam"}, - {"id": 11545, "synset": "tambour.n.02", "name": "tambour"}, - {"id": 11546, "synset": "tambour.n.01", "name": "tambour"}, - {"id": 11547, "synset": "tammy.n.01", "name": "tammy"}, - {"id": 11548, "synset": "tamp.n.01", "name": "tamp"}, - {"id": 11549, "synset": "tampax.n.01", "name": "Tampax"}, - {"id": 11550, "synset": "tampion.n.01", "name": "tampion"}, - {"id": 11551, "synset": "tampon.n.01", "name": "tampon"}, - {"id": 11552, "synset": "tandoor.n.01", "name": "tandoor"}, - {"id": 11553, "synset": "tangram.n.01", "name": "tangram"}, - {"id": 11554, "synset": "tankard.n.01", "name": "tankard"}, - {"id": 11555, "synset": "tank_car.n.01", "name": "tank_car"}, - {"id": 11556, "synset": "tank_destroyer.n.01", "name": "tank_destroyer"}, - {"id": 11557, "synset": "tank_engine.n.01", "name": "tank_engine"}, - {"id": 11558, "synset": "tanker_plane.n.01", "name": "tanker_plane"}, - {"id": 11559, "synset": "tank_shell.n.01", "name": "tank_shell"}, - {"id": 11560, "synset": "tannoy.n.01", "name": "tannoy"}, - {"id": 11561, "synset": "tap.n.06", "name": "tap"}, - {"id": 11562, "synset": "tapa.n.02", "name": "tapa"}, - {"id": 11563, "synset": "tape.n.02", "name": "tape"}, - {"id": 11564, "synset": "tape_deck.n.01", "name": "tape_deck"}, - {"id": 11565, "synset": "tape_drive.n.01", "name": "tape_drive"}, - {"id": 11566, "synset": "tape_player.n.01", "name": "tape_player"}, - {"id": 11567, "synset": "tape_recorder.n.01", "name": "tape_recorder"}, - {"id": 11568, "synset": "taper_file.n.01", "name": "taper_file"}, - {"id": 11569, "synset": "tappet.n.01", "name": "tappet"}, - {"id": 11570, "synset": "tap_wrench.n.01", "name": "tap_wrench"}, - {"id": 11571, "synset": "tare.n.05", "name": "tare"}, - {"id": 11572, "synset": "target.n.04", "name": "target"}, - {"id": 11573, "synset": "target_acquisition_system.n.01", "name": "target_acquisition_system"}, - {"id": 11574, "synset": "tarmacadam.n.02", "name": "tarmacadam"}, - {"id": 11575, "synset": "tasset.n.01", "name": "tasset"}, - {"id": 11576, "synset": "tattoo.n.02", "name": "tattoo"}, - {"id": 11577, "synset": "tavern.n.01", "name": "tavern"}, - {"id": 11578, "synset": "tawse.n.01", "name": "tawse"}, - {"id": 11579, "synset": "taximeter.n.01", "name": "taximeter"}, - {"id": 11580, "synset": "t-bar_lift.n.01", "name": "T-bar_lift"}, - {"id": 11581, "synset": "tea_bag.n.02", "name": "tea_bag"}, - {"id": 11582, "synset": "tea_ball.n.01", "name": "tea_ball"}, - {"id": 11583, "synset": "tea_cart.n.01", "name": "tea_cart"}, - {"id": 11584, "synset": "tea_chest.n.01", "name": "tea_chest"}, - {"id": 11585, "synset": "teaching_aid.n.01", "name": "teaching_aid"}, - {"id": 11586, "synset": "tea_gown.n.01", "name": "tea_gown"}, - {"id": 11587, "synset": "tea_maker.n.01", "name": "tea_maker"}, - {"id": 11588, "synset": "teashop.n.01", "name": "teashop"}, - {"id": 11589, "synset": "teaspoon.n.02", "name": "teaspoon"}, - {"id": 11590, "synset": "tea-strainer.n.01", "name": "tea-strainer"}, - {"id": 11591, "synset": "tea_table.n.01", "name": "tea_table"}, - {"id": 11592, "synset": "tea_tray.n.01", "name": "tea_tray"}, - {"id": 11593, "synset": "tea_urn.n.01", "name": "tea_urn"}, - {"id": 11594, "synset": "tee.n.03", "name": "tee"}, - {"id": 11595, "synset": "tee_hinge.n.01", "name": "tee_hinge"}, - {"id": 11596, "synset": "telecom_hotel.n.01", "name": "telecom_hotel"}, - {"id": 11597, "synset": "telecommunication_system.n.01", "name": "telecommunication_system"}, - {"id": 11598, "synset": "telegraph.n.01", "name": "telegraph"}, - {"id": 11599, "synset": "telegraph_key.n.01", "name": "telegraph_key"}, - {"id": 11600, "synset": "telemeter.n.01", "name": "telemeter"}, - {"id": 11601, "synset": "telephone_bell.n.01", "name": "telephone_bell"}, - {"id": 11602, "synset": "telephone_cord.n.01", "name": "telephone_cord"}, - {"id": 11603, "synset": "telephone_jack.n.01", "name": "telephone_jack"}, - {"id": 11604, "synset": "telephone_line.n.02", "name": "telephone_line"}, - {"id": 11605, "synset": "telephone_plug.n.01", "name": "telephone_plug"}, - {"id": 11606, "synset": "telephone_receiver.n.01", "name": "telephone_receiver"}, - {"id": 11607, "synset": "telephone_system.n.01", "name": "telephone_system"}, - {"id": 11608, "synset": "telephone_wire.n.01", "name": "telephone_wire"}, - {"id": 11609, "synset": "teleprompter.n.01", "name": "Teleprompter"}, - {"id": 11610, "synset": "telescope.n.01", "name": "telescope"}, - {"id": 11611, "synset": "telescopic_sight.n.01", "name": "telescopic_sight"}, - {"id": 11612, "synset": "telethermometer.n.01", "name": "telethermometer"}, - {"id": 11613, "synset": "teletypewriter.n.01", "name": "teletypewriter"}, - {"id": 11614, "synset": "television.n.02", "name": "television"}, - {"id": 11615, "synset": "television_antenna.n.01", "name": "television_antenna"}, - {"id": 11616, "synset": "television_equipment.n.01", "name": "television_equipment"}, - {"id": 11617, "synset": "television_monitor.n.01", "name": "television_monitor"}, - {"id": 11618, "synset": "television_room.n.01", "name": "television_room"}, - {"id": 11619, "synset": "television_transmitter.n.01", "name": "television_transmitter"}, - {"id": 11620, "synset": "telpher.n.01", "name": "telpher"}, - {"id": 11621, "synset": "telpherage.n.01", "name": "telpherage"}, - {"id": 11622, "synset": "tempera.n.01", "name": "tempera"}, - {"id": 11623, "synset": "temple.n.01", "name": "temple"}, - {"id": 11624, "synset": "temple.n.03", "name": "temple"}, - {"id": 11625, "synset": "temporary_hookup.n.01", "name": "temporary_hookup"}, - {"id": 11626, "synset": "tender.n.06", "name": "tender"}, - {"id": 11627, "synset": "tender.n.05", "name": "tender"}, - {"id": 11628, "synset": "tender.n.04", "name": "tender"}, - {"id": 11629, "synset": "tenement.n.01", "name": "tenement"}, - {"id": 11630, "synset": "tennis_camp.n.01", "name": "tennis_camp"}, - {"id": 11631, "synset": "tenon.n.01", "name": "tenon"}, - {"id": 11632, "synset": "tenor_drum.n.01", "name": "tenor_drum"}, - {"id": 11633, "synset": "tenoroon.n.01", "name": "tenoroon"}, - {"id": 11634, "synset": "tenpenny_nail.n.01", "name": "tenpenny_nail"}, - {"id": 11635, "synset": "tenpin.n.01", "name": "tenpin"}, - {"id": 11636, "synset": "tensimeter.n.01", "name": "tensimeter"}, - {"id": 11637, "synset": "tensiometer.n.03", "name": "tensiometer"}, - {"id": 11638, "synset": "tensiometer.n.02", "name": "tensiometer"}, - {"id": 11639, "synset": "tensiometer.n.01", "name": "tensiometer"}, - {"id": 11640, "synset": "tent.n.01", "name": "tent"}, - {"id": 11641, "synset": "tenter.n.01", "name": "tenter"}, - {"id": 11642, "synset": "tenterhook.n.01", "name": "tenterhook"}, - {"id": 11643, "synset": "tent-fly.n.01", "name": "tent-fly"}, - {"id": 11644, "synset": "tent_peg.n.01", "name": "tent_peg"}, - {"id": 11645, "synset": "tepee.n.01", "name": "tepee"}, - {"id": 11646, "synset": "terminal.n.02", "name": "terminal"}, - {"id": 11647, "synset": "terminal.n.04", "name": "terminal"}, - {"id": 11648, "synset": "terraced_house.n.01", "name": "terraced_house"}, - {"id": 11649, "synset": "terra_cotta.n.01", "name": "terra_cotta"}, - {"id": 11650, "synset": "terrarium.n.01", "name": "terrarium"}, - {"id": 11651, "synset": "terra_sigillata.n.01", "name": "terra_sigillata"}, - {"id": 11652, "synset": "terry.n.02", "name": "terry"}, - {"id": 11653, "synset": "tesla_coil.n.01", "name": "Tesla_coil"}, - {"id": 11654, "synset": "tessera.n.01", "name": "tessera"}, - {"id": 11655, "synset": "test_equipment.n.01", "name": "test_equipment"}, - {"id": 11656, "synset": "test_rocket.n.01", "name": "test_rocket"}, - {"id": 11657, "synset": "test_room.n.01", "name": "test_room"}, - {"id": 11658, "synset": "testudo.n.01", "name": "testudo"}, - {"id": 11659, "synset": "tetraskelion.n.01", "name": "tetraskelion"}, - {"id": 11660, "synset": "tetrode.n.01", "name": "tetrode"}, - {"id": 11661, "synset": "textile_machine.n.01", "name": "textile_machine"}, - {"id": 11662, "synset": "textile_mill.n.01", "name": "textile_mill"}, - {"id": 11663, "synset": "thatch.n.04", "name": "thatch"}, - {"id": 11664, "synset": "theater.n.01", "name": "theater"}, - {"id": 11665, "synset": "theater_curtain.n.01", "name": "theater_curtain"}, - {"id": 11666, "synset": "theater_light.n.01", "name": "theater_light"}, - {"id": 11667, "synset": "theodolite.n.01", "name": "theodolite"}, - {"id": 11668, "synset": "theremin.n.01", "name": "theremin"}, - {"id": 11669, "synset": "thermal_printer.n.01", "name": "thermal_printer"}, - {"id": 11670, "synset": "thermal_reactor.n.01", "name": "thermal_reactor"}, - {"id": 11671, "synset": "thermocouple.n.01", "name": "thermocouple"}, - { - "id": 11672, - "synset": "thermoelectric_thermometer.n.01", - "name": "thermoelectric_thermometer", - }, - {"id": 11673, "synset": "thermograph.n.02", "name": "thermograph"}, - {"id": 11674, "synset": "thermograph.n.01", "name": "thermograph"}, - {"id": 11675, "synset": "thermohydrometer.n.01", "name": "thermohydrometer"}, - {"id": 11676, "synset": "thermojunction.n.01", "name": "thermojunction"}, - {"id": 11677, "synset": "thermonuclear_reactor.n.01", "name": "thermonuclear_reactor"}, - {"id": 11678, "synset": "thermopile.n.01", "name": "thermopile"}, - {"id": 11679, "synset": "thigh_pad.n.01", "name": "thigh_pad"}, - {"id": 11680, "synset": "thill.n.01", "name": "thill"}, - {"id": 11681, "synset": "thinning_shears.n.01", "name": "thinning_shears"}, - {"id": 11682, "synset": "third_base.n.01", "name": "third_base"}, - {"id": 11683, "synset": "third_gear.n.01", "name": "third_gear"}, - {"id": 11684, "synset": "third_rail.n.01", "name": "third_rail"}, - {"id": 11685, "synset": "thong.n.03", "name": "thong"}, - {"id": 11686, "synset": "thong.n.02", "name": "thong"}, - {"id": 11687, "synset": "three-centered_arch.n.01", "name": "three-centered_arch"}, - {"id": 11688, "synset": "three-decker.n.02", "name": "three-decker"}, - {"id": 11689, "synset": "three-dimensional_radar.n.01", "name": "three-dimensional_radar"}, - {"id": 11690, "synset": "three-piece_suit.n.01", "name": "three-piece_suit"}, - {"id": 11691, "synset": "three-quarter_binding.n.01", "name": "three-quarter_binding"}, - {"id": 11692, "synset": "three-way_switch.n.01", "name": "three-way_switch"}, - {"id": 11693, "synset": "thresher.n.01", "name": "thresher"}, - {"id": 11694, "synset": "threshing_floor.n.01", "name": "threshing_floor"}, - {"id": 11695, "synset": "thriftshop.n.01", "name": "thriftshop"}, - {"id": 11696, "synset": "throat_protector.n.01", "name": "throat_protector"}, - {"id": 11697, "synset": "throne.n.01", "name": "throne"}, - {"id": 11698, "synset": "thrust_bearing.n.01", "name": "thrust_bearing"}, - {"id": 11699, "synset": "thruster.n.02", "name": "thruster"}, - {"id": 11700, "synset": "thumb.n.02", "name": "thumb"}, - {"id": 11701, "synset": "thumbhole.n.02", "name": "thumbhole"}, - {"id": 11702, "synset": "thumbscrew.n.02", "name": "thumbscrew"}, - {"id": 11703, "synset": "thumbstall.n.01", "name": "thumbstall"}, - {"id": 11704, "synset": "thunderer.n.02", "name": "thunderer"}, - {"id": 11705, "synset": "thwart.n.01", "name": "thwart"}, - {"id": 11706, "synset": "ticking.n.02", "name": "ticking"}, - {"id": 11707, "synset": "tickler_coil.n.01", "name": "tickler_coil"}, - {"id": 11708, "synset": "tie.n.04", "name": "tie"}, - {"id": 11709, "synset": "tie.n.08", "name": "tie"}, - {"id": 11710, "synset": "tie_rack.n.01", "name": "tie_rack"}, - {"id": 11711, "synset": "tie_rod.n.01", "name": "tie_rod"}, - {"id": 11712, "synset": "tile.n.01", "name": "tile"}, - {"id": 11713, "synset": "tile_cutter.n.01", "name": "tile_cutter"}, - {"id": 11714, "synset": "tile_roof.n.01", "name": "tile_roof"}, - {"id": 11715, "synset": "tiller.n.03", "name": "tiller"}, - {"id": 11716, "synset": "tilter.n.02", "name": "tilter"}, - {"id": 11717, "synset": "tilt-top_table.n.01", "name": "tilt-top_table"}, - {"id": 11718, "synset": "timber.n.02", "name": "timber"}, - {"id": 11719, "synset": "timber.n.03", "name": "timber"}, - {"id": 11720, "synset": "timber_hitch.n.01", "name": "timber_hitch"}, - {"id": 11721, "synset": "timbrel.n.01", "name": "timbrel"}, - {"id": 11722, "synset": "time_bomb.n.02", "name": "time_bomb"}, - {"id": 11723, "synset": "time_capsule.n.01", "name": "time_capsule"}, - {"id": 11724, "synset": "time_clock.n.01", "name": "time_clock"}, - { - "id": 11725, - "synset": "time-delay_measuring_instrument.n.01", - "name": "time-delay_measuring_instrument", - }, - {"id": 11726, "synset": "time-fuse.n.01", "name": "time-fuse"}, - {"id": 11727, "synset": "timepiece.n.01", "name": "timepiece"}, - {"id": 11728, "synset": "timer.n.03", "name": "timer"}, - {"id": 11729, "synset": "time-switch.n.01", "name": "time-switch"}, - {"id": 11730, "synset": "tin.n.02", "name": "tin"}, - {"id": 11731, "synset": "tinderbox.n.02", "name": "tinderbox"}, - {"id": 11732, "synset": "tine.n.01", "name": "tine"}, - {"id": 11733, "synset": "tippet.n.01", "name": "tippet"}, - {"id": 11734, "synset": "tire_chain.n.01", "name": "tire_chain"}, - {"id": 11735, "synset": "tire_iron.n.01", "name": "tire_iron"}, - {"id": 11736, "synset": "titfer.n.01", "name": "titfer"}, - {"id": 11737, "synset": "tithe_barn.n.01", "name": "tithe_barn"}, - {"id": 11738, "synset": "titrator.n.01", "name": "titrator"}, - {"id": 11739, "synset": "toasting_fork.n.01", "name": "toasting_fork"}, - {"id": 11740, "synset": "toastrack.n.01", "name": "toastrack"}, - {"id": 11741, "synset": "tobacco_pouch.n.01", "name": "tobacco_pouch"}, - {"id": 11742, "synset": "tobacco_shop.n.01", "name": "tobacco_shop"}, - {"id": 11743, "synset": "toboggan.n.01", "name": "toboggan"}, - {"id": 11744, "synset": "toby.n.01", "name": "toby"}, - {"id": 11745, "synset": "tocsin.n.02", "name": "tocsin"}, - {"id": 11746, "synset": "toe.n.02", "name": "toe"}, - {"id": 11747, "synset": "toecap.n.01", "name": "toecap"}, - {"id": 11748, "synset": "toehold.n.02", "name": "toehold"}, - {"id": 11749, "synset": "toga.n.01", "name": "toga"}, - {"id": 11750, "synset": "toga_virilis.n.01", "name": "toga_virilis"}, - {"id": 11751, "synset": "toggle.n.03", "name": "toggle"}, - {"id": 11752, "synset": "toggle_bolt.n.01", "name": "toggle_bolt"}, - {"id": 11753, "synset": "toggle_joint.n.01", "name": "toggle_joint"}, - {"id": 11754, "synset": "toggle_switch.n.01", "name": "toggle_switch"}, - {"id": 11755, "synset": "togs.n.01", "name": "togs"}, - {"id": 11756, "synset": "toilet.n.01", "name": "toilet"}, - {"id": 11757, "synset": "toilet_bag.n.01", "name": "toilet_bag"}, - {"id": 11758, "synset": "toilet_bowl.n.01", "name": "toilet_bowl"}, - {"id": 11759, "synset": "toilet_kit.n.01", "name": "toilet_kit"}, - {"id": 11760, "synset": "toilet_powder.n.01", "name": "toilet_powder"}, - {"id": 11761, "synset": "toiletry.n.01", "name": "toiletry"}, - {"id": 11762, "synset": "toilet_seat.n.01", "name": "toilet_seat"}, - {"id": 11763, "synset": "toilet_water.n.01", "name": "toilet_water"}, - {"id": 11764, "synset": "tokamak.n.01", "name": "tokamak"}, - {"id": 11765, "synset": "token.n.03", "name": "token"}, - {"id": 11766, "synset": "tollbooth.n.01", "name": "tollbooth"}, - {"id": 11767, "synset": "toll_bridge.n.01", "name": "toll_bridge"}, - {"id": 11768, "synset": "tollgate.n.01", "name": "tollgate"}, - {"id": 11769, "synset": "toll_line.n.01", "name": "toll_line"}, - {"id": 11770, "synset": "tomahawk.n.01", "name": "tomahawk"}, - {"id": 11771, "synset": "tommy_gun.n.01", "name": "Tommy_gun"}, - {"id": 11772, "synset": "tomograph.n.01", "name": "tomograph"}, - {"id": 11773, "synset": "tone_arm.n.01", "name": "tone_arm"}, - {"id": 11774, "synset": "toner.n.03", "name": "toner"}, - {"id": 11775, "synset": "tongue.n.07", "name": "tongue"}, - {"id": 11776, "synset": "tongue_and_groove_joint.n.01", "name": "tongue_and_groove_joint"}, - {"id": 11777, "synset": "tongue_depressor.n.01", "name": "tongue_depressor"}, - {"id": 11778, "synset": "tonometer.n.01", "name": "tonometer"}, - {"id": 11779, "synset": "tool.n.01", "name": "tool"}, - {"id": 11780, "synset": "tool_bag.n.01", "name": "tool_bag"}, - {"id": 11781, "synset": "toolshed.n.01", "name": "toolshed"}, - {"id": 11782, "synset": "tooth.n.02", "name": "tooth"}, - {"id": 11783, "synset": "tooth.n.05", "name": "tooth"}, - {"id": 11784, "synset": "top.n.10", "name": "top"}, - {"id": 11785, "synset": "topgallant.n.02", "name": "topgallant"}, - {"id": 11786, "synset": "topgallant.n.01", "name": "topgallant"}, - {"id": 11787, "synset": "topiary.n.01", "name": "topiary"}, - {"id": 11788, "synset": "topknot.n.01", "name": "topknot"}, - {"id": 11789, "synset": "topmast.n.01", "name": "topmast"}, - {"id": 11790, "synset": "topper.n.05", "name": "topper"}, - {"id": 11791, "synset": "topsail.n.01", "name": "topsail"}, - {"id": 11792, "synset": "toque.n.01", "name": "toque"}, - {"id": 11793, "synset": "torch.n.01", "name": "torch"}, - {"id": 11794, "synset": "torpedo.n.06", "name": "torpedo"}, - {"id": 11795, "synset": "torpedo.n.05", "name": "torpedo"}, - {"id": 11796, "synset": "torpedo.n.03", "name": "torpedo"}, - {"id": 11797, "synset": "torpedo_boat.n.01", "name": "torpedo_boat"}, - {"id": 11798, "synset": "torpedo-boat_destroyer.n.01", "name": "torpedo-boat_destroyer"}, - {"id": 11799, "synset": "torpedo_tube.n.01", "name": "torpedo_tube"}, - {"id": 11800, "synset": "torque_converter.n.01", "name": "torque_converter"}, - {"id": 11801, "synset": "torque_wrench.n.01", "name": "torque_wrench"}, - {"id": 11802, "synset": "torture_chamber.n.01", "name": "torture_chamber"}, - {"id": 11803, "synset": "totem_pole.n.01", "name": "totem_pole"}, - {"id": 11804, "synset": "touch_screen.n.01", "name": "touch_screen"}, - {"id": 11805, "synset": "toupee.n.01", "name": "toupee"}, - {"id": 11806, "synset": "touring_car.n.01", "name": "touring_car"}, - {"id": 11807, "synset": "tourist_class.n.01", "name": "tourist_class"}, - {"id": 11808, "synset": "toweling.n.01", "name": "toweling"}, - {"id": 11809, "synset": "towel_rail.n.01", "name": "towel_rail"}, - {"id": 11810, "synset": "tower.n.01", "name": "tower"}, - {"id": 11811, "synset": "town_hall.n.01", "name": "town_hall"}, - {"id": 11812, "synset": "towpath.n.01", "name": "towpath"}, - {"id": 11813, "synset": "toy_box.n.01", "name": "toy_box"}, - {"id": 11814, "synset": "toyshop.n.01", "name": "toyshop"}, - {"id": 11815, "synset": "trace_detector.n.01", "name": "trace_detector"}, - {"id": 11816, "synset": "track.n.09", "name": "track"}, - {"id": 11817, "synset": "track.n.08", "name": "track"}, - {"id": 11818, "synset": "trackball.n.01", "name": "trackball"}, - {"id": 11819, "synset": "tracked_vehicle.n.01", "name": "tracked_vehicle"}, - {"id": 11820, "synset": "tract_house.n.01", "name": "tract_house"}, - {"id": 11821, "synset": "tract_housing.n.01", "name": "tract_housing"}, - {"id": 11822, "synset": "traction_engine.n.01", "name": "traction_engine"}, - {"id": 11823, "synset": "tractor.n.02", "name": "tractor"}, - {"id": 11824, "synset": "trailer.n.04", "name": "trailer"}, - {"id": 11825, "synset": "trailer.n.03", "name": "trailer"}, - {"id": 11826, "synset": "trailer_camp.n.01", "name": "trailer_camp"}, - {"id": 11827, "synset": "trailing_edge.n.01", "name": "trailing_edge"}, - {"id": 11828, "synset": "tramline.n.01", "name": "tramline"}, - {"id": 11829, "synset": "trammel.n.02", "name": "trammel"}, - {"id": 11830, "synset": "tramp_steamer.n.01", "name": "tramp_steamer"}, - {"id": 11831, "synset": "tramway.n.01", "name": "tramway"}, - {"id": 11832, "synset": "transdermal_patch.n.01", "name": "transdermal_patch"}, - {"id": 11833, "synset": "transept.n.01", "name": "transept"}, - {"id": 11834, "synset": "transformer.n.01", "name": "transformer"}, - {"id": 11835, "synset": "transistor.n.01", "name": "transistor"}, - {"id": 11836, "synset": "transit_instrument.n.01", "name": "transit_instrument"}, - {"id": 11837, "synset": "transmission.n.05", "name": "transmission"}, - {"id": 11838, "synset": "transmission_shaft.n.01", "name": "transmission_shaft"}, - {"id": 11839, "synset": "transmitter.n.03", "name": "transmitter"}, - {"id": 11840, "synset": "transom.n.02", "name": "transom"}, - {"id": 11841, "synset": "transom.n.01", "name": "transom"}, - {"id": 11842, "synset": "transponder.n.01", "name": "transponder"}, - {"id": 11843, "synset": "transporter.n.02", "name": "transporter"}, - {"id": 11844, "synset": "transporter.n.01", "name": "transporter"}, - {"id": 11845, "synset": "transport_ship.n.01", "name": "transport_ship"}, - {"id": 11846, "synset": "trap.n.01", "name": "trap"}, - {"id": 11847, "synset": "trap_door.n.01", "name": "trap_door"}, - {"id": 11848, "synset": "trapeze.n.01", "name": "trapeze"}, - {"id": 11849, "synset": "trave.n.01", "name": "trave"}, - {"id": 11850, "synset": "travel_iron.n.01", "name": "travel_iron"}, - {"id": 11851, "synset": "trawl.n.02", "name": "trawl"}, - {"id": 11852, "synset": "trawl.n.01", "name": "trawl"}, - {"id": 11853, "synset": "trawler.n.02", "name": "trawler"}, - {"id": 11854, "synset": "tray_cloth.n.01", "name": "tray_cloth"}, - {"id": 11855, "synset": "tread.n.04", "name": "tread"}, - {"id": 11856, "synset": "tread.n.03", "name": "tread"}, - {"id": 11857, "synset": "treadmill.n.02", "name": "treadmill"}, - {"id": 11858, "synset": "treadmill.n.01", "name": "treadmill"}, - {"id": 11859, "synset": "treasure_chest.n.01", "name": "treasure_chest"}, - {"id": 11860, "synset": "treasure_ship.n.01", "name": "treasure_ship"}, - {"id": 11861, "synset": "treenail.n.01", "name": "treenail"}, - {"id": 11862, "synset": "trefoil_arch.n.01", "name": "trefoil_arch"}, - {"id": 11863, "synset": "trellis.n.01", "name": "trellis"}, - {"id": 11864, "synset": "trench.n.01", "name": "trench"}, - {"id": 11865, "synset": "trench_knife.n.01", "name": "trench_knife"}, - {"id": 11866, "synset": "trepan.n.02", "name": "trepan"}, - {"id": 11867, "synset": "trepan.n.01", "name": "trepan"}, - {"id": 11868, "synset": "trestle.n.02", "name": "trestle"}, - {"id": 11869, "synset": "trestle.n.01", "name": "trestle"}, - {"id": 11870, "synset": "trestle_bridge.n.01", "name": "trestle_bridge"}, - {"id": 11871, "synset": "trestle_table.n.01", "name": "trestle_table"}, - {"id": 11872, "synset": "trestlework.n.01", "name": "trestlework"}, - {"id": 11873, "synset": "trews.n.01", "name": "trews"}, - {"id": 11874, "synset": "trial_balloon.n.02", "name": "trial_balloon"}, - {"id": 11875, "synset": "triangle.n.04", "name": "triangle"}, - {"id": 11876, "synset": "triclinium.n.02", "name": "triclinium"}, - {"id": 11877, "synset": "triclinium.n.01", "name": "triclinium"}, - {"id": 11878, "synset": "tricorn.n.01", "name": "tricorn"}, - {"id": 11879, "synset": "tricot.n.01", "name": "tricot"}, - {"id": 11880, "synset": "trident.n.01", "name": "trident"}, - {"id": 11881, "synset": "trigger.n.02", "name": "trigger"}, - {"id": 11882, "synset": "trimaran.n.01", "name": "trimaran"}, - {"id": 11883, "synset": "trimmer.n.02", "name": "trimmer"}, - {"id": 11884, "synset": "trimmer_arch.n.01", "name": "trimmer_arch"}, - {"id": 11885, "synset": "triode.n.01", "name": "triode"}, - {"id": 11886, "synset": "triptych.n.01", "name": "triptych"}, - {"id": 11887, "synset": "trip_wire.n.02", "name": "trip_wire"}, - {"id": 11888, "synset": "trireme.n.01", "name": "trireme"}, - {"id": 11889, "synset": "triskelion.n.01", "name": "triskelion"}, - {"id": 11890, "synset": "triumphal_arch.n.01", "name": "triumphal_arch"}, - {"id": 11891, "synset": "trivet.n.02", "name": "trivet"}, - {"id": 11892, "synset": "trivet.n.01", "name": "trivet"}, - {"id": 11893, "synset": "troika.n.01", "name": "troika"}, - {"id": 11894, "synset": "troll.n.03", "name": "troll"}, - {"id": 11895, "synset": "trolleybus.n.01", "name": "trolleybus"}, - {"id": 11896, "synset": "trombone.n.01", "name": "trombone"}, - {"id": 11897, "synset": "troop_carrier.n.01", "name": "troop_carrier"}, - {"id": 11898, "synset": "troopship.n.01", "name": "troopship"}, - {"id": 11899, "synset": "trophy_case.n.01", "name": "trophy_case"}, - {"id": 11900, "synset": "trough.n.05", "name": "trough"}, - {"id": 11901, "synset": "trouser.n.02", "name": "trouser"}, - {"id": 11902, "synset": "trouser_cuff.n.01", "name": "trouser_cuff"}, - {"id": 11903, "synset": "trouser_press.n.01", "name": "trouser_press"}, - {"id": 11904, "synset": "trousseau.n.01", "name": "trousseau"}, - {"id": 11905, "synset": "trowel.n.01", "name": "trowel"}, - {"id": 11906, "synset": "trumpet_arch.n.01", "name": "trumpet_arch"}, - {"id": 11907, "synset": "truncheon.n.01", "name": "truncheon"}, - {"id": 11908, "synset": "trundle_bed.n.01", "name": "trundle_bed"}, - {"id": 11909, "synset": "trunk_hose.n.01", "name": "trunk_hose"}, - {"id": 11910, "synset": "trunk_lid.n.01", "name": "trunk_lid"}, - {"id": 11911, "synset": "trunk_line.n.02", "name": "trunk_line"}, - {"id": 11912, "synset": "truss.n.02", "name": "truss"}, - {"id": 11913, "synset": "truss_bridge.n.01", "name": "truss_bridge"}, - {"id": 11914, "synset": "try_square.n.01", "name": "try_square"}, - {"id": 11915, "synset": "t-square.n.01", "name": "T-square"}, - {"id": 11916, "synset": "tube.n.02", "name": "tube"}, - {"id": 11917, "synset": "tuck_box.n.01", "name": "tuck_box"}, - {"id": 11918, "synset": "tucker.n.04", "name": "tucker"}, - {"id": 11919, "synset": "tucker-bag.n.01", "name": "tucker-bag"}, - {"id": 11920, "synset": "tuck_shop.n.01", "name": "tuck_shop"}, - {"id": 11921, "synset": "tudor_arch.n.01", "name": "Tudor_arch"}, - {"id": 11922, "synset": "tudung.n.01", "name": "tudung"}, - {"id": 11923, "synset": "tugboat.n.01", "name": "tugboat"}, - {"id": 11924, "synset": "tulle.n.01", "name": "tulle"}, - {"id": 11925, "synset": "tumble-dryer.n.01", "name": "tumble-dryer"}, - {"id": 11926, "synset": "tumbler.n.02", "name": "tumbler"}, - {"id": 11927, "synset": "tumbrel.n.01", "name": "tumbrel"}, - {"id": 11928, "synset": "tun.n.01", "name": "tun"}, - {"id": 11929, "synset": "tunic.n.02", "name": "tunic"}, - {"id": 11930, "synset": "tuning_fork.n.01", "name": "tuning_fork"}, - {"id": 11931, "synset": "tupik.n.01", "name": "tupik"}, - {"id": 11932, "synset": "turbine.n.01", "name": "turbine"}, - {"id": 11933, "synset": "turbogenerator.n.01", "name": "turbogenerator"}, - {"id": 11934, "synset": "tureen.n.01", "name": "tureen"}, - {"id": 11935, "synset": "turkish_bath.n.01", "name": "Turkish_bath"}, - {"id": 11936, "synset": "turkish_towel.n.01", "name": "Turkish_towel"}, - {"id": 11937, "synset": "turk's_head.n.01", "name": "Turk's_head"}, - {"id": 11938, "synset": "turnbuckle.n.01", "name": "turnbuckle"}, - {"id": 11939, "synset": "turner.n.08", "name": "turner"}, - {"id": 11940, "synset": "turnery.n.01", "name": "turnery"}, - {"id": 11941, "synset": "turnpike.n.01", "name": "turnpike"}, - {"id": 11942, "synset": "turnspit.n.01", "name": "turnspit"}, - {"id": 11943, "synset": "turnstile.n.01", "name": "turnstile"}, - {"id": 11944, "synset": "turntable.n.01", "name": "turntable"}, - {"id": 11945, "synset": "turntable.n.02", "name": "turntable"}, - {"id": 11946, "synset": "turret.n.01", "name": "turret"}, - {"id": 11947, "synset": "turret_clock.n.01", "name": "turret_clock"}, - {"id": 11948, "synset": "tweed.n.01", "name": "tweed"}, - {"id": 11949, "synset": "tweeter.n.01", "name": "tweeter"}, - {"id": 11950, "synset": "twenty-two.n.02", "name": "twenty-two"}, - {"id": 11951, "synset": "twenty-two_pistol.n.01", "name": "twenty-two_pistol"}, - {"id": 11952, "synset": "twenty-two_rifle.n.01", "name": "twenty-two_rifle"}, - {"id": 11953, "synset": "twill.n.02", "name": "twill"}, - {"id": 11954, "synset": "twill.n.01", "name": "twill"}, - {"id": 11955, "synset": "twin_bed.n.01", "name": "twin_bed"}, - {"id": 11956, "synset": "twinjet.n.01", "name": "twinjet"}, - {"id": 11957, "synset": "twist_bit.n.01", "name": "twist_bit"}, - {"id": 11958, "synset": "two-by-four.n.01", "name": "two-by-four"}, - {"id": 11959, "synset": "two-man_tent.n.01", "name": "two-man_tent"}, - {"id": 11960, "synset": "two-piece.n.01", "name": "two-piece"}, - {"id": 11961, "synset": "typesetting_machine.n.01", "name": "typesetting_machine"}, - {"id": 11962, "synset": "typewriter_carriage.n.01", "name": "typewriter_carriage"}, - {"id": 11963, "synset": "typewriter_keyboard.n.01", "name": "typewriter_keyboard"}, - {"id": 11964, "synset": "tyrolean.n.02", "name": "tyrolean"}, - {"id": 11965, "synset": "uke.n.01", "name": "uke"}, - {"id": 11966, "synset": "ulster.n.02", "name": "ulster"}, - {"id": 11967, "synset": "ultracentrifuge.n.01", "name": "ultracentrifuge"}, - {"id": 11968, "synset": "ultramicroscope.n.01", "name": "ultramicroscope"}, - {"id": 11969, "synset": "ultrasuede.n.01", "name": "Ultrasuede"}, - {"id": 11970, "synset": "ultraviolet_lamp.n.01", "name": "ultraviolet_lamp"}, - {"id": 11971, "synset": "umbrella_tent.n.01", "name": "umbrella_tent"}, - {"id": 11972, "synset": "undercarriage.n.01", "name": "undercarriage"}, - {"id": 11973, "synset": "undercoat.n.01", "name": "undercoat"}, - {"id": 11974, "synset": "undergarment.n.01", "name": "undergarment"}, - {"id": 11975, "synset": "underpants.n.01", "name": "underpants"}, - {"id": 11976, "synset": "undies.n.01", "name": "undies"}, - {"id": 11977, "synset": "uneven_parallel_bars.n.01", "name": "uneven_parallel_bars"}, - {"id": 11978, "synset": "uniform.n.01", "name": "uniform"}, - {"id": 11979, "synset": "universal_joint.n.01", "name": "universal_joint"}, - {"id": 11980, "synset": "university.n.02", "name": "university"}, - {"id": 11981, "synset": "upholstery.n.01", "name": "upholstery"}, - {"id": 11982, "synset": "upholstery_material.n.01", "name": "upholstery_material"}, - {"id": 11983, "synset": "upholstery_needle.n.01", "name": "upholstery_needle"}, - {"id": 11984, "synset": "uplift.n.02", "name": "uplift"}, - {"id": 11985, "synset": "upper_berth.n.01", "name": "upper_berth"}, - {"id": 11986, "synset": "upright.n.02", "name": "upright"}, - {"id": 11987, "synset": "upset.n.04", "name": "upset"}, - {"id": 11988, "synset": "upstairs.n.01", "name": "upstairs"}, - {"id": 11989, "synset": "urceole.n.01", "name": "urceole"}, - {"id": 11990, "synset": "urn.n.02", "name": "urn"}, - {"id": 11991, "synset": "used-car.n.01", "name": "used-car"}, - {"id": 11992, "synset": "utensil.n.01", "name": "utensil"}, - {"id": 11993, "synset": "uzi.n.01", "name": "Uzi"}, - {"id": 11994, "synset": "vacation_home.n.01", "name": "vacation_home"}, - {"id": 11995, "synset": "vacuum_chamber.n.01", "name": "vacuum_chamber"}, - {"id": 11996, "synset": "vacuum_flask.n.01", "name": "vacuum_flask"}, - {"id": 11997, "synset": "vacuum_gauge.n.01", "name": "vacuum_gauge"}, - {"id": 11998, "synset": "valenciennes.n.02", "name": "Valenciennes"}, - {"id": 11999, "synset": "valise.n.01", "name": "valise"}, - {"id": 12000, "synset": "valve.n.03", "name": "valve"}, - {"id": 12001, "synset": "valve.n.02", "name": "valve"}, - {"id": 12002, "synset": "valve-in-head_engine.n.01", "name": "valve-in-head_engine"}, - {"id": 12003, "synset": "vambrace.n.01", "name": "vambrace"}, - {"id": 12004, "synset": "van.n.05", "name": "van"}, - {"id": 12005, "synset": "van.n.04", "name": "van"}, - {"id": 12006, "synset": "vane.n.02", "name": "vane"}, - {"id": 12007, "synset": "vaporizer.n.01", "name": "vaporizer"}, - {"id": 12008, "synset": "variable-pitch_propeller.n.01", "name": "variable-pitch_propeller"}, - {"id": 12009, "synset": "variometer.n.01", "name": "variometer"}, - {"id": 12010, "synset": "varnish.n.01", "name": "varnish"}, - {"id": 12011, "synset": "vault.n.03", "name": "vault"}, - {"id": 12012, "synset": "vault.n.02", "name": "vault"}, - {"id": 12013, "synset": "vaulting_horse.n.01", "name": "vaulting_horse"}, - {"id": 12014, "synset": "vehicle.n.01", "name": "vehicle"}, - {"id": 12015, "synset": "velcro.n.01", "name": "Velcro"}, - {"id": 12016, "synset": "velocipede.n.01", "name": "velocipede"}, - {"id": 12017, "synset": "velour.n.01", "name": "velour"}, - {"id": 12018, "synset": "velvet.n.01", "name": "velvet"}, - {"id": 12019, "synset": "velveteen.n.01", "name": "velveteen"}, - {"id": 12020, "synset": "veneer.n.01", "name": "veneer"}, - {"id": 12021, "synset": "venetian_blind.n.01", "name": "Venetian_blind"}, - {"id": 12022, "synset": "venn_diagram.n.01", "name": "Venn_diagram"}, - {"id": 12023, "synset": "ventilation.n.02", "name": "ventilation"}, - {"id": 12024, "synset": "ventilation_shaft.n.01", "name": "ventilation_shaft"}, - {"id": 12025, "synset": "ventilator.n.01", "name": "ventilator"}, - {"id": 12026, "synset": "veranda.n.01", "name": "veranda"}, - {"id": 12027, "synset": "verdigris.n.02", "name": "verdigris"}, - {"id": 12028, "synset": "vernier_caliper.n.01", "name": "vernier_caliper"}, - {"id": 12029, "synset": "vernier_scale.n.01", "name": "vernier_scale"}, - {"id": 12030, "synset": "vertical_file.n.01", "name": "vertical_file"}, - {"id": 12031, "synset": "vertical_stabilizer.n.01", "name": "vertical_stabilizer"}, - {"id": 12032, "synset": "vertical_tail.n.01", "name": "vertical_tail"}, - {"id": 12033, "synset": "very_pistol.n.01", "name": "Very_pistol"}, - {"id": 12034, "synset": "vessel.n.02", "name": "vessel"}, - {"id": 12035, "synset": "vessel.n.03", "name": "vessel"}, - {"id": 12036, "synset": "vestiture.n.01", "name": "vestiture"}, - {"id": 12037, "synset": "vestment.n.01", "name": "vestment"}, - {"id": 12038, "synset": "vest_pocket.n.01", "name": "vest_pocket"}, - {"id": 12039, "synset": "vestry.n.02", "name": "vestry"}, - {"id": 12040, "synset": "viaduct.n.01", "name": "viaduct"}, - {"id": 12041, "synset": "vibraphone.n.01", "name": "vibraphone"}, - {"id": 12042, "synset": "vibrator.n.02", "name": "vibrator"}, - {"id": 12043, "synset": "vibrator.n.01", "name": "vibrator"}, - {"id": 12044, "synset": "victrola.n.01", "name": "Victrola"}, - {"id": 12045, "synset": "vicuna.n.02", "name": "vicuna"}, - {"id": 12046, "synset": "videocassette.n.01", "name": "videocassette"}, - {"id": 12047, "synset": "videocassette_recorder.n.01", "name": "videocassette_recorder"}, - {"id": 12048, "synset": "videodisk.n.01", "name": "videodisk"}, - {"id": 12049, "synset": "video_recording.n.01", "name": "video_recording"}, - {"id": 12050, "synset": "videotape.n.02", "name": "videotape"}, - {"id": 12051, "synset": "vigil_light.n.01", "name": "vigil_light"}, - {"id": 12052, "synset": "villa.n.04", "name": "villa"}, - {"id": 12053, "synset": "villa.n.03", "name": "villa"}, - {"id": 12054, "synset": "villa.n.02", "name": "villa"}, - {"id": 12055, "synset": "viol.n.01", "name": "viol"}, - {"id": 12056, "synset": "viola.n.03", "name": "viola"}, - {"id": 12057, "synset": "viola_da_braccio.n.01", "name": "viola_da_braccio"}, - {"id": 12058, "synset": "viola_da_gamba.n.01", "name": "viola_da_gamba"}, - {"id": 12059, "synset": "viola_d'amore.n.01", "name": "viola_d'amore"}, - {"id": 12060, "synset": "virginal.n.01", "name": "virginal"}, - {"id": 12061, "synset": "viscometer.n.01", "name": "viscometer"}, - {"id": 12062, "synset": "viscose_rayon.n.01", "name": "viscose_rayon"}, - {"id": 12063, "synset": "vise.n.01", "name": "vise"}, - {"id": 12064, "synset": "visor.n.01", "name": "visor"}, - {"id": 12065, "synset": "visual_display_unit.n.01", "name": "visual_display_unit"}, - {"id": 12066, "synset": "vivarium.n.01", "name": "vivarium"}, - {"id": 12067, "synset": "viyella.n.01", "name": "Viyella"}, - {"id": 12068, "synset": "voile.n.01", "name": "voile"}, - {"id": 12069, "synset": "volleyball_net.n.01", "name": "volleyball_net"}, - {"id": 12070, "synset": "voltage_regulator.n.01", "name": "voltage_regulator"}, - {"id": 12071, "synset": "voltaic_cell.n.01", "name": "voltaic_cell"}, - {"id": 12072, "synset": "voltaic_pile.n.01", "name": "voltaic_pile"}, - {"id": 12073, "synset": "voltmeter.n.01", "name": "voltmeter"}, - {"id": 12074, "synset": "vomitory.n.01", "name": "vomitory"}, - {"id": 12075, "synset": "von_neumann_machine.n.01", "name": "von_Neumann_machine"}, - {"id": 12076, "synset": "voting_booth.n.01", "name": "voting_booth"}, - {"id": 12077, "synset": "voting_machine.n.01", "name": "voting_machine"}, - {"id": 12078, "synset": "voussoir.n.01", "name": "voussoir"}, - {"id": 12079, "synset": "vox_angelica.n.01", "name": "vox_angelica"}, - {"id": 12080, "synset": "vox_humana.n.01", "name": "vox_humana"}, - {"id": 12081, "synset": "waders.n.01", "name": "waders"}, - {"id": 12082, "synset": "wading_pool.n.01", "name": "wading_pool"}, - {"id": 12083, "synset": "wagon.n.04", "name": "wagon"}, - {"id": 12084, "synset": "wagon_tire.n.01", "name": "wagon_tire"}, - {"id": 12085, "synset": "wain.n.03", "name": "wain"}, - {"id": 12086, "synset": "wainscot.n.02", "name": "wainscot"}, - {"id": 12087, "synset": "wainscoting.n.01", "name": "wainscoting"}, - {"id": 12088, "synset": "waist_pack.n.01", "name": "waist_pack"}, - {"id": 12089, "synset": "walker.n.06", "name": "walker"}, - {"id": 12090, "synset": "walker.n.05", "name": "walker"}, - {"id": 12091, "synset": "walker.n.04", "name": "walker"}, - {"id": 12092, "synset": "walkie-talkie.n.01", "name": "walkie-talkie"}, - {"id": 12093, "synset": "walk-in.n.04", "name": "walk-in"}, - {"id": 12094, "synset": "walking_shoe.n.01", "name": "walking_shoe"}, - {"id": 12095, "synset": "walkman.n.01", "name": "Walkman"}, - {"id": 12096, "synset": "walk-up_apartment.n.01", "name": "walk-up_apartment"}, - {"id": 12097, "synset": "wall.n.01", "name": "wall"}, - {"id": 12098, "synset": "wall.n.07", "name": "wall"}, - {"id": 12099, "synset": "wall_tent.n.01", "name": "wall_tent"}, - {"id": 12100, "synset": "wall_unit.n.01", "name": "wall_unit"}, - {"id": 12101, "synset": "wand.n.01", "name": "wand"}, - {"id": 12102, "synset": "wankel_engine.n.01", "name": "Wankel_engine"}, - {"id": 12103, "synset": "ward.n.03", "name": "ward"}, - {"id": 12104, "synset": "wardroom.n.01", "name": "wardroom"}, - {"id": 12105, "synset": "warehouse.n.01", "name": "warehouse"}, - {"id": 12106, "synset": "warming_pan.n.01", "name": "warming_pan"}, - {"id": 12107, "synset": "war_paint.n.02", "name": "war_paint"}, - {"id": 12108, "synset": "warplane.n.01", "name": "warplane"}, - {"id": 12109, "synset": "war_room.n.01", "name": "war_room"}, - {"id": 12110, "synset": "warship.n.01", "name": "warship"}, - {"id": 12111, "synset": "wash.n.01", "name": "wash"}, - {"id": 12112, "synset": "wash-and-wear.n.01", "name": "wash-and-wear"}, - {"id": 12113, "synset": "washbasin.n.02", "name": "washbasin"}, - {"id": 12114, "synset": "washboard.n.02", "name": "washboard"}, - {"id": 12115, "synset": "washboard.n.01", "name": "washboard"}, - {"id": 12116, "synset": "washer.n.02", "name": "washer"}, - {"id": 12117, "synset": "washhouse.n.01", "name": "washhouse"}, - {"id": 12118, "synset": "washroom.n.01", "name": "washroom"}, - {"id": 12119, "synset": "washstand.n.01", "name": "washstand"}, - {"id": 12120, "synset": "washtub.n.01", "name": "washtub"}, - {"id": 12121, "synset": "wastepaper_basket.n.01", "name": "wastepaper_basket"}, - {"id": 12122, "synset": "watch_cap.n.01", "name": "watch_cap"}, - {"id": 12123, "synset": "watch_case.n.01", "name": "watch_case"}, - {"id": 12124, "synset": "watch_glass.n.01", "name": "watch_glass"}, - {"id": 12125, "synset": "watchtower.n.01", "name": "watchtower"}, - {"id": 12126, "synset": "water-base_paint.n.01", "name": "water-base_paint"}, - {"id": 12127, "synset": "water_bed.n.01", "name": "water_bed"}, - {"id": 12128, "synset": "water_butt.n.01", "name": "water_butt"}, - {"id": 12129, "synset": "water_cart.n.01", "name": "water_cart"}, - {"id": 12130, "synset": "water_chute.n.01", "name": "water_chute"}, - {"id": 12131, "synset": "water_closet.n.01", "name": "water_closet"}, - {"id": 12132, "synset": "watercolor.n.02", "name": "watercolor"}, - {"id": 12133, "synset": "water-cooled_reactor.n.01", "name": "water-cooled_reactor"}, - {"id": 12134, "synset": "water_filter.n.01", "name": "water_filter"}, - {"id": 12135, "synset": "water_gauge.n.01", "name": "water_gauge"}, - {"id": 12136, "synset": "water_glass.n.02", "name": "water_glass"}, - {"id": 12137, "synset": "water_hazard.n.01", "name": "water_hazard"}, - {"id": 12138, "synset": "watering_cart.n.01", "name": "watering_cart"}, - {"id": 12139, "synset": "water_jacket.n.01", "name": "water_jacket"}, - {"id": 12140, "synset": "water_jump.n.01", "name": "water_jump"}, - {"id": 12141, "synset": "water_level.n.04", "name": "water_level"}, - {"id": 12142, "synset": "water_meter.n.01", "name": "water_meter"}, - {"id": 12143, "synset": "water_mill.n.01", "name": "water_mill"}, - {"id": 12144, "synset": "waterproof.n.01", "name": "waterproof"}, - {"id": 12145, "synset": "waterproofing.n.02", "name": "waterproofing"}, - {"id": 12146, "synset": "water_pump.n.01", "name": "water_pump"}, - {"id": 12147, "synset": "waterspout.n.03", "name": "waterspout"}, - {"id": 12148, "synset": "water_wagon.n.01", "name": "water_wagon"}, - {"id": 12149, "synset": "waterwheel.n.02", "name": "waterwheel"}, - {"id": 12150, "synset": "waterwheel.n.01", "name": "waterwheel"}, - {"id": 12151, "synset": "water_wings.n.01", "name": "water_wings"}, - {"id": 12152, "synset": "waterworks.n.02", "name": "waterworks"}, - {"id": 12153, "synset": "wattmeter.n.01", "name": "wattmeter"}, - {"id": 12154, "synset": "waxwork.n.02", "name": "waxwork"}, - {"id": 12155, "synset": "ways.n.01", "name": "ways"}, - {"id": 12156, "synset": "weapon.n.01", "name": "weapon"}, - {"id": 12157, "synset": "weaponry.n.01", "name": "weaponry"}, - {"id": 12158, "synset": "weapons_carrier.n.01", "name": "weapons_carrier"}, - {"id": 12159, "synset": "weathercock.n.01", "name": "weathercock"}, - {"id": 12160, "synset": "weatherglass.n.01", "name": "weatherglass"}, - {"id": 12161, "synset": "weather_satellite.n.01", "name": "weather_satellite"}, - {"id": 12162, "synset": "weather_ship.n.01", "name": "weather_ship"}, - {"id": 12163, "synset": "web.n.02", "name": "web"}, - {"id": 12164, "synset": "web.n.06", "name": "web"}, - {"id": 12165, "synset": "webbing.n.03", "name": "webbing"}, - {"id": 12166, "synset": "wedge.n.06", "name": "wedge"}, - {"id": 12167, "synset": "wedge.n.05", "name": "wedge"}, - {"id": 12168, "synset": "wedgie.n.01", "name": "wedgie"}, - {"id": 12169, "synset": "wedgwood.n.02", "name": "Wedgwood"}, - {"id": 12170, "synset": "weeder.n.02", "name": "weeder"}, - {"id": 12171, "synset": "weeds.n.01", "name": "weeds"}, - {"id": 12172, "synset": "weekender.n.02", "name": "weekender"}, - {"id": 12173, "synset": "weighbridge.n.01", "name": "weighbridge"}, - {"id": 12174, "synset": "weight.n.02", "name": "weight"}, - {"id": 12175, "synset": "weir.n.01", "name": "weir"}, - {"id": 12176, "synset": "weir.n.02", "name": "weir"}, - {"id": 12177, "synset": "welcome_wagon.n.01", "name": "welcome_wagon"}, - {"id": 12178, "synset": "weld.n.03", "name": "weld"}, - {"id": 12179, "synset": "welder's_mask.n.01", "name": "welder's_mask"}, - {"id": 12180, "synset": "weldment.n.01", "name": "weldment"}, - {"id": 12181, "synset": "well.n.02", "name": "well"}, - {"id": 12182, "synset": "wellhead.n.02", "name": "wellhead"}, - {"id": 12183, "synset": "welt.n.02", "name": "welt"}, - {"id": 12184, "synset": "weston_cell.n.01", "name": "Weston_cell"}, - {"id": 12185, "synset": "wet_bar.n.01", "name": "wet_bar"}, - {"id": 12186, "synset": "wet-bulb_thermometer.n.01", "name": "wet-bulb_thermometer"}, - {"id": 12187, "synset": "wet_cell.n.01", "name": "wet_cell"}, - {"id": 12188, "synset": "wet_fly.n.01", "name": "wet_fly"}, - {"id": 12189, "synset": "whaleboat.n.01", "name": "whaleboat"}, - {"id": 12190, "synset": "whaler.n.02", "name": "whaler"}, - {"id": 12191, "synset": "whaling_gun.n.01", "name": "whaling_gun"}, - {"id": 12192, "synset": "wheel.n.04", "name": "wheel"}, - {"id": 12193, "synset": "wheel_and_axle.n.01", "name": "wheel_and_axle"}, - {"id": 12194, "synset": "wheeled_vehicle.n.01", "name": "wheeled_vehicle"}, - {"id": 12195, "synset": "wheelwork.n.01", "name": "wheelwork"}, - {"id": 12196, "synset": "wherry.n.02", "name": "wherry"}, - {"id": 12197, "synset": "wherry.n.01", "name": "wherry"}, - {"id": 12198, "synset": "whetstone.n.01", "name": "whetstone"}, - {"id": 12199, "synset": "whiffletree.n.01", "name": "whiffletree"}, - {"id": 12200, "synset": "whip.n.01", "name": "whip"}, - {"id": 12201, "synset": "whipcord.n.02", "name": "whipcord"}, - {"id": 12202, "synset": "whipping_post.n.01", "name": "whipping_post"}, - {"id": 12203, "synset": "whipstitch.n.01", "name": "whipstitch"}, - {"id": 12204, "synset": "whirler.n.02", "name": "whirler"}, - {"id": 12205, "synset": "whisk.n.02", "name": "whisk"}, - {"id": 12206, "synset": "whisk.n.01", "name": "whisk"}, - {"id": 12207, "synset": "whiskey_bottle.n.01", "name": "whiskey_bottle"}, - {"id": 12208, "synset": "whiskey_jug.n.01", "name": "whiskey_jug"}, - {"id": 12209, "synset": "whispering_gallery.n.01", "name": "whispering_gallery"}, - {"id": 12210, "synset": "whistle.n.04", "name": "whistle"}, - {"id": 12211, "synset": "white.n.11", "name": "white"}, - {"id": 12212, "synset": "white_goods.n.01", "name": "white_goods"}, - {"id": 12213, "synset": "whitewash.n.02", "name": "whitewash"}, - {"id": 12214, "synset": "whorehouse.n.01", "name": "whorehouse"}, - {"id": 12215, "synset": "wick.n.02", "name": "wick"}, - {"id": 12216, "synset": "wicker.n.02", "name": "wicker"}, - {"id": 12217, "synset": "wicker_basket.n.01", "name": "wicker_basket"}, - {"id": 12218, "synset": "wicket.n.02", "name": "wicket"}, - {"id": 12219, "synset": "wicket.n.01", "name": "wicket"}, - {"id": 12220, "synset": "wickiup.n.01", "name": "wickiup"}, - {"id": 12221, "synset": "wide-angle_lens.n.01", "name": "wide-angle_lens"}, - {"id": 12222, "synset": "widebody_aircraft.n.01", "name": "widebody_aircraft"}, - {"id": 12223, "synset": "wide_wale.n.01", "name": "wide_wale"}, - {"id": 12224, "synset": "widow's_walk.n.01", "name": "widow's_walk"}, - {"id": 12225, "synset": "wiffle.n.01", "name": "Wiffle"}, - {"id": 12226, "synset": "wigwam.n.01", "name": "wigwam"}, - {"id": 12227, "synset": "wilton.n.01", "name": "Wilton"}, - {"id": 12228, "synset": "wimple.n.01", "name": "wimple"}, - {"id": 12229, "synset": "wincey.n.01", "name": "wincey"}, - {"id": 12230, "synset": "winceyette.n.01", "name": "winceyette"}, - {"id": 12231, "synset": "winch.n.01", "name": "winch"}, - {"id": 12232, "synset": "winchester.n.02", "name": "Winchester"}, - {"id": 12233, "synset": "windbreak.n.01", "name": "windbreak"}, - {"id": 12234, "synset": "winder.n.02", "name": "winder"}, - {"id": 12235, "synset": "wind_instrument.n.01", "name": "wind_instrument"}, - {"id": 12236, "synset": "windjammer.n.01", "name": "windjammer"}, - {"id": 12237, "synset": "windmill.n.02", "name": "windmill"}, - {"id": 12238, "synset": "window.n.01", "name": "window"}, - {"id": 12239, "synset": "window.n.08", "name": "window"}, - {"id": 12240, "synset": "window_blind.n.01", "name": "window_blind"}, - {"id": 12241, "synset": "window_envelope.n.01", "name": "window_envelope"}, - {"id": 12242, "synset": "window_frame.n.01", "name": "window_frame"}, - {"id": 12243, "synset": "window_screen.n.01", "name": "window_screen"}, - {"id": 12244, "synset": "window_seat.n.01", "name": "window_seat"}, - {"id": 12245, "synset": "window_shade.n.01", "name": "window_shade"}, - {"id": 12246, "synset": "windowsill.n.01", "name": "windowsill"}, - {"id": 12247, "synset": "windshield.n.01", "name": "windshield"}, - {"id": 12248, "synset": "windsor_chair.n.01", "name": "Windsor_chair"}, - {"id": 12249, "synset": "windsor_knot.n.01", "name": "Windsor_knot"}, - {"id": 12250, "synset": "windsor_tie.n.01", "name": "Windsor_tie"}, - {"id": 12251, "synset": "wind_tee.n.01", "name": "wind_tee"}, - {"id": 12252, "synset": "wind_tunnel.n.01", "name": "wind_tunnel"}, - {"id": 12253, "synset": "wind_turbine.n.01", "name": "wind_turbine"}, - {"id": 12254, "synset": "wine_bar.n.01", "name": "wine_bar"}, - {"id": 12255, "synset": "wine_cask.n.01", "name": "wine_cask"}, - {"id": 12256, "synset": "winepress.n.01", "name": "winepress"}, - {"id": 12257, "synset": "winery.n.01", "name": "winery"}, - {"id": 12258, "synset": "wineskin.n.01", "name": "wineskin"}, - {"id": 12259, "synset": "wing.n.02", "name": "wing"}, - {"id": 12260, "synset": "wing_chair.n.01", "name": "wing_chair"}, - {"id": 12261, "synset": "wing_nut.n.02", "name": "wing_nut"}, - {"id": 12262, "synset": "wing_tip.n.02", "name": "wing_tip"}, - {"id": 12263, "synset": "wing_tip.n.01", "name": "wing_tip"}, - {"id": 12264, "synset": "wiper.n.02", "name": "wiper"}, - {"id": 12265, "synset": "wiper_motor.n.01", "name": "wiper_motor"}, - {"id": 12266, "synset": "wire.n.01", "name": "wire"}, - {"id": 12267, "synset": "wire.n.02", "name": "wire"}, - {"id": 12268, "synset": "wire_cloth.n.01", "name": "wire_cloth"}, - {"id": 12269, "synset": "wire_cutter.n.01", "name": "wire_cutter"}, - {"id": 12270, "synset": "wire_gauge.n.01", "name": "wire_gauge"}, - { - "id": 12271, - "synset": "wireless_local_area_network.n.01", - "name": "wireless_local_area_network", - }, - {"id": 12272, "synset": "wire_matrix_printer.n.01", "name": "wire_matrix_printer"}, - {"id": 12273, "synset": "wire_recorder.n.01", "name": "wire_recorder"}, - {"id": 12274, "synset": "wire_stripper.n.01", "name": "wire_stripper"}, - {"id": 12275, "synset": "wirework.n.01", "name": "wirework"}, - {"id": 12276, "synset": "wiring.n.01", "name": "wiring"}, - {"id": 12277, "synset": "wishing_cap.n.01", "name": "wishing_cap"}, - {"id": 12278, "synset": "witness_box.n.01", "name": "witness_box"}, - {"id": 12279, "synset": "woman's_clothing.n.01", "name": "woman's_clothing"}, - {"id": 12280, "synset": "wood.n.08", "name": "wood"}, - {"id": 12281, "synset": "woodcarving.n.01", "name": "woodcarving"}, - {"id": 12282, "synset": "wood_chisel.n.01", "name": "wood_chisel"}, - {"id": 12283, "synset": "woodenware.n.01", "name": "woodenware"}, - {"id": 12284, "synset": "woodscrew.n.01", "name": "woodscrew"}, - {"id": 12285, "synset": "woodshed.n.01", "name": "woodshed"}, - {"id": 12286, "synset": "wood_vise.n.01", "name": "wood_vise"}, - {"id": 12287, "synset": "woodwind.n.01", "name": "woodwind"}, - {"id": 12288, "synset": "woof.n.01", "name": "woof"}, - {"id": 12289, "synset": "woofer.n.01", "name": "woofer"}, - {"id": 12290, "synset": "wool.n.01", "name": "wool"}, - {"id": 12291, "synset": "workbasket.n.01", "name": "workbasket"}, - {"id": 12292, "synset": "workbench.n.01", "name": "workbench"}, - {"id": 12293, "synset": "work-clothing.n.01", "name": "work-clothing"}, - {"id": 12294, "synset": "workhouse.n.02", "name": "workhouse"}, - {"id": 12295, "synset": "workhouse.n.01", "name": "workhouse"}, - {"id": 12296, "synset": "workpiece.n.01", "name": "workpiece"}, - {"id": 12297, "synset": "workroom.n.01", "name": "workroom"}, - {"id": 12298, "synset": "works.n.04", "name": "works"}, - {"id": 12299, "synset": "work-shirt.n.01", "name": "work-shirt"}, - {"id": 12300, "synset": "workstation.n.01", "name": "workstation"}, - {"id": 12301, "synset": "worktable.n.01", "name": "worktable"}, - {"id": 12302, "synset": "workwear.n.01", "name": "workwear"}, - {"id": 12303, "synset": "world_wide_web.n.01", "name": "World_Wide_Web"}, - {"id": 12304, "synset": "worm_fence.n.01", "name": "worm_fence"}, - {"id": 12305, "synset": "worm_gear.n.01", "name": "worm_gear"}, - {"id": 12306, "synset": "worm_wheel.n.01", "name": "worm_wheel"}, - {"id": 12307, "synset": "worsted.n.01", "name": "worsted"}, - {"id": 12308, "synset": "worsted.n.02", "name": "worsted"}, - {"id": 12309, "synset": "wrap.n.01", "name": "wrap"}, - {"id": 12310, "synset": "wraparound.n.01", "name": "wraparound"}, - {"id": 12311, "synset": "wrapping.n.01", "name": "wrapping"}, - {"id": 12312, "synset": "wreck.n.04", "name": "wreck"}, - {"id": 12313, "synset": "wrestling_mat.n.01", "name": "wrestling_mat"}, - {"id": 12314, "synset": "wringer.n.01", "name": "wringer"}, - {"id": 12315, "synset": "wrist_pad.n.01", "name": "wrist_pad"}, - {"id": 12316, "synset": "wrist_pin.n.01", "name": "wrist_pin"}, - {"id": 12317, "synset": "wristwatch.n.01", "name": "wristwatch"}, - {"id": 12318, "synset": "writing_arm.n.01", "name": "writing_arm"}, - {"id": 12319, "synset": "writing_desk.n.02", "name": "writing_desk"}, - {"id": 12320, "synset": "writing_desk.n.01", "name": "writing_desk"}, - {"id": 12321, "synset": "writing_implement.n.01", "name": "writing_implement"}, - {"id": 12322, "synset": "xerographic_printer.n.01", "name": "xerographic_printer"}, - {"id": 12323, "synset": "xerox.n.02", "name": "Xerox"}, - {"id": 12324, "synset": "x-ray_film.n.01", "name": "X-ray_film"}, - {"id": 12325, "synset": "x-ray_machine.n.01", "name": "X-ray_machine"}, - {"id": 12326, "synset": "x-ray_tube.n.01", "name": "X-ray_tube"}, - {"id": 12327, "synset": "yacht_chair.n.01", "name": "yacht_chair"}, - {"id": 12328, "synset": "yagi.n.01", "name": "yagi"}, - {"id": 12329, "synset": "yard.n.09", "name": "yard"}, - {"id": 12330, "synset": "yard.n.08", "name": "yard"}, - {"id": 12331, "synset": "yardarm.n.01", "name": "yardarm"}, - {"id": 12332, "synset": "yard_marker.n.01", "name": "yard_marker"}, - {"id": 12333, "synset": "yardstick.n.02", "name": "yardstick"}, - {"id": 12334, "synset": "yarmulke.n.01", "name": "yarmulke"}, - {"id": 12335, "synset": "yashmak.n.01", "name": "yashmak"}, - {"id": 12336, "synset": "yataghan.n.01", "name": "yataghan"}, - {"id": 12337, "synset": "yawl.n.02", "name": "yawl"}, - {"id": 12338, "synset": "yawl.n.01", "name": "yawl"}, - {"id": 12339, "synset": "yoke.n.01", "name": "yoke"}, - {"id": 12340, "synset": "yoke.n.06", "name": "yoke"}, - {"id": 12341, "synset": "yurt.n.01", "name": "yurt"}, - {"id": 12342, "synset": "zamboni.n.01", "name": "Zamboni"}, - {"id": 12343, "synset": "zero.n.04", "name": "zero"}, - {"id": 12344, "synset": "ziggurat.n.01", "name": "ziggurat"}, - {"id": 12345, "synset": "zill.n.01", "name": "zill"}, - {"id": 12346, "synset": "zip_gun.n.01", "name": "zip_gun"}, - {"id": 12347, "synset": "zither.n.01", "name": "zither"}, - {"id": 12348, "synset": "zoot_suit.n.01", "name": "zoot_suit"}, - {"id": 12349, "synset": "shading.n.01", "name": "shading"}, - {"id": 12350, "synset": "grain.n.10", "name": "grain"}, - {"id": 12351, "synset": "wood_grain.n.01", "name": "wood_grain"}, - {"id": 12352, "synset": "graining.n.01", "name": "graining"}, - {"id": 12353, "synset": "marbleization.n.01", "name": "marbleization"}, - {"id": 12354, "synset": "light.n.07", "name": "light"}, - {"id": 12355, "synset": "aura.n.02", "name": "aura"}, - {"id": 12356, "synset": "sunniness.n.01", "name": "sunniness"}, - {"id": 12357, "synset": "glint.n.02", "name": "glint"}, - {"id": 12358, "synset": "opalescence.n.01", "name": "opalescence"}, - {"id": 12359, "synset": "polish.n.01", "name": "polish"}, - { - "id": 12360, - "synset": "primary_color_for_pigments.n.01", - "name": "primary_color_for_pigments", - }, - {"id": 12361, "synset": "primary_color_for_light.n.01", "name": "primary_color_for_light"}, - {"id": 12362, "synset": "colorlessness.n.01", "name": "colorlessness"}, - {"id": 12363, "synset": "mottle.n.01", "name": "mottle"}, - {"id": 12364, "synset": "achromia.n.01", "name": "achromia"}, - {"id": 12365, "synset": "shade.n.02", "name": "shade"}, - {"id": 12366, "synset": "chromatic_color.n.01", "name": "chromatic_color"}, - {"id": 12367, "synset": "black.n.01", "name": "black"}, - {"id": 12368, "synset": "coal_black.n.01", "name": "coal_black"}, - {"id": 12369, "synset": "alabaster.n.03", "name": "alabaster"}, - {"id": 12370, "synset": "bone.n.03", "name": "bone"}, - {"id": 12371, "synset": "gray.n.01", "name": "gray"}, - {"id": 12372, "synset": "ash_grey.n.01", "name": "ash_grey"}, - {"id": 12373, "synset": "charcoal.n.03", "name": "charcoal"}, - {"id": 12374, "synset": "sanguine.n.01", "name": "sanguine"}, - {"id": 12375, "synset": "turkey_red.n.01", "name": "Turkey_red"}, - {"id": 12376, "synset": "crimson.n.01", "name": "crimson"}, - {"id": 12377, "synset": "dark_red.n.01", "name": "dark_red"}, - {"id": 12378, "synset": "claret.n.01", "name": "claret"}, - {"id": 12379, "synset": "fuschia.n.01", "name": "fuschia"}, - {"id": 12380, "synset": "maroon.n.02", "name": "maroon"}, - {"id": 12381, "synset": "orange.n.02", "name": "orange"}, - {"id": 12382, "synset": "reddish_orange.n.01", "name": "reddish_orange"}, - {"id": 12383, "synset": "yellow.n.01", "name": "yellow"}, - {"id": 12384, "synset": "gamboge.n.02", "name": "gamboge"}, - {"id": 12385, "synset": "pale_yellow.n.01", "name": "pale_yellow"}, - {"id": 12386, "synset": "green.n.01", "name": "green"}, - {"id": 12387, "synset": "greenishness.n.01", "name": "greenishness"}, - {"id": 12388, "synset": "sea_green.n.01", "name": "sea_green"}, - {"id": 12389, "synset": "sage_green.n.01", "name": "sage_green"}, - {"id": 12390, "synset": "bottle_green.n.01", "name": "bottle_green"}, - {"id": 12391, "synset": "emerald.n.03", "name": "emerald"}, - {"id": 12392, "synset": "olive_green.n.01", "name": "olive_green"}, - {"id": 12393, "synset": "jade_green.n.01", "name": "jade_green"}, - {"id": 12394, "synset": "blue.n.01", "name": "blue"}, - {"id": 12395, "synset": "azure.n.01", "name": "azure"}, - {"id": 12396, "synset": "steel_blue.n.01", "name": "steel_blue"}, - {"id": 12397, "synset": "greenish_blue.n.01", "name": "greenish_blue"}, - {"id": 12398, "synset": "purplish_blue.n.01", "name": "purplish_blue"}, - {"id": 12399, "synset": "purple.n.01", "name": "purple"}, - {"id": 12400, "synset": "tyrian_purple.n.02", "name": "Tyrian_purple"}, - {"id": 12401, "synset": "indigo.n.03", "name": "indigo"}, - {"id": 12402, "synset": "lavender.n.02", "name": "lavender"}, - {"id": 12403, "synset": "reddish_purple.n.01", "name": "reddish_purple"}, - {"id": 12404, "synset": "pink.n.01", "name": "pink"}, - {"id": 12405, "synset": "carnation.n.02", "name": "carnation"}, - {"id": 12406, "synset": "rose.n.03", "name": "rose"}, - {"id": 12407, "synset": "chestnut.n.04", "name": "chestnut"}, - {"id": 12408, "synset": "chocolate.n.03", "name": "chocolate"}, - {"id": 12409, "synset": "light_brown.n.01", "name": "light_brown"}, - {"id": 12410, "synset": "tan.n.02", "name": "tan"}, - {"id": 12411, "synset": "beige.n.01", "name": "beige"}, - {"id": 12412, "synset": "reddish_brown.n.01", "name": "reddish_brown"}, - {"id": 12413, "synset": "brick_red.n.01", "name": "brick_red"}, - {"id": 12414, "synset": "copper.n.04", "name": "copper"}, - {"id": 12415, "synset": "indian_red.n.03", "name": "Indian_red"}, - {"id": 12416, "synset": "puce.n.01", "name": "puce"}, - {"id": 12417, "synset": "olive.n.05", "name": "olive"}, - {"id": 12418, "synset": "ultramarine.n.02", "name": "ultramarine"}, - {"id": 12419, "synset": "complementary_color.n.01", "name": "complementary_color"}, - {"id": 12420, "synset": "pigmentation.n.02", "name": "pigmentation"}, - {"id": 12421, "synset": "complexion.n.01", "name": "complexion"}, - {"id": 12422, "synset": "ruddiness.n.01", "name": "ruddiness"}, - {"id": 12423, "synset": "nonsolid_color.n.01", "name": "nonsolid_color"}, - {"id": 12424, "synset": "aposematic_coloration.n.01", "name": "aposematic_coloration"}, - {"id": 12425, "synset": "cryptic_coloration.n.01", "name": "cryptic_coloration"}, - {"id": 12426, "synset": "ring.n.01", "name": "ring"}, - {"id": 12427, "synset": "center_of_curvature.n.01", "name": "center_of_curvature"}, - {"id": 12428, "synset": "cadaver.n.01", "name": "cadaver"}, - {"id": 12429, "synset": "mandibular_notch.n.01", "name": "mandibular_notch"}, - {"id": 12430, "synset": "rib.n.05", "name": "rib"}, - {"id": 12431, "synset": "skin.n.01", "name": "skin"}, - {"id": 12432, "synset": "skin_graft.n.01", "name": "skin_graft"}, - {"id": 12433, "synset": "epidermal_cell.n.01", "name": "epidermal_cell"}, - {"id": 12434, "synset": "melanocyte.n.01", "name": "melanocyte"}, - {"id": 12435, "synset": "prickle_cell.n.01", "name": "prickle_cell"}, - {"id": 12436, "synset": "columnar_cell.n.01", "name": "columnar_cell"}, - {"id": 12437, "synset": "spongioblast.n.01", "name": "spongioblast"}, - {"id": 12438, "synset": "squamous_cell.n.01", "name": "squamous_cell"}, - {"id": 12439, "synset": "amyloid_plaque.n.01", "name": "amyloid_plaque"}, - {"id": 12440, "synset": "dental_plaque.n.01", "name": "dental_plaque"}, - {"id": 12441, "synset": "macule.n.01", "name": "macule"}, - {"id": 12442, "synset": "freckle.n.01", "name": "freckle"}, - {"id": 12443, "synset": "bouffant.n.01", "name": "bouffant"}, - {"id": 12444, "synset": "sausage_curl.n.01", "name": "sausage_curl"}, - {"id": 12445, "synset": "forelock.n.01", "name": "forelock"}, - {"id": 12446, "synset": "spit_curl.n.01", "name": "spit_curl"}, - {"id": 12447, "synset": "pigtail.n.01", "name": "pigtail"}, - {"id": 12448, "synset": "pageboy.n.02", "name": "pageboy"}, - {"id": 12449, "synset": "pompadour.n.02", "name": "pompadour"}, - {"id": 12450, "synset": "thatch.n.01", "name": "thatch"}, - {"id": 12451, "synset": "soup-strainer.n.01", "name": "soup-strainer"}, - {"id": 12452, "synset": "mustachio.n.01", "name": "mustachio"}, - {"id": 12453, "synset": "walrus_mustache.n.01", "name": "walrus_mustache"}, - {"id": 12454, "synset": "stubble.n.02", "name": "stubble"}, - {"id": 12455, "synset": "vandyke_beard.n.01", "name": "vandyke_beard"}, - {"id": 12456, "synset": "soul_patch.n.01", "name": "soul_patch"}, - {"id": 12457, "synset": "esophageal_smear.n.01", "name": "esophageal_smear"}, - {"id": 12458, "synset": "paraduodenal_smear.n.01", "name": "paraduodenal_smear"}, - {"id": 12459, "synset": "specimen.n.02", "name": "specimen"}, - {"id": 12460, "synset": "punctum.n.01", "name": "punctum"}, - {"id": 12461, "synset": "glenoid_fossa.n.02", "name": "glenoid_fossa"}, - {"id": 12462, "synset": "diastema.n.01", "name": "diastema"}, - {"id": 12463, "synset": "marrow.n.01", "name": "marrow"}, - {"id": 12464, "synset": "mouth.n.01", "name": "mouth"}, - {"id": 12465, "synset": "canthus.n.01", "name": "canthus"}, - {"id": 12466, "synset": "milk.n.02", "name": "milk"}, - {"id": 12467, "synset": "mother's_milk.n.01", "name": "mother's_milk"}, - {"id": 12468, "synset": "colostrum.n.01", "name": "colostrum"}, - {"id": 12469, "synset": "vein.n.01", "name": "vein"}, - {"id": 12470, "synset": "ganglion_cell.n.01", "name": "ganglion_cell"}, - {"id": 12471, "synset": "x_chromosome.n.01", "name": "X_chromosome"}, - {"id": 12472, "synset": "embryonic_cell.n.01", "name": "embryonic_cell"}, - {"id": 12473, "synset": "myeloblast.n.01", "name": "myeloblast"}, - {"id": 12474, "synset": "sideroblast.n.01", "name": "sideroblast"}, - {"id": 12475, "synset": "osteocyte.n.01", "name": "osteocyte"}, - {"id": 12476, "synset": "megalocyte.n.01", "name": "megalocyte"}, - {"id": 12477, "synset": "leukocyte.n.01", "name": "leukocyte"}, - {"id": 12478, "synset": "histiocyte.n.01", "name": "histiocyte"}, - {"id": 12479, "synset": "fixed_phagocyte.n.01", "name": "fixed_phagocyte"}, - {"id": 12480, "synset": "lymphocyte.n.01", "name": "lymphocyte"}, - {"id": 12481, "synset": "monoblast.n.01", "name": "monoblast"}, - {"id": 12482, "synset": "neutrophil.n.01", "name": "neutrophil"}, - {"id": 12483, "synset": "microphage.n.01", "name": "microphage"}, - {"id": 12484, "synset": "sickle_cell.n.01", "name": "sickle_cell"}, - {"id": 12485, "synset": "siderocyte.n.01", "name": "siderocyte"}, - {"id": 12486, "synset": "spherocyte.n.01", "name": "spherocyte"}, - {"id": 12487, "synset": "ootid.n.01", "name": "ootid"}, - {"id": 12488, "synset": "oocyte.n.01", "name": "oocyte"}, - {"id": 12489, "synset": "spermatid.n.01", "name": "spermatid"}, - {"id": 12490, "synset": "leydig_cell.n.01", "name": "Leydig_cell"}, - {"id": 12491, "synset": "striated_muscle_cell.n.01", "name": "striated_muscle_cell"}, - {"id": 12492, "synset": "smooth_muscle_cell.n.01", "name": "smooth_muscle_cell"}, - {"id": 12493, "synset": "ranvier's_nodes.n.01", "name": "Ranvier's_nodes"}, - {"id": 12494, "synset": "neuroglia.n.01", "name": "neuroglia"}, - {"id": 12495, "synset": "astrocyte.n.01", "name": "astrocyte"}, - {"id": 12496, "synset": "protoplasmic_astrocyte.n.01", "name": "protoplasmic_astrocyte"}, - {"id": 12497, "synset": "oligodendrocyte.n.01", "name": "oligodendrocyte"}, - {"id": 12498, "synset": "proprioceptor.n.01", "name": "proprioceptor"}, - {"id": 12499, "synset": "dendrite.n.01", "name": "dendrite"}, - {"id": 12500, "synset": "sensory_fiber.n.01", "name": "sensory_fiber"}, - {"id": 12501, "synset": "subarachnoid_space.n.01", "name": "subarachnoid_space"}, - {"id": 12502, "synset": "cerebral_cortex.n.01", "name": "cerebral_cortex"}, - {"id": 12503, "synset": "renal_cortex.n.01", "name": "renal_cortex"}, - {"id": 12504, "synset": "prepuce.n.02", "name": "prepuce"}, - {"id": 12505, "synset": "head.n.01", "name": "head"}, - {"id": 12506, "synset": "scalp.n.01", "name": "scalp"}, - {"id": 12507, "synset": "frontal_eminence.n.01", "name": "frontal_eminence"}, - {"id": 12508, "synset": "suture.n.01", "name": "suture"}, - {"id": 12509, "synset": "foramen_magnum.n.01", "name": "foramen_magnum"}, - {"id": 12510, "synset": "esophagogastric_junction.n.01", "name": "esophagogastric_junction"}, - {"id": 12511, "synset": "heel.n.02", "name": "heel"}, - {"id": 12512, "synset": "cuticle.n.01", "name": "cuticle"}, - {"id": 12513, "synset": "hangnail.n.01", "name": "hangnail"}, - {"id": 12514, "synset": "exoskeleton.n.01", "name": "exoskeleton"}, - {"id": 12515, "synset": "abdominal_wall.n.01", "name": "abdominal_wall"}, - {"id": 12516, "synset": "lemon.n.04", "name": "lemon"}, - {"id": 12517, "synset": "coordinate_axis.n.01", "name": "coordinate_axis"}, - {"id": 12518, "synset": "landscape.n.04", "name": "landscape"}, - {"id": 12519, "synset": "medium.n.01", "name": "medium"}, - {"id": 12520, "synset": "vehicle.n.02", "name": "vehicle"}, - {"id": 12521, "synset": "paper.n.04", "name": "paper"}, - {"id": 12522, "synset": "channel.n.01", "name": "channel"}, - {"id": 12523, "synset": "film.n.02", "name": "film"}, - {"id": 12524, "synset": "silver_screen.n.01", "name": "silver_screen"}, - {"id": 12525, "synset": "free_press.n.01", "name": "free_press"}, - {"id": 12526, "synset": "press.n.02", "name": "press"}, - {"id": 12527, "synset": "print_media.n.01", "name": "print_media"}, - {"id": 12528, "synset": "storage_medium.n.01", "name": "storage_medium"}, - {"id": 12529, "synset": "magnetic_storage_medium.n.01", "name": "magnetic_storage_medium"}, - {"id": 12530, "synset": "journalism.n.01", "name": "journalism"}, - {"id": 12531, "synset": "fleet_street.n.02", "name": "Fleet_Street"}, - {"id": 12532, "synset": "photojournalism.n.01", "name": "photojournalism"}, - {"id": 12533, "synset": "news_photography.n.01", "name": "news_photography"}, - {"id": 12534, "synset": "rotogravure.n.02", "name": "rotogravure"}, - {"id": 12535, "synset": "daily.n.01", "name": "daily"}, - {"id": 12536, "synset": "gazette.n.01", "name": "gazette"}, - {"id": 12537, "synset": "school_newspaper.n.01", "name": "school_newspaper"}, - {"id": 12538, "synset": "tabloid.n.02", "name": "tabloid"}, - {"id": 12539, "synset": "yellow_journalism.n.01", "name": "yellow_journalism"}, - {"id": 12540, "synset": "telecommunication.n.01", "name": "telecommunication"}, - {"id": 12541, "synset": "telephone.n.02", "name": "telephone"}, - {"id": 12542, "synset": "voice_mail.n.01", "name": "voice_mail"}, - {"id": 12543, "synset": "call.n.01", "name": "call"}, - {"id": 12544, "synset": "call-back.n.01", "name": "call-back"}, - {"id": 12545, "synset": "collect_call.n.01", "name": "collect_call"}, - {"id": 12546, "synset": "call_forwarding.n.01", "name": "call_forwarding"}, - {"id": 12547, "synset": "call-in.n.01", "name": "call-in"}, - {"id": 12548, "synset": "call_waiting.n.01", "name": "call_waiting"}, - {"id": 12549, "synset": "crank_call.n.01", "name": "crank_call"}, - {"id": 12550, "synset": "local_call.n.01", "name": "local_call"}, - {"id": 12551, "synset": "long_distance.n.01", "name": "long_distance"}, - {"id": 12552, "synset": "toll_call.n.01", "name": "toll_call"}, - {"id": 12553, "synset": "wake-up_call.n.02", "name": "wake-up_call"}, - {"id": 12554, "synset": "three-way_calling.n.01", "name": "three-way_calling"}, - {"id": 12555, "synset": "telegraphy.n.01", "name": "telegraphy"}, - {"id": 12556, "synset": "cable.n.01", "name": "cable"}, - {"id": 12557, "synset": "wireless.n.02", "name": "wireless"}, - {"id": 12558, "synset": "radiotelegraph.n.01", "name": "radiotelegraph"}, - {"id": 12559, "synset": "radiotelephone.n.01", "name": "radiotelephone"}, - {"id": 12560, "synset": "broadcasting.n.02", "name": "broadcasting"}, - {"id": 12561, "synset": "rediffusion.n.01", "name": "Rediffusion"}, - {"id": 12562, "synset": "multiplex.n.01", "name": "multiplex"}, - {"id": 12563, "synset": "radio.n.01", "name": "radio"}, - {"id": 12564, "synset": "television.n.01", "name": "television"}, - {"id": 12565, "synset": "cable_television.n.01", "name": "cable_television"}, - { - "id": 12566, - "synset": "high-definition_television.n.01", - "name": "high-definition_television", - }, - {"id": 12567, "synset": "reception.n.03", "name": "reception"}, - {"id": 12568, "synset": "signal_detection.n.01", "name": "signal_detection"}, - {"id": 12569, "synset": "hakham.n.01", "name": "Hakham"}, - {"id": 12570, "synset": "web_site.n.01", "name": "web_site"}, - {"id": 12571, "synset": "chat_room.n.01", "name": "chat_room"}, - {"id": 12572, "synset": "portal_site.n.01", "name": "portal_site"}, - {"id": 12573, "synset": "jotter.n.01", "name": "jotter"}, - {"id": 12574, "synset": "breviary.n.01", "name": "breviary"}, - {"id": 12575, "synset": "wordbook.n.01", "name": "wordbook"}, - {"id": 12576, "synset": "desk_dictionary.n.01", "name": "desk_dictionary"}, - {"id": 12577, "synset": "reckoner.n.02", "name": "reckoner"}, - {"id": 12578, "synset": "document.n.01", "name": "document"}, - {"id": 12579, "synset": "album.n.01", "name": "album"}, - {"id": 12580, "synset": "concept_album.n.01", "name": "concept_album"}, - {"id": 12581, "synset": "rock_opera.n.01", "name": "rock_opera"}, - {"id": 12582, "synset": "tribute_album.n.01", "name": "tribute_album"}, - {"id": 12583, "synset": "magazine.n.01", "name": "magazine"}, - {"id": 12584, "synset": "colour_supplement.n.01", "name": "colour_supplement"}, - {"id": 12585, "synset": "news_magazine.n.01", "name": "news_magazine"}, - {"id": 12586, "synset": "pulp.n.04", "name": "pulp"}, - {"id": 12587, "synset": "slick.n.02", "name": "slick"}, - {"id": 12588, "synset": "trade_magazine.n.01", "name": "trade_magazine"}, - {"id": 12589, "synset": "movie.n.01", "name": "movie"}, - {"id": 12590, "synset": "outtake.n.01", "name": "outtake"}, - {"id": 12591, "synset": "shoot-'em-up.n.01", "name": "shoot-'em-up"}, - {"id": 12592, "synset": "spaghetti_western.n.01", "name": "spaghetti_Western"}, - {"id": 12593, "synset": "encyclical.n.01", "name": "encyclical"}, - {"id": 12594, "synset": "crossword_puzzle.n.01", "name": "crossword_puzzle"}, - {"id": 12595, "synset": "sign.n.02", "name": "sign"}, - {"id": 12596, "synset": "swastika.n.01", "name": "swastika"}, - {"id": 12597, "synset": "concert.n.01", "name": "concert"}, - {"id": 12598, "synset": "artwork.n.01", "name": "artwork"}, - {"id": 12599, "synset": "lobe.n.03", "name": "lobe"}, - {"id": 12600, "synset": "book_jacket.n.01", "name": "book_jacket"}, - {"id": 12601, "synset": "cairn.n.01", "name": "cairn"}, - {"id": 12602, "synset": "three-day_event.n.01", "name": "three-day_event"}, - {"id": 12603, "synset": "comfort_food.n.01", "name": "comfort_food"}, - {"id": 12604, "synset": "comestible.n.01", "name": "comestible"}, - {"id": 12605, "synset": "tuck.n.01", "name": "tuck"}, - {"id": 12606, "synset": "course.n.07", "name": "course"}, - {"id": 12607, "synset": "dainty.n.01", "name": "dainty"}, - {"id": 12608, "synset": "dish.n.02", "name": "dish"}, - {"id": 12609, "synset": "fast_food.n.01", "name": "fast_food"}, - {"id": 12610, "synset": "finger_food.n.01", "name": "finger_food"}, - {"id": 12611, "synset": "ingesta.n.01", "name": "ingesta"}, - {"id": 12612, "synset": "kosher.n.01", "name": "kosher"}, - {"id": 12613, "synset": "fare.n.04", "name": "fare"}, - {"id": 12614, "synset": "diet.n.03", "name": "diet"}, - {"id": 12615, "synset": "diet.n.01", "name": "diet"}, - {"id": 12616, "synset": "dietary.n.01", "name": "dietary"}, - {"id": 12617, "synset": "balanced_diet.n.01", "name": "balanced_diet"}, - {"id": 12618, "synset": "bland_diet.n.01", "name": "bland_diet"}, - {"id": 12619, "synset": "clear_liquid_diet.n.01", "name": "clear_liquid_diet"}, - {"id": 12620, "synset": "diabetic_diet.n.01", "name": "diabetic_diet"}, - {"id": 12621, "synset": "dietary_supplement.n.01", "name": "dietary_supplement"}, - {"id": 12622, "synset": "carbohydrate_loading.n.01", "name": "carbohydrate_loading"}, - {"id": 12623, "synset": "fad_diet.n.01", "name": "fad_diet"}, - {"id": 12624, "synset": "gluten-free_diet.n.01", "name": "gluten-free_diet"}, - {"id": 12625, "synset": "high-protein_diet.n.01", "name": "high-protein_diet"}, - {"id": 12626, "synset": "high-vitamin_diet.n.01", "name": "high-vitamin_diet"}, - {"id": 12627, "synset": "light_diet.n.01", "name": "light_diet"}, - {"id": 12628, "synset": "liquid_diet.n.01", "name": "liquid_diet"}, - {"id": 12629, "synset": "low-calorie_diet.n.01", "name": "low-calorie_diet"}, - {"id": 12630, "synset": "low-fat_diet.n.01", "name": "low-fat_diet"}, - {"id": 12631, "synset": "low-sodium_diet.n.01", "name": "low-sodium_diet"}, - {"id": 12632, "synset": "macrobiotic_diet.n.01", "name": "macrobiotic_diet"}, - {"id": 12633, "synset": "reducing_diet.n.01", "name": "reducing_diet"}, - {"id": 12634, "synset": "soft_diet.n.01", "name": "soft_diet"}, - {"id": 12635, "synset": "vegetarianism.n.01", "name": "vegetarianism"}, - {"id": 12636, "synset": "menu.n.02", "name": "menu"}, - {"id": 12637, "synset": "chow.n.02", "name": "chow"}, - {"id": 12638, "synset": "board.n.04", "name": "board"}, - {"id": 12639, "synset": "mess.n.04", "name": "mess"}, - {"id": 12640, "synset": "ration.n.01", "name": "ration"}, - {"id": 12641, "synset": "field_ration.n.01", "name": "field_ration"}, - {"id": 12642, "synset": "k_ration.n.01", "name": "K_ration"}, - {"id": 12643, "synset": "c-ration.n.01", "name": "C-ration"}, - {"id": 12644, "synset": "foodstuff.n.02", "name": "foodstuff"}, - {"id": 12645, "synset": "starches.n.01", "name": "starches"}, - {"id": 12646, "synset": "breadstuff.n.02", "name": "breadstuff"}, - {"id": 12647, "synset": "coloring.n.01", "name": "coloring"}, - {"id": 12648, "synset": "concentrate.n.02", "name": "concentrate"}, - {"id": 12649, "synset": "tomato_concentrate.n.01", "name": "tomato_concentrate"}, - {"id": 12650, "synset": "meal.n.03", "name": "meal"}, - {"id": 12651, "synset": "kibble.n.01", "name": "kibble"}, - {"id": 12652, "synset": "farina.n.01", "name": "farina"}, - {"id": 12653, "synset": "matzo_meal.n.01", "name": "matzo_meal"}, - {"id": 12654, "synset": "oatmeal.n.02", "name": "oatmeal"}, - {"id": 12655, "synset": "pea_flour.n.01", "name": "pea_flour"}, - {"id": 12656, "synset": "roughage.n.01", "name": "roughage"}, - {"id": 12657, "synset": "bran.n.02", "name": "bran"}, - {"id": 12658, "synset": "flour.n.01", "name": "flour"}, - {"id": 12659, "synset": "plain_flour.n.01", "name": "plain_flour"}, - {"id": 12660, "synset": "wheat_flour.n.01", "name": "wheat_flour"}, - {"id": 12661, "synset": "whole_wheat_flour.n.01", "name": "whole_wheat_flour"}, - {"id": 12662, "synset": "soybean_meal.n.01", "name": "soybean_meal"}, - {"id": 12663, "synset": "semolina.n.01", "name": "semolina"}, - {"id": 12664, "synset": "corn_gluten_feed.n.01", "name": "corn_gluten_feed"}, - {"id": 12665, "synset": "nutriment.n.01", "name": "nutriment"}, - {"id": 12666, "synset": "commissariat.n.01", "name": "commissariat"}, - {"id": 12667, "synset": "larder.n.01", "name": "larder"}, - {"id": 12668, "synset": "frozen_food.n.01", "name": "frozen_food"}, - {"id": 12669, "synset": "canned_food.n.01", "name": "canned_food"}, - {"id": 12670, "synset": "canned_meat.n.01", "name": "canned_meat"}, - {"id": 12671, "synset": "spam.n.01", "name": "Spam"}, - {"id": 12672, "synset": "dehydrated_food.n.01", "name": "dehydrated_food"}, - {"id": 12673, "synset": "square_meal.n.01", "name": "square_meal"}, - {"id": 12674, "synset": "meal.n.01", "name": "meal"}, - {"id": 12675, "synset": "potluck.n.01", "name": "potluck"}, - {"id": 12676, "synset": "refection.n.01", "name": "refection"}, - {"id": 12677, "synset": "refreshment.n.01", "name": "refreshment"}, - {"id": 12678, "synset": "breakfast.n.01", "name": "breakfast"}, - {"id": 12679, "synset": "continental_breakfast.n.01", "name": "continental_breakfast"}, - {"id": 12680, "synset": "brunch.n.01", "name": "brunch"}, - {"id": 12681, "synset": "lunch.n.01", "name": "lunch"}, - {"id": 12682, "synset": "business_lunch.n.01", "name": "business_lunch"}, - {"id": 12683, "synset": "high_tea.n.01", "name": "high_tea"}, - {"id": 12684, "synset": "tea.n.02", "name": "tea"}, - {"id": 12685, "synset": "dinner.n.01", "name": "dinner"}, - {"id": 12686, "synset": "supper.n.01", "name": "supper"}, - {"id": 12687, "synset": "buffet.n.02", "name": "buffet"}, - {"id": 12688, "synset": "picnic.n.03", "name": "picnic"}, - {"id": 12689, "synset": "cookout.n.01", "name": "cookout"}, - {"id": 12690, "synset": "barbecue.n.02", "name": "barbecue"}, - {"id": 12691, "synset": "clambake.n.01", "name": "clambake"}, - {"id": 12692, "synset": "fish_fry.n.01", "name": "fish_fry"}, - {"id": 12693, "synset": "bite.n.04", "name": "bite"}, - {"id": 12694, "synset": "nosh.n.01", "name": "nosh"}, - {"id": 12695, "synset": "nosh-up.n.01", "name": "nosh-up"}, - {"id": 12696, "synset": "ploughman's_lunch.n.01", "name": "ploughman's_lunch"}, - {"id": 12697, "synset": "coffee_break.n.01", "name": "coffee_break"}, - {"id": 12698, "synset": "banquet.n.02", "name": "banquet"}, - {"id": 12699, "synset": "entree.n.01", "name": "entree"}, - {"id": 12700, "synset": "piece_de_resistance.n.02", "name": "piece_de_resistance"}, - {"id": 12701, "synset": "plate.n.08", "name": "plate"}, - {"id": 12702, "synset": "adobo.n.01", "name": "adobo"}, - {"id": 12703, "synset": "side_dish.n.01", "name": "side_dish"}, - {"id": 12704, "synset": "special.n.02", "name": "special"}, - {"id": 12705, "synset": "chicken_casserole.n.01", "name": "chicken_casserole"}, - {"id": 12706, "synset": "chicken_cacciatore.n.01", "name": "chicken_cacciatore"}, - {"id": 12707, "synset": "antipasto.n.01", "name": "antipasto"}, - {"id": 12708, "synset": "appetizer.n.01", "name": "appetizer"}, - {"id": 12709, "synset": "canape.n.01", "name": "canape"}, - {"id": 12710, "synset": "cocktail.n.02", "name": "cocktail"}, - {"id": 12711, "synset": "fruit_cocktail.n.01", "name": "fruit_cocktail"}, - {"id": 12712, "synset": "crab_cocktail.n.01", "name": "crab_cocktail"}, - {"id": 12713, "synset": "shrimp_cocktail.n.01", "name": "shrimp_cocktail"}, - {"id": 12714, "synset": "hors_d'oeuvre.n.01", "name": "hors_d'oeuvre"}, - {"id": 12715, "synset": "relish.n.02", "name": "relish"}, - {"id": 12716, "synset": "dip.n.04", "name": "dip"}, - {"id": 12717, "synset": "bean_dip.n.01", "name": "bean_dip"}, - {"id": 12718, "synset": "cheese_dip.n.01", "name": "cheese_dip"}, - {"id": 12719, "synset": "clam_dip.n.01", "name": "clam_dip"}, - {"id": 12720, "synset": "guacamole.n.01", "name": "guacamole"}, - {"id": 12721, "synset": "soup_du_jour.n.01", "name": "soup_du_jour"}, - {"id": 12722, "synset": "alphabet_soup.n.02", "name": "alphabet_soup"}, - {"id": 12723, "synset": "consomme.n.01", "name": "consomme"}, - {"id": 12724, "synset": "madrilene.n.01", "name": "madrilene"}, - {"id": 12725, "synset": "bisque.n.01", "name": "bisque"}, - {"id": 12726, "synset": "borsch.n.01", "name": "borsch"}, - {"id": 12727, "synset": "broth.n.02", "name": "broth"}, - {"id": 12728, "synset": "barley_water.n.01", "name": "barley_water"}, - {"id": 12729, "synset": "bouillon.n.01", "name": "bouillon"}, - {"id": 12730, "synset": "beef_broth.n.01", "name": "beef_broth"}, - {"id": 12731, "synset": "chicken_broth.n.01", "name": "chicken_broth"}, - {"id": 12732, "synset": "broth.n.01", "name": "broth"}, - {"id": 12733, "synset": "stock_cube.n.01", "name": "stock_cube"}, - {"id": 12734, "synset": "chicken_soup.n.01", "name": "chicken_soup"}, - {"id": 12735, "synset": "cock-a-leekie.n.01", "name": "cock-a-leekie"}, - {"id": 12736, "synset": "gazpacho.n.01", "name": "gazpacho"}, - {"id": 12737, "synset": "gumbo.n.04", "name": "gumbo"}, - {"id": 12738, "synset": "julienne.n.02", "name": "julienne"}, - {"id": 12739, "synset": "marmite.n.01", "name": "marmite"}, - {"id": 12740, "synset": "mock_turtle_soup.n.01", "name": "mock_turtle_soup"}, - {"id": 12741, "synset": "mulligatawny.n.01", "name": "mulligatawny"}, - {"id": 12742, "synset": "oxtail_soup.n.01", "name": "oxtail_soup"}, - {"id": 12743, "synset": "pea_soup.n.01", "name": "pea_soup"}, - {"id": 12744, "synset": "pepper_pot.n.01", "name": "pepper_pot"}, - {"id": 12745, "synset": "petite_marmite.n.01", "name": "petite_marmite"}, - {"id": 12746, "synset": "potage.n.01", "name": "potage"}, - {"id": 12747, "synset": "pottage.n.01", "name": "pottage"}, - {"id": 12748, "synset": "turtle_soup.n.01", "name": "turtle_soup"}, - {"id": 12749, "synset": "eggdrop_soup.n.01", "name": "eggdrop_soup"}, - {"id": 12750, "synset": "chowder.n.01", "name": "chowder"}, - {"id": 12751, "synset": "corn_chowder.n.01", "name": "corn_chowder"}, - {"id": 12752, "synset": "clam_chowder.n.01", "name": "clam_chowder"}, - {"id": 12753, "synset": "manhattan_clam_chowder.n.01", "name": "Manhattan_clam_chowder"}, - {"id": 12754, "synset": "new_england_clam_chowder.n.01", "name": "New_England_clam_chowder"}, - {"id": 12755, "synset": "fish_chowder.n.01", "name": "fish_chowder"}, - {"id": 12756, "synset": "won_ton.n.02", "name": "won_ton"}, - {"id": 12757, "synset": "split-pea_soup.n.01", "name": "split-pea_soup"}, - {"id": 12758, "synset": "green_pea_soup.n.01", "name": "green_pea_soup"}, - {"id": 12759, "synset": "lentil_soup.n.01", "name": "lentil_soup"}, - {"id": 12760, "synset": "scotch_broth.n.01", "name": "Scotch_broth"}, - {"id": 12761, "synset": "vichyssoise.n.01", "name": "vichyssoise"}, - {"id": 12762, "synset": "bigos.n.01", "name": "bigos"}, - {"id": 12763, "synset": "brunswick_stew.n.01", "name": "Brunswick_stew"}, - {"id": 12764, "synset": "burgoo.n.03", "name": "burgoo"}, - {"id": 12765, "synset": "burgoo.n.02", "name": "burgoo"}, - {"id": 12766, "synset": "olla_podrida.n.01", "name": "olla_podrida"}, - {"id": 12767, "synset": "mulligan_stew.n.01", "name": "mulligan_stew"}, - {"id": 12768, "synset": "purloo.n.01", "name": "purloo"}, - {"id": 12769, "synset": "goulash.n.01", "name": "goulash"}, - {"id": 12770, "synset": "hotchpotch.n.02", "name": "hotchpotch"}, - {"id": 12771, "synset": "hot_pot.n.01", "name": "hot_pot"}, - {"id": 12772, "synset": "beef_goulash.n.01", "name": "beef_goulash"}, - {"id": 12773, "synset": "pork-and-veal_goulash.n.01", "name": "pork-and-veal_goulash"}, - {"id": 12774, "synset": "porkholt.n.01", "name": "porkholt"}, - {"id": 12775, "synset": "irish_stew.n.01", "name": "Irish_stew"}, - {"id": 12776, "synset": "oyster_stew.n.01", "name": "oyster_stew"}, - {"id": 12777, "synset": "lobster_stew.n.01", "name": "lobster_stew"}, - {"id": 12778, "synset": "lobscouse.n.01", "name": "lobscouse"}, - {"id": 12779, "synset": "fish_stew.n.01", "name": "fish_stew"}, - {"id": 12780, "synset": "bouillabaisse.n.01", "name": "bouillabaisse"}, - {"id": 12781, "synset": "matelote.n.01", "name": "matelote"}, - {"id": 12782, "synset": "paella.n.01", "name": "paella"}, - {"id": 12783, "synset": "fricassee.n.01", "name": "fricassee"}, - {"id": 12784, "synset": "chicken_stew.n.01", "name": "chicken_stew"}, - {"id": 12785, "synset": "turkey_stew.n.01", "name": "turkey_stew"}, - {"id": 12786, "synset": "beef_stew.n.01", "name": "beef_stew"}, - {"id": 12787, "synset": "ragout.n.01", "name": "ragout"}, - {"id": 12788, "synset": "ratatouille.n.01", "name": "ratatouille"}, - {"id": 12789, "synset": "salmi.n.01", "name": "salmi"}, - {"id": 12790, "synset": "pot-au-feu.n.01", "name": "pot-au-feu"}, - {"id": 12791, "synset": "slumgullion.n.01", "name": "slumgullion"}, - {"id": 12792, "synset": "smorgasbord.n.02", "name": "smorgasbord"}, - {"id": 12793, "synset": "viand.n.01", "name": "viand"}, - {"id": 12794, "synset": "ready-mix.n.01", "name": "ready-mix"}, - {"id": 12795, "synset": "brownie_mix.n.01", "name": "brownie_mix"}, - {"id": 12796, "synset": "cake_mix.n.01", "name": "cake_mix"}, - {"id": 12797, "synset": "lemonade_mix.n.01", "name": "lemonade_mix"}, - {"id": 12798, "synset": "self-rising_flour.n.01", "name": "self-rising_flour"}, - {"id": 12799, "synset": "choice_morsel.n.01", "name": "choice_morsel"}, - {"id": 12800, "synset": "savory.n.04", "name": "savory"}, - {"id": 12801, "synset": "calf's-foot_jelly.n.01", "name": "calf's-foot_jelly"}, - {"id": 12802, "synset": "caramel.n.02", "name": "caramel"}, - {"id": 12803, "synset": "lump_sugar.n.01", "name": "lump_sugar"}, - {"id": 12804, "synset": "cane_sugar.n.02", "name": "cane_sugar"}, - {"id": 12805, "synset": "castor_sugar.n.01", "name": "castor_sugar"}, - {"id": 12806, "synset": "powdered_sugar.n.01", "name": "powdered_sugar"}, - {"id": 12807, "synset": "granulated_sugar.n.01", "name": "granulated_sugar"}, - {"id": 12808, "synset": "icing_sugar.n.01", "name": "icing_sugar"}, - {"id": 12809, "synset": "corn_sugar.n.02", "name": "corn_sugar"}, - {"id": 12810, "synset": "brown_sugar.n.01", "name": "brown_sugar"}, - {"id": 12811, "synset": "demerara.n.05", "name": "demerara"}, - {"id": 12812, "synset": "sweet.n.03", "name": "sweet"}, - {"id": 12813, "synset": "confectionery.n.01", "name": "confectionery"}, - {"id": 12814, "synset": "confiture.n.01", "name": "confiture"}, - {"id": 12815, "synset": "sweetmeat.n.01", "name": "sweetmeat"}, - {"id": 12816, "synset": "candy.n.01", "name": "candy"}, - {"id": 12817, "synset": "carob_bar.n.01", "name": "carob_bar"}, - {"id": 12818, "synset": "hardbake.n.01", "name": "hardbake"}, - {"id": 12819, "synset": "hard_candy.n.01", "name": "hard_candy"}, - {"id": 12820, "synset": "barley-sugar.n.01", "name": "barley-sugar"}, - {"id": 12821, "synset": "brandyball.n.01", "name": "brandyball"}, - {"id": 12822, "synset": "jawbreaker.n.01", "name": "jawbreaker"}, - {"id": 12823, "synset": "lemon_drop.n.01", "name": "lemon_drop"}, - {"id": 12824, "synset": "sourball.n.01", "name": "sourball"}, - {"id": 12825, "synset": "patty.n.03", "name": "patty"}, - {"id": 12826, "synset": "peppermint_patty.n.01", "name": "peppermint_patty"}, - {"id": 12827, "synset": "bonbon.n.01", "name": "bonbon"}, - {"id": 12828, "synset": "brittle.n.01", "name": "brittle"}, - {"id": 12829, "synset": "peanut_brittle.n.01", "name": "peanut_brittle"}, - {"id": 12830, "synset": "chewing_gum.n.01", "name": "chewing_gum"}, - {"id": 12831, "synset": "gum_ball.n.01", "name": "gum_ball"}, - {"id": 12832, "synset": "butterscotch.n.01", "name": "butterscotch"}, - {"id": 12833, "synset": "candied_fruit.n.01", "name": "candied_fruit"}, - {"id": 12834, "synset": "candied_apple.n.01", "name": "candied_apple"}, - {"id": 12835, "synset": "crystallized_ginger.n.01", "name": "crystallized_ginger"}, - {"id": 12836, "synset": "grapefruit_peel.n.01", "name": "grapefruit_peel"}, - {"id": 12837, "synset": "lemon_peel.n.02", "name": "lemon_peel"}, - {"id": 12838, "synset": "orange_peel.n.02", "name": "orange_peel"}, - {"id": 12839, "synset": "candied_citrus_peel.n.01", "name": "candied_citrus_peel"}, - {"id": 12840, "synset": "candy_corn.n.01", "name": "candy_corn"}, - {"id": 12841, "synset": "caramel.n.01", "name": "caramel"}, - {"id": 12842, "synset": "center.n.14", "name": "center"}, - {"id": 12843, "synset": "comfit.n.01", "name": "comfit"}, - {"id": 12844, "synset": "cotton_candy.n.01", "name": "cotton_candy"}, - {"id": 12845, "synset": "dragee.n.02", "name": "dragee"}, - {"id": 12846, "synset": "dragee.n.01", "name": "dragee"}, - {"id": 12847, "synset": "fondant.n.01", "name": "fondant"}, - {"id": 12848, "synset": "chocolate_fudge.n.01", "name": "chocolate_fudge"}, - {"id": 12849, "synset": "divinity.n.03", "name": "divinity"}, - {"id": 12850, "synset": "penuche.n.01", "name": "penuche"}, - {"id": 12851, "synset": "gumdrop.n.01", "name": "gumdrop"}, - {"id": 12852, "synset": "jujube.n.03", "name": "jujube"}, - {"id": 12853, "synset": "honey_crisp.n.01", "name": "honey_crisp"}, - {"id": 12854, "synset": "horehound.n.02", "name": "horehound"}, - {"id": 12855, "synset": "peppermint.n.03", "name": "peppermint"}, - {"id": 12856, "synset": "kiss.n.03", "name": "kiss"}, - {"id": 12857, "synset": "molasses_kiss.n.01", "name": "molasses_kiss"}, - {"id": 12858, "synset": "meringue_kiss.n.01", "name": "meringue_kiss"}, - {"id": 12859, "synset": "chocolate_kiss.n.01", "name": "chocolate_kiss"}, - {"id": 12860, "synset": "licorice.n.02", "name": "licorice"}, - {"id": 12861, "synset": "life_saver.n.01", "name": "Life_Saver"}, - {"id": 12862, "synset": "lozenge.n.01", "name": "lozenge"}, - {"id": 12863, "synset": "cachou.n.01", "name": "cachou"}, - {"id": 12864, "synset": "cough_drop.n.01", "name": "cough_drop"}, - {"id": 12865, "synset": "marshmallow.n.01", "name": "marshmallow"}, - {"id": 12866, "synset": "marzipan.n.01", "name": "marzipan"}, - {"id": 12867, "synset": "nougat.n.01", "name": "nougat"}, - {"id": 12868, "synset": "nougat_bar.n.01", "name": "nougat_bar"}, - {"id": 12869, "synset": "nut_bar.n.01", "name": "nut_bar"}, - {"id": 12870, "synset": "peanut_bar.n.01", "name": "peanut_bar"}, - {"id": 12871, "synset": "popcorn_ball.n.01", "name": "popcorn_ball"}, - {"id": 12872, "synset": "praline.n.01", "name": "praline"}, - {"id": 12873, "synset": "rock_candy.n.02", "name": "rock_candy"}, - {"id": 12874, "synset": "rock_candy.n.01", "name": "rock_candy"}, - {"id": 12875, "synset": "sugar_candy.n.01", "name": "sugar_candy"}, - {"id": 12876, "synset": "sugarplum.n.01", "name": "sugarplum"}, - {"id": 12877, "synset": "taffy.n.01", "name": "taffy"}, - {"id": 12878, "synset": "molasses_taffy.n.01", "name": "molasses_taffy"}, - {"id": 12879, "synset": "turkish_delight.n.01", "name": "Turkish_Delight"}, - {"id": 12880, "synset": "dessert.n.01", "name": "dessert"}, - {"id": 12881, "synset": "ambrosia.n.04", "name": "ambrosia"}, - {"id": 12882, "synset": "ambrosia.n.03", "name": "ambrosia"}, - {"id": 12883, "synset": "baked_alaska.n.01", "name": "baked_Alaska"}, - {"id": 12884, "synset": "blancmange.n.01", "name": "blancmange"}, - {"id": 12885, "synset": "charlotte.n.02", "name": "charlotte"}, - {"id": 12886, "synset": "compote.n.01", "name": "compote"}, - {"id": 12887, "synset": "dumpling.n.02", "name": "dumpling"}, - {"id": 12888, "synset": "flan.n.01", "name": "flan"}, - {"id": 12889, "synset": "frozen_dessert.n.01", "name": "frozen_dessert"}, - {"id": 12890, "synset": "junket.n.01", "name": "junket"}, - {"id": 12891, "synset": "mousse.n.02", "name": "mousse"}, - {"id": 12892, "synset": "mousse.n.01", "name": "mousse"}, - {"id": 12893, "synset": "pavlova.n.02", "name": "pavlova"}, - {"id": 12894, "synset": "peach_melba.n.01", "name": "peach_melba"}, - {"id": 12895, "synset": "whip.n.03", "name": "whip"}, - {"id": 12896, "synset": "prune_whip.n.01", "name": "prune_whip"}, - {"id": 12897, "synset": "pudding.n.03", "name": "pudding"}, - {"id": 12898, "synset": "pudding.n.02", "name": "pudding"}, - {"id": 12899, "synset": "syllabub.n.02", "name": "syllabub"}, - {"id": 12900, "synset": "tiramisu.n.01", "name": "tiramisu"}, - {"id": 12901, "synset": "trifle.n.01", "name": "trifle"}, - {"id": 12902, "synset": "tipsy_cake.n.01", "name": "tipsy_cake"}, - {"id": 12903, "synset": "jello.n.01", "name": "jello"}, - {"id": 12904, "synset": "apple_dumpling.n.01", "name": "apple_dumpling"}, - {"id": 12905, "synset": "ice.n.05", "name": "ice"}, - {"id": 12906, "synset": "water_ice.n.02", "name": "water_ice"}, - {"id": 12907, "synset": "ice-cream_cone.n.01", "name": "ice-cream_cone"}, - {"id": 12908, "synset": "chocolate_ice_cream.n.01", "name": "chocolate_ice_cream"}, - {"id": 12909, "synset": "neapolitan_ice_cream.n.01", "name": "Neapolitan_ice_cream"}, - {"id": 12910, "synset": "peach_ice_cream.n.01", "name": "peach_ice_cream"}, - {"id": 12911, "synset": "strawberry_ice_cream.n.01", "name": "strawberry_ice_cream"}, - {"id": 12912, "synset": "tutti-frutti.n.01", "name": "tutti-frutti"}, - {"id": 12913, "synset": "vanilla_ice_cream.n.01", "name": "vanilla_ice_cream"}, - {"id": 12914, "synset": "ice_milk.n.01", "name": "ice_milk"}, - {"id": 12915, "synset": "frozen_yogurt.n.01", "name": "frozen_yogurt"}, - {"id": 12916, "synset": "snowball.n.03", "name": "snowball"}, - {"id": 12917, "synset": "snowball.n.02", "name": "snowball"}, - {"id": 12918, "synset": "parfait.n.01", "name": "parfait"}, - {"id": 12919, "synset": "ice-cream_sundae.n.01", "name": "ice-cream_sundae"}, - {"id": 12920, "synset": "split.n.07", "name": "split"}, - {"id": 12921, "synset": "banana_split.n.01", "name": "banana_split"}, - {"id": 12922, "synset": "frozen_pudding.n.01", "name": "frozen_pudding"}, - {"id": 12923, "synset": "frozen_custard.n.01", "name": "frozen_custard"}, - {"id": 12924, "synset": "flummery.n.01", "name": "flummery"}, - {"id": 12925, "synset": "fish_mousse.n.01", "name": "fish_mousse"}, - {"id": 12926, "synset": "chicken_mousse.n.01", "name": "chicken_mousse"}, - {"id": 12927, "synset": "plum_pudding.n.01", "name": "plum_pudding"}, - {"id": 12928, "synset": "carrot_pudding.n.01", "name": "carrot_pudding"}, - {"id": 12929, "synset": "corn_pudding.n.01", "name": "corn_pudding"}, - {"id": 12930, "synset": "steamed_pudding.n.01", "name": "steamed_pudding"}, - {"id": 12931, "synset": "duff.n.01", "name": "duff"}, - {"id": 12932, "synset": "vanilla_pudding.n.01", "name": "vanilla_pudding"}, - {"id": 12933, "synset": "chocolate_pudding.n.01", "name": "chocolate_pudding"}, - {"id": 12934, "synset": "brown_betty.n.01", "name": "brown_Betty"}, - {"id": 12935, "synset": "nesselrode.n.01", "name": "Nesselrode"}, - {"id": 12936, "synset": "pease_pudding.n.01", "name": "pease_pudding"}, - {"id": 12937, "synset": "custard.n.01", "name": "custard"}, - {"id": 12938, "synset": "creme_caramel.n.01", "name": "creme_caramel"}, - {"id": 12939, "synset": "creme_anglais.n.01", "name": "creme_anglais"}, - {"id": 12940, "synset": "creme_brulee.n.01", "name": "creme_brulee"}, - {"id": 12941, "synset": "fruit_custard.n.01", "name": "fruit_custard"}, - {"id": 12942, "synset": "tapioca.n.01", "name": "tapioca"}, - {"id": 12943, "synset": "tapioca_pudding.n.01", "name": "tapioca_pudding"}, - {"id": 12944, "synset": "roly-poly.n.02", "name": "roly-poly"}, - {"id": 12945, "synset": "suet_pudding.n.01", "name": "suet_pudding"}, - {"id": 12946, "synset": "bavarian_cream.n.01", "name": "Bavarian_cream"}, - {"id": 12947, "synset": "maraschino.n.02", "name": "maraschino"}, - {"id": 12948, "synset": "nonpareil.n.02", "name": "nonpareil"}, - {"id": 12949, "synset": "zabaglione.n.01", "name": "zabaglione"}, - {"id": 12950, "synset": "garnish.n.01", "name": "garnish"}, - {"id": 12951, "synset": "pastry.n.01", "name": "pastry"}, - {"id": 12952, "synset": "turnover.n.02", "name": "turnover"}, - {"id": 12953, "synset": "apple_turnover.n.01", "name": "apple_turnover"}, - {"id": 12954, "synset": "knish.n.01", "name": "knish"}, - {"id": 12955, "synset": "pirogi.n.01", "name": "pirogi"}, - {"id": 12956, "synset": "samosa.n.01", "name": "samosa"}, - {"id": 12957, "synset": "timbale.n.01", "name": "timbale"}, - {"id": 12958, "synset": "puff_paste.n.01", "name": "puff_paste"}, - {"id": 12959, "synset": "phyllo.n.01", "name": "phyllo"}, - {"id": 12960, "synset": "puff_batter.n.01", "name": "puff_batter"}, - {"id": 12961, "synset": "ice-cream_cake.n.01", "name": "ice-cream_cake"}, - {"id": 12962, "synset": "fish_cake.n.01", "name": "fish_cake"}, - {"id": 12963, "synset": "fish_stick.n.01", "name": "fish_stick"}, - {"id": 12964, "synset": "conserve.n.01", "name": "conserve"}, - {"id": 12965, "synset": "apple_butter.n.01", "name": "apple_butter"}, - {"id": 12966, "synset": "chowchow.n.02", "name": "chowchow"}, - {"id": 12967, "synset": "lemon_curd.n.01", "name": "lemon_curd"}, - {"id": 12968, "synset": "strawberry_jam.n.01", "name": "strawberry_jam"}, - {"id": 12969, "synset": "jelly.n.02", "name": "jelly"}, - {"id": 12970, "synset": "apple_jelly.n.01", "name": "apple_jelly"}, - {"id": 12971, "synset": "crabapple_jelly.n.01", "name": "crabapple_jelly"}, - {"id": 12972, "synset": "grape_jelly.n.01", "name": "grape_jelly"}, - {"id": 12973, "synset": "marmalade.n.01", "name": "marmalade"}, - {"id": 12974, "synset": "orange_marmalade.n.01", "name": "orange_marmalade"}, - {"id": 12975, "synset": "gelatin_dessert.n.01", "name": "gelatin_dessert"}, - {"id": 12976, "synset": "buffalo_wing.n.01", "name": "buffalo_wing"}, - {"id": 12977, "synset": "barbecued_wing.n.01", "name": "barbecued_wing"}, - {"id": 12978, "synset": "mess.n.03", "name": "mess"}, - {"id": 12979, "synset": "mince.n.01", "name": "mince"}, - {"id": 12980, "synset": "puree.n.01", "name": "puree"}, - {"id": 12981, "synset": "barbecue.n.01", "name": "barbecue"}, - {"id": 12982, "synset": "biryani.n.01", "name": "biryani"}, - {"id": 12983, "synset": "escalope_de_veau_orloff.n.01", "name": "escalope_de_veau_Orloff"}, - {"id": 12984, "synset": "saute.n.01", "name": "saute"}, - {"id": 12985, "synset": "veal_parmesan.n.01", "name": "veal_parmesan"}, - {"id": 12986, "synset": "veal_cordon_bleu.n.01", "name": "veal_cordon_bleu"}, - {"id": 12987, "synset": "margarine.n.01", "name": "margarine"}, - {"id": 12988, "synset": "mincemeat.n.01", "name": "mincemeat"}, - {"id": 12989, "synset": "stuffing.n.01", "name": "stuffing"}, - {"id": 12990, "synset": "turkey_stuffing.n.01", "name": "turkey_stuffing"}, - {"id": 12991, "synset": "oyster_stuffing.n.01", "name": "oyster_stuffing"}, - {"id": 12992, "synset": "forcemeat.n.01", "name": "forcemeat"}, - {"id": 12993, "synset": "anadama_bread.n.01", "name": "anadama_bread"}, - {"id": 12994, "synset": "bap.n.01", "name": "bap"}, - {"id": 12995, "synset": "barmbrack.n.01", "name": "barmbrack"}, - {"id": 12996, "synset": "breadstick.n.01", "name": "breadstick"}, - {"id": 12997, "synset": "grissino.n.01", "name": "grissino"}, - {"id": 12998, "synset": "brown_bread.n.02", "name": "brown_bread"}, - {"id": 12999, "synset": "tea_bread.n.01", "name": "tea_bread"}, - {"id": 13000, "synset": "caraway_seed_bread.n.01", "name": "caraway_seed_bread"}, - {"id": 13001, "synset": "challah.n.01", "name": "challah"}, - {"id": 13002, "synset": "cinnamon_bread.n.01", "name": "cinnamon_bread"}, - {"id": 13003, "synset": "cracked-wheat_bread.n.01", "name": "cracked-wheat_bread"}, - {"id": 13004, "synset": "dark_bread.n.01", "name": "dark_bread"}, - {"id": 13005, "synset": "english_muffin.n.01", "name": "English_muffin"}, - {"id": 13006, "synset": "flatbread.n.01", "name": "flatbread"}, - {"id": 13007, "synset": "garlic_bread.n.01", "name": "garlic_bread"}, - {"id": 13008, "synset": "gluten_bread.n.01", "name": "gluten_bread"}, - {"id": 13009, "synset": "graham_bread.n.01", "name": "graham_bread"}, - {"id": 13010, "synset": "host.n.09", "name": "Host"}, - {"id": 13011, "synset": "flatbrod.n.01", "name": "flatbrod"}, - {"id": 13012, "synset": "bannock.n.01", "name": "bannock"}, - {"id": 13013, "synset": "chapatti.n.01", "name": "chapatti"}, - {"id": 13014, "synset": "loaf_of_bread.n.01", "name": "loaf_of_bread"}, - {"id": 13015, "synset": "french_loaf.n.01", "name": "French_loaf"}, - {"id": 13016, "synset": "matzo.n.01", "name": "matzo"}, - {"id": 13017, "synset": "nan.n.04", "name": "nan"}, - {"id": 13018, "synset": "onion_bread.n.01", "name": "onion_bread"}, - {"id": 13019, "synset": "raisin_bread.n.01", "name": "raisin_bread"}, - {"id": 13020, "synset": "quick_bread.n.01", "name": "quick_bread"}, - {"id": 13021, "synset": "banana_bread.n.01", "name": "banana_bread"}, - {"id": 13022, "synset": "date_bread.n.01", "name": "date_bread"}, - {"id": 13023, "synset": "date-nut_bread.n.01", "name": "date-nut_bread"}, - {"id": 13024, "synset": "nut_bread.n.01", "name": "nut_bread"}, - {"id": 13025, "synset": "oatcake.n.01", "name": "oatcake"}, - {"id": 13026, "synset": "irish_soda_bread.n.01", "name": "Irish_soda_bread"}, - {"id": 13027, "synset": "skillet_bread.n.01", "name": "skillet_bread"}, - {"id": 13028, "synset": "rye_bread.n.01", "name": "rye_bread"}, - {"id": 13029, "synset": "black_bread.n.01", "name": "black_bread"}, - {"id": 13030, "synset": "jewish_rye_bread.n.01", "name": "Jewish_rye_bread"}, - {"id": 13031, "synset": "limpa.n.01", "name": "limpa"}, - {"id": 13032, "synset": "swedish_rye_bread.n.01", "name": "Swedish_rye_bread"}, - {"id": 13033, "synset": "salt-rising_bread.n.01", "name": "salt-rising_bread"}, - {"id": 13034, "synset": "simnel.n.01", "name": "simnel"}, - {"id": 13035, "synset": "sour_bread.n.01", "name": "sour_bread"}, - {"id": 13036, "synset": "wafer.n.03", "name": "wafer"}, - {"id": 13037, "synset": "white_bread.n.01", "name": "white_bread"}, - {"id": 13038, "synset": "french_bread.n.01", "name": "French_bread"}, - {"id": 13039, "synset": "italian_bread.n.01", "name": "Italian_bread"}, - {"id": 13040, "synset": "corn_cake.n.01", "name": "corn_cake"}, - {"id": 13041, "synset": "skillet_corn_bread.n.01", "name": "skillet_corn_bread"}, - {"id": 13042, "synset": "ashcake.n.01", "name": "ashcake"}, - {"id": 13043, "synset": "hoecake.n.01", "name": "hoecake"}, - {"id": 13044, "synset": "cornpone.n.01", "name": "cornpone"}, - {"id": 13045, "synset": "corn_dab.n.01", "name": "corn_dab"}, - {"id": 13046, "synset": "hush_puppy.n.01", "name": "hush_puppy"}, - {"id": 13047, "synset": "johnnycake.n.01", "name": "johnnycake"}, - {"id": 13048, "synset": "shawnee_cake.n.01", "name": "Shawnee_cake"}, - {"id": 13049, "synset": "spoon_bread.n.01", "name": "spoon_bread"}, - {"id": 13050, "synset": "cinnamon_toast.n.01", "name": "cinnamon_toast"}, - {"id": 13051, "synset": "orange_toast.n.01", "name": "orange_toast"}, - {"id": 13052, "synset": "melba_toast.n.01", "name": "Melba_toast"}, - {"id": 13053, "synset": "zwieback.n.01", "name": "zwieback"}, - {"id": 13054, "synset": "frankfurter_bun.n.01", "name": "frankfurter_bun"}, - {"id": 13055, "synset": "hamburger_bun.n.01", "name": "hamburger_bun"}, - {"id": 13056, "synset": "bran_muffin.n.01", "name": "bran_muffin"}, - {"id": 13057, "synset": "corn_muffin.n.01", "name": "corn_muffin"}, - {"id": 13058, "synset": "yorkshire_pudding.n.01", "name": "Yorkshire_pudding"}, - {"id": 13059, "synset": "popover.n.01", "name": "popover"}, - {"id": 13060, "synset": "scone.n.01", "name": "scone"}, - {"id": 13061, "synset": "drop_scone.n.01", "name": "drop_scone"}, - {"id": 13062, "synset": "cross_bun.n.01", "name": "cross_bun"}, - {"id": 13063, "synset": "brioche.n.01", "name": "brioche"}, - {"id": 13064, "synset": "hard_roll.n.01", "name": "hard_roll"}, - {"id": 13065, "synset": "soft_roll.n.01", "name": "soft_roll"}, - {"id": 13066, "synset": "kaiser_roll.n.01", "name": "kaiser_roll"}, - {"id": 13067, "synset": "parker_house_roll.n.01", "name": "Parker_House_roll"}, - {"id": 13068, "synset": "clover-leaf_roll.n.01", "name": "clover-leaf_roll"}, - {"id": 13069, "synset": "onion_roll.n.01", "name": "onion_roll"}, - {"id": 13070, "synset": "bialy.n.01", "name": "bialy"}, - {"id": 13071, "synset": "sweet_roll.n.01", "name": "sweet_roll"}, - {"id": 13072, "synset": "bear_claw.n.01", "name": "bear_claw"}, - {"id": 13073, "synset": "cinnamon_roll.n.01", "name": "cinnamon_roll"}, - {"id": 13074, "synset": "honey_bun.n.01", "name": "honey_bun"}, - {"id": 13075, "synset": "pinwheel_roll.n.01", "name": "pinwheel_roll"}, - {"id": 13076, "synset": "danish.n.02", "name": "danish"}, - {"id": 13077, "synset": "onion_bagel.n.01", "name": "onion_bagel"}, - {"id": 13078, "synset": "biscuit.n.01", "name": "biscuit"}, - {"id": 13079, "synset": "rolled_biscuit.n.01", "name": "rolled_biscuit"}, - {"id": 13080, "synset": "baking-powder_biscuit.n.01", "name": "baking-powder_biscuit"}, - {"id": 13081, "synset": "buttermilk_biscuit.n.01", "name": "buttermilk_biscuit"}, - {"id": 13082, "synset": "shortcake.n.01", "name": "shortcake"}, - {"id": 13083, "synset": "hardtack.n.01", "name": "hardtack"}, - {"id": 13084, "synset": "saltine.n.01", "name": "saltine"}, - {"id": 13085, "synset": "soda_cracker.n.01", "name": "soda_cracker"}, - {"id": 13086, "synset": "oyster_cracker.n.01", "name": "oyster_cracker"}, - {"id": 13087, "synset": "water_biscuit.n.01", "name": "water_biscuit"}, - {"id": 13088, "synset": "graham_cracker.n.01", "name": "graham_cracker"}, - {"id": 13089, "synset": "soft_pretzel.n.01", "name": "soft_pretzel"}, - {"id": 13090, "synset": "sandwich_plate.n.01", "name": "sandwich_plate"}, - {"id": 13091, "synset": "butty.n.01", "name": "butty"}, - {"id": 13092, "synset": "ham_sandwich.n.01", "name": "ham_sandwich"}, - {"id": 13093, "synset": "chicken_sandwich.n.01", "name": "chicken_sandwich"}, - {"id": 13094, "synset": "club_sandwich.n.01", "name": "club_sandwich"}, - {"id": 13095, "synset": "open-face_sandwich.n.01", "name": "open-face_sandwich"}, - {"id": 13096, "synset": "cheeseburger.n.01", "name": "cheeseburger"}, - {"id": 13097, "synset": "tunaburger.n.01", "name": "tunaburger"}, - {"id": 13098, "synset": "hotdog.n.02", "name": "hotdog"}, - {"id": 13099, "synset": "sloppy_joe.n.01", "name": "Sloppy_Joe"}, - {"id": 13100, "synset": "bomber.n.03", "name": "bomber"}, - {"id": 13101, "synset": "gyro.n.01", "name": "gyro"}, - { - "id": 13102, - "synset": "bacon-lettuce-tomato_sandwich.n.01", - "name": "bacon-lettuce-tomato_sandwich", - }, - {"id": 13103, "synset": "reuben.n.02", "name": "Reuben"}, - {"id": 13104, "synset": "western.n.02", "name": "western"}, - {"id": 13105, "synset": "wrap.n.02", "name": "wrap"}, - {"id": 13106, "synset": "spaghetti.n.01", "name": "spaghetti"}, - {"id": 13107, "synset": "hasty_pudding.n.01", "name": "hasty_pudding"}, - {"id": 13108, "synset": "gruel.n.01", "name": "gruel"}, - {"id": 13109, "synset": "congee.n.01", "name": "congee"}, - {"id": 13110, "synset": "skilly.n.01", "name": "skilly"}, - {"id": 13111, "synset": "edible_fruit.n.01", "name": "edible_fruit"}, - {"id": 13112, "synset": "vegetable.n.01", "name": "vegetable"}, - {"id": 13113, "synset": "julienne.n.01", "name": "julienne"}, - {"id": 13114, "synset": "raw_vegetable.n.01", "name": "raw_vegetable"}, - {"id": 13115, "synset": "crudites.n.01", "name": "crudites"}, - {"id": 13116, "synset": "celery_stick.n.01", "name": "celery_stick"}, - {"id": 13117, "synset": "legume.n.03", "name": "legume"}, - {"id": 13118, "synset": "pulse.n.04", "name": "pulse"}, - {"id": 13119, "synset": "potherb.n.01", "name": "potherb"}, - {"id": 13120, "synset": "greens.n.01", "name": "greens"}, - {"id": 13121, "synset": "chop-suey_greens.n.02", "name": "chop-suey_greens"}, - {"id": 13122, "synset": "solanaceous_vegetable.n.01", "name": "solanaceous_vegetable"}, - {"id": 13123, "synset": "root_vegetable.n.01", "name": "root_vegetable"}, - {"id": 13124, "synset": "baked_potato.n.01", "name": "baked_potato"}, - {"id": 13125, "synset": "french_fries.n.01", "name": "french_fries"}, - {"id": 13126, "synset": "home_fries.n.01", "name": "home_fries"}, - {"id": 13127, "synset": "jacket_potato.n.01", "name": "jacket_potato"}, - {"id": 13128, "synset": "potato_skin.n.01", "name": "potato_skin"}, - {"id": 13129, "synset": "uruguay_potato.n.02", "name": "Uruguay_potato"}, - {"id": 13130, "synset": "yam.n.04", "name": "yam"}, - {"id": 13131, "synset": "yam.n.03", "name": "yam"}, - {"id": 13132, "synset": "snack_food.n.01", "name": "snack_food"}, - {"id": 13133, "synset": "corn_chip.n.01", "name": "corn_chip"}, - {"id": 13134, "synset": "tortilla_chip.n.01", "name": "tortilla_chip"}, - {"id": 13135, "synset": "nacho.n.01", "name": "nacho"}, - {"id": 13136, "synset": "pieplant.n.01", "name": "pieplant"}, - {"id": 13137, "synset": "cruciferous_vegetable.n.01", "name": "cruciferous_vegetable"}, - {"id": 13138, "synset": "mustard.n.03", "name": "mustard"}, - {"id": 13139, "synset": "cabbage.n.01", "name": "cabbage"}, - {"id": 13140, "synset": "kale.n.03", "name": "kale"}, - {"id": 13141, "synset": "collards.n.01", "name": "collards"}, - {"id": 13142, "synset": "chinese_cabbage.n.02", "name": "Chinese_cabbage"}, - {"id": 13143, "synset": "bok_choy.n.02", "name": "bok_choy"}, - {"id": 13144, "synset": "head_cabbage.n.02", "name": "head_cabbage"}, - {"id": 13145, "synset": "red_cabbage.n.02", "name": "red_cabbage"}, - {"id": 13146, "synset": "savoy_cabbage.n.02", "name": "savoy_cabbage"}, - {"id": 13147, "synset": "broccoli.n.02", "name": "broccoli"}, - {"id": 13148, "synset": "broccoli_rabe.n.02", "name": "broccoli_rabe"}, - {"id": 13149, "synset": "squash.n.02", "name": "squash"}, - {"id": 13150, "synset": "summer_squash.n.02", "name": "summer_squash"}, - {"id": 13151, "synset": "yellow_squash.n.02", "name": "yellow_squash"}, - {"id": 13152, "synset": "crookneck.n.01", "name": "crookneck"}, - {"id": 13153, "synset": "marrow.n.04", "name": "marrow"}, - {"id": 13154, "synset": "cocozelle.n.02", "name": "cocozelle"}, - {"id": 13155, "synset": "pattypan_squash.n.02", "name": "pattypan_squash"}, - {"id": 13156, "synset": "spaghetti_squash.n.02", "name": "spaghetti_squash"}, - {"id": 13157, "synset": "winter_squash.n.02", "name": "winter_squash"}, - {"id": 13158, "synset": "acorn_squash.n.02", "name": "acorn_squash"}, - {"id": 13159, "synset": "butternut_squash.n.02", "name": "butternut_squash"}, - {"id": 13160, "synset": "hubbard_squash.n.02", "name": "hubbard_squash"}, - {"id": 13161, "synset": "turban_squash.n.02", "name": "turban_squash"}, - {"id": 13162, "synset": "buttercup_squash.n.02", "name": "buttercup_squash"}, - {"id": 13163, "synset": "cushaw.n.02", "name": "cushaw"}, - {"id": 13164, "synset": "winter_crookneck_squash.n.02", "name": "winter_crookneck_squash"}, - {"id": 13165, "synset": "gherkin.n.02", "name": "gherkin"}, - {"id": 13166, "synset": "artichoke_heart.n.01", "name": "artichoke_heart"}, - {"id": 13167, "synset": "jerusalem_artichoke.n.03", "name": "Jerusalem_artichoke"}, - {"id": 13168, "synset": "bamboo_shoot.n.01", "name": "bamboo_shoot"}, - {"id": 13169, "synset": "sprout.n.02", "name": "sprout"}, - {"id": 13170, "synset": "bean_sprout.n.01", "name": "bean_sprout"}, - {"id": 13171, "synset": "alfalfa_sprout.n.01", "name": "alfalfa_sprout"}, - {"id": 13172, "synset": "beet.n.02", "name": "beet"}, - {"id": 13173, "synset": "beet_green.n.01", "name": "beet_green"}, - {"id": 13174, "synset": "sugar_beet.n.02", "name": "sugar_beet"}, - {"id": 13175, "synset": "mangel-wurzel.n.02", "name": "mangel-wurzel"}, - {"id": 13176, "synset": "chard.n.02", "name": "chard"}, - {"id": 13177, "synset": "pepper.n.04", "name": "pepper"}, - {"id": 13178, "synset": "sweet_pepper.n.02", "name": "sweet_pepper"}, - {"id": 13179, "synset": "green_pepper.n.01", "name": "green_pepper"}, - {"id": 13180, "synset": "globe_pepper.n.01", "name": "globe_pepper"}, - {"id": 13181, "synset": "pimento.n.02", "name": "pimento"}, - {"id": 13182, "synset": "hot_pepper.n.02", "name": "hot_pepper"}, - {"id": 13183, "synset": "jalapeno.n.02", "name": "jalapeno"}, - {"id": 13184, "synset": "chipotle.n.01", "name": "chipotle"}, - {"id": 13185, "synset": "cayenne.n.03", "name": "cayenne"}, - {"id": 13186, "synset": "tabasco.n.03", "name": "tabasco"}, - {"id": 13187, "synset": "onion.n.03", "name": "onion"}, - {"id": 13188, "synset": "bermuda_onion.n.01", "name": "Bermuda_onion"}, - {"id": 13189, "synset": "vidalia_onion.n.01", "name": "Vidalia_onion"}, - {"id": 13190, "synset": "spanish_onion.n.01", "name": "Spanish_onion"}, - {"id": 13191, "synset": "purple_onion.n.01", "name": "purple_onion"}, - {"id": 13192, "synset": "leek.n.02", "name": "leek"}, - {"id": 13193, "synset": "shallot.n.03", "name": "shallot"}, - {"id": 13194, "synset": "salad_green.n.01", "name": "salad_green"}, - {"id": 13195, "synset": "lettuce.n.03", "name": "lettuce"}, - {"id": 13196, "synset": "butterhead_lettuce.n.01", "name": "butterhead_lettuce"}, - {"id": 13197, "synset": "buttercrunch.n.01", "name": "buttercrunch"}, - {"id": 13198, "synset": "bibb_lettuce.n.01", "name": "Bibb_lettuce"}, - {"id": 13199, "synset": "boston_lettuce.n.01", "name": "Boston_lettuce"}, - {"id": 13200, "synset": "crisphead_lettuce.n.01", "name": "crisphead_lettuce"}, - {"id": 13201, "synset": "cos.n.02", "name": "cos"}, - {"id": 13202, "synset": "leaf_lettuce.n.02", "name": "leaf_lettuce"}, - {"id": 13203, "synset": "celtuce.n.02", "name": "celtuce"}, - {"id": 13204, "synset": "bean.n.01", "name": "bean"}, - {"id": 13205, "synset": "goa_bean.n.02", "name": "goa_bean"}, - {"id": 13206, "synset": "lentil.n.01", "name": "lentil"}, - {"id": 13207, "synset": "green_pea.n.01", "name": "green_pea"}, - {"id": 13208, "synset": "marrowfat_pea.n.01", "name": "marrowfat_pea"}, - {"id": 13209, "synset": "snow_pea.n.02", "name": "snow_pea"}, - {"id": 13210, "synset": "sugar_snap_pea.n.02", "name": "sugar_snap_pea"}, - {"id": 13211, "synset": "split-pea.n.01", "name": "split-pea"}, - {"id": 13212, "synset": "chickpea.n.03", "name": "chickpea"}, - {"id": 13213, "synset": "cajan_pea.n.02", "name": "cajan_pea"}, - {"id": 13214, "synset": "field_pea.n.03", "name": "field_pea"}, - {"id": 13215, "synset": "mushy_peas.n.01", "name": "mushy_peas"}, - {"id": 13216, "synset": "black-eyed_pea.n.03", "name": "black-eyed_pea"}, - {"id": 13217, "synset": "common_bean.n.02", "name": "common_bean"}, - {"id": 13218, "synset": "kidney_bean.n.02", "name": "kidney_bean"}, - {"id": 13219, "synset": "navy_bean.n.01", "name": "navy_bean"}, - {"id": 13220, "synset": "pinto_bean.n.01", "name": "pinto_bean"}, - {"id": 13221, "synset": "frijole.n.02", "name": "frijole"}, - {"id": 13222, "synset": "black_bean.n.01", "name": "black_bean"}, - {"id": 13223, "synset": "fresh_bean.n.01", "name": "fresh_bean"}, - {"id": 13224, "synset": "flageolet.n.01", "name": "flageolet"}, - {"id": 13225, "synset": "green_bean.n.01", "name": "green_bean"}, - {"id": 13226, "synset": "snap_bean.n.01", "name": "snap_bean"}, - {"id": 13227, "synset": "string_bean.n.01", "name": "string_bean"}, - {"id": 13228, "synset": "kentucky_wonder.n.01", "name": "Kentucky_wonder"}, - {"id": 13229, "synset": "scarlet_runner.n.03", "name": "scarlet_runner"}, - {"id": 13230, "synset": "haricot_vert.n.01", "name": "haricot_vert"}, - {"id": 13231, "synset": "wax_bean.n.02", "name": "wax_bean"}, - {"id": 13232, "synset": "shell_bean.n.02", "name": "shell_bean"}, - {"id": 13233, "synset": "lima_bean.n.03", "name": "lima_bean"}, - {"id": 13234, "synset": "fordhooks.n.01", "name": "Fordhooks"}, - {"id": 13235, "synset": "sieva_bean.n.02", "name": "sieva_bean"}, - {"id": 13236, "synset": "fava_bean.n.02", "name": "fava_bean"}, - {"id": 13237, "synset": "soy.n.04", "name": "soy"}, - {"id": 13238, "synset": "green_soybean.n.01", "name": "green_soybean"}, - {"id": 13239, "synset": "field_soybean.n.01", "name": "field_soybean"}, - {"id": 13240, "synset": "cardoon.n.02", "name": "cardoon"}, - {"id": 13241, "synset": "carrot.n.03", "name": "carrot"}, - {"id": 13242, "synset": "carrot_stick.n.01", "name": "carrot_stick"}, - {"id": 13243, "synset": "celery.n.02", "name": "celery"}, - {"id": 13244, "synset": "pascal_celery.n.01", "name": "pascal_celery"}, - {"id": 13245, "synset": "celeriac.n.02", "name": "celeriac"}, - {"id": 13246, "synset": "chicory.n.04", "name": "chicory"}, - {"id": 13247, "synset": "radicchio.n.01", "name": "radicchio"}, - {"id": 13248, "synset": "coffee_substitute.n.01", "name": "coffee_substitute"}, - {"id": 13249, "synset": "chicory.n.03", "name": "chicory"}, - {"id": 13250, "synset": "postum.n.01", "name": "Postum"}, - {"id": 13251, "synset": "chicory_escarole.n.01", "name": "chicory_escarole"}, - {"id": 13252, "synset": "belgian_endive.n.01", "name": "Belgian_endive"}, - {"id": 13253, "synset": "sweet_corn.n.02", "name": "sweet_corn"}, - {"id": 13254, "synset": "hominy.n.01", "name": "hominy"}, - {"id": 13255, "synset": "lye_hominy.n.01", "name": "lye_hominy"}, - {"id": 13256, "synset": "pearl_hominy.n.01", "name": "pearl_hominy"}, - {"id": 13257, "synset": "popcorn.n.02", "name": "popcorn"}, - {"id": 13258, "synset": "cress.n.02", "name": "cress"}, - {"id": 13259, "synset": "watercress.n.02", "name": "watercress"}, - {"id": 13260, "synset": "garden_cress.n.01", "name": "garden_cress"}, - {"id": 13261, "synset": "winter_cress.n.02", "name": "winter_cress"}, - {"id": 13262, "synset": "dandelion_green.n.02", "name": "dandelion_green"}, - {"id": 13263, "synset": "gumbo.n.03", "name": "gumbo"}, - {"id": 13264, "synset": "kohlrabi.n.02", "name": "kohlrabi"}, - {"id": 13265, "synset": "lamb's-quarter.n.01", "name": "lamb's-quarter"}, - {"id": 13266, "synset": "wild_spinach.n.03", "name": "wild_spinach"}, - {"id": 13267, "synset": "beefsteak_tomato.n.01", "name": "beefsteak_tomato"}, - {"id": 13268, "synset": "cherry_tomato.n.02", "name": "cherry_tomato"}, - {"id": 13269, "synset": "plum_tomato.n.02", "name": "plum_tomato"}, - {"id": 13270, "synset": "tomatillo.n.03", "name": "tomatillo"}, - {"id": 13271, "synset": "mushroom.n.05", "name": "mushroom"}, - {"id": 13272, "synset": "stuffed_mushroom.n.01", "name": "stuffed_mushroom"}, - {"id": 13273, "synset": "salsify.n.03", "name": "salsify"}, - {"id": 13274, "synset": "oyster_plant.n.03", "name": "oyster_plant"}, - {"id": 13275, "synset": "scorzonera.n.02", "name": "scorzonera"}, - {"id": 13276, "synset": "parsnip.n.03", "name": "parsnip"}, - {"id": 13277, "synset": "radish.n.01", "name": "radish"}, - {"id": 13278, "synset": "turnip.n.02", "name": "turnip"}, - {"id": 13279, "synset": "white_turnip.n.02", "name": "white_turnip"}, - {"id": 13280, "synset": "rutabaga.n.01", "name": "rutabaga"}, - {"id": 13281, "synset": "turnip_greens.n.01", "name": "turnip_greens"}, - {"id": 13282, "synset": "sorrel.n.04", "name": "sorrel"}, - {"id": 13283, "synset": "french_sorrel.n.02", "name": "French_sorrel"}, - {"id": 13284, "synset": "spinach.n.02", "name": "spinach"}, - {"id": 13285, "synset": "taro.n.03", "name": "taro"}, - {"id": 13286, "synset": "truffle.n.02", "name": "truffle"}, - {"id": 13287, "synset": "edible_nut.n.01", "name": "edible_nut"}, - {"id": 13288, "synset": "bunya_bunya.n.02", "name": "bunya_bunya"}, - {"id": 13289, "synset": "peanut.n.04", "name": "peanut"}, - {"id": 13290, "synset": "freestone.n.01", "name": "freestone"}, - {"id": 13291, "synset": "cling.n.01", "name": "cling"}, - {"id": 13292, "synset": "windfall.n.01", "name": "windfall"}, - {"id": 13293, "synset": "crab_apple.n.03", "name": "crab_apple"}, - {"id": 13294, "synset": "eating_apple.n.01", "name": "eating_apple"}, - {"id": 13295, "synset": "baldwin.n.03", "name": "Baldwin"}, - {"id": 13296, "synset": "cortland.n.01", "name": "Cortland"}, - {"id": 13297, "synset": "cox's_orange_pippin.n.01", "name": "Cox's_Orange_Pippin"}, - {"id": 13298, "synset": "delicious.n.01", "name": "Delicious"}, - {"id": 13299, "synset": "golden_delicious.n.01", "name": "Golden_Delicious"}, - {"id": 13300, "synset": "red_delicious.n.01", "name": "Red_Delicious"}, - {"id": 13301, "synset": "empire.n.05", "name": "Empire"}, - {"id": 13302, "synset": "grimes'_golden.n.01", "name": "Grimes'_golden"}, - {"id": 13303, "synset": "jonathan.n.01", "name": "Jonathan"}, - {"id": 13304, "synset": "mcintosh.n.01", "name": "McIntosh"}, - {"id": 13305, "synset": "macoun.n.01", "name": "Macoun"}, - {"id": 13306, "synset": "northern_spy.n.01", "name": "Northern_Spy"}, - {"id": 13307, "synset": "pearmain.n.01", "name": "Pearmain"}, - {"id": 13308, "synset": "pippin.n.01", "name": "Pippin"}, - {"id": 13309, "synset": "prima.n.01", "name": "Prima"}, - {"id": 13310, "synset": "stayman.n.01", "name": "Stayman"}, - {"id": 13311, "synset": "winesap.n.01", "name": "Winesap"}, - {"id": 13312, "synset": "stayman_winesap.n.01", "name": "Stayman_Winesap"}, - {"id": 13313, "synset": "cooking_apple.n.01", "name": "cooking_apple"}, - {"id": 13314, "synset": "bramley's_seedling.n.01", "name": "Bramley's_Seedling"}, - {"id": 13315, "synset": "granny_smith.n.01", "name": "Granny_Smith"}, - {"id": 13316, "synset": "lane's_prince_albert.n.01", "name": "Lane's_Prince_Albert"}, - {"id": 13317, "synset": "newtown_wonder.n.01", "name": "Newtown_Wonder"}, - {"id": 13318, "synset": "rome_beauty.n.01", "name": "Rome_Beauty"}, - {"id": 13319, "synset": "berry.n.01", "name": "berry"}, - {"id": 13320, "synset": "bilberry.n.03", "name": "bilberry"}, - {"id": 13321, "synset": "huckleberry.n.03", "name": "huckleberry"}, - {"id": 13322, "synset": "wintergreen.n.03", "name": "wintergreen"}, - {"id": 13323, "synset": "cranberry.n.02", "name": "cranberry"}, - {"id": 13324, "synset": "lingonberry.n.02", "name": "lingonberry"}, - {"id": 13325, "synset": "currant.n.01", "name": "currant"}, - {"id": 13326, "synset": "gooseberry.n.02", "name": "gooseberry"}, - {"id": 13327, "synset": "black_currant.n.02", "name": "black_currant"}, - {"id": 13328, "synset": "red_currant.n.02", "name": "red_currant"}, - {"id": 13329, "synset": "boysenberry.n.02", "name": "boysenberry"}, - {"id": 13330, "synset": "dewberry.n.02", "name": "dewberry"}, - {"id": 13331, "synset": "loganberry.n.02", "name": "loganberry"}, - {"id": 13332, "synset": "saskatoon.n.02", "name": "saskatoon"}, - {"id": 13333, "synset": "sugarberry.n.02", "name": "sugarberry"}, - {"id": 13334, "synset": "acerola.n.02", "name": "acerola"}, - {"id": 13335, "synset": "carambola.n.02", "name": "carambola"}, - {"id": 13336, "synset": "ceriman.n.02", "name": "ceriman"}, - {"id": 13337, "synset": "carissa_plum.n.01", "name": "carissa_plum"}, - {"id": 13338, "synset": "citrus.n.01", "name": "citrus"}, - {"id": 13339, "synset": "temple_orange.n.02", "name": "temple_orange"}, - {"id": 13340, "synset": "clementine.n.02", "name": "clementine"}, - {"id": 13341, "synset": "satsuma.n.02", "name": "satsuma"}, - {"id": 13342, "synset": "tangerine.n.02", "name": "tangerine"}, - {"id": 13343, "synset": "tangelo.n.02", "name": "tangelo"}, - {"id": 13344, "synset": "bitter_orange.n.02", "name": "bitter_orange"}, - {"id": 13345, "synset": "sweet_orange.n.01", "name": "sweet_orange"}, - {"id": 13346, "synset": "jaffa_orange.n.01", "name": "Jaffa_orange"}, - {"id": 13347, "synset": "navel_orange.n.01", "name": "navel_orange"}, - {"id": 13348, "synset": "valencia_orange.n.01", "name": "Valencia_orange"}, - {"id": 13349, "synset": "kumquat.n.02", "name": "kumquat"}, - {"id": 13350, "synset": "key_lime.n.01", "name": "key_lime"}, - {"id": 13351, "synset": "grapefruit.n.02", "name": "grapefruit"}, - {"id": 13352, "synset": "pomelo.n.02", "name": "pomelo"}, - {"id": 13353, "synset": "citrange.n.02", "name": "citrange"}, - {"id": 13354, "synset": "citron.n.01", "name": "citron"}, - {"id": 13355, "synset": "jordan_almond.n.02", "name": "Jordan_almond"}, - {"id": 13356, "synset": "nectarine.n.02", "name": "nectarine"}, - {"id": 13357, "synset": "pitahaya.n.02", "name": "pitahaya"}, - {"id": 13358, "synset": "plum.n.02", "name": "plum"}, - {"id": 13359, "synset": "damson.n.01", "name": "damson"}, - {"id": 13360, "synset": "greengage.n.01", "name": "greengage"}, - {"id": 13361, "synset": "beach_plum.n.02", "name": "beach_plum"}, - {"id": 13362, "synset": "sloe.n.03", "name": "sloe"}, - {"id": 13363, "synset": "victoria_plum.n.01", "name": "Victoria_plum"}, - {"id": 13364, "synset": "dried_fruit.n.01", "name": "dried_fruit"}, - {"id": 13365, "synset": "dried_apricot.n.01", "name": "dried_apricot"}, - {"id": 13366, "synset": "raisin.n.01", "name": "raisin"}, - {"id": 13367, "synset": "seedless_raisin.n.01", "name": "seedless_raisin"}, - {"id": 13368, "synset": "seeded_raisin.n.01", "name": "seeded_raisin"}, - {"id": 13369, "synset": "currant.n.03", "name": "currant"}, - {"id": 13370, "synset": "anchovy_pear.n.02", "name": "anchovy_pear"}, - {"id": 13371, "synset": "passion_fruit.n.01", "name": "passion_fruit"}, - {"id": 13372, "synset": "granadilla.n.04", "name": "granadilla"}, - {"id": 13373, "synset": "sweet_calabash.n.02", "name": "sweet_calabash"}, - {"id": 13374, "synset": "bell_apple.n.01", "name": "bell_apple"}, - {"id": 13375, "synset": "breadfruit.n.02", "name": "breadfruit"}, - {"id": 13376, "synset": "jackfruit.n.02", "name": "jackfruit"}, - {"id": 13377, "synset": "cacao_bean.n.01", "name": "cacao_bean"}, - {"id": 13378, "synset": "cocoa.n.02", "name": "cocoa"}, - {"id": 13379, "synset": "canistel.n.02", "name": "canistel"}, - {"id": 13380, "synset": "melon_ball.n.01", "name": "melon_ball"}, - {"id": 13381, "synset": "muskmelon.n.02", "name": "muskmelon"}, - {"id": 13382, "synset": "winter_melon.n.02", "name": "winter_melon"}, - {"id": 13383, "synset": "honeydew.n.01", "name": "honeydew"}, - {"id": 13384, "synset": "persian_melon.n.02", "name": "Persian_melon"}, - {"id": 13385, "synset": "net_melon.n.02", "name": "net_melon"}, - {"id": 13386, "synset": "casaba.n.01", "name": "casaba"}, - {"id": 13387, "synset": "sweet_cherry.n.02", "name": "sweet_cherry"}, - {"id": 13388, "synset": "bing_cherry.n.01", "name": "bing_cherry"}, - {"id": 13389, "synset": "heart_cherry.n.02", "name": "heart_cherry"}, - {"id": 13390, "synset": "blackheart.n.02", "name": "blackheart"}, - {"id": 13391, "synset": "capulin.n.02", "name": "capulin"}, - {"id": 13392, "synset": "sour_cherry.n.03", "name": "sour_cherry"}, - {"id": 13393, "synset": "amarelle.n.02", "name": "amarelle"}, - {"id": 13394, "synset": "morello.n.02", "name": "morello"}, - {"id": 13395, "synset": "cocoa_plum.n.02", "name": "cocoa_plum"}, - {"id": 13396, "synset": "gherkin.n.01", "name": "gherkin"}, - {"id": 13397, "synset": "fox_grape.n.02", "name": "fox_grape"}, - {"id": 13398, "synset": "concord_grape.n.01", "name": "Concord_grape"}, - {"id": 13399, "synset": "catawba.n.02", "name": "Catawba"}, - {"id": 13400, "synset": "muscadine.n.02", "name": "muscadine"}, - {"id": 13401, "synset": "scuppernong.n.01", "name": "scuppernong"}, - {"id": 13402, "synset": "slipskin_grape.n.01", "name": "slipskin_grape"}, - {"id": 13403, "synset": "vinifera_grape.n.02", "name": "vinifera_grape"}, - {"id": 13404, "synset": "emperor.n.02", "name": "emperor"}, - {"id": 13405, "synset": "muscat.n.04", "name": "muscat"}, - {"id": 13406, "synset": "ribier.n.01", "name": "ribier"}, - {"id": 13407, "synset": "sultana.n.01", "name": "sultana"}, - {"id": 13408, "synset": "tokay.n.02", "name": "Tokay"}, - {"id": 13409, "synset": "flame_tokay.n.01", "name": "flame_tokay"}, - {"id": 13410, "synset": "thompson_seedless.n.01", "name": "Thompson_Seedless"}, - {"id": 13411, "synset": "custard_apple.n.02", "name": "custard_apple"}, - {"id": 13412, "synset": "cherimoya.n.02", "name": "cherimoya"}, - {"id": 13413, "synset": "soursop.n.02", "name": "soursop"}, - {"id": 13414, "synset": "sweetsop.n.02", "name": "sweetsop"}, - {"id": 13415, "synset": "ilama.n.02", "name": "ilama"}, - {"id": 13416, "synset": "pond_apple.n.02", "name": "pond_apple"}, - {"id": 13417, "synset": "papaw.n.02", "name": "papaw"}, - {"id": 13418, "synset": "kai_apple.n.01", "name": "kai_apple"}, - {"id": 13419, "synset": "ketembilla.n.02", "name": "ketembilla"}, - {"id": 13420, "synset": "ackee.n.01", "name": "ackee"}, - {"id": 13421, "synset": "durian.n.02", "name": "durian"}, - {"id": 13422, "synset": "feijoa.n.02", "name": "feijoa"}, - {"id": 13423, "synset": "genip.n.02", "name": "genip"}, - {"id": 13424, "synset": "genipap.n.01", "name": "genipap"}, - {"id": 13425, "synset": "loquat.n.02", "name": "loquat"}, - {"id": 13426, "synset": "mangosteen.n.02", "name": "mangosteen"}, - {"id": 13427, "synset": "mango.n.02", "name": "mango"}, - {"id": 13428, "synset": "sapodilla.n.02", "name": "sapodilla"}, - {"id": 13429, "synset": "sapote.n.02", "name": "sapote"}, - {"id": 13430, "synset": "tamarind.n.02", "name": "tamarind"}, - {"id": 13431, "synset": "elderberry.n.02", "name": "elderberry"}, - {"id": 13432, "synset": "guava.n.03", "name": "guava"}, - {"id": 13433, "synset": "mombin.n.02", "name": "mombin"}, - {"id": 13434, "synset": "hog_plum.n.04", "name": "hog_plum"}, - {"id": 13435, "synset": "hog_plum.n.03", "name": "hog_plum"}, - {"id": 13436, "synset": "jaboticaba.n.02", "name": "jaboticaba"}, - {"id": 13437, "synset": "jujube.n.02", "name": "jujube"}, - {"id": 13438, "synset": "litchi.n.02", "name": "litchi"}, - {"id": 13439, "synset": "longanberry.n.02", "name": "longanberry"}, - {"id": 13440, "synset": "mamey.n.02", "name": "mamey"}, - {"id": 13441, "synset": "marang.n.02", "name": "marang"}, - {"id": 13442, "synset": "medlar.n.04", "name": "medlar"}, - {"id": 13443, "synset": "medlar.n.03", "name": "medlar"}, - {"id": 13444, "synset": "mulberry.n.02", "name": "mulberry"}, - {"id": 13445, "synset": "olive.n.04", "name": "olive"}, - {"id": 13446, "synset": "black_olive.n.01", "name": "black_olive"}, - {"id": 13447, "synset": "green_olive.n.01", "name": "green_olive"}, - {"id": 13448, "synset": "bosc.n.01", "name": "bosc"}, - {"id": 13449, "synset": "anjou.n.02", "name": "anjou"}, - {"id": 13450, "synset": "bartlett.n.03", "name": "bartlett"}, - {"id": 13451, "synset": "seckel.n.01", "name": "seckel"}, - {"id": 13452, "synset": "plantain.n.03", "name": "plantain"}, - {"id": 13453, "synset": "plumcot.n.02", "name": "plumcot"}, - {"id": 13454, "synset": "pomegranate.n.02", "name": "pomegranate"}, - {"id": 13455, "synset": "prickly_pear.n.02", "name": "prickly_pear"}, - {"id": 13456, "synset": "barbados_gooseberry.n.02", "name": "Barbados_gooseberry"}, - {"id": 13457, "synset": "quandong.n.04", "name": "quandong"}, - {"id": 13458, "synset": "quandong_nut.n.01", "name": "quandong_nut"}, - {"id": 13459, "synset": "quince.n.02", "name": "quince"}, - {"id": 13460, "synset": "rambutan.n.02", "name": "rambutan"}, - {"id": 13461, "synset": "pulasan.n.02", "name": "pulasan"}, - {"id": 13462, "synset": "rose_apple.n.02", "name": "rose_apple"}, - {"id": 13463, "synset": "sorb.n.01", "name": "sorb"}, - {"id": 13464, "synset": "sour_gourd.n.02", "name": "sour_gourd"}, - {"id": 13465, "synset": "edible_seed.n.01", "name": "edible_seed"}, - {"id": 13466, "synset": "pumpkin_seed.n.01", "name": "pumpkin_seed"}, - {"id": 13467, "synset": "betel_nut.n.01", "name": "betel_nut"}, - {"id": 13468, "synset": "beechnut.n.01", "name": "beechnut"}, - {"id": 13469, "synset": "walnut.n.01", "name": "walnut"}, - {"id": 13470, "synset": "black_walnut.n.02", "name": "black_walnut"}, - {"id": 13471, "synset": "english_walnut.n.02", "name": "English_walnut"}, - {"id": 13472, "synset": "brazil_nut.n.02", "name": "brazil_nut"}, - {"id": 13473, "synset": "butternut.n.02", "name": "butternut"}, - {"id": 13474, "synset": "souari_nut.n.02", "name": "souari_nut"}, - {"id": 13475, "synset": "cashew.n.02", "name": "cashew"}, - {"id": 13476, "synset": "chestnut.n.03", "name": "chestnut"}, - {"id": 13477, "synset": "chincapin.n.01", "name": "chincapin"}, - {"id": 13478, "synset": "hazelnut.n.02", "name": "hazelnut"}, - {"id": 13479, "synset": "coconut_milk.n.02", "name": "coconut_milk"}, - {"id": 13480, "synset": "grugru_nut.n.01", "name": "grugru_nut"}, - {"id": 13481, "synset": "hickory_nut.n.01", "name": "hickory_nut"}, - {"id": 13482, "synset": "cola_extract.n.01", "name": "cola_extract"}, - {"id": 13483, "synset": "macadamia_nut.n.02", "name": "macadamia_nut"}, - {"id": 13484, "synset": "pecan.n.03", "name": "pecan"}, - {"id": 13485, "synset": "pine_nut.n.01", "name": "pine_nut"}, - {"id": 13486, "synset": "pistachio.n.02", "name": "pistachio"}, - {"id": 13487, "synset": "sunflower_seed.n.01", "name": "sunflower_seed"}, - {"id": 13488, "synset": "anchovy_paste.n.01", "name": "anchovy_paste"}, - {"id": 13489, "synset": "rollmops.n.01", "name": "rollmops"}, - {"id": 13490, "synset": "feed.n.01", "name": "feed"}, - {"id": 13491, "synset": "cattle_cake.n.01", "name": "cattle_cake"}, - {"id": 13492, "synset": "creep_feed.n.01", "name": "creep_feed"}, - {"id": 13493, "synset": "fodder.n.02", "name": "fodder"}, - {"id": 13494, "synset": "feed_grain.n.01", "name": "feed_grain"}, - {"id": 13495, "synset": "eatage.n.01", "name": "eatage"}, - {"id": 13496, "synset": "silage.n.01", "name": "silage"}, - {"id": 13497, "synset": "oil_cake.n.01", "name": "oil_cake"}, - {"id": 13498, "synset": "oil_meal.n.01", "name": "oil_meal"}, - {"id": 13499, "synset": "alfalfa.n.02", "name": "alfalfa"}, - {"id": 13500, "synset": "broad_bean.n.03", "name": "broad_bean"}, - {"id": 13501, "synset": "hay.n.01", "name": "hay"}, - {"id": 13502, "synset": "timothy.n.03", "name": "timothy"}, - {"id": 13503, "synset": "stover.n.01", "name": "stover"}, - {"id": 13504, "synset": "grain.n.02", "name": "grain"}, - {"id": 13505, "synset": "grist.n.01", "name": "grist"}, - {"id": 13506, "synset": "groats.n.01", "name": "groats"}, - {"id": 13507, "synset": "millet.n.03", "name": "millet"}, - {"id": 13508, "synset": "barley.n.01", "name": "barley"}, - {"id": 13509, "synset": "pearl_barley.n.01", "name": "pearl_barley"}, - {"id": 13510, "synset": "buckwheat.n.02", "name": "buckwheat"}, - {"id": 13511, "synset": "bulgur.n.01", "name": "bulgur"}, - {"id": 13512, "synset": "wheat.n.02", "name": "wheat"}, - {"id": 13513, "synset": "cracked_wheat.n.01", "name": "cracked_wheat"}, - {"id": 13514, "synset": "stodge.n.01", "name": "stodge"}, - {"id": 13515, "synset": "wheat_germ.n.01", "name": "wheat_germ"}, - {"id": 13516, "synset": "oat.n.02", "name": "oat"}, - {"id": 13517, "synset": "rice.n.01", "name": "rice"}, - {"id": 13518, "synset": "brown_rice.n.01", "name": "brown_rice"}, - {"id": 13519, "synset": "white_rice.n.01", "name": "white_rice"}, - {"id": 13520, "synset": "wild_rice.n.02", "name": "wild_rice"}, - {"id": 13521, "synset": "paddy.n.03", "name": "paddy"}, - {"id": 13522, "synset": "slop.n.01", "name": "slop"}, - {"id": 13523, "synset": "mash.n.02", "name": "mash"}, - {"id": 13524, "synset": "chicken_feed.n.01", "name": "chicken_feed"}, - {"id": 13525, "synset": "cud.n.01", "name": "cud"}, - {"id": 13526, "synset": "bird_feed.n.01", "name": "bird_feed"}, - {"id": 13527, "synset": "petfood.n.01", "name": "petfood"}, - {"id": 13528, "synset": "dog_food.n.01", "name": "dog_food"}, - {"id": 13529, "synset": "cat_food.n.01", "name": "cat_food"}, - {"id": 13530, "synset": "canary_seed.n.01", "name": "canary_seed"}, - {"id": 13531, "synset": "tossed_salad.n.01", "name": "tossed_salad"}, - {"id": 13532, "synset": "green_salad.n.01", "name": "green_salad"}, - {"id": 13533, "synset": "caesar_salad.n.01", "name": "Caesar_salad"}, - {"id": 13534, "synset": "salmagundi.n.02", "name": "salmagundi"}, - {"id": 13535, "synset": "salad_nicoise.n.01", "name": "salad_nicoise"}, - {"id": 13536, "synset": "combination_salad.n.01", "name": "combination_salad"}, - {"id": 13537, "synset": "chef's_salad.n.01", "name": "chef's_salad"}, - {"id": 13538, "synset": "potato_salad.n.01", "name": "potato_salad"}, - {"id": 13539, "synset": "pasta_salad.n.01", "name": "pasta_salad"}, - {"id": 13540, "synset": "macaroni_salad.n.01", "name": "macaroni_salad"}, - {"id": 13541, "synset": "fruit_salad.n.01", "name": "fruit_salad"}, - {"id": 13542, "synset": "waldorf_salad.n.01", "name": "Waldorf_salad"}, - {"id": 13543, "synset": "crab_louis.n.01", "name": "crab_Louis"}, - {"id": 13544, "synset": "herring_salad.n.01", "name": "herring_salad"}, - {"id": 13545, "synset": "tuna_fish_salad.n.01", "name": "tuna_fish_salad"}, - {"id": 13546, "synset": "chicken_salad.n.01", "name": "chicken_salad"}, - {"id": 13547, "synset": "aspic.n.01", "name": "aspic"}, - {"id": 13548, "synset": "molded_salad.n.01", "name": "molded_salad"}, - {"id": 13549, "synset": "tabbouleh.n.01", "name": "tabbouleh"}, - {"id": 13550, "synset": "ingredient.n.03", "name": "ingredient"}, - {"id": 13551, "synset": "flavorer.n.01", "name": "flavorer"}, - {"id": 13552, "synset": "bouillon_cube.n.01", "name": "bouillon_cube"}, - {"id": 13553, "synset": "herb.n.02", "name": "herb"}, - {"id": 13554, "synset": "fines_herbes.n.01", "name": "fines_herbes"}, - {"id": 13555, "synset": "spice.n.02", "name": "spice"}, - {"id": 13556, "synset": "spearmint_oil.n.01", "name": "spearmint_oil"}, - {"id": 13557, "synset": "lemon_oil.n.01", "name": "lemon_oil"}, - {"id": 13558, "synset": "wintergreen_oil.n.01", "name": "wintergreen_oil"}, - {"id": 13559, "synset": "salt.n.02", "name": "salt"}, - {"id": 13560, "synset": "celery_salt.n.01", "name": "celery_salt"}, - {"id": 13561, "synset": "onion_salt.n.01", "name": "onion_salt"}, - {"id": 13562, "synset": "seasoned_salt.n.01", "name": "seasoned_salt"}, - {"id": 13563, "synset": "sour_salt.n.01", "name": "sour_salt"}, - {"id": 13564, "synset": "five_spice_powder.n.01", "name": "five_spice_powder"}, - {"id": 13565, "synset": "allspice.n.03", "name": "allspice"}, - {"id": 13566, "synset": "cinnamon.n.03", "name": "cinnamon"}, - {"id": 13567, "synset": "stick_cinnamon.n.01", "name": "stick_cinnamon"}, - {"id": 13568, "synset": "clove.n.04", "name": "clove"}, - {"id": 13569, "synset": "cumin.n.02", "name": "cumin"}, - {"id": 13570, "synset": "fennel.n.04", "name": "fennel"}, - {"id": 13571, "synset": "ginger.n.02", "name": "ginger"}, - {"id": 13572, "synset": "mace.n.03", "name": "mace"}, - {"id": 13573, "synset": "nutmeg.n.02", "name": "nutmeg"}, - {"id": 13574, "synset": "black_pepper.n.02", "name": "black_pepper"}, - {"id": 13575, "synset": "white_pepper.n.02", "name": "white_pepper"}, - {"id": 13576, "synset": "sassafras.n.02", "name": "sassafras"}, - {"id": 13577, "synset": "basil.n.03", "name": "basil"}, - {"id": 13578, "synset": "bay_leaf.n.01", "name": "bay_leaf"}, - {"id": 13579, "synset": "borage.n.02", "name": "borage"}, - {"id": 13580, "synset": "hyssop.n.02", "name": "hyssop"}, - {"id": 13581, "synset": "caraway.n.02", "name": "caraway"}, - {"id": 13582, "synset": "chervil.n.02", "name": "chervil"}, - {"id": 13583, "synset": "chives.n.02", "name": "chives"}, - {"id": 13584, "synset": "comfrey.n.02", "name": "comfrey"}, - {"id": 13585, "synset": "coriander.n.03", "name": "coriander"}, - {"id": 13586, "synset": "coriander.n.02", "name": "coriander"}, - {"id": 13587, "synset": "costmary.n.02", "name": "costmary"}, - {"id": 13588, "synset": "fennel.n.03", "name": "fennel"}, - {"id": 13589, "synset": "fennel.n.02", "name": "fennel"}, - {"id": 13590, "synset": "fennel_seed.n.01", "name": "fennel_seed"}, - {"id": 13591, "synset": "fenugreek.n.02", "name": "fenugreek"}, - {"id": 13592, "synset": "clove.n.03", "name": "clove"}, - {"id": 13593, "synset": "garlic_chive.n.02", "name": "garlic_chive"}, - {"id": 13594, "synset": "lemon_balm.n.02", "name": "lemon_balm"}, - {"id": 13595, "synset": "lovage.n.02", "name": "lovage"}, - {"id": 13596, "synset": "marjoram.n.02", "name": "marjoram"}, - {"id": 13597, "synset": "mint.n.04", "name": "mint"}, - {"id": 13598, "synset": "mustard_seed.n.01", "name": "mustard_seed"}, - {"id": 13599, "synset": "mustard.n.02", "name": "mustard"}, - {"id": 13600, "synset": "chinese_mustard.n.02", "name": "Chinese_mustard"}, - {"id": 13601, "synset": "nasturtium.n.03", "name": "nasturtium"}, - {"id": 13602, "synset": "parsley.n.02", "name": "parsley"}, - {"id": 13603, "synset": "salad_burnet.n.02", "name": "salad_burnet"}, - {"id": 13604, "synset": "rosemary.n.02", "name": "rosemary"}, - {"id": 13605, "synset": "rue.n.02", "name": "rue"}, - {"id": 13606, "synset": "sage.n.02", "name": "sage"}, - {"id": 13607, "synset": "clary_sage.n.02", "name": "clary_sage"}, - {"id": 13608, "synset": "savory.n.03", "name": "savory"}, - {"id": 13609, "synset": "summer_savory.n.02", "name": "summer_savory"}, - {"id": 13610, "synset": "winter_savory.n.02", "name": "winter_savory"}, - {"id": 13611, "synset": "sweet_woodruff.n.02", "name": "sweet_woodruff"}, - {"id": 13612, "synset": "sweet_cicely.n.03", "name": "sweet_cicely"}, - {"id": 13613, "synset": "tarragon.n.02", "name": "tarragon"}, - {"id": 13614, "synset": "thyme.n.02", "name": "thyme"}, - {"id": 13615, "synset": "turmeric.n.02", "name": "turmeric"}, - {"id": 13616, "synset": "caper.n.02", "name": "caper"}, - {"id": 13617, "synset": "catsup.n.01", "name": "catsup"}, - {"id": 13618, "synset": "cardamom.n.02", "name": "cardamom"}, - {"id": 13619, "synset": "chili_powder.n.01", "name": "chili_powder"}, - {"id": 13620, "synset": "chili_sauce.n.01", "name": "chili_sauce"}, - {"id": 13621, "synset": "chutney.n.01", "name": "chutney"}, - {"id": 13622, "synset": "steak_sauce.n.01", "name": "steak_sauce"}, - {"id": 13623, "synset": "taco_sauce.n.01", "name": "taco_sauce"}, - {"id": 13624, "synset": "mint_sauce.n.01", "name": "mint_sauce"}, - {"id": 13625, "synset": "cranberry_sauce.n.01", "name": "cranberry_sauce"}, - {"id": 13626, "synset": "curry_powder.n.01", "name": "curry_powder"}, - {"id": 13627, "synset": "curry.n.01", "name": "curry"}, - {"id": 13628, "synset": "lamb_curry.n.01", "name": "lamb_curry"}, - {"id": 13629, "synset": "duck_sauce.n.01", "name": "duck_sauce"}, - {"id": 13630, "synset": "horseradish.n.03", "name": "horseradish"}, - {"id": 13631, "synset": "marinade.n.01", "name": "marinade"}, - {"id": 13632, "synset": "paprika.n.02", "name": "paprika"}, - {"id": 13633, "synset": "spanish_paprika.n.01", "name": "Spanish_paprika"}, - {"id": 13634, "synset": "dill_pickle.n.01", "name": "dill_pickle"}, - {"id": 13635, "synset": "bread_and_butter_pickle.n.01", "name": "bread_and_butter_pickle"}, - {"id": 13636, "synset": "pickle_relish.n.01", "name": "pickle_relish"}, - {"id": 13637, "synset": "piccalilli.n.01", "name": "piccalilli"}, - {"id": 13638, "synset": "sweet_pickle.n.01", "name": "sweet_pickle"}, - {"id": 13639, "synset": "soy_sauce.n.01", "name": "soy_sauce"}, - {"id": 13640, "synset": "tomato_paste.n.01", "name": "tomato_paste"}, - {"id": 13641, "synset": "angelica.n.03", "name": "angelica"}, - {"id": 13642, "synset": "angelica.n.02", "name": "angelica"}, - {"id": 13643, "synset": "almond_extract.n.01", "name": "almond_extract"}, - {"id": 13644, "synset": "anise.n.02", "name": "anise"}, - {"id": 13645, "synset": "chinese_anise.n.02", "name": "Chinese_anise"}, - {"id": 13646, "synset": "juniper_berries.n.01", "name": "juniper_berries"}, - {"id": 13647, "synset": "saffron.n.02", "name": "saffron"}, - {"id": 13648, "synset": "sesame_seed.n.01", "name": "sesame_seed"}, - {"id": 13649, "synset": "caraway_seed.n.01", "name": "caraway_seed"}, - {"id": 13650, "synset": "poppy_seed.n.01", "name": "poppy_seed"}, - {"id": 13651, "synset": "dill.n.02", "name": "dill"}, - {"id": 13652, "synset": "dill_seed.n.01", "name": "dill_seed"}, - {"id": 13653, "synset": "celery_seed.n.01", "name": "celery_seed"}, - {"id": 13654, "synset": "lemon_extract.n.01", "name": "lemon_extract"}, - {"id": 13655, "synset": "monosodium_glutamate.n.01", "name": "monosodium_glutamate"}, - {"id": 13656, "synset": "vanilla_bean.n.01", "name": "vanilla_bean"}, - {"id": 13657, "synset": "cider_vinegar.n.01", "name": "cider_vinegar"}, - {"id": 13658, "synset": "wine_vinegar.n.01", "name": "wine_vinegar"}, - {"id": 13659, "synset": "sauce.n.01", "name": "sauce"}, - {"id": 13660, "synset": "anchovy_sauce.n.01", "name": "anchovy_sauce"}, - {"id": 13661, "synset": "hard_sauce.n.01", "name": "hard_sauce"}, - {"id": 13662, "synset": "horseradish_sauce.n.01", "name": "horseradish_sauce"}, - {"id": 13663, "synset": "bolognese_pasta_sauce.n.01", "name": "bolognese_pasta_sauce"}, - {"id": 13664, "synset": "carbonara.n.01", "name": "carbonara"}, - {"id": 13665, "synset": "tomato_sauce.n.01", "name": "tomato_sauce"}, - {"id": 13666, "synset": "tartare_sauce.n.01", "name": "tartare_sauce"}, - {"id": 13667, "synset": "wine_sauce.n.01", "name": "wine_sauce"}, - {"id": 13668, "synset": "marchand_de_vin.n.01", "name": "marchand_de_vin"}, - {"id": 13669, "synset": "bread_sauce.n.01", "name": "bread_sauce"}, - {"id": 13670, "synset": "plum_sauce.n.01", "name": "plum_sauce"}, - {"id": 13671, "synset": "peach_sauce.n.01", "name": "peach_sauce"}, - {"id": 13672, "synset": "apricot_sauce.n.01", "name": "apricot_sauce"}, - {"id": 13673, "synset": "pesto.n.01", "name": "pesto"}, - {"id": 13674, "synset": "ravigote.n.01", "name": "ravigote"}, - {"id": 13675, "synset": "remoulade_sauce.n.01", "name": "remoulade_sauce"}, - {"id": 13676, "synset": "dressing.n.01", "name": "dressing"}, - {"id": 13677, "synset": "sauce_louis.n.01", "name": "sauce_Louis"}, - {"id": 13678, "synset": "bleu_cheese_dressing.n.01", "name": "bleu_cheese_dressing"}, - {"id": 13679, "synset": "blue_cheese_dressing.n.01", "name": "blue_cheese_dressing"}, - {"id": 13680, "synset": "french_dressing.n.01", "name": "French_dressing"}, - {"id": 13681, "synset": "lorenzo_dressing.n.01", "name": "Lorenzo_dressing"}, - {"id": 13682, "synset": "anchovy_dressing.n.01", "name": "anchovy_dressing"}, - {"id": 13683, "synset": "italian_dressing.n.01", "name": "Italian_dressing"}, - {"id": 13684, "synset": "half-and-half_dressing.n.01", "name": "half-and-half_dressing"}, - {"id": 13685, "synset": "mayonnaise.n.01", "name": "mayonnaise"}, - {"id": 13686, "synset": "green_mayonnaise.n.01", "name": "green_mayonnaise"}, - {"id": 13687, "synset": "aioli.n.01", "name": "aioli"}, - {"id": 13688, "synset": "russian_dressing.n.01", "name": "Russian_dressing"}, - {"id": 13689, "synset": "salad_cream.n.01", "name": "salad_cream"}, - {"id": 13690, "synset": "thousand_island_dressing.n.01", "name": "Thousand_Island_dressing"}, - {"id": 13691, "synset": "barbecue_sauce.n.01", "name": "barbecue_sauce"}, - {"id": 13692, "synset": "hollandaise.n.01", "name": "hollandaise"}, - {"id": 13693, "synset": "bearnaise.n.01", "name": "bearnaise"}, - {"id": 13694, "synset": "bercy.n.01", "name": "Bercy"}, - {"id": 13695, "synset": "bordelaise.n.01", "name": "bordelaise"}, - {"id": 13696, "synset": "bourguignon.n.01", "name": "bourguignon"}, - {"id": 13697, "synset": "brown_sauce.n.02", "name": "brown_sauce"}, - {"id": 13698, "synset": "espagnole.n.01", "name": "Espagnole"}, - {"id": 13699, "synset": "chinese_brown_sauce.n.01", "name": "Chinese_brown_sauce"}, - {"id": 13700, "synset": "blanc.n.01", "name": "blanc"}, - {"id": 13701, "synset": "cheese_sauce.n.01", "name": "cheese_sauce"}, - {"id": 13702, "synset": "chocolate_sauce.n.01", "name": "chocolate_sauce"}, - {"id": 13703, "synset": "hot-fudge_sauce.n.01", "name": "hot-fudge_sauce"}, - {"id": 13704, "synset": "cocktail_sauce.n.01", "name": "cocktail_sauce"}, - {"id": 13705, "synset": "colbert.n.01", "name": "Colbert"}, - {"id": 13706, "synset": "white_sauce.n.01", "name": "white_sauce"}, - {"id": 13707, "synset": "cream_sauce.n.01", "name": "cream_sauce"}, - {"id": 13708, "synset": "mornay_sauce.n.01", "name": "Mornay_sauce"}, - {"id": 13709, "synset": "demiglace.n.01", "name": "demiglace"}, - {"id": 13710, "synset": "gravy.n.02", "name": "gravy"}, - {"id": 13711, "synset": "gravy.n.01", "name": "gravy"}, - {"id": 13712, "synset": "spaghetti_sauce.n.01", "name": "spaghetti_sauce"}, - {"id": 13713, "synset": "marinara.n.01", "name": "marinara"}, - {"id": 13714, "synset": "mole.n.03", "name": "mole"}, - {"id": 13715, "synset": "hunter's_sauce.n.01", "name": "hunter's_sauce"}, - {"id": 13716, "synset": "mushroom_sauce.n.01", "name": "mushroom_sauce"}, - {"id": 13717, "synset": "mustard_sauce.n.01", "name": "mustard_sauce"}, - {"id": 13718, "synset": "nantua.n.01", "name": "Nantua"}, - {"id": 13719, "synset": "hungarian_sauce.n.01", "name": "Hungarian_sauce"}, - {"id": 13720, "synset": "pepper_sauce.n.01", "name": "pepper_sauce"}, - {"id": 13721, "synset": "roux.n.01", "name": "roux"}, - {"id": 13722, "synset": "smitane.n.01", "name": "Smitane"}, - {"id": 13723, "synset": "soubise.n.01", "name": "Soubise"}, - {"id": 13724, "synset": "lyonnaise_sauce.n.01", "name": "Lyonnaise_sauce"}, - {"id": 13725, "synset": "veloute.n.01", "name": "veloute"}, - {"id": 13726, "synset": "allemande.n.01", "name": "allemande"}, - {"id": 13727, "synset": "caper_sauce.n.01", "name": "caper_sauce"}, - {"id": 13728, "synset": "poulette.n.01", "name": "poulette"}, - {"id": 13729, "synset": "curry_sauce.n.01", "name": "curry_sauce"}, - {"id": 13730, "synset": "worcester_sauce.n.01", "name": "Worcester_sauce"}, - {"id": 13731, "synset": "coconut_milk.n.01", "name": "coconut_milk"}, - {"id": 13732, "synset": "egg_white.n.01", "name": "egg_white"}, - {"id": 13733, "synset": "hard-boiled_egg.n.01", "name": "hard-boiled_egg"}, - {"id": 13734, "synset": "easter_egg.n.02", "name": "Easter_egg"}, - {"id": 13735, "synset": "easter_egg.n.01", "name": "Easter_egg"}, - {"id": 13736, "synset": "chocolate_egg.n.01", "name": "chocolate_egg"}, - {"id": 13737, "synset": "candy_egg.n.01", "name": "candy_egg"}, - {"id": 13738, "synset": "poached_egg.n.01", "name": "poached_egg"}, - {"id": 13739, "synset": "scrambled_eggs.n.01", "name": "scrambled_eggs"}, - {"id": 13740, "synset": "deviled_egg.n.01", "name": "deviled_egg"}, - {"id": 13741, "synset": "shirred_egg.n.01", "name": "shirred_egg"}, - {"id": 13742, "synset": "firm_omelet.n.01", "name": "firm_omelet"}, - {"id": 13743, "synset": "french_omelet.n.01", "name": "French_omelet"}, - {"id": 13744, "synset": "fluffy_omelet.n.01", "name": "fluffy_omelet"}, - {"id": 13745, "synset": "western_omelet.n.01", "name": "western_omelet"}, - {"id": 13746, "synset": "souffle.n.01", "name": "souffle"}, - {"id": 13747, "synset": "fried_egg.n.01", "name": "fried_egg"}, - {"id": 13748, "synset": "dairy_product.n.01", "name": "dairy_product"}, - {"id": 13749, "synset": "milk.n.04", "name": "milk"}, - {"id": 13750, "synset": "sour_milk.n.01", "name": "sour_milk"}, - {"id": 13751, "synset": "formula.n.06", "name": "formula"}, - {"id": 13752, "synset": "pasteurized_milk.n.01", "name": "pasteurized_milk"}, - {"id": 13753, "synset": "cows'_milk.n.01", "name": "cows'_milk"}, - {"id": 13754, "synset": "yak's_milk.n.01", "name": "yak's_milk"}, - {"id": 13755, "synset": "goats'_milk.n.01", "name": "goats'_milk"}, - {"id": 13756, "synset": "acidophilus_milk.n.01", "name": "acidophilus_milk"}, - {"id": 13757, "synset": "raw_milk.n.01", "name": "raw_milk"}, - {"id": 13758, "synset": "scalded_milk.n.01", "name": "scalded_milk"}, - {"id": 13759, "synset": "homogenized_milk.n.01", "name": "homogenized_milk"}, - {"id": 13760, "synset": "certified_milk.n.01", "name": "certified_milk"}, - {"id": 13761, "synset": "powdered_milk.n.01", "name": "powdered_milk"}, - {"id": 13762, "synset": "nonfat_dry_milk.n.01", "name": "nonfat_dry_milk"}, - {"id": 13763, "synset": "evaporated_milk.n.01", "name": "evaporated_milk"}, - {"id": 13764, "synset": "condensed_milk.n.01", "name": "condensed_milk"}, - {"id": 13765, "synset": "skim_milk.n.01", "name": "skim_milk"}, - {"id": 13766, "synset": "semi-skimmed_milk.n.01", "name": "semi-skimmed_milk"}, - {"id": 13767, "synset": "whole_milk.n.01", "name": "whole_milk"}, - {"id": 13768, "synset": "low-fat_milk.n.01", "name": "low-fat_milk"}, - {"id": 13769, "synset": "buttermilk.n.01", "name": "buttermilk"}, - {"id": 13770, "synset": "cream.n.02", "name": "cream"}, - {"id": 13771, "synset": "clotted_cream.n.01", "name": "clotted_cream"}, - {"id": 13772, "synset": "double_creme.n.01", "name": "double_creme"}, - {"id": 13773, "synset": "half-and-half.n.01", "name": "half-and-half"}, - {"id": 13774, "synset": "heavy_cream.n.01", "name": "heavy_cream"}, - {"id": 13775, "synset": "light_cream.n.01", "name": "light_cream"}, - {"id": 13776, "synset": "whipping_cream.n.01", "name": "whipping_cream"}, - {"id": 13777, "synset": "clarified_butter.n.01", "name": "clarified_butter"}, - {"id": 13778, "synset": "ghee.n.01", "name": "ghee"}, - {"id": 13779, "synset": "brown_butter.n.01", "name": "brown_butter"}, - {"id": 13780, "synset": "meuniere_butter.n.01", "name": "Meuniere_butter"}, - {"id": 13781, "synset": "blueberry_yogurt.n.01", "name": "blueberry_yogurt"}, - {"id": 13782, "synset": "raita.n.01", "name": "raita"}, - {"id": 13783, "synset": "whey.n.02", "name": "whey"}, - {"id": 13784, "synset": "curd.n.02", "name": "curd"}, - {"id": 13785, "synset": "curd.n.01", "name": "curd"}, - {"id": 13786, "synset": "clabber.n.01", "name": "clabber"}, - {"id": 13787, "synset": "cheese.n.01", "name": "cheese"}, - {"id": 13788, "synset": "paring.n.02", "name": "paring"}, - {"id": 13789, "synset": "cream_cheese.n.01", "name": "cream_cheese"}, - {"id": 13790, "synset": "double_cream.n.01", "name": "double_cream"}, - {"id": 13791, "synset": "mascarpone.n.01", "name": "mascarpone"}, - {"id": 13792, "synset": "triple_cream.n.01", "name": "triple_cream"}, - {"id": 13793, "synset": "cottage_cheese.n.01", "name": "cottage_cheese"}, - {"id": 13794, "synset": "process_cheese.n.01", "name": "process_cheese"}, - {"id": 13795, "synset": "bleu.n.01", "name": "bleu"}, - {"id": 13796, "synset": "stilton.n.01", "name": "Stilton"}, - {"id": 13797, "synset": "roquefort.n.01", "name": "Roquefort"}, - {"id": 13798, "synset": "gorgonzola.n.01", "name": "gorgonzola"}, - {"id": 13799, "synset": "danish_blue.n.01", "name": "Danish_blue"}, - {"id": 13800, "synset": "bavarian_blue.n.01", "name": "Bavarian_blue"}, - {"id": 13801, "synset": "brie.n.01", "name": "Brie"}, - {"id": 13802, "synset": "brick_cheese.n.01", "name": "brick_cheese"}, - {"id": 13803, "synset": "camembert.n.01", "name": "Camembert"}, - {"id": 13804, "synset": "cheddar.n.02", "name": "cheddar"}, - {"id": 13805, "synset": "rat_cheese.n.01", "name": "rat_cheese"}, - {"id": 13806, "synset": "cheshire_cheese.n.01", "name": "Cheshire_cheese"}, - {"id": 13807, "synset": "double_gloucester.n.01", "name": "double_Gloucester"}, - {"id": 13808, "synset": "edam.n.01", "name": "Edam"}, - {"id": 13809, "synset": "goat_cheese.n.01", "name": "goat_cheese"}, - {"id": 13810, "synset": "gouda.n.01", "name": "Gouda"}, - {"id": 13811, "synset": "grated_cheese.n.01", "name": "grated_cheese"}, - {"id": 13812, "synset": "hand_cheese.n.01", "name": "hand_cheese"}, - {"id": 13813, "synset": "liederkranz.n.01", "name": "Liederkranz"}, - {"id": 13814, "synset": "limburger.n.01", "name": "Limburger"}, - {"id": 13815, "synset": "mozzarella.n.01", "name": "mozzarella"}, - {"id": 13816, "synset": "muenster.n.01", "name": "Muenster"}, - {"id": 13817, "synset": "parmesan.n.01", "name": "Parmesan"}, - {"id": 13818, "synset": "quark_cheese.n.01", "name": "quark_cheese"}, - {"id": 13819, "synset": "ricotta.n.01", "name": "ricotta"}, - {"id": 13820, "synset": "swiss_cheese.n.01", "name": "Swiss_cheese"}, - {"id": 13821, "synset": "emmenthal.n.01", "name": "Emmenthal"}, - {"id": 13822, "synset": "gruyere.n.01", "name": "Gruyere"}, - {"id": 13823, "synset": "sapsago.n.01", "name": "sapsago"}, - {"id": 13824, "synset": "velveeta.n.01", "name": "Velveeta"}, - {"id": 13825, "synset": "nut_butter.n.01", "name": "nut_butter"}, - {"id": 13826, "synset": "marshmallow_fluff.n.01", "name": "marshmallow_fluff"}, - {"id": 13827, "synset": "onion_butter.n.01", "name": "onion_butter"}, - {"id": 13828, "synset": "pimento_butter.n.01", "name": "pimento_butter"}, - {"id": 13829, "synset": "shrimp_butter.n.01", "name": "shrimp_butter"}, - {"id": 13830, "synset": "lobster_butter.n.01", "name": "lobster_butter"}, - {"id": 13831, "synset": "yak_butter.n.01", "name": "yak_butter"}, - {"id": 13832, "synset": "spread.n.05", "name": "spread"}, - {"id": 13833, "synset": "cheese_spread.n.01", "name": "cheese_spread"}, - {"id": 13834, "synset": "anchovy_butter.n.01", "name": "anchovy_butter"}, - {"id": 13835, "synset": "fishpaste.n.01", "name": "fishpaste"}, - {"id": 13836, "synset": "garlic_butter.n.01", "name": "garlic_butter"}, - {"id": 13837, "synset": "miso.n.01", "name": "miso"}, - {"id": 13838, "synset": "wasabi.n.02", "name": "wasabi"}, - {"id": 13839, "synset": "snail_butter.n.01", "name": "snail_butter"}, - {"id": 13840, "synset": "pate.n.01", "name": "pate"}, - {"id": 13841, "synset": "duck_pate.n.01", "name": "duck_pate"}, - {"id": 13842, "synset": "foie_gras.n.01", "name": "foie_gras"}, - {"id": 13843, "synset": "tapenade.n.01", "name": "tapenade"}, - {"id": 13844, "synset": "tahini.n.01", "name": "tahini"}, - {"id": 13845, "synset": "sweetening.n.01", "name": "sweetening"}, - {"id": 13846, "synset": "aspartame.n.01", "name": "aspartame"}, - {"id": 13847, "synset": "saccharin.n.01", "name": "saccharin"}, - {"id": 13848, "synset": "sugar.n.01", "name": "sugar"}, - {"id": 13849, "synset": "syrup.n.01", "name": "syrup"}, - {"id": 13850, "synset": "sugar_syrup.n.01", "name": "sugar_syrup"}, - {"id": 13851, "synset": "molasses.n.01", "name": "molasses"}, - {"id": 13852, "synset": "sorghum.n.03", "name": "sorghum"}, - {"id": 13853, "synset": "treacle.n.01", "name": "treacle"}, - {"id": 13854, "synset": "grenadine.n.01", "name": "grenadine"}, - {"id": 13855, "synset": "maple_syrup.n.01", "name": "maple_syrup"}, - {"id": 13856, "synset": "corn_syrup.n.01", "name": "corn_syrup"}, - {"id": 13857, "synset": "miraculous_food.n.01", "name": "miraculous_food"}, - {"id": 13858, "synset": "dough.n.01", "name": "dough"}, - {"id": 13859, "synset": "bread_dough.n.01", "name": "bread_dough"}, - {"id": 13860, "synset": "pancake_batter.n.01", "name": "pancake_batter"}, - {"id": 13861, "synset": "fritter_batter.n.01", "name": "fritter_batter"}, - {"id": 13862, "synset": "coq_au_vin.n.01", "name": "coq_au_vin"}, - {"id": 13863, "synset": "chicken_provencale.n.01", "name": "chicken_provencale"}, - {"id": 13864, "synset": "chicken_and_rice.n.01", "name": "chicken_and_rice"}, - {"id": 13865, "synset": "moo_goo_gai_pan.n.01", "name": "moo_goo_gai_pan"}, - {"id": 13866, "synset": "arroz_con_pollo.n.01", "name": "arroz_con_pollo"}, - {"id": 13867, "synset": "bacon_and_eggs.n.02", "name": "bacon_and_eggs"}, - {"id": 13868, "synset": "barbecued_spareribs.n.01", "name": "barbecued_spareribs"}, - {"id": 13869, "synset": "beef_bourguignonne.n.01", "name": "beef_Bourguignonne"}, - {"id": 13870, "synset": "beef_wellington.n.01", "name": "beef_Wellington"}, - {"id": 13871, "synset": "bitok.n.01", "name": "bitok"}, - {"id": 13872, "synset": "boiled_dinner.n.01", "name": "boiled_dinner"}, - {"id": 13873, "synset": "boston_baked_beans.n.01", "name": "Boston_baked_beans"}, - {"id": 13874, "synset": "bubble_and_squeak.n.01", "name": "bubble_and_squeak"}, - {"id": 13875, "synset": "pasta.n.01", "name": "pasta"}, - {"id": 13876, "synset": "cannelloni.n.01", "name": "cannelloni"}, - {"id": 13877, "synset": "carbonnade_flamande.n.01", "name": "carbonnade_flamande"}, - {"id": 13878, "synset": "cheese_souffle.n.01", "name": "cheese_souffle"}, - {"id": 13879, "synset": "chicken_marengo.n.01", "name": "chicken_Marengo"}, - {"id": 13880, "synset": "chicken_cordon_bleu.n.01", "name": "chicken_cordon_bleu"}, - {"id": 13881, "synset": "maryland_chicken.n.01", "name": "Maryland_chicken"}, - {"id": 13882, "synset": "chicken_paprika.n.01", "name": "chicken_paprika"}, - {"id": 13883, "synset": "chicken_tetrazzini.n.01", "name": "chicken_Tetrazzini"}, - {"id": 13884, "synset": "tetrazzini.n.01", "name": "Tetrazzini"}, - {"id": 13885, "synset": "chicken_kiev.n.01", "name": "chicken_Kiev"}, - {"id": 13886, "synset": "chili.n.01", "name": "chili"}, - {"id": 13887, "synset": "chili_dog.n.01", "name": "chili_dog"}, - {"id": 13888, "synset": "chop_suey.n.01", "name": "chop_suey"}, - {"id": 13889, "synset": "chow_mein.n.01", "name": "chow_mein"}, - {"id": 13890, "synset": "codfish_ball.n.01", "name": "codfish_ball"}, - {"id": 13891, "synset": "coquille.n.01", "name": "coquille"}, - {"id": 13892, "synset": "coquilles_saint-jacques.n.01", "name": "coquilles_Saint-Jacques"}, - {"id": 13893, "synset": "croquette.n.01", "name": "croquette"}, - {"id": 13894, "synset": "cottage_pie.n.01", "name": "cottage_pie"}, - {"id": 13895, "synset": "rissole.n.01", "name": "rissole"}, - {"id": 13896, "synset": "dolmas.n.01", "name": "dolmas"}, - {"id": 13897, "synset": "egg_foo_yong.n.01", "name": "egg_foo_yong"}, - {"id": 13898, "synset": "eggs_benedict.n.01", "name": "eggs_Benedict"}, - {"id": 13899, "synset": "enchilada.n.01", "name": "enchilada"}, - {"id": 13900, "synset": "falafel.n.01", "name": "falafel"}, - {"id": 13901, "synset": "fish_and_chips.n.01", "name": "fish_and_chips"}, - {"id": 13902, "synset": "fondue.n.02", "name": "fondue"}, - {"id": 13903, "synset": "cheese_fondue.n.01", "name": "cheese_fondue"}, - {"id": 13904, "synset": "chocolate_fondue.n.01", "name": "chocolate_fondue"}, - {"id": 13905, "synset": "fondue.n.01", "name": "fondue"}, - {"id": 13906, "synset": "beef_fondue.n.01", "name": "beef_fondue"}, - {"id": 13907, "synset": "fried_rice.n.01", "name": "fried_rice"}, - {"id": 13908, "synset": "frittata.n.01", "name": "frittata"}, - {"id": 13909, "synset": "frog_legs.n.01", "name": "frog_legs"}, - {"id": 13910, "synset": "galantine.n.01", "name": "galantine"}, - {"id": 13911, "synset": "gefilte_fish.n.01", "name": "gefilte_fish"}, - {"id": 13912, "synset": "haggis.n.01", "name": "haggis"}, - {"id": 13913, "synset": "ham_and_eggs.n.01", "name": "ham_and_eggs"}, - {"id": 13914, "synset": "hash.n.01", "name": "hash"}, - {"id": 13915, "synset": "corned_beef_hash.n.01", "name": "corned_beef_hash"}, - {"id": 13916, "synset": "jambalaya.n.01", "name": "jambalaya"}, - {"id": 13917, "synset": "kabob.n.01", "name": "kabob"}, - {"id": 13918, "synset": "kedgeree.n.01", "name": "kedgeree"}, - {"id": 13919, "synset": "souvlaki.n.01", "name": "souvlaki"}, - {"id": 13920, "synset": "seafood_newburg.n.01", "name": "seafood_Newburg"}, - {"id": 13921, "synset": "lobster_newburg.n.01", "name": "lobster_Newburg"}, - {"id": 13922, "synset": "shrimp_newburg.n.01", "name": "shrimp_Newburg"}, - {"id": 13923, "synset": "newburg_sauce.n.01", "name": "Newburg_sauce"}, - {"id": 13924, "synset": "lobster_thermidor.n.01", "name": "lobster_thermidor"}, - {"id": 13925, "synset": "lutefisk.n.01", "name": "lutefisk"}, - {"id": 13926, "synset": "macaroni_and_cheese.n.01", "name": "macaroni_and_cheese"}, - {"id": 13927, "synset": "macedoine.n.01", "name": "macedoine"}, - {"id": 13928, "synset": "porcupine_ball.n.01", "name": "porcupine_ball"}, - {"id": 13929, "synset": "swedish_meatball.n.01", "name": "Swedish_meatball"}, - {"id": 13930, "synset": "meat_loaf.n.01", "name": "meat_loaf"}, - {"id": 13931, "synset": "moussaka.n.01", "name": "moussaka"}, - {"id": 13932, "synset": "osso_buco.n.01", "name": "osso_buco"}, - {"id": 13933, "synset": "marrow.n.03", "name": "marrow"}, - {"id": 13934, "synset": "pheasant_under_glass.n.01", "name": "pheasant_under_glass"}, - {"id": 13935, "synset": "pigs_in_blankets.n.01", "name": "pigs_in_blankets"}, - {"id": 13936, "synset": "pilaf.n.01", "name": "pilaf"}, - {"id": 13937, "synset": "bulgur_pilaf.n.01", "name": "bulgur_pilaf"}, - {"id": 13938, "synset": "sausage_pizza.n.01", "name": "sausage_pizza"}, - {"id": 13939, "synset": "pepperoni_pizza.n.01", "name": "pepperoni_pizza"}, - {"id": 13940, "synset": "cheese_pizza.n.01", "name": "cheese_pizza"}, - {"id": 13941, "synset": "anchovy_pizza.n.01", "name": "anchovy_pizza"}, - {"id": 13942, "synset": "sicilian_pizza.n.01", "name": "Sicilian_pizza"}, - {"id": 13943, "synset": "poi.n.01", "name": "poi"}, - {"id": 13944, "synset": "pork_and_beans.n.01", "name": "pork_and_beans"}, - {"id": 13945, "synset": "porridge.n.01", "name": "porridge"}, - {"id": 13946, "synset": "oatmeal.n.01", "name": "oatmeal"}, - {"id": 13947, "synset": "loblolly.n.01", "name": "loblolly"}, - {"id": 13948, "synset": "potpie.n.01", "name": "potpie"}, - {"id": 13949, "synset": "rijsttaffel.n.01", "name": "rijsttaffel"}, - {"id": 13950, "synset": "risotto.n.01", "name": "risotto"}, - {"id": 13951, "synset": "roulade.n.01", "name": "roulade"}, - {"id": 13952, "synset": "fish_loaf.n.01", "name": "fish_loaf"}, - {"id": 13953, "synset": "salmon_loaf.n.01", "name": "salmon_loaf"}, - {"id": 13954, "synset": "salisbury_steak.n.01", "name": "Salisbury_steak"}, - {"id": 13955, "synset": "sauerbraten.n.01", "name": "sauerbraten"}, - {"id": 13956, "synset": "sauerkraut.n.01", "name": "sauerkraut"}, - {"id": 13957, "synset": "scallopine.n.01", "name": "scallopine"}, - {"id": 13958, "synset": "veal_scallopini.n.01", "name": "veal_scallopini"}, - {"id": 13959, "synset": "scampi.n.01", "name": "scampi"}, - {"id": 13960, "synset": "scotch_egg.n.01", "name": "Scotch_egg"}, - {"id": 13961, "synset": "scotch_woodcock.n.01", "name": "Scotch_woodcock"}, - {"id": 13962, "synset": "scrapple.n.01", "name": "scrapple"}, - {"id": 13963, "synset": "spaghetti_and_meatballs.n.01", "name": "spaghetti_and_meatballs"}, - {"id": 13964, "synset": "spanish_rice.n.01", "name": "Spanish_rice"}, - {"id": 13965, "synset": "steak_tartare.n.01", "name": "steak_tartare"}, - {"id": 13966, "synset": "pepper_steak.n.02", "name": "pepper_steak"}, - {"id": 13967, "synset": "steak_au_poivre.n.01", "name": "steak_au_poivre"}, - {"id": 13968, "synset": "beef_stroganoff.n.01", "name": "beef_Stroganoff"}, - {"id": 13969, "synset": "stuffed_cabbage.n.01", "name": "stuffed_cabbage"}, - {"id": 13970, "synset": "kishke.n.01", "name": "kishke"}, - {"id": 13971, "synset": "stuffed_peppers.n.01", "name": "stuffed_peppers"}, - {"id": 13972, "synset": "stuffed_tomato.n.02", "name": "stuffed_tomato"}, - {"id": 13973, "synset": "stuffed_tomato.n.01", "name": "stuffed_tomato"}, - {"id": 13974, "synset": "succotash.n.01", "name": "succotash"}, - {"id": 13975, "synset": "sukiyaki.n.01", "name": "sukiyaki"}, - {"id": 13976, "synset": "sashimi.n.01", "name": "sashimi"}, - {"id": 13977, "synset": "swiss_steak.n.01", "name": "Swiss_steak"}, - {"id": 13978, "synset": "tamale.n.02", "name": "tamale"}, - {"id": 13979, "synset": "tamale_pie.n.01", "name": "tamale_pie"}, - {"id": 13980, "synset": "tempura.n.01", "name": "tempura"}, - {"id": 13981, "synset": "teriyaki.n.01", "name": "teriyaki"}, - {"id": 13982, "synset": "terrine.n.01", "name": "terrine"}, - {"id": 13983, "synset": "welsh_rarebit.n.01", "name": "Welsh_rarebit"}, - {"id": 13984, "synset": "schnitzel.n.01", "name": "schnitzel"}, - {"id": 13985, "synset": "chicken_taco.n.01", "name": "chicken_taco"}, - {"id": 13986, "synset": "beef_burrito.n.01", "name": "beef_burrito"}, - {"id": 13987, "synset": "tostada.n.01", "name": "tostada"}, - {"id": 13988, "synset": "bean_tostada.n.01", "name": "bean_tostada"}, - {"id": 13989, "synset": "refried_beans.n.01", "name": "refried_beans"}, - {"id": 13990, "synset": "beverage.n.01", "name": "beverage"}, - {"id": 13991, "synset": "wish-wash.n.01", "name": "wish-wash"}, - {"id": 13992, "synset": "concoction.n.01", "name": "concoction"}, - {"id": 13993, "synset": "mix.n.01", "name": "mix"}, - {"id": 13994, "synset": "filling.n.03", "name": "filling"}, - {"id": 13995, "synset": "lekvar.n.01", "name": "lekvar"}, - {"id": 13996, "synset": "potion.n.01", "name": "potion"}, - {"id": 13997, "synset": "elixir.n.03", "name": "elixir"}, - {"id": 13998, "synset": "elixir_of_life.n.01", "name": "elixir_of_life"}, - {"id": 13999, "synset": "philter.n.01", "name": "philter"}, - {"id": 14000, "synset": "proof_spirit.n.01", "name": "proof_spirit"}, - {"id": 14001, "synset": "home_brew.n.01", "name": "home_brew"}, - {"id": 14002, "synset": "hooch.n.01", "name": "hooch"}, - {"id": 14003, "synset": "kava.n.01", "name": "kava"}, - {"id": 14004, "synset": "aperitif.n.01", "name": "aperitif"}, - {"id": 14005, "synset": "brew.n.01", "name": "brew"}, - {"id": 14006, "synset": "beer.n.01", "name": "beer"}, - {"id": 14007, "synset": "draft_beer.n.01", "name": "draft_beer"}, - {"id": 14008, "synset": "suds.n.02", "name": "suds"}, - {"id": 14009, "synset": "munich_beer.n.01", "name": "Munich_beer"}, - {"id": 14010, "synset": "bock.n.01", "name": "bock"}, - {"id": 14011, "synset": "lager.n.02", "name": "lager"}, - {"id": 14012, "synset": "light_beer.n.01", "name": "light_beer"}, - {"id": 14013, "synset": "oktoberfest.n.01", "name": "Oktoberfest"}, - {"id": 14014, "synset": "pilsner.n.01", "name": "Pilsner"}, - {"id": 14015, "synset": "shebeen.n.01", "name": "shebeen"}, - {"id": 14016, "synset": "weissbier.n.01", "name": "Weissbier"}, - {"id": 14017, "synset": "weizenbock.n.01", "name": "Weizenbock"}, - {"id": 14018, "synset": "malt.n.03", "name": "malt"}, - {"id": 14019, "synset": "wort.n.02", "name": "wort"}, - {"id": 14020, "synset": "malt.n.02", "name": "malt"}, - {"id": 14021, "synset": "ale.n.01", "name": "ale"}, - {"id": 14022, "synset": "bitter.n.01", "name": "bitter"}, - {"id": 14023, "synset": "burton.n.03", "name": "Burton"}, - {"id": 14024, "synset": "pale_ale.n.01", "name": "pale_ale"}, - {"id": 14025, "synset": "porter.n.07", "name": "porter"}, - {"id": 14026, "synset": "stout.n.01", "name": "stout"}, - {"id": 14027, "synset": "guinness.n.02", "name": "Guinness"}, - {"id": 14028, "synset": "kvass.n.01", "name": "kvass"}, - {"id": 14029, "synset": "mead.n.03", "name": "mead"}, - {"id": 14030, "synset": "metheglin.n.01", "name": "metheglin"}, - {"id": 14031, "synset": "hydromel.n.01", "name": "hydromel"}, - {"id": 14032, "synset": "oenomel.n.01", "name": "oenomel"}, - {"id": 14033, "synset": "near_beer.n.01", "name": "near_beer"}, - {"id": 14034, "synset": "ginger_beer.n.01", "name": "ginger_beer"}, - {"id": 14035, "synset": "sake.n.02", "name": "sake"}, - {"id": 14036, "synset": "wine.n.01", "name": "wine"}, - {"id": 14037, "synset": "vintage.n.01", "name": "vintage"}, - {"id": 14038, "synset": "red_wine.n.01", "name": "red_wine"}, - {"id": 14039, "synset": "white_wine.n.01", "name": "white_wine"}, - {"id": 14040, "synset": "blush_wine.n.01", "name": "blush_wine"}, - {"id": 14041, "synset": "altar_wine.n.01", "name": "altar_wine"}, - {"id": 14042, "synset": "sparkling_wine.n.01", "name": "sparkling_wine"}, - {"id": 14043, "synset": "champagne.n.01", "name": "champagne"}, - {"id": 14044, "synset": "cold_duck.n.01", "name": "cold_duck"}, - {"id": 14045, "synset": "burgundy.n.02", "name": "Burgundy"}, - {"id": 14046, "synset": "beaujolais.n.01", "name": "Beaujolais"}, - {"id": 14047, "synset": "medoc.n.01", "name": "Medoc"}, - {"id": 14048, "synset": "canary_wine.n.01", "name": "Canary_wine"}, - {"id": 14049, "synset": "chablis.n.02", "name": "Chablis"}, - {"id": 14050, "synset": "montrachet.n.01", "name": "Montrachet"}, - {"id": 14051, "synset": "chardonnay.n.02", "name": "Chardonnay"}, - {"id": 14052, "synset": "pinot_noir.n.02", "name": "Pinot_noir"}, - {"id": 14053, "synset": "pinot_blanc.n.02", "name": "Pinot_blanc"}, - {"id": 14054, "synset": "bordeaux.n.02", "name": "Bordeaux"}, - {"id": 14055, "synset": "claret.n.02", "name": "claret"}, - {"id": 14056, "synset": "chianti.n.01", "name": "Chianti"}, - {"id": 14057, "synset": "cabernet.n.01", "name": "Cabernet"}, - {"id": 14058, "synset": "merlot.n.02", "name": "Merlot"}, - {"id": 14059, "synset": "sauvignon_blanc.n.02", "name": "Sauvignon_blanc"}, - {"id": 14060, "synset": "california_wine.n.01", "name": "California_wine"}, - {"id": 14061, "synset": "cotes_de_provence.n.01", "name": "Cotes_de_Provence"}, - {"id": 14062, "synset": "dessert_wine.n.01", "name": "dessert_wine"}, - {"id": 14063, "synset": "dubonnet.n.01", "name": "Dubonnet"}, - {"id": 14064, "synset": "jug_wine.n.01", "name": "jug_wine"}, - {"id": 14065, "synset": "macon.n.02", "name": "macon"}, - {"id": 14066, "synset": "moselle.n.01", "name": "Moselle"}, - {"id": 14067, "synset": "muscadet.n.02", "name": "Muscadet"}, - {"id": 14068, "synset": "plonk.n.01", "name": "plonk"}, - {"id": 14069, "synset": "retsina.n.01", "name": "retsina"}, - {"id": 14070, "synset": "rhine_wine.n.01", "name": "Rhine_wine"}, - {"id": 14071, "synset": "riesling.n.02", "name": "Riesling"}, - {"id": 14072, "synset": "liebfraumilch.n.01", "name": "liebfraumilch"}, - {"id": 14073, "synset": "rhone_wine.n.01", "name": "Rhone_wine"}, - {"id": 14074, "synset": "rioja.n.01", "name": "Rioja"}, - {"id": 14075, "synset": "sack.n.04", "name": "sack"}, - {"id": 14076, "synset": "saint_emilion.n.01", "name": "Saint_Emilion"}, - {"id": 14077, "synset": "soave.n.01", "name": "Soave"}, - {"id": 14078, "synset": "zinfandel.n.02", "name": "zinfandel"}, - {"id": 14079, "synset": "sauterne.n.01", "name": "Sauterne"}, - {"id": 14080, "synset": "straw_wine.n.01", "name": "straw_wine"}, - {"id": 14081, "synset": "table_wine.n.01", "name": "table_wine"}, - {"id": 14082, "synset": "tokay.n.01", "name": "Tokay"}, - {"id": 14083, "synset": "vin_ordinaire.n.01", "name": "vin_ordinaire"}, - {"id": 14084, "synset": "vermouth.n.01", "name": "vermouth"}, - {"id": 14085, "synset": "sweet_vermouth.n.01", "name": "sweet_vermouth"}, - {"id": 14086, "synset": "dry_vermouth.n.01", "name": "dry_vermouth"}, - {"id": 14087, "synset": "chenin_blanc.n.02", "name": "Chenin_blanc"}, - {"id": 14088, "synset": "verdicchio.n.02", "name": "Verdicchio"}, - {"id": 14089, "synset": "vouvray.n.01", "name": "Vouvray"}, - {"id": 14090, "synset": "yquem.n.01", "name": "Yquem"}, - {"id": 14091, "synset": "generic.n.01", "name": "generic"}, - {"id": 14092, "synset": "varietal.n.01", "name": "varietal"}, - {"id": 14093, "synset": "fortified_wine.n.01", "name": "fortified_wine"}, - {"id": 14094, "synset": "madeira.n.03", "name": "Madeira"}, - {"id": 14095, "synset": "malmsey.n.01", "name": "malmsey"}, - {"id": 14096, "synset": "port.n.02", "name": "port"}, - {"id": 14097, "synset": "sherry.n.01", "name": "sherry"}, - {"id": 14098, "synset": "marsala.n.01", "name": "Marsala"}, - {"id": 14099, "synset": "muscat.n.03", "name": "muscat"}, - {"id": 14100, "synset": "neutral_spirits.n.01", "name": "neutral_spirits"}, - {"id": 14101, "synset": "aqua_vitae.n.01", "name": "aqua_vitae"}, - {"id": 14102, "synset": "eau_de_vie.n.01", "name": "eau_de_vie"}, - {"id": 14103, "synset": "moonshine.n.02", "name": "moonshine"}, - {"id": 14104, "synset": "bathtub_gin.n.01", "name": "bathtub_gin"}, - {"id": 14105, "synset": "aquavit.n.01", "name": "aquavit"}, - {"id": 14106, "synset": "arrack.n.01", "name": "arrack"}, - {"id": 14107, "synset": "bitters.n.01", "name": "bitters"}, - {"id": 14108, "synset": "brandy.n.01", "name": "brandy"}, - {"id": 14109, "synset": "applejack.n.01", "name": "applejack"}, - {"id": 14110, "synset": "calvados.n.01", "name": "Calvados"}, - {"id": 14111, "synset": "armagnac.n.01", "name": "Armagnac"}, - {"id": 14112, "synset": "cognac.n.01", "name": "Cognac"}, - {"id": 14113, "synset": "grappa.n.01", "name": "grappa"}, - {"id": 14114, "synset": "kirsch.n.01", "name": "kirsch"}, - {"id": 14115, "synset": "slivovitz.n.01", "name": "slivovitz"}, - {"id": 14116, "synset": "gin.n.01", "name": "gin"}, - {"id": 14117, "synset": "sloe_gin.n.01", "name": "sloe_gin"}, - {"id": 14118, "synset": "geneva.n.02", "name": "geneva"}, - {"id": 14119, "synset": "grog.n.01", "name": "grog"}, - {"id": 14120, "synset": "ouzo.n.01", "name": "ouzo"}, - {"id": 14121, "synset": "rum.n.01", "name": "rum"}, - {"id": 14122, "synset": "demerara.n.04", "name": "demerara"}, - {"id": 14123, "synset": "jamaica_rum.n.01", "name": "Jamaica_rum"}, - {"id": 14124, "synset": "schnapps.n.01", "name": "schnapps"}, - {"id": 14125, "synset": "pulque.n.01", "name": "pulque"}, - {"id": 14126, "synset": "mescal.n.02", "name": "mescal"}, - {"id": 14127, "synset": "whiskey.n.01", "name": "whiskey"}, - {"id": 14128, "synset": "blended_whiskey.n.01", "name": "blended_whiskey"}, - {"id": 14129, "synset": "bourbon.n.02", "name": "bourbon"}, - {"id": 14130, "synset": "corn_whiskey.n.01", "name": "corn_whiskey"}, - {"id": 14131, "synset": "firewater.n.01", "name": "firewater"}, - {"id": 14132, "synset": "irish.n.02", "name": "Irish"}, - {"id": 14133, "synset": "poteen.n.01", "name": "poteen"}, - {"id": 14134, "synset": "rye.n.03", "name": "rye"}, - {"id": 14135, "synset": "scotch.n.02", "name": "Scotch"}, - {"id": 14136, "synset": "sour_mash.n.02", "name": "sour_mash"}, - {"id": 14137, "synset": "liqueur.n.01", "name": "liqueur"}, - {"id": 14138, "synset": "absinth.n.01", "name": "absinth"}, - {"id": 14139, "synset": "amaretto.n.01", "name": "amaretto"}, - {"id": 14140, "synset": "anisette.n.01", "name": "anisette"}, - {"id": 14141, "synset": "benedictine.n.02", "name": "benedictine"}, - {"id": 14142, "synset": "chartreuse.n.01", "name": "Chartreuse"}, - {"id": 14143, "synset": "coffee_liqueur.n.01", "name": "coffee_liqueur"}, - {"id": 14144, "synset": "creme_de_cacao.n.01", "name": "creme_de_cacao"}, - {"id": 14145, "synset": "creme_de_menthe.n.01", "name": "creme_de_menthe"}, - {"id": 14146, "synset": "creme_de_fraise.n.01", "name": "creme_de_fraise"}, - {"id": 14147, "synset": "drambuie.n.01", "name": "Drambuie"}, - {"id": 14148, "synset": "galliano.n.01", "name": "Galliano"}, - {"id": 14149, "synset": "orange_liqueur.n.01", "name": "orange_liqueur"}, - {"id": 14150, "synset": "curacao.n.02", "name": "curacao"}, - {"id": 14151, "synset": "triple_sec.n.01", "name": "triple_sec"}, - {"id": 14152, "synset": "grand_marnier.n.01", "name": "Grand_Marnier"}, - {"id": 14153, "synset": "kummel.n.01", "name": "kummel"}, - {"id": 14154, "synset": "maraschino.n.01", "name": "maraschino"}, - {"id": 14155, "synset": "pastis.n.01", "name": "pastis"}, - {"id": 14156, "synset": "pernod.n.01", "name": "Pernod"}, - {"id": 14157, "synset": "pousse-cafe.n.01", "name": "pousse-cafe"}, - {"id": 14158, "synset": "kahlua.n.01", "name": "Kahlua"}, - {"id": 14159, "synset": "ratafia.n.01", "name": "ratafia"}, - {"id": 14160, "synset": "sambuca.n.01", "name": "sambuca"}, - {"id": 14161, "synset": "mixed_drink.n.01", "name": "mixed_drink"}, - {"id": 14162, "synset": "cocktail.n.01", "name": "cocktail"}, - {"id": 14163, "synset": "dom_pedro.n.01", "name": "Dom_Pedro"}, - {"id": 14164, "synset": "highball.n.01", "name": "highball"}, - {"id": 14165, "synset": "mixer.n.02", "name": "mixer"}, - {"id": 14166, "synset": "bishop.n.02", "name": "bishop"}, - {"id": 14167, "synset": "bloody_mary.n.02", "name": "Bloody_Mary"}, - {"id": 14168, "synset": "virgin_mary.n.02", "name": "Virgin_Mary"}, - {"id": 14169, "synset": "bullshot.n.01", "name": "bullshot"}, - {"id": 14170, "synset": "cobbler.n.02", "name": "cobbler"}, - {"id": 14171, "synset": "collins.n.02", "name": "collins"}, - {"id": 14172, "synset": "cooler.n.02", "name": "cooler"}, - {"id": 14173, "synset": "refresher.n.02", "name": "refresher"}, - {"id": 14174, "synset": "daiquiri.n.01", "name": "daiquiri"}, - {"id": 14175, "synset": "strawberry_daiquiri.n.01", "name": "strawberry_daiquiri"}, - {"id": 14176, "synset": "nada_daiquiri.n.01", "name": "NADA_daiquiri"}, - {"id": 14177, "synset": "spritzer.n.01", "name": "spritzer"}, - {"id": 14178, "synset": "flip.n.02", "name": "flip"}, - {"id": 14179, "synset": "gimlet.n.01", "name": "gimlet"}, - {"id": 14180, "synset": "gin_and_tonic.n.01", "name": "gin_and_tonic"}, - {"id": 14181, "synset": "grasshopper.n.02", "name": "grasshopper"}, - {"id": 14182, "synset": "harvey_wallbanger.n.01", "name": "Harvey_Wallbanger"}, - {"id": 14183, "synset": "julep.n.01", "name": "julep"}, - {"id": 14184, "synset": "manhattan.n.02", "name": "manhattan"}, - {"id": 14185, "synset": "rob_roy.n.02", "name": "Rob_Roy"}, - {"id": 14186, "synset": "margarita.n.01", "name": "margarita"}, - {"id": 14187, "synset": "gin_and_it.n.01", "name": "gin_and_it"}, - {"id": 14188, "synset": "vodka_martini.n.01", "name": "vodka_martini"}, - {"id": 14189, "synset": "old_fashioned.n.01", "name": "old_fashioned"}, - {"id": 14190, "synset": "pink_lady.n.01", "name": "pink_lady"}, - {"id": 14191, "synset": "sazerac.n.01", "name": "Sazerac"}, - {"id": 14192, "synset": "screwdriver.n.02", "name": "screwdriver"}, - {"id": 14193, "synset": "sidecar.n.01", "name": "sidecar"}, - {"id": 14194, "synset": "scotch_and_soda.n.01", "name": "Scotch_and_soda"}, - {"id": 14195, "synset": "sling.n.01", "name": "sling"}, - {"id": 14196, "synset": "brandy_sling.n.01", "name": "brandy_sling"}, - {"id": 14197, "synset": "gin_sling.n.01", "name": "gin_sling"}, - {"id": 14198, "synset": "rum_sling.n.01", "name": "rum_sling"}, - {"id": 14199, "synset": "sour.n.01", "name": "sour"}, - {"id": 14200, "synset": "whiskey_sour.n.01", "name": "whiskey_sour"}, - {"id": 14201, "synset": "stinger.n.01", "name": "stinger"}, - {"id": 14202, "synset": "swizzle.n.01", "name": "swizzle"}, - {"id": 14203, "synset": "hot_toddy.n.01", "name": "hot_toddy"}, - {"id": 14204, "synset": "zombie.n.05", "name": "zombie"}, - {"id": 14205, "synset": "fizz.n.01", "name": "fizz"}, - {"id": 14206, "synset": "irish_coffee.n.01", "name": "Irish_coffee"}, - {"id": 14207, "synset": "cafe_au_lait.n.01", "name": "cafe_au_lait"}, - {"id": 14208, "synset": "cafe_noir.n.01", "name": "cafe_noir"}, - {"id": 14209, "synset": "decaffeinated_coffee.n.01", "name": "decaffeinated_coffee"}, - {"id": 14210, "synset": "drip_coffee.n.01", "name": "drip_coffee"}, - {"id": 14211, "synset": "espresso.n.01", "name": "espresso"}, - {"id": 14212, "synset": "caffe_latte.n.01", "name": "caffe_latte"}, - {"id": 14213, "synset": "iced_coffee.n.01", "name": "iced_coffee"}, - {"id": 14214, "synset": "instant_coffee.n.01", "name": "instant_coffee"}, - {"id": 14215, "synset": "mocha.n.03", "name": "mocha"}, - {"id": 14216, "synset": "mocha.n.02", "name": "mocha"}, - {"id": 14217, "synset": "cassareep.n.01", "name": "cassareep"}, - {"id": 14218, "synset": "turkish_coffee.n.01", "name": "Turkish_coffee"}, - {"id": 14219, "synset": "hard_cider.n.01", "name": "hard_cider"}, - {"id": 14220, "synset": "scrumpy.n.01", "name": "scrumpy"}, - {"id": 14221, "synset": "sweet_cider.n.01", "name": "sweet_cider"}, - {"id": 14222, "synset": "mulled_cider.n.01", "name": "mulled_cider"}, - {"id": 14223, "synset": "perry.n.04", "name": "perry"}, - {"id": 14224, "synset": "rotgut.n.01", "name": "rotgut"}, - {"id": 14225, "synset": "slug.n.05", "name": "slug"}, - {"id": 14226, "synset": "criollo.n.02", "name": "criollo"}, - {"id": 14227, "synset": "juice.n.01", "name": "juice"}, - {"id": 14228, "synset": "nectar.n.02", "name": "nectar"}, - {"id": 14229, "synset": "apple_juice.n.01", "name": "apple_juice"}, - {"id": 14230, "synset": "cranberry_juice.n.01", "name": "cranberry_juice"}, - {"id": 14231, "synset": "grape_juice.n.01", "name": "grape_juice"}, - {"id": 14232, "synset": "must.n.02", "name": "must"}, - {"id": 14233, "synset": "grapefruit_juice.n.01", "name": "grapefruit_juice"}, - {"id": 14234, "synset": "frozen_orange_juice.n.01", "name": "frozen_orange_juice"}, - {"id": 14235, "synset": "pineapple_juice.n.01", "name": "pineapple_juice"}, - {"id": 14236, "synset": "lemon_juice.n.01", "name": "lemon_juice"}, - {"id": 14237, "synset": "lime_juice.n.01", "name": "lime_juice"}, - {"id": 14238, "synset": "papaya_juice.n.01", "name": "papaya_juice"}, - {"id": 14239, "synset": "tomato_juice.n.01", "name": "tomato_juice"}, - {"id": 14240, "synset": "carrot_juice.n.01", "name": "carrot_juice"}, - {"id": 14241, "synset": "v-8_juice.n.01", "name": "V-8_juice"}, - {"id": 14242, "synset": "koumiss.n.01", "name": "koumiss"}, - {"id": 14243, "synset": "fruit_drink.n.01", "name": "fruit_drink"}, - {"id": 14244, "synset": "limeade.n.01", "name": "limeade"}, - {"id": 14245, "synset": "orangeade.n.01", "name": "orangeade"}, - {"id": 14246, "synset": "malted_milk.n.02", "name": "malted_milk"}, - {"id": 14247, "synset": "mate.n.09", "name": "mate"}, - {"id": 14248, "synset": "mulled_wine.n.01", "name": "mulled_wine"}, - {"id": 14249, "synset": "negus.n.01", "name": "negus"}, - {"id": 14250, "synset": "soft_drink.n.01", "name": "soft_drink"}, - {"id": 14251, "synset": "birch_beer.n.01", "name": "birch_beer"}, - {"id": 14252, "synset": "bitter_lemon.n.01", "name": "bitter_lemon"}, - {"id": 14253, "synset": "cola.n.02", "name": "cola"}, - {"id": 14254, "synset": "cream_soda.n.01", "name": "cream_soda"}, - {"id": 14255, "synset": "egg_cream.n.01", "name": "egg_cream"}, - {"id": 14256, "synset": "ginger_ale.n.01", "name": "ginger_ale"}, - {"id": 14257, "synset": "orange_soda.n.01", "name": "orange_soda"}, - {"id": 14258, "synset": "phosphate.n.02", "name": "phosphate"}, - {"id": 14259, "synset": "coca_cola.n.01", "name": "Coca_Cola"}, - {"id": 14260, "synset": "pepsi.n.01", "name": "Pepsi"}, - {"id": 14261, "synset": "sarsaparilla.n.02", "name": "sarsaparilla"}, - {"id": 14262, "synset": "tonic.n.01", "name": "tonic"}, - {"id": 14263, "synset": "coffee_bean.n.01", "name": "coffee_bean"}, - {"id": 14264, "synset": "coffee.n.01", "name": "coffee"}, - {"id": 14265, "synset": "cafe_royale.n.01", "name": "cafe_royale"}, - {"id": 14266, "synset": "fruit_punch.n.01", "name": "fruit_punch"}, - {"id": 14267, "synset": "milk_punch.n.01", "name": "milk_punch"}, - {"id": 14268, "synset": "mimosa.n.03", "name": "mimosa"}, - {"id": 14269, "synset": "pina_colada.n.01", "name": "pina_colada"}, - {"id": 14270, "synset": "punch.n.02", "name": "punch"}, - {"id": 14271, "synset": "cup.n.06", "name": "cup"}, - {"id": 14272, "synset": "champagne_cup.n.01", "name": "champagne_cup"}, - {"id": 14273, "synset": "claret_cup.n.01", "name": "claret_cup"}, - {"id": 14274, "synset": "wassail.n.01", "name": "wassail"}, - {"id": 14275, "synset": "planter's_punch.n.01", "name": "planter's_punch"}, - {"id": 14276, "synset": "white_russian.n.02", "name": "White_Russian"}, - {"id": 14277, "synset": "fish_house_punch.n.01", "name": "fish_house_punch"}, - {"id": 14278, "synset": "may_wine.n.01", "name": "May_wine"}, - {"id": 14279, "synset": "eggnog.n.01", "name": "eggnog"}, - {"id": 14280, "synset": "cassiri.n.01", "name": "cassiri"}, - {"id": 14281, "synset": "spruce_beer.n.01", "name": "spruce_beer"}, - {"id": 14282, "synset": "rickey.n.01", "name": "rickey"}, - {"id": 14283, "synset": "gin_rickey.n.01", "name": "gin_rickey"}, - {"id": 14284, "synset": "tea.n.05", "name": "tea"}, - {"id": 14285, "synset": "tea.n.01", "name": "tea"}, - {"id": 14286, "synset": "tea-like_drink.n.01", "name": "tea-like_drink"}, - {"id": 14287, "synset": "cambric_tea.n.01", "name": "cambric_tea"}, - {"id": 14288, "synset": "cuppa.n.01", "name": "cuppa"}, - {"id": 14289, "synset": "herb_tea.n.01", "name": "herb_tea"}, - {"id": 14290, "synset": "tisane.n.01", "name": "tisane"}, - {"id": 14291, "synset": "camomile_tea.n.01", "name": "camomile_tea"}, - {"id": 14292, "synset": "ice_tea.n.01", "name": "ice_tea"}, - {"id": 14293, "synset": "sun_tea.n.01", "name": "sun_tea"}, - {"id": 14294, "synset": "black_tea.n.01", "name": "black_tea"}, - {"id": 14295, "synset": "congou.n.01", "name": "congou"}, - {"id": 14296, "synset": "darjeeling.n.01", "name": "Darjeeling"}, - {"id": 14297, "synset": "orange_pekoe.n.01", "name": "orange_pekoe"}, - {"id": 14298, "synset": "souchong.n.01", "name": "souchong"}, - {"id": 14299, "synset": "green_tea.n.01", "name": "green_tea"}, - {"id": 14300, "synset": "hyson.n.01", "name": "hyson"}, - {"id": 14301, "synset": "oolong.n.01", "name": "oolong"}, - {"id": 14302, "synset": "water.n.06", "name": "water"}, - {"id": 14303, "synset": "bottled_water.n.01", "name": "bottled_water"}, - {"id": 14304, "synset": "branch_water.n.01", "name": "branch_water"}, - {"id": 14305, "synset": "spring_water.n.02", "name": "spring_water"}, - {"id": 14306, "synset": "sugar_water.n.01", "name": "sugar_water"}, - {"id": 14307, "synset": "drinking_water.n.01", "name": "drinking_water"}, - {"id": 14308, "synset": "ice_water.n.01", "name": "ice_water"}, - {"id": 14309, "synset": "soda_water.n.01", "name": "soda_water"}, - {"id": 14310, "synset": "mineral_water.n.01", "name": "mineral_water"}, - {"id": 14311, "synset": "seltzer.n.01", "name": "seltzer"}, - {"id": 14312, "synset": "vichy_water.n.01", "name": "Vichy_water"}, - {"id": 14313, "synset": "perishable.n.01", "name": "perishable"}, - {"id": 14314, "synset": "couscous.n.01", "name": "couscous"}, - {"id": 14315, "synset": "ramekin.n.01", "name": "ramekin"}, - {"id": 14316, "synset": "multivitamin.n.01", "name": "multivitamin"}, - {"id": 14317, "synset": "vitamin_pill.n.01", "name": "vitamin_pill"}, - {"id": 14318, "synset": "soul_food.n.01", "name": "soul_food"}, - {"id": 14319, "synset": "mold.n.06", "name": "mold"}, - {"id": 14320, "synset": "people.n.01", "name": "people"}, - {"id": 14321, "synset": "collection.n.01", "name": "collection"}, - {"id": 14322, "synset": "book.n.07", "name": "book"}, - {"id": 14323, "synset": "library.n.02", "name": "library"}, - {"id": 14324, "synset": "baseball_club.n.01", "name": "baseball_club"}, - {"id": 14325, "synset": "crowd.n.01", "name": "crowd"}, - {"id": 14326, "synset": "class.n.02", "name": "class"}, - {"id": 14327, "synset": "core.n.01", "name": "core"}, - {"id": 14328, "synset": "concert_band.n.01", "name": "concert_band"}, - {"id": 14329, "synset": "dance.n.02", "name": "dance"}, - {"id": 14330, "synset": "wedding.n.03", "name": "wedding"}, - {"id": 14331, "synset": "chain.n.01", "name": "chain"}, - {"id": 14332, "synset": "power_breakfast.n.01", "name": "power_breakfast"}, - {"id": 14333, "synset": "aerie.n.02", "name": "aerie"}, - {"id": 14334, "synset": "agora.n.02", "name": "agora"}, - {"id": 14335, "synset": "amusement_park.n.01", "name": "amusement_park"}, - {"id": 14336, "synset": "aphelion.n.01", "name": "aphelion"}, - {"id": 14337, "synset": "apron.n.02", "name": "apron"}, - {"id": 14338, "synset": "interplanetary_space.n.01", "name": "interplanetary_space"}, - {"id": 14339, "synset": "interstellar_space.n.01", "name": "interstellar_space"}, - {"id": 14340, "synset": "intergalactic_space.n.01", "name": "intergalactic_space"}, - {"id": 14341, "synset": "bush.n.02", "name": "bush"}, - {"id": 14342, "synset": "semidesert.n.01", "name": "semidesert"}, - {"id": 14343, "synset": "beam-ends.n.01", "name": "beam-ends"}, - {"id": 14344, "synset": "bridgehead.n.02", "name": "bridgehead"}, - {"id": 14345, "synset": "bus_stop.n.01", "name": "bus_stop"}, - {"id": 14346, "synset": "campsite.n.01", "name": "campsite"}, - {"id": 14347, "synset": "detention_basin.n.01", "name": "detention_basin"}, - {"id": 14348, "synset": "cemetery.n.01", "name": "cemetery"}, - {"id": 14349, "synset": "trichion.n.01", "name": "trichion"}, - {"id": 14350, "synset": "city.n.01", "name": "city"}, - {"id": 14351, "synset": "business_district.n.01", "name": "business_district"}, - {"id": 14352, "synset": "outskirts.n.01", "name": "outskirts"}, - {"id": 14353, "synset": "borough.n.01", "name": "borough"}, - {"id": 14354, "synset": "cow_pasture.n.01", "name": "cow_pasture"}, - {"id": 14355, "synset": "crest.n.01", "name": "crest"}, - {"id": 14356, "synset": "eparchy.n.02", "name": "eparchy"}, - {"id": 14357, "synset": "suburb.n.01", "name": "suburb"}, - {"id": 14358, "synset": "stockbroker_belt.n.01", "name": "stockbroker_belt"}, - {"id": 14359, "synset": "crawlspace.n.01", "name": "crawlspace"}, - {"id": 14360, "synset": "sheikdom.n.01", "name": "sheikdom"}, - {"id": 14361, "synset": "residence.n.01", "name": "residence"}, - {"id": 14362, "synset": "domicile.n.01", "name": "domicile"}, - {"id": 14363, "synset": "dude_ranch.n.01", "name": "dude_ranch"}, - {"id": 14364, "synset": "farmland.n.01", "name": "farmland"}, - {"id": 14365, "synset": "midfield.n.01", "name": "midfield"}, - {"id": 14366, "synset": "firebreak.n.01", "name": "firebreak"}, - {"id": 14367, "synset": "flea_market.n.01", "name": "flea_market"}, - {"id": 14368, "synset": "battlefront.n.01", "name": "battlefront"}, - {"id": 14369, "synset": "garbage_heap.n.01", "name": "garbage_heap"}, - {"id": 14370, "synset": "benthos.n.01", "name": "benthos"}, - {"id": 14371, "synset": "goldfield.n.01", "name": "goldfield"}, - {"id": 14372, "synset": "grainfield.n.01", "name": "grainfield"}, - {"id": 14373, "synset": "half-mast.n.01", "name": "half-mast"}, - {"id": 14374, "synset": "hemline.n.01", "name": "hemline"}, - {"id": 14375, "synset": "heronry.n.01", "name": "heronry"}, - {"id": 14376, "synset": "hipline.n.02", "name": "hipline"}, - {"id": 14377, "synset": "hipline.n.01", "name": "hipline"}, - {"id": 14378, "synset": "hole-in-the-wall.n.01", "name": "hole-in-the-wall"}, - {"id": 14379, "synset": "junkyard.n.01", "name": "junkyard"}, - {"id": 14380, "synset": "isoclinic_line.n.01", "name": "isoclinic_line"}, - {"id": 14381, "synset": "littoral.n.01", "name": "littoral"}, - {"id": 14382, "synset": "magnetic_pole.n.01", "name": "magnetic_pole"}, - {"id": 14383, "synset": "grassland.n.01", "name": "grassland"}, - {"id": 14384, "synset": "mecca.n.02", "name": "mecca"}, - {"id": 14385, "synset": "observer's_meridian.n.01", "name": "observer's_meridian"}, - {"id": 14386, "synset": "prime_meridian.n.01", "name": "prime_meridian"}, - {"id": 14387, "synset": "nombril.n.01", "name": "nombril"}, - {"id": 14388, "synset": "no-parking_zone.n.01", "name": "no-parking_zone"}, - {"id": 14389, "synset": "outdoors.n.01", "name": "outdoors"}, - {"id": 14390, "synset": "fairground.n.01", "name": "fairground"}, - {"id": 14391, "synset": "pasture.n.01", "name": "pasture"}, - {"id": 14392, "synset": "perihelion.n.01", "name": "perihelion"}, - {"id": 14393, "synset": "periselene.n.01", "name": "periselene"}, - {"id": 14394, "synset": "locus_of_infection.n.01", "name": "locus_of_infection"}, - {"id": 14395, "synset": "kasbah.n.01", "name": "kasbah"}, - {"id": 14396, "synset": "waterfront.n.01", "name": "waterfront"}, - {"id": 14397, "synset": "resort.n.01", "name": "resort"}, - {"id": 14398, "synset": "resort_area.n.01", "name": "resort_area"}, - {"id": 14399, "synset": "rough.n.01", "name": "rough"}, - {"id": 14400, "synset": "ashram.n.02", "name": "ashram"}, - {"id": 14401, "synset": "harborage.n.01", "name": "harborage"}, - {"id": 14402, "synset": "scrubland.n.01", "name": "scrubland"}, - {"id": 14403, "synset": "weald.n.01", "name": "weald"}, - {"id": 14404, "synset": "wold.n.01", "name": "wold"}, - {"id": 14405, "synset": "schoolyard.n.01", "name": "schoolyard"}, - {"id": 14406, "synset": "showplace.n.01", "name": "showplace"}, - {"id": 14407, "synset": "bedside.n.01", "name": "bedside"}, - {"id": 14408, "synset": "sideline.n.01", "name": "sideline"}, - {"id": 14409, "synset": "ski_resort.n.01", "name": "ski_resort"}, - {"id": 14410, "synset": "soil_horizon.n.01", "name": "soil_horizon"}, - {"id": 14411, "synset": "geological_horizon.n.01", "name": "geological_horizon"}, - {"id": 14412, "synset": "coal_seam.n.01", "name": "coal_seam"}, - {"id": 14413, "synset": "coalface.n.01", "name": "coalface"}, - {"id": 14414, "synset": "field.n.14", "name": "field"}, - {"id": 14415, "synset": "oilfield.n.01", "name": "oilfield"}, - {"id": 14416, "synset": "temperate_zone.n.01", "name": "Temperate_Zone"}, - {"id": 14417, "synset": "terreplein.n.01", "name": "terreplein"}, - {"id": 14418, "synset": "three-mile_limit.n.01", "name": "three-mile_limit"}, - {"id": 14419, "synset": "desktop.n.01", "name": "desktop"}, - {"id": 14420, "synset": "top.n.01", "name": "top"}, - {"id": 14421, "synset": "kampong.n.01", "name": "kampong"}, - {"id": 14422, "synset": "subtropics.n.01", "name": "subtropics"}, - {"id": 14423, "synset": "barrio.n.02", "name": "barrio"}, - {"id": 14424, "synset": "veld.n.01", "name": "veld"}, - {"id": 14425, "synset": "vertex.n.02", "name": "vertex"}, - {"id": 14426, "synset": "waterline.n.01", "name": "waterline"}, - {"id": 14427, "synset": "high-water_mark.n.01", "name": "high-water_mark"}, - {"id": 14428, "synset": "low-water_mark.n.02", "name": "low-water_mark"}, - {"id": 14429, "synset": "continental_divide.n.01", "name": "continental_divide"}, - {"id": 14430, "synset": "zodiac.n.01", "name": "zodiac"}, - {"id": 14431, "synset": "aegean_island.n.01", "name": "Aegean_island"}, - {"id": 14432, "synset": "sultanate.n.01", "name": "sultanate"}, - {"id": 14433, "synset": "swiss_canton.n.01", "name": "Swiss_canton"}, - {"id": 14434, "synset": "abyssal_zone.n.01", "name": "abyssal_zone"}, - {"id": 14435, "synset": "aerie.n.01", "name": "aerie"}, - {"id": 14436, "synset": "air_bubble.n.01", "name": "air_bubble"}, - {"id": 14437, "synset": "alluvial_flat.n.01", "name": "alluvial_flat"}, - {"id": 14438, "synset": "alp.n.01", "name": "alp"}, - {"id": 14439, "synset": "alpine_glacier.n.01", "name": "Alpine_glacier"}, - {"id": 14440, "synset": "anthill.n.01", "name": "anthill"}, - {"id": 14441, "synset": "aquifer.n.01", "name": "aquifer"}, - {"id": 14442, "synset": "archipelago.n.01", "name": "archipelago"}, - {"id": 14443, "synset": "arete.n.01", "name": "arete"}, - {"id": 14444, "synset": "arroyo.n.01", "name": "arroyo"}, - {"id": 14445, "synset": "ascent.n.01", "name": "ascent"}, - {"id": 14446, "synset": "asterism.n.02", "name": "asterism"}, - {"id": 14447, "synset": "asthenosphere.n.01", "name": "asthenosphere"}, - {"id": 14448, "synset": "atoll.n.01", "name": "atoll"}, - {"id": 14449, "synset": "bank.n.03", "name": "bank"}, - {"id": 14450, "synset": "bank.n.01", "name": "bank"}, - {"id": 14451, "synset": "bar.n.08", "name": "bar"}, - {"id": 14452, "synset": "barbecue_pit.n.01", "name": "barbecue_pit"}, - {"id": 14453, "synset": "barrier_reef.n.01", "name": "barrier_reef"}, - {"id": 14454, "synset": "baryon.n.01", "name": "baryon"}, - {"id": 14455, "synset": "basin.n.03", "name": "basin"}, - {"id": 14456, "synset": "beach.n.01", "name": "beach"}, - {"id": 14457, "synset": "honeycomb.n.01", "name": "honeycomb"}, - {"id": 14458, "synset": "belay.n.01", "name": "belay"}, - {"id": 14459, "synset": "ben.n.01", "name": "ben"}, - {"id": 14460, "synset": "berm.n.01", "name": "berm"}, - {"id": 14461, "synset": "bladder_stone.n.01", "name": "bladder_stone"}, - {"id": 14462, "synset": "bluff.n.01", "name": "bluff"}, - {"id": 14463, "synset": "borrow_pit.n.01", "name": "borrow_pit"}, - {"id": 14464, "synset": "brae.n.01", "name": "brae"}, - {"id": 14465, "synset": "bubble.n.01", "name": "bubble"}, - {"id": 14466, "synset": "burrow.n.01", "name": "burrow"}, - {"id": 14467, "synset": "butte.n.01", "name": "butte"}, - {"id": 14468, "synset": "caldera.n.01", "name": "caldera"}, - {"id": 14469, "synset": "canyon.n.01", "name": "canyon"}, - {"id": 14470, "synset": "canyonside.n.01", "name": "canyonside"}, - {"id": 14471, "synset": "cave.n.01", "name": "cave"}, - {"id": 14472, "synset": "cavern.n.02", "name": "cavern"}, - {"id": 14473, "synset": "chasm.n.01", "name": "chasm"}, - {"id": 14474, "synset": "cirque.n.01", "name": "cirque"}, - {"id": 14475, "synset": "cliff.n.01", "name": "cliff"}, - {"id": 14476, "synset": "cloud.n.02", "name": "cloud"}, - {"id": 14477, "synset": "coast.n.02", "name": "coast"}, - {"id": 14478, "synset": "coastland.n.01", "name": "coastland"}, - {"id": 14479, "synset": "col.n.01", "name": "col"}, - {"id": 14480, "synset": "collector.n.03", "name": "collector"}, - {"id": 14481, "synset": "comet.n.01", "name": "comet"}, - {"id": 14482, "synset": "continental_glacier.n.01", "name": "continental_glacier"}, - {"id": 14483, "synset": "coral_reef.n.01", "name": "coral_reef"}, - {"id": 14484, "synset": "cove.n.02", "name": "cove"}, - {"id": 14485, "synset": "crag.n.01", "name": "crag"}, - {"id": 14486, "synset": "crater.n.03", "name": "crater"}, - {"id": 14487, "synset": "cultivated_land.n.01", "name": "cultivated_land"}, - {"id": 14488, "synset": "dale.n.01", "name": "dale"}, - {"id": 14489, "synset": "defile.n.01", "name": "defile"}, - {"id": 14490, "synset": "delta.n.01", "name": "delta"}, - {"id": 14491, "synset": "descent.n.05", "name": "descent"}, - {"id": 14492, "synset": "diapir.n.01", "name": "diapir"}, - {"id": 14493, "synset": "divot.n.02", "name": "divot"}, - {"id": 14494, "synset": "divot.n.01", "name": "divot"}, - {"id": 14495, "synset": "down.n.04", "name": "down"}, - {"id": 14496, "synset": "downhill.n.01", "name": "downhill"}, - {"id": 14497, "synset": "draw.n.01", "name": "draw"}, - {"id": 14498, "synset": "drey.n.01", "name": "drey"}, - {"id": 14499, "synset": "drumlin.n.01", "name": "drumlin"}, - {"id": 14500, "synset": "dune.n.01", "name": "dune"}, - {"id": 14501, "synset": "escarpment.n.01", "name": "escarpment"}, - {"id": 14502, "synset": "esker.n.01", "name": "esker"}, - {"id": 14503, "synset": "fireball.n.03", "name": "fireball"}, - {"id": 14504, "synset": "flare_star.n.01", "name": "flare_star"}, - {"id": 14505, "synset": "floor.n.04", "name": "floor"}, - {"id": 14506, "synset": "fomite.n.01", "name": "fomite"}, - {"id": 14507, "synset": "foothill.n.01", "name": "foothill"}, - {"id": 14508, "synset": "footwall.n.01", "name": "footwall"}, - {"id": 14509, "synset": "foreland.n.02", "name": "foreland"}, - {"id": 14510, "synset": "foreshore.n.01", "name": "foreshore"}, - {"id": 14511, "synset": "gauge_boson.n.01", "name": "gauge_boson"}, - {"id": 14512, "synset": "geological_formation.n.01", "name": "geological_formation"}, - {"id": 14513, "synset": "geyser.n.01", "name": "geyser"}, - {"id": 14514, "synset": "glacier.n.01", "name": "glacier"}, - {"id": 14515, "synset": "glen.n.01", "name": "glen"}, - {"id": 14516, "synset": "gopher_hole.n.01", "name": "gopher_hole"}, - {"id": 14517, "synset": "gorge.n.01", "name": "gorge"}, - {"id": 14518, "synset": "grotto.n.01", "name": "grotto"}, - {"id": 14519, "synset": "growler.n.02", "name": "growler"}, - {"id": 14520, "synset": "gulch.n.01", "name": "gulch"}, - {"id": 14521, "synset": "gully.n.01", "name": "gully"}, - {"id": 14522, "synset": "hail.n.02", "name": "hail"}, - {"id": 14523, "synset": "highland.n.01", "name": "highland"}, - {"id": 14524, "synset": "hill.n.01", "name": "hill"}, - {"id": 14525, "synset": "hillside.n.01", "name": "hillside"}, - {"id": 14526, "synset": "hole.n.05", "name": "hole"}, - {"id": 14527, "synset": "hollow.n.02", "name": "hollow"}, - {"id": 14528, "synset": "hot_spring.n.01", "name": "hot_spring"}, - {"id": 14529, "synset": "iceberg.n.01", "name": "iceberg"}, - {"id": 14530, "synset": "icecap.n.01", "name": "icecap"}, - {"id": 14531, "synset": "ice_field.n.01", "name": "ice_field"}, - {"id": 14532, "synset": "ice_floe.n.01", "name": "ice_floe"}, - {"id": 14533, "synset": "ice_mass.n.01", "name": "ice_mass"}, - {"id": 14534, "synset": "inclined_fault.n.01", "name": "inclined_fault"}, - {"id": 14535, "synset": "ion.n.01", "name": "ion"}, - {"id": 14536, "synset": "isthmus.n.01", "name": "isthmus"}, - {"id": 14537, "synset": "kidney_stone.n.01", "name": "kidney_stone"}, - {"id": 14538, "synset": "knoll.n.01", "name": "knoll"}, - {"id": 14539, "synset": "kopje.n.01", "name": "kopje"}, - {"id": 14540, "synset": "kuiper_belt.n.01", "name": "Kuiper_belt"}, - {"id": 14541, "synset": "lake_bed.n.01", "name": "lake_bed"}, - {"id": 14542, "synset": "lakefront.n.01", "name": "lakefront"}, - {"id": 14543, "synset": "lakeside.n.01", "name": "lakeside"}, - {"id": 14544, "synset": "landfall.n.01", "name": "landfall"}, - {"id": 14545, "synset": "landfill.n.01", "name": "landfill"}, - {"id": 14546, "synset": "lather.n.04", "name": "lather"}, - {"id": 14547, "synset": "leak.n.01", "name": "leak"}, - {"id": 14548, "synset": "ledge.n.01", "name": "ledge"}, - {"id": 14549, "synset": "lepton.n.02", "name": "lepton"}, - {"id": 14550, "synset": "lithosphere.n.01", "name": "lithosphere"}, - {"id": 14551, "synset": "lowland.n.01", "name": "lowland"}, - {"id": 14552, "synset": "lunar_crater.n.01", "name": "lunar_crater"}, - {"id": 14553, "synset": "maar.n.01", "name": "maar"}, - {"id": 14554, "synset": "massif.n.01", "name": "massif"}, - {"id": 14555, "synset": "meander.n.01", "name": "meander"}, - {"id": 14556, "synset": "mesa.n.01", "name": "mesa"}, - {"id": 14557, "synset": "meteorite.n.01", "name": "meteorite"}, - {"id": 14558, "synset": "microfossil.n.01", "name": "microfossil"}, - {"id": 14559, "synset": "midstream.n.01", "name": "midstream"}, - {"id": 14560, "synset": "molehill.n.01", "name": "molehill"}, - {"id": 14561, "synset": "monocline.n.01", "name": "monocline"}, - {"id": 14562, "synset": "mountain.n.01", "name": "mountain"}, - {"id": 14563, "synset": "mountainside.n.01", "name": "mountainside"}, - {"id": 14564, "synset": "mouth.n.04", "name": "mouth"}, - {"id": 14565, "synset": "mull.n.01", "name": "mull"}, - {"id": 14566, "synset": "natural_depression.n.01", "name": "natural_depression"}, - {"id": 14567, "synset": "natural_elevation.n.01", "name": "natural_elevation"}, - {"id": 14568, "synset": "nullah.n.01", "name": "nullah"}, - {"id": 14569, "synset": "ocean.n.01", "name": "ocean"}, - {"id": 14570, "synset": "ocean_floor.n.01", "name": "ocean_floor"}, - {"id": 14571, "synset": "oceanfront.n.01", "name": "oceanfront"}, - {"id": 14572, "synset": "outcrop.n.01", "name": "outcrop"}, - {"id": 14573, "synset": "oxbow.n.01", "name": "oxbow"}, - {"id": 14574, "synset": "pallasite.n.01", "name": "pallasite"}, - {"id": 14575, "synset": "perforation.n.02", "name": "perforation"}, - {"id": 14576, "synset": "photosphere.n.01", "name": "photosphere"}, - {"id": 14577, "synset": "piedmont.n.02", "name": "piedmont"}, - {"id": 14578, "synset": "piedmont_glacier.n.01", "name": "Piedmont_glacier"}, - {"id": 14579, "synset": "pinetum.n.01", "name": "pinetum"}, - {"id": 14580, "synset": "plage.n.01", "name": "plage"}, - {"id": 14581, "synset": "plain.n.01", "name": "plain"}, - {"id": 14582, "synset": "point.n.11", "name": "point"}, - {"id": 14583, "synset": "polar_glacier.n.01", "name": "polar_glacier"}, - {"id": 14584, "synset": "pothole.n.01", "name": "pothole"}, - {"id": 14585, "synset": "precipice.n.01", "name": "precipice"}, - {"id": 14586, "synset": "promontory.n.01", "name": "promontory"}, - {"id": 14587, "synset": "ptyalith.n.01", "name": "ptyalith"}, - {"id": 14588, "synset": "pulsar.n.01", "name": "pulsar"}, - {"id": 14589, "synset": "quicksand.n.02", "name": "quicksand"}, - {"id": 14590, "synset": "rabbit_burrow.n.01", "name": "rabbit_burrow"}, - {"id": 14591, "synset": "radiator.n.01", "name": "radiator"}, - {"id": 14592, "synset": "rainbow.n.01", "name": "rainbow"}, - {"id": 14593, "synset": "range.n.04", "name": "range"}, - {"id": 14594, "synset": "rangeland.n.01", "name": "rangeland"}, - {"id": 14595, "synset": "ravine.n.01", "name": "ravine"}, - {"id": 14596, "synset": "reef.n.01", "name": "reef"}, - {"id": 14597, "synset": "ridge.n.01", "name": "ridge"}, - {"id": 14598, "synset": "ridge.n.04", "name": "ridge"}, - {"id": 14599, "synset": "rift_valley.n.01", "name": "rift_valley"}, - {"id": 14600, "synset": "riparian_forest.n.01", "name": "riparian_forest"}, - {"id": 14601, "synset": "ripple_mark.n.01", "name": "ripple_mark"}, - {"id": 14602, "synset": "riverbank.n.01", "name": "riverbank"}, - {"id": 14603, "synset": "riverbed.n.01", "name": "riverbed"}, - {"id": 14604, "synset": "rock.n.01", "name": "rock"}, - {"id": 14605, "synset": "roof.n.03", "name": "roof"}, - {"id": 14606, "synset": "saltpan.n.01", "name": "saltpan"}, - {"id": 14607, "synset": "sandbank.n.01", "name": "sandbank"}, - {"id": 14608, "synset": "sandbar.n.01", "name": "sandbar"}, - {"id": 14609, "synset": "sandpit.n.01", "name": "sandpit"}, - {"id": 14610, "synset": "sanitary_landfill.n.01", "name": "sanitary_landfill"}, - {"id": 14611, "synset": "sawpit.n.01", "name": "sawpit"}, - {"id": 14612, "synset": "scablands.n.01", "name": "scablands"}, - {"id": 14613, "synset": "seashore.n.01", "name": "seashore"}, - {"id": 14614, "synset": "seaside.n.01", "name": "seaside"}, - {"id": 14615, "synset": "seif_dune.n.01", "name": "seif_dune"}, - {"id": 14616, "synset": "shell.n.06", "name": "shell"}, - {"id": 14617, "synset": "shiner.n.02", "name": "shiner"}, - {"id": 14618, "synset": "shoal.n.01", "name": "shoal"}, - {"id": 14619, "synset": "shore.n.01", "name": "shore"}, - {"id": 14620, "synset": "shoreline.n.01", "name": "shoreline"}, - {"id": 14621, "synset": "sinkhole.n.01", "name": "sinkhole"}, - {"id": 14622, "synset": "ski_slope.n.01", "name": "ski_slope"}, - {"id": 14623, "synset": "sky.n.01", "name": "sky"}, - {"id": 14624, "synset": "slope.n.01", "name": "slope"}, - {"id": 14625, "synset": "snowcap.n.01", "name": "snowcap"}, - {"id": 14626, "synset": "snowdrift.n.01", "name": "snowdrift"}, - {"id": 14627, "synset": "snowfield.n.01", "name": "snowfield"}, - {"id": 14628, "synset": "soapsuds.n.01", "name": "soapsuds"}, - {"id": 14629, "synset": "spit.n.01", "name": "spit"}, - {"id": 14630, "synset": "spoor.n.01", "name": "spoor"}, - {"id": 14631, "synset": "spume.n.01", "name": "spume"}, - {"id": 14632, "synset": "star.n.03", "name": "star"}, - {"id": 14633, "synset": "steep.n.01", "name": "steep"}, - {"id": 14634, "synset": "steppe.n.01", "name": "steppe"}, - {"id": 14635, "synset": "strand.n.05", "name": "strand"}, - {"id": 14636, "synset": "streambed.n.01", "name": "streambed"}, - {"id": 14637, "synset": "sun.n.01", "name": "sun"}, - {"id": 14638, "synset": "supernova.n.01", "name": "supernova"}, - {"id": 14639, "synset": "swale.n.01", "name": "swale"}, - {"id": 14640, "synset": "swamp.n.01", "name": "swamp"}, - {"id": 14641, "synset": "swell.n.02", "name": "swell"}, - {"id": 14642, "synset": "tableland.n.01", "name": "tableland"}, - {"id": 14643, "synset": "talus.n.01", "name": "talus"}, - {"id": 14644, "synset": "tangle.n.01", "name": "tangle"}, - {"id": 14645, "synset": "tar_pit.n.01", "name": "tar_pit"}, - {"id": 14646, "synset": "terrace.n.02", "name": "terrace"}, - {"id": 14647, "synset": "tidal_basin.n.01", "name": "tidal_basin"}, - {"id": 14648, "synset": "tideland.n.01", "name": "tideland"}, - {"id": 14649, "synset": "tor.n.02", "name": "tor"}, - {"id": 14650, "synset": "tor.n.01", "name": "tor"}, - {"id": 14651, "synset": "trapezium.n.02", "name": "Trapezium"}, - {"id": 14652, "synset": "troposphere.n.01", "name": "troposphere"}, - {"id": 14653, "synset": "tundra.n.01", "name": "tundra"}, - {"id": 14654, "synset": "twinkler.n.01", "name": "twinkler"}, - {"id": 14655, "synset": "uphill.n.01", "name": "uphill"}, - {"id": 14656, "synset": "urolith.n.01", "name": "urolith"}, - {"id": 14657, "synset": "valley.n.01", "name": "valley"}, - { - "id": 14658, - "synset": "vehicle-borne_transmission.n.01", - "name": "vehicle-borne_transmission", - }, - {"id": 14659, "synset": "vein.n.04", "name": "vein"}, - {"id": 14660, "synset": "volcanic_crater.n.01", "name": "volcanic_crater"}, - {"id": 14661, "synset": "volcano.n.02", "name": "volcano"}, - {"id": 14662, "synset": "wadi.n.01", "name": "wadi"}, - {"id": 14663, "synset": "wall.n.05", "name": "wall"}, - {"id": 14664, "synset": "warren.n.03", "name": "warren"}, - {"id": 14665, "synset": "wasp's_nest.n.01", "name": "wasp's_nest"}, - {"id": 14666, "synset": "watercourse.n.01", "name": "watercourse"}, - {"id": 14667, "synset": "waterside.n.01", "name": "waterside"}, - {"id": 14668, "synset": "water_table.n.01", "name": "water_table"}, - {"id": 14669, "synset": "whinstone.n.01", "name": "whinstone"}, - {"id": 14670, "synset": "wormcast.n.02", "name": "wormcast"}, - {"id": 14671, "synset": "xenolith.n.01", "name": "xenolith"}, - {"id": 14672, "synset": "circe.n.01", "name": "Circe"}, - {"id": 14673, "synset": "gryphon.n.01", "name": "gryphon"}, - {"id": 14674, "synset": "spiritual_leader.n.01", "name": "spiritual_leader"}, - {"id": 14675, "synset": "messiah.n.01", "name": "messiah"}, - {"id": 14676, "synset": "rhea_silvia.n.01", "name": "Rhea_Silvia"}, - {"id": 14677, "synset": "number_one.n.01", "name": "number_one"}, - {"id": 14678, "synset": "adventurer.n.01", "name": "adventurer"}, - {"id": 14679, "synset": "anomaly.n.02", "name": "anomaly"}, - {"id": 14680, "synset": "appointee.n.02", "name": "appointee"}, - {"id": 14681, "synset": "argonaut.n.01", "name": "argonaut"}, - {"id": 14682, "synset": "ashkenazi.n.01", "name": "Ashkenazi"}, - {"id": 14683, "synset": "benefactor.n.01", "name": "benefactor"}, - {"id": 14684, "synset": "color-blind_person.n.01", "name": "color-blind_person"}, - {"id": 14685, "synset": "commoner.n.01", "name": "commoner"}, - {"id": 14686, "synset": "conservator.n.02", "name": "conservator"}, - {"id": 14687, "synset": "contrarian.n.01", "name": "contrarian"}, - {"id": 14688, "synset": "contadino.n.01", "name": "contadino"}, - {"id": 14689, "synset": "contestant.n.01", "name": "contestant"}, - {"id": 14690, "synset": "cosigner.n.01", "name": "cosigner"}, - {"id": 14691, "synset": "discussant.n.01", "name": "discussant"}, - {"id": 14692, "synset": "enologist.n.01", "name": "enologist"}, - {"id": 14693, "synset": "entertainer.n.01", "name": "entertainer"}, - {"id": 14694, "synset": "eulogist.n.01", "name": "eulogist"}, - {"id": 14695, "synset": "ex-gambler.n.01", "name": "ex-gambler"}, - {"id": 14696, "synset": "experimenter.n.01", "name": "experimenter"}, - {"id": 14697, "synset": "experimenter.n.02", "name": "experimenter"}, - {"id": 14698, "synset": "exponent.n.02", "name": "exponent"}, - {"id": 14699, "synset": "ex-president.n.01", "name": "ex-president"}, - {"id": 14700, "synset": "face.n.05", "name": "face"}, - {"id": 14701, "synset": "female.n.02", "name": "female"}, - {"id": 14702, "synset": "finisher.n.04", "name": "finisher"}, - {"id": 14703, "synset": "inhabitant.n.01", "name": "inhabitant"}, - {"id": 14704, "synset": "native.n.01", "name": "native"}, - {"id": 14705, "synset": "native.n.02", "name": "native"}, - {"id": 14706, "synset": "juvenile.n.01", "name": "juvenile"}, - {"id": 14707, "synset": "lover.n.01", "name": "lover"}, - {"id": 14708, "synset": "male.n.02", "name": "male"}, - {"id": 14709, "synset": "mediator.n.01", "name": "mediator"}, - {"id": 14710, "synset": "mediatrix.n.01", "name": "mediatrix"}, - {"id": 14711, "synset": "national.n.01", "name": "national"}, - {"id": 14712, "synset": "peer.n.01", "name": "peer"}, - {"id": 14713, "synset": "prize_winner.n.01", "name": "prize_winner"}, - {"id": 14714, "synset": "recipient.n.01", "name": "recipient"}, - {"id": 14715, "synset": "religionist.n.01", "name": "religionist"}, - {"id": 14716, "synset": "sensualist.n.01", "name": "sensualist"}, - {"id": 14717, "synset": "traveler.n.01", "name": "traveler"}, - {"id": 14718, "synset": "unwelcome_person.n.01", "name": "unwelcome_person"}, - {"id": 14719, "synset": "unskilled_person.n.01", "name": "unskilled_person"}, - {"id": 14720, "synset": "worker.n.01", "name": "worker"}, - {"id": 14721, "synset": "wrongdoer.n.01", "name": "wrongdoer"}, - {"id": 14722, "synset": "black_african.n.01", "name": "Black_African"}, - {"id": 14723, "synset": "afrikaner.n.01", "name": "Afrikaner"}, - {"id": 14724, "synset": "aryan.n.01", "name": "Aryan"}, - {"id": 14725, "synset": "black.n.05", "name": "Black"}, - {"id": 14726, "synset": "black_woman.n.01", "name": "Black_woman"}, - {"id": 14727, "synset": "mulatto.n.01", "name": "mulatto"}, - {"id": 14728, "synset": "white.n.01", "name": "White"}, - {"id": 14729, "synset": "circassian.n.01", "name": "Circassian"}, - {"id": 14730, "synset": "semite.n.01", "name": "Semite"}, - {"id": 14731, "synset": "chaldean.n.02", "name": "Chaldean"}, - {"id": 14732, "synset": "elamite.n.01", "name": "Elamite"}, - {"id": 14733, "synset": "white_man.n.01", "name": "white_man"}, - {"id": 14734, "synset": "wasp.n.01", "name": "WASP"}, - {"id": 14735, "synset": "gook.n.02", "name": "gook"}, - {"id": 14736, "synset": "mongol.n.01", "name": "Mongol"}, - {"id": 14737, "synset": "tatar.n.01", "name": "Tatar"}, - {"id": 14738, "synset": "nahuatl.n.01", "name": "Nahuatl"}, - {"id": 14739, "synset": "aztec.n.01", "name": "Aztec"}, - {"id": 14740, "synset": "olmec.n.01", "name": "Olmec"}, - {"id": 14741, "synset": "biloxi.n.01", "name": "Biloxi"}, - {"id": 14742, "synset": "blackfoot.n.01", "name": "Blackfoot"}, - {"id": 14743, "synset": "brule.n.01", "name": "Brule"}, - {"id": 14744, "synset": "caddo.n.01", "name": "Caddo"}, - {"id": 14745, "synset": "cheyenne.n.03", "name": "Cheyenne"}, - {"id": 14746, "synset": "chickasaw.n.01", "name": "Chickasaw"}, - {"id": 14747, "synset": "cocopa.n.01", "name": "Cocopa"}, - {"id": 14748, "synset": "comanche.n.01", "name": "Comanche"}, - {"id": 14749, "synset": "creek.n.02", "name": "Creek"}, - {"id": 14750, "synset": "delaware.n.02", "name": "Delaware"}, - {"id": 14751, "synset": "diegueno.n.01", "name": "Diegueno"}, - {"id": 14752, "synset": "esselen.n.01", "name": "Esselen"}, - {"id": 14753, "synset": "eyeish.n.01", "name": "Eyeish"}, - {"id": 14754, "synset": "havasupai.n.01", "name": "Havasupai"}, - {"id": 14755, "synset": "hunkpapa.n.01", "name": "Hunkpapa"}, - {"id": 14756, "synset": "iowa.n.01", "name": "Iowa"}, - {"id": 14757, "synset": "kalapooia.n.01", "name": "Kalapooia"}, - {"id": 14758, "synset": "kamia.n.01", "name": "Kamia"}, - {"id": 14759, "synset": "kekchi.n.01", "name": "Kekchi"}, - {"id": 14760, "synset": "kichai.n.01", "name": "Kichai"}, - {"id": 14761, "synset": "kickapoo.n.01", "name": "Kickapoo"}, - {"id": 14762, "synset": "kiliwa.n.01", "name": "Kiliwa"}, - {"id": 14763, "synset": "malecite.n.01", "name": "Malecite"}, - {"id": 14764, "synset": "maricopa.n.01", "name": "Maricopa"}, - {"id": 14765, "synset": "mohican.n.01", "name": "Mohican"}, - {"id": 14766, "synset": "muskhogean.n.01", "name": "Muskhogean"}, - {"id": 14767, "synset": "navaho.n.01", "name": "Navaho"}, - {"id": 14768, "synset": "nootka.n.01", "name": "Nootka"}, - {"id": 14769, "synset": "oglala.n.01", "name": "Oglala"}, - {"id": 14770, "synset": "osage.n.01", "name": "Osage"}, - {"id": 14771, "synset": "oneida.n.01", "name": "Oneida"}, - {"id": 14772, "synset": "paiute.n.01", "name": "Paiute"}, - {"id": 14773, "synset": "passamaquody.n.01", "name": "Passamaquody"}, - {"id": 14774, "synset": "penobscot.n.01", "name": "Penobscot"}, - {"id": 14775, "synset": "penutian.n.02", "name": "Penutian"}, - {"id": 14776, "synset": "potawatomi.n.01", "name": "Potawatomi"}, - {"id": 14777, "synset": "powhatan.n.02", "name": "Powhatan"}, - {"id": 14778, "synset": "kachina.n.02", "name": "kachina"}, - {"id": 14779, "synset": "salish.n.02", "name": "Salish"}, - {"id": 14780, "synset": "shahaptian.n.01", "name": "Shahaptian"}, - {"id": 14781, "synset": "shasta.n.01", "name": "Shasta"}, - {"id": 14782, "synset": "shawnee.n.01", "name": "Shawnee"}, - {"id": 14783, "synset": "sihasapa.n.01", "name": "Sihasapa"}, - {"id": 14784, "synset": "teton.n.01", "name": "Teton"}, - {"id": 14785, "synset": "taracahitian.n.01", "name": "Taracahitian"}, - {"id": 14786, "synset": "tarahumara.n.01", "name": "Tarahumara"}, - {"id": 14787, "synset": "tuscarora.n.01", "name": "Tuscarora"}, - {"id": 14788, "synset": "tutelo.n.01", "name": "Tutelo"}, - {"id": 14789, "synset": "yana.n.01", "name": "Yana"}, - {"id": 14790, "synset": "yavapai.n.01", "name": "Yavapai"}, - {"id": 14791, "synset": "yokuts.n.02", "name": "Yokuts"}, - {"id": 14792, "synset": "yuma.n.01", "name": "Yuma"}, - {"id": 14793, "synset": "gadaba.n.01", "name": "Gadaba"}, - {"id": 14794, "synset": "kolam.n.01", "name": "Kolam"}, - {"id": 14795, "synset": "kui.n.01", "name": "Kui"}, - {"id": 14796, "synset": "toda.n.01", "name": "Toda"}, - {"id": 14797, "synset": "tulu.n.01", "name": "Tulu"}, - {"id": 14798, "synset": "gujarati.n.01", "name": "Gujarati"}, - {"id": 14799, "synset": "kashmiri.n.01", "name": "Kashmiri"}, - {"id": 14800, "synset": "punjabi.n.01", "name": "Punjabi"}, - {"id": 14801, "synset": "slav.n.01", "name": "Slav"}, - {"id": 14802, "synset": "anabaptist.n.01", "name": "Anabaptist"}, - {"id": 14803, "synset": "adventist.n.01", "name": "Adventist"}, - {"id": 14804, "synset": "gentile.n.03", "name": "gentile"}, - {"id": 14805, "synset": "gentile.n.02", "name": "gentile"}, - {"id": 14806, "synset": "catholic.n.01", "name": "Catholic"}, - {"id": 14807, "synset": "old_catholic.n.01", "name": "Old_Catholic"}, - {"id": 14808, "synset": "uniat.n.01", "name": "Uniat"}, - {"id": 14809, "synset": "copt.n.02", "name": "Copt"}, - {"id": 14810, "synset": "jewess.n.01", "name": "Jewess"}, - {"id": 14811, "synset": "jihadist.n.01", "name": "Jihadist"}, - {"id": 14812, "synset": "buddhist.n.01", "name": "Buddhist"}, - {"id": 14813, "synset": "zen_buddhist.n.01", "name": "Zen_Buddhist"}, - {"id": 14814, "synset": "mahayanist.n.01", "name": "Mahayanist"}, - {"id": 14815, "synset": "swami.n.01", "name": "swami"}, - {"id": 14816, "synset": "hare_krishna.n.01", "name": "Hare_Krishna"}, - {"id": 14817, "synset": "shintoist.n.01", "name": "Shintoist"}, - {"id": 14818, "synset": "eurafrican.n.01", "name": "Eurafrican"}, - {"id": 14819, "synset": "eurasian.n.01", "name": "Eurasian"}, - {"id": 14820, "synset": "gael.n.01", "name": "Gael"}, - {"id": 14821, "synset": "frank.n.01", "name": "Frank"}, - {"id": 14822, "synset": "afghan.n.02", "name": "Afghan"}, - {"id": 14823, "synset": "albanian.n.01", "name": "Albanian"}, - {"id": 14824, "synset": "algerian.n.01", "name": "Algerian"}, - {"id": 14825, "synset": "altaic.n.01", "name": "Altaic"}, - {"id": 14826, "synset": "andorran.n.01", "name": "Andorran"}, - {"id": 14827, "synset": "angolan.n.01", "name": "Angolan"}, - {"id": 14828, "synset": "anguillan.n.01", "name": "Anguillan"}, - {"id": 14829, "synset": "austrian.n.01", "name": "Austrian"}, - {"id": 14830, "synset": "bahamian.n.01", "name": "Bahamian"}, - {"id": 14831, "synset": "bahraini.n.01", "name": "Bahraini"}, - {"id": 14832, "synset": "basotho.n.01", "name": "Basotho"}, - {"id": 14833, "synset": "herero.n.01", "name": "Herero"}, - {"id": 14834, "synset": "luba.n.01", "name": "Luba"}, - {"id": 14835, "synset": "barbadian.n.01", "name": "Barbadian"}, - {"id": 14836, "synset": "bolivian.n.01", "name": "Bolivian"}, - {"id": 14837, "synset": "bornean.n.01", "name": "Bornean"}, - {"id": 14838, "synset": "carioca.n.01", "name": "Carioca"}, - {"id": 14839, "synset": "tupi.n.01", "name": "Tupi"}, - {"id": 14840, "synset": "bruneian.n.01", "name": "Bruneian"}, - {"id": 14841, "synset": "bulgarian.n.01", "name": "Bulgarian"}, - {"id": 14842, "synset": "byelorussian.n.01", "name": "Byelorussian"}, - {"id": 14843, "synset": "cameroonian.n.01", "name": "Cameroonian"}, - {"id": 14844, "synset": "canadian.n.01", "name": "Canadian"}, - {"id": 14845, "synset": "french_canadian.n.01", "name": "French_Canadian"}, - {"id": 14846, "synset": "central_american.n.01", "name": "Central_American"}, - {"id": 14847, "synset": "chilean.n.01", "name": "Chilean"}, - {"id": 14848, "synset": "congolese.n.01", "name": "Congolese"}, - {"id": 14849, "synset": "cypriot.n.01", "name": "Cypriot"}, - {"id": 14850, "synset": "dane.n.01", "name": "Dane"}, - {"id": 14851, "synset": "djiboutian.n.01", "name": "Djiboutian"}, - {"id": 14852, "synset": "britisher.n.01", "name": "Britisher"}, - {"id": 14853, "synset": "english_person.n.01", "name": "English_person"}, - {"id": 14854, "synset": "englishwoman.n.01", "name": "Englishwoman"}, - {"id": 14855, "synset": "anglo-saxon.n.02", "name": "Anglo-Saxon"}, - {"id": 14856, "synset": "angle.n.03", "name": "Angle"}, - {"id": 14857, "synset": "west_saxon.n.01", "name": "West_Saxon"}, - {"id": 14858, "synset": "lombard.n.01", "name": "Lombard"}, - {"id": 14859, "synset": "limey.n.01", "name": "limey"}, - {"id": 14860, "synset": "cantabrigian.n.01", "name": "Cantabrigian"}, - {"id": 14861, "synset": "cornishman.n.01", "name": "Cornishman"}, - {"id": 14862, "synset": "cornishwoman.n.01", "name": "Cornishwoman"}, - {"id": 14863, "synset": "lancastrian.n.02", "name": "Lancastrian"}, - {"id": 14864, "synset": "lancastrian.n.01", "name": "Lancastrian"}, - {"id": 14865, "synset": "geordie.n.01", "name": "Geordie"}, - {"id": 14866, "synset": "oxonian.n.01", "name": "Oxonian"}, - {"id": 14867, "synset": "ethiopian.n.01", "name": "Ethiopian"}, - {"id": 14868, "synset": "amhara.n.01", "name": "Amhara"}, - {"id": 14869, "synset": "eritrean.n.01", "name": "Eritrean"}, - {"id": 14870, "synset": "finn.n.01", "name": "Finn"}, - {"id": 14871, "synset": "komi.n.01", "name": "Komi"}, - {"id": 14872, "synset": "livonian.n.01", "name": "Livonian"}, - {"id": 14873, "synset": "lithuanian.n.01", "name": "Lithuanian"}, - {"id": 14874, "synset": "selkup.n.01", "name": "Selkup"}, - {"id": 14875, "synset": "parisian.n.01", "name": "Parisian"}, - {"id": 14876, "synset": "parisienne.n.01", "name": "Parisienne"}, - {"id": 14877, "synset": "creole.n.02", "name": "Creole"}, - {"id": 14878, "synset": "creole.n.01", "name": "Creole"}, - {"id": 14879, "synset": "gabonese.n.01", "name": "Gabonese"}, - {"id": 14880, "synset": "greek.n.02", "name": "Greek"}, - {"id": 14881, "synset": "dorian.n.01", "name": "Dorian"}, - {"id": 14882, "synset": "athenian.n.01", "name": "Athenian"}, - {"id": 14883, "synset": "laconian.n.01", "name": "Laconian"}, - {"id": 14884, "synset": "guyanese.n.01", "name": "Guyanese"}, - {"id": 14885, "synset": "haitian.n.01", "name": "Haitian"}, - {"id": 14886, "synset": "malay.n.01", "name": "Malay"}, - {"id": 14887, "synset": "moro.n.01", "name": "Moro"}, - {"id": 14888, "synset": "netherlander.n.01", "name": "Netherlander"}, - {"id": 14889, "synset": "icelander.n.01", "name": "Icelander"}, - {"id": 14890, "synset": "iraqi.n.01", "name": "Iraqi"}, - {"id": 14891, "synset": "irishman.n.01", "name": "Irishman"}, - {"id": 14892, "synset": "irishwoman.n.01", "name": "Irishwoman"}, - {"id": 14893, "synset": "dubliner.n.01", "name": "Dubliner"}, - {"id": 14894, "synset": "italian.n.01", "name": "Italian"}, - {"id": 14895, "synset": "roman.n.01", "name": "Roman"}, - {"id": 14896, "synset": "sabine.n.02", "name": "Sabine"}, - {"id": 14897, "synset": "japanese.n.01", "name": "Japanese"}, - {"id": 14898, "synset": "jordanian.n.01", "name": "Jordanian"}, - {"id": 14899, "synset": "korean.n.01", "name": "Korean"}, - {"id": 14900, "synset": "kenyan.n.01", "name": "Kenyan"}, - {"id": 14901, "synset": "lao.n.01", "name": "Lao"}, - {"id": 14902, "synset": "lapp.n.01", "name": "Lapp"}, - {"id": 14903, "synset": "latin_american.n.01", "name": "Latin_American"}, - {"id": 14904, "synset": "lebanese.n.01", "name": "Lebanese"}, - {"id": 14905, "synset": "levantine.n.01", "name": "Levantine"}, - {"id": 14906, "synset": "liberian.n.01", "name": "Liberian"}, - {"id": 14907, "synset": "luxemburger.n.01", "name": "Luxemburger"}, - {"id": 14908, "synset": "macedonian.n.01", "name": "Macedonian"}, - {"id": 14909, "synset": "sabahan.n.01", "name": "Sabahan"}, - {"id": 14910, "synset": "mexican.n.01", "name": "Mexican"}, - {"id": 14911, "synset": "chicano.n.01", "name": "Chicano"}, - {"id": 14912, "synset": "mexican-american.n.01", "name": "Mexican-American"}, - {"id": 14913, "synset": "namibian.n.01", "name": "Namibian"}, - {"id": 14914, "synset": "nauruan.n.01", "name": "Nauruan"}, - {"id": 14915, "synset": "gurkha.n.02", "name": "Gurkha"}, - {"id": 14916, "synset": "new_zealander.n.01", "name": "New_Zealander"}, - {"id": 14917, "synset": "nicaraguan.n.01", "name": "Nicaraguan"}, - {"id": 14918, "synset": "nigerian.n.01", "name": "Nigerian"}, - {"id": 14919, "synset": "hausa.n.01", "name": "Hausa"}, - {"id": 14920, "synset": "north_american.n.01", "name": "North_American"}, - {"id": 14921, "synset": "nova_scotian.n.01", "name": "Nova_Scotian"}, - {"id": 14922, "synset": "omani.n.01", "name": "Omani"}, - {"id": 14923, "synset": "pakistani.n.01", "name": "Pakistani"}, - {"id": 14924, "synset": "brahui.n.01", "name": "Brahui"}, - {"id": 14925, "synset": "south_american_indian.n.01", "name": "South_American_Indian"}, - {"id": 14926, "synset": "carib.n.01", "name": "Carib"}, - {"id": 14927, "synset": "filipino.n.01", "name": "Filipino"}, - {"id": 14928, "synset": "polynesian.n.01", "name": "Polynesian"}, - {"id": 14929, "synset": "qatari.n.01", "name": "Qatari"}, - {"id": 14930, "synset": "romanian.n.01", "name": "Romanian"}, - {"id": 14931, "synset": "muscovite.n.02", "name": "Muscovite"}, - {"id": 14932, "synset": "georgian.n.02", "name": "Georgian"}, - {"id": 14933, "synset": "sarawakian.n.01", "name": "Sarawakian"}, - {"id": 14934, "synset": "scandinavian.n.01", "name": "Scandinavian"}, - {"id": 14935, "synset": "senegalese.n.01", "name": "Senegalese"}, - {"id": 14936, "synset": "slovene.n.01", "name": "Slovene"}, - {"id": 14937, "synset": "south_african.n.01", "name": "South_African"}, - {"id": 14938, "synset": "south_american.n.01", "name": "South_American"}, - {"id": 14939, "synset": "sudanese.n.01", "name": "Sudanese"}, - {"id": 14940, "synset": "syrian.n.01", "name": "Syrian"}, - {"id": 14941, "synset": "tahitian.n.01", "name": "Tahitian"}, - {"id": 14942, "synset": "tanzanian.n.01", "name": "Tanzanian"}, - {"id": 14943, "synset": "tibetan.n.02", "name": "Tibetan"}, - {"id": 14944, "synset": "togolese.n.01", "name": "Togolese"}, - {"id": 14945, "synset": "tuareg.n.01", "name": "Tuareg"}, - {"id": 14946, "synset": "turki.n.01", "name": "Turki"}, - {"id": 14947, "synset": "chuvash.n.01", "name": "Chuvash"}, - {"id": 14948, "synset": "turkoman.n.01", "name": "Turkoman"}, - {"id": 14949, "synset": "uzbek.n.01", "name": "Uzbek"}, - {"id": 14950, "synset": "ugandan.n.01", "name": "Ugandan"}, - {"id": 14951, "synset": "ukranian.n.01", "name": "Ukranian"}, - {"id": 14952, "synset": "yakut.n.01", "name": "Yakut"}, - {"id": 14953, "synset": "tungus.n.01", "name": "Tungus"}, - {"id": 14954, "synset": "igbo.n.01", "name": "Igbo"}, - {"id": 14955, "synset": "american.n.03", "name": "American"}, - {"id": 14956, "synset": "anglo-american.n.01", "name": "Anglo-American"}, - {"id": 14957, "synset": "alaska_native.n.01", "name": "Alaska_Native"}, - {"id": 14958, "synset": "arkansan.n.01", "name": "Arkansan"}, - {"id": 14959, "synset": "carolinian.n.01", "name": "Carolinian"}, - {"id": 14960, "synset": "coloradan.n.01", "name": "Coloradan"}, - {"id": 14961, "synset": "connecticuter.n.01", "name": "Connecticuter"}, - {"id": 14962, "synset": "delawarean.n.01", "name": "Delawarean"}, - {"id": 14963, "synset": "floridian.n.01", "name": "Floridian"}, - {"id": 14964, "synset": "german_american.n.01", "name": "German_American"}, - {"id": 14965, "synset": "illinoisan.n.01", "name": "Illinoisan"}, - {"id": 14966, "synset": "mainer.n.01", "name": "Mainer"}, - {"id": 14967, "synset": "marylander.n.01", "name": "Marylander"}, - {"id": 14968, "synset": "minnesotan.n.01", "name": "Minnesotan"}, - {"id": 14969, "synset": "nebraskan.n.01", "name": "Nebraskan"}, - {"id": 14970, "synset": "new_hampshirite.n.01", "name": "New_Hampshirite"}, - {"id": 14971, "synset": "new_jerseyan.n.01", "name": "New_Jerseyan"}, - {"id": 14972, "synset": "new_yorker.n.01", "name": "New_Yorker"}, - {"id": 14973, "synset": "north_carolinian.n.01", "name": "North_Carolinian"}, - {"id": 14974, "synset": "oregonian.n.01", "name": "Oregonian"}, - {"id": 14975, "synset": "pennsylvanian.n.02", "name": "Pennsylvanian"}, - {"id": 14976, "synset": "texan.n.01", "name": "Texan"}, - {"id": 14977, "synset": "utahan.n.01", "name": "Utahan"}, - {"id": 14978, "synset": "uruguayan.n.01", "name": "Uruguayan"}, - {"id": 14979, "synset": "vietnamese.n.01", "name": "Vietnamese"}, - {"id": 14980, "synset": "gambian.n.01", "name": "Gambian"}, - {"id": 14981, "synset": "east_german.n.01", "name": "East_German"}, - {"id": 14982, "synset": "berliner.n.01", "name": "Berliner"}, - {"id": 14983, "synset": "prussian.n.01", "name": "Prussian"}, - {"id": 14984, "synset": "ghanian.n.01", "name": "Ghanian"}, - {"id": 14985, "synset": "guinean.n.01", "name": "Guinean"}, - {"id": 14986, "synset": "papuan.n.01", "name": "Papuan"}, - {"id": 14987, "synset": "walloon.n.01", "name": "Walloon"}, - {"id": 14988, "synset": "yemeni.n.01", "name": "Yemeni"}, - {"id": 14989, "synset": "yugoslav.n.01", "name": "Yugoslav"}, - {"id": 14990, "synset": "serbian.n.01", "name": "Serbian"}, - {"id": 14991, "synset": "xhosa.n.01", "name": "Xhosa"}, - {"id": 14992, "synset": "zairese.n.01", "name": "Zairese"}, - {"id": 14993, "synset": "zimbabwean.n.01", "name": "Zimbabwean"}, - {"id": 14994, "synset": "zulu.n.01", "name": "Zulu"}, - {"id": 14995, "synset": "gemini.n.01", "name": "Gemini"}, - {"id": 14996, "synset": "sagittarius.n.01", "name": "Sagittarius"}, - {"id": 14997, "synset": "pisces.n.02", "name": "Pisces"}, - {"id": 14998, "synset": "abbe.n.01", "name": "abbe"}, - {"id": 14999, "synset": "abbess.n.01", "name": "abbess"}, - {"id": 15000, "synset": "abnegator.n.01", "name": "abnegator"}, - {"id": 15001, "synset": "abridger.n.01", "name": "abridger"}, - {"id": 15002, "synset": "abstractor.n.01", "name": "abstractor"}, - {"id": 15003, "synset": "absconder.n.01", "name": "absconder"}, - {"id": 15004, "synset": "absolver.n.01", "name": "absolver"}, - {"id": 15005, "synset": "abecedarian.n.01", "name": "abecedarian"}, - {"id": 15006, "synset": "aberrant.n.01", "name": "aberrant"}, - {"id": 15007, "synset": "abettor.n.01", "name": "abettor"}, - {"id": 15008, "synset": "abhorrer.n.01", "name": "abhorrer"}, - {"id": 15009, "synset": "abomination.n.01", "name": "abomination"}, - {"id": 15010, "synset": "abseiler.n.01", "name": "abseiler"}, - {"id": 15011, "synset": "abstainer.n.01", "name": "abstainer"}, - {"id": 15012, "synset": "academic_administrator.n.01", "name": "academic_administrator"}, - {"id": 15013, "synset": "academician.n.01", "name": "academician"}, - {"id": 15014, "synset": "accessory_before_the_fact.n.01", "name": "accessory_before_the_fact"}, - {"id": 15015, "synset": "companion.n.03", "name": "companion"}, - {"id": 15016, "synset": "accompanist.n.01", "name": "accompanist"}, - {"id": 15017, "synset": "accomplice.n.01", "name": "accomplice"}, - {"id": 15018, "synset": "account_executive.n.01", "name": "account_executive"}, - {"id": 15019, "synset": "accused.n.01", "name": "accused"}, - {"id": 15020, "synset": "accuser.n.01", "name": "accuser"}, - {"id": 15021, "synset": "acid_head.n.01", "name": "acid_head"}, - {"id": 15022, "synset": "acquaintance.n.03", "name": "acquaintance"}, - {"id": 15023, "synset": "acquirer.n.01", "name": "acquirer"}, - {"id": 15024, "synset": "aerialist.n.01", "name": "aerialist"}, - {"id": 15025, "synset": "action_officer.n.01", "name": "action_officer"}, - {"id": 15026, "synset": "active.n.03", "name": "active"}, - {"id": 15027, "synset": "active_citizen.n.01", "name": "active_citizen"}, - {"id": 15028, "synset": "actor.n.01", "name": "actor"}, - {"id": 15029, "synset": "actor.n.02", "name": "actor"}, - {"id": 15030, "synset": "addict.n.01", "name": "addict"}, - {"id": 15031, "synset": "adducer.n.01", "name": "adducer"}, - {"id": 15032, "synset": "adjuster.n.01", "name": "adjuster"}, - {"id": 15033, "synset": "adjutant.n.01", "name": "adjutant"}, - {"id": 15034, "synset": "adjutant_general.n.01", "name": "adjutant_general"}, - {"id": 15035, "synset": "admirer.n.03", "name": "admirer"}, - {"id": 15036, "synset": "adoptee.n.01", "name": "adoptee"}, - {"id": 15037, "synset": "adulterer.n.01", "name": "adulterer"}, - {"id": 15038, "synset": "adulteress.n.01", "name": "adulteress"}, - {"id": 15039, "synset": "advertiser.n.01", "name": "advertiser"}, - {"id": 15040, "synset": "advisee.n.01", "name": "advisee"}, - {"id": 15041, "synset": "advocate.n.01", "name": "advocate"}, - {"id": 15042, "synset": "aeronautical_engineer.n.01", "name": "aeronautical_engineer"}, - {"id": 15043, "synset": "affiliate.n.01", "name": "affiliate"}, - {"id": 15044, "synset": "affluent.n.01", "name": "affluent"}, - {"id": 15045, "synset": "aficionado.n.02", "name": "aficionado"}, - {"id": 15046, "synset": "buck_sergeant.n.01", "name": "buck_sergeant"}, - {"id": 15047, "synset": "agent-in-place.n.01", "name": "agent-in-place"}, - {"id": 15048, "synset": "aggravator.n.01", "name": "aggravator"}, - {"id": 15049, "synset": "agitator.n.01", "name": "agitator"}, - {"id": 15050, "synset": "agnostic.n.02", "name": "agnostic"}, - {"id": 15051, "synset": "agnostic.n.01", "name": "agnostic"}, - {"id": 15052, "synset": "agonist.n.02", "name": "agonist"}, - {"id": 15053, "synset": "agony_aunt.n.01", "name": "agony_aunt"}, - {"id": 15054, "synset": "agriculturist.n.01", "name": "agriculturist"}, - {"id": 15055, "synset": "air_attache.n.01", "name": "air_attache"}, - {"id": 15056, "synset": "air_force_officer.n.01", "name": "air_force_officer"}, - {"id": 15057, "synset": "airhead.n.01", "name": "airhead"}, - {"id": 15058, "synset": "air_traveler.n.01", "name": "air_traveler"}, - {"id": 15059, "synset": "alarmist.n.01", "name": "alarmist"}, - {"id": 15060, "synset": "albino.n.01", "name": "albino"}, - {"id": 15061, "synset": "alcoholic.n.01", "name": "alcoholic"}, - {"id": 15062, "synset": "alderman.n.01", "name": "alderman"}, - {"id": 15063, "synset": "alexic.n.01", "name": "alexic"}, - {"id": 15064, "synset": "alienee.n.01", "name": "alienee"}, - {"id": 15065, "synset": "alienor.n.01", "name": "alienor"}, - {"id": 15066, "synset": "aliterate.n.01", "name": "aliterate"}, - {"id": 15067, "synset": "algebraist.n.01", "name": "algebraist"}, - {"id": 15068, "synset": "allegorizer.n.01", "name": "allegorizer"}, - {"id": 15069, "synset": "alliterator.n.01", "name": "alliterator"}, - {"id": 15070, "synset": "almoner.n.01", "name": "almoner"}, - {"id": 15071, "synset": "alpinist.n.01", "name": "alpinist"}, - {"id": 15072, "synset": "altar_boy.n.01", "name": "altar_boy"}, - {"id": 15073, "synset": "alto.n.01", "name": "alto"}, - {"id": 15074, "synset": "ambassador.n.01", "name": "ambassador"}, - {"id": 15075, "synset": "ambassador.n.02", "name": "ambassador"}, - {"id": 15076, "synset": "ambusher.n.01", "name": "ambusher"}, - {"id": 15077, "synset": "amicus_curiae.n.01", "name": "amicus_curiae"}, - {"id": 15078, "synset": "amoralist.n.01", "name": "amoralist"}, - {"id": 15079, "synset": "amputee.n.01", "name": "amputee"}, - {"id": 15080, "synset": "analogist.n.01", "name": "analogist"}, - {"id": 15081, "synset": "analphabet.n.01", "name": "analphabet"}, - {"id": 15082, "synset": "analyst.n.01", "name": "analyst"}, - {"id": 15083, "synset": "industry_analyst.n.01", "name": "industry_analyst"}, - {"id": 15084, "synset": "market_strategist.n.01", "name": "market_strategist"}, - {"id": 15085, "synset": "anarchist.n.01", "name": "anarchist"}, - {"id": 15086, "synset": "anathema.n.01", "name": "anathema"}, - {"id": 15087, "synset": "ancestor.n.01", "name": "ancestor"}, - {"id": 15088, "synset": "anchor.n.03", "name": "anchor"}, - {"id": 15089, "synset": "ancient.n.02", "name": "ancient"}, - {"id": 15090, "synset": "anecdotist.n.01", "name": "anecdotist"}, - {"id": 15091, "synset": "angler.n.02", "name": "angler"}, - {"id": 15092, "synset": "animator.n.02", "name": "animator"}, - {"id": 15093, "synset": "animist.n.01", "name": "animist"}, - {"id": 15094, "synset": "annotator.n.01", "name": "annotator"}, - {"id": 15095, "synset": "announcer.n.02", "name": "announcer"}, - {"id": 15096, "synset": "announcer.n.01", "name": "announcer"}, - {"id": 15097, "synset": "anti.n.01", "name": "anti"}, - {"id": 15098, "synset": "anti-american.n.01", "name": "anti-American"}, - {"id": 15099, "synset": "anti-semite.n.01", "name": "anti-Semite"}, - {"id": 15100, "synset": "anzac.n.01", "name": "Anzac"}, - {"id": 15101, "synset": "ape-man.n.02", "name": "ape-man"}, - {"id": 15102, "synset": "aphakic.n.01", "name": "aphakic"}, - {"id": 15103, "synset": "appellant.n.01", "name": "appellant"}, - {"id": 15104, "synset": "appointee.n.01", "name": "appointee"}, - {"id": 15105, "synset": "apprehender.n.02", "name": "apprehender"}, - {"id": 15106, "synset": "april_fool.n.01", "name": "April_fool"}, - {"id": 15107, "synset": "aspirant.n.01", "name": "aspirant"}, - {"id": 15108, "synset": "appreciator.n.01", "name": "appreciator"}, - {"id": 15109, "synset": "appropriator.n.01", "name": "appropriator"}, - {"id": 15110, "synset": "arabist.n.01", "name": "Arabist"}, - {"id": 15111, "synset": "archaist.n.01", "name": "archaist"}, - {"id": 15112, "synset": "archbishop.n.01", "name": "archbishop"}, - {"id": 15113, "synset": "archer.n.01", "name": "archer"}, - {"id": 15114, "synset": "architect.n.01", "name": "architect"}, - {"id": 15115, "synset": "archivist.n.01", "name": "archivist"}, - {"id": 15116, "synset": "archpriest.n.01", "name": "archpriest"}, - {"id": 15117, "synset": "aristotelian.n.01", "name": "Aristotelian"}, - {"id": 15118, "synset": "armiger.n.02", "name": "armiger"}, - {"id": 15119, "synset": "army_attache.n.01", "name": "army_attache"}, - {"id": 15120, "synset": "army_engineer.n.01", "name": "army_engineer"}, - {"id": 15121, "synset": "army_officer.n.01", "name": "army_officer"}, - {"id": 15122, "synset": "arranger.n.02", "name": "arranger"}, - {"id": 15123, "synset": "arrival.n.03", "name": "arrival"}, - {"id": 15124, "synset": "arthritic.n.01", "name": "arthritic"}, - {"id": 15125, "synset": "articulator.n.01", "name": "articulator"}, - {"id": 15126, "synset": "artilleryman.n.01", "name": "artilleryman"}, - {"id": 15127, "synset": "artist's_model.n.01", "name": "artist's_model"}, - {"id": 15128, "synset": "assayer.n.01", "name": "assayer"}, - {"id": 15129, "synset": "assemblyman.n.01", "name": "assemblyman"}, - {"id": 15130, "synset": "assemblywoman.n.01", "name": "assemblywoman"}, - {"id": 15131, "synset": "assenter.n.01", "name": "assenter"}, - {"id": 15132, "synset": "asserter.n.01", "name": "asserter"}, - {"id": 15133, "synset": "assignee.n.01", "name": "assignee"}, - {"id": 15134, "synset": "assistant.n.01", "name": "assistant"}, - {"id": 15135, "synset": "assistant_professor.n.01", "name": "assistant_professor"}, - {"id": 15136, "synset": "associate.n.01", "name": "associate"}, - {"id": 15137, "synset": "associate.n.03", "name": "associate"}, - {"id": 15138, "synset": "associate_professor.n.01", "name": "associate_professor"}, - {"id": 15139, "synset": "astronaut.n.01", "name": "astronaut"}, - {"id": 15140, "synset": "cosmographer.n.01", "name": "cosmographer"}, - {"id": 15141, "synset": "atheist.n.01", "name": "atheist"}, - {"id": 15142, "synset": "athlete.n.01", "name": "athlete"}, - {"id": 15143, "synset": "attendant.n.01", "name": "attendant"}, - {"id": 15144, "synset": "attorney_general.n.01", "name": "attorney_general"}, - {"id": 15145, "synset": "auditor.n.02", "name": "auditor"}, - {"id": 15146, "synset": "augur.n.01", "name": "augur"}, - {"id": 15147, "synset": "aunt.n.01", "name": "aunt"}, - {"id": 15148, "synset": "au_pair_girl.n.01", "name": "au_pair_girl"}, - {"id": 15149, "synset": "authoritarian.n.01", "name": "authoritarian"}, - {"id": 15150, "synset": "authority.n.02", "name": "authority"}, - {"id": 15151, "synset": "authorizer.n.01", "name": "authorizer"}, - {"id": 15152, "synset": "automobile_mechanic.n.01", "name": "automobile_mechanic"}, - {"id": 15153, "synset": "aviator.n.01", "name": "aviator"}, - {"id": 15154, "synset": "aviatrix.n.01", "name": "aviatrix"}, - {"id": 15155, "synset": "ayah.n.01", "name": "ayah"}, - {"id": 15156, "synset": "babu.n.01", "name": "babu"}, - {"id": 15157, "synset": "baby.n.05", "name": "baby"}, - {"id": 15158, "synset": "baby.n.04", "name": "baby"}, - {"id": 15159, "synset": "baby_boomer.n.01", "name": "baby_boomer"}, - {"id": 15160, "synset": "baby_farmer.n.01", "name": "baby_farmer"}, - {"id": 15161, "synset": "back.n.04", "name": "back"}, - {"id": 15162, "synset": "backbencher.n.01", "name": "backbencher"}, - {"id": 15163, "synset": "backpacker.n.01", "name": "backpacker"}, - {"id": 15164, "synset": "backroom_boy.n.01", "name": "backroom_boy"}, - {"id": 15165, "synset": "backscratcher.n.01", "name": "backscratcher"}, - {"id": 15166, "synset": "bad_person.n.01", "name": "bad_person"}, - {"id": 15167, "synset": "baggage.n.02", "name": "baggage"}, - {"id": 15168, "synset": "bag_lady.n.01", "name": "bag_lady"}, - {"id": 15169, "synset": "bailee.n.01", "name": "bailee"}, - {"id": 15170, "synset": "bailiff.n.01", "name": "bailiff"}, - {"id": 15171, "synset": "bailor.n.01", "name": "bailor"}, - {"id": 15172, "synset": "bairn.n.01", "name": "bairn"}, - {"id": 15173, "synset": "baker.n.02", "name": "baker"}, - {"id": 15174, "synset": "balancer.n.01", "name": "balancer"}, - {"id": 15175, "synset": "balker.n.01", "name": "balker"}, - {"id": 15176, "synset": "ball-buster.n.01", "name": "ball-buster"}, - {"id": 15177, "synset": "ball_carrier.n.01", "name": "ball_carrier"}, - {"id": 15178, "synset": "ballet_dancer.n.01", "name": "ballet_dancer"}, - {"id": 15179, "synset": "ballet_master.n.01", "name": "ballet_master"}, - {"id": 15180, "synset": "ballet_mistress.n.01", "name": "ballet_mistress"}, - {"id": 15181, "synset": "balletomane.n.01", "name": "balletomane"}, - {"id": 15182, "synset": "ball_hawk.n.01", "name": "ball_hawk"}, - {"id": 15183, "synset": "balloonist.n.01", "name": "balloonist"}, - {"id": 15184, "synset": "ballplayer.n.01", "name": "ballplayer"}, - {"id": 15185, "synset": "bullfighter.n.01", "name": "bullfighter"}, - {"id": 15186, "synset": "banderillero.n.01", "name": "banderillero"}, - {"id": 15187, "synset": "matador.n.01", "name": "matador"}, - {"id": 15188, "synset": "picador.n.01", "name": "picador"}, - {"id": 15189, "synset": "bandsman.n.01", "name": "bandsman"}, - {"id": 15190, "synset": "banker.n.02", "name": "banker"}, - {"id": 15191, "synset": "bank_robber.n.01", "name": "bank_robber"}, - {"id": 15192, "synset": "bankrupt.n.01", "name": "bankrupt"}, - {"id": 15193, "synset": "bantamweight.n.01", "name": "bantamweight"}, - {"id": 15194, "synset": "barmaid.n.01", "name": "barmaid"}, - {"id": 15195, "synset": "baron.n.03", "name": "baron"}, - {"id": 15196, "synset": "baron.n.02", "name": "baron"}, - {"id": 15197, "synset": "baron.n.01", "name": "baron"}, - {"id": 15198, "synset": "bartender.n.01", "name": "bartender"}, - {"id": 15199, "synset": "baseball_coach.n.01", "name": "baseball_coach"}, - {"id": 15200, "synset": "base_runner.n.01", "name": "base_runner"}, - {"id": 15201, "synset": "basketball_player.n.01", "name": "basketball_player"}, - {"id": 15202, "synset": "basketweaver.n.01", "name": "basketweaver"}, - {"id": 15203, "synset": "basket_maker.n.01", "name": "Basket_Maker"}, - {"id": 15204, "synset": "bass.n.03", "name": "bass"}, - {"id": 15205, "synset": "bastard.n.02", "name": "bastard"}, - {"id": 15206, "synset": "bat_boy.n.01", "name": "bat_boy"}, - {"id": 15207, "synset": "bather.n.02", "name": "bather"}, - {"id": 15208, "synset": "batman.n.01", "name": "batman"}, - {"id": 15209, "synset": "baton_twirler.n.01", "name": "baton_twirler"}, - {"id": 15210, "synset": "bavarian.n.01", "name": "Bavarian"}, - {"id": 15211, "synset": "beadsman.n.01", "name": "beadsman"}, - {"id": 15212, "synset": "beard.n.03", "name": "beard"}, - {"id": 15213, "synset": "beatnik.n.01", "name": "beatnik"}, - {"id": 15214, "synset": "beauty_consultant.n.01", "name": "beauty_consultant"}, - {"id": 15215, "synset": "bedouin.n.01", "name": "Bedouin"}, - {"id": 15216, "synset": "bedwetter.n.01", "name": "bedwetter"}, - {"id": 15217, "synset": "beekeeper.n.01", "name": "beekeeper"}, - {"id": 15218, "synset": "beer_drinker.n.01", "name": "beer_drinker"}, - {"id": 15219, "synset": "beggarman.n.01", "name": "beggarman"}, - {"id": 15220, "synset": "beggarwoman.n.01", "name": "beggarwoman"}, - {"id": 15221, "synset": "beldam.n.02", "name": "beldam"}, - {"id": 15222, "synset": "theist.n.01", "name": "theist"}, - {"id": 15223, "synset": "believer.n.01", "name": "believer"}, - {"id": 15224, "synset": "bell_founder.n.01", "name": "bell_founder"}, - {"id": 15225, "synset": "benedick.n.01", "name": "benedick"}, - {"id": 15226, "synset": "berserker.n.01", "name": "berserker"}, - {"id": 15227, "synset": "besieger.n.01", "name": "besieger"}, - {"id": 15228, "synset": "best.n.02", "name": "best"}, - {"id": 15229, "synset": "betrothed.n.01", "name": "betrothed"}, - {"id": 15230, "synset": "big_brother.n.01", "name": "Big_Brother"}, - {"id": 15231, "synset": "bigot.n.01", "name": "bigot"}, - {"id": 15232, "synset": "big_shot.n.01", "name": "big_shot"}, - {"id": 15233, "synset": "big_sister.n.01", "name": "big_sister"}, - {"id": 15234, "synset": "billiard_player.n.01", "name": "billiard_player"}, - {"id": 15235, "synset": "biochemist.n.01", "name": "biochemist"}, - {"id": 15236, "synset": "biographer.n.01", "name": "biographer"}, - {"id": 15237, "synset": "bird_fancier.n.01", "name": "bird_fancier"}, - {"id": 15238, "synset": "birth.n.05", "name": "birth"}, - {"id": 15239, "synset": "birth-control_campaigner.n.01", "name": "birth-control_campaigner"}, - {"id": 15240, "synset": "bisexual.n.01", "name": "bisexual"}, - {"id": 15241, "synset": "black_belt.n.01", "name": "black_belt"}, - {"id": 15242, "synset": "blackmailer.n.01", "name": "blackmailer"}, - {"id": 15243, "synset": "black_muslim.n.01", "name": "Black_Muslim"}, - {"id": 15244, "synset": "blacksmith.n.01", "name": "blacksmith"}, - {"id": 15245, "synset": "blade.n.02", "name": "blade"}, - {"id": 15246, "synset": "blind_date.n.01", "name": "blind_date"}, - {"id": 15247, "synset": "bluecoat.n.01", "name": "bluecoat"}, - {"id": 15248, "synset": "bluestocking.n.01", "name": "bluestocking"}, - {"id": 15249, "synset": "boatbuilder.n.01", "name": "boatbuilder"}, - {"id": 15250, "synset": "boatman.n.01", "name": "boatman"}, - {"id": 15251, "synset": "boatswain.n.01", "name": "boatswain"}, - {"id": 15252, "synset": "bobby.n.01", "name": "bobby"}, - {"id": 15253, "synset": "bodyguard.n.01", "name": "bodyguard"}, - {"id": 15254, "synset": "boffin.n.01", "name": "boffin"}, - {"id": 15255, "synset": "bolshevik.n.01", "name": "Bolshevik"}, - {"id": 15256, "synset": "bolshevik.n.02", "name": "Bolshevik"}, - {"id": 15257, "synset": "bombshell.n.01", "name": "bombshell"}, - {"id": 15258, "synset": "bondman.n.01", "name": "bondman"}, - {"id": 15259, "synset": "bondwoman.n.02", "name": "bondwoman"}, - {"id": 15260, "synset": "bondwoman.n.01", "name": "bondwoman"}, - {"id": 15261, "synset": "bond_servant.n.01", "name": "bond_servant"}, - {"id": 15262, "synset": "book_agent.n.01", "name": "book_agent"}, - {"id": 15263, "synset": "bookbinder.n.01", "name": "bookbinder"}, - {"id": 15264, "synset": "bookkeeper.n.01", "name": "bookkeeper"}, - {"id": 15265, "synset": "bookmaker.n.01", "name": "bookmaker"}, - {"id": 15266, "synset": "bookworm.n.02", "name": "bookworm"}, - {"id": 15267, "synset": "booster.n.03", "name": "booster"}, - {"id": 15268, "synset": "bootblack.n.01", "name": "bootblack"}, - {"id": 15269, "synset": "bootlegger.n.01", "name": "bootlegger"}, - {"id": 15270, "synset": "bootmaker.n.01", "name": "bootmaker"}, - {"id": 15271, "synset": "borderer.n.01", "name": "borderer"}, - {"id": 15272, "synset": "border_patrolman.n.01", "name": "border_patrolman"}, - {"id": 15273, "synset": "botanist.n.01", "name": "botanist"}, - {"id": 15274, "synset": "bottom_feeder.n.01", "name": "bottom_feeder"}, - {"id": 15275, "synset": "boulevardier.n.01", "name": "boulevardier"}, - {"id": 15276, "synset": "bounty_hunter.n.02", "name": "bounty_hunter"}, - {"id": 15277, "synset": "bounty_hunter.n.01", "name": "bounty_hunter"}, - {"id": 15278, "synset": "bourbon.n.03", "name": "Bourbon"}, - {"id": 15279, "synset": "bowler.n.01", "name": "bowler"}, - {"id": 15280, "synset": "slugger.n.02", "name": "slugger"}, - {"id": 15281, "synset": "cub.n.02", "name": "cub"}, - {"id": 15282, "synset": "boy_scout.n.01", "name": "Boy_Scout"}, - {"id": 15283, "synset": "boy_scout.n.02", "name": "boy_scout"}, - {"id": 15284, "synset": "boy_wonder.n.01", "name": "boy_wonder"}, - {"id": 15285, "synset": "bragger.n.01", "name": "bragger"}, - {"id": 15286, "synset": "brahman.n.02", "name": "brahman"}, - {"id": 15287, "synset": "brawler.n.01", "name": "brawler"}, - {"id": 15288, "synset": "breadwinner.n.01", "name": "breadwinner"}, - {"id": 15289, "synset": "breaststroker.n.01", "name": "breaststroker"}, - {"id": 15290, "synset": "breeder.n.01", "name": "breeder"}, - {"id": 15291, "synset": "brick.n.02", "name": "brick"}, - {"id": 15292, "synset": "bride.n.03", "name": "bride"}, - {"id": 15293, "synset": "bridesmaid.n.01", "name": "bridesmaid"}, - {"id": 15294, "synset": "bridge_agent.n.01", "name": "bridge_agent"}, - {"id": 15295, "synset": "broadcast_journalist.n.01", "name": "broadcast_journalist"}, - {"id": 15296, "synset": "brother.n.05", "name": "Brother"}, - {"id": 15297, "synset": "brother-in-law.n.01", "name": "brother-in-law"}, - {"id": 15298, "synset": "browser.n.01", "name": "browser"}, - {"id": 15299, "synset": "brummie.n.01", "name": "Brummie"}, - {"id": 15300, "synset": "buddy.n.01", "name": "buddy"}, - {"id": 15301, "synset": "bull.n.06", "name": "bull"}, - {"id": 15302, "synset": "bully.n.02", "name": "bully"}, - {"id": 15303, "synset": "bunny.n.01", "name": "bunny"}, - {"id": 15304, "synset": "burglar.n.01", "name": "burglar"}, - {"id": 15305, "synset": "bursar.n.01", "name": "bursar"}, - {"id": 15306, "synset": "busboy.n.01", "name": "busboy"}, - {"id": 15307, "synset": "business_editor.n.01", "name": "business_editor"}, - {"id": 15308, "synset": "business_traveler.n.01", "name": "business_traveler"}, - {"id": 15309, "synset": "buster.n.04", "name": "buster"}, - {"id": 15310, "synset": "busybody.n.01", "name": "busybody"}, - {"id": 15311, "synset": "buttinsky.n.01", "name": "buttinsky"}, - {"id": 15312, "synset": "cabinetmaker.n.01", "name": "cabinetmaker"}, - {"id": 15313, "synset": "caddie.n.01", "name": "caddie"}, - {"id": 15314, "synset": "cadet.n.01", "name": "cadet"}, - {"id": 15315, "synset": "caller.n.04", "name": "caller"}, - {"id": 15316, "synset": "call_girl.n.01", "name": "call_girl"}, - {"id": 15317, "synset": "calligrapher.n.01", "name": "calligrapher"}, - {"id": 15318, "synset": "campaigner.n.01", "name": "campaigner"}, - {"id": 15319, "synset": "camper.n.01", "name": "camper"}, - {"id": 15320, "synset": "camp_follower.n.02", "name": "camp_follower"}, - {"id": 15321, "synset": "candidate.n.02", "name": "candidate"}, - {"id": 15322, "synset": "canonist.n.01", "name": "canonist"}, - {"id": 15323, "synset": "capitalist.n.01", "name": "capitalist"}, - {"id": 15324, "synset": "captain.n.07", "name": "captain"}, - {"id": 15325, "synset": "captain.n.06", "name": "captain"}, - {"id": 15326, "synset": "captain.n.01", "name": "captain"}, - {"id": 15327, "synset": "captain.n.05", "name": "captain"}, - {"id": 15328, "synset": "captive.n.02", "name": "captive"}, - {"id": 15329, "synset": "captive.n.03", "name": "captive"}, - {"id": 15330, "synset": "cardinal.n.01", "name": "cardinal"}, - {"id": 15331, "synset": "cardiologist.n.01", "name": "cardiologist"}, - {"id": 15332, "synset": "card_player.n.01", "name": "card_player"}, - {"id": 15333, "synset": "cardsharp.n.01", "name": "cardsharp"}, - {"id": 15334, "synset": "careerist.n.01", "name": "careerist"}, - {"id": 15335, "synset": "career_man.n.01", "name": "career_man"}, - {"id": 15336, "synset": "caregiver.n.02", "name": "caregiver"}, - {"id": 15337, "synset": "caretaker.n.01", "name": "caretaker"}, - {"id": 15338, "synset": "caretaker.n.02", "name": "caretaker"}, - {"id": 15339, "synset": "caricaturist.n.01", "name": "caricaturist"}, - {"id": 15340, "synset": "carillonneur.n.01", "name": "carillonneur"}, - {"id": 15341, "synset": "caroler.n.01", "name": "caroler"}, - {"id": 15342, "synset": "carpenter.n.01", "name": "carpenter"}, - {"id": 15343, "synset": "carper.n.01", "name": "carper"}, - {"id": 15344, "synset": "cartesian.n.01", "name": "Cartesian"}, - {"id": 15345, "synset": "cashier.n.02", "name": "cashier"}, - {"id": 15346, "synset": "casualty.n.02", "name": "casualty"}, - {"id": 15347, "synset": "casualty.n.01", "name": "casualty"}, - {"id": 15348, "synset": "casuist.n.01", "name": "casuist"}, - {"id": 15349, "synset": "catechist.n.01", "name": "catechist"}, - {"id": 15350, "synset": "catechumen.n.01", "name": "catechumen"}, - {"id": 15351, "synset": "caterer.n.01", "name": "caterer"}, - {"id": 15352, "synset": "catholicos.n.01", "name": "Catholicos"}, - {"id": 15353, "synset": "cat_fancier.n.01", "name": "cat_fancier"}, - {"id": 15354, "synset": "cavalier.n.02", "name": "Cavalier"}, - {"id": 15355, "synset": "cavalryman.n.02", "name": "cavalryman"}, - {"id": 15356, "synset": "caveman.n.01", "name": "caveman"}, - {"id": 15357, "synset": "celebrant.n.02", "name": "celebrant"}, - {"id": 15358, "synset": "celebrant.n.01", "name": "celebrant"}, - {"id": 15359, "synset": "celebrity.n.01", "name": "celebrity"}, - {"id": 15360, "synset": "cellist.n.01", "name": "cellist"}, - {"id": 15361, "synset": "censor.n.02", "name": "censor"}, - {"id": 15362, "synset": "censor.n.01", "name": "censor"}, - {"id": 15363, "synset": "centenarian.n.01", "name": "centenarian"}, - {"id": 15364, "synset": "centrist.n.01", "name": "centrist"}, - {"id": 15365, "synset": "centurion.n.01", "name": "centurion"}, - { - "id": 15366, - "synset": "certified_public_accountant.n.01", - "name": "certified_public_accountant", - }, - {"id": 15367, "synset": "chachka.n.01", "name": "chachka"}, - {"id": 15368, "synset": "chambermaid.n.01", "name": "chambermaid"}, - {"id": 15369, "synset": "chameleon.n.01", "name": "chameleon"}, - {"id": 15370, "synset": "champion.n.01", "name": "champion"}, - {"id": 15371, "synset": "chandler.n.02", "name": "chandler"}, - {"id": 15372, "synset": "prison_chaplain.n.01", "name": "prison_chaplain"}, - {"id": 15373, "synset": "charcoal_burner.n.01", "name": "charcoal_burner"}, - {"id": 15374, "synset": "charge_d'affaires.n.01", "name": "charge_d'affaires"}, - {"id": 15375, "synset": "charioteer.n.01", "name": "charioteer"}, - {"id": 15376, "synset": "charmer.n.02", "name": "charmer"}, - {"id": 15377, "synset": "chartered_accountant.n.01", "name": "chartered_accountant"}, - {"id": 15378, "synset": "chartist.n.02", "name": "chartist"}, - {"id": 15379, "synset": "charwoman.n.01", "name": "charwoman"}, - {"id": 15380, "synset": "male_chauvinist.n.01", "name": "male_chauvinist"}, - {"id": 15381, "synset": "cheapskate.n.01", "name": "cheapskate"}, - {"id": 15382, "synset": "chechen.n.01", "name": "Chechen"}, - {"id": 15383, "synset": "checker.n.02", "name": "checker"}, - {"id": 15384, "synset": "cheerer.n.01", "name": "cheerer"}, - {"id": 15385, "synset": "cheerleader.n.02", "name": "cheerleader"}, - {"id": 15386, "synset": "cheerleader.n.01", "name": "cheerleader"}, - {"id": 15387, "synset": "cheops.n.01", "name": "Cheops"}, - {"id": 15388, "synset": "chess_master.n.01", "name": "chess_master"}, - {"id": 15389, "synset": "chief_executive_officer.n.01", "name": "chief_executive_officer"}, - {"id": 15390, "synset": "chief_of_staff.n.01", "name": "chief_of_staff"}, - {"id": 15391, "synset": "chief_petty_officer.n.01", "name": "chief_petty_officer"}, - {"id": 15392, "synset": "chief_secretary.n.01", "name": "Chief_Secretary"}, - {"id": 15393, "synset": "child.n.01", "name": "child"}, - {"id": 15394, "synset": "child.n.02", "name": "child"}, - {"id": 15395, "synset": "child.n.03", "name": "child"}, - {"id": 15396, "synset": "child_prodigy.n.01", "name": "child_prodigy"}, - {"id": 15397, "synset": "chimneysweeper.n.01", "name": "chimneysweeper"}, - {"id": 15398, "synset": "chiropractor.n.01", "name": "chiropractor"}, - {"id": 15399, "synset": "chit.n.01", "name": "chit"}, - {"id": 15400, "synset": "choker.n.02", "name": "choker"}, - {"id": 15401, "synset": "choragus.n.01", "name": "choragus"}, - {"id": 15402, "synset": "choreographer.n.01", "name": "choreographer"}, - {"id": 15403, "synset": "chorus_girl.n.01", "name": "chorus_girl"}, - {"id": 15404, "synset": "chosen.n.01", "name": "chosen"}, - {"id": 15405, "synset": "cicerone.n.01", "name": "cicerone"}, - {"id": 15406, "synset": "cigar_smoker.n.01", "name": "cigar_smoker"}, - {"id": 15407, "synset": "cipher.n.04", "name": "cipher"}, - {"id": 15408, "synset": "circus_acrobat.n.01", "name": "circus_acrobat"}, - {"id": 15409, "synset": "citizen.n.01", "name": "citizen"}, - {"id": 15410, "synset": "city_editor.n.01", "name": "city_editor"}, - {"id": 15411, "synset": "city_father.n.01", "name": "city_father"}, - {"id": 15412, "synset": "city_man.n.01", "name": "city_man"}, - {"id": 15413, "synset": "city_slicker.n.01", "name": "city_slicker"}, - {"id": 15414, "synset": "civic_leader.n.01", "name": "civic_leader"}, - {"id": 15415, "synset": "civil_rights_leader.n.01", "name": "civil_rights_leader"}, - {"id": 15416, "synset": "cleaner.n.03", "name": "cleaner"}, - {"id": 15417, "synset": "clergyman.n.01", "name": "clergyman"}, - {"id": 15418, "synset": "cleric.n.01", "name": "cleric"}, - {"id": 15419, "synset": "clerk.n.01", "name": "clerk"}, - {"id": 15420, "synset": "clever_dick.n.01", "name": "clever_Dick"}, - {"id": 15421, "synset": "climatologist.n.01", "name": "climatologist"}, - {"id": 15422, "synset": "climber.n.04", "name": "climber"}, - {"id": 15423, "synset": "clinician.n.01", "name": "clinician"}, - {"id": 15424, "synset": "closer.n.02", "name": "closer"}, - {"id": 15425, "synset": "closet_queen.n.01", "name": "closet_queen"}, - {"id": 15426, "synset": "clown.n.02", "name": "clown"}, - {"id": 15427, "synset": "clown.n.01", "name": "clown"}, - {"id": 15428, "synset": "coach.n.02", "name": "coach"}, - {"id": 15429, "synset": "coach.n.01", "name": "coach"}, - {"id": 15430, "synset": "pitching_coach.n.01", "name": "pitching_coach"}, - {"id": 15431, "synset": "coachman.n.01", "name": "coachman"}, - {"id": 15432, "synset": "coal_miner.n.01", "name": "coal_miner"}, - {"id": 15433, "synset": "coastguardsman.n.01", "name": "coastguardsman"}, - {"id": 15434, "synset": "cobber.n.01", "name": "cobber"}, - {"id": 15435, "synset": "cobbler.n.01", "name": "cobbler"}, - {"id": 15436, "synset": "codger.n.01", "name": "codger"}, - {"id": 15437, "synset": "co-beneficiary.n.01", "name": "co-beneficiary"}, - {"id": 15438, "synset": "cog.n.01", "name": "cog"}, - {"id": 15439, "synset": "cognitive_neuroscientist.n.01", "name": "cognitive_neuroscientist"}, - {"id": 15440, "synset": "coiffeur.n.01", "name": "coiffeur"}, - {"id": 15441, "synset": "coiner.n.02", "name": "coiner"}, - {"id": 15442, "synset": "collaborator.n.03", "name": "collaborator"}, - {"id": 15443, "synset": "colleen.n.01", "name": "colleen"}, - {"id": 15444, "synset": "college_student.n.01", "name": "college_student"}, - {"id": 15445, "synset": "collegian.n.01", "name": "collegian"}, - {"id": 15446, "synset": "colonial.n.01", "name": "colonial"}, - {"id": 15447, "synset": "colonialist.n.01", "name": "colonialist"}, - {"id": 15448, "synset": "colonizer.n.01", "name": "colonizer"}, - {"id": 15449, "synset": "coloratura.n.01", "name": "coloratura"}, - {"id": 15450, "synset": "color_guard.n.01", "name": "color_guard"}, - {"id": 15451, "synset": "colossus.n.02", "name": "colossus"}, - {"id": 15452, "synset": "comedian.n.02", "name": "comedian"}, - {"id": 15453, "synset": "comedienne.n.02", "name": "comedienne"}, - {"id": 15454, "synset": "comer.n.01", "name": "comer"}, - {"id": 15455, "synset": "commander.n.03", "name": "commander"}, - {"id": 15456, "synset": "commander_in_chief.n.01", "name": "commander_in_chief"}, - {"id": 15457, "synset": "commanding_officer.n.01", "name": "commanding_officer"}, - {"id": 15458, "synset": "commissar.n.01", "name": "commissar"}, - {"id": 15459, "synset": "commissioned_officer.n.01", "name": "commissioned_officer"}, - { - "id": 15460, - "synset": "commissioned_military_officer.n.01", - "name": "commissioned_military_officer", - }, - {"id": 15461, "synset": "commissioner.n.01", "name": "commissioner"}, - {"id": 15462, "synset": "commissioner.n.02", "name": "commissioner"}, - {"id": 15463, "synset": "committee_member.n.01", "name": "committee_member"}, - {"id": 15464, "synset": "committeewoman.n.01", "name": "committeewoman"}, - {"id": 15465, "synset": "commodore.n.01", "name": "commodore"}, - {"id": 15466, "synset": "communicant.n.01", "name": "communicant"}, - {"id": 15467, "synset": "communist.n.02", "name": "communist"}, - {"id": 15468, "synset": "communist.n.01", "name": "Communist"}, - {"id": 15469, "synset": "commuter.n.02", "name": "commuter"}, - {"id": 15470, "synset": "compere.n.01", "name": "compere"}, - {"id": 15471, "synset": "complexifier.n.01", "name": "complexifier"}, - {"id": 15472, "synset": "compulsive.n.01", "name": "compulsive"}, - {"id": 15473, "synset": "computational_linguist.n.01", "name": "computational_linguist"}, - {"id": 15474, "synset": "computer_scientist.n.01", "name": "computer_scientist"}, - {"id": 15475, "synset": "computer_user.n.01", "name": "computer_user"}, - {"id": 15476, "synset": "comrade.n.02", "name": "Comrade"}, - {"id": 15477, "synset": "concert-goer.n.01", "name": "concert-goer"}, - {"id": 15478, "synset": "conciliator.n.01", "name": "conciliator"}, - {"id": 15479, "synset": "conductor.n.03", "name": "conductor"}, - {"id": 15480, "synset": "confectioner.n.01", "name": "confectioner"}, - {"id": 15481, "synset": "confederate.n.01", "name": "Confederate"}, - {"id": 15482, "synset": "confessor.n.01", "name": "confessor"}, - {"id": 15483, "synset": "confidant.n.01", "name": "confidant"}, - {"id": 15484, "synset": "confucian.n.01", "name": "Confucian"}, - {"id": 15485, "synset": "rep.n.01", "name": "rep"}, - {"id": 15486, "synset": "conqueror.n.01", "name": "conqueror"}, - {"id": 15487, "synset": "conservative.n.02", "name": "Conservative"}, - {"id": 15488, "synset": "nonconformist.n.01", "name": "Nonconformist"}, - {"id": 15489, "synset": "anglican.n.01", "name": "Anglican"}, - {"id": 15490, "synset": "consignee.n.01", "name": "consignee"}, - {"id": 15491, "synset": "consigner.n.01", "name": "consigner"}, - {"id": 15492, "synset": "constable.n.01", "name": "constable"}, - {"id": 15493, "synset": "constructivist.n.01", "name": "constructivist"}, - {"id": 15494, "synset": "contractor.n.01", "name": "contractor"}, - {"id": 15495, "synset": "contralto.n.01", "name": "contralto"}, - {"id": 15496, "synset": "contributor.n.02", "name": "contributor"}, - {"id": 15497, "synset": "control_freak.n.01", "name": "control_freak"}, - {"id": 15498, "synset": "convalescent.n.01", "name": "convalescent"}, - {"id": 15499, "synset": "convener.n.01", "name": "convener"}, - {"id": 15500, "synset": "convict.n.01", "name": "convict"}, - {"id": 15501, "synset": "copilot.n.01", "name": "copilot"}, - {"id": 15502, "synset": "copycat.n.01", "name": "copycat"}, - {"id": 15503, "synset": "coreligionist.n.01", "name": "coreligionist"}, - {"id": 15504, "synset": "cornerback.n.01", "name": "cornerback"}, - {"id": 15505, "synset": "corporatist.n.01", "name": "corporatist"}, - {"id": 15506, "synset": "correspondent.n.01", "name": "correspondent"}, - {"id": 15507, "synset": "cosmetician.n.01", "name": "cosmetician"}, - {"id": 15508, "synset": "cosmopolitan.n.01", "name": "cosmopolitan"}, - {"id": 15509, "synset": "cossack.n.01", "name": "Cossack"}, - {"id": 15510, "synset": "cost_accountant.n.01", "name": "cost_accountant"}, - {"id": 15511, "synset": "co-star.n.01", "name": "co-star"}, - {"id": 15512, "synset": "costumier.n.01", "name": "costumier"}, - {"id": 15513, "synset": "cotter.n.02", "name": "cotter"}, - {"id": 15514, "synset": "cotter.n.01", "name": "cotter"}, - {"id": 15515, "synset": "counselor.n.01", "name": "counselor"}, - {"id": 15516, "synset": "counterterrorist.n.01", "name": "counterterrorist"}, - {"id": 15517, "synset": "counterspy.n.01", "name": "counterspy"}, - {"id": 15518, "synset": "countess.n.01", "name": "countess"}, - {"id": 15519, "synset": "compromiser.n.01", "name": "compromiser"}, - {"id": 15520, "synset": "countrywoman.n.01", "name": "countrywoman"}, - {"id": 15521, "synset": "county_agent.n.01", "name": "county_agent"}, - {"id": 15522, "synset": "courtier.n.01", "name": "courtier"}, - {"id": 15523, "synset": "cousin.n.01", "name": "cousin"}, - {"id": 15524, "synset": "cover_girl.n.01", "name": "cover_girl"}, - {"id": 15525, "synset": "cow.n.03", "name": "cow"}, - {"id": 15526, "synset": "craftsman.n.03", "name": "craftsman"}, - {"id": 15527, "synset": "craftsman.n.02", "name": "craftsman"}, - {"id": 15528, "synset": "crapshooter.n.01", "name": "crapshooter"}, - {"id": 15529, "synset": "crazy.n.01", "name": "crazy"}, - {"id": 15530, "synset": "creature.n.02", "name": "creature"}, - {"id": 15531, "synset": "creditor.n.01", "name": "creditor"}, - {"id": 15532, "synset": "creep.n.01", "name": "creep"}, - {"id": 15533, "synset": "criminologist.n.01", "name": "criminologist"}, - {"id": 15534, "synset": "critic.n.02", "name": "critic"}, - {"id": 15535, "synset": "croesus.n.02", "name": "Croesus"}, - {"id": 15536, "synset": "cross-examiner.n.01", "name": "cross-examiner"}, - {"id": 15537, "synset": "crossover_voter.n.01", "name": "crossover_voter"}, - {"id": 15538, "synset": "croupier.n.01", "name": "croupier"}, - {"id": 15539, "synset": "crown_prince.n.01", "name": "crown_prince"}, - {"id": 15540, "synset": "crown_princess.n.01", "name": "crown_princess"}, - {"id": 15541, "synset": "cryptanalyst.n.01", "name": "cryptanalyst"}, - {"id": 15542, "synset": "cub_scout.n.01", "name": "Cub_Scout"}, - {"id": 15543, "synset": "cuckold.n.01", "name": "cuckold"}, - {"id": 15544, "synset": "cultist.n.02", "name": "cultist"}, - {"id": 15545, "synset": "curandera.n.01", "name": "curandera"}, - {"id": 15546, "synset": "curate.n.01", "name": "curate"}, - {"id": 15547, "synset": "curator.n.01", "name": "curator"}, - {"id": 15548, "synset": "customer_agent.n.01", "name": "customer_agent"}, - {"id": 15549, "synset": "cutter.n.02", "name": "cutter"}, - {"id": 15550, "synset": "cyberpunk.n.02", "name": "cyberpunk"}, - {"id": 15551, "synset": "cyborg.n.01", "name": "cyborg"}, - {"id": 15552, "synset": "cymbalist.n.01", "name": "cymbalist"}, - {"id": 15553, "synset": "cynic.n.02", "name": "Cynic"}, - {"id": 15554, "synset": "cytogeneticist.n.01", "name": "cytogeneticist"}, - {"id": 15555, "synset": "cytologist.n.01", "name": "cytologist"}, - {"id": 15556, "synset": "czar.n.02", "name": "czar"}, - {"id": 15557, "synset": "czar.n.01", "name": "czar"}, - {"id": 15558, "synset": "dad.n.01", "name": "dad"}, - {"id": 15559, "synset": "dairyman.n.02", "name": "dairyman"}, - {"id": 15560, "synset": "dalai_lama.n.01", "name": "Dalai_Lama"}, - {"id": 15561, "synset": "dallier.n.01", "name": "dallier"}, - {"id": 15562, "synset": "dancer.n.01", "name": "dancer"}, - {"id": 15563, "synset": "dancer.n.02", "name": "dancer"}, - {"id": 15564, "synset": "clog_dancer.n.01", "name": "clog_dancer"}, - {"id": 15565, "synset": "dancing-master.n.01", "name": "dancing-master"}, - {"id": 15566, "synset": "dark_horse.n.01", "name": "dark_horse"}, - {"id": 15567, "synset": "darling.n.01", "name": "darling"}, - {"id": 15568, "synset": "date.n.02", "name": "date"}, - {"id": 15569, "synset": "daughter.n.01", "name": "daughter"}, - {"id": 15570, "synset": "dawdler.n.01", "name": "dawdler"}, - {"id": 15571, "synset": "day_boarder.n.01", "name": "day_boarder"}, - {"id": 15572, "synset": "day_laborer.n.01", "name": "day_laborer"}, - {"id": 15573, "synset": "deacon.n.01", "name": "deacon"}, - {"id": 15574, "synset": "deaconess.n.01", "name": "deaconess"}, - {"id": 15575, "synset": "deadeye.n.01", "name": "deadeye"}, - {"id": 15576, "synset": "deipnosophist.n.01", "name": "deipnosophist"}, - {"id": 15577, "synset": "dropout.n.02", "name": "dropout"}, - {"id": 15578, "synset": "deadhead.n.01", "name": "deadhead"}, - {"id": 15579, "synset": "deaf_person.n.01", "name": "deaf_person"}, - {"id": 15580, "synset": "debtor.n.01", "name": "debtor"}, - {"id": 15581, "synset": "deckhand.n.01", "name": "deckhand"}, - {"id": 15582, "synset": "defamer.n.01", "name": "defamer"}, - {"id": 15583, "synset": "defense_contractor.n.01", "name": "defense_contractor"}, - {"id": 15584, "synset": "deist.n.01", "name": "deist"}, - {"id": 15585, "synset": "delegate.n.01", "name": "delegate"}, - {"id": 15586, "synset": "deliveryman.n.01", "name": "deliveryman"}, - {"id": 15587, "synset": "demagogue.n.01", "name": "demagogue"}, - {"id": 15588, "synset": "demigod.n.01", "name": "demigod"}, - {"id": 15589, "synset": "demographer.n.01", "name": "demographer"}, - {"id": 15590, "synset": "demonstrator.n.03", "name": "demonstrator"}, - {"id": 15591, "synset": "den_mother.n.02", "name": "den_mother"}, - {"id": 15592, "synset": "department_head.n.01", "name": "department_head"}, - {"id": 15593, "synset": "depositor.n.01", "name": "depositor"}, - {"id": 15594, "synset": "deputy.n.03", "name": "deputy"}, - {"id": 15595, "synset": "dermatologist.n.01", "name": "dermatologist"}, - {"id": 15596, "synset": "descender.n.01", "name": "descender"}, - {"id": 15597, "synset": "designated_hitter.n.01", "name": "designated_hitter"}, - {"id": 15598, "synset": "designer.n.04", "name": "designer"}, - {"id": 15599, "synset": "desk_clerk.n.01", "name": "desk_clerk"}, - {"id": 15600, "synset": "desk_officer.n.01", "name": "desk_officer"}, - {"id": 15601, "synset": "desk_sergeant.n.01", "name": "desk_sergeant"}, - {"id": 15602, "synset": "detainee.n.01", "name": "detainee"}, - {"id": 15603, "synset": "detective.n.01", "name": "detective"}, - {"id": 15604, "synset": "detective.n.02", "name": "detective"}, - {"id": 15605, "synset": "detractor.n.01", "name": "detractor"}, - {"id": 15606, "synset": "developer.n.01", "name": "developer"}, - {"id": 15607, "synset": "deviationist.n.01", "name": "deviationist"}, - {"id": 15608, "synset": "devisee.n.01", "name": "devisee"}, - {"id": 15609, "synset": "devisor.n.01", "name": "devisor"}, - {"id": 15610, "synset": "devourer.n.01", "name": "devourer"}, - {"id": 15611, "synset": "dialectician.n.01", "name": "dialectician"}, - {"id": 15612, "synset": "diarist.n.01", "name": "diarist"}, - {"id": 15613, "synset": "dietician.n.01", "name": "dietician"}, - {"id": 15614, "synset": "diocesan.n.01", "name": "diocesan"}, - {"id": 15615, "synset": "director.n.03", "name": "director"}, - {"id": 15616, "synset": "director.n.02", "name": "director"}, - {"id": 15617, "synset": "dirty_old_man.n.01", "name": "dirty_old_man"}, - {"id": 15618, "synset": "disbeliever.n.01", "name": "disbeliever"}, - {"id": 15619, "synset": "disk_jockey.n.01", "name": "disk_jockey"}, - {"id": 15620, "synset": "dispatcher.n.02", "name": "dispatcher"}, - {"id": 15621, "synset": "distortionist.n.01", "name": "distortionist"}, - {"id": 15622, "synset": "distributor.n.01", "name": "distributor"}, - {"id": 15623, "synset": "district_attorney.n.01", "name": "district_attorney"}, - {"id": 15624, "synset": "district_manager.n.01", "name": "district_manager"}, - {"id": 15625, "synset": "diver.n.02", "name": "diver"}, - {"id": 15626, "synset": "divorcee.n.01", "name": "divorcee"}, - {"id": 15627, "synset": "ex-wife.n.01", "name": "ex-wife"}, - {"id": 15628, "synset": "divorce_lawyer.n.01", "name": "divorce_lawyer"}, - {"id": 15629, "synset": "docent.n.01", "name": "docent"}, - {"id": 15630, "synset": "doctor.n.01", "name": "doctor"}, - {"id": 15631, "synset": "dodo.n.01", "name": "dodo"}, - {"id": 15632, "synset": "doge.n.01", "name": "doge"}, - {"id": 15633, "synset": "dog_in_the_manger.n.01", "name": "dog_in_the_manger"}, - {"id": 15634, "synset": "dogmatist.n.01", "name": "dogmatist"}, - {"id": 15635, "synset": "dolichocephalic.n.01", "name": "dolichocephalic"}, - {"id": 15636, "synset": "domestic_partner.n.01", "name": "domestic_partner"}, - {"id": 15637, "synset": "dominican.n.02", "name": "Dominican"}, - {"id": 15638, "synset": "dominus.n.01", "name": "dominus"}, - {"id": 15639, "synset": "don.n.03", "name": "don"}, - {"id": 15640, "synset": "donatist.n.01", "name": "Donatist"}, - {"id": 15641, "synset": "donna.n.01", "name": "donna"}, - {"id": 15642, "synset": "dosser.n.01", "name": "dosser"}, - {"id": 15643, "synset": "double.n.03", "name": "double"}, - {"id": 15644, "synset": "double-crosser.n.01", "name": "double-crosser"}, - {"id": 15645, "synset": "down-and-out.n.01", "name": "down-and-out"}, - {"id": 15646, "synset": "doyenne.n.01", "name": "doyenne"}, - {"id": 15647, "synset": "draftsman.n.02", "name": "draftsman"}, - {"id": 15648, "synset": "dramatist.n.01", "name": "dramatist"}, - {"id": 15649, "synset": "dreamer.n.01", "name": "dreamer"}, - {"id": 15650, "synset": "dressmaker.n.01", "name": "dressmaker"}, - {"id": 15651, "synset": "dressmaker's_model.n.01", "name": "dressmaker's_model"}, - {"id": 15652, "synset": "dribbler.n.02", "name": "dribbler"}, - {"id": 15653, "synset": "dribbler.n.01", "name": "dribbler"}, - {"id": 15654, "synset": "drinker.n.02", "name": "drinker"}, - {"id": 15655, "synset": "drinker.n.01", "name": "drinker"}, - {"id": 15656, "synset": "drug_addict.n.01", "name": "drug_addict"}, - {"id": 15657, "synset": "drug_user.n.01", "name": "drug_user"}, - {"id": 15658, "synset": "druid.n.01", "name": "Druid"}, - {"id": 15659, "synset": "drum_majorette.n.02", "name": "drum_majorette"}, - {"id": 15660, "synset": "drummer.n.01", "name": "drummer"}, - {"id": 15661, "synset": "drunk.n.02", "name": "drunk"}, - {"id": 15662, "synset": "drunkard.n.01", "name": "drunkard"}, - {"id": 15663, "synset": "druze.n.01", "name": "Druze"}, - {"id": 15664, "synset": "dry.n.01", "name": "dry"}, - {"id": 15665, "synset": "dry_nurse.n.01", "name": "dry_nurse"}, - {"id": 15666, "synset": "duchess.n.01", "name": "duchess"}, - {"id": 15667, "synset": "duke.n.01", "name": "duke"}, - {"id": 15668, "synset": "duffer.n.01", "name": "duffer"}, - {"id": 15669, "synset": "dunker.n.02", "name": "dunker"}, - {"id": 15670, "synset": "dutch_uncle.n.01", "name": "Dutch_uncle"}, - {"id": 15671, "synset": "dyspeptic.n.01", "name": "dyspeptic"}, - {"id": 15672, "synset": "eager_beaver.n.01", "name": "eager_beaver"}, - {"id": 15673, "synset": "earl.n.01", "name": "earl"}, - {"id": 15674, "synset": "earner.n.01", "name": "earner"}, - {"id": 15675, "synset": "eavesdropper.n.01", "name": "eavesdropper"}, - {"id": 15676, "synset": "eccentric.n.01", "name": "eccentric"}, - {"id": 15677, "synset": "eclectic.n.01", "name": "eclectic"}, - {"id": 15678, "synset": "econometrician.n.01", "name": "econometrician"}, - {"id": 15679, "synset": "economist.n.01", "name": "economist"}, - {"id": 15680, "synset": "ectomorph.n.01", "name": "ectomorph"}, - {"id": 15681, "synset": "editor.n.01", "name": "editor"}, - {"id": 15682, "synset": "egocentric.n.01", "name": "egocentric"}, - {"id": 15683, "synset": "egotist.n.01", "name": "egotist"}, - {"id": 15684, "synset": "ejaculator.n.01", "name": "ejaculator"}, - {"id": 15685, "synset": "elder.n.03", "name": "elder"}, - {"id": 15686, "synset": "elder_statesman.n.01", "name": "elder_statesman"}, - {"id": 15687, "synset": "elected_official.n.01", "name": "elected_official"}, - {"id": 15688, "synset": "electrician.n.01", "name": "electrician"}, - {"id": 15689, "synset": "elegist.n.01", "name": "elegist"}, - {"id": 15690, "synset": "elocutionist.n.01", "name": "elocutionist"}, - {"id": 15691, "synset": "emancipator.n.01", "name": "emancipator"}, - {"id": 15692, "synset": "embryologist.n.01", "name": "embryologist"}, - {"id": 15693, "synset": "emeritus.n.01", "name": "emeritus"}, - {"id": 15694, "synset": "emigrant.n.01", "name": "emigrant"}, - {"id": 15695, "synset": "emissary.n.01", "name": "emissary"}, - {"id": 15696, "synset": "empress.n.01", "name": "empress"}, - {"id": 15697, "synset": "employee.n.01", "name": "employee"}, - {"id": 15698, "synset": "employer.n.01", "name": "employer"}, - {"id": 15699, "synset": "enchantress.n.02", "name": "enchantress"}, - {"id": 15700, "synset": "enchantress.n.01", "name": "enchantress"}, - {"id": 15701, "synset": "encyclopedist.n.01", "name": "encyclopedist"}, - {"id": 15702, "synset": "endomorph.n.01", "name": "endomorph"}, - {"id": 15703, "synset": "enemy.n.02", "name": "enemy"}, - {"id": 15704, "synset": "energizer.n.01", "name": "energizer"}, - {"id": 15705, "synset": "end_man.n.02", "name": "end_man"}, - {"id": 15706, "synset": "end_man.n.01", "name": "end_man"}, - {"id": 15707, "synset": "endorser.n.02", "name": "endorser"}, - {"id": 15708, "synset": "enjoyer.n.01", "name": "enjoyer"}, - {"id": 15709, "synset": "enlisted_woman.n.01", "name": "enlisted_woman"}, - {"id": 15710, "synset": "enophile.n.01", "name": "enophile"}, - {"id": 15711, "synset": "entrant.n.04", "name": "entrant"}, - {"id": 15712, "synset": "entrant.n.03", "name": "entrant"}, - {"id": 15713, "synset": "entrepreneur.n.01", "name": "entrepreneur"}, - {"id": 15714, "synset": "envoy.n.01", "name": "envoy"}, - {"id": 15715, "synset": "enzymologist.n.01", "name": "enzymologist"}, - {"id": 15716, "synset": "eparch.n.01", "name": "eparch"}, - {"id": 15717, "synset": "epidemiologist.n.01", "name": "epidemiologist"}, - {"id": 15718, "synset": "epigone.n.01", "name": "epigone"}, - {"id": 15719, "synset": "epileptic.n.01", "name": "epileptic"}, - {"id": 15720, "synset": "episcopalian.n.01", "name": "Episcopalian"}, - {"id": 15721, "synset": "equerry.n.02", "name": "equerry"}, - {"id": 15722, "synset": "equerry.n.01", "name": "equerry"}, - {"id": 15723, "synset": "erotic.n.01", "name": "erotic"}, - {"id": 15724, "synset": "escapee.n.01", "name": "escapee"}, - {"id": 15725, "synset": "escapist.n.01", "name": "escapist"}, - {"id": 15726, "synset": "eskimo.n.01", "name": "Eskimo"}, - {"id": 15727, "synset": "espionage_agent.n.01", "name": "espionage_agent"}, - {"id": 15728, "synset": "esthetician.n.01", "name": "esthetician"}, - {"id": 15729, "synset": "etcher.n.01", "name": "etcher"}, - {"id": 15730, "synset": "ethnologist.n.01", "name": "ethnologist"}, - {"id": 15731, "synset": "etonian.n.01", "name": "Etonian"}, - {"id": 15732, "synset": "etymologist.n.01", "name": "etymologist"}, - {"id": 15733, "synset": "evangelist.n.01", "name": "evangelist"}, - {"id": 15734, "synset": "evangelist.n.02", "name": "Evangelist"}, - {"id": 15735, "synset": "event_planner.n.01", "name": "event_planner"}, - {"id": 15736, "synset": "examiner.n.02", "name": "examiner"}, - {"id": 15737, "synset": "examiner.n.01", "name": "examiner"}, - {"id": 15738, "synset": "exarch.n.03", "name": "exarch"}, - {"id": 15739, "synset": "executant.n.01", "name": "executant"}, - {"id": 15740, "synset": "executive_secretary.n.01", "name": "executive_secretary"}, - {"id": 15741, "synset": "executive_vice_president.n.01", "name": "executive_vice_president"}, - {"id": 15742, "synset": "executrix.n.01", "name": "executrix"}, - {"id": 15743, "synset": "exegete.n.01", "name": "exegete"}, - {"id": 15744, "synset": "exhibitor.n.01", "name": "exhibitor"}, - {"id": 15745, "synset": "exhibitionist.n.02", "name": "exhibitionist"}, - {"id": 15746, "synset": "exile.n.01", "name": "exile"}, - {"id": 15747, "synset": "existentialist.n.01", "name": "existentialist"}, - {"id": 15748, "synset": "exorcist.n.02", "name": "exorcist"}, - {"id": 15749, "synset": "ex-spouse.n.01", "name": "ex-spouse"}, - {"id": 15750, "synset": "extern.n.01", "name": "extern"}, - {"id": 15751, "synset": "extremist.n.01", "name": "extremist"}, - {"id": 15752, "synset": "extrovert.n.01", "name": "extrovert"}, - {"id": 15753, "synset": "eyewitness.n.01", "name": "eyewitness"}, - {"id": 15754, "synset": "facilitator.n.01", "name": "facilitator"}, - {"id": 15755, "synset": "fairy_godmother.n.01", "name": "fairy_godmother"}, - {"id": 15756, "synset": "falangist.n.01", "name": "falangist"}, - {"id": 15757, "synset": "falconer.n.01", "name": "falconer"}, - {"id": 15758, "synset": "falsifier.n.01", "name": "falsifier"}, - {"id": 15759, "synset": "familiar.n.01", "name": "familiar"}, - {"id": 15760, "synset": "fan.n.03", "name": "fan"}, - {"id": 15761, "synset": "fanatic.n.01", "name": "fanatic"}, - {"id": 15762, "synset": "fancier.n.01", "name": "fancier"}, - {"id": 15763, "synset": "farm_boy.n.01", "name": "farm_boy"}, - {"id": 15764, "synset": "farmer.n.01", "name": "farmer"}, - {"id": 15765, "synset": "farmhand.n.01", "name": "farmhand"}, - {"id": 15766, "synset": "fascist.n.01", "name": "fascist"}, - {"id": 15767, "synset": "fascista.n.01", "name": "fascista"}, - {"id": 15768, "synset": "fatalist.n.01", "name": "fatalist"}, - {"id": 15769, "synset": "father.n.01", "name": "father"}, - {"id": 15770, "synset": "father.n.03", "name": "Father"}, - {"id": 15771, "synset": "father-figure.n.01", "name": "father-figure"}, - {"id": 15772, "synset": "father-in-law.n.01", "name": "father-in-law"}, - {"id": 15773, "synset": "fauntleroy.n.01", "name": "Fauntleroy"}, - {"id": 15774, "synset": "fauve.n.01", "name": "Fauve"}, - {"id": 15775, "synset": "favorite_son.n.01", "name": "favorite_son"}, - {"id": 15776, "synset": "featherweight.n.03", "name": "featherweight"}, - {"id": 15777, "synset": "federalist.n.02", "name": "federalist"}, - {"id": 15778, "synset": "fellow_traveler.n.01", "name": "fellow_traveler"}, - {"id": 15779, "synset": "female_aristocrat.n.01", "name": "female_aristocrat"}, - {"id": 15780, "synset": "female_offspring.n.01", "name": "female_offspring"}, - {"id": 15781, "synset": "female_child.n.01", "name": "female_child"}, - {"id": 15782, "synset": "fence.n.02", "name": "fence"}, - {"id": 15783, "synset": "fiance.n.01", "name": "fiance"}, - {"id": 15784, "synset": "fielder.n.02", "name": "fielder"}, - {"id": 15785, "synset": "field_judge.n.01", "name": "field_judge"}, - {"id": 15786, "synset": "fighter_pilot.n.01", "name": "fighter_pilot"}, - {"id": 15787, "synset": "filer.n.01", "name": "filer"}, - {"id": 15788, "synset": "film_director.n.01", "name": "film_director"}, - {"id": 15789, "synset": "finder.n.01", "name": "finder"}, - {"id": 15790, "synset": "fire_chief.n.01", "name": "fire_chief"}, - {"id": 15791, "synset": "fire-eater.n.03", "name": "fire-eater"}, - {"id": 15792, "synset": "fire-eater.n.02", "name": "fire-eater"}, - {"id": 15793, "synset": "fireman.n.04", "name": "fireman"}, - {"id": 15794, "synset": "fire_marshall.n.01", "name": "fire_marshall"}, - {"id": 15795, "synset": "fire_walker.n.01", "name": "fire_walker"}, - {"id": 15796, "synset": "first_baseman.n.01", "name": "first_baseman"}, - {"id": 15797, "synset": "firstborn.n.01", "name": "firstborn"}, - {"id": 15798, "synset": "first_lady.n.02", "name": "first_lady"}, - {"id": 15799, "synset": "first_lieutenant.n.01", "name": "first_lieutenant"}, - {"id": 15800, "synset": "first_offender.n.01", "name": "first_offender"}, - {"id": 15801, "synset": "first_sergeant.n.01", "name": "first_sergeant"}, - {"id": 15802, "synset": "fishmonger.n.01", "name": "fishmonger"}, - {"id": 15803, "synset": "flagellant.n.02", "name": "flagellant"}, - {"id": 15804, "synset": "flag_officer.n.01", "name": "flag_officer"}, - {"id": 15805, "synset": "flak_catcher.n.01", "name": "flak_catcher"}, - {"id": 15806, "synset": "flanker_back.n.01", "name": "flanker_back"}, - {"id": 15807, "synset": "flapper.n.01", "name": "flapper"}, - {"id": 15808, "synset": "flatmate.n.01", "name": "flatmate"}, - {"id": 15809, "synset": "flatterer.n.01", "name": "flatterer"}, - {"id": 15810, "synset": "flibbertigibbet.n.01", "name": "flibbertigibbet"}, - {"id": 15811, "synset": "flight_surgeon.n.01", "name": "flight_surgeon"}, - {"id": 15812, "synset": "floorwalker.n.01", "name": "floorwalker"}, - {"id": 15813, "synset": "flop.n.02", "name": "flop"}, - {"id": 15814, "synset": "florentine.n.01", "name": "Florentine"}, - {"id": 15815, "synset": "flower_girl.n.02", "name": "flower_girl"}, - {"id": 15816, "synset": "flower_girl.n.01", "name": "flower_girl"}, - {"id": 15817, "synset": "flutist.n.01", "name": "flutist"}, - {"id": 15818, "synset": "fly-by-night.n.01", "name": "fly-by-night"}, - {"id": 15819, "synset": "flyweight.n.02", "name": "flyweight"}, - {"id": 15820, "synset": "flyweight.n.01", "name": "flyweight"}, - {"id": 15821, "synset": "foe.n.02", "name": "foe"}, - {"id": 15822, "synset": "folk_dancer.n.01", "name": "folk_dancer"}, - {"id": 15823, "synset": "folk_poet.n.01", "name": "folk_poet"}, - {"id": 15824, "synset": "follower.n.01", "name": "follower"}, - {"id": 15825, "synset": "football_hero.n.01", "name": "football_hero"}, - {"id": 15826, "synset": "football_player.n.01", "name": "football_player"}, - {"id": 15827, "synset": "footman.n.01", "name": "footman"}, - {"id": 15828, "synset": "forefather.n.01", "name": "forefather"}, - {"id": 15829, "synset": "foremother.n.01", "name": "foremother"}, - {"id": 15830, "synset": "foreign_agent.n.01", "name": "foreign_agent"}, - {"id": 15831, "synset": "foreigner.n.02", "name": "foreigner"}, - {"id": 15832, "synset": "boss.n.03", "name": "boss"}, - {"id": 15833, "synset": "foreman.n.02", "name": "foreman"}, - {"id": 15834, "synset": "forester.n.02", "name": "forester"}, - {"id": 15835, "synset": "forewoman.n.02", "name": "forewoman"}, - {"id": 15836, "synset": "forger.n.02", "name": "forger"}, - {"id": 15837, "synset": "forward.n.01", "name": "forward"}, - {"id": 15838, "synset": "foster-brother.n.01", "name": "foster-brother"}, - {"id": 15839, "synset": "foster-father.n.01", "name": "foster-father"}, - {"id": 15840, "synset": "foster-mother.n.01", "name": "foster-mother"}, - {"id": 15841, "synset": "foster-sister.n.01", "name": "foster-sister"}, - {"id": 15842, "synset": "foster-son.n.01", "name": "foster-son"}, - {"id": 15843, "synset": "founder.n.02", "name": "founder"}, - {"id": 15844, "synset": "foundress.n.01", "name": "foundress"}, - {"id": 15845, "synset": "four-minute_man.n.01", "name": "four-minute_man"}, - {"id": 15846, "synset": "framer.n.02", "name": "framer"}, - {"id": 15847, "synset": "francophobe.n.01", "name": "Francophobe"}, - {"id": 15848, "synset": "freak.n.01", "name": "freak"}, - {"id": 15849, "synset": "free_agent.n.02", "name": "free_agent"}, - {"id": 15850, "synset": "free_agent.n.01", "name": "free_agent"}, - {"id": 15851, "synset": "freedom_rider.n.01", "name": "freedom_rider"}, - {"id": 15852, "synset": "free-liver.n.01", "name": "free-liver"}, - {"id": 15853, "synset": "freeloader.n.01", "name": "freeloader"}, - {"id": 15854, "synset": "free_trader.n.01", "name": "free_trader"}, - {"id": 15855, "synset": "freudian.n.01", "name": "Freudian"}, - {"id": 15856, "synset": "friar.n.01", "name": "friar"}, - {"id": 15857, "synset": "monk.n.01", "name": "monk"}, - {"id": 15858, "synset": "frontierswoman.n.01", "name": "frontierswoman"}, - {"id": 15859, "synset": "front_man.n.01", "name": "front_man"}, - {"id": 15860, "synset": "frotteur.n.01", "name": "frotteur"}, - {"id": 15861, "synset": "fucker.n.02", "name": "fucker"}, - {"id": 15862, "synset": "fucker.n.01", "name": "fucker"}, - {"id": 15863, "synset": "fuddy-duddy.n.01", "name": "fuddy-duddy"}, - {"id": 15864, "synset": "fullback.n.01", "name": "fullback"}, - {"id": 15865, "synset": "funambulist.n.01", "name": "funambulist"}, - {"id": 15866, "synset": "fundamentalist.n.01", "name": "fundamentalist"}, - {"id": 15867, "synset": "fundraiser.n.01", "name": "fundraiser"}, - {"id": 15868, "synset": "futurist.n.01", "name": "futurist"}, - {"id": 15869, "synset": "gadgeteer.n.01", "name": "gadgeteer"}, - {"id": 15870, "synset": "gagman.n.02", "name": "gagman"}, - {"id": 15871, "synset": "gagman.n.01", "name": "gagman"}, - {"id": 15872, "synset": "gainer.n.01", "name": "gainer"}, - {"id": 15873, "synset": "gal.n.03", "name": "gal"}, - {"id": 15874, "synset": "galoot.n.01", "name": "galoot"}, - {"id": 15875, "synset": "gambist.n.01", "name": "gambist"}, - {"id": 15876, "synset": "gambler.n.01", "name": "gambler"}, - {"id": 15877, "synset": "gamine.n.02", "name": "gamine"}, - {"id": 15878, "synset": "garbage_man.n.01", "name": "garbage_man"}, - {"id": 15879, "synset": "gardener.n.02", "name": "gardener"}, - {"id": 15880, "synset": "garment_cutter.n.01", "name": "garment_cutter"}, - {"id": 15881, "synset": "garroter.n.01", "name": "garroter"}, - {"id": 15882, "synset": "gasman.n.01", "name": "gasman"}, - {"id": 15883, "synset": "gastroenterologist.n.01", "name": "gastroenterologist"}, - {"id": 15884, "synset": "gatherer.n.01", "name": "gatherer"}, - {"id": 15885, "synset": "gawker.n.01", "name": "gawker"}, - {"id": 15886, "synset": "gendarme.n.01", "name": "gendarme"}, - {"id": 15887, "synset": "general.n.01", "name": "general"}, - {"id": 15888, "synset": "generator.n.03", "name": "generator"}, - {"id": 15889, "synset": "geneticist.n.01", "name": "geneticist"}, - {"id": 15890, "synset": "genitor.n.01", "name": "genitor"}, - {"id": 15891, "synset": "gent.n.01", "name": "gent"}, - {"id": 15892, "synset": "geologist.n.01", "name": "geologist"}, - {"id": 15893, "synset": "geophysicist.n.01", "name": "geophysicist"}, - {"id": 15894, "synset": "ghostwriter.n.01", "name": "ghostwriter"}, - {"id": 15895, "synset": "gibson_girl.n.01", "name": "Gibson_girl"}, - {"id": 15896, "synset": "girl.n.01", "name": "girl"}, - {"id": 15897, "synset": "girlfriend.n.02", "name": "girlfriend"}, - {"id": 15898, "synset": "girlfriend.n.01", "name": "girlfriend"}, - {"id": 15899, "synset": "girl_wonder.n.01", "name": "girl_wonder"}, - {"id": 15900, "synset": "girondist.n.01", "name": "Girondist"}, - {"id": 15901, "synset": "gitano.n.01", "name": "gitano"}, - {"id": 15902, "synset": "gladiator.n.01", "name": "gladiator"}, - {"id": 15903, "synset": "glassblower.n.01", "name": "glassblower"}, - {"id": 15904, "synset": "gleaner.n.02", "name": "gleaner"}, - {"id": 15905, "synset": "goat_herder.n.01", "name": "goat_herder"}, - {"id": 15906, "synset": "godchild.n.01", "name": "godchild"}, - {"id": 15907, "synset": "godfather.n.01", "name": "godfather"}, - {"id": 15908, "synset": "godparent.n.01", "name": "godparent"}, - {"id": 15909, "synset": "godson.n.01", "name": "godson"}, - {"id": 15910, "synset": "gofer.n.01", "name": "gofer"}, - {"id": 15911, "synset": "goffer.n.01", "name": "goffer"}, - {"id": 15912, "synset": "goldsmith.n.01", "name": "goldsmith"}, - {"id": 15913, "synset": "golfer.n.01", "name": "golfer"}, - {"id": 15914, "synset": "gondolier.n.01", "name": "gondolier"}, - {"id": 15915, "synset": "good_guy.n.01", "name": "good_guy"}, - {"id": 15916, "synset": "good_old_boy.n.01", "name": "good_old_boy"}, - {"id": 15917, "synset": "good_samaritan.n.01", "name": "good_Samaritan"}, - {"id": 15918, "synset": "gossip_columnist.n.01", "name": "gossip_columnist"}, - {"id": 15919, "synset": "gouger.n.01", "name": "gouger"}, - {"id": 15920, "synset": "governor_general.n.01", "name": "governor_general"}, - {"id": 15921, "synset": "grabber.n.01", "name": "grabber"}, - {"id": 15922, "synset": "grader.n.01", "name": "grader"}, - {"id": 15923, "synset": "graduate_nurse.n.01", "name": "graduate_nurse"}, - {"id": 15924, "synset": "grammarian.n.01", "name": "grammarian"}, - {"id": 15925, "synset": "granddaughter.n.01", "name": "granddaughter"}, - {"id": 15926, "synset": "grande_dame.n.01", "name": "grande_dame"}, - {"id": 15927, "synset": "grandfather.n.01", "name": "grandfather"}, - {"id": 15928, "synset": "grand_inquisitor.n.01", "name": "Grand_Inquisitor"}, - {"id": 15929, "synset": "grandma.n.01", "name": "grandma"}, - {"id": 15930, "synset": "grandmaster.n.01", "name": "grandmaster"}, - {"id": 15931, "synset": "grandparent.n.01", "name": "grandparent"}, - {"id": 15932, "synset": "grantee.n.01", "name": "grantee"}, - {"id": 15933, "synset": "granter.n.01", "name": "granter"}, - {"id": 15934, "synset": "grass_widower.n.01", "name": "grass_widower"}, - {"id": 15935, "synset": "great-aunt.n.01", "name": "great-aunt"}, - {"id": 15936, "synset": "great_grandchild.n.01", "name": "great_grandchild"}, - {"id": 15937, "synset": "great_granddaughter.n.01", "name": "great_granddaughter"}, - {"id": 15938, "synset": "great_grandmother.n.01", "name": "great_grandmother"}, - {"id": 15939, "synset": "great_grandparent.n.01", "name": "great_grandparent"}, - {"id": 15940, "synset": "great_grandson.n.01", "name": "great_grandson"}, - {"id": 15941, "synset": "great-nephew.n.01", "name": "great-nephew"}, - {"id": 15942, "synset": "great-niece.n.01", "name": "great-niece"}, - {"id": 15943, "synset": "green_beret.n.01", "name": "Green_Beret"}, - {"id": 15944, "synset": "grenadier.n.01", "name": "grenadier"}, - {"id": 15945, "synset": "greeter.n.01", "name": "greeter"}, - {"id": 15946, "synset": "gringo.n.01", "name": "gringo"}, - {"id": 15947, "synset": "grinner.n.01", "name": "grinner"}, - {"id": 15948, "synset": "grocer.n.01", "name": "grocer"}, - {"id": 15949, "synset": "groom.n.03", "name": "groom"}, - {"id": 15950, "synset": "groom.n.01", "name": "groom"}, - {"id": 15951, "synset": "grouch.n.01", "name": "grouch"}, - {"id": 15952, "synset": "group_captain.n.01", "name": "group_captain"}, - {"id": 15953, "synset": "grunter.n.01", "name": "grunter"}, - {"id": 15954, "synset": "prison_guard.n.01", "name": "prison_guard"}, - {"id": 15955, "synset": "guard.n.01", "name": "guard"}, - {"id": 15956, "synset": "guesser.n.01", "name": "guesser"}, - {"id": 15957, "synset": "guest.n.01", "name": "guest"}, - {"id": 15958, "synset": "guest.n.03", "name": "guest"}, - {"id": 15959, "synset": "guest_of_honor.n.01", "name": "guest_of_honor"}, - {"id": 15960, "synset": "guest_worker.n.01", "name": "guest_worker"}, - {"id": 15961, "synset": "guide.n.02", "name": "guide"}, - {"id": 15962, "synset": "guitarist.n.01", "name": "guitarist"}, - {"id": 15963, "synset": "gunnery_sergeant.n.01", "name": "gunnery_sergeant"}, - {"id": 15964, "synset": "guru.n.01", "name": "guru"}, - {"id": 15965, "synset": "guru.n.03", "name": "guru"}, - {"id": 15966, "synset": "guvnor.n.01", "name": "guvnor"}, - {"id": 15967, "synset": "guy.n.01", "name": "guy"}, - {"id": 15968, "synset": "gymnast.n.01", "name": "gymnast"}, - {"id": 15969, "synset": "gym_rat.n.01", "name": "gym_rat"}, - {"id": 15970, "synset": "gynecologist.n.01", "name": "gynecologist"}, - {"id": 15971, "synset": "gypsy.n.02", "name": "Gypsy"}, - {"id": 15972, "synset": "hack.n.01", "name": "hack"}, - {"id": 15973, "synset": "hacker.n.02", "name": "hacker"}, - {"id": 15974, "synset": "haggler.n.01", "name": "haggler"}, - {"id": 15975, "synset": "hairdresser.n.01", "name": "hairdresser"}, - {"id": 15976, "synset": "hakim.n.02", "name": "hakim"}, - {"id": 15977, "synset": "hakka.n.01", "name": "Hakka"}, - {"id": 15978, "synset": "halberdier.n.01", "name": "halberdier"}, - {"id": 15979, "synset": "halfback.n.01", "name": "halfback"}, - {"id": 15980, "synset": "half_blood.n.01", "name": "half_blood"}, - {"id": 15981, "synset": "hand.n.10", "name": "hand"}, - {"id": 15982, "synset": "animal_trainer.n.01", "name": "animal_trainer"}, - {"id": 15983, "synset": "handyman.n.01", "name": "handyman"}, - {"id": 15984, "synset": "hang_glider.n.01", "name": "hang_glider"}, - {"id": 15985, "synset": "hardliner.n.01", "name": "hardliner"}, - {"id": 15986, "synset": "harlequin.n.01", "name": "harlequin"}, - {"id": 15987, "synset": "harmonizer.n.02", "name": "harmonizer"}, - {"id": 15988, "synset": "hash_head.n.01", "name": "hash_head"}, - {"id": 15989, "synset": "hatchet_man.n.01", "name": "hatchet_man"}, - {"id": 15990, "synset": "hater.n.01", "name": "hater"}, - {"id": 15991, "synset": "hatmaker.n.01", "name": "hatmaker"}, - {"id": 15992, "synset": "headman.n.02", "name": "headman"}, - {"id": 15993, "synset": "headmaster.n.01", "name": "headmaster"}, - {"id": 15994, "synset": "head_nurse.n.01", "name": "head_nurse"}, - {"id": 15995, "synset": "hearer.n.01", "name": "hearer"}, - {"id": 15996, "synset": "heartbreaker.n.01", "name": "heartbreaker"}, - {"id": 15997, "synset": "heathen.n.01", "name": "heathen"}, - {"id": 15998, "synset": "heavyweight.n.02", "name": "heavyweight"}, - {"id": 15999, "synset": "heavy.n.01", "name": "heavy"}, - {"id": 16000, "synset": "heckler.n.01", "name": "heckler"}, - {"id": 16001, "synset": "hedger.n.02", "name": "hedger"}, - {"id": 16002, "synset": "hedger.n.01", "name": "hedger"}, - {"id": 16003, "synset": "hedonist.n.01", "name": "hedonist"}, - {"id": 16004, "synset": "heir.n.01", "name": "heir"}, - {"id": 16005, "synset": "heir_apparent.n.01", "name": "heir_apparent"}, - {"id": 16006, "synset": "heiress.n.01", "name": "heiress"}, - {"id": 16007, "synset": "heir_presumptive.n.01", "name": "heir_presumptive"}, - {"id": 16008, "synset": "hellion.n.01", "name": "hellion"}, - {"id": 16009, "synset": "helmsman.n.01", "name": "helmsman"}, - {"id": 16010, "synset": "hire.n.01", "name": "hire"}, - {"id": 16011, "synset": "hematologist.n.01", "name": "hematologist"}, - {"id": 16012, "synset": "hemiplegic.n.01", "name": "hemiplegic"}, - {"id": 16013, "synset": "herald.n.01", "name": "herald"}, - {"id": 16014, "synset": "herbalist.n.01", "name": "herbalist"}, - {"id": 16015, "synset": "herder.n.02", "name": "herder"}, - {"id": 16016, "synset": "hermaphrodite.n.01", "name": "hermaphrodite"}, - {"id": 16017, "synset": "heroine.n.02", "name": "heroine"}, - {"id": 16018, "synset": "heroin_addict.n.01", "name": "heroin_addict"}, - {"id": 16019, "synset": "hero_worshiper.n.01", "name": "hero_worshiper"}, - {"id": 16020, "synset": "herr.n.01", "name": "Herr"}, - {"id": 16021, "synset": "highbinder.n.01", "name": "highbinder"}, - {"id": 16022, "synset": "highbrow.n.01", "name": "highbrow"}, - {"id": 16023, "synset": "high_commissioner.n.01", "name": "high_commissioner"}, - {"id": 16024, "synset": "highflier.n.01", "name": "highflier"}, - {"id": 16025, "synset": "highlander.n.02", "name": "Highlander"}, - {"id": 16026, "synset": "high-muck-a-muck.n.01", "name": "high-muck-a-muck"}, - {"id": 16027, "synset": "high_priest.n.01", "name": "high_priest"}, - {"id": 16028, "synset": "highjacker.n.01", "name": "highjacker"}, - {"id": 16029, "synset": "hireling.n.01", "name": "hireling"}, - {"id": 16030, "synset": "historian.n.01", "name": "historian"}, - {"id": 16031, "synset": "hitchhiker.n.01", "name": "hitchhiker"}, - {"id": 16032, "synset": "hitter.n.02", "name": "hitter"}, - {"id": 16033, "synset": "hobbyist.n.01", "name": "hobbyist"}, - {"id": 16034, "synset": "holdout.n.01", "name": "holdout"}, - {"id": 16035, "synset": "holdover.n.01", "name": "holdover"}, - {"id": 16036, "synset": "holdup_man.n.01", "name": "holdup_man"}, - {"id": 16037, "synset": "homeboy.n.02", "name": "homeboy"}, - {"id": 16038, "synset": "homeboy.n.01", "name": "homeboy"}, - {"id": 16039, "synset": "home_buyer.n.01", "name": "home_buyer"}, - {"id": 16040, "synset": "homegirl.n.01", "name": "homegirl"}, - {"id": 16041, "synset": "homeless.n.01", "name": "homeless"}, - {"id": 16042, "synset": "homeopath.n.01", "name": "homeopath"}, - {"id": 16043, "synset": "honest_woman.n.01", "name": "honest_woman"}, - {"id": 16044, "synset": "honor_guard.n.01", "name": "honor_guard"}, - {"id": 16045, "synset": "hooker.n.05", "name": "hooker"}, - {"id": 16046, "synset": "hoper.n.01", "name": "hoper"}, - {"id": 16047, "synset": "hornist.n.01", "name": "hornist"}, - {"id": 16048, "synset": "horseman.n.01", "name": "horseman"}, - {"id": 16049, "synset": "horse_trader.n.01", "name": "horse_trader"}, - {"id": 16050, "synset": "horsewoman.n.01", "name": "horsewoman"}, - {"id": 16051, "synset": "horse_wrangler.n.01", "name": "horse_wrangler"}, - {"id": 16052, "synset": "horticulturist.n.01", "name": "horticulturist"}, - {"id": 16053, "synset": "hospital_chaplain.n.01", "name": "hospital_chaplain"}, - {"id": 16054, "synset": "host.n.08", "name": "host"}, - {"id": 16055, "synset": "host.n.01", "name": "host"}, - {"id": 16056, "synset": "hostess.n.01", "name": "hostess"}, - {"id": 16057, "synset": "hotelier.n.01", "name": "hotelier"}, - {"id": 16058, "synset": "housekeeper.n.01", "name": "housekeeper"}, - {"id": 16059, "synset": "housemaster.n.01", "name": "housemaster"}, - {"id": 16060, "synset": "housemate.n.01", "name": "housemate"}, - {"id": 16061, "synset": "house_physician.n.01", "name": "house_physician"}, - {"id": 16062, "synset": "house_sitter.n.01", "name": "house_sitter"}, - {"id": 16063, "synset": "housing_commissioner.n.01", "name": "housing_commissioner"}, - {"id": 16064, "synset": "huckster.n.01", "name": "huckster"}, - {"id": 16065, "synset": "hugger.n.01", "name": "hugger"}, - {"id": 16066, "synset": "humanist.n.02", "name": "humanist"}, - {"id": 16067, "synset": "humanitarian.n.01", "name": "humanitarian"}, - {"id": 16068, "synset": "hunk.n.01", "name": "hunk"}, - {"id": 16069, "synset": "huntress.n.01", "name": "huntress"}, - {"id": 16070, "synset": "ex-husband.n.01", "name": "ex-husband"}, - {"id": 16071, "synset": "hydrologist.n.01", "name": "hydrologist"}, - {"id": 16072, "synset": "hyperope.n.01", "name": "hyperope"}, - {"id": 16073, "synset": "hypertensive.n.01", "name": "hypertensive"}, - {"id": 16074, "synset": "hypnotist.n.01", "name": "hypnotist"}, - {"id": 16075, "synset": "hypocrite.n.01", "name": "hypocrite"}, - {"id": 16076, "synset": "iceman.n.01", "name": "iceman"}, - {"id": 16077, "synset": "iconoclast.n.02", "name": "iconoclast"}, - {"id": 16078, "synset": "ideologist.n.01", "name": "ideologist"}, - {"id": 16079, "synset": "idol.n.02", "name": "idol"}, - {"id": 16080, "synset": "idolizer.n.01", "name": "idolizer"}, - {"id": 16081, "synset": "imam.n.01", "name": "imam"}, - {"id": 16082, "synset": "imperialist.n.01", "name": "imperialist"}, - {"id": 16083, "synset": "important_person.n.01", "name": "important_person"}, - {"id": 16084, "synset": "inamorato.n.01", "name": "inamorato"}, - {"id": 16085, "synset": "incumbent.n.01", "name": "incumbent"}, - {"id": 16086, "synset": "incurable.n.01", "name": "incurable"}, - {"id": 16087, "synset": "inductee.n.01", "name": "inductee"}, - {"id": 16088, "synset": "industrialist.n.01", "name": "industrialist"}, - {"id": 16089, "synset": "infanticide.n.01", "name": "infanticide"}, - {"id": 16090, "synset": "inferior.n.01", "name": "inferior"}, - {"id": 16091, "synset": "infernal.n.01", "name": "infernal"}, - {"id": 16092, "synset": "infielder.n.01", "name": "infielder"}, - {"id": 16093, "synset": "infiltrator.n.02", "name": "infiltrator"}, - {"id": 16094, "synset": "informer.n.01", "name": "informer"}, - {"id": 16095, "synset": "ingenue.n.02", "name": "ingenue"}, - {"id": 16096, "synset": "ingenue.n.01", "name": "ingenue"}, - {"id": 16097, "synset": "polymath.n.01", "name": "polymath"}, - {"id": 16098, "synset": "in-law.n.01", "name": "in-law"}, - {"id": 16099, "synset": "inquiry_agent.n.01", "name": "inquiry_agent"}, - {"id": 16100, "synset": "inspector.n.01", "name": "inspector"}, - {"id": 16101, "synset": "inspector_general.n.01", "name": "inspector_general"}, - {"id": 16102, "synset": "instigator.n.02", "name": "instigator"}, - {"id": 16103, "synset": "insurance_broker.n.01", "name": "insurance_broker"}, - {"id": 16104, "synset": "insurgent.n.01", "name": "insurgent"}, - {"id": 16105, "synset": "intelligence_analyst.n.01", "name": "intelligence_analyst"}, - {"id": 16106, "synset": "interior_designer.n.01", "name": "interior_designer"}, - {"id": 16107, "synset": "interlocutor.n.02", "name": "interlocutor"}, - {"id": 16108, "synset": "interlocutor.n.01", "name": "interlocutor"}, - {"id": 16109, "synset": "international_grandmaster.n.01", "name": "International_Grandmaster"}, - {"id": 16110, "synset": "internationalist.n.02", "name": "internationalist"}, - {"id": 16111, "synset": "internist.n.01", "name": "internist"}, - {"id": 16112, "synset": "interpreter.n.01", "name": "interpreter"}, - {"id": 16113, "synset": "interpreter.n.02", "name": "interpreter"}, - {"id": 16114, "synset": "intervenor.n.01", "name": "intervenor"}, - {"id": 16115, "synset": "introvert.n.01", "name": "introvert"}, - {"id": 16116, "synset": "invader.n.01", "name": "invader"}, - {"id": 16117, "synset": "invalidator.n.01", "name": "invalidator"}, - {"id": 16118, "synset": "investigator.n.02", "name": "investigator"}, - {"id": 16119, "synset": "investor.n.01", "name": "investor"}, - {"id": 16120, "synset": "invigilator.n.01", "name": "invigilator"}, - {"id": 16121, "synset": "irreligionist.n.01", "name": "irreligionist"}, - {"id": 16122, "synset": "ivy_leaguer.n.01", "name": "Ivy_Leaguer"}, - {"id": 16123, "synset": "jack_of_all_trades.n.01", "name": "Jack_of_all_trades"}, - {"id": 16124, "synset": "jacksonian.n.01", "name": "Jacksonian"}, - {"id": 16125, "synset": "jane_doe.n.01", "name": "Jane_Doe"}, - {"id": 16126, "synset": "janissary.n.01", "name": "janissary"}, - {"id": 16127, "synset": "jat.n.01", "name": "Jat"}, - {"id": 16128, "synset": "javanese.n.01", "name": "Javanese"}, - {"id": 16129, "synset": "jekyll_and_hyde.n.01", "name": "Jekyll_and_Hyde"}, - {"id": 16130, "synset": "jester.n.01", "name": "jester"}, - {"id": 16131, "synset": "jesuit.n.01", "name": "Jesuit"}, - {"id": 16132, "synset": "jezebel.n.02", "name": "jezebel"}, - {"id": 16133, "synset": "jilt.n.01", "name": "jilt"}, - {"id": 16134, "synset": "jobber.n.01", "name": "jobber"}, - {"id": 16135, "synset": "job_candidate.n.01", "name": "job_candidate"}, - {"id": 16136, "synset": "job's_comforter.n.01", "name": "Job's_comforter"}, - {"id": 16137, "synset": "jockey.n.01", "name": "jockey"}, - {"id": 16138, "synset": "john_doe.n.02", "name": "John_Doe"}, - {"id": 16139, "synset": "journalist.n.01", "name": "journalist"}, - {"id": 16140, "synset": "judge.n.01", "name": "judge"}, - {"id": 16141, "synset": "judge_advocate.n.01", "name": "judge_advocate"}, - {"id": 16142, "synset": "juggler.n.01", "name": "juggler"}, - {"id": 16143, "synset": "jungian.n.01", "name": "Jungian"}, - {"id": 16144, "synset": "junior.n.03", "name": "junior"}, - {"id": 16145, "synset": "junior.n.02", "name": "junior"}, - {"id": 16146, "synset": "junior.n.04", "name": "Junior"}, - {"id": 16147, "synset": "junior_lightweight.n.01", "name": "junior_lightweight"}, - {"id": 16148, "synset": "junior_middleweight.n.01", "name": "junior_middleweight"}, - {"id": 16149, "synset": "jurist.n.01", "name": "jurist"}, - {"id": 16150, "synset": "juror.n.01", "name": "juror"}, - {"id": 16151, "synset": "justice_of_the_peace.n.01", "name": "justice_of_the_peace"}, - {"id": 16152, "synset": "justiciar.n.01", "name": "justiciar"}, - {"id": 16153, "synset": "kachina.n.01", "name": "kachina"}, - {"id": 16154, "synset": "keyboardist.n.01", "name": "keyboardist"}, - {"id": 16155, "synset": "khedive.n.01", "name": "Khedive"}, - {"id": 16156, "synset": "kingmaker.n.02", "name": "kingmaker"}, - {"id": 16157, "synset": "king.n.02", "name": "king"}, - {"id": 16158, "synset": "king's_counsel.n.01", "name": "King's_Counsel"}, - {"id": 16159, "synset": "counsel_to_the_crown.n.01", "name": "Counsel_to_the_Crown"}, - {"id": 16160, "synset": "kin.n.01", "name": "kin"}, - {"id": 16161, "synset": "enate.n.01", "name": "enate"}, - {"id": 16162, "synset": "kink.n.03", "name": "kink"}, - {"id": 16163, "synset": "kinswoman.n.01", "name": "kinswoman"}, - {"id": 16164, "synset": "kisser.n.01", "name": "kisser"}, - {"id": 16165, "synset": "kitchen_help.n.01", "name": "kitchen_help"}, - {"id": 16166, "synset": "kitchen_police.n.01", "name": "kitchen_police"}, - {"id": 16167, "synset": "klansman.n.01", "name": "Klansman"}, - {"id": 16168, "synset": "kleptomaniac.n.01", "name": "kleptomaniac"}, - {"id": 16169, "synset": "kneeler.n.01", "name": "kneeler"}, - {"id": 16170, "synset": "knight.n.01", "name": "knight"}, - {"id": 16171, "synset": "knocker.n.01", "name": "knocker"}, - {"id": 16172, "synset": "knower.n.01", "name": "knower"}, - {"id": 16173, "synset": "know-it-all.n.01", "name": "know-it-all"}, - {"id": 16174, "synset": "kolkhoznik.n.01", "name": "kolkhoznik"}, - {"id": 16175, "synset": "kshatriya.n.01", "name": "Kshatriya"}, - {"id": 16176, "synset": "labor_coach.n.01", "name": "labor_coach"}, - {"id": 16177, "synset": "laborer.n.01", "name": "laborer"}, - {"id": 16178, "synset": "labourite.n.01", "name": "Labourite"}, - {"id": 16179, "synset": "lady.n.01", "name": "lady"}, - {"id": 16180, "synset": "lady-in-waiting.n.01", "name": "lady-in-waiting"}, - {"id": 16181, "synset": "lady's_maid.n.01", "name": "lady's_maid"}, - {"id": 16182, "synset": "lama.n.01", "name": "lama"}, - {"id": 16183, "synset": "lamb.n.04", "name": "lamb"}, - {"id": 16184, "synset": "lame_duck.n.01", "name": "lame_duck"}, - {"id": 16185, "synset": "lamplighter.n.01", "name": "lamplighter"}, - {"id": 16186, "synset": "land_agent.n.02", "name": "land_agent"}, - {"id": 16187, "synset": "landgrave.n.01", "name": "landgrave"}, - {"id": 16188, "synset": "landlubber.n.02", "name": "landlubber"}, - {"id": 16189, "synset": "landlubber.n.01", "name": "landlubber"}, - {"id": 16190, "synset": "landowner.n.01", "name": "landowner"}, - {"id": 16191, "synset": "landscape_architect.n.01", "name": "landscape_architect"}, - {"id": 16192, "synset": "langlaufer.n.01", "name": "langlaufer"}, - {"id": 16193, "synset": "languisher.n.01", "name": "languisher"}, - {"id": 16194, "synset": "lapidary.n.01", "name": "lapidary"}, - {"id": 16195, "synset": "lass.n.01", "name": "lass"}, - {"id": 16196, "synset": "latin.n.03", "name": "Latin"}, - {"id": 16197, "synset": "latin.n.02", "name": "Latin"}, - {"id": 16198, "synset": "latitudinarian.n.01", "name": "latitudinarian"}, - {"id": 16199, "synset": "jehovah's_witness.n.01", "name": "Jehovah's_Witness"}, - {"id": 16200, "synset": "law_agent.n.01", "name": "law_agent"}, - {"id": 16201, "synset": "lawgiver.n.01", "name": "lawgiver"}, - {"id": 16202, "synset": "lawman.n.01", "name": "lawman"}, - {"id": 16203, "synset": "law_student.n.01", "name": "law_student"}, - {"id": 16204, "synset": "lawyer.n.01", "name": "lawyer"}, - {"id": 16205, "synset": "lay_reader.n.01", "name": "lay_reader"}, - {"id": 16206, "synset": "lazybones.n.01", "name": "lazybones"}, - {"id": 16207, "synset": "leaker.n.01", "name": "leaker"}, - {"id": 16208, "synset": "leaseholder.n.01", "name": "leaseholder"}, - {"id": 16209, "synset": "lector.n.02", "name": "lector"}, - {"id": 16210, "synset": "lector.n.01", "name": "lector"}, - {"id": 16211, "synset": "lecturer.n.02", "name": "lecturer"}, - {"id": 16212, "synset": "left-hander.n.02", "name": "left-hander"}, - {"id": 16213, "synset": "legal_representative.n.01", "name": "legal_representative"}, - {"id": 16214, "synset": "legate.n.01", "name": "legate"}, - {"id": 16215, "synset": "legatee.n.01", "name": "legatee"}, - {"id": 16216, "synset": "legionnaire.n.02", "name": "legionnaire"}, - {"id": 16217, "synset": "letterman.n.01", "name": "letterman"}, - {"id": 16218, "synset": "liberator.n.01", "name": "liberator"}, - {"id": 16219, "synset": "licenser.n.01", "name": "licenser"}, - {"id": 16220, "synset": "licentiate.n.01", "name": "licentiate"}, - {"id": 16221, "synset": "lieutenant.n.01", "name": "lieutenant"}, - {"id": 16222, "synset": "lieutenant_colonel.n.01", "name": "lieutenant_colonel"}, - {"id": 16223, "synset": "lieutenant_commander.n.01", "name": "lieutenant_commander"}, - {"id": 16224, "synset": "lieutenant_junior_grade.n.01", "name": "lieutenant_junior_grade"}, - {"id": 16225, "synset": "life.n.08", "name": "life"}, - {"id": 16226, "synset": "lifeguard.n.01", "name": "lifeguard"}, - {"id": 16227, "synset": "life_tenant.n.01", "name": "life_tenant"}, - {"id": 16228, "synset": "light_flyweight.n.01", "name": "light_flyweight"}, - {"id": 16229, "synset": "light_heavyweight.n.03", "name": "light_heavyweight"}, - {"id": 16230, "synset": "light_heavyweight.n.01", "name": "light_heavyweight"}, - {"id": 16231, "synset": "light-o'-love.n.01", "name": "light-o'-love"}, - {"id": 16232, "synset": "lightweight.n.01", "name": "lightweight"}, - {"id": 16233, "synset": "lightweight.n.04", "name": "lightweight"}, - {"id": 16234, "synset": "lightweight.n.03", "name": "lightweight"}, - {"id": 16235, "synset": "lilliputian.n.01", "name": "lilliputian"}, - {"id": 16236, "synset": "limnologist.n.01", "name": "limnologist"}, - {"id": 16237, "synset": "lineman.n.01", "name": "lineman"}, - {"id": 16238, "synset": "line_officer.n.01", "name": "line_officer"}, - {"id": 16239, "synset": "lion-hunter.n.01", "name": "lion-hunter"}, - {"id": 16240, "synset": "lisper.n.01", "name": "lisper"}, - {"id": 16241, "synset": "lister.n.02", "name": "lister"}, - {"id": 16242, "synset": "literary_critic.n.01", "name": "literary_critic"}, - {"id": 16243, "synset": "literate.n.01", "name": "literate"}, - {"id": 16244, "synset": "litigant.n.01", "name": "litigant"}, - {"id": 16245, "synset": "litterer.n.01", "name": "litterer"}, - {"id": 16246, "synset": "little_brother.n.01", "name": "little_brother"}, - {"id": 16247, "synset": "little_sister.n.01", "name": "little_sister"}, - {"id": 16248, "synset": "lobbyist.n.01", "name": "lobbyist"}, - {"id": 16249, "synset": "locksmith.n.01", "name": "locksmith"}, - {"id": 16250, "synset": "locum_tenens.n.01", "name": "locum_tenens"}, - {"id": 16251, "synset": "lord.n.03", "name": "Lord"}, - {"id": 16252, "synset": "loser.n.03", "name": "loser"}, - {"id": 16253, "synset": "loser.n.01", "name": "loser"}, - {"id": 16254, "synset": "failure.n.04", "name": "failure"}, - {"id": 16255, "synset": "lothario.n.01", "name": "Lothario"}, - {"id": 16256, "synset": "loudmouth.n.01", "name": "loudmouth"}, - {"id": 16257, "synset": "lowerclassman.n.01", "name": "lowerclassman"}, - {"id": 16258, "synset": "lowlander.n.01", "name": "Lowlander"}, - {"id": 16259, "synset": "loyalist.n.01", "name": "loyalist"}, - {"id": 16260, "synset": "luddite.n.01", "name": "Luddite"}, - {"id": 16261, "synset": "lumberman.n.01", "name": "lumberman"}, - {"id": 16262, "synset": "lumper.n.02", "name": "lumper"}, - {"id": 16263, "synset": "bedlamite.n.01", "name": "bedlamite"}, - {"id": 16264, "synset": "pyromaniac.n.01", "name": "pyromaniac"}, - {"id": 16265, "synset": "lutist.n.01", "name": "lutist"}, - {"id": 16266, "synset": "lutheran.n.01", "name": "Lutheran"}, - {"id": 16267, "synset": "lyricist.n.01", "name": "lyricist"}, - {"id": 16268, "synset": "macebearer.n.01", "name": "macebearer"}, - {"id": 16269, "synset": "machinist.n.01", "name": "machinist"}, - {"id": 16270, "synset": "madame.n.01", "name": "madame"}, - {"id": 16271, "synset": "maenad.n.01", "name": "maenad"}, - {"id": 16272, "synset": "maestro.n.01", "name": "maestro"}, - {"id": 16273, "synset": "magdalen.n.01", "name": "magdalen"}, - {"id": 16274, "synset": "magician.n.01", "name": "magician"}, - {"id": 16275, "synset": "magus.n.01", "name": "magus"}, - {"id": 16276, "synset": "maharani.n.01", "name": "maharani"}, - {"id": 16277, "synset": "mahatma.n.01", "name": "mahatma"}, - {"id": 16278, "synset": "maid.n.02", "name": "maid"}, - {"id": 16279, "synset": "maid.n.01", "name": "maid"}, - {"id": 16280, "synset": "major.n.01", "name": "major"}, - {"id": 16281, "synset": "major.n.03", "name": "major"}, - {"id": 16282, "synset": "major-domo.n.01", "name": "major-domo"}, - {"id": 16283, "synset": "maker.n.01", "name": "maker"}, - {"id": 16284, "synset": "malahini.n.01", "name": "malahini"}, - {"id": 16285, "synset": "malcontent.n.01", "name": "malcontent"}, - {"id": 16286, "synset": "malik.n.01", "name": "malik"}, - {"id": 16287, "synset": "malingerer.n.01", "name": "malingerer"}, - {"id": 16288, "synset": "malthusian.n.01", "name": "Malthusian"}, - {"id": 16289, "synset": "adonis.n.01", "name": "adonis"}, - {"id": 16290, "synset": "man.n.03", "name": "man"}, - {"id": 16291, "synset": "man.n.05", "name": "man"}, - {"id": 16292, "synset": "manageress.n.01", "name": "manageress"}, - {"id": 16293, "synset": "mandarin.n.03", "name": "mandarin"}, - {"id": 16294, "synset": "maneuverer.n.01", "name": "maneuverer"}, - {"id": 16295, "synset": "maniac.n.02", "name": "maniac"}, - {"id": 16296, "synset": "manichaean.n.01", "name": "Manichaean"}, - {"id": 16297, "synset": "manicurist.n.01", "name": "manicurist"}, - {"id": 16298, "synset": "manipulator.n.02", "name": "manipulator"}, - {"id": 16299, "synset": "man-at-arms.n.01", "name": "man-at-arms"}, - {"id": 16300, "synset": "man_of_action.n.01", "name": "man_of_action"}, - {"id": 16301, "synset": "man_of_letters.n.01", "name": "man_of_letters"}, - {"id": 16302, "synset": "manufacturer.n.02", "name": "manufacturer"}, - {"id": 16303, "synset": "marcher.n.02", "name": "marcher"}, - {"id": 16304, "synset": "marchioness.n.02", "name": "marchioness"}, - {"id": 16305, "synset": "margrave.n.02", "name": "margrave"}, - {"id": 16306, "synset": "margrave.n.01", "name": "margrave"}, - {"id": 16307, "synset": "marine.n.01", "name": "Marine"}, - {"id": 16308, "synset": "marquess.n.02", "name": "marquess"}, - {"id": 16309, "synset": "marquis.n.02", "name": "marquis"}, - {"id": 16310, "synset": "marshal.n.02", "name": "marshal"}, - {"id": 16311, "synset": "martinet.n.01", "name": "martinet"}, - {"id": 16312, "synset": "masochist.n.01", "name": "masochist"}, - {"id": 16313, "synset": "mason.n.04", "name": "mason"}, - {"id": 16314, "synset": "masquerader.n.01", "name": "masquerader"}, - {"id": 16315, "synset": "masseur.n.01", "name": "masseur"}, - {"id": 16316, "synset": "masseuse.n.01", "name": "masseuse"}, - {"id": 16317, "synset": "master.n.04", "name": "master"}, - {"id": 16318, "synset": "master.n.07", "name": "master"}, - {"id": 16319, "synset": "master-at-arms.n.01", "name": "master-at-arms"}, - {"id": 16320, "synset": "master_of_ceremonies.n.01", "name": "master_of_ceremonies"}, - {"id": 16321, "synset": "masturbator.n.01", "name": "masturbator"}, - {"id": 16322, "synset": "matchmaker.n.01", "name": "matchmaker"}, - {"id": 16323, "synset": "mate.n.01", "name": "mate"}, - {"id": 16324, "synset": "mate.n.08", "name": "mate"}, - {"id": 16325, "synset": "mate.n.03", "name": "mate"}, - {"id": 16326, "synset": "mater.n.01", "name": "mater"}, - {"id": 16327, "synset": "material.n.05", "name": "material"}, - {"id": 16328, "synset": "materialist.n.02", "name": "materialist"}, - {"id": 16329, "synset": "matriarch.n.01", "name": "matriarch"}, - {"id": 16330, "synset": "matriarch.n.02", "name": "matriarch"}, - {"id": 16331, "synset": "matriculate.n.01", "name": "matriculate"}, - {"id": 16332, "synset": "matron.n.01", "name": "matron"}, - {"id": 16333, "synset": "mayor.n.01", "name": "mayor"}, - {"id": 16334, "synset": "mayoress.n.01", "name": "mayoress"}, - {"id": 16335, "synset": "mechanical_engineer.n.01", "name": "mechanical_engineer"}, - {"id": 16336, "synset": "medalist.n.02", "name": "medalist"}, - {"id": 16337, "synset": "medical_officer.n.01", "name": "medical_officer"}, - {"id": 16338, "synset": "medical_practitioner.n.01", "name": "medical_practitioner"}, - {"id": 16339, "synset": "medical_scientist.n.01", "name": "medical_scientist"}, - {"id": 16340, "synset": "medium.n.09", "name": "medium"}, - {"id": 16341, "synset": "megalomaniac.n.01", "name": "megalomaniac"}, - {"id": 16342, "synset": "melancholic.n.01", "name": "melancholic"}, - {"id": 16343, "synset": "melkite.n.01", "name": "Melkite"}, - {"id": 16344, "synset": "melter.n.01", "name": "melter"}, - {"id": 16345, "synset": "nonmember.n.01", "name": "nonmember"}, - {"id": 16346, "synset": "board_member.n.01", "name": "board_member"}, - {"id": 16347, "synset": "clansman.n.01", "name": "clansman"}, - {"id": 16348, "synset": "memorizer.n.01", "name": "memorizer"}, - {"id": 16349, "synset": "mendelian.n.01", "name": "Mendelian"}, - {"id": 16350, "synset": "mender.n.01", "name": "mender"}, - {"id": 16351, "synset": "mesoamerican.n.01", "name": "Mesoamerican"}, - {"id": 16352, "synset": "messmate.n.01", "name": "messmate"}, - {"id": 16353, "synset": "mestiza.n.01", "name": "mestiza"}, - {"id": 16354, "synset": "meteorologist.n.01", "name": "meteorologist"}, - {"id": 16355, "synset": "meter_maid.n.01", "name": "meter_maid"}, - {"id": 16356, "synset": "methodist.n.01", "name": "Methodist"}, - {"id": 16357, "synset": "metis.n.01", "name": "Metis"}, - {"id": 16358, "synset": "metropolitan.n.01", "name": "metropolitan"}, - {"id": 16359, "synset": "mezzo-soprano.n.01", "name": "mezzo-soprano"}, - {"id": 16360, "synset": "microeconomist.n.01", "name": "microeconomist"}, - {"id": 16361, "synset": "middle-aged_man.n.01", "name": "middle-aged_man"}, - {"id": 16362, "synset": "middlebrow.n.01", "name": "middlebrow"}, - {"id": 16363, "synset": "middleweight.n.01", "name": "middleweight"}, - {"id": 16364, "synset": "midwife.n.01", "name": "midwife"}, - {"id": 16365, "synset": "mikado.n.01", "name": "mikado"}, - {"id": 16366, "synset": "milanese.n.01", "name": "Milanese"}, - {"id": 16367, "synset": "miler.n.02", "name": "miler"}, - {"id": 16368, "synset": "miles_gloriosus.n.01", "name": "miles_gloriosus"}, - {"id": 16369, "synset": "military_attache.n.01", "name": "military_attache"}, - {"id": 16370, "synset": "military_chaplain.n.01", "name": "military_chaplain"}, - {"id": 16371, "synset": "military_leader.n.01", "name": "military_leader"}, - {"id": 16372, "synset": "military_officer.n.01", "name": "military_officer"}, - {"id": 16373, "synset": "military_policeman.n.01", "name": "military_policeman"}, - {"id": 16374, "synset": "mill_agent.n.01", "name": "mill_agent"}, - {"id": 16375, "synset": "mill-hand.n.01", "name": "mill-hand"}, - {"id": 16376, "synset": "millionairess.n.01", "name": "millionairess"}, - {"id": 16377, "synset": "millwright.n.01", "name": "millwright"}, - {"id": 16378, "synset": "minder.n.01", "name": "minder"}, - {"id": 16379, "synset": "mining_engineer.n.01", "name": "mining_engineer"}, - {"id": 16380, "synset": "minister.n.02", "name": "minister"}, - {"id": 16381, "synset": "ministrant.n.01", "name": "ministrant"}, - {"id": 16382, "synset": "minor_leaguer.n.01", "name": "minor_leaguer"}, - {"id": 16383, "synset": "minuteman.n.01", "name": "Minuteman"}, - {"id": 16384, "synset": "misanthrope.n.01", "name": "misanthrope"}, - {"id": 16385, "synset": "misfit.n.01", "name": "misfit"}, - {"id": 16386, "synset": "mistress.n.03", "name": "mistress"}, - {"id": 16387, "synset": "mistress.n.01", "name": "mistress"}, - {"id": 16388, "synset": "mixed-blood.n.01", "name": "mixed-blood"}, - {"id": 16389, "synset": "model.n.03", "name": "model"}, - {"id": 16390, "synset": "class_act.n.01", "name": "class_act"}, - {"id": 16391, "synset": "modeler.n.01", "name": "modeler"}, - {"id": 16392, "synset": "modifier.n.02", "name": "modifier"}, - {"id": 16393, "synset": "molecular_biologist.n.01", "name": "molecular_biologist"}, - {"id": 16394, "synset": "monegasque.n.01", "name": "Monegasque"}, - {"id": 16395, "synset": "monetarist.n.01", "name": "monetarist"}, - {"id": 16396, "synset": "moneygrubber.n.01", "name": "moneygrubber"}, - {"id": 16397, "synset": "moneymaker.n.01", "name": "moneymaker"}, - {"id": 16398, "synset": "mongoloid.n.01", "name": "Mongoloid"}, - {"id": 16399, "synset": "monolingual.n.01", "name": "monolingual"}, - {"id": 16400, "synset": "monologist.n.01", "name": "monologist"}, - {"id": 16401, "synset": "moonlighter.n.01", "name": "moonlighter"}, - {"id": 16402, "synset": "moralist.n.01", "name": "moralist"}, - {"id": 16403, "synset": "morosoph.n.01", "name": "morosoph"}, - {"id": 16404, "synset": "morris_dancer.n.01", "name": "morris_dancer"}, - {"id": 16405, "synset": "mortal_enemy.n.01", "name": "mortal_enemy"}, - {"id": 16406, "synset": "mortgagee.n.01", "name": "mortgagee"}, - {"id": 16407, "synset": "mortician.n.01", "name": "mortician"}, - {"id": 16408, "synset": "moss-trooper.n.01", "name": "moss-trooper"}, - {"id": 16409, "synset": "mother.n.01", "name": "mother"}, - {"id": 16410, "synset": "mother.n.04", "name": "mother"}, - {"id": 16411, "synset": "mother.n.03", "name": "mother"}, - {"id": 16412, "synset": "mother_figure.n.01", "name": "mother_figure"}, - {"id": 16413, "synset": "mother_hen.n.01", "name": "mother_hen"}, - {"id": 16414, "synset": "mother-in-law.n.01", "name": "mother-in-law"}, - {"id": 16415, "synset": "mother's_boy.n.01", "name": "mother's_boy"}, - {"id": 16416, "synset": "mother's_daughter.n.01", "name": "mother's_daughter"}, - {"id": 16417, "synset": "motorcycle_cop.n.01", "name": "motorcycle_cop"}, - {"id": 16418, "synset": "motorcyclist.n.01", "name": "motorcyclist"}, - {"id": 16419, "synset": "mound_builder.n.01", "name": "Mound_Builder"}, - {"id": 16420, "synset": "mountebank.n.01", "name": "mountebank"}, - {"id": 16421, "synset": "mourner.n.01", "name": "mourner"}, - {"id": 16422, "synset": "mouthpiece.n.03", "name": "mouthpiece"}, - {"id": 16423, "synset": "mover.n.03", "name": "mover"}, - {"id": 16424, "synset": "moviegoer.n.01", "name": "moviegoer"}, - {"id": 16425, "synset": "muffin_man.n.01", "name": "muffin_man"}, - {"id": 16426, "synset": "mugwump.n.02", "name": "mugwump"}, - {"id": 16427, "synset": "mullah.n.01", "name": "Mullah"}, - {"id": 16428, "synset": "muncher.n.01", "name": "muncher"}, - {"id": 16429, "synset": "murderess.n.01", "name": "murderess"}, - {"id": 16430, "synset": "murder_suspect.n.01", "name": "murder_suspect"}, - {"id": 16431, "synset": "musher.n.01", "name": "musher"}, - {"id": 16432, "synset": "musician.n.01", "name": "musician"}, - {"id": 16433, "synset": "musicologist.n.01", "name": "musicologist"}, - {"id": 16434, "synset": "music_teacher.n.01", "name": "music_teacher"}, - {"id": 16435, "synset": "musketeer.n.01", "name": "musketeer"}, - {"id": 16436, "synset": "muslimah.n.01", "name": "Muslimah"}, - {"id": 16437, "synset": "mutilator.n.01", "name": "mutilator"}, - {"id": 16438, "synset": "mutineer.n.01", "name": "mutineer"}, - {"id": 16439, "synset": "mute.n.01", "name": "mute"}, - {"id": 16440, "synset": "mutterer.n.01", "name": "mutterer"}, - {"id": 16441, "synset": "muzzler.n.01", "name": "muzzler"}, - {"id": 16442, "synset": "mycenaen.n.01", "name": "Mycenaen"}, - {"id": 16443, "synset": "mycologist.n.01", "name": "mycologist"}, - {"id": 16444, "synset": "myope.n.01", "name": "myope"}, - {"id": 16445, "synset": "myrmidon.n.01", "name": "myrmidon"}, - {"id": 16446, "synset": "mystic.n.01", "name": "mystic"}, - {"id": 16447, "synset": "mythologist.n.01", "name": "mythologist"}, - {"id": 16448, "synset": "naif.n.01", "name": "naif"}, - {"id": 16449, "synset": "nailer.n.01", "name": "nailer"}, - {"id": 16450, "synset": "namby-pamby.n.01", "name": "namby-pamby"}, - {"id": 16451, "synset": "name_dropper.n.01", "name": "name_dropper"}, - {"id": 16452, "synset": "namer.n.01", "name": "namer"}, - {"id": 16453, "synset": "nan.n.01", "name": "nan"}, - {"id": 16454, "synset": "nanny.n.01", "name": "nanny"}, - {"id": 16455, "synset": "narc.n.01", "name": "narc"}, - {"id": 16456, "synset": "narcissist.n.01", "name": "narcissist"}, - {"id": 16457, "synset": "nark.n.01", "name": "nark"}, - {"id": 16458, "synset": "nationalist.n.02", "name": "nationalist"}, - {"id": 16459, "synset": "nautch_girl.n.01", "name": "nautch_girl"}, - {"id": 16460, "synset": "naval_commander.n.01", "name": "naval_commander"}, - {"id": 16461, "synset": "navy_seal.n.01", "name": "Navy_SEAL"}, - {"id": 16462, "synset": "obstructionist.n.01", "name": "obstructionist"}, - {"id": 16463, "synset": "nazarene.n.02", "name": "Nazarene"}, - {"id": 16464, "synset": "nazarene.n.01", "name": "Nazarene"}, - {"id": 16465, "synset": "nazi.n.01", "name": "Nazi"}, - {"id": 16466, "synset": "nebbish.n.01", "name": "nebbish"}, - {"id": 16467, "synset": "necker.n.01", "name": "necker"}, - {"id": 16468, "synset": "neonate.n.01", "name": "neonate"}, - {"id": 16469, "synset": "nephew.n.01", "name": "nephew"}, - {"id": 16470, "synset": "neurobiologist.n.01", "name": "neurobiologist"}, - {"id": 16471, "synset": "neurologist.n.01", "name": "neurologist"}, - {"id": 16472, "synset": "neurosurgeon.n.01", "name": "neurosurgeon"}, - {"id": 16473, "synset": "neutral.n.01", "name": "neutral"}, - {"id": 16474, "synset": "neutralist.n.01", "name": "neutralist"}, - {"id": 16475, "synset": "newcomer.n.01", "name": "newcomer"}, - {"id": 16476, "synset": "newcomer.n.02", "name": "newcomer"}, - {"id": 16477, "synset": "new_dealer.n.01", "name": "New_Dealer"}, - {"id": 16478, "synset": "newspaper_editor.n.01", "name": "newspaper_editor"}, - {"id": 16479, "synset": "newsreader.n.01", "name": "newsreader"}, - {"id": 16480, "synset": "newtonian.n.01", "name": "Newtonian"}, - {"id": 16481, "synset": "niece.n.01", "name": "niece"}, - {"id": 16482, "synset": "niggard.n.01", "name": "niggard"}, - {"id": 16483, "synset": "night_porter.n.01", "name": "night_porter"}, - {"id": 16484, "synset": "night_rider.n.01", "name": "night_rider"}, - {"id": 16485, "synset": "nimby.n.01", "name": "NIMBY"}, - {"id": 16486, "synset": "niqaabi.n.01", "name": "niqaabi"}, - {"id": 16487, "synset": "nitpicker.n.01", "name": "nitpicker"}, - {"id": 16488, "synset": "nobelist.n.01", "name": "Nobelist"}, - {"id": 16489, "synset": "noc.n.01", "name": "NOC"}, - {"id": 16490, "synset": "noncandidate.n.01", "name": "noncandidate"}, - {"id": 16491, "synset": "noncommissioned_officer.n.01", "name": "noncommissioned_officer"}, - {"id": 16492, "synset": "nondescript.n.01", "name": "nondescript"}, - {"id": 16493, "synset": "nondriver.n.01", "name": "nondriver"}, - {"id": 16494, "synset": "nonparticipant.n.01", "name": "nonparticipant"}, - {"id": 16495, "synset": "nonperson.n.01", "name": "nonperson"}, - {"id": 16496, "synset": "nonresident.n.01", "name": "nonresident"}, - {"id": 16497, "synset": "nonsmoker.n.01", "name": "nonsmoker"}, - {"id": 16498, "synset": "northern_baptist.n.01", "name": "Northern_Baptist"}, - {"id": 16499, "synset": "noticer.n.01", "name": "noticer"}, - {"id": 16500, "synset": "novelist.n.01", "name": "novelist"}, - {"id": 16501, "synset": "novitiate.n.02", "name": "novitiate"}, - {"id": 16502, "synset": "nuclear_chemist.n.01", "name": "nuclear_chemist"}, - {"id": 16503, "synset": "nudger.n.01", "name": "nudger"}, - {"id": 16504, "synset": "nullipara.n.01", "name": "nullipara"}, - {"id": 16505, "synset": "number_theorist.n.01", "name": "number_theorist"}, - {"id": 16506, "synset": "nurse.n.01", "name": "nurse"}, - {"id": 16507, "synset": "nursling.n.01", "name": "nursling"}, - {"id": 16508, "synset": "nymph.n.03", "name": "nymph"}, - {"id": 16509, "synset": "nymphet.n.01", "name": "nymphet"}, - {"id": 16510, "synset": "nympholept.n.01", "name": "nympholept"}, - {"id": 16511, "synset": "nymphomaniac.n.01", "name": "nymphomaniac"}, - {"id": 16512, "synset": "oarswoman.n.01", "name": "oarswoman"}, - {"id": 16513, "synset": "oboist.n.01", "name": "oboist"}, - {"id": 16514, "synset": "obscurantist.n.01", "name": "obscurantist"}, - {"id": 16515, "synset": "observer.n.02", "name": "observer"}, - {"id": 16516, "synset": "obstetrician.n.01", "name": "obstetrician"}, - {"id": 16517, "synset": "occupier.n.02", "name": "occupier"}, - {"id": 16518, "synset": "occultist.n.01", "name": "occultist"}, - {"id": 16519, "synset": "wine_lover.n.01", "name": "wine_lover"}, - {"id": 16520, "synset": "offerer.n.01", "name": "offerer"}, - {"id": 16521, "synset": "office-bearer.n.01", "name": "office-bearer"}, - {"id": 16522, "synset": "office_boy.n.01", "name": "office_boy"}, - {"id": 16523, "synset": "officeholder.n.01", "name": "officeholder"}, - {"id": 16524, "synset": "officiant.n.01", "name": "officiant"}, - {"id": 16525, "synset": "federal.n.02", "name": "Federal"}, - {"id": 16526, "synset": "oilman.n.02", "name": "oilman"}, - {"id": 16527, "synset": "oil_tycoon.n.01", "name": "oil_tycoon"}, - {"id": 16528, "synset": "old-age_pensioner.n.01", "name": "old-age_pensioner"}, - {"id": 16529, "synset": "old_boy.n.02", "name": "old_boy"}, - {"id": 16530, "synset": "old_lady.n.01", "name": "old_lady"}, - {"id": 16531, "synset": "old_man.n.03", "name": "old_man"}, - {"id": 16532, "synset": "oldster.n.01", "name": "oldster"}, - {"id": 16533, "synset": "old-timer.n.02", "name": "old-timer"}, - {"id": 16534, "synset": "old_woman.n.01", "name": "old_woman"}, - {"id": 16535, "synset": "oligarch.n.01", "name": "oligarch"}, - {"id": 16536, "synset": "olympian.n.01", "name": "Olympian"}, - {"id": 16537, "synset": "omnivore.n.01", "name": "omnivore"}, - {"id": 16538, "synset": "oncologist.n.01", "name": "oncologist"}, - {"id": 16539, "synset": "onlooker.n.01", "name": "onlooker"}, - {"id": 16540, "synset": "onomancer.n.01", "name": "onomancer"}, - {"id": 16541, "synset": "operator.n.03", "name": "operator"}, - {"id": 16542, "synset": "opportunist.n.01", "name": "opportunist"}, - {"id": 16543, "synset": "optimist.n.01", "name": "optimist"}, - {"id": 16544, "synset": "orangeman.n.01", "name": "Orangeman"}, - {"id": 16545, "synset": "orator.n.01", "name": "orator"}, - {"id": 16546, "synset": "orderly.n.02", "name": "orderly"}, - {"id": 16547, "synset": "orderly.n.01", "name": "orderly"}, - {"id": 16548, "synset": "orderly_sergeant.n.01", "name": "orderly_sergeant"}, - {"id": 16549, "synset": "ordinand.n.01", "name": "ordinand"}, - {"id": 16550, "synset": "ordinary.n.03", "name": "ordinary"}, - {"id": 16551, "synset": "organ-grinder.n.01", "name": "organ-grinder"}, - {"id": 16552, "synset": "organist.n.01", "name": "organist"}, - {"id": 16553, "synset": "organization_man.n.01", "name": "organization_man"}, - {"id": 16554, "synset": "organizer.n.01", "name": "organizer"}, - {"id": 16555, "synset": "organizer.n.02", "name": "organizer"}, - {"id": 16556, "synset": "originator.n.01", "name": "originator"}, - {"id": 16557, "synset": "ornithologist.n.01", "name": "ornithologist"}, - {"id": 16558, "synset": "orphan.n.01", "name": "orphan"}, - {"id": 16559, "synset": "orphan.n.02", "name": "orphan"}, - {"id": 16560, "synset": "osteopath.n.01", "name": "osteopath"}, - {"id": 16561, "synset": "out-and-outer.n.01", "name": "out-and-outer"}, - {"id": 16562, "synset": "outdoorswoman.n.01", "name": "outdoorswoman"}, - {"id": 16563, "synset": "outfielder.n.02", "name": "outfielder"}, - {"id": 16564, "synset": "outfielder.n.01", "name": "outfielder"}, - {"id": 16565, "synset": "right_fielder.n.01", "name": "right_fielder"}, - {"id": 16566, "synset": "right-handed_pitcher.n.01", "name": "right-handed_pitcher"}, - {"id": 16567, "synset": "outlier.n.01", "name": "outlier"}, - {"id": 16568, "synset": "owner-occupier.n.01", "name": "owner-occupier"}, - {"id": 16569, "synset": "oyabun.n.01", "name": "oyabun"}, - {"id": 16570, "synset": "packrat.n.01", "name": "packrat"}, - {"id": 16571, "synset": "padrone.n.02", "name": "padrone"}, - {"id": 16572, "synset": "padrone.n.01", "name": "padrone"}, - {"id": 16573, "synset": "page.n.04", "name": "page"}, - {"id": 16574, "synset": "painter.n.02", "name": "painter"}, - {"id": 16575, "synset": "paleo-american.n.01", "name": "Paleo-American"}, - {"id": 16576, "synset": "paleontologist.n.01", "name": "paleontologist"}, - {"id": 16577, "synset": "pallbearer.n.01", "name": "pallbearer"}, - {"id": 16578, "synset": "palmist.n.01", "name": "palmist"}, - {"id": 16579, "synset": "pamperer.n.01", "name": "pamperer"}, - {"id": 16580, "synset": "panchen_lama.n.01", "name": "Panchen_Lama"}, - {"id": 16581, "synset": "panelist.n.01", "name": "panelist"}, - {"id": 16582, "synset": "panhandler.n.01", "name": "panhandler"}, - {"id": 16583, "synset": "paparazzo.n.01", "name": "paparazzo"}, - {"id": 16584, "synset": "paperboy.n.01", "name": "paperboy"}, - {"id": 16585, "synset": "paperhanger.n.02", "name": "paperhanger"}, - {"id": 16586, "synset": "paperhanger.n.01", "name": "paperhanger"}, - {"id": 16587, "synset": "papoose.n.01", "name": "papoose"}, - {"id": 16588, "synset": "pardoner.n.02", "name": "pardoner"}, - {"id": 16589, "synset": "paretic.n.01", "name": "paretic"}, - {"id": 16590, "synset": "parishioner.n.01", "name": "parishioner"}, - {"id": 16591, "synset": "park_commissioner.n.01", "name": "park_commissioner"}, - {"id": 16592, "synset": "parliamentarian.n.01", "name": "Parliamentarian"}, - {"id": 16593, "synset": "parliamentary_agent.n.01", "name": "parliamentary_agent"}, - {"id": 16594, "synset": "parodist.n.01", "name": "parodist"}, - {"id": 16595, "synset": "parricide.n.01", "name": "parricide"}, - {"id": 16596, "synset": "parrot.n.02", "name": "parrot"}, - {"id": 16597, "synset": "partaker.n.01", "name": "partaker"}, - {"id": 16598, "synset": "part-timer.n.01", "name": "part-timer"}, - {"id": 16599, "synset": "party.n.05", "name": "party"}, - {"id": 16600, "synset": "party_man.n.01", "name": "party_man"}, - {"id": 16601, "synset": "passenger.n.01", "name": "passenger"}, - {"id": 16602, "synset": "passer.n.03", "name": "passer"}, - {"id": 16603, "synset": "paster.n.01", "name": "paster"}, - {"id": 16604, "synset": "pater.n.01", "name": "pater"}, - {"id": 16605, "synset": "patient.n.01", "name": "patient"}, - {"id": 16606, "synset": "patriarch.n.04", "name": "patriarch"}, - {"id": 16607, "synset": "patriarch.n.03", "name": "patriarch"}, - {"id": 16608, "synset": "patriarch.n.02", "name": "patriarch"}, - {"id": 16609, "synset": "patriot.n.01", "name": "patriot"}, - {"id": 16610, "synset": "patron.n.03", "name": "patron"}, - {"id": 16611, "synset": "patternmaker.n.01", "name": "patternmaker"}, - {"id": 16612, "synset": "pawnbroker.n.01", "name": "pawnbroker"}, - {"id": 16613, "synset": "payer.n.01", "name": "payer"}, - {"id": 16614, "synset": "peacekeeper.n.01", "name": "peacekeeper"}, - {"id": 16615, "synset": "peasant.n.02", "name": "peasant"}, - {"id": 16616, "synset": "pedant.n.01", "name": "pedant"}, - {"id": 16617, "synset": "peddler.n.01", "name": "peddler"}, - {"id": 16618, "synset": "pederast.n.01", "name": "pederast"}, - {"id": 16619, "synset": "penologist.n.01", "name": "penologist"}, - {"id": 16620, "synset": "pentathlete.n.01", "name": "pentathlete"}, - {"id": 16621, "synset": "pentecostal.n.01", "name": "Pentecostal"}, - {"id": 16622, "synset": "percussionist.n.01", "name": "percussionist"}, - {"id": 16623, "synset": "periodontist.n.01", "name": "periodontist"}, - {"id": 16624, "synset": "peshmerga.n.01", "name": "peshmerga"}, - {"id": 16625, "synset": "personality.n.02", "name": "personality"}, - {"id": 16626, "synset": "personal_representative.n.01", "name": "personal_representative"}, - {"id": 16627, "synset": "personage.n.01", "name": "personage"}, - {"id": 16628, "synset": "persona_grata.n.01", "name": "persona_grata"}, - {"id": 16629, "synset": "persona_non_grata.n.01", "name": "persona_non_grata"}, - {"id": 16630, "synset": "personification.n.01", "name": "personification"}, - {"id": 16631, "synset": "perspirer.n.01", "name": "perspirer"}, - {"id": 16632, "synset": "pervert.n.01", "name": "pervert"}, - {"id": 16633, "synset": "pessimist.n.01", "name": "pessimist"}, - {"id": 16634, "synset": "pest.n.03", "name": "pest"}, - {"id": 16635, "synset": "peter_pan.n.01", "name": "Peter_Pan"}, - {"id": 16636, "synset": "petitioner.n.01", "name": "petitioner"}, - {"id": 16637, "synset": "petit_juror.n.01", "name": "petit_juror"}, - {"id": 16638, "synset": "pet_sitter.n.01", "name": "pet_sitter"}, - {"id": 16639, "synset": "petter.n.01", "name": "petter"}, - {"id": 16640, "synset": "pharaoh.n.01", "name": "Pharaoh"}, - {"id": 16641, "synset": "pharmacist.n.01", "name": "pharmacist"}, - {"id": 16642, "synset": "philanthropist.n.01", "name": "philanthropist"}, - {"id": 16643, "synset": "philatelist.n.01", "name": "philatelist"}, - {"id": 16644, "synset": "philosopher.n.02", "name": "philosopher"}, - {"id": 16645, "synset": "phonetician.n.01", "name": "phonetician"}, - {"id": 16646, "synset": "phonologist.n.01", "name": "phonologist"}, - {"id": 16647, "synset": "photojournalist.n.01", "name": "photojournalist"}, - {"id": 16648, "synset": "photometrist.n.01", "name": "photometrist"}, - {"id": 16649, "synset": "physical_therapist.n.01", "name": "physical_therapist"}, - {"id": 16650, "synset": "physicist.n.01", "name": "physicist"}, - {"id": 16651, "synset": "piano_maker.n.01", "name": "piano_maker"}, - {"id": 16652, "synset": "picker.n.01", "name": "picker"}, - {"id": 16653, "synset": "picnicker.n.01", "name": "picnicker"}, - {"id": 16654, "synset": "pilgrim.n.01", "name": "pilgrim"}, - {"id": 16655, "synset": "pill.n.03", "name": "pill"}, - {"id": 16656, "synset": "pillar.n.03", "name": "pillar"}, - {"id": 16657, "synset": "pill_head.n.01", "name": "pill_head"}, - {"id": 16658, "synset": "pilot.n.02", "name": "pilot"}, - {"id": 16659, "synset": "piltdown_man.n.01", "name": "Piltdown_man"}, - {"id": 16660, "synset": "pimp.n.01", "name": "pimp"}, - {"id": 16661, "synset": "pipe_smoker.n.01", "name": "pipe_smoker"}, - {"id": 16662, "synset": "pip-squeak.n.01", "name": "pip-squeak"}, - {"id": 16663, "synset": "pisser.n.01", "name": "pisser"}, - {"id": 16664, "synset": "pitcher.n.01", "name": "pitcher"}, - {"id": 16665, "synset": "pitchman.n.01", "name": "pitchman"}, - {"id": 16666, "synset": "placeman.n.01", "name": "placeman"}, - {"id": 16667, "synset": "placer_miner.n.01", "name": "placer_miner"}, - {"id": 16668, "synset": "plagiarist.n.01", "name": "plagiarist"}, - {"id": 16669, "synset": "plainsman.n.01", "name": "plainsman"}, - {"id": 16670, "synset": "planner.n.01", "name": "planner"}, - {"id": 16671, "synset": "planter.n.01", "name": "planter"}, - {"id": 16672, "synset": "plasterer.n.01", "name": "plasterer"}, - {"id": 16673, "synset": "platinum_blond.n.01", "name": "platinum_blond"}, - {"id": 16674, "synset": "platitudinarian.n.01", "name": "platitudinarian"}, - {"id": 16675, "synset": "playboy.n.01", "name": "playboy"}, - {"id": 16676, "synset": "player.n.01", "name": "player"}, - {"id": 16677, "synset": "playmate.n.01", "name": "playmate"}, - {"id": 16678, "synset": "pleaser.n.01", "name": "pleaser"}, - {"id": 16679, "synset": "pledger.n.01", "name": "pledger"}, - {"id": 16680, "synset": "plenipotentiary.n.01", "name": "plenipotentiary"}, - {"id": 16681, "synset": "plier.n.01", "name": "plier"}, - {"id": 16682, "synset": "plodder.n.03", "name": "plodder"}, - {"id": 16683, "synset": "plodder.n.02", "name": "plodder"}, - {"id": 16684, "synset": "plotter.n.02", "name": "plotter"}, - {"id": 16685, "synset": "plumber.n.01", "name": "plumber"}, - {"id": 16686, "synset": "pluralist.n.02", "name": "pluralist"}, - {"id": 16687, "synset": "pluralist.n.01", "name": "pluralist"}, - {"id": 16688, "synset": "poet.n.01", "name": "poet"}, - {"id": 16689, "synset": "pointsman.n.01", "name": "pointsman"}, - {"id": 16690, "synset": "point_woman.n.01", "name": "point_woman"}, - {"id": 16691, "synset": "policyholder.n.01", "name": "policyholder"}, - {"id": 16692, "synset": "political_prisoner.n.01", "name": "political_prisoner"}, - {"id": 16693, "synset": "political_scientist.n.01", "name": "political_scientist"}, - {"id": 16694, "synset": "politician.n.02", "name": "politician"}, - {"id": 16695, "synset": "politician.n.03", "name": "politician"}, - {"id": 16696, "synset": "pollster.n.01", "name": "pollster"}, - {"id": 16697, "synset": "polluter.n.01", "name": "polluter"}, - {"id": 16698, "synset": "pool_player.n.01", "name": "pool_player"}, - {"id": 16699, "synset": "portraitist.n.01", "name": "portraitist"}, - {"id": 16700, "synset": "poseuse.n.01", "name": "poseuse"}, - {"id": 16701, "synset": "positivist.n.01", "name": "positivist"}, - {"id": 16702, "synset": "postdoc.n.02", "name": "postdoc"}, - {"id": 16703, "synset": "poster_girl.n.01", "name": "poster_girl"}, - {"id": 16704, "synset": "postulator.n.02", "name": "postulator"}, - {"id": 16705, "synset": "private_citizen.n.01", "name": "private_citizen"}, - {"id": 16706, "synset": "problem_solver.n.01", "name": "problem_solver"}, - {"id": 16707, "synset": "pro-lifer.n.01", "name": "pro-lifer"}, - {"id": 16708, "synset": "prosthetist.n.01", "name": "prosthetist"}, - {"id": 16709, "synset": "postulant.n.01", "name": "postulant"}, - {"id": 16710, "synset": "potboy.n.01", "name": "potboy"}, - {"id": 16711, "synset": "poultryman.n.01", "name": "poultryman"}, - {"id": 16712, "synset": "power_user.n.01", "name": "power_user"}, - {"id": 16713, "synset": "power_worker.n.01", "name": "power_worker"}, - {"id": 16714, "synset": "practitioner.n.01", "name": "practitioner"}, - {"id": 16715, "synset": "prayer.n.05", "name": "prayer"}, - {"id": 16716, "synset": "preceptor.n.01", "name": "preceptor"}, - {"id": 16717, "synset": "predecessor.n.01", "name": "predecessor"}, - {"id": 16718, "synset": "preemptor.n.02", "name": "preemptor"}, - {"id": 16719, "synset": "preemptor.n.01", "name": "preemptor"}, - {"id": 16720, "synset": "premature_baby.n.01", "name": "premature_baby"}, - {"id": 16721, "synset": "presbyter.n.01", "name": "presbyter"}, - {"id": 16722, "synset": "presenter.n.02", "name": "presenter"}, - {"id": 16723, "synset": "presentist.n.01", "name": "presentist"}, - {"id": 16724, "synset": "preserver.n.03", "name": "preserver"}, - {"id": 16725, "synset": "president.n.03", "name": "president"}, - { - "id": 16726, - "synset": "president_of_the_united_states.n.01", - "name": "President_of_the_United_States", - }, - {"id": 16727, "synset": "president.n.05", "name": "president"}, - {"id": 16728, "synset": "press_agent.n.01", "name": "press_agent"}, - {"id": 16729, "synset": "press_photographer.n.01", "name": "press_photographer"}, - {"id": 16730, "synset": "priest.n.01", "name": "priest"}, - {"id": 16731, "synset": "prima_ballerina.n.01", "name": "prima_ballerina"}, - {"id": 16732, "synset": "prima_donna.n.02", "name": "prima_donna"}, - {"id": 16733, "synset": "prima_donna.n.01", "name": "prima_donna"}, - {"id": 16734, "synset": "primigravida.n.01", "name": "primigravida"}, - {"id": 16735, "synset": "primordial_dwarf.n.01", "name": "primordial_dwarf"}, - {"id": 16736, "synset": "prince_charming.n.01", "name": "prince_charming"}, - {"id": 16737, "synset": "prince_consort.n.01", "name": "prince_consort"}, - {"id": 16738, "synset": "princeling.n.01", "name": "princeling"}, - {"id": 16739, "synset": "prince_of_wales.n.01", "name": "Prince_of_Wales"}, - {"id": 16740, "synset": "princess.n.01", "name": "princess"}, - {"id": 16741, "synset": "princess_royal.n.01", "name": "princess_royal"}, - {"id": 16742, "synset": "principal.n.06", "name": "principal"}, - {"id": 16743, "synset": "principal.n.02", "name": "principal"}, - {"id": 16744, "synset": "print_seller.n.01", "name": "print_seller"}, - {"id": 16745, "synset": "prior.n.01", "name": "prior"}, - {"id": 16746, "synset": "private.n.01", "name": "private"}, - {"id": 16747, "synset": "probationer.n.01", "name": "probationer"}, - {"id": 16748, "synset": "processor.n.02", "name": "processor"}, - {"id": 16749, "synset": "process-server.n.01", "name": "process-server"}, - {"id": 16750, "synset": "proconsul.n.02", "name": "proconsul"}, - {"id": 16751, "synset": "proconsul.n.01", "name": "proconsul"}, - {"id": 16752, "synset": "proctologist.n.01", "name": "proctologist"}, - {"id": 16753, "synset": "proctor.n.01", "name": "proctor"}, - {"id": 16754, "synset": "procurator.n.02", "name": "procurator"}, - {"id": 16755, "synset": "procurer.n.02", "name": "procurer"}, - {"id": 16756, "synset": "profit_taker.n.01", "name": "profit_taker"}, - {"id": 16757, "synset": "programmer.n.01", "name": "programmer"}, - {"id": 16758, "synset": "promiser.n.01", "name": "promiser"}, - {"id": 16759, "synset": "promoter.n.01", "name": "promoter"}, - {"id": 16760, "synset": "promulgator.n.01", "name": "promulgator"}, - {"id": 16761, "synset": "propagandist.n.01", "name": "propagandist"}, - {"id": 16762, "synset": "propagator.n.02", "name": "propagator"}, - {"id": 16763, "synset": "property_man.n.01", "name": "property_man"}, - {"id": 16764, "synset": "prophetess.n.01", "name": "prophetess"}, - {"id": 16765, "synset": "prophet.n.02", "name": "prophet"}, - {"id": 16766, "synset": "prosecutor.n.01", "name": "prosecutor"}, - {"id": 16767, "synset": "prospector.n.01", "name": "prospector"}, - {"id": 16768, "synset": "protectionist.n.01", "name": "protectionist"}, - {"id": 16769, "synset": "protegee.n.01", "name": "protegee"}, - {"id": 16770, "synset": "protozoologist.n.01", "name": "protozoologist"}, - {"id": 16771, "synset": "provost_marshal.n.01", "name": "provost_marshal"}, - {"id": 16772, "synset": "pruner.n.01", "name": "pruner"}, - {"id": 16773, "synset": "psalmist.n.01", "name": "psalmist"}, - {"id": 16774, "synset": "psephologist.n.01", "name": "psephologist"}, - {"id": 16775, "synset": "psychiatrist.n.01", "name": "psychiatrist"}, - {"id": 16776, "synset": "psychic.n.01", "name": "psychic"}, - {"id": 16777, "synset": "psycholinguist.n.01", "name": "psycholinguist"}, - {"id": 16778, "synset": "psychophysicist.n.01", "name": "psychophysicist"}, - {"id": 16779, "synset": "publican.n.01", "name": "publican"}, - {"id": 16780, "synset": "pudge.n.01", "name": "pudge"}, - {"id": 16781, "synset": "puerpera.n.01", "name": "puerpera"}, - {"id": 16782, "synset": "punching_bag.n.01", "name": "punching_bag"}, - {"id": 16783, "synset": "punter.n.02", "name": "punter"}, - {"id": 16784, "synset": "punter.n.01", "name": "punter"}, - {"id": 16785, "synset": "puppeteer.n.01", "name": "puppeteer"}, - {"id": 16786, "synset": "puppy.n.02", "name": "puppy"}, - {"id": 16787, "synset": "purchasing_agent.n.01", "name": "purchasing_agent"}, - {"id": 16788, "synset": "puritan.n.02", "name": "puritan"}, - {"id": 16789, "synset": "puritan.n.01", "name": "Puritan"}, - {"id": 16790, "synset": "pursuer.n.02", "name": "pursuer"}, - {"id": 16791, "synset": "pusher.n.03", "name": "pusher"}, - {"id": 16792, "synset": "pusher.n.02", "name": "pusher"}, - {"id": 16793, "synset": "pusher.n.01", "name": "pusher"}, - {"id": 16794, "synset": "putz.n.01", "name": "putz"}, - {"id": 16795, "synset": "pygmy.n.02", "name": "Pygmy"}, - {"id": 16796, "synset": "qadi.n.01", "name": "qadi"}, - {"id": 16797, "synset": "quadriplegic.n.01", "name": "quadriplegic"}, - {"id": 16798, "synset": "quadruplet.n.02", "name": "quadruplet"}, - {"id": 16799, "synset": "quaker.n.02", "name": "quaker"}, - {"id": 16800, "synset": "quarter.n.11", "name": "quarter"}, - {"id": 16801, "synset": "quarterback.n.01", "name": "quarterback"}, - {"id": 16802, "synset": "quartermaster.n.01", "name": "quartermaster"}, - {"id": 16803, "synset": "quartermaster_general.n.01", "name": "quartermaster_general"}, - {"id": 16804, "synset": "quebecois.n.01", "name": "Quebecois"}, - {"id": 16805, "synset": "queen.n.02", "name": "queen"}, - {"id": 16806, "synset": "queen_of_england.n.01", "name": "Queen_of_England"}, - {"id": 16807, "synset": "queen.n.03", "name": "queen"}, - {"id": 16808, "synset": "queen.n.04", "name": "queen"}, - {"id": 16809, "synset": "queen_consort.n.01", "name": "queen_consort"}, - {"id": 16810, "synset": "queen_mother.n.01", "name": "queen_mother"}, - {"id": 16811, "synset": "queen's_counsel.n.01", "name": "Queen's_Counsel"}, - {"id": 16812, "synset": "question_master.n.01", "name": "question_master"}, - {"id": 16813, "synset": "quick_study.n.01", "name": "quick_study"}, - {"id": 16814, "synset": "quietist.n.01", "name": "quietist"}, - {"id": 16815, "synset": "quitter.n.01", "name": "quitter"}, - {"id": 16816, "synset": "rabbi.n.01", "name": "rabbi"}, - {"id": 16817, "synset": "racist.n.01", "name": "racist"}, - {"id": 16818, "synset": "radiobiologist.n.01", "name": "radiobiologist"}, - {"id": 16819, "synset": "radiologic_technologist.n.01", "name": "radiologic_technologist"}, - {"id": 16820, "synset": "radiologist.n.01", "name": "radiologist"}, - {"id": 16821, "synset": "rainmaker.n.02", "name": "rainmaker"}, - {"id": 16822, "synset": "raiser.n.01", "name": "raiser"}, - {"id": 16823, "synset": "raja.n.01", "name": "raja"}, - {"id": 16824, "synset": "rake.n.01", "name": "rake"}, - {"id": 16825, "synset": "ramrod.n.02", "name": "ramrod"}, - {"id": 16826, "synset": "ranch_hand.n.01", "name": "ranch_hand"}, - {"id": 16827, "synset": "ranker.n.01", "name": "ranker"}, - {"id": 16828, "synset": "ranter.n.01", "name": "ranter"}, - {"id": 16829, "synset": "rape_suspect.n.01", "name": "rape_suspect"}, - {"id": 16830, "synset": "rapper.n.01", "name": "rapper"}, - {"id": 16831, "synset": "rapporteur.n.01", "name": "rapporteur"}, - {"id": 16832, "synset": "rare_bird.n.01", "name": "rare_bird"}, - {"id": 16833, "synset": "ratepayer.n.01", "name": "ratepayer"}, - {"id": 16834, "synset": "raw_recruit.n.01", "name": "raw_recruit"}, - {"id": 16835, "synset": "reader.n.01", "name": "reader"}, - {"id": 16836, "synset": "reading_teacher.n.01", "name": "reading_teacher"}, - {"id": 16837, "synset": "realist.n.01", "name": "realist"}, - {"id": 16838, "synset": "real_estate_broker.n.01", "name": "real_estate_broker"}, - {"id": 16839, "synset": "rear_admiral.n.01", "name": "rear_admiral"}, - {"id": 16840, "synset": "receiver.n.05", "name": "receiver"}, - {"id": 16841, "synset": "reciter.n.01", "name": "reciter"}, - {"id": 16842, "synset": "recruit.n.02", "name": "recruit"}, - {"id": 16843, "synset": "recruit.n.01", "name": "recruit"}, - {"id": 16844, "synset": "recruiter.n.01", "name": "recruiter"}, - {"id": 16845, "synset": "recruiting-sergeant.n.01", "name": "recruiting-sergeant"}, - {"id": 16846, "synset": "redcap.n.01", "name": "redcap"}, - {"id": 16847, "synset": "redhead.n.01", "name": "redhead"}, - {"id": 16848, "synset": "redneck.n.01", "name": "redneck"}, - {"id": 16849, "synset": "reeler.n.02", "name": "reeler"}, - {"id": 16850, "synset": "reenactor.n.01", "name": "reenactor"}, - {"id": 16851, "synset": "referral.n.01", "name": "referral"}, - {"id": 16852, "synset": "referee.n.01", "name": "referee"}, - {"id": 16853, "synset": "refiner.n.01", "name": "refiner"}, - {"id": 16854, "synset": "reform_jew.n.01", "name": "Reform_Jew"}, - {"id": 16855, "synset": "registered_nurse.n.01", "name": "registered_nurse"}, - {"id": 16856, "synset": "registrar.n.01", "name": "registrar"}, - {"id": 16857, "synset": "regius_professor.n.01", "name": "Regius_professor"}, - {"id": 16858, "synset": "reliever.n.02", "name": "reliever"}, - {"id": 16859, "synset": "anchorite.n.01", "name": "anchorite"}, - {"id": 16860, "synset": "religious_leader.n.01", "name": "religious_leader"}, - {"id": 16861, "synset": "remover.n.02", "name": "remover"}, - {"id": 16862, "synset": "renaissance_man.n.01", "name": "Renaissance_man"}, - {"id": 16863, "synset": "renegade.n.01", "name": "renegade"}, - {"id": 16864, "synset": "rentier.n.01", "name": "rentier"}, - {"id": 16865, "synset": "repairman.n.01", "name": "repairman"}, - {"id": 16866, "synset": "reporter.n.01", "name": "reporter"}, - {"id": 16867, "synset": "newswoman.n.01", "name": "newswoman"}, - {"id": 16868, "synset": "representative.n.01", "name": "representative"}, - {"id": 16869, "synset": "reprobate.n.01", "name": "reprobate"}, - {"id": 16870, "synset": "rescuer.n.02", "name": "rescuer"}, - {"id": 16871, "synset": "reservist.n.01", "name": "reservist"}, - {"id": 16872, "synset": "resident_commissioner.n.01", "name": "resident_commissioner"}, - {"id": 16873, "synset": "respecter.n.01", "name": "respecter"}, - {"id": 16874, "synset": "restaurateur.n.01", "name": "restaurateur"}, - {"id": 16875, "synset": "restrainer.n.02", "name": "restrainer"}, - {"id": 16876, "synset": "retailer.n.01", "name": "retailer"}, - {"id": 16877, "synset": "retiree.n.01", "name": "retiree"}, - {"id": 16878, "synset": "returning_officer.n.01", "name": "returning_officer"}, - {"id": 16879, "synset": "revenant.n.01", "name": "revenant"}, - {"id": 16880, "synset": "revisionist.n.01", "name": "revisionist"}, - {"id": 16881, "synset": "revolutionist.n.01", "name": "revolutionist"}, - {"id": 16882, "synset": "rheumatologist.n.01", "name": "rheumatologist"}, - {"id": 16883, "synset": "rhodesian_man.n.01", "name": "Rhodesian_man"}, - {"id": 16884, "synset": "rhymer.n.01", "name": "rhymer"}, - {"id": 16885, "synset": "rich_person.n.01", "name": "rich_person"}, - {"id": 16886, "synset": "rider.n.03", "name": "rider"}, - {"id": 16887, "synset": "riding_master.n.01", "name": "riding_master"}, - {"id": 16888, "synset": "rifleman.n.02", "name": "rifleman"}, - {"id": 16889, "synset": "right-hander.n.02", "name": "right-hander"}, - {"id": 16890, "synset": "right-hand_man.n.01", "name": "right-hand_man"}, - {"id": 16891, "synset": "ringer.n.03", "name": "ringer"}, - {"id": 16892, "synset": "ringleader.n.01", "name": "ringleader"}, - {"id": 16893, "synset": "roadman.n.02", "name": "roadman"}, - {"id": 16894, "synset": "roarer.n.01", "name": "roarer"}, - {"id": 16895, "synset": "rocket_engineer.n.01", "name": "rocket_engineer"}, - {"id": 16896, "synset": "rocket_scientist.n.01", "name": "rocket_scientist"}, - {"id": 16897, "synset": "rock_star.n.01", "name": "rock_star"}, - {"id": 16898, "synset": "romanov.n.01", "name": "Romanov"}, - {"id": 16899, "synset": "romanticist.n.02", "name": "romanticist"}, - {"id": 16900, "synset": "ropemaker.n.01", "name": "ropemaker"}, - {"id": 16901, "synset": "roper.n.02", "name": "roper"}, - {"id": 16902, "synset": "roper.n.01", "name": "roper"}, - {"id": 16903, "synset": "ropewalker.n.01", "name": "ropewalker"}, - {"id": 16904, "synset": "rosebud.n.02", "name": "rosebud"}, - {"id": 16905, "synset": "rosicrucian.n.02", "name": "Rosicrucian"}, - {"id": 16906, "synset": "mountie.n.01", "name": "Mountie"}, - {"id": 16907, "synset": "rough_rider.n.01", "name": "Rough_Rider"}, - {"id": 16908, "synset": "roundhead.n.01", "name": "roundhead"}, - {"id": 16909, "synset": "civil_authority.n.01", "name": "civil_authority"}, - {"id": 16910, "synset": "runner.n.03", "name": "runner"}, - {"id": 16911, "synset": "runner.n.02", "name": "runner"}, - {"id": 16912, "synset": "runner.n.06", "name": "runner"}, - {"id": 16913, "synset": "running_back.n.01", "name": "running_back"}, - {"id": 16914, "synset": "rusher.n.02", "name": "rusher"}, - {"id": 16915, "synset": "rustic.n.01", "name": "rustic"}, - {"id": 16916, "synset": "saboteur.n.01", "name": "saboteur"}, - {"id": 16917, "synset": "sadist.n.01", "name": "sadist"}, - {"id": 16918, "synset": "sailing_master.n.01", "name": "sailing_master"}, - {"id": 16919, "synset": "sailor.n.01", "name": "sailor"}, - {"id": 16920, "synset": "salesgirl.n.01", "name": "salesgirl"}, - {"id": 16921, "synset": "salesman.n.01", "name": "salesman"}, - {"id": 16922, "synset": "salesperson.n.01", "name": "salesperson"}, - {"id": 16923, "synset": "salvager.n.01", "name": "salvager"}, - {"id": 16924, "synset": "sandwichman.n.01", "name": "sandwichman"}, - {"id": 16925, "synset": "sangoma.n.01", "name": "sangoma"}, - {"id": 16926, "synset": "sannup.n.01", "name": "sannup"}, - {"id": 16927, "synset": "sapper.n.02", "name": "sapper"}, - {"id": 16928, "synset": "sassenach.n.01", "name": "Sassenach"}, - {"id": 16929, "synset": "satrap.n.01", "name": "satrap"}, - {"id": 16930, "synset": "saunterer.n.01", "name": "saunterer"}, - {"id": 16931, "synset": "savoyard.n.01", "name": "Savoyard"}, - {"id": 16932, "synset": "sawyer.n.01", "name": "sawyer"}, - {"id": 16933, "synset": "scalper.n.01", "name": "scalper"}, - {"id": 16934, "synset": "scandalmonger.n.01", "name": "scandalmonger"}, - {"id": 16935, "synset": "scapegrace.n.01", "name": "scapegrace"}, - {"id": 16936, "synset": "scene_painter.n.02", "name": "scene_painter"}, - {"id": 16937, "synset": "schemer.n.01", "name": "schemer"}, - {"id": 16938, "synset": "schizophrenic.n.01", "name": "schizophrenic"}, - {"id": 16939, "synset": "schlemiel.n.01", "name": "schlemiel"}, - {"id": 16940, "synset": "schlockmeister.n.01", "name": "schlockmeister"}, - {"id": 16941, "synset": "scholar.n.01", "name": "scholar"}, - {"id": 16942, "synset": "scholiast.n.01", "name": "scholiast"}, - {"id": 16943, "synset": "schoolchild.n.01", "name": "schoolchild"}, - {"id": 16944, "synset": "schoolfriend.n.01", "name": "schoolfriend"}, - {"id": 16945, "synset": "schoolman.n.01", "name": "Schoolman"}, - {"id": 16946, "synset": "schoolmaster.n.02", "name": "schoolmaster"}, - {"id": 16947, "synset": "schoolmate.n.01", "name": "schoolmate"}, - {"id": 16948, "synset": "scientist.n.01", "name": "scientist"}, - {"id": 16949, "synset": "scion.n.01", "name": "scion"}, - {"id": 16950, "synset": "scoffer.n.02", "name": "scoffer"}, - {"id": 16951, "synset": "scofflaw.n.01", "name": "scofflaw"}, - {"id": 16952, "synset": "scorekeeper.n.01", "name": "scorekeeper"}, - {"id": 16953, "synset": "scorer.n.02", "name": "scorer"}, - {"id": 16954, "synset": "scourer.n.02", "name": "scourer"}, - {"id": 16955, "synset": "scout.n.03", "name": "scout"}, - {"id": 16956, "synset": "scoutmaster.n.01", "name": "scoutmaster"}, - {"id": 16957, "synset": "scrambler.n.01", "name": "scrambler"}, - {"id": 16958, "synset": "scratcher.n.02", "name": "scratcher"}, - {"id": 16959, "synset": "screen_actor.n.01", "name": "screen_actor"}, - {"id": 16960, "synset": "scrutineer.n.01", "name": "scrutineer"}, - {"id": 16961, "synset": "scuba_diver.n.01", "name": "scuba_diver"}, - {"id": 16962, "synset": "sculptor.n.01", "name": "sculptor"}, - {"id": 16963, "synset": "sea_scout.n.01", "name": "Sea_Scout"}, - {"id": 16964, "synset": "seasonal_worker.n.01", "name": "seasonal_worker"}, - {"id": 16965, "synset": "seasoner.n.01", "name": "seasoner"}, - {"id": 16966, "synset": "second_baseman.n.01", "name": "second_baseman"}, - {"id": 16967, "synset": "second_cousin.n.01", "name": "second_cousin"}, - {"id": 16968, "synset": "seconder.n.01", "name": "seconder"}, - {"id": 16969, "synset": "second_fiddle.n.01", "name": "second_fiddle"}, - {"id": 16970, "synset": "second-in-command.n.01", "name": "second-in-command"}, - {"id": 16971, "synset": "second_lieutenant.n.01", "name": "second_lieutenant"}, - {"id": 16972, "synset": "second-rater.n.01", "name": "second-rater"}, - {"id": 16973, "synset": "secretary.n.01", "name": "secretary"}, - {"id": 16974, "synset": "secretary_of_agriculture.n.01", "name": "Secretary_of_Agriculture"}, - { - "id": 16975, - "synset": "secretary_of_health_and_human_services.n.01", - "name": "Secretary_of_Health_and_Human_Services", - }, - {"id": 16976, "synset": "secretary_of_state.n.01", "name": "Secretary_of_State"}, - {"id": 16977, "synset": "secretary_of_the_interior.n.02", "name": "Secretary_of_the_Interior"}, - {"id": 16978, "synset": "sectarian.n.01", "name": "sectarian"}, - {"id": 16979, "synset": "section_hand.n.01", "name": "section_hand"}, - {"id": 16980, "synset": "secularist.n.01", "name": "secularist"}, - {"id": 16981, "synset": "security_consultant.n.01", "name": "security_consultant"}, - {"id": 16982, "synset": "seeded_player.n.01", "name": "seeded_player"}, - {"id": 16983, "synset": "seeder.n.01", "name": "seeder"}, - {"id": 16984, "synset": "seeker.n.01", "name": "seeker"}, - {"id": 16985, "synset": "segregate.n.01", "name": "segregate"}, - {"id": 16986, "synset": "segregator.n.01", "name": "segregator"}, - {"id": 16987, "synset": "selectman.n.01", "name": "selectman"}, - {"id": 16988, "synset": "selectwoman.n.01", "name": "selectwoman"}, - {"id": 16989, "synset": "selfish_person.n.01", "name": "selfish_person"}, - {"id": 16990, "synset": "self-starter.n.01", "name": "self-starter"}, - {"id": 16991, "synset": "seller.n.01", "name": "seller"}, - {"id": 16992, "synset": "selling_agent.n.01", "name": "selling_agent"}, - {"id": 16993, "synset": "semanticist.n.01", "name": "semanticist"}, - {"id": 16994, "synset": "semifinalist.n.01", "name": "semifinalist"}, - {"id": 16995, "synset": "seminarian.n.01", "name": "seminarian"}, - {"id": 16996, "synset": "senator.n.01", "name": "senator"}, - {"id": 16997, "synset": "sendee.n.01", "name": "sendee"}, - {"id": 16998, "synset": "senior.n.01", "name": "senior"}, - {"id": 16999, "synset": "senior_vice_president.n.01", "name": "senior_vice_president"}, - {"id": 17000, "synset": "separatist.n.01", "name": "separatist"}, - {"id": 17001, "synset": "septuagenarian.n.01", "name": "septuagenarian"}, - {"id": 17002, "synset": "serf.n.01", "name": "serf"}, - {"id": 17003, "synset": "spree_killer.n.01", "name": "spree_killer"}, - {"id": 17004, "synset": "serjeant-at-law.n.01", "name": "serjeant-at-law"}, - {"id": 17005, "synset": "server.n.02", "name": "server"}, - {"id": 17006, "synset": "serviceman.n.01", "name": "serviceman"}, - {"id": 17007, "synset": "settler.n.01", "name": "settler"}, - {"id": 17008, "synset": "settler.n.03", "name": "settler"}, - {"id": 17009, "synset": "sex_symbol.n.01", "name": "sex_symbol"}, - {"id": 17010, "synset": "sexton.n.02", "name": "sexton"}, - {"id": 17011, "synset": "shaheed.n.01", "name": "shaheed"}, - {"id": 17012, "synset": "shakespearian.n.01", "name": "Shakespearian"}, - {"id": 17013, "synset": "shanghaier.n.01", "name": "shanghaier"}, - {"id": 17014, "synset": "sharecropper.n.01", "name": "sharecropper"}, - {"id": 17015, "synset": "shaver.n.01", "name": "shaver"}, - {"id": 17016, "synset": "shavian.n.01", "name": "Shavian"}, - {"id": 17017, "synset": "sheep.n.02", "name": "sheep"}, - {"id": 17018, "synset": "sheik.n.01", "name": "sheik"}, - {"id": 17019, "synset": "shelver.n.01", "name": "shelver"}, - {"id": 17020, "synset": "shepherd.n.01", "name": "shepherd"}, - {"id": 17021, "synset": "ship-breaker.n.01", "name": "ship-breaker"}, - {"id": 17022, "synset": "shipmate.n.01", "name": "shipmate"}, - {"id": 17023, "synset": "shipowner.n.01", "name": "shipowner"}, - {"id": 17024, "synset": "shipping_agent.n.01", "name": "shipping_agent"}, - {"id": 17025, "synset": "shirtmaker.n.01", "name": "shirtmaker"}, - {"id": 17026, "synset": "shogun.n.01", "name": "shogun"}, - {"id": 17027, "synset": "shopaholic.n.01", "name": "shopaholic"}, - {"id": 17028, "synset": "shop_girl.n.01", "name": "shop_girl"}, - {"id": 17029, "synset": "shop_steward.n.01", "name": "shop_steward"}, - {"id": 17030, "synset": "shot_putter.n.01", "name": "shot_putter"}, - {"id": 17031, "synset": "shrew.n.01", "name": "shrew"}, - {"id": 17032, "synset": "shuffler.n.01", "name": "shuffler"}, - {"id": 17033, "synset": "shyster.n.01", "name": "shyster"}, - {"id": 17034, "synset": "sibling.n.01", "name": "sibling"}, - {"id": 17035, "synset": "sick_person.n.01", "name": "sick_person"}, - {"id": 17036, "synset": "sightreader.n.01", "name": "sightreader"}, - {"id": 17037, "synset": "signaler.n.01", "name": "signaler"}, - {"id": 17038, "synset": "signer.n.01", "name": "signer"}, - {"id": 17039, "synset": "signor.n.01", "name": "signor"}, - {"id": 17040, "synset": "signora.n.01", "name": "signora"}, - {"id": 17041, "synset": "signore.n.01", "name": "signore"}, - {"id": 17042, "synset": "signorina.n.01", "name": "signorina"}, - {"id": 17043, "synset": "silent_partner.n.01", "name": "silent_partner"}, - {"id": 17044, "synset": "addle-head.n.01", "name": "addle-head"}, - {"id": 17045, "synset": "simperer.n.01", "name": "simperer"}, - {"id": 17046, "synset": "singer.n.01", "name": "singer"}, - {"id": 17047, "synset": "sinologist.n.01", "name": "Sinologist"}, - {"id": 17048, "synset": "sipper.n.01", "name": "sipper"}, - {"id": 17049, "synset": "sirrah.n.01", "name": "sirrah"}, - {"id": 17050, "synset": "sister.n.02", "name": "Sister"}, - {"id": 17051, "synset": "sister.n.01", "name": "sister"}, - {"id": 17052, "synset": "waverer.n.01", "name": "waverer"}, - {"id": 17053, "synset": "sitar_player.n.01", "name": "sitar_player"}, - {"id": 17054, "synset": "sixth-former.n.01", "name": "sixth-former"}, - {"id": 17055, "synset": "skateboarder.n.01", "name": "skateboarder"}, - {"id": 17056, "synset": "skeptic.n.01", "name": "skeptic"}, - {"id": 17057, "synset": "sketcher.n.01", "name": "sketcher"}, - {"id": 17058, "synset": "skidder.n.02", "name": "skidder"}, - {"id": 17059, "synset": "skier.n.01", "name": "skier"}, - {"id": 17060, "synset": "skinny-dipper.n.01", "name": "skinny-dipper"}, - {"id": 17061, "synset": "skin-diver.n.01", "name": "skin-diver"}, - {"id": 17062, "synset": "skinhead.n.01", "name": "skinhead"}, - {"id": 17063, "synset": "slasher.n.01", "name": "slasher"}, - {"id": 17064, "synset": "slattern.n.02", "name": "slattern"}, - {"id": 17065, "synset": "sleeper.n.01", "name": "sleeper"}, - {"id": 17066, "synset": "sleeper.n.02", "name": "sleeper"}, - {"id": 17067, "synset": "sleeping_beauty.n.02", "name": "sleeping_beauty"}, - {"id": 17068, "synset": "sleuth.n.01", "name": "sleuth"}, - {"id": 17069, "synset": "slob.n.01", "name": "slob"}, - {"id": 17070, "synset": "sloganeer.n.01", "name": "sloganeer"}, - {"id": 17071, "synset": "slopseller.n.01", "name": "slopseller"}, - {"id": 17072, "synset": "smasher.n.02", "name": "smasher"}, - {"id": 17073, "synset": "smirker.n.01", "name": "smirker"}, - {"id": 17074, "synset": "smith.n.10", "name": "smith"}, - {"id": 17075, "synset": "smoothie.n.01", "name": "smoothie"}, - {"id": 17076, "synset": "smuggler.n.01", "name": "smuggler"}, - {"id": 17077, "synset": "sneezer.n.01", "name": "sneezer"}, - {"id": 17078, "synset": "snob.n.01", "name": "snob"}, - {"id": 17079, "synset": "snoop.n.01", "name": "snoop"}, - {"id": 17080, "synset": "snorer.n.01", "name": "snorer"}, - {"id": 17081, "synset": "sob_sister.n.01", "name": "sob_sister"}, - {"id": 17082, "synset": "soccer_player.n.01", "name": "soccer_player"}, - {"id": 17083, "synset": "social_anthropologist.n.01", "name": "social_anthropologist"}, - {"id": 17084, "synset": "social_climber.n.01", "name": "social_climber"}, - {"id": 17085, "synset": "socialist.n.01", "name": "socialist"}, - {"id": 17086, "synset": "socializer.n.01", "name": "socializer"}, - {"id": 17087, "synset": "social_scientist.n.01", "name": "social_scientist"}, - {"id": 17088, "synset": "social_secretary.n.01", "name": "social_secretary"}, - {"id": 17089, "synset": "socinian.n.01", "name": "Socinian"}, - {"id": 17090, "synset": "sociolinguist.n.01", "name": "sociolinguist"}, - {"id": 17091, "synset": "sociologist.n.01", "name": "sociologist"}, - {"id": 17092, "synset": "soda_jerk.n.01", "name": "soda_jerk"}, - {"id": 17093, "synset": "sodalist.n.01", "name": "sodalist"}, - {"id": 17094, "synset": "sodomite.n.01", "name": "sodomite"}, - {"id": 17095, "synset": "soldier.n.01", "name": "soldier"}, - {"id": 17096, "synset": "son.n.01", "name": "son"}, - {"id": 17097, "synset": "songster.n.02", "name": "songster"}, - {"id": 17098, "synset": "songstress.n.01", "name": "songstress"}, - {"id": 17099, "synset": "songwriter.n.01", "name": "songwriter"}, - {"id": 17100, "synset": "sorcerer.n.01", "name": "sorcerer"}, - {"id": 17101, "synset": "sorehead.n.01", "name": "sorehead"}, - {"id": 17102, "synset": "soul_mate.n.01", "name": "soul_mate"}, - {"id": 17103, "synset": "southern_baptist.n.01", "name": "Southern_Baptist"}, - {"id": 17104, "synset": "sovereign.n.01", "name": "sovereign"}, - {"id": 17105, "synset": "spacewalker.n.01", "name": "spacewalker"}, - {"id": 17106, "synset": "spanish_american.n.01", "name": "Spanish_American"}, - {"id": 17107, "synset": "sparring_partner.n.01", "name": "sparring_partner"}, - {"id": 17108, "synset": "spastic.n.01", "name": "spastic"}, - {"id": 17109, "synset": "speaker.n.01", "name": "speaker"}, - {"id": 17110, "synset": "native_speaker.n.01", "name": "native_speaker"}, - {"id": 17111, "synset": "speaker.n.03", "name": "Speaker"}, - {"id": 17112, "synset": "speechwriter.n.01", "name": "speechwriter"}, - {"id": 17113, "synset": "specialist.n.02", "name": "specialist"}, - {"id": 17114, "synset": "specifier.n.01", "name": "specifier"}, - {"id": 17115, "synset": "spectator.n.01", "name": "spectator"}, - {"id": 17116, "synset": "speech_therapist.n.01", "name": "speech_therapist"}, - {"id": 17117, "synset": "speedskater.n.01", "name": "speedskater"}, - {"id": 17118, "synset": "spellbinder.n.01", "name": "spellbinder"}, - {"id": 17119, "synset": "sphinx.n.01", "name": "sphinx"}, - {"id": 17120, "synset": "spinster.n.01", "name": "spinster"}, - {"id": 17121, "synset": "split_end.n.01", "name": "split_end"}, - {"id": 17122, "synset": "sport.n.05", "name": "sport"}, - {"id": 17123, "synset": "sport.n.03", "name": "sport"}, - {"id": 17124, "synset": "sporting_man.n.02", "name": "sporting_man"}, - {"id": 17125, "synset": "sports_announcer.n.01", "name": "sports_announcer"}, - {"id": 17126, "synset": "sports_editor.n.01", "name": "sports_editor"}, - {"id": 17127, "synset": "sprog.n.02", "name": "sprog"}, - {"id": 17128, "synset": "square_dancer.n.01", "name": "square_dancer"}, - {"id": 17129, "synset": "square_shooter.n.01", "name": "square_shooter"}, - {"id": 17130, "synset": "squatter.n.02", "name": "squatter"}, - {"id": 17131, "synset": "squire.n.02", "name": "squire"}, - {"id": 17132, "synset": "squire.n.01", "name": "squire"}, - {"id": 17133, "synset": "staff_member.n.01", "name": "staff_member"}, - {"id": 17134, "synset": "staff_sergeant.n.01", "name": "staff_sergeant"}, - {"id": 17135, "synset": "stage_director.n.01", "name": "stage_director"}, - {"id": 17136, "synset": "stainer.n.01", "name": "stainer"}, - {"id": 17137, "synset": "stakeholder.n.01", "name": "stakeholder"}, - {"id": 17138, "synset": "stalker.n.02", "name": "stalker"}, - {"id": 17139, "synset": "stalking-horse.n.01", "name": "stalking-horse"}, - {"id": 17140, "synset": "stammerer.n.01", "name": "stammerer"}, - {"id": 17141, "synset": "stamper.n.02", "name": "stamper"}, - {"id": 17142, "synset": "standee.n.01", "name": "standee"}, - {"id": 17143, "synset": "stand-in.n.01", "name": "stand-in"}, - {"id": 17144, "synset": "star.n.04", "name": "star"}, - {"id": 17145, "synset": "starlet.n.01", "name": "starlet"}, - {"id": 17146, "synset": "starter.n.03", "name": "starter"}, - {"id": 17147, "synset": "statesman.n.01", "name": "statesman"}, - {"id": 17148, "synset": "state_treasurer.n.01", "name": "state_treasurer"}, - {"id": 17149, "synset": "stationer.n.01", "name": "stationer"}, - {"id": 17150, "synset": "stenographer.n.01", "name": "stenographer"}, - {"id": 17151, "synset": "stentor.n.01", "name": "stentor"}, - {"id": 17152, "synset": "stepbrother.n.01", "name": "stepbrother"}, - {"id": 17153, "synset": "stepmother.n.01", "name": "stepmother"}, - {"id": 17154, "synset": "stepparent.n.01", "name": "stepparent"}, - {"id": 17155, "synset": "stevedore.n.01", "name": "stevedore"}, - {"id": 17156, "synset": "steward.n.01", "name": "steward"}, - {"id": 17157, "synset": "steward.n.03", "name": "steward"}, - {"id": 17158, "synset": "steward.n.02", "name": "steward"}, - {"id": 17159, "synset": "stickler.n.01", "name": "stickler"}, - {"id": 17160, "synset": "stiff.n.01", "name": "stiff"}, - {"id": 17161, "synset": "stifler.n.01", "name": "stifler"}, - {"id": 17162, "synset": "stipendiary.n.01", "name": "stipendiary"}, - {"id": 17163, "synset": "stitcher.n.01", "name": "stitcher"}, - {"id": 17164, "synset": "stockjobber.n.01", "name": "stockjobber"}, - {"id": 17165, "synset": "stock_trader.n.01", "name": "stock_trader"}, - {"id": 17166, "synset": "stockist.n.01", "name": "stockist"}, - {"id": 17167, "synset": "stoker.n.02", "name": "stoker"}, - {"id": 17168, "synset": "stooper.n.02", "name": "stooper"}, - {"id": 17169, "synset": "store_detective.n.01", "name": "store_detective"}, - {"id": 17170, "synset": "strafer.n.01", "name": "strafer"}, - {"id": 17171, "synset": "straight_man.n.01", "name": "straight_man"}, - {"id": 17172, "synset": "stranger.n.01", "name": "stranger"}, - {"id": 17173, "synset": "stranger.n.02", "name": "stranger"}, - {"id": 17174, "synset": "strategist.n.01", "name": "strategist"}, - {"id": 17175, "synset": "straw_boss.n.01", "name": "straw_boss"}, - {"id": 17176, "synset": "streetwalker.n.01", "name": "streetwalker"}, - {"id": 17177, "synset": "stretcher-bearer.n.01", "name": "stretcher-bearer"}, - {"id": 17178, "synset": "struggler.n.01", "name": "struggler"}, - {"id": 17179, "synset": "stud.n.01", "name": "stud"}, - {"id": 17180, "synset": "student.n.01", "name": "student"}, - {"id": 17181, "synset": "stumblebum.n.01", "name": "stumblebum"}, - {"id": 17182, "synset": "stylist.n.01", "name": "stylist"}, - {"id": 17183, "synset": "subaltern.n.01", "name": "subaltern"}, - {"id": 17184, "synset": "subcontractor.n.01", "name": "subcontractor"}, - {"id": 17185, "synset": "subduer.n.01", "name": "subduer"}, - {"id": 17186, "synset": "subject.n.06", "name": "subject"}, - {"id": 17187, "synset": "subordinate.n.01", "name": "subordinate"}, - {"id": 17188, "synset": "substitute.n.02", "name": "substitute"}, - {"id": 17189, "synset": "successor.n.03", "name": "successor"}, - {"id": 17190, "synset": "successor.n.01", "name": "successor"}, - {"id": 17191, "synset": "succorer.n.01", "name": "succorer"}, - {"id": 17192, "synset": "sufi.n.01", "name": "Sufi"}, - {"id": 17193, "synset": "suffragan.n.01", "name": "suffragan"}, - {"id": 17194, "synset": "suffragette.n.01", "name": "suffragette"}, - {"id": 17195, "synset": "sugar_daddy.n.01", "name": "sugar_daddy"}, - {"id": 17196, "synset": "suicide_bomber.n.01", "name": "suicide_bomber"}, - {"id": 17197, "synset": "suitor.n.01", "name": "suitor"}, - {"id": 17198, "synset": "sumo_wrestler.n.01", "name": "sumo_wrestler"}, - {"id": 17199, "synset": "sunbather.n.01", "name": "sunbather"}, - {"id": 17200, "synset": "sundowner.n.01", "name": "sundowner"}, - {"id": 17201, "synset": "super_heavyweight.n.01", "name": "super_heavyweight"}, - {"id": 17202, "synset": "superior.n.01", "name": "superior"}, - {"id": 17203, "synset": "supermom.n.01", "name": "supermom"}, - {"id": 17204, "synset": "supernumerary.n.02", "name": "supernumerary"}, - {"id": 17205, "synset": "supremo.n.01", "name": "supremo"}, - {"id": 17206, "synset": "surgeon.n.01", "name": "surgeon"}, - {"id": 17207, "synset": "surgeon_general.n.02", "name": "Surgeon_General"}, - {"id": 17208, "synset": "surgeon_general.n.01", "name": "Surgeon_General"}, - {"id": 17209, "synset": "surpriser.n.01", "name": "surpriser"}, - {"id": 17210, "synset": "surveyor.n.01", "name": "surveyor"}, - {"id": 17211, "synset": "surveyor.n.02", "name": "surveyor"}, - {"id": 17212, "synset": "survivor.n.01", "name": "survivor"}, - {"id": 17213, "synset": "sutler.n.01", "name": "sutler"}, - {"id": 17214, "synset": "sweeper.n.01", "name": "sweeper"}, - {"id": 17215, "synset": "sweetheart.n.01", "name": "sweetheart"}, - {"id": 17216, "synset": "swinger.n.02", "name": "swinger"}, - {"id": 17217, "synset": "switcher.n.01", "name": "switcher"}, - {"id": 17218, "synset": "swot.n.01", "name": "swot"}, - {"id": 17219, "synset": "sycophant.n.01", "name": "sycophant"}, - {"id": 17220, "synset": "sylph.n.01", "name": "sylph"}, - {"id": 17221, "synset": "sympathizer.n.02", "name": "sympathizer"}, - {"id": 17222, "synset": "symphonist.n.01", "name": "symphonist"}, - {"id": 17223, "synset": "syncopator.n.01", "name": "syncopator"}, - {"id": 17224, "synset": "syndic.n.01", "name": "syndic"}, - {"id": 17225, "synset": "tactician.n.01", "name": "tactician"}, - {"id": 17226, "synset": "tagger.n.02", "name": "tagger"}, - {"id": 17227, "synset": "tailback.n.01", "name": "tailback"}, - {"id": 17228, "synset": "tallyman.n.02", "name": "tallyman"}, - {"id": 17229, "synset": "tallyman.n.01", "name": "tallyman"}, - {"id": 17230, "synset": "tanker.n.02", "name": "tanker"}, - {"id": 17231, "synset": "tapper.n.04", "name": "tapper"}, - {"id": 17232, "synset": "tartuffe.n.01", "name": "Tartuffe"}, - {"id": 17233, "synset": "tarzan.n.01", "name": "Tarzan"}, - {"id": 17234, "synset": "taster.n.01", "name": "taster"}, - {"id": 17235, "synset": "tax_assessor.n.01", "name": "tax_assessor"}, - {"id": 17236, "synset": "taxer.n.01", "name": "taxer"}, - {"id": 17237, "synset": "taxi_dancer.n.01", "name": "taxi_dancer"}, - {"id": 17238, "synset": "taxonomist.n.01", "name": "taxonomist"}, - {"id": 17239, "synset": "teacher.n.01", "name": "teacher"}, - {"id": 17240, "synset": "teaching_fellow.n.01", "name": "teaching_fellow"}, - {"id": 17241, "synset": "tearaway.n.01", "name": "tearaway"}, - {"id": 17242, "synset": "technical_sergeant.n.01", "name": "technical_sergeant"}, - {"id": 17243, "synset": "technician.n.02", "name": "technician"}, - {"id": 17244, "synset": "ted.n.01", "name": "Ted"}, - {"id": 17245, "synset": "teetotaler.n.01", "name": "teetotaler"}, - {"id": 17246, "synset": "television_reporter.n.01", "name": "television_reporter"}, - {"id": 17247, "synset": "temporizer.n.01", "name": "temporizer"}, - {"id": 17248, "synset": "tempter.n.01", "name": "tempter"}, - {"id": 17249, "synset": "term_infant.n.01", "name": "term_infant"}, - {"id": 17250, "synset": "toiler.n.01", "name": "toiler"}, - {"id": 17251, "synset": "tenant.n.01", "name": "tenant"}, - {"id": 17252, "synset": "tenant.n.02", "name": "tenant"}, - {"id": 17253, "synset": "tenderfoot.n.01", "name": "tenderfoot"}, - {"id": 17254, "synset": "tennis_player.n.01", "name": "tennis_player"}, - {"id": 17255, "synset": "tennis_pro.n.01", "name": "tennis_pro"}, - {"id": 17256, "synset": "tenor_saxophonist.n.01", "name": "tenor_saxophonist"}, - {"id": 17257, "synset": "termer.n.01", "name": "termer"}, - {"id": 17258, "synset": "terror.n.02", "name": "terror"}, - {"id": 17259, "synset": "tertigravida.n.01", "name": "tertigravida"}, - {"id": 17260, "synset": "testator.n.01", "name": "testator"}, - {"id": 17261, "synset": "testatrix.n.01", "name": "testatrix"}, - {"id": 17262, "synset": "testee.n.01", "name": "testee"}, - {"id": 17263, "synset": "test-tube_baby.n.01", "name": "test-tube_baby"}, - {"id": 17264, "synset": "texas_ranger.n.01", "name": "Texas_Ranger"}, - {"id": 17265, "synset": "thane.n.02", "name": "thane"}, - {"id": 17266, "synset": "theatrical_producer.n.01", "name": "theatrical_producer"}, - {"id": 17267, "synset": "theologian.n.01", "name": "theologian"}, - {"id": 17268, "synset": "theorist.n.01", "name": "theorist"}, - {"id": 17269, "synset": "theosophist.n.01", "name": "theosophist"}, - {"id": 17270, "synset": "therapist.n.01", "name": "therapist"}, - {"id": 17271, "synset": "thessalonian.n.01", "name": "Thessalonian"}, - {"id": 17272, "synset": "thinker.n.01", "name": "thinker"}, - {"id": 17273, "synset": "thinker.n.02", "name": "thinker"}, - {"id": 17274, "synset": "thrower.n.02", "name": "thrower"}, - {"id": 17275, "synset": "thurifer.n.01", "name": "thurifer"}, - {"id": 17276, "synset": "ticket_collector.n.01", "name": "ticket_collector"}, - {"id": 17277, "synset": "tight_end.n.01", "name": "tight_end"}, - {"id": 17278, "synset": "tiler.n.01", "name": "tiler"}, - {"id": 17279, "synset": "timekeeper.n.01", "name": "timekeeper"}, - {"id": 17280, "synset": "timorese.n.01", "name": "Timorese"}, - {"id": 17281, "synset": "tinkerer.n.01", "name": "tinkerer"}, - {"id": 17282, "synset": "tinsmith.n.01", "name": "tinsmith"}, - {"id": 17283, "synset": "tinter.n.01", "name": "tinter"}, - {"id": 17284, "synset": "tippler.n.01", "name": "tippler"}, - {"id": 17285, "synset": "tipster.n.01", "name": "tipster"}, - {"id": 17286, "synset": "t-man.n.01", "name": "T-man"}, - {"id": 17287, "synset": "toastmaster.n.01", "name": "toastmaster"}, - {"id": 17288, "synset": "toast_mistress.n.01", "name": "toast_mistress"}, - {"id": 17289, "synset": "tobogganist.n.01", "name": "tobogganist"}, - {"id": 17290, "synset": "tomboy.n.01", "name": "tomboy"}, - {"id": 17291, "synset": "toolmaker.n.01", "name": "toolmaker"}, - {"id": 17292, "synset": "torchbearer.n.01", "name": "torchbearer"}, - {"id": 17293, "synset": "tory.n.01", "name": "Tory"}, - {"id": 17294, "synset": "tory.n.02", "name": "Tory"}, - {"id": 17295, "synset": "tosser.n.02", "name": "tosser"}, - {"id": 17296, "synset": "tosser.n.01", "name": "tosser"}, - {"id": 17297, "synset": "totalitarian.n.01", "name": "totalitarian"}, - {"id": 17298, "synset": "tourist.n.01", "name": "tourist"}, - {"id": 17299, "synset": "tout.n.02", "name": "tout"}, - {"id": 17300, "synset": "tout.n.01", "name": "tout"}, - {"id": 17301, "synset": "tovarich.n.01", "name": "tovarich"}, - {"id": 17302, "synset": "towhead.n.01", "name": "towhead"}, - {"id": 17303, "synset": "town_clerk.n.01", "name": "town_clerk"}, - {"id": 17304, "synset": "town_crier.n.01", "name": "town_crier"}, - {"id": 17305, "synset": "townsman.n.02", "name": "townsman"}, - {"id": 17306, "synset": "toxicologist.n.01", "name": "toxicologist"}, - {"id": 17307, "synset": "track_star.n.01", "name": "track_star"}, - {"id": 17308, "synset": "trader.n.01", "name": "trader"}, - {"id": 17309, "synset": "trade_unionist.n.01", "name": "trade_unionist"}, - {"id": 17310, "synset": "traditionalist.n.01", "name": "traditionalist"}, - {"id": 17311, "synset": "traffic_cop.n.01", "name": "traffic_cop"}, - {"id": 17312, "synset": "tragedian.n.02", "name": "tragedian"}, - {"id": 17313, "synset": "tragedian.n.01", "name": "tragedian"}, - {"id": 17314, "synset": "tragedienne.n.01", "name": "tragedienne"}, - {"id": 17315, "synset": "trail_boss.n.01", "name": "trail_boss"}, - {"id": 17316, "synset": "trainer.n.01", "name": "trainer"}, - {"id": 17317, "synset": "traitor.n.01", "name": "traitor"}, - {"id": 17318, "synset": "traitress.n.01", "name": "traitress"}, - {"id": 17319, "synset": "transactor.n.01", "name": "transactor"}, - {"id": 17320, "synset": "transcriber.n.03", "name": "transcriber"}, - {"id": 17321, "synset": "transfer.n.02", "name": "transfer"}, - {"id": 17322, "synset": "transferee.n.01", "name": "transferee"}, - {"id": 17323, "synset": "translator.n.01", "name": "translator"}, - {"id": 17324, "synset": "transvestite.n.01", "name": "transvestite"}, - {"id": 17325, "synset": "traveling_salesman.n.01", "name": "traveling_salesman"}, - {"id": 17326, "synset": "traverser.n.01", "name": "traverser"}, - {"id": 17327, "synset": "trawler.n.01", "name": "trawler"}, - {"id": 17328, "synset": "treasury.n.04", "name": "Treasury"}, - {"id": 17329, "synset": "trencher.n.01", "name": "trencher"}, - {"id": 17330, "synset": "trend-setter.n.01", "name": "trend-setter"}, - {"id": 17331, "synset": "tribesman.n.01", "name": "tribesman"}, - {"id": 17332, "synset": "trier.n.02", "name": "trier"}, - {"id": 17333, "synset": "trifler.n.01", "name": "trifler"}, - {"id": 17334, "synset": "trooper.n.02", "name": "trooper"}, - {"id": 17335, "synset": "trooper.n.03", "name": "trooper"}, - {"id": 17336, "synset": "trotskyite.n.01", "name": "Trotskyite"}, - {"id": 17337, "synset": "truant.n.01", "name": "truant"}, - {"id": 17338, "synset": "trumpeter.n.01", "name": "trumpeter"}, - {"id": 17339, "synset": "trusty.n.01", "name": "trusty"}, - {"id": 17340, "synset": "tudor.n.03", "name": "Tudor"}, - {"id": 17341, "synset": "tumbler.n.01", "name": "tumbler"}, - {"id": 17342, "synset": "tutee.n.01", "name": "tutee"}, - {"id": 17343, "synset": "twin.n.01", "name": "twin"}, - {"id": 17344, "synset": "two-timer.n.01", "name": "two-timer"}, - {"id": 17345, "synset": "tyke.n.01", "name": "Tyke"}, - {"id": 17346, "synset": "tympanist.n.01", "name": "tympanist"}, - {"id": 17347, "synset": "typist.n.01", "name": "typist"}, - {"id": 17348, "synset": "tyrant.n.01", "name": "tyrant"}, - {"id": 17349, "synset": "umpire.n.01", "name": "umpire"}, - {"id": 17350, "synset": "understudy.n.01", "name": "understudy"}, - {"id": 17351, "synset": "undesirable.n.01", "name": "undesirable"}, - {"id": 17352, "synset": "unicyclist.n.01", "name": "unicyclist"}, - {"id": 17353, "synset": "unilateralist.n.01", "name": "unilateralist"}, - {"id": 17354, "synset": "unitarian.n.01", "name": "Unitarian"}, - {"id": 17355, "synset": "arminian.n.01", "name": "Arminian"}, - {"id": 17356, "synset": "universal_donor.n.01", "name": "universal_donor"}, - {"id": 17357, "synset": "unix_guru.n.01", "name": "UNIX_guru"}, - {"id": 17358, "synset": "unknown_soldier.n.01", "name": "Unknown_Soldier"}, - {"id": 17359, "synset": "upsetter.n.01", "name": "upsetter"}, - {"id": 17360, "synset": "upstager.n.01", "name": "upstager"}, - {"id": 17361, "synset": "upstart.n.02", "name": "upstart"}, - {"id": 17362, "synset": "upstart.n.01", "name": "upstart"}, - {"id": 17363, "synset": "urchin.n.01", "name": "urchin"}, - {"id": 17364, "synset": "urologist.n.01", "name": "urologist"}, - {"id": 17365, "synset": "usherette.n.01", "name": "usherette"}, - {"id": 17366, "synset": "usher.n.02", "name": "usher"}, - {"id": 17367, "synset": "usurper.n.01", "name": "usurper"}, - {"id": 17368, "synset": "utility_man.n.01", "name": "utility_man"}, - {"id": 17369, "synset": "utilizer.n.01", "name": "utilizer"}, - {"id": 17370, "synset": "utopian.n.01", "name": "Utopian"}, - {"id": 17371, "synset": "uxoricide.n.01", "name": "uxoricide"}, - {"id": 17372, "synset": "vacationer.n.01", "name": "vacationer"}, - {"id": 17373, "synset": "valedictorian.n.01", "name": "valedictorian"}, - {"id": 17374, "synset": "valley_girl.n.01", "name": "valley_girl"}, - {"id": 17375, "synset": "vaulter.n.01", "name": "vaulter"}, - {"id": 17376, "synset": "vegetarian.n.01", "name": "vegetarian"}, - {"id": 17377, "synset": "vegan.n.01", "name": "vegan"}, - {"id": 17378, "synset": "venerator.n.01", "name": "venerator"}, - {"id": 17379, "synset": "venture_capitalist.n.01", "name": "venture_capitalist"}, - {"id": 17380, "synset": "venturer.n.01", "name": "venturer"}, - {"id": 17381, "synset": "vermin.n.01", "name": "vermin"}, - {"id": 17382, "synset": "very_important_person.n.01", "name": "very_important_person"}, - {"id": 17383, "synset": "vibist.n.01", "name": "vibist"}, - {"id": 17384, "synset": "vicar.n.01", "name": "vicar"}, - {"id": 17385, "synset": "vicar.n.03", "name": "vicar"}, - {"id": 17386, "synset": "vicar-general.n.01", "name": "vicar-general"}, - {"id": 17387, "synset": "vice_chancellor.n.01", "name": "vice_chancellor"}, - {"id": 17388, "synset": "vicegerent.n.01", "name": "vicegerent"}, - {"id": 17389, "synset": "vice_president.n.01", "name": "vice_president"}, - {"id": 17390, "synset": "vice-regent.n.01", "name": "vice-regent"}, - {"id": 17391, "synset": "victim.n.02", "name": "victim"}, - {"id": 17392, "synset": "victorian.n.01", "name": "Victorian"}, - {"id": 17393, "synset": "victualer.n.01", "name": "victualer"}, - {"id": 17394, "synset": "vigilante.n.01", "name": "vigilante"}, - {"id": 17395, "synset": "villager.n.01", "name": "villager"}, - {"id": 17396, "synset": "vintager.n.01", "name": "vintager"}, - {"id": 17397, "synset": "vintner.n.01", "name": "vintner"}, - {"id": 17398, "synset": "violator.n.02", "name": "violator"}, - {"id": 17399, "synset": "violator.n.01", "name": "violator"}, - {"id": 17400, "synset": "violist.n.01", "name": "violist"}, - {"id": 17401, "synset": "virago.n.01", "name": "virago"}, - {"id": 17402, "synset": "virologist.n.01", "name": "virologist"}, - {"id": 17403, "synset": "visayan.n.01", "name": "Visayan"}, - {"id": 17404, "synset": "viscountess.n.01", "name": "viscountess"}, - {"id": 17405, "synset": "viscount.n.01", "name": "viscount"}, - {"id": 17406, "synset": "visigoth.n.01", "name": "Visigoth"}, - {"id": 17407, "synset": "visionary.n.01", "name": "visionary"}, - {"id": 17408, "synset": "visiting_fireman.n.01", "name": "visiting_fireman"}, - {"id": 17409, "synset": "visiting_professor.n.01", "name": "visiting_professor"}, - {"id": 17410, "synset": "visualizer.n.01", "name": "visualizer"}, - {"id": 17411, "synset": "vixen.n.01", "name": "vixen"}, - {"id": 17412, "synset": "vizier.n.01", "name": "vizier"}, - {"id": 17413, "synset": "voicer.n.01", "name": "voicer"}, - {"id": 17414, "synset": "volunteer.n.02", "name": "volunteer"}, - {"id": 17415, "synset": "volunteer.n.01", "name": "volunteer"}, - {"id": 17416, "synset": "votary.n.02", "name": "votary"}, - {"id": 17417, "synset": "votary.n.01", "name": "votary"}, - {"id": 17418, "synset": "vouchee.n.01", "name": "vouchee"}, - {"id": 17419, "synset": "vower.n.01", "name": "vower"}, - {"id": 17420, "synset": "voyager.n.01", "name": "voyager"}, - {"id": 17421, "synset": "voyeur.n.01", "name": "voyeur"}, - {"id": 17422, "synset": "vulcanizer.n.01", "name": "vulcanizer"}, - {"id": 17423, "synset": "waffler.n.01", "name": "waffler"}, - {"id": 17424, "synset": "wagnerian.n.01", "name": "Wagnerian"}, - {"id": 17425, "synset": "waif.n.01", "name": "waif"}, - {"id": 17426, "synset": "wailer.n.01", "name": "wailer"}, - {"id": 17427, "synset": "waiter.n.01", "name": "waiter"}, - {"id": 17428, "synset": "waitress.n.01", "name": "waitress"}, - {"id": 17429, "synset": "walking_delegate.n.01", "name": "walking_delegate"}, - {"id": 17430, "synset": "walk-on.n.01", "name": "walk-on"}, - {"id": 17431, "synset": "wallah.n.01", "name": "wallah"}, - {"id": 17432, "synset": "wally.n.01", "name": "wally"}, - {"id": 17433, "synset": "waltzer.n.01", "name": "waltzer"}, - {"id": 17434, "synset": "wanderer.n.01", "name": "wanderer"}, - {"id": 17435, "synset": "wandering_jew.n.01", "name": "Wandering_Jew"}, - {"id": 17436, "synset": "wanton.n.01", "name": "wanton"}, - {"id": 17437, "synset": "warrantee.n.02", "name": "warrantee"}, - {"id": 17438, "synset": "warrantee.n.01", "name": "warrantee"}, - {"id": 17439, "synset": "washer.n.01", "name": "washer"}, - {"id": 17440, "synset": "washerman.n.01", "name": "washerman"}, - {"id": 17441, "synset": "washwoman.n.01", "name": "washwoman"}, - {"id": 17442, "synset": "wassailer.n.01", "name": "wassailer"}, - {"id": 17443, "synset": "wastrel.n.01", "name": "wastrel"}, - {"id": 17444, "synset": "wave.n.09", "name": "Wave"}, - {"id": 17445, "synset": "weatherman.n.01", "name": "weatherman"}, - {"id": 17446, "synset": "weekend_warrior.n.02", "name": "weekend_warrior"}, - {"id": 17447, "synset": "weeder.n.01", "name": "weeder"}, - {"id": 17448, "synset": "welder.n.01", "name": "welder"}, - {"id": 17449, "synset": "welfare_case.n.01", "name": "welfare_case"}, - {"id": 17450, "synset": "westerner.n.01", "name": "westerner"}, - {"id": 17451, "synset": "west-sider.n.01", "name": "West-sider"}, - {"id": 17452, "synset": "wetter.n.02", "name": "wetter"}, - {"id": 17453, "synset": "whaler.n.01", "name": "whaler"}, - {"id": 17454, "synset": "whig.n.02", "name": "Whig"}, - {"id": 17455, "synset": "whiner.n.01", "name": "whiner"}, - {"id": 17456, "synset": "whipper-in.n.01", "name": "whipper-in"}, - {"id": 17457, "synset": "whisperer.n.01", "name": "whisperer"}, - {"id": 17458, "synset": "whiteface.n.02", "name": "whiteface"}, - {"id": 17459, "synset": "carmelite.n.01", "name": "Carmelite"}, - {"id": 17460, "synset": "augustinian.n.01", "name": "Augustinian"}, - {"id": 17461, "synset": "white_hope.n.01", "name": "white_hope"}, - {"id": 17462, "synset": "white_supremacist.n.01", "name": "white_supremacist"}, - {"id": 17463, "synset": "whoremaster.n.02", "name": "whoremaster"}, - {"id": 17464, "synset": "whoremaster.n.01", "name": "whoremaster"}, - {"id": 17465, "synset": "widow.n.01", "name": "widow"}, - {"id": 17466, "synset": "wife.n.01", "name": "wife"}, - {"id": 17467, "synset": "wiggler.n.01", "name": "wiggler"}, - {"id": 17468, "synset": "wimp.n.01", "name": "wimp"}, - {"id": 17469, "synset": "wing_commander.n.01", "name": "wing_commander"}, - {"id": 17470, "synset": "winger.n.01", "name": "winger"}, - {"id": 17471, "synset": "winner.n.02", "name": "winner"}, - {"id": 17472, "synset": "winner.n.01", "name": "winner"}, - {"id": 17473, "synset": "window_dresser.n.01", "name": "window_dresser"}, - {"id": 17474, "synset": "winker.n.01", "name": "winker"}, - {"id": 17475, "synset": "wiper.n.01", "name": "wiper"}, - {"id": 17476, "synset": "wireman.n.01", "name": "wireman"}, - {"id": 17477, "synset": "wise_guy.n.01", "name": "wise_guy"}, - {"id": 17478, "synset": "witch_doctor.n.01", "name": "witch_doctor"}, - {"id": 17479, "synset": "withdrawer.n.05", "name": "withdrawer"}, - {"id": 17480, "synset": "withdrawer.n.01", "name": "withdrawer"}, - {"id": 17481, "synset": "woman.n.01", "name": "woman"}, - {"id": 17482, "synset": "woman.n.02", "name": "woman"}, - {"id": 17483, "synset": "wonder_boy.n.01", "name": "wonder_boy"}, - {"id": 17484, "synset": "wonderer.n.01", "name": "wonderer"}, - {"id": 17485, "synset": "working_girl.n.01", "name": "working_girl"}, - {"id": 17486, "synset": "workman.n.01", "name": "workman"}, - {"id": 17487, "synset": "workmate.n.01", "name": "workmate"}, - {"id": 17488, "synset": "worldling.n.01", "name": "worldling"}, - {"id": 17489, "synset": "worshiper.n.01", "name": "worshiper"}, - {"id": 17490, "synset": "worthy.n.01", "name": "worthy"}, - {"id": 17491, "synset": "wrecker.n.01", "name": "wrecker"}, - {"id": 17492, "synset": "wright.n.07", "name": "wright"}, - {"id": 17493, "synset": "write-in_candidate.n.01", "name": "write-in_candidate"}, - {"id": 17494, "synset": "writer.n.01", "name": "writer"}, - {"id": 17495, "synset": "wykehamist.n.01", "name": "Wykehamist"}, - {"id": 17496, "synset": "yakuza.n.01", "name": "yakuza"}, - {"id": 17497, "synset": "yard_bird.n.01", "name": "yard_bird"}, - {"id": 17498, "synset": "yardie.n.01", "name": "yardie"}, - {"id": 17499, "synset": "yardman.n.01", "name": "yardman"}, - {"id": 17500, "synset": "yardmaster.n.01", "name": "yardmaster"}, - {"id": 17501, "synset": "yenta.n.02", "name": "yenta"}, - {"id": 17502, "synset": "yogi.n.02", "name": "yogi"}, - {"id": 17503, "synset": "young_buck.n.01", "name": "young_buck"}, - {"id": 17504, "synset": "young_turk.n.02", "name": "young_Turk"}, - {"id": 17505, "synset": "young_turk.n.01", "name": "Young_Turk"}, - {"id": 17506, "synset": "zionist.n.01", "name": "Zionist"}, - {"id": 17507, "synset": "zoo_keeper.n.01", "name": "zoo_keeper"}, - {"id": 17508, "synset": "genet.n.01", "name": "Genet"}, - {"id": 17509, "synset": "kennan.n.01", "name": "Kennan"}, - {"id": 17510, "synset": "munro.n.01", "name": "Munro"}, - {"id": 17511, "synset": "popper.n.01", "name": "Popper"}, - {"id": 17512, "synset": "stoker.n.01", "name": "Stoker"}, - {"id": 17513, "synset": "townes.n.01", "name": "Townes"}, - {"id": 17514, "synset": "dust_storm.n.01", "name": "dust_storm"}, - {"id": 17515, "synset": "parhelion.n.01", "name": "parhelion"}, - {"id": 17516, "synset": "snow.n.01", "name": "snow"}, - {"id": 17517, "synset": "facula.n.01", "name": "facula"}, - {"id": 17518, "synset": "wave.n.08", "name": "wave"}, - {"id": 17519, "synset": "microflora.n.01", "name": "microflora"}, - {"id": 17520, "synset": "wilding.n.01", "name": "wilding"}, - {"id": 17521, "synset": "semi-climber.n.01", "name": "semi-climber"}, - {"id": 17522, "synset": "volva.n.01", "name": "volva"}, - {"id": 17523, "synset": "basidiocarp.n.01", "name": "basidiocarp"}, - {"id": 17524, "synset": "domatium.n.01", "name": "domatium"}, - {"id": 17525, "synset": "apomict.n.01", "name": "apomict"}, - {"id": 17526, "synset": "aquatic.n.01", "name": "aquatic"}, - {"id": 17527, "synset": "bryophyte.n.01", "name": "bryophyte"}, - {"id": 17528, "synset": "acrocarp.n.01", "name": "acrocarp"}, - {"id": 17529, "synset": "sphagnum.n.01", "name": "sphagnum"}, - {"id": 17530, "synset": "liverwort.n.01", "name": "liverwort"}, - {"id": 17531, "synset": "hepatica.n.02", "name": "hepatica"}, - {"id": 17532, "synset": "pecopteris.n.01", "name": "pecopteris"}, - {"id": 17533, "synset": "pteridophyte.n.01", "name": "pteridophyte"}, - {"id": 17534, "synset": "fern.n.01", "name": "fern"}, - {"id": 17535, "synset": "fern_ally.n.01", "name": "fern_ally"}, - {"id": 17536, "synset": "spore.n.01", "name": "spore"}, - {"id": 17537, "synset": "carpospore.n.01", "name": "carpospore"}, - {"id": 17538, "synset": "chlamydospore.n.01", "name": "chlamydospore"}, - {"id": 17539, "synset": "conidium.n.01", "name": "conidium"}, - {"id": 17540, "synset": "oospore.n.01", "name": "oospore"}, - {"id": 17541, "synset": "tetraspore.n.01", "name": "tetraspore"}, - {"id": 17542, "synset": "zoospore.n.01", "name": "zoospore"}, - {"id": 17543, "synset": "cryptogam.n.01", "name": "cryptogam"}, - {"id": 17544, "synset": "spermatophyte.n.01", "name": "spermatophyte"}, - {"id": 17545, "synset": "seedling.n.01", "name": "seedling"}, - {"id": 17546, "synset": "annual.n.01", "name": "annual"}, - {"id": 17547, "synset": "biennial.n.01", "name": "biennial"}, - {"id": 17548, "synset": "perennial.n.01", "name": "perennial"}, - {"id": 17549, "synset": "hygrophyte.n.01", "name": "hygrophyte"}, - {"id": 17550, "synset": "gymnosperm.n.01", "name": "gymnosperm"}, - {"id": 17551, "synset": "gnetum.n.01", "name": "gnetum"}, - {"id": 17552, "synset": "catha_edulis.n.01", "name": "Catha_edulis"}, - {"id": 17553, "synset": "ephedra.n.01", "name": "ephedra"}, - {"id": 17554, "synset": "mahuang.n.01", "name": "mahuang"}, - {"id": 17555, "synset": "welwitschia.n.01", "name": "welwitschia"}, - {"id": 17556, "synset": "cycad.n.01", "name": "cycad"}, - {"id": 17557, "synset": "sago_palm.n.02", "name": "sago_palm"}, - {"id": 17558, "synset": "false_sago.n.01", "name": "false_sago"}, - {"id": 17559, "synset": "zamia.n.01", "name": "zamia"}, - {"id": 17560, "synset": "coontie.n.01", "name": "coontie"}, - {"id": 17561, "synset": "ceratozamia.n.01", "name": "ceratozamia"}, - {"id": 17562, "synset": "dioon.n.01", "name": "dioon"}, - {"id": 17563, "synset": "encephalartos.n.01", "name": "encephalartos"}, - {"id": 17564, "synset": "kaffir_bread.n.01", "name": "kaffir_bread"}, - {"id": 17565, "synset": "macrozamia.n.01", "name": "macrozamia"}, - {"id": 17566, "synset": "burrawong.n.01", "name": "burrawong"}, - {"id": 17567, "synset": "pine.n.01", "name": "pine"}, - {"id": 17568, "synset": "pinon.n.01", "name": "pinon"}, - {"id": 17569, "synset": "nut_pine.n.01", "name": "nut_pine"}, - {"id": 17570, "synset": "pinon_pine.n.01", "name": "pinon_pine"}, - {"id": 17571, "synset": "rocky_mountain_pinon.n.01", "name": "Rocky_mountain_pinon"}, - {"id": 17572, "synset": "single-leaf.n.01", "name": "single-leaf"}, - {"id": 17573, "synset": "bishop_pine.n.01", "name": "bishop_pine"}, - { - "id": 17574, - "synset": "california_single-leaf_pinyon.n.01", - "name": "California_single-leaf_pinyon", - }, - {"id": 17575, "synset": "parry's_pinyon.n.01", "name": "Parry's_pinyon"}, - {"id": 17576, "synset": "spruce_pine.n.04", "name": "spruce_pine"}, - {"id": 17577, "synset": "black_pine.n.05", "name": "black_pine"}, - {"id": 17578, "synset": "pitch_pine.n.02", "name": "pitch_pine"}, - {"id": 17579, "synset": "pond_pine.n.01", "name": "pond_pine"}, - {"id": 17580, "synset": "stone_pine.n.01", "name": "stone_pine"}, - {"id": 17581, "synset": "swiss_pine.n.01", "name": "Swiss_pine"}, - {"id": 17582, "synset": "cembra_nut.n.01", "name": "cembra_nut"}, - {"id": 17583, "synset": "swiss_mountain_pine.n.01", "name": "Swiss_mountain_pine"}, - {"id": 17584, "synset": "ancient_pine.n.01", "name": "ancient_pine"}, - {"id": 17585, "synset": "white_pine.n.01", "name": "white_pine"}, - {"id": 17586, "synset": "american_white_pine.n.01", "name": "American_white_pine"}, - {"id": 17587, "synset": "western_white_pine.n.01", "name": "western_white_pine"}, - {"id": 17588, "synset": "southwestern_white_pine.n.01", "name": "southwestern_white_pine"}, - {"id": 17589, "synset": "limber_pine.n.01", "name": "limber_pine"}, - {"id": 17590, "synset": "whitebark_pine.n.01", "name": "whitebark_pine"}, - {"id": 17591, "synset": "yellow_pine.n.01", "name": "yellow_pine"}, - {"id": 17592, "synset": "ponderosa.n.01", "name": "ponderosa"}, - {"id": 17593, "synset": "jeffrey_pine.n.01", "name": "Jeffrey_pine"}, - {"id": 17594, "synset": "shore_pine.n.01", "name": "shore_pine"}, - {"id": 17595, "synset": "sierra_lodgepole_pine.n.01", "name": "Sierra_lodgepole_pine"}, - {"id": 17596, "synset": "loblolly_pine.n.01", "name": "loblolly_pine"}, - {"id": 17597, "synset": "jack_pine.n.01", "name": "jack_pine"}, - {"id": 17598, "synset": "swamp_pine.n.01", "name": "swamp_pine"}, - {"id": 17599, "synset": "longleaf_pine.n.01", "name": "longleaf_pine"}, - {"id": 17600, "synset": "shortleaf_pine.n.01", "name": "shortleaf_pine"}, - {"id": 17601, "synset": "red_pine.n.02", "name": "red_pine"}, - {"id": 17602, "synset": "scotch_pine.n.01", "name": "Scotch_pine"}, - {"id": 17603, "synset": "scrub_pine.n.01", "name": "scrub_pine"}, - {"id": 17604, "synset": "monterey_pine.n.01", "name": "Monterey_pine"}, - {"id": 17605, "synset": "bristlecone_pine.n.01", "name": "bristlecone_pine"}, - {"id": 17606, "synset": "table-mountain_pine.n.01", "name": "table-mountain_pine"}, - {"id": 17607, "synset": "knobcone_pine.n.01", "name": "knobcone_pine"}, - {"id": 17608, "synset": "japanese_red_pine.n.01", "name": "Japanese_red_pine"}, - {"id": 17609, "synset": "japanese_black_pine.n.01", "name": "Japanese_black_pine"}, - {"id": 17610, "synset": "torrey_pine.n.01", "name": "Torrey_pine"}, - {"id": 17611, "synset": "larch.n.02", "name": "larch"}, - {"id": 17612, "synset": "american_larch.n.01", "name": "American_larch"}, - {"id": 17613, "synset": "western_larch.n.01", "name": "western_larch"}, - {"id": 17614, "synset": "subalpine_larch.n.01", "name": "subalpine_larch"}, - {"id": 17615, "synset": "european_larch.n.01", "name": "European_larch"}, - {"id": 17616, "synset": "siberian_larch.n.01", "name": "Siberian_larch"}, - {"id": 17617, "synset": "golden_larch.n.01", "name": "golden_larch"}, - {"id": 17618, "synset": "fir.n.02", "name": "fir"}, - {"id": 17619, "synset": "silver_fir.n.01", "name": "silver_fir"}, - {"id": 17620, "synset": "amabilis_fir.n.01", "name": "amabilis_fir"}, - {"id": 17621, "synset": "european_silver_fir.n.01", "name": "European_silver_fir"}, - {"id": 17622, "synset": "white_fir.n.01", "name": "white_fir"}, - {"id": 17623, "synset": "balsam_fir.n.01", "name": "balsam_fir"}, - {"id": 17624, "synset": "fraser_fir.n.01", "name": "Fraser_fir"}, - {"id": 17625, "synset": "lowland_fir.n.01", "name": "lowland_fir"}, - {"id": 17626, "synset": "alpine_fir.n.01", "name": "Alpine_fir"}, - {"id": 17627, "synset": "santa_lucia_fir.n.01", "name": "Santa_Lucia_fir"}, - {"id": 17628, "synset": "cedar.n.03", "name": "cedar"}, - {"id": 17629, "synset": "cedar_of_lebanon.n.01", "name": "cedar_of_Lebanon"}, - {"id": 17630, "synset": "deodar.n.01", "name": "deodar"}, - {"id": 17631, "synset": "atlas_cedar.n.01", "name": "Atlas_cedar"}, - {"id": 17632, "synset": "spruce.n.02", "name": "spruce"}, - {"id": 17633, "synset": "norway_spruce.n.01", "name": "Norway_spruce"}, - {"id": 17634, "synset": "weeping_spruce.n.01", "name": "weeping_spruce"}, - {"id": 17635, "synset": "engelmann_spruce.n.01", "name": "Engelmann_spruce"}, - {"id": 17636, "synset": "white_spruce.n.01", "name": "white_spruce"}, - {"id": 17637, "synset": "black_spruce.n.01", "name": "black_spruce"}, - {"id": 17638, "synset": "siberian_spruce.n.01", "name": "Siberian_spruce"}, - {"id": 17639, "synset": "sitka_spruce.n.01", "name": "Sitka_spruce"}, - {"id": 17640, "synset": "oriental_spruce.n.01", "name": "oriental_spruce"}, - {"id": 17641, "synset": "colorado_spruce.n.01", "name": "Colorado_spruce"}, - {"id": 17642, "synset": "red_spruce.n.01", "name": "red_spruce"}, - {"id": 17643, "synset": "hemlock.n.04", "name": "hemlock"}, - {"id": 17644, "synset": "eastern_hemlock.n.01", "name": "eastern_hemlock"}, - {"id": 17645, "synset": "carolina_hemlock.n.01", "name": "Carolina_hemlock"}, - {"id": 17646, "synset": "mountain_hemlock.n.01", "name": "mountain_hemlock"}, - {"id": 17647, "synset": "western_hemlock.n.01", "name": "western_hemlock"}, - {"id": 17648, "synset": "douglas_fir.n.02", "name": "douglas_fir"}, - {"id": 17649, "synset": "green_douglas_fir.n.01", "name": "green_douglas_fir"}, - {"id": 17650, "synset": "big-cone_spruce.n.01", "name": "big-cone_spruce"}, - {"id": 17651, "synset": "cathaya.n.01", "name": "Cathaya"}, - {"id": 17652, "synset": "cedar.n.01", "name": "cedar"}, - {"id": 17653, "synset": "cypress.n.02", "name": "cypress"}, - {"id": 17654, "synset": "gowen_cypress.n.01", "name": "gowen_cypress"}, - {"id": 17655, "synset": "pygmy_cypress.n.01", "name": "pygmy_cypress"}, - {"id": 17656, "synset": "santa_cruz_cypress.n.01", "name": "Santa_Cruz_cypress"}, - {"id": 17657, "synset": "arizona_cypress.n.01", "name": "Arizona_cypress"}, - {"id": 17658, "synset": "guadalupe_cypress.n.01", "name": "Guadalupe_cypress"}, - {"id": 17659, "synset": "monterey_cypress.n.01", "name": "Monterey_cypress"}, - {"id": 17660, "synset": "mexican_cypress.n.01", "name": "Mexican_cypress"}, - {"id": 17661, "synset": "italian_cypress.n.01", "name": "Italian_cypress"}, - {"id": 17662, "synset": "king_william_pine.n.01", "name": "King_William_pine"}, - {"id": 17663, "synset": "chilean_cedar.n.01", "name": "Chilean_cedar"}, - {"id": 17664, "synset": "incense_cedar.n.02", "name": "incense_cedar"}, - {"id": 17665, "synset": "southern_white_cedar.n.01", "name": "southern_white_cedar"}, - {"id": 17666, "synset": "oregon_cedar.n.01", "name": "Oregon_cedar"}, - {"id": 17667, "synset": "yellow_cypress.n.01", "name": "yellow_cypress"}, - {"id": 17668, "synset": "japanese_cedar.n.01", "name": "Japanese_cedar"}, - {"id": 17669, "synset": "juniper_berry.n.01", "name": "juniper_berry"}, - {"id": 17670, "synset": "incense_cedar.n.01", "name": "incense_cedar"}, - {"id": 17671, "synset": "kawaka.n.01", "name": "kawaka"}, - {"id": 17672, "synset": "pahautea.n.01", "name": "pahautea"}, - {"id": 17673, "synset": "metasequoia.n.01", "name": "metasequoia"}, - {"id": 17674, "synset": "arborvitae.n.01", "name": "arborvitae"}, - {"id": 17675, "synset": "western_red_cedar.n.01", "name": "western_red_cedar"}, - {"id": 17676, "synset": "american_arborvitae.n.01", "name": "American_arborvitae"}, - {"id": 17677, "synset": "oriental_arborvitae.n.01", "name": "Oriental_arborvitae"}, - {"id": 17678, "synset": "hiba_arborvitae.n.01", "name": "hiba_arborvitae"}, - {"id": 17679, "synset": "keteleeria.n.01", "name": "keteleeria"}, - {"id": 17680, "synset": "wollemi_pine.n.01", "name": "Wollemi_pine"}, - {"id": 17681, "synset": "araucaria.n.01", "name": "araucaria"}, - {"id": 17682, "synset": "monkey_puzzle.n.01", "name": "monkey_puzzle"}, - {"id": 17683, "synset": "norfolk_island_pine.n.01", "name": "norfolk_island_pine"}, - {"id": 17684, "synset": "new_caledonian_pine.n.01", "name": "new_caledonian_pine"}, - {"id": 17685, "synset": "bunya_bunya.n.01", "name": "bunya_bunya"}, - {"id": 17686, "synset": "hoop_pine.n.01", "name": "hoop_pine"}, - {"id": 17687, "synset": "kauri_pine.n.01", "name": "kauri_pine"}, - {"id": 17688, "synset": "kauri.n.02", "name": "kauri"}, - {"id": 17689, "synset": "amboina_pine.n.01", "name": "amboina_pine"}, - {"id": 17690, "synset": "dundathu_pine.n.01", "name": "dundathu_pine"}, - {"id": 17691, "synset": "red_kauri.n.01", "name": "red_kauri"}, - {"id": 17692, "synset": "plum-yew.n.01", "name": "plum-yew"}, - {"id": 17693, "synset": "california_nutmeg.n.01", "name": "California_nutmeg"}, - {"id": 17694, "synset": "stinking_cedar.n.01", "name": "stinking_cedar"}, - {"id": 17695, "synset": "celery_pine.n.01", "name": "celery_pine"}, - {"id": 17696, "synset": "celery_top_pine.n.01", "name": "celery_top_pine"}, - {"id": 17697, "synset": "tanekaha.n.01", "name": "tanekaha"}, - {"id": 17698, "synset": "alpine_celery_pine.n.01", "name": "Alpine_celery_pine"}, - {"id": 17699, "synset": "yellowwood.n.02", "name": "yellowwood"}, - {"id": 17700, "synset": "gymnospermous_yellowwood.n.01", "name": "gymnospermous_yellowwood"}, - {"id": 17701, "synset": "podocarp.n.01", "name": "podocarp"}, - {"id": 17702, "synset": "yacca.n.01", "name": "yacca"}, - {"id": 17703, "synset": "brown_pine.n.01", "name": "brown_pine"}, - {"id": 17704, "synset": "cape_yellowwood.n.01", "name": "cape_yellowwood"}, - {"id": 17705, "synset": "south-african_yellowwood.n.01", "name": "South-African_yellowwood"}, - {"id": 17706, "synset": "alpine_totara.n.01", "name": "alpine_totara"}, - {"id": 17707, "synset": "totara.n.01", "name": "totara"}, - {"id": 17708, "synset": "common_yellowwood.n.01", "name": "common_yellowwood"}, - {"id": 17709, "synset": "kahikatea.n.01", "name": "kahikatea"}, - {"id": 17710, "synset": "rimu.n.01", "name": "rimu"}, - {"id": 17711, "synset": "tarwood.n.02", "name": "tarwood"}, - {"id": 17712, "synset": "common_sickle_pine.n.01", "name": "common_sickle_pine"}, - {"id": 17713, "synset": "yellow-leaf_sickle_pine.n.01", "name": "yellow-leaf_sickle_pine"}, - {"id": 17714, "synset": "tarwood.n.01", "name": "tarwood"}, - {"id": 17715, "synset": "westland_pine.n.01", "name": "westland_pine"}, - {"id": 17716, "synset": "huon_pine.n.01", "name": "huon_pine"}, - {"id": 17717, "synset": "chilean_rimu.n.01", "name": "Chilean_rimu"}, - {"id": 17718, "synset": "mountain_rimu.n.01", "name": "mountain_rimu"}, - {"id": 17719, "synset": "nagi.n.01", "name": "nagi"}, - {"id": 17720, "synset": "miro.n.01", "name": "miro"}, - {"id": 17721, "synset": "matai.n.01", "name": "matai"}, - {"id": 17722, "synset": "plum-fruited_yew.n.01", "name": "plum-fruited_yew"}, - {"id": 17723, "synset": "prince_albert_yew.n.01", "name": "Prince_Albert_yew"}, - {"id": 17724, "synset": "sundacarpus_amara.n.01", "name": "Sundacarpus_amara"}, - {"id": 17725, "synset": "japanese_umbrella_pine.n.01", "name": "Japanese_umbrella_pine"}, - {"id": 17726, "synset": "yew.n.02", "name": "yew"}, - {"id": 17727, "synset": "old_world_yew.n.01", "name": "Old_World_yew"}, - {"id": 17728, "synset": "pacific_yew.n.01", "name": "Pacific_yew"}, - {"id": 17729, "synset": "japanese_yew.n.01", "name": "Japanese_yew"}, - {"id": 17730, "synset": "florida_yew.n.01", "name": "Florida_yew"}, - {"id": 17731, "synset": "new_caledonian_yew.n.01", "name": "New_Caledonian_yew"}, - {"id": 17732, "synset": "white-berry_yew.n.01", "name": "white-berry_yew"}, - {"id": 17733, "synset": "ginkgo.n.01", "name": "ginkgo"}, - {"id": 17734, "synset": "angiosperm.n.01", "name": "angiosperm"}, - {"id": 17735, "synset": "dicot.n.01", "name": "dicot"}, - {"id": 17736, "synset": "monocot.n.01", "name": "monocot"}, - {"id": 17737, "synset": "floret.n.01", "name": "floret"}, - {"id": 17738, "synset": "flower.n.01", "name": "flower"}, - {"id": 17739, "synset": "bloomer.n.01", "name": "bloomer"}, - {"id": 17740, "synset": "wildflower.n.01", "name": "wildflower"}, - {"id": 17741, "synset": "apetalous_flower.n.01", "name": "apetalous_flower"}, - {"id": 17742, "synset": "inflorescence.n.02", "name": "inflorescence"}, - {"id": 17743, "synset": "rosebud.n.01", "name": "rosebud"}, - {"id": 17744, "synset": "gynostegium.n.01", "name": "gynostegium"}, - {"id": 17745, "synset": "pollinium.n.01", "name": "pollinium"}, - {"id": 17746, "synset": "pistil.n.01", "name": "pistil"}, - {"id": 17747, "synset": "gynobase.n.01", "name": "gynobase"}, - {"id": 17748, "synset": "gynophore.n.01", "name": "gynophore"}, - {"id": 17749, "synset": "stylopodium.n.01", "name": "stylopodium"}, - {"id": 17750, "synset": "carpophore.n.01", "name": "carpophore"}, - {"id": 17751, "synset": "cornstalk.n.01", "name": "cornstalk"}, - {"id": 17752, "synset": "petiolule.n.01", "name": "petiolule"}, - {"id": 17753, "synset": "mericarp.n.01", "name": "mericarp"}, - {"id": 17754, "synset": "micropyle.n.01", "name": "micropyle"}, - {"id": 17755, "synset": "germ_tube.n.01", "name": "germ_tube"}, - {"id": 17756, "synset": "pollen_tube.n.01", "name": "pollen_tube"}, - {"id": 17757, "synset": "gemma.n.01", "name": "gemma"}, - {"id": 17758, "synset": "galbulus.n.01", "name": "galbulus"}, - {"id": 17759, "synset": "nectary.n.01", "name": "nectary"}, - {"id": 17760, "synset": "pericarp.n.01", "name": "pericarp"}, - {"id": 17761, "synset": "epicarp.n.01", "name": "epicarp"}, - {"id": 17762, "synset": "mesocarp.n.01", "name": "mesocarp"}, - {"id": 17763, "synset": "pip.n.03", "name": "pip"}, - {"id": 17764, "synset": "silique.n.01", "name": "silique"}, - {"id": 17765, "synset": "cataphyll.n.01", "name": "cataphyll"}, - {"id": 17766, "synset": "perisperm.n.01", "name": "perisperm"}, - {"id": 17767, "synset": "monocarp.n.01", "name": "monocarp"}, - {"id": 17768, "synset": "sporophyte.n.01", "name": "sporophyte"}, - {"id": 17769, "synset": "gametophyte.n.01", "name": "gametophyte"}, - {"id": 17770, "synset": "megasporangium.n.01", "name": "megasporangium"}, - {"id": 17771, "synset": "microspore.n.01", "name": "microspore"}, - {"id": 17772, "synset": "microsporangium.n.01", "name": "microsporangium"}, - {"id": 17773, "synset": "microsporophyll.n.01", "name": "microsporophyll"}, - {"id": 17774, "synset": "archespore.n.01", "name": "archespore"}, - {"id": 17775, "synset": "bonduc_nut.n.01", "name": "bonduc_nut"}, - {"id": 17776, "synset": "job's_tears.n.01", "name": "Job's_tears"}, - {"id": 17777, "synset": "oilseed.n.01", "name": "oilseed"}, - {"id": 17778, "synset": "castor_bean.n.01", "name": "castor_bean"}, - {"id": 17779, "synset": "cottonseed.n.01", "name": "cottonseed"}, - {"id": 17780, "synset": "candlenut.n.02", "name": "candlenut"}, - {"id": 17781, "synset": "peach_pit.n.01", "name": "peach_pit"}, - {"id": 17782, "synset": "hypanthium.n.01", "name": "hypanthium"}, - {"id": 17783, "synset": "petal.n.01", "name": "petal"}, - {"id": 17784, "synset": "corolla.n.01", "name": "corolla"}, - {"id": 17785, "synset": "lip.n.02", "name": "lip"}, - {"id": 17786, "synset": "perianth.n.01", "name": "perianth"}, - {"id": 17787, "synset": "thistledown.n.01", "name": "thistledown"}, - {"id": 17788, "synset": "custard_apple.n.01", "name": "custard_apple"}, - {"id": 17789, "synset": "cherimoya.n.01", "name": "cherimoya"}, - {"id": 17790, "synset": "ilama.n.01", "name": "ilama"}, - {"id": 17791, "synset": "soursop.n.01", "name": "soursop"}, - {"id": 17792, "synset": "bullock's_heart.n.01", "name": "bullock's_heart"}, - {"id": 17793, "synset": "sweetsop.n.01", "name": "sweetsop"}, - {"id": 17794, "synset": "pond_apple.n.01", "name": "pond_apple"}, - {"id": 17795, "synset": "pawpaw.n.02", "name": "pawpaw"}, - {"id": 17796, "synset": "ilang-ilang.n.02", "name": "ilang-ilang"}, - {"id": 17797, "synset": "lancewood.n.02", "name": "lancewood"}, - {"id": 17798, "synset": "guinea_pepper.n.02", "name": "Guinea_pepper"}, - {"id": 17799, "synset": "barberry.n.01", "name": "barberry"}, - {"id": 17800, "synset": "american_barberry.n.01", "name": "American_barberry"}, - {"id": 17801, "synset": "common_barberry.n.01", "name": "common_barberry"}, - {"id": 17802, "synset": "japanese_barberry.n.01", "name": "Japanese_barberry"}, - {"id": 17803, "synset": "oregon_grape.n.02", "name": "Oregon_grape"}, - {"id": 17804, "synset": "oregon_grape.n.01", "name": "Oregon_grape"}, - {"id": 17805, "synset": "mayapple.n.01", "name": "mayapple"}, - {"id": 17806, "synset": "may_apple.n.01", "name": "May_apple"}, - {"id": 17807, "synset": "allspice.n.02", "name": "allspice"}, - {"id": 17808, "synset": "carolina_allspice.n.01", "name": "Carolina_allspice"}, - {"id": 17809, "synset": "spicebush.n.02", "name": "spicebush"}, - {"id": 17810, "synset": "katsura_tree.n.01", "name": "katsura_tree"}, - {"id": 17811, "synset": "laurel.n.01", "name": "laurel"}, - {"id": 17812, "synset": "true_laurel.n.01", "name": "true_laurel"}, - {"id": 17813, "synset": "camphor_tree.n.01", "name": "camphor_tree"}, - {"id": 17814, "synset": "cinnamon.n.02", "name": "cinnamon"}, - {"id": 17815, "synset": "cassia.n.03", "name": "cassia"}, - {"id": 17816, "synset": "cassia_bark.n.01", "name": "cassia_bark"}, - {"id": 17817, "synset": "saigon_cinnamon.n.01", "name": "Saigon_cinnamon"}, - {"id": 17818, "synset": "cinnamon_bark.n.01", "name": "cinnamon_bark"}, - {"id": 17819, "synset": "spicebush.n.01", "name": "spicebush"}, - {"id": 17820, "synset": "avocado.n.02", "name": "avocado"}, - {"id": 17821, "synset": "laurel-tree.n.01", "name": "laurel-tree"}, - {"id": 17822, "synset": "sassafras.n.01", "name": "sassafras"}, - {"id": 17823, "synset": "california_laurel.n.01", "name": "California_laurel"}, - {"id": 17824, "synset": "anise_tree.n.01", "name": "anise_tree"}, - {"id": 17825, "synset": "purple_anise.n.01", "name": "purple_anise"}, - {"id": 17826, "synset": "star_anise.n.02", "name": "star_anise"}, - {"id": 17827, "synset": "star_anise.n.01", "name": "star_anise"}, - {"id": 17828, "synset": "magnolia.n.02", "name": "magnolia"}, - {"id": 17829, "synset": "southern_magnolia.n.01", "name": "southern_magnolia"}, - {"id": 17830, "synset": "umbrella_tree.n.02", "name": "umbrella_tree"}, - {"id": 17831, "synset": "earleaved_umbrella_tree.n.01", "name": "earleaved_umbrella_tree"}, - {"id": 17832, "synset": "cucumber_tree.n.01", "name": "cucumber_tree"}, - {"id": 17833, "synset": "large-leaved_magnolia.n.01", "name": "large-leaved_magnolia"}, - {"id": 17834, "synset": "saucer_magnolia.n.01", "name": "saucer_magnolia"}, - {"id": 17835, "synset": "star_magnolia.n.01", "name": "star_magnolia"}, - {"id": 17836, "synset": "sweet_bay.n.01", "name": "sweet_bay"}, - {"id": 17837, "synset": "manglietia.n.01", "name": "manglietia"}, - {"id": 17838, "synset": "tulip_tree.n.01", "name": "tulip_tree"}, - {"id": 17839, "synset": "moonseed.n.01", "name": "moonseed"}, - {"id": 17840, "synset": "common_moonseed.n.01", "name": "common_moonseed"}, - {"id": 17841, "synset": "carolina_moonseed.n.01", "name": "Carolina_moonseed"}, - {"id": 17842, "synset": "nutmeg.n.01", "name": "nutmeg"}, - {"id": 17843, "synset": "water_nymph.n.02", "name": "water_nymph"}, - {"id": 17844, "synset": "european_white_lily.n.01", "name": "European_white_lily"}, - {"id": 17845, "synset": "southern_spatterdock.n.01", "name": "southern_spatterdock"}, - {"id": 17846, "synset": "lotus.n.01", "name": "lotus"}, - {"id": 17847, "synset": "water_chinquapin.n.01", "name": "water_chinquapin"}, - {"id": 17848, "synset": "water-shield.n.02", "name": "water-shield"}, - {"id": 17849, "synset": "water-shield.n.01", "name": "water-shield"}, - {"id": 17850, "synset": "peony.n.01", "name": "peony"}, - {"id": 17851, "synset": "buttercup.n.01", "name": "buttercup"}, - {"id": 17852, "synset": "meadow_buttercup.n.01", "name": "meadow_buttercup"}, - {"id": 17853, "synset": "water_crowfoot.n.01", "name": "water_crowfoot"}, - {"id": 17854, "synset": "lesser_celandine.n.01", "name": "lesser_celandine"}, - {"id": 17855, "synset": "lesser_spearwort.n.01", "name": "lesser_spearwort"}, - {"id": 17856, "synset": "greater_spearwort.n.01", "name": "greater_spearwort"}, - {"id": 17857, "synset": "western_buttercup.n.01", "name": "western_buttercup"}, - {"id": 17858, "synset": "creeping_buttercup.n.01", "name": "creeping_buttercup"}, - {"id": 17859, "synset": "cursed_crowfoot.n.01", "name": "cursed_crowfoot"}, - {"id": 17860, "synset": "aconite.n.01", "name": "aconite"}, - {"id": 17861, "synset": "monkshood.n.01", "name": "monkshood"}, - {"id": 17862, "synset": "wolfsbane.n.01", "name": "wolfsbane"}, - {"id": 17863, "synset": "baneberry.n.02", "name": "baneberry"}, - {"id": 17864, "synset": "baneberry.n.01", "name": "baneberry"}, - {"id": 17865, "synset": "red_baneberry.n.01", "name": "red_baneberry"}, - {"id": 17866, "synset": "pheasant's-eye.n.01", "name": "pheasant's-eye"}, - {"id": 17867, "synset": "anemone.n.01", "name": "anemone"}, - {"id": 17868, "synset": "alpine_anemone.n.01", "name": "Alpine_anemone"}, - {"id": 17869, "synset": "canada_anemone.n.01", "name": "Canada_anemone"}, - {"id": 17870, "synset": "thimbleweed.n.01", "name": "thimbleweed"}, - {"id": 17871, "synset": "wood_anemone.n.02", "name": "wood_anemone"}, - {"id": 17872, "synset": "wood_anemone.n.01", "name": "wood_anemone"}, - {"id": 17873, "synset": "longheaded_thimbleweed.n.01", "name": "longheaded_thimbleweed"}, - {"id": 17874, "synset": "snowdrop_anemone.n.01", "name": "snowdrop_anemone"}, - {"id": 17875, "synset": "virginia_thimbleweed.n.01", "name": "Virginia_thimbleweed"}, - {"id": 17876, "synset": "rue_anemone.n.01", "name": "rue_anemone"}, - {"id": 17877, "synset": "columbine.n.01", "name": "columbine"}, - {"id": 17878, "synset": "meeting_house.n.01", "name": "meeting_house"}, - {"id": 17879, "synset": "blue_columbine.n.01", "name": "blue_columbine"}, - {"id": 17880, "synset": "granny's_bonnets.n.01", "name": "granny's_bonnets"}, - {"id": 17881, "synset": "marsh_marigold.n.01", "name": "marsh_marigold"}, - {"id": 17882, "synset": "american_bugbane.n.01", "name": "American_bugbane"}, - {"id": 17883, "synset": "black_cohosh.n.01", "name": "black_cohosh"}, - {"id": 17884, "synset": "fetid_bugbane.n.01", "name": "fetid_bugbane"}, - {"id": 17885, "synset": "clematis.n.01", "name": "clematis"}, - {"id": 17886, "synset": "pine_hyacinth.n.01", "name": "pine_hyacinth"}, - {"id": 17887, "synset": "blue_jasmine.n.01", "name": "blue_jasmine"}, - {"id": 17888, "synset": "golden_clematis.n.01", "name": "golden_clematis"}, - {"id": 17889, "synset": "scarlet_clematis.n.01", "name": "scarlet_clematis"}, - {"id": 17890, "synset": "leather_flower.n.02", "name": "leather_flower"}, - {"id": 17891, "synset": "leather_flower.n.01", "name": "leather_flower"}, - {"id": 17892, "synset": "virgin's_bower.n.01", "name": "virgin's_bower"}, - {"id": 17893, "synset": "purple_clematis.n.01", "name": "purple_clematis"}, - {"id": 17894, "synset": "goldthread.n.01", "name": "goldthread"}, - {"id": 17895, "synset": "rocket_larkspur.n.01", "name": "rocket_larkspur"}, - {"id": 17896, "synset": "delphinium.n.01", "name": "delphinium"}, - {"id": 17897, "synset": "larkspur.n.01", "name": "larkspur"}, - {"id": 17898, "synset": "winter_aconite.n.01", "name": "winter_aconite"}, - {"id": 17899, "synset": "lenten_rose.n.01", "name": "lenten_rose"}, - {"id": 17900, "synset": "green_hellebore.n.01", "name": "green_hellebore"}, - {"id": 17901, "synset": "hepatica.n.01", "name": "hepatica"}, - {"id": 17902, "synset": "goldenseal.n.01", "name": "goldenseal"}, - {"id": 17903, "synset": "false_rue_anemone.n.01", "name": "false_rue_anemone"}, - {"id": 17904, "synset": "giant_buttercup.n.01", "name": "giant_buttercup"}, - {"id": 17905, "synset": "nigella.n.01", "name": "nigella"}, - {"id": 17906, "synset": "love-in-a-mist.n.03", "name": "love-in-a-mist"}, - {"id": 17907, "synset": "fennel_flower.n.01", "name": "fennel_flower"}, - {"id": 17908, "synset": "black_caraway.n.01", "name": "black_caraway"}, - {"id": 17909, "synset": "pasqueflower.n.01", "name": "pasqueflower"}, - {"id": 17910, "synset": "meadow_rue.n.01", "name": "meadow_rue"}, - {"id": 17911, "synset": "false_bugbane.n.01", "name": "false_bugbane"}, - {"id": 17912, "synset": "globeflower.n.01", "name": "globeflower"}, - {"id": 17913, "synset": "winter's_bark.n.02", "name": "winter's_bark"}, - {"id": 17914, "synset": "pepper_shrub.n.01", "name": "pepper_shrub"}, - {"id": 17915, "synset": "sweet_gale.n.01", "name": "sweet_gale"}, - {"id": 17916, "synset": "wax_myrtle.n.01", "name": "wax_myrtle"}, - {"id": 17917, "synset": "bay_myrtle.n.01", "name": "bay_myrtle"}, - {"id": 17918, "synset": "bayberry.n.02", "name": "bayberry"}, - {"id": 17919, "synset": "sweet_fern.n.02", "name": "sweet_fern"}, - {"id": 17920, "synset": "corkwood.n.01", "name": "corkwood"}, - {"id": 17921, "synset": "jointed_rush.n.01", "name": "jointed_rush"}, - {"id": 17922, "synset": "toad_rush.n.01", "name": "toad_rush"}, - {"id": 17923, "synset": "slender_rush.n.01", "name": "slender_rush"}, - {"id": 17924, "synset": "zebrawood.n.02", "name": "zebrawood"}, - {"id": 17925, "synset": "connarus_guianensis.n.01", "name": "Connarus_guianensis"}, - {"id": 17926, "synset": "legume.n.01", "name": "legume"}, - {"id": 17927, "synset": "peanut.n.01", "name": "peanut"}, - {"id": 17928, "synset": "granadilla_tree.n.01", "name": "granadilla_tree"}, - {"id": 17929, "synset": "arariba.n.01", "name": "arariba"}, - {"id": 17930, "synset": "tonka_bean.n.01", "name": "tonka_bean"}, - {"id": 17931, "synset": "courbaril.n.01", "name": "courbaril"}, - {"id": 17932, "synset": "melilotus.n.01", "name": "melilotus"}, - {"id": 17933, "synset": "darling_pea.n.01", "name": "darling_pea"}, - {"id": 17934, "synset": "smooth_darling_pea.n.01", "name": "smooth_darling_pea"}, - {"id": 17935, "synset": "clover.n.01", "name": "clover"}, - {"id": 17936, "synset": "alpine_clover.n.01", "name": "alpine_clover"}, - {"id": 17937, "synset": "hop_clover.n.02", "name": "hop_clover"}, - {"id": 17938, "synset": "crimson_clover.n.01", "name": "crimson_clover"}, - {"id": 17939, "synset": "red_clover.n.01", "name": "red_clover"}, - {"id": 17940, "synset": "buffalo_clover.n.02", "name": "buffalo_clover"}, - {"id": 17941, "synset": "white_clover.n.01", "name": "white_clover"}, - {"id": 17942, "synset": "mimosa.n.02", "name": "mimosa"}, - {"id": 17943, "synset": "acacia.n.01", "name": "acacia"}, - {"id": 17944, "synset": "shittah.n.01", "name": "shittah"}, - {"id": 17945, "synset": "wattle.n.03", "name": "wattle"}, - {"id": 17946, "synset": "black_wattle.n.01", "name": "black_wattle"}, - {"id": 17947, "synset": "gidgee.n.01", "name": "gidgee"}, - {"id": 17948, "synset": "catechu.n.02", "name": "catechu"}, - {"id": 17949, "synset": "silver_wattle.n.01", "name": "silver_wattle"}, - {"id": 17950, "synset": "huisache.n.01", "name": "huisache"}, - {"id": 17951, "synset": "lightwood.n.01", "name": "lightwood"}, - {"id": 17952, "synset": "golden_wattle.n.01", "name": "golden_wattle"}, - {"id": 17953, "synset": "fever_tree.n.04", "name": "fever_tree"}, - {"id": 17954, "synset": "coralwood.n.01", "name": "coralwood"}, - {"id": 17955, "synset": "albizzia.n.01", "name": "albizzia"}, - {"id": 17956, "synset": "silk_tree.n.01", "name": "silk_tree"}, - {"id": 17957, "synset": "siris.n.01", "name": "siris"}, - {"id": 17958, "synset": "rain_tree.n.01", "name": "rain_tree"}, - {"id": 17959, "synset": "calliandra.n.01", "name": "calliandra"}, - {"id": 17960, "synset": "conacaste.n.01", "name": "conacaste"}, - {"id": 17961, "synset": "inga.n.01", "name": "inga"}, - {"id": 17962, "synset": "ice-cream_bean.n.01", "name": "ice-cream_bean"}, - {"id": 17963, "synset": "guama.n.01", "name": "guama"}, - {"id": 17964, "synset": "lead_tree.n.01", "name": "lead_tree"}, - {"id": 17965, "synset": "wild_tamarind.n.02", "name": "wild_tamarind"}, - {"id": 17966, "synset": "sabicu.n.02", "name": "sabicu"}, - {"id": 17967, "synset": "nitta_tree.n.01", "name": "nitta_tree"}, - {"id": 17968, "synset": "parkia_javanica.n.01", "name": "Parkia_javanica"}, - {"id": 17969, "synset": "manila_tamarind.n.01", "name": "manila_tamarind"}, - {"id": 17970, "synset": "cat's-claw.n.01", "name": "cat's-claw"}, - {"id": 17971, "synset": "honey_mesquite.n.01", "name": "honey_mesquite"}, - {"id": 17972, "synset": "algarroba.n.03", "name": "algarroba"}, - {"id": 17973, "synset": "screw_bean.n.02", "name": "screw_bean"}, - {"id": 17974, "synset": "screw_bean.n.01", "name": "screw_bean"}, - {"id": 17975, "synset": "dogbane.n.01", "name": "dogbane"}, - {"id": 17976, "synset": "indian_hemp.n.03", "name": "Indian_hemp"}, - {"id": 17977, "synset": "bushman's_poison.n.01", "name": "bushman's_poison"}, - {"id": 17978, "synset": "impala_lily.n.01", "name": "impala_lily"}, - {"id": 17979, "synset": "allamanda.n.01", "name": "allamanda"}, - {"id": 17980, "synset": "common_allamanda.n.01", "name": "common_allamanda"}, - {"id": 17981, "synset": "dita.n.01", "name": "dita"}, - {"id": 17982, "synset": "nepal_trumpet_flower.n.01", "name": "Nepal_trumpet_flower"}, - {"id": 17983, "synset": "carissa.n.01", "name": "carissa"}, - {"id": 17984, "synset": "hedge_thorn.n.01", "name": "hedge_thorn"}, - {"id": 17985, "synset": "natal_plum.n.01", "name": "natal_plum"}, - {"id": 17986, "synset": "periwinkle.n.02", "name": "periwinkle"}, - {"id": 17987, "synset": "ivory_tree.n.01", "name": "ivory_tree"}, - {"id": 17988, "synset": "white_dipladenia.n.01", "name": "white_dipladenia"}, - {"id": 17989, "synset": "chilean_jasmine.n.01", "name": "Chilean_jasmine"}, - {"id": 17990, "synset": "oleander.n.01", "name": "oleander"}, - {"id": 17991, "synset": "frangipani.n.01", "name": "frangipani"}, - {"id": 17992, "synset": "west_indian_jasmine.n.01", "name": "West_Indian_jasmine"}, - {"id": 17993, "synset": "rauwolfia.n.02", "name": "rauwolfia"}, - {"id": 17994, "synset": "snakewood.n.01", "name": "snakewood"}, - {"id": 17995, "synset": "strophanthus_kombe.n.01", "name": "Strophanthus_kombe"}, - {"id": 17996, "synset": "yellow_oleander.n.01", "name": "yellow_oleander"}, - {"id": 17997, "synset": "myrtle.n.01", "name": "myrtle"}, - {"id": 17998, "synset": "large_periwinkle.n.01", "name": "large_periwinkle"}, - {"id": 17999, "synset": "arum.n.02", "name": "arum"}, - {"id": 18000, "synset": "cuckoopint.n.01", "name": "cuckoopint"}, - {"id": 18001, "synset": "black_calla.n.01", "name": "black_calla"}, - {"id": 18002, "synset": "calamus.n.02", "name": "calamus"}, - {"id": 18003, "synset": "alocasia.n.01", "name": "alocasia"}, - {"id": 18004, "synset": "giant_taro.n.01", "name": "giant_taro"}, - {"id": 18005, "synset": "amorphophallus.n.01", "name": "amorphophallus"}, - {"id": 18006, "synset": "pungapung.n.01", "name": "pungapung"}, - {"id": 18007, "synset": "devil's_tongue.n.01", "name": "devil's_tongue"}, - {"id": 18008, "synset": "anthurium.n.01", "name": "anthurium"}, - {"id": 18009, "synset": "flamingo_flower.n.01", "name": "flamingo_flower"}, - {"id": 18010, "synset": "jack-in-the-pulpit.n.01", "name": "jack-in-the-pulpit"}, - {"id": 18011, "synset": "friar's-cowl.n.01", "name": "friar's-cowl"}, - {"id": 18012, "synset": "caladium.n.01", "name": "caladium"}, - {"id": 18013, "synset": "caladium_bicolor.n.01", "name": "Caladium_bicolor"}, - {"id": 18014, "synset": "wild_calla.n.01", "name": "wild_calla"}, - {"id": 18015, "synset": "taro.n.02", "name": "taro"}, - {"id": 18016, "synset": "taro.n.01", "name": "taro"}, - {"id": 18017, "synset": "cryptocoryne.n.01", "name": "cryptocoryne"}, - {"id": 18018, "synset": "dracontium.n.01", "name": "dracontium"}, - {"id": 18019, "synset": "golden_pothos.n.01", "name": "golden_pothos"}, - {"id": 18020, "synset": "skunk_cabbage.n.02", "name": "skunk_cabbage"}, - {"id": 18021, "synset": "monstera.n.01", "name": "monstera"}, - {"id": 18022, "synset": "ceriman.n.01", "name": "ceriman"}, - {"id": 18023, "synset": "nephthytis.n.01", "name": "nephthytis"}, - {"id": 18024, "synset": "nephthytis_afzelii.n.01", "name": "Nephthytis_afzelii"}, - {"id": 18025, "synset": "arrow_arum.n.01", "name": "arrow_arum"}, - {"id": 18026, "synset": "green_arrow_arum.n.01", "name": "green_arrow_arum"}, - {"id": 18027, "synset": "philodendron.n.01", "name": "philodendron"}, - {"id": 18028, "synset": "pistia.n.01", "name": "pistia"}, - {"id": 18029, "synset": "pothos.n.01", "name": "pothos"}, - {"id": 18030, "synset": "spathiphyllum.n.01", "name": "spathiphyllum"}, - {"id": 18031, "synset": "skunk_cabbage.n.01", "name": "skunk_cabbage"}, - {"id": 18032, "synset": "yautia.n.01", "name": "yautia"}, - {"id": 18033, "synset": "calla_lily.n.01", "name": "calla_lily"}, - {"id": 18034, "synset": "pink_calla.n.01", "name": "pink_calla"}, - {"id": 18035, "synset": "golden_calla.n.01", "name": "golden_calla"}, - {"id": 18036, "synset": "duckweed.n.01", "name": "duckweed"}, - {"id": 18037, "synset": "common_duckweed.n.01", "name": "common_duckweed"}, - {"id": 18038, "synset": "star-duckweed.n.01", "name": "star-duckweed"}, - {"id": 18039, "synset": "great_duckweed.n.01", "name": "great_duckweed"}, - {"id": 18040, "synset": "watermeal.n.01", "name": "watermeal"}, - {"id": 18041, "synset": "common_wolffia.n.01", "name": "common_wolffia"}, - {"id": 18042, "synset": "aralia.n.01", "name": "aralia"}, - {"id": 18043, "synset": "american_angelica_tree.n.01", "name": "American_angelica_tree"}, - {"id": 18044, "synset": "american_spikenard.n.01", "name": "American_spikenard"}, - {"id": 18045, "synset": "bristly_sarsaparilla.n.01", "name": "bristly_sarsaparilla"}, - {"id": 18046, "synset": "japanese_angelica_tree.n.01", "name": "Japanese_angelica_tree"}, - {"id": 18047, "synset": "chinese_angelica.n.01", "name": "Chinese_angelica"}, - {"id": 18048, "synset": "ivy.n.01", "name": "ivy"}, - {"id": 18049, "synset": "puka.n.02", "name": "puka"}, - {"id": 18050, "synset": "ginseng.n.02", "name": "ginseng"}, - {"id": 18051, "synset": "ginseng.n.01", "name": "ginseng"}, - {"id": 18052, "synset": "umbrella_tree.n.01", "name": "umbrella_tree"}, - {"id": 18053, "synset": "birthwort.n.01", "name": "birthwort"}, - {"id": 18054, "synset": "dutchman's-pipe.n.01", "name": "Dutchman's-pipe"}, - {"id": 18055, "synset": "virginia_snakeroot.n.01", "name": "Virginia_snakeroot"}, - {"id": 18056, "synset": "canada_ginger.n.01", "name": "Canada_ginger"}, - {"id": 18057, "synset": "heartleaf.n.02", "name": "heartleaf"}, - {"id": 18058, "synset": "heartleaf.n.01", "name": "heartleaf"}, - {"id": 18059, "synset": "asarabacca.n.01", "name": "asarabacca"}, - {"id": 18060, "synset": "caryophyllaceous_plant.n.01", "name": "caryophyllaceous_plant"}, - {"id": 18061, "synset": "corn_cockle.n.01", "name": "corn_cockle"}, - {"id": 18062, "synset": "sandwort.n.03", "name": "sandwort"}, - {"id": 18063, "synset": "mountain_sandwort.n.01", "name": "mountain_sandwort"}, - {"id": 18064, "synset": "pine-barren_sandwort.n.01", "name": "pine-barren_sandwort"}, - {"id": 18065, "synset": "seabeach_sandwort.n.01", "name": "seabeach_sandwort"}, - {"id": 18066, "synset": "rock_sandwort.n.01", "name": "rock_sandwort"}, - {"id": 18067, "synset": "thyme-leaved_sandwort.n.01", "name": "thyme-leaved_sandwort"}, - {"id": 18068, "synset": "mouse-ear_chickweed.n.01", "name": "mouse-ear_chickweed"}, - {"id": 18069, "synset": "snow-in-summer.n.02", "name": "snow-in-summer"}, - {"id": 18070, "synset": "alpine_mouse-ear.n.01", "name": "Alpine_mouse-ear"}, - {"id": 18071, "synset": "pink.n.02", "name": "pink"}, - {"id": 18072, "synset": "sweet_william.n.01", "name": "sweet_William"}, - {"id": 18073, "synset": "china_pink.n.01", "name": "china_pink"}, - {"id": 18074, "synset": "japanese_pink.n.01", "name": "Japanese_pink"}, - {"id": 18075, "synset": "maiden_pink.n.01", "name": "maiden_pink"}, - {"id": 18076, "synset": "cheddar_pink.n.01", "name": "cheddar_pink"}, - {"id": 18077, "synset": "button_pink.n.01", "name": "button_pink"}, - {"id": 18078, "synset": "cottage_pink.n.01", "name": "cottage_pink"}, - {"id": 18079, "synset": "fringed_pink.n.02", "name": "fringed_pink"}, - {"id": 18080, "synset": "drypis.n.01", "name": "drypis"}, - {"id": 18081, "synset": "baby's_breath.n.01", "name": "baby's_breath"}, - {"id": 18082, "synset": "coral_necklace.n.01", "name": "coral_necklace"}, - {"id": 18083, "synset": "lychnis.n.01", "name": "lychnis"}, - {"id": 18084, "synset": "ragged_robin.n.01", "name": "ragged_robin"}, - {"id": 18085, "synset": "scarlet_lychnis.n.01", "name": "scarlet_lychnis"}, - {"id": 18086, "synset": "mullein_pink.n.01", "name": "mullein_pink"}, - {"id": 18087, "synset": "sandwort.n.02", "name": "sandwort"}, - {"id": 18088, "synset": "sandwort.n.01", "name": "sandwort"}, - {"id": 18089, "synset": "soapwort.n.01", "name": "soapwort"}, - {"id": 18090, "synset": "knawel.n.01", "name": "knawel"}, - {"id": 18091, "synset": "silene.n.01", "name": "silene"}, - {"id": 18092, "synset": "moss_campion.n.01", "name": "moss_campion"}, - {"id": 18093, "synset": "wild_pink.n.02", "name": "wild_pink"}, - {"id": 18094, "synset": "red_campion.n.01", "name": "red_campion"}, - {"id": 18095, "synset": "white_campion.n.01", "name": "white_campion"}, - {"id": 18096, "synset": "fire_pink.n.01", "name": "fire_pink"}, - {"id": 18097, "synset": "bladder_campion.n.01", "name": "bladder_campion"}, - {"id": 18098, "synset": "corn_spurry.n.01", "name": "corn_spurry"}, - {"id": 18099, "synset": "sand_spurry.n.01", "name": "sand_spurry"}, - {"id": 18100, "synset": "chickweed.n.01", "name": "chickweed"}, - {"id": 18101, "synset": "common_chickweed.n.01", "name": "common_chickweed"}, - {"id": 18102, "synset": "cowherb.n.01", "name": "cowherb"}, - {"id": 18103, "synset": "hottentot_fig.n.01", "name": "Hottentot_fig"}, - {"id": 18104, "synset": "livingstone_daisy.n.01", "name": "livingstone_daisy"}, - {"id": 18105, "synset": "fig_marigold.n.01", "name": "fig_marigold"}, - {"id": 18106, "synset": "ice_plant.n.01", "name": "ice_plant"}, - {"id": 18107, "synset": "new_zealand_spinach.n.01", "name": "New_Zealand_spinach"}, - {"id": 18108, "synset": "amaranth.n.02", "name": "amaranth"}, - {"id": 18109, "synset": "amaranth.n.01", "name": "amaranth"}, - {"id": 18110, "synset": "tumbleweed.n.04", "name": "tumbleweed"}, - {"id": 18111, "synset": "prince's-feather.n.02", "name": "prince's-feather"}, - {"id": 18112, "synset": "pigweed.n.02", "name": "pigweed"}, - {"id": 18113, "synset": "thorny_amaranth.n.01", "name": "thorny_amaranth"}, - {"id": 18114, "synset": "alligator_weed.n.01", "name": "alligator_weed"}, - {"id": 18115, "synset": "cockscomb.n.01", "name": "cockscomb"}, - {"id": 18116, "synset": "cottonweed.n.02", "name": "cottonweed"}, - {"id": 18117, "synset": "globe_amaranth.n.01", "name": "globe_amaranth"}, - {"id": 18118, "synset": "bloodleaf.n.01", "name": "bloodleaf"}, - {"id": 18119, "synset": "saltwort.n.02", "name": "saltwort"}, - {"id": 18120, "synset": "lamb's-quarters.n.01", "name": "lamb's-quarters"}, - {"id": 18121, "synset": "good-king-henry.n.01", "name": "good-king-henry"}, - {"id": 18122, "synset": "jerusalem_oak.n.01", "name": "Jerusalem_oak"}, - {"id": 18123, "synset": "oak-leaved_goosefoot.n.01", "name": "oak-leaved_goosefoot"}, - {"id": 18124, "synset": "sowbane.n.01", "name": "sowbane"}, - {"id": 18125, "synset": "nettle-leaved_goosefoot.n.01", "name": "nettle-leaved_goosefoot"}, - {"id": 18126, "synset": "red_goosefoot.n.01", "name": "red_goosefoot"}, - {"id": 18127, "synset": "stinking_goosefoot.n.01", "name": "stinking_goosefoot"}, - {"id": 18128, "synset": "orach.n.01", "name": "orach"}, - {"id": 18129, "synset": "saltbush.n.01", "name": "saltbush"}, - {"id": 18130, "synset": "garden_orache.n.01", "name": "garden_orache"}, - {"id": 18131, "synset": "desert_holly.n.01", "name": "desert_holly"}, - {"id": 18132, "synset": "quail_bush.n.01", "name": "quail_bush"}, - {"id": 18133, "synset": "beet.n.01", "name": "beet"}, - {"id": 18134, "synset": "beetroot.n.01", "name": "beetroot"}, - {"id": 18135, "synset": "chard.n.01", "name": "chard"}, - {"id": 18136, "synset": "mangel-wurzel.n.01", "name": "mangel-wurzel"}, - {"id": 18137, "synset": "winged_pigweed.n.01", "name": "winged_pigweed"}, - {"id": 18138, "synset": "halogeton.n.01", "name": "halogeton"}, - {"id": 18139, "synset": "glasswort.n.02", "name": "glasswort"}, - {"id": 18140, "synset": "saltwort.n.01", "name": "saltwort"}, - {"id": 18141, "synset": "russian_thistle.n.01", "name": "Russian_thistle"}, - {"id": 18142, "synset": "greasewood.n.01", "name": "greasewood"}, - {"id": 18143, "synset": "scarlet_musk_flower.n.01", "name": "scarlet_musk_flower"}, - {"id": 18144, "synset": "sand_verbena.n.01", "name": "sand_verbena"}, - {"id": 18145, "synset": "sweet_sand_verbena.n.01", "name": "sweet_sand_verbena"}, - {"id": 18146, "synset": "yellow_sand_verbena.n.01", "name": "yellow_sand_verbena"}, - {"id": 18147, "synset": "beach_pancake.n.01", "name": "beach_pancake"}, - {"id": 18148, "synset": "beach_sand_verbena.n.01", "name": "beach_sand_verbena"}, - {"id": 18149, "synset": "desert_sand_verbena.n.01", "name": "desert_sand_verbena"}, - {"id": 18150, "synset": "trailing_four_o'clock.n.01", "name": "trailing_four_o'clock"}, - {"id": 18151, "synset": "bougainvillea.n.01", "name": "bougainvillea"}, - {"id": 18152, "synset": "umbrellawort.n.01", "name": "umbrellawort"}, - {"id": 18153, "synset": "four_o'clock.n.01", "name": "four_o'clock"}, - {"id": 18154, "synset": "common_four-o'clock.n.01", "name": "common_four-o'clock"}, - {"id": 18155, "synset": "california_four_o'clock.n.01", "name": "California_four_o'clock"}, - {"id": 18156, "synset": "sweet_four_o'clock.n.01", "name": "sweet_four_o'clock"}, - {"id": 18157, "synset": "desert_four_o'clock.n.01", "name": "desert_four_o'clock"}, - {"id": 18158, "synset": "mountain_four_o'clock.n.01", "name": "mountain_four_o'clock"}, - {"id": 18159, "synset": "cockspur.n.02", "name": "cockspur"}, - {"id": 18160, "synset": "rattail_cactus.n.01", "name": "rattail_cactus"}, - {"id": 18161, "synset": "saguaro.n.01", "name": "saguaro"}, - {"id": 18162, "synset": "night-blooming_cereus.n.03", "name": "night-blooming_cereus"}, - {"id": 18163, "synset": "echinocactus.n.01", "name": "echinocactus"}, - {"id": 18164, "synset": "hedgehog_cactus.n.01", "name": "hedgehog_cactus"}, - {"id": 18165, "synset": "golden_barrel_cactus.n.01", "name": "golden_barrel_cactus"}, - {"id": 18166, "synset": "hedgehog_cereus.n.01", "name": "hedgehog_cereus"}, - {"id": 18167, "synset": "rainbow_cactus.n.01", "name": "rainbow_cactus"}, - {"id": 18168, "synset": "epiphyllum.n.01", "name": "epiphyllum"}, - {"id": 18169, "synset": "barrel_cactus.n.01", "name": "barrel_cactus"}, - {"id": 18170, "synset": "night-blooming_cereus.n.02", "name": "night-blooming_cereus"}, - {"id": 18171, "synset": "chichipe.n.01", "name": "chichipe"}, - {"id": 18172, "synset": "mescal.n.01", "name": "mescal"}, - {"id": 18173, "synset": "mescal_button.n.01", "name": "mescal_button"}, - {"id": 18174, "synset": "mammillaria.n.01", "name": "mammillaria"}, - {"id": 18175, "synset": "feather_ball.n.01", "name": "feather_ball"}, - {"id": 18176, "synset": "garambulla.n.01", "name": "garambulla"}, - {"id": 18177, "synset": "knowlton's_cactus.n.01", "name": "Knowlton's_cactus"}, - {"id": 18178, "synset": "nopal.n.02", "name": "nopal"}, - {"id": 18179, "synset": "prickly_pear.n.01", "name": "prickly_pear"}, - {"id": 18180, "synset": "cholla.n.01", "name": "cholla"}, - {"id": 18181, "synset": "nopal.n.01", "name": "nopal"}, - {"id": 18182, "synset": "tuna.n.01", "name": "tuna"}, - {"id": 18183, "synset": "barbados_gooseberry.n.01", "name": "Barbados_gooseberry"}, - {"id": 18184, "synset": "mistletoe_cactus.n.01", "name": "mistletoe_cactus"}, - {"id": 18185, "synset": "christmas_cactus.n.01", "name": "Christmas_cactus"}, - {"id": 18186, "synset": "night-blooming_cereus.n.01", "name": "night-blooming_cereus"}, - {"id": 18187, "synset": "crab_cactus.n.01", "name": "crab_cactus"}, - {"id": 18188, "synset": "pokeweed.n.01", "name": "pokeweed"}, - {"id": 18189, "synset": "indian_poke.n.02", "name": "Indian_poke"}, - {"id": 18190, "synset": "poke.n.01", "name": "poke"}, - {"id": 18191, "synset": "ombu.n.01", "name": "ombu"}, - {"id": 18192, "synset": "bloodberry.n.01", "name": "bloodberry"}, - {"id": 18193, "synset": "portulaca.n.01", "name": "portulaca"}, - {"id": 18194, "synset": "rose_moss.n.01", "name": "rose_moss"}, - {"id": 18195, "synset": "common_purslane.n.01", "name": "common_purslane"}, - {"id": 18196, "synset": "rock_purslane.n.01", "name": "rock_purslane"}, - {"id": 18197, "synset": "red_maids.n.01", "name": "red_maids"}, - {"id": 18198, "synset": "carolina_spring_beauty.n.01", "name": "Carolina_spring_beauty"}, - {"id": 18199, "synset": "spring_beauty.n.01", "name": "spring_beauty"}, - {"id": 18200, "synset": "virginia_spring_beauty.n.01", "name": "Virginia_spring_beauty"}, - {"id": 18201, "synset": "siskiyou_lewisia.n.01", "name": "siskiyou_lewisia"}, - {"id": 18202, "synset": "bitterroot.n.01", "name": "bitterroot"}, - {"id": 18203, "synset": "broad-leaved_montia.n.01", "name": "broad-leaved_montia"}, - {"id": 18204, "synset": "blinks.n.01", "name": "blinks"}, - {"id": 18205, "synset": "toad_lily.n.01", "name": "toad_lily"}, - {"id": 18206, "synset": "winter_purslane.n.01", "name": "winter_purslane"}, - {"id": 18207, "synset": "flame_flower.n.02", "name": "flame_flower"}, - {"id": 18208, "synset": "pigmy_talinum.n.01", "name": "pigmy_talinum"}, - {"id": 18209, "synset": "jewels-of-opar.n.01", "name": "jewels-of-opar"}, - {"id": 18210, "synset": "caper.n.01", "name": "caper"}, - {"id": 18211, "synset": "native_pomegranate.n.01", "name": "native_pomegranate"}, - {"id": 18212, "synset": "caper_tree.n.02", "name": "caper_tree"}, - {"id": 18213, "synset": "caper_tree.n.01", "name": "caper_tree"}, - {"id": 18214, "synset": "common_caper.n.01", "name": "common_caper"}, - {"id": 18215, "synset": "spiderflower.n.01", "name": "spiderflower"}, - {"id": 18216, "synset": "rocky_mountain_bee_plant.n.01", "name": "Rocky_Mountain_bee_plant"}, - {"id": 18217, "synset": "clammyweed.n.01", "name": "clammyweed"}, - {"id": 18218, "synset": "crucifer.n.01", "name": "crucifer"}, - {"id": 18219, "synset": "cress.n.01", "name": "cress"}, - {"id": 18220, "synset": "watercress.n.01", "name": "watercress"}, - {"id": 18221, "synset": "stonecress.n.01", "name": "stonecress"}, - {"id": 18222, "synset": "garlic_mustard.n.01", "name": "garlic_mustard"}, - {"id": 18223, "synset": "alyssum.n.01", "name": "alyssum"}, - {"id": 18224, "synset": "rose_of_jericho.n.02", "name": "rose_of_Jericho"}, - {"id": 18225, "synset": "arabidopsis_thaliana.n.01", "name": "Arabidopsis_thaliana"}, - {"id": 18226, "synset": "arabidopsis_lyrata.n.01", "name": "Arabidopsis_lyrata"}, - {"id": 18227, "synset": "rock_cress.n.01", "name": "rock_cress"}, - {"id": 18228, "synset": "sicklepod.n.02", "name": "sicklepod"}, - {"id": 18229, "synset": "tower_mustard.n.01", "name": "tower_mustard"}, - {"id": 18230, "synset": "horseradish.n.01", "name": "horseradish"}, - {"id": 18231, "synset": "winter_cress.n.01", "name": "winter_cress"}, - {"id": 18232, "synset": "yellow_rocket.n.01", "name": "yellow_rocket"}, - {"id": 18233, "synset": "hoary_alison.n.01", "name": "hoary_alison"}, - {"id": 18234, "synset": "buckler_mustard.n.01", "name": "buckler_mustard"}, - {"id": 18235, "synset": "wild_cabbage.n.01", "name": "wild_cabbage"}, - {"id": 18236, "synset": "cabbage.n.03", "name": "cabbage"}, - {"id": 18237, "synset": "head_cabbage.n.01", "name": "head_cabbage"}, - {"id": 18238, "synset": "savoy_cabbage.n.01", "name": "savoy_cabbage"}, - {"id": 18239, "synset": "brussels_sprout.n.01", "name": "brussels_sprout"}, - {"id": 18240, "synset": "cauliflower.n.01", "name": "cauliflower"}, - {"id": 18241, "synset": "collard.n.01", "name": "collard"}, - {"id": 18242, "synset": "kohlrabi.n.01", "name": "kohlrabi"}, - {"id": 18243, "synset": "turnip_plant.n.01", "name": "turnip_plant"}, - {"id": 18244, "synset": "rutabaga.n.02", "name": "rutabaga"}, - {"id": 18245, "synset": "broccoli_raab.n.01", "name": "broccoli_raab"}, - {"id": 18246, "synset": "mustard.n.01", "name": "mustard"}, - {"id": 18247, "synset": "chinese_mustard.n.01", "name": "chinese_mustard"}, - {"id": 18248, "synset": "bok_choy.n.01", "name": "bok_choy"}, - {"id": 18249, "synset": "rape.n.01", "name": "rape"}, - {"id": 18250, "synset": "rapeseed.n.01", "name": "rapeseed"}, - {"id": 18251, "synset": "shepherd's_purse.n.01", "name": "shepherd's_purse"}, - {"id": 18252, "synset": "lady's_smock.n.01", "name": "lady's_smock"}, - {"id": 18253, "synset": "coral-root_bittercress.n.01", "name": "coral-root_bittercress"}, - {"id": 18254, "synset": "crinkleroot.n.01", "name": "crinkleroot"}, - {"id": 18255, "synset": "american_watercress.n.01", "name": "American_watercress"}, - {"id": 18256, "synset": "spring_cress.n.01", "name": "spring_cress"}, - {"id": 18257, "synset": "purple_cress.n.01", "name": "purple_cress"}, - {"id": 18258, "synset": "wallflower.n.02", "name": "wallflower"}, - {"id": 18259, "synset": "prairie_rocket.n.02", "name": "prairie_rocket"}, - {"id": 18260, "synset": "scurvy_grass.n.01", "name": "scurvy_grass"}, - {"id": 18261, "synset": "sea_kale.n.01", "name": "sea_kale"}, - {"id": 18262, "synset": "tansy_mustard.n.01", "name": "tansy_mustard"}, - {"id": 18263, "synset": "draba.n.01", "name": "draba"}, - {"id": 18264, "synset": "wallflower.n.01", "name": "wallflower"}, - {"id": 18265, "synset": "prairie_rocket.n.01", "name": "prairie_rocket"}, - {"id": 18266, "synset": "siberian_wall_flower.n.01", "name": "Siberian_wall_flower"}, - {"id": 18267, "synset": "western_wall_flower.n.01", "name": "western_wall_flower"}, - {"id": 18268, "synset": "wormseed_mustard.n.01", "name": "wormseed_mustard"}, - {"id": 18269, "synset": "heliophila.n.01", "name": "heliophila"}, - {"id": 18270, "synset": "damask_violet.n.01", "name": "damask_violet"}, - {"id": 18271, "synset": "tansy-leaved_rocket.n.01", "name": "tansy-leaved_rocket"}, - {"id": 18272, "synset": "candytuft.n.01", "name": "candytuft"}, - {"id": 18273, "synset": "woad.n.02", "name": "woad"}, - {"id": 18274, "synset": "dyer's_woad.n.01", "name": "dyer's_woad"}, - {"id": 18275, "synset": "bladderpod.n.04", "name": "bladderpod"}, - {"id": 18276, "synset": "sweet_alyssum.n.01", "name": "sweet_alyssum"}, - {"id": 18277, "synset": "malcolm_stock.n.01", "name": "Malcolm_stock"}, - {"id": 18278, "synset": "virginian_stock.n.01", "name": "Virginian_stock"}, - {"id": 18279, "synset": "stock.n.12", "name": "stock"}, - {"id": 18280, "synset": "brompton_stock.n.01", "name": "brompton_stock"}, - {"id": 18281, "synset": "bladderpod.n.03", "name": "bladderpod"}, - {"id": 18282, "synset": "chamois_cress.n.01", "name": "chamois_cress"}, - {"id": 18283, "synset": "radish_plant.n.01", "name": "radish_plant"}, - {"id": 18284, "synset": "jointed_charlock.n.01", "name": "jointed_charlock"}, - {"id": 18285, "synset": "radish.n.04", "name": "radish"}, - {"id": 18286, "synset": "radish.n.02", "name": "radish"}, - {"id": 18287, "synset": "marsh_cress.n.01", "name": "marsh_cress"}, - {"id": 18288, "synset": "great_yellowcress.n.01", "name": "great_yellowcress"}, - {"id": 18289, "synset": "schizopetalon.n.01", "name": "schizopetalon"}, - {"id": 18290, "synset": "field_mustard.n.01", "name": "field_mustard"}, - {"id": 18291, "synset": "hedge_mustard.n.01", "name": "hedge_mustard"}, - {"id": 18292, "synset": "desert_plume.n.01", "name": "desert_plume"}, - {"id": 18293, "synset": "pennycress.n.01", "name": "pennycress"}, - {"id": 18294, "synset": "field_pennycress.n.01", "name": "field_pennycress"}, - {"id": 18295, "synset": "fringepod.n.01", "name": "fringepod"}, - {"id": 18296, "synset": "bladderpod.n.02", "name": "bladderpod"}, - {"id": 18297, "synset": "wasabi.n.01", "name": "wasabi"}, - {"id": 18298, "synset": "poppy.n.01", "name": "poppy"}, - {"id": 18299, "synset": "iceland_poppy.n.02", "name": "Iceland_poppy"}, - {"id": 18300, "synset": "western_poppy.n.01", "name": "western_poppy"}, - {"id": 18301, "synset": "prickly_poppy.n.02", "name": "prickly_poppy"}, - {"id": 18302, "synset": "iceland_poppy.n.01", "name": "Iceland_poppy"}, - {"id": 18303, "synset": "oriental_poppy.n.01", "name": "oriental_poppy"}, - {"id": 18304, "synset": "corn_poppy.n.01", "name": "corn_poppy"}, - {"id": 18305, "synset": "opium_poppy.n.01", "name": "opium_poppy"}, - {"id": 18306, "synset": "prickly_poppy.n.01", "name": "prickly_poppy"}, - {"id": 18307, "synset": "mexican_poppy.n.01", "name": "Mexican_poppy"}, - {"id": 18308, "synset": "bocconia.n.02", "name": "bocconia"}, - {"id": 18309, "synset": "celandine.n.02", "name": "celandine"}, - {"id": 18310, "synset": "corydalis.n.01", "name": "corydalis"}, - {"id": 18311, "synset": "climbing_corydalis.n.01", "name": "climbing_corydalis"}, - {"id": 18312, "synset": "california_poppy.n.01", "name": "California_poppy"}, - {"id": 18313, "synset": "horn_poppy.n.01", "name": "horn_poppy"}, - {"id": 18314, "synset": "golden_cup.n.01", "name": "golden_cup"}, - {"id": 18315, "synset": "plume_poppy.n.01", "name": "plume_poppy"}, - {"id": 18316, "synset": "blue_poppy.n.01", "name": "blue_poppy"}, - {"id": 18317, "synset": "welsh_poppy.n.01", "name": "Welsh_poppy"}, - {"id": 18318, "synset": "creamcups.n.01", "name": "creamcups"}, - {"id": 18319, "synset": "matilija_poppy.n.01", "name": "matilija_poppy"}, - {"id": 18320, "synset": "wind_poppy.n.01", "name": "wind_poppy"}, - {"id": 18321, "synset": "celandine_poppy.n.01", "name": "celandine_poppy"}, - {"id": 18322, "synset": "climbing_fumitory.n.01", "name": "climbing_fumitory"}, - {"id": 18323, "synset": "bleeding_heart.n.01", "name": "bleeding_heart"}, - {"id": 18324, "synset": "dutchman's_breeches.n.01", "name": "Dutchman's_breeches"}, - {"id": 18325, "synset": "squirrel_corn.n.01", "name": "squirrel_corn"}, - {"id": 18326, "synset": "composite.n.02", "name": "composite"}, - {"id": 18327, "synset": "compass_plant.n.02", "name": "compass_plant"}, - {"id": 18328, "synset": "everlasting.n.01", "name": "everlasting"}, - {"id": 18329, "synset": "achillea.n.01", "name": "achillea"}, - {"id": 18330, "synset": "yarrow.n.01", "name": "yarrow"}, - { - "id": 18331, - "synset": "pink-and-white_everlasting.n.01", - "name": "pink-and-white_everlasting", - }, - {"id": 18332, "synset": "white_snakeroot.n.01", "name": "white_snakeroot"}, - {"id": 18333, "synset": "ageratum.n.02", "name": "ageratum"}, - {"id": 18334, "synset": "common_ageratum.n.01", "name": "common_ageratum"}, - {"id": 18335, "synset": "sweet_sultan.n.03", "name": "sweet_sultan"}, - {"id": 18336, "synset": "ragweed.n.02", "name": "ragweed"}, - {"id": 18337, "synset": "common_ragweed.n.01", "name": "common_ragweed"}, - {"id": 18338, "synset": "great_ragweed.n.01", "name": "great_ragweed"}, - {"id": 18339, "synset": "western_ragweed.n.01", "name": "western_ragweed"}, - {"id": 18340, "synset": "ammobium.n.01", "name": "ammobium"}, - {"id": 18341, "synset": "winged_everlasting.n.01", "name": "winged_everlasting"}, - {"id": 18342, "synset": "pellitory.n.02", "name": "pellitory"}, - {"id": 18343, "synset": "pearly_everlasting.n.01", "name": "pearly_everlasting"}, - {"id": 18344, "synset": "andryala.n.01", "name": "andryala"}, - {"id": 18345, "synset": "plantain-leaved_pussytoes.n.01", "name": "plantain-leaved_pussytoes"}, - {"id": 18346, "synset": "field_pussytoes.n.01", "name": "field_pussytoes"}, - {"id": 18347, "synset": "solitary_pussytoes.n.01", "name": "solitary_pussytoes"}, - {"id": 18348, "synset": "mountain_everlasting.n.01", "name": "mountain_everlasting"}, - {"id": 18349, "synset": "mayweed.n.01", "name": "mayweed"}, - {"id": 18350, "synset": "yellow_chamomile.n.01", "name": "yellow_chamomile"}, - {"id": 18351, "synset": "corn_chamomile.n.01", "name": "corn_chamomile"}, - {"id": 18352, "synset": "woolly_daisy.n.01", "name": "woolly_daisy"}, - {"id": 18353, "synset": "burdock.n.01", "name": "burdock"}, - {"id": 18354, "synset": "great_burdock.n.01", "name": "great_burdock"}, - {"id": 18355, "synset": "african_daisy.n.03", "name": "African_daisy"}, - {"id": 18356, "synset": "blue-eyed_african_daisy.n.01", "name": "blue-eyed_African_daisy"}, - {"id": 18357, "synset": "marguerite.n.02", "name": "marguerite"}, - {"id": 18358, "synset": "silversword.n.01", "name": "silversword"}, - {"id": 18359, "synset": "arnica.n.02", "name": "arnica"}, - {"id": 18360, "synset": "heartleaf_arnica.n.01", "name": "heartleaf_arnica"}, - {"id": 18361, "synset": "arnica_montana.n.01", "name": "Arnica_montana"}, - {"id": 18362, "synset": "lamb_succory.n.01", "name": "lamb_succory"}, - {"id": 18363, "synset": "artemisia.n.01", "name": "artemisia"}, - {"id": 18364, "synset": "mugwort.n.01", "name": "mugwort"}, - {"id": 18365, "synset": "sweet_wormwood.n.01", "name": "sweet_wormwood"}, - {"id": 18366, "synset": "field_wormwood.n.01", "name": "field_wormwood"}, - {"id": 18367, "synset": "tarragon.n.01", "name": "tarragon"}, - {"id": 18368, "synset": "sand_sage.n.01", "name": "sand_sage"}, - {"id": 18369, "synset": "wormwood_sage.n.01", "name": "wormwood_sage"}, - {"id": 18370, "synset": "western_mugwort.n.01", "name": "western_mugwort"}, - {"id": 18371, "synset": "roman_wormwood.n.01", "name": "Roman_wormwood"}, - {"id": 18372, "synset": "bud_brush.n.01", "name": "bud_brush"}, - {"id": 18373, "synset": "common_mugwort.n.01", "name": "common_mugwort"}, - {"id": 18374, "synset": "aster.n.01", "name": "aster"}, - {"id": 18375, "synset": "wood_aster.n.01", "name": "wood_aster"}, - {"id": 18376, "synset": "whorled_aster.n.01", "name": "whorled_aster"}, - {"id": 18377, "synset": "heath_aster.n.02", "name": "heath_aster"}, - {"id": 18378, "synset": "heart-leaved_aster.n.01", "name": "heart-leaved_aster"}, - {"id": 18379, "synset": "white_wood_aster.n.01", "name": "white_wood_aster"}, - {"id": 18380, "synset": "bushy_aster.n.01", "name": "bushy_aster"}, - {"id": 18381, "synset": "heath_aster.n.01", "name": "heath_aster"}, - {"id": 18382, "synset": "white_prairie_aster.n.01", "name": "white_prairie_aster"}, - {"id": 18383, "synset": "stiff_aster.n.01", "name": "stiff_aster"}, - {"id": 18384, "synset": "goldilocks.n.01", "name": "goldilocks"}, - {"id": 18385, "synset": "large-leaved_aster.n.01", "name": "large-leaved_aster"}, - {"id": 18386, "synset": "new_england_aster.n.01", "name": "New_England_aster"}, - {"id": 18387, "synset": "michaelmas_daisy.n.01", "name": "Michaelmas_daisy"}, - {"id": 18388, "synset": "upland_white_aster.n.01", "name": "upland_white_aster"}, - {"id": 18389, "synset": "short's_aster.n.01", "name": "Short's_aster"}, - {"id": 18390, "synset": "sea_aster.n.01", "name": "sea_aster"}, - {"id": 18391, "synset": "prairie_aster.n.01", "name": "prairie_aster"}, - {"id": 18392, "synset": "annual_salt-marsh_aster.n.01", "name": "annual_salt-marsh_aster"}, - {"id": 18393, "synset": "aromatic_aster.n.01", "name": "aromatic_aster"}, - {"id": 18394, "synset": "arrow_leaved_aster.n.01", "name": "arrow_leaved_aster"}, - {"id": 18395, "synset": "azure_aster.n.01", "name": "azure_aster"}, - {"id": 18396, "synset": "bog_aster.n.01", "name": "bog_aster"}, - {"id": 18397, "synset": "crooked-stemmed_aster.n.01", "name": "crooked-stemmed_aster"}, - {"id": 18398, "synset": "eastern_silvery_aster.n.01", "name": "Eastern_silvery_aster"}, - {"id": 18399, "synset": "flat-topped_white_aster.n.01", "name": "flat-topped_white_aster"}, - {"id": 18400, "synset": "late_purple_aster.n.01", "name": "late_purple_aster"}, - {"id": 18401, "synset": "panicled_aster.n.01", "name": "panicled_aster"}, - { - "id": 18402, - "synset": "perennial_salt_marsh_aster.n.01", - "name": "perennial_salt_marsh_aster", - }, - {"id": 18403, "synset": "purple-stemmed_aster.n.01", "name": "purple-stemmed_aster"}, - {"id": 18404, "synset": "rough-leaved_aster.n.01", "name": "rough-leaved_aster"}, - {"id": 18405, "synset": "rush_aster.n.01", "name": "rush_aster"}, - {"id": 18406, "synset": "schreiber's_aster.n.01", "name": "Schreiber's_aster"}, - {"id": 18407, "synset": "small_white_aster.n.01", "name": "small_white_aster"}, - {"id": 18408, "synset": "smooth_aster.n.01", "name": "smooth_aster"}, - {"id": 18409, "synset": "southern_aster.n.01", "name": "southern_aster"}, - {"id": 18410, "synset": "starved_aster.n.01", "name": "starved_aster"}, - {"id": 18411, "synset": "tradescant's_aster.n.01", "name": "tradescant's_aster"}, - {"id": 18412, "synset": "wavy-leaved_aster.n.01", "name": "wavy-leaved_aster"}, - {"id": 18413, "synset": "western_silvery_aster.n.01", "name": "Western_silvery_aster"}, - {"id": 18414, "synset": "willow_aster.n.01", "name": "willow_aster"}, - {"id": 18415, "synset": "ayapana.n.01", "name": "ayapana"}, - {"id": 18416, "synset": "mule_fat.n.01", "name": "mule_fat"}, - {"id": 18417, "synset": "balsamroot.n.01", "name": "balsamroot"}, - {"id": 18418, "synset": "daisy.n.01", "name": "daisy"}, - {"id": 18419, "synset": "common_daisy.n.01", "name": "common_daisy"}, - {"id": 18420, "synset": "bur_marigold.n.01", "name": "bur_marigold"}, - {"id": 18421, "synset": "spanish_needles.n.02", "name": "Spanish_needles"}, - {"id": 18422, "synset": "tickseed_sunflower.n.01", "name": "tickseed_sunflower"}, - {"id": 18423, "synset": "european_beggar-ticks.n.01", "name": "European_beggar-ticks"}, - {"id": 18424, "synset": "slender_knapweed.n.01", "name": "slender_knapweed"}, - {"id": 18425, "synset": "false_chamomile.n.01", "name": "false_chamomile"}, - {"id": 18426, "synset": "swan_river_daisy.n.01", "name": "Swan_River_daisy"}, - {"id": 18427, "synset": "woodland_oxeye.n.01", "name": "woodland_oxeye"}, - {"id": 18428, "synset": "indian_plantain.n.01", "name": "Indian_plantain"}, - {"id": 18429, "synset": "calendula.n.01", "name": "calendula"}, - {"id": 18430, "synset": "common_marigold.n.01", "name": "common_marigold"}, - {"id": 18431, "synset": "china_aster.n.01", "name": "China_aster"}, - {"id": 18432, "synset": "thistle.n.01", "name": "thistle"}, - {"id": 18433, "synset": "welted_thistle.n.01", "name": "welted_thistle"}, - {"id": 18434, "synset": "musk_thistle.n.01", "name": "musk_thistle"}, - {"id": 18435, "synset": "carline_thistle.n.01", "name": "carline_thistle"}, - {"id": 18436, "synset": "stemless_carline_thistle.n.01", "name": "stemless_carline_thistle"}, - {"id": 18437, "synset": "common_carline_thistle.n.01", "name": "common_carline_thistle"}, - {"id": 18438, "synset": "safflower.n.01", "name": "safflower"}, - {"id": 18439, "synset": "safflower_seed.n.01", "name": "safflower_seed"}, - {"id": 18440, "synset": "catananche.n.01", "name": "catananche"}, - {"id": 18441, "synset": "blue_succory.n.01", "name": "blue_succory"}, - {"id": 18442, "synset": "centaury.n.02", "name": "centaury"}, - {"id": 18443, "synset": "dusty_miller.n.03", "name": "dusty_miller"}, - {"id": 18444, "synset": "cornflower.n.02", "name": "cornflower"}, - {"id": 18445, "synset": "star-thistle.n.01", "name": "star-thistle"}, - {"id": 18446, "synset": "knapweed.n.01", "name": "knapweed"}, - {"id": 18447, "synset": "sweet_sultan.n.02", "name": "sweet_sultan"}, - {"id": 18448, "synset": "great_knapweed.n.01", "name": "great_knapweed"}, - {"id": 18449, "synset": "barnaby's_thistle.n.01", "name": "Barnaby's_thistle"}, - {"id": 18450, "synset": "chamomile.n.01", "name": "chamomile"}, - {"id": 18451, "synset": "chaenactis.n.01", "name": "chaenactis"}, - {"id": 18452, "synset": "chrysanthemum.n.02", "name": "chrysanthemum"}, - {"id": 18453, "synset": "corn_marigold.n.01", "name": "corn_marigold"}, - {"id": 18454, "synset": "crown_daisy.n.01", "name": "crown_daisy"}, - {"id": 18455, "synset": "chop-suey_greens.n.01", "name": "chop-suey_greens"}, - {"id": 18456, "synset": "golden_aster.n.01", "name": "golden_aster"}, - {"id": 18457, "synset": "maryland_golden_aster.n.01", "name": "Maryland_golden_aster"}, - {"id": 18458, "synset": "goldenbush.n.02", "name": "goldenbush"}, - {"id": 18459, "synset": "rabbit_brush.n.01", "name": "rabbit_brush"}, - {"id": 18460, "synset": "chicory.n.02", "name": "chicory"}, - {"id": 18461, "synset": "endive.n.01", "name": "endive"}, - {"id": 18462, "synset": "chicory.n.01", "name": "chicory"}, - {"id": 18463, "synset": "plume_thistle.n.01", "name": "plume_thistle"}, - {"id": 18464, "synset": "canada_thistle.n.01", "name": "Canada_thistle"}, - {"id": 18465, "synset": "field_thistle.n.01", "name": "field_thistle"}, - {"id": 18466, "synset": "woolly_thistle.n.02", "name": "woolly_thistle"}, - {"id": 18467, "synset": "european_woolly_thistle.n.01", "name": "European_woolly_thistle"}, - {"id": 18468, "synset": "melancholy_thistle.n.01", "name": "melancholy_thistle"}, - {"id": 18469, "synset": "brook_thistle.n.01", "name": "brook_thistle"}, - {"id": 18470, "synset": "bull_thistle.n.01", "name": "bull_thistle"}, - {"id": 18471, "synset": "blessed_thistle.n.02", "name": "blessed_thistle"}, - {"id": 18472, "synset": "mistflower.n.01", "name": "mistflower"}, - {"id": 18473, "synset": "horseweed.n.02", "name": "horseweed"}, - {"id": 18474, "synset": "coreopsis.n.01", "name": "coreopsis"}, - {"id": 18475, "synset": "giant_coreopsis.n.01", "name": "giant_coreopsis"}, - {"id": 18476, "synset": "sea_dahlia.n.01", "name": "sea_dahlia"}, - {"id": 18477, "synset": "calliopsis.n.01", "name": "calliopsis"}, - {"id": 18478, "synset": "cosmos.n.02", "name": "cosmos"}, - {"id": 18479, "synset": "brass_buttons.n.01", "name": "brass_buttons"}, - {"id": 18480, "synset": "billy_buttons.n.01", "name": "billy_buttons"}, - {"id": 18481, "synset": "hawk's-beard.n.01", "name": "hawk's-beard"}, - {"id": 18482, "synset": "artichoke.n.01", "name": "artichoke"}, - {"id": 18483, "synset": "cardoon.n.01", "name": "cardoon"}, - {"id": 18484, "synset": "dahlia.n.01", "name": "dahlia"}, - {"id": 18485, "synset": "german_ivy.n.01", "name": "German_ivy"}, - {"id": 18486, "synset": "florist's_chrysanthemum.n.01", "name": "florist's_chrysanthemum"}, - {"id": 18487, "synset": "cape_marigold.n.01", "name": "cape_marigold"}, - {"id": 18488, "synset": "leopard's-bane.n.01", "name": "leopard's-bane"}, - {"id": 18489, "synset": "coneflower.n.03", "name": "coneflower"}, - {"id": 18490, "synset": "globe_thistle.n.01", "name": "globe_thistle"}, - {"id": 18491, "synset": "elephant's-foot.n.02", "name": "elephant's-foot"}, - {"id": 18492, "synset": "tassel_flower.n.01", "name": "tassel_flower"}, - {"id": 18493, "synset": "brittlebush.n.01", "name": "brittlebush"}, - {"id": 18494, "synset": "sunray.n.02", "name": "sunray"}, - {"id": 18495, "synset": "engelmannia.n.01", "name": "engelmannia"}, - {"id": 18496, "synset": "fireweed.n.02", "name": "fireweed"}, - {"id": 18497, "synset": "fleabane.n.02", "name": "fleabane"}, - {"id": 18498, "synset": "blue_fleabane.n.01", "name": "blue_fleabane"}, - {"id": 18499, "synset": "daisy_fleabane.n.01", "name": "daisy_fleabane"}, - {"id": 18500, "synset": "orange_daisy.n.01", "name": "orange_daisy"}, - {"id": 18501, "synset": "spreading_fleabane.n.01", "name": "spreading_fleabane"}, - {"id": 18502, "synset": "seaside_daisy.n.01", "name": "seaside_daisy"}, - {"id": 18503, "synset": "philadelphia_fleabane.n.01", "name": "Philadelphia_fleabane"}, - {"id": 18504, "synset": "robin's_plantain.n.01", "name": "robin's_plantain"}, - {"id": 18505, "synset": "showy_daisy.n.01", "name": "showy_daisy"}, - {"id": 18506, "synset": "woolly_sunflower.n.01", "name": "woolly_sunflower"}, - {"id": 18507, "synset": "golden_yarrow.n.01", "name": "golden_yarrow"}, - {"id": 18508, "synset": "dog_fennel.n.01", "name": "dog_fennel"}, - {"id": 18509, "synset": "joe-pye_weed.n.02", "name": "Joe-Pye_weed"}, - {"id": 18510, "synset": "boneset.n.02", "name": "boneset"}, - {"id": 18511, "synset": "joe-pye_weed.n.01", "name": "Joe-Pye_weed"}, - {"id": 18512, "synset": "blue_daisy.n.01", "name": "blue_daisy"}, - {"id": 18513, "synset": "kingfisher_daisy.n.01", "name": "kingfisher_daisy"}, - {"id": 18514, "synset": "cotton_rose.n.02", "name": "cotton_rose"}, - {"id": 18515, "synset": "herba_impia.n.01", "name": "herba_impia"}, - {"id": 18516, "synset": "gaillardia.n.01", "name": "gaillardia"}, - {"id": 18517, "synset": "gazania.n.01", "name": "gazania"}, - {"id": 18518, "synset": "treasure_flower.n.01", "name": "treasure_flower"}, - {"id": 18519, "synset": "african_daisy.n.02", "name": "African_daisy"}, - {"id": 18520, "synset": "barberton_daisy.n.01", "name": "Barberton_daisy"}, - {"id": 18521, "synset": "desert_sunflower.n.01", "name": "desert_sunflower"}, - {"id": 18522, "synset": "cudweed.n.01", "name": "cudweed"}, - {"id": 18523, "synset": "chafeweed.n.01", "name": "chafeweed"}, - {"id": 18524, "synset": "gumweed.n.01", "name": "gumweed"}, - {"id": 18525, "synset": "grindelia_robusta.n.01", "name": "Grindelia_robusta"}, - {"id": 18526, "synset": "curlycup_gumweed.n.01", "name": "curlycup_gumweed"}, - {"id": 18527, "synset": "little-head_snakeweed.n.01", "name": "little-head_snakeweed"}, - {"id": 18528, "synset": "rabbitweed.n.01", "name": "rabbitweed"}, - {"id": 18529, "synset": "broomweed.n.01", "name": "broomweed"}, - {"id": 18530, "synset": "velvet_plant.n.02", "name": "velvet_plant"}, - {"id": 18531, "synset": "goldenbush.n.01", "name": "goldenbush"}, - {"id": 18532, "synset": "camphor_daisy.n.01", "name": "camphor_daisy"}, - {"id": 18533, "synset": "yellow_spiny_daisy.n.01", "name": "yellow_spiny_daisy"}, - {"id": 18534, "synset": "hoary_golden_bush.n.01", "name": "hoary_golden_bush"}, - {"id": 18535, "synset": "sneezeweed.n.01", "name": "sneezeweed"}, - {"id": 18536, "synset": "orange_sneezeweed.n.01", "name": "orange_sneezeweed"}, - {"id": 18537, "synset": "rosilla.n.01", "name": "rosilla"}, - {"id": 18538, "synset": "swamp_sunflower.n.01", "name": "swamp_sunflower"}, - {"id": 18539, "synset": "common_sunflower.n.01", "name": "common_sunflower"}, - {"id": 18540, "synset": "giant_sunflower.n.01", "name": "giant_sunflower"}, - {"id": 18541, "synset": "showy_sunflower.n.01", "name": "showy_sunflower"}, - {"id": 18542, "synset": "maximilian's_sunflower.n.01", "name": "Maximilian's_sunflower"}, - {"id": 18543, "synset": "prairie_sunflower.n.01", "name": "prairie_sunflower"}, - {"id": 18544, "synset": "jerusalem_artichoke.n.02", "name": "Jerusalem_artichoke"}, - {"id": 18545, "synset": "jerusalem_artichoke.n.01", "name": "Jerusalem_artichoke"}, - {"id": 18546, "synset": "strawflower.n.03", "name": "strawflower"}, - {"id": 18547, "synset": "heliopsis.n.01", "name": "heliopsis"}, - {"id": 18548, "synset": "strawflower.n.02", "name": "strawflower"}, - {"id": 18549, "synset": "hairy_golden_aster.n.01", "name": "hairy_golden_aster"}, - {"id": 18550, "synset": "hawkweed.n.02", "name": "hawkweed"}, - {"id": 18551, "synset": "rattlesnake_weed.n.01", "name": "rattlesnake_weed"}, - {"id": 18552, "synset": "alpine_coltsfoot.n.01", "name": "alpine_coltsfoot"}, - {"id": 18553, "synset": "alpine_gold.n.01", "name": "alpine_gold"}, - {"id": 18554, "synset": "dwarf_hulsea.n.01", "name": "dwarf_hulsea"}, - {"id": 18555, "synset": "cat's-ear.n.02", "name": "cat's-ear"}, - {"id": 18556, "synset": "inula.n.01", "name": "inula"}, - {"id": 18557, "synset": "marsh_elder.n.01", "name": "marsh_elder"}, - {"id": 18558, "synset": "burweed_marsh_elder.n.01", "name": "burweed_marsh_elder"}, - {"id": 18559, "synset": "krigia.n.01", "name": "krigia"}, - {"id": 18560, "synset": "dwarf_dandelion.n.01", "name": "dwarf_dandelion"}, - {"id": 18561, "synset": "garden_lettuce.n.01", "name": "garden_lettuce"}, - {"id": 18562, "synset": "cos_lettuce.n.01", "name": "cos_lettuce"}, - {"id": 18563, "synset": "leaf_lettuce.n.01", "name": "leaf_lettuce"}, - {"id": 18564, "synset": "celtuce.n.01", "name": "celtuce"}, - {"id": 18565, "synset": "prickly_lettuce.n.01", "name": "prickly_lettuce"}, - {"id": 18566, "synset": "goldfields.n.01", "name": "goldfields"}, - {"id": 18567, "synset": "tidytips.n.01", "name": "tidytips"}, - {"id": 18568, "synset": "hawkbit.n.01", "name": "hawkbit"}, - {"id": 18569, "synset": "fall_dandelion.n.01", "name": "fall_dandelion"}, - {"id": 18570, "synset": "edelweiss.n.01", "name": "edelweiss"}, - {"id": 18571, "synset": "oxeye_daisy.n.02", "name": "oxeye_daisy"}, - {"id": 18572, "synset": "oxeye_daisy.n.01", "name": "oxeye_daisy"}, - {"id": 18573, "synset": "shasta_daisy.n.01", "name": "shasta_daisy"}, - {"id": 18574, "synset": "pyrenees_daisy.n.01", "name": "Pyrenees_daisy"}, - {"id": 18575, "synset": "north_island_edelweiss.n.01", "name": "north_island_edelweiss"}, - {"id": 18576, "synset": "blazing_star.n.02", "name": "blazing_star"}, - {"id": 18577, "synset": "dotted_gayfeather.n.01", "name": "dotted_gayfeather"}, - {"id": 18578, "synset": "dense_blazing_star.n.01", "name": "dense_blazing_star"}, - {"id": 18579, "synset": "texas_star.n.02", "name": "Texas_star"}, - {"id": 18580, "synset": "african_daisy.n.01", "name": "African_daisy"}, - {"id": 18581, "synset": "tahoka_daisy.n.01", "name": "tahoka_daisy"}, - {"id": 18582, "synset": "sticky_aster.n.01", "name": "sticky_aster"}, - {"id": 18583, "synset": "mojave_aster.n.01", "name": "Mojave_aster"}, - {"id": 18584, "synset": "tarweed.n.01", "name": "tarweed"}, - {"id": 18585, "synset": "sweet_false_chamomile.n.01", "name": "sweet_false_chamomile"}, - {"id": 18586, "synset": "pineapple_weed.n.01", "name": "pineapple_weed"}, - {"id": 18587, "synset": "climbing_hempweed.n.01", "name": "climbing_hempweed"}, - {"id": 18588, "synset": "mutisia.n.01", "name": "mutisia"}, - {"id": 18589, "synset": "rattlesnake_root.n.02", "name": "rattlesnake_root"}, - {"id": 18590, "synset": "white_lettuce.n.01", "name": "white_lettuce"}, - {"id": 18591, "synset": "daisybush.n.01", "name": "daisybush"}, - {"id": 18592, "synset": "new_zealand_daisybush.n.01", "name": "New_Zealand_daisybush"}, - {"id": 18593, "synset": "cotton_thistle.n.01", "name": "cotton_thistle"}, - {"id": 18594, "synset": "othonna.n.01", "name": "othonna"}, - {"id": 18595, "synset": "cascade_everlasting.n.01", "name": "cascade_everlasting"}, - {"id": 18596, "synset": "butterweed.n.02", "name": "butterweed"}, - {"id": 18597, "synset": "american_feverfew.n.01", "name": "American_feverfew"}, - {"id": 18598, "synset": "cineraria.n.01", "name": "cineraria"}, - {"id": 18599, "synset": "florest's_cineraria.n.01", "name": "florest's_cineraria"}, - {"id": 18600, "synset": "butterbur.n.01", "name": "butterbur"}, - {"id": 18601, "synset": "winter_heliotrope.n.01", "name": "winter_heliotrope"}, - {"id": 18602, "synset": "sweet_coltsfoot.n.01", "name": "sweet_coltsfoot"}, - {"id": 18603, "synset": "oxtongue.n.01", "name": "oxtongue"}, - {"id": 18604, "synset": "hawkweed.n.01", "name": "hawkweed"}, - {"id": 18605, "synset": "mouse-ear_hawkweed.n.01", "name": "mouse-ear_hawkweed"}, - {"id": 18606, "synset": "stevia.n.02", "name": "stevia"}, - {"id": 18607, "synset": "rattlesnake_root.n.01", "name": "rattlesnake_root"}, - {"id": 18608, "synset": "fleabane.n.01", "name": "fleabane"}, - {"id": 18609, "synset": "sheep_plant.n.01", "name": "sheep_plant"}, - {"id": 18610, "synset": "coneflower.n.02", "name": "coneflower"}, - {"id": 18611, "synset": "mexican_hat.n.01", "name": "Mexican_hat"}, - {"id": 18612, "synset": "long-head_coneflower.n.01", "name": "long-head_coneflower"}, - {"id": 18613, "synset": "prairie_coneflower.n.01", "name": "prairie_coneflower"}, - {"id": 18614, "synset": "swan_river_everlasting.n.01", "name": "Swan_River_everlasting"}, - {"id": 18615, "synset": "coneflower.n.01", "name": "coneflower"}, - {"id": 18616, "synset": "black-eyed_susan.n.03", "name": "black-eyed_Susan"}, - {"id": 18617, "synset": "cutleaved_coneflower.n.01", "name": "cutleaved_coneflower"}, - {"id": 18618, "synset": "golden_glow.n.01", "name": "golden_glow"}, - {"id": 18619, "synset": "lavender_cotton.n.01", "name": "lavender_cotton"}, - {"id": 18620, "synset": "creeping_zinnia.n.01", "name": "creeping_zinnia"}, - {"id": 18621, "synset": "golden_thistle.n.01", "name": "golden_thistle"}, - {"id": 18622, "synset": "spanish_oyster_plant.n.01", "name": "Spanish_oyster_plant"}, - {"id": 18623, "synset": "nodding_groundsel.n.01", "name": "nodding_groundsel"}, - {"id": 18624, "synset": "dusty_miller.n.02", "name": "dusty_miller"}, - {"id": 18625, "synset": "butterweed.n.01", "name": "butterweed"}, - {"id": 18626, "synset": "ragwort.n.01", "name": "ragwort"}, - {"id": 18627, "synset": "arrowleaf_groundsel.n.01", "name": "arrowleaf_groundsel"}, - {"id": 18628, "synset": "black_salsify.n.01", "name": "black_salsify"}, - {"id": 18629, "synset": "white-topped_aster.n.01", "name": "white-topped_aster"}, - { - "id": 18630, - "synset": "narrow-leaved_white-topped_aster.n.01", - "name": "narrow-leaved_white-topped_aster", - }, - {"id": 18631, "synset": "silver_sage.n.01", "name": "silver_sage"}, - {"id": 18632, "synset": "sea_wormwood.n.01", "name": "sea_wormwood"}, - {"id": 18633, "synset": "sawwort.n.01", "name": "sawwort"}, - {"id": 18634, "synset": "rosinweed.n.01", "name": "rosinweed"}, - {"id": 18635, "synset": "milk_thistle.n.02", "name": "milk_thistle"}, - {"id": 18636, "synset": "goldenrod.n.01", "name": "goldenrod"}, - {"id": 18637, "synset": "silverrod.n.01", "name": "silverrod"}, - {"id": 18638, "synset": "meadow_goldenrod.n.01", "name": "meadow_goldenrod"}, - {"id": 18639, "synset": "missouri_goldenrod.n.01", "name": "Missouri_goldenrod"}, - {"id": 18640, "synset": "alpine_goldenrod.n.01", "name": "alpine_goldenrod"}, - {"id": 18641, "synset": "grey_goldenrod.n.01", "name": "grey_goldenrod"}, - {"id": 18642, "synset": "blue_mountain_tea.n.01", "name": "Blue_Mountain_tea"}, - {"id": 18643, "synset": "dyer's_weed.n.01", "name": "dyer's_weed"}, - {"id": 18644, "synset": "seaside_goldenrod.n.01", "name": "seaside_goldenrod"}, - {"id": 18645, "synset": "narrow_goldenrod.n.01", "name": "narrow_goldenrod"}, - {"id": 18646, "synset": "boott's_goldenrod.n.01", "name": "Boott's_goldenrod"}, - {"id": 18647, "synset": "elliott's_goldenrod.n.01", "name": "Elliott's_goldenrod"}, - {"id": 18648, "synset": "ohio_goldenrod.n.01", "name": "Ohio_goldenrod"}, - {"id": 18649, "synset": "rough-stemmed_goldenrod.n.01", "name": "rough-stemmed_goldenrod"}, - {"id": 18650, "synset": "showy_goldenrod.n.01", "name": "showy_goldenrod"}, - {"id": 18651, "synset": "tall_goldenrod.n.01", "name": "tall_goldenrod"}, - {"id": 18652, "synset": "zigzag_goldenrod.n.01", "name": "zigzag_goldenrod"}, - {"id": 18653, "synset": "sow_thistle.n.01", "name": "sow_thistle"}, - {"id": 18654, "synset": "milkweed.n.02", "name": "milkweed"}, - {"id": 18655, "synset": "stevia.n.01", "name": "stevia"}, - {"id": 18656, "synset": "stokes'_aster.n.01", "name": "stokes'_aster"}, - {"id": 18657, "synset": "marigold.n.01", "name": "marigold"}, - {"id": 18658, "synset": "african_marigold.n.01", "name": "African_marigold"}, - {"id": 18659, "synset": "french_marigold.n.01", "name": "French_marigold"}, - {"id": 18660, "synset": "painted_daisy.n.01", "name": "painted_daisy"}, - {"id": 18661, "synset": "pyrethrum.n.02", "name": "pyrethrum"}, - {"id": 18662, "synset": "northern_dune_tansy.n.01", "name": "northern_dune_tansy"}, - {"id": 18663, "synset": "feverfew.n.01", "name": "feverfew"}, - {"id": 18664, "synset": "dusty_miller.n.01", "name": "dusty_miller"}, - {"id": 18665, "synset": "tansy.n.01", "name": "tansy"}, - {"id": 18666, "synset": "dandelion.n.01", "name": "dandelion"}, - {"id": 18667, "synset": "common_dandelion.n.01", "name": "common_dandelion"}, - {"id": 18668, "synset": "dandelion_green.n.01", "name": "dandelion_green"}, - {"id": 18669, "synset": "russian_dandelion.n.01", "name": "Russian_dandelion"}, - {"id": 18670, "synset": "stemless_hymenoxys.n.01", "name": "stemless_hymenoxys"}, - {"id": 18671, "synset": "mexican_sunflower.n.01", "name": "Mexican_sunflower"}, - {"id": 18672, "synset": "easter_daisy.n.01", "name": "Easter_daisy"}, - {"id": 18673, "synset": "yellow_salsify.n.01", "name": "yellow_salsify"}, - {"id": 18674, "synset": "salsify.n.02", "name": "salsify"}, - {"id": 18675, "synset": "meadow_salsify.n.01", "name": "meadow_salsify"}, - {"id": 18676, "synset": "scentless_camomile.n.01", "name": "scentless_camomile"}, - {"id": 18677, "synset": "turfing_daisy.n.01", "name": "turfing_daisy"}, - {"id": 18678, "synset": "coltsfoot.n.02", "name": "coltsfoot"}, - {"id": 18679, "synset": "ursinia.n.01", "name": "ursinia"}, - {"id": 18680, "synset": "crownbeard.n.01", "name": "crownbeard"}, - {"id": 18681, "synset": "wingstem.n.01", "name": "wingstem"}, - {"id": 18682, "synset": "cowpen_daisy.n.01", "name": "cowpen_daisy"}, - {"id": 18683, "synset": "gravelweed.n.01", "name": "gravelweed"}, - {"id": 18684, "synset": "virginia_crownbeard.n.01", "name": "Virginia_crownbeard"}, - {"id": 18685, "synset": "ironweed.n.01", "name": "ironweed"}, - {"id": 18686, "synset": "mule's_ears.n.01", "name": "mule's_ears"}, - {"id": 18687, "synset": "white-rayed_mule's_ears.n.01", "name": "white-rayed_mule's_ears"}, - {"id": 18688, "synset": "cocklebur.n.01", "name": "cocklebur"}, - {"id": 18689, "synset": "xeranthemum.n.01", "name": "xeranthemum"}, - {"id": 18690, "synset": "immortelle.n.01", "name": "immortelle"}, - {"id": 18691, "synset": "zinnia.n.01", "name": "zinnia"}, - {"id": 18692, "synset": "white_zinnia.n.01", "name": "white_zinnia"}, - {"id": 18693, "synset": "little_golden_zinnia.n.01", "name": "little_golden_zinnia"}, - {"id": 18694, "synset": "blazing_star.n.01", "name": "blazing_star"}, - {"id": 18695, "synset": "bartonia.n.01", "name": "bartonia"}, - {"id": 18696, "synset": "achene.n.01", "name": "achene"}, - {"id": 18697, "synset": "samara.n.01", "name": "samara"}, - {"id": 18698, "synset": "campanula.n.01", "name": "campanula"}, - {"id": 18699, "synset": "creeping_bellflower.n.01", "name": "creeping_bellflower"}, - {"id": 18700, "synset": "canterbury_bell.n.02", "name": "Canterbury_bell"}, - {"id": 18701, "synset": "tall_bellflower.n.01", "name": "tall_bellflower"}, - {"id": 18702, "synset": "marsh_bellflower.n.01", "name": "marsh_bellflower"}, - {"id": 18703, "synset": "clustered_bellflower.n.01", "name": "clustered_bellflower"}, - {"id": 18704, "synset": "peach_bells.n.01", "name": "peach_bells"}, - {"id": 18705, "synset": "chimney_plant.n.01", "name": "chimney_plant"}, - {"id": 18706, "synset": "rampion.n.01", "name": "rampion"}, - {"id": 18707, "synset": "tussock_bellflower.n.01", "name": "tussock_bellflower"}, - {"id": 18708, "synset": "orchid.n.01", "name": "orchid"}, - {"id": 18709, "synset": "orchis.n.01", "name": "orchis"}, - {"id": 18710, "synset": "male_orchis.n.01", "name": "male_orchis"}, - {"id": 18711, "synset": "butterfly_orchid.n.05", "name": "butterfly_orchid"}, - {"id": 18712, "synset": "showy_orchis.n.01", "name": "showy_orchis"}, - {"id": 18713, "synset": "aerides.n.01", "name": "aerides"}, - {"id": 18714, "synset": "angrecum.n.01", "name": "angrecum"}, - {"id": 18715, "synset": "jewel_orchid.n.01", "name": "jewel_orchid"}, - {"id": 18716, "synset": "puttyroot.n.01", "name": "puttyroot"}, - {"id": 18717, "synset": "arethusa.n.01", "name": "arethusa"}, - {"id": 18718, "synset": "bog_rose.n.01", "name": "bog_rose"}, - {"id": 18719, "synset": "bletia.n.01", "name": "bletia"}, - {"id": 18720, "synset": "bletilla_striata.n.01", "name": "Bletilla_striata"}, - {"id": 18721, "synset": "brassavola.n.01", "name": "brassavola"}, - {"id": 18722, "synset": "spider_orchid.n.03", "name": "spider_orchid"}, - {"id": 18723, "synset": "spider_orchid.n.02", "name": "spider_orchid"}, - {"id": 18724, "synset": "caladenia.n.01", "name": "caladenia"}, - {"id": 18725, "synset": "calanthe.n.01", "name": "calanthe"}, - {"id": 18726, "synset": "grass_pink.n.01", "name": "grass_pink"}, - {"id": 18727, "synset": "calypso.n.01", "name": "calypso"}, - {"id": 18728, "synset": "cattleya.n.01", "name": "cattleya"}, - {"id": 18729, "synset": "helleborine.n.03", "name": "helleborine"}, - {"id": 18730, "synset": "red_helleborine.n.01", "name": "red_helleborine"}, - {"id": 18731, "synset": "spreading_pogonia.n.01", "name": "spreading_pogonia"}, - {"id": 18732, "synset": "rosebud_orchid.n.01", "name": "rosebud_orchid"}, - {"id": 18733, "synset": "satyr_orchid.n.01", "name": "satyr_orchid"}, - {"id": 18734, "synset": "frog_orchid.n.02", "name": "frog_orchid"}, - {"id": 18735, "synset": "coelogyne.n.01", "name": "coelogyne"}, - {"id": 18736, "synset": "coral_root.n.01", "name": "coral_root"}, - {"id": 18737, "synset": "spotted_coral_root.n.01", "name": "spotted_coral_root"}, - {"id": 18738, "synset": "striped_coral_root.n.01", "name": "striped_coral_root"}, - {"id": 18739, "synset": "early_coral_root.n.01", "name": "early_coral_root"}, - {"id": 18740, "synset": "swan_orchid.n.01", "name": "swan_orchid"}, - {"id": 18741, "synset": "cymbid.n.01", "name": "cymbid"}, - {"id": 18742, "synset": "cypripedia.n.01", "name": "cypripedia"}, - {"id": 18743, "synset": "lady's_slipper.n.01", "name": "lady's_slipper"}, - {"id": 18744, "synset": "moccasin_flower.n.01", "name": "moccasin_flower"}, - {"id": 18745, "synset": "common_lady's-slipper.n.01", "name": "common_lady's-slipper"}, - {"id": 18746, "synset": "ram's-head.n.01", "name": "ram's-head"}, - {"id": 18747, "synset": "yellow_lady's_slipper.n.01", "name": "yellow_lady's_slipper"}, - { - "id": 18748, - "synset": "large_yellow_lady's_slipper.n.01", - "name": "large_yellow_lady's_slipper", - }, - {"id": 18749, "synset": "california_lady's_slipper.n.01", "name": "California_lady's_slipper"}, - {"id": 18750, "synset": "clustered_lady's_slipper.n.01", "name": "clustered_lady's_slipper"}, - {"id": 18751, "synset": "mountain_lady's_slipper.n.01", "name": "mountain_lady's_slipper"}, - {"id": 18752, "synset": "marsh_orchid.n.01", "name": "marsh_orchid"}, - {"id": 18753, "synset": "common_spotted_orchid.n.01", "name": "common_spotted_orchid"}, - {"id": 18754, "synset": "dendrobium.n.01", "name": "dendrobium"}, - {"id": 18755, "synset": "disa.n.01", "name": "disa"}, - {"id": 18756, "synset": "phantom_orchid.n.01", "name": "phantom_orchid"}, - {"id": 18757, "synset": "tulip_orchid.n.01", "name": "tulip_orchid"}, - {"id": 18758, "synset": "butterfly_orchid.n.04", "name": "butterfly_orchid"}, - {"id": 18759, "synset": "butterfly_orchid.n.03", "name": "butterfly_orchid"}, - {"id": 18760, "synset": "epidendron.n.01", "name": "epidendron"}, - {"id": 18761, "synset": "helleborine.n.02", "name": "helleborine"}, - {"id": 18762, "synset": "epipactis_helleborine.n.01", "name": "Epipactis_helleborine"}, - {"id": 18763, "synset": "stream_orchid.n.01", "name": "stream_orchid"}, - {"id": 18764, "synset": "tongueflower.n.01", "name": "tongueflower"}, - {"id": 18765, "synset": "rattlesnake_plantain.n.01", "name": "rattlesnake_plantain"}, - {"id": 18766, "synset": "fragrant_orchid.n.01", "name": "fragrant_orchid"}, - { - "id": 18767, - "synset": "short-spurred_fragrant_orchid.n.01", - "name": "short-spurred_fragrant_orchid", - }, - {"id": 18768, "synset": "fringed_orchis.n.01", "name": "fringed_orchis"}, - {"id": 18769, "synset": "frog_orchid.n.01", "name": "frog_orchid"}, - {"id": 18770, "synset": "rein_orchid.n.01", "name": "rein_orchid"}, - {"id": 18771, "synset": "bog_rein_orchid.n.01", "name": "bog_rein_orchid"}, - {"id": 18772, "synset": "white_fringed_orchis.n.01", "name": "white_fringed_orchis"}, - {"id": 18773, "synset": "elegant_habenaria.n.01", "name": "elegant_Habenaria"}, - {"id": 18774, "synset": "purple-fringed_orchid.n.02", "name": "purple-fringed_orchid"}, - {"id": 18775, "synset": "coastal_rein_orchid.n.01", "name": "coastal_rein_orchid"}, - {"id": 18776, "synset": "hooker's_orchid.n.01", "name": "Hooker's_orchid"}, - {"id": 18777, "synset": "ragged_orchid.n.01", "name": "ragged_orchid"}, - {"id": 18778, "synset": "prairie_orchid.n.01", "name": "prairie_orchid"}, - {"id": 18779, "synset": "snowy_orchid.n.01", "name": "snowy_orchid"}, - {"id": 18780, "synset": "round-leaved_rein_orchid.n.01", "name": "round-leaved_rein_orchid"}, - {"id": 18781, "synset": "purple_fringeless_orchid.n.01", "name": "purple_fringeless_orchid"}, - {"id": 18782, "synset": "purple-fringed_orchid.n.01", "name": "purple-fringed_orchid"}, - {"id": 18783, "synset": "alaska_rein_orchid.n.01", "name": "Alaska_rein_orchid"}, - {"id": 18784, "synset": "crested_coral_root.n.01", "name": "crested_coral_root"}, - {"id": 18785, "synset": "texas_purple_spike.n.01", "name": "Texas_purple_spike"}, - {"id": 18786, "synset": "lizard_orchid.n.01", "name": "lizard_orchid"}, - {"id": 18787, "synset": "laelia.n.01", "name": "laelia"}, - {"id": 18788, "synset": "liparis.n.01", "name": "liparis"}, - {"id": 18789, "synset": "twayblade.n.02", "name": "twayblade"}, - {"id": 18790, "synset": "fen_orchid.n.01", "name": "fen_orchid"}, - {"id": 18791, "synset": "broad-leaved_twayblade.n.01", "name": "broad-leaved_twayblade"}, - {"id": 18792, "synset": "lesser_twayblade.n.01", "name": "lesser_twayblade"}, - {"id": 18793, "synset": "twayblade.n.01", "name": "twayblade"}, - {"id": 18794, "synset": "green_adder's_mouth.n.01", "name": "green_adder's_mouth"}, - {"id": 18795, "synset": "masdevallia.n.01", "name": "masdevallia"}, - {"id": 18796, "synset": "maxillaria.n.01", "name": "maxillaria"}, - {"id": 18797, "synset": "pansy_orchid.n.01", "name": "pansy_orchid"}, - {"id": 18798, "synset": "odontoglossum.n.01", "name": "odontoglossum"}, - {"id": 18799, "synset": "oncidium.n.01", "name": "oncidium"}, - {"id": 18800, "synset": "bee_orchid.n.01", "name": "bee_orchid"}, - {"id": 18801, "synset": "fly_orchid.n.02", "name": "fly_orchid"}, - {"id": 18802, "synset": "spider_orchid.n.01", "name": "spider_orchid"}, - {"id": 18803, "synset": "early_spider_orchid.n.01", "name": "early_spider_orchid"}, - {"id": 18804, "synset": "venus'_slipper.n.01", "name": "Venus'_slipper"}, - {"id": 18805, "synset": "phaius.n.01", "name": "phaius"}, - {"id": 18806, "synset": "moth_orchid.n.01", "name": "moth_orchid"}, - {"id": 18807, "synset": "butterfly_plant.n.01", "name": "butterfly_plant"}, - {"id": 18808, "synset": "rattlesnake_orchid.n.01", "name": "rattlesnake_orchid"}, - {"id": 18809, "synset": "lesser_butterfly_orchid.n.01", "name": "lesser_butterfly_orchid"}, - {"id": 18810, "synset": "greater_butterfly_orchid.n.01", "name": "greater_butterfly_orchid"}, - { - "id": 18811, - "synset": "prairie_white-fringed_orchid.n.01", - "name": "prairie_white-fringed_orchid", - }, - {"id": 18812, "synset": "tangle_orchid.n.01", "name": "tangle_orchid"}, - {"id": 18813, "synset": "indian_crocus.n.01", "name": "Indian_crocus"}, - {"id": 18814, "synset": "pleurothallis.n.01", "name": "pleurothallis"}, - {"id": 18815, "synset": "pogonia.n.01", "name": "pogonia"}, - {"id": 18816, "synset": "butterfly_orchid.n.01", "name": "butterfly_orchid"}, - {"id": 18817, "synset": "psychopsis_krameriana.n.01", "name": "Psychopsis_krameriana"}, - {"id": 18818, "synset": "psychopsis_papilio.n.01", "name": "Psychopsis_papilio"}, - {"id": 18819, "synset": "helmet_orchid.n.01", "name": "helmet_orchid"}, - {"id": 18820, "synset": "foxtail_orchid.n.01", "name": "foxtail_orchid"}, - {"id": 18821, "synset": "orange-blossom_orchid.n.01", "name": "orange-blossom_orchid"}, - {"id": 18822, "synset": "sobralia.n.01", "name": "sobralia"}, - {"id": 18823, "synset": "ladies'_tresses.n.01", "name": "ladies'_tresses"}, - {"id": 18824, "synset": "screw_augur.n.01", "name": "screw_augur"}, - {"id": 18825, "synset": "hooded_ladies'_tresses.n.01", "name": "hooded_ladies'_tresses"}, - {"id": 18826, "synset": "western_ladies'_tresses.n.01", "name": "western_ladies'_tresses"}, - {"id": 18827, "synset": "european_ladies'_tresses.n.01", "name": "European_ladies'_tresses"}, - {"id": 18828, "synset": "stanhopea.n.01", "name": "stanhopea"}, - {"id": 18829, "synset": "stelis.n.01", "name": "stelis"}, - {"id": 18830, "synset": "fly_orchid.n.01", "name": "fly_orchid"}, - {"id": 18831, "synset": "vanda.n.01", "name": "vanda"}, - {"id": 18832, "synset": "blue_orchid.n.01", "name": "blue_orchid"}, - {"id": 18833, "synset": "vanilla.n.01", "name": "vanilla"}, - {"id": 18834, "synset": "vanilla_orchid.n.01", "name": "vanilla_orchid"}, - {"id": 18835, "synset": "yam.n.02", "name": "yam"}, - {"id": 18836, "synset": "yam.n.01", "name": "yam"}, - {"id": 18837, "synset": "white_yam.n.01", "name": "white_yam"}, - {"id": 18838, "synset": "cinnamon_vine.n.01", "name": "cinnamon_vine"}, - {"id": 18839, "synset": "elephant's-foot.n.01", "name": "elephant's-foot"}, - {"id": 18840, "synset": "wild_yam.n.01", "name": "wild_yam"}, - {"id": 18841, "synset": "cush-cush.n.01", "name": "cush-cush"}, - {"id": 18842, "synset": "black_bryony.n.01", "name": "black_bryony"}, - {"id": 18843, "synset": "primrose.n.01", "name": "primrose"}, - {"id": 18844, "synset": "english_primrose.n.01", "name": "English_primrose"}, - {"id": 18845, "synset": "cowslip.n.01", "name": "cowslip"}, - {"id": 18846, "synset": "oxlip.n.01", "name": "oxlip"}, - {"id": 18847, "synset": "chinese_primrose.n.01", "name": "Chinese_primrose"}, - {"id": 18848, "synset": "polyanthus.n.01", "name": "polyanthus"}, - {"id": 18849, "synset": "pimpernel.n.02", "name": "pimpernel"}, - {"id": 18850, "synset": "scarlet_pimpernel.n.01", "name": "scarlet_pimpernel"}, - {"id": 18851, "synset": "bog_pimpernel.n.01", "name": "bog_pimpernel"}, - {"id": 18852, "synset": "chaffweed.n.01", "name": "chaffweed"}, - {"id": 18853, "synset": "cyclamen.n.01", "name": "cyclamen"}, - {"id": 18854, "synset": "sowbread.n.01", "name": "sowbread"}, - {"id": 18855, "synset": "sea_milkwort.n.01", "name": "sea_milkwort"}, - {"id": 18856, "synset": "featherfoil.n.01", "name": "featherfoil"}, - {"id": 18857, "synset": "water_gillyflower.n.01", "name": "water_gillyflower"}, - {"id": 18858, "synset": "water_violet.n.01", "name": "water_violet"}, - {"id": 18859, "synset": "loosestrife.n.02", "name": "loosestrife"}, - {"id": 18860, "synset": "gooseneck_loosestrife.n.01", "name": "gooseneck_loosestrife"}, - {"id": 18861, "synset": "yellow_pimpernel.n.01", "name": "yellow_pimpernel"}, - {"id": 18862, "synset": "fringed_loosestrife.n.01", "name": "fringed_loosestrife"}, - {"id": 18863, "synset": "moneywort.n.01", "name": "moneywort"}, - {"id": 18864, "synset": "swamp_candles.n.01", "name": "swamp_candles"}, - {"id": 18865, "synset": "whorled_loosestrife.n.01", "name": "whorled_loosestrife"}, - {"id": 18866, "synset": "water_pimpernel.n.01", "name": "water_pimpernel"}, - {"id": 18867, "synset": "brookweed.n.02", "name": "brookweed"}, - {"id": 18868, "synset": "brookweed.n.01", "name": "brookweed"}, - {"id": 18869, "synset": "coralberry.n.02", "name": "coralberry"}, - {"id": 18870, "synset": "marlberry.n.01", "name": "marlberry"}, - {"id": 18871, "synset": "plumbago.n.02", "name": "plumbago"}, - {"id": 18872, "synset": "leadwort.n.01", "name": "leadwort"}, - {"id": 18873, "synset": "thrift.n.01", "name": "thrift"}, - {"id": 18874, "synset": "sea_lavender.n.01", "name": "sea_lavender"}, - {"id": 18875, "synset": "barbasco.n.01", "name": "barbasco"}, - {"id": 18876, "synset": "gramineous_plant.n.01", "name": "gramineous_plant"}, - {"id": 18877, "synset": "grass.n.01", "name": "grass"}, - {"id": 18878, "synset": "midgrass.n.01", "name": "midgrass"}, - {"id": 18879, "synset": "shortgrass.n.01", "name": "shortgrass"}, - {"id": 18880, "synset": "sword_grass.n.01", "name": "sword_grass"}, - {"id": 18881, "synset": "tallgrass.n.01", "name": "tallgrass"}, - {"id": 18882, "synset": "herbage.n.01", "name": "herbage"}, - {"id": 18883, "synset": "goat_grass.n.01", "name": "goat_grass"}, - {"id": 18884, "synset": "wheatgrass.n.01", "name": "wheatgrass"}, - {"id": 18885, "synset": "crested_wheatgrass.n.01", "name": "crested_wheatgrass"}, - {"id": 18886, "synset": "bearded_wheatgrass.n.01", "name": "bearded_wheatgrass"}, - {"id": 18887, "synset": "western_wheatgrass.n.01", "name": "western_wheatgrass"}, - {"id": 18888, "synset": "intermediate_wheatgrass.n.01", "name": "intermediate_wheatgrass"}, - {"id": 18889, "synset": "slender_wheatgrass.n.01", "name": "slender_wheatgrass"}, - {"id": 18890, "synset": "velvet_bent.n.01", "name": "velvet_bent"}, - {"id": 18891, "synset": "cloud_grass.n.01", "name": "cloud_grass"}, - {"id": 18892, "synset": "meadow_foxtail.n.01", "name": "meadow_foxtail"}, - {"id": 18893, "synset": "foxtail.n.01", "name": "foxtail"}, - {"id": 18894, "synset": "broom_grass.n.01", "name": "broom_grass"}, - {"id": 18895, "synset": "broom_sedge.n.01", "name": "broom_sedge"}, - {"id": 18896, "synset": "tall_oat_grass.n.01", "name": "tall_oat_grass"}, - {"id": 18897, "synset": "toetoe.n.02", "name": "toetoe"}, - {"id": 18898, "synset": "oat.n.01", "name": "oat"}, - {"id": 18899, "synset": "cereal_oat.n.01", "name": "cereal_oat"}, - {"id": 18900, "synset": "wild_oat.n.01", "name": "wild_oat"}, - {"id": 18901, "synset": "slender_wild_oat.n.01", "name": "slender_wild_oat"}, - {"id": 18902, "synset": "wild_red_oat.n.01", "name": "wild_red_oat"}, - {"id": 18903, "synset": "brome.n.01", "name": "brome"}, - {"id": 18904, "synset": "chess.n.01", "name": "chess"}, - {"id": 18905, "synset": "field_brome.n.01", "name": "field_brome"}, - {"id": 18906, "synset": "grama.n.01", "name": "grama"}, - {"id": 18907, "synset": "black_grama.n.01", "name": "black_grama"}, - {"id": 18908, "synset": "buffalo_grass.n.02", "name": "buffalo_grass"}, - {"id": 18909, "synset": "reed_grass.n.01", "name": "reed_grass"}, - {"id": 18910, "synset": "feather_reed_grass.n.01", "name": "feather_reed_grass"}, - {"id": 18911, "synset": "australian_reed_grass.n.01", "name": "Australian_reed_grass"}, - {"id": 18912, "synset": "burgrass.n.01", "name": "burgrass"}, - {"id": 18913, "synset": "buffel_grass.n.01", "name": "buffel_grass"}, - {"id": 18914, "synset": "rhodes_grass.n.01", "name": "Rhodes_grass"}, - {"id": 18915, "synset": "pampas_grass.n.01", "name": "pampas_grass"}, - {"id": 18916, "synset": "giant_star_grass.n.01", "name": "giant_star_grass"}, - {"id": 18917, "synset": "orchard_grass.n.01", "name": "orchard_grass"}, - {"id": 18918, "synset": "egyptian_grass.n.01", "name": "Egyptian_grass"}, - {"id": 18919, "synset": "crabgrass.n.01", "name": "crabgrass"}, - {"id": 18920, "synset": "smooth_crabgrass.n.01", "name": "smooth_crabgrass"}, - {"id": 18921, "synset": "large_crabgrass.n.01", "name": "large_crabgrass"}, - {"id": 18922, "synset": "barnyard_grass.n.01", "name": "barnyard_grass"}, - {"id": 18923, "synset": "japanese_millet.n.01", "name": "Japanese_millet"}, - {"id": 18924, "synset": "yardgrass.n.01", "name": "yardgrass"}, - {"id": 18925, "synset": "finger_millet.n.01", "name": "finger_millet"}, - {"id": 18926, "synset": "lyme_grass.n.01", "name": "lyme_grass"}, - {"id": 18927, "synset": "wild_rye.n.01", "name": "wild_rye"}, - {"id": 18928, "synset": "giant_ryegrass.n.01", "name": "giant_ryegrass"}, - {"id": 18929, "synset": "sea_lyme_grass.n.01", "name": "sea_lyme_grass"}, - {"id": 18930, "synset": "canada_wild_rye.n.01", "name": "Canada_wild_rye"}, - {"id": 18931, "synset": "teff.n.01", "name": "teff"}, - {"id": 18932, "synset": "weeping_love_grass.n.01", "name": "weeping_love_grass"}, - {"id": 18933, "synset": "plume_grass.n.01", "name": "plume_grass"}, - {"id": 18934, "synset": "ravenna_grass.n.01", "name": "Ravenna_grass"}, - {"id": 18935, "synset": "fescue.n.01", "name": "fescue"}, - {"id": 18936, "synset": "reed_meadow_grass.n.01", "name": "reed_meadow_grass"}, - {"id": 18937, "synset": "velvet_grass.n.01", "name": "velvet_grass"}, - {"id": 18938, "synset": "creeping_soft_grass.n.01", "name": "creeping_soft_grass"}, - {"id": 18939, "synset": "barleycorn.n.01", "name": "barleycorn"}, - {"id": 18940, "synset": "barley_grass.n.01", "name": "barley_grass"}, - {"id": 18941, "synset": "little_barley.n.01", "name": "little_barley"}, - {"id": 18942, "synset": "rye_grass.n.01", "name": "rye_grass"}, - {"id": 18943, "synset": "perennial_ryegrass.n.01", "name": "perennial_ryegrass"}, - {"id": 18944, "synset": "italian_ryegrass.n.01", "name": "Italian_ryegrass"}, - {"id": 18945, "synset": "darnel.n.01", "name": "darnel"}, - {"id": 18946, "synset": "nimblewill.n.01", "name": "nimblewill"}, - {"id": 18947, "synset": "cultivated_rice.n.01", "name": "cultivated_rice"}, - {"id": 18948, "synset": "ricegrass.n.01", "name": "ricegrass"}, - {"id": 18949, "synset": "smilo.n.01", "name": "smilo"}, - {"id": 18950, "synset": "switch_grass.n.01", "name": "switch_grass"}, - {"id": 18951, "synset": "broomcorn_millet.n.01", "name": "broomcorn_millet"}, - {"id": 18952, "synset": "goose_grass.n.03", "name": "goose_grass"}, - {"id": 18953, "synset": "dallisgrass.n.01", "name": "dallisgrass"}, - {"id": 18954, "synset": "bahia_grass.n.01", "name": "Bahia_grass"}, - {"id": 18955, "synset": "knotgrass.n.01", "name": "knotgrass"}, - {"id": 18956, "synset": "fountain_grass.n.01", "name": "fountain_grass"}, - {"id": 18957, "synset": "reed_canary_grass.n.01", "name": "reed_canary_grass"}, - {"id": 18958, "synset": "canary_grass.n.01", "name": "canary_grass"}, - {"id": 18959, "synset": "timothy.n.01", "name": "timothy"}, - {"id": 18960, "synset": "bluegrass.n.01", "name": "bluegrass"}, - {"id": 18961, "synset": "meadowgrass.n.01", "name": "meadowgrass"}, - {"id": 18962, "synset": "wood_meadowgrass.n.01", "name": "wood_meadowgrass"}, - {"id": 18963, "synset": "noble_cane.n.01", "name": "noble_cane"}, - {"id": 18964, "synset": "munj.n.01", "name": "munj"}, - {"id": 18965, "synset": "broom_beard_grass.n.01", "name": "broom_beard_grass"}, - {"id": 18966, "synset": "bluestem.n.01", "name": "bluestem"}, - {"id": 18967, "synset": "rye.n.02", "name": "rye"}, - {"id": 18968, "synset": "bristlegrass.n.01", "name": "bristlegrass"}, - {"id": 18969, "synset": "giant_foxtail.n.01", "name": "giant_foxtail"}, - {"id": 18970, "synset": "yellow_bristlegrass.n.01", "name": "yellow_bristlegrass"}, - {"id": 18971, "synset": "green_bristlegrass.n.01", "name": "green_bristlegrass"}, - {"id": 18972, "synset": "siberian_millet.n.01", "name": "Siberian_millet"}, - {"id": 18973, "synset": "german_millet.n.01", "name": "German_millet"}, - {"id": 18974, "synset": "millet.n.01", "name": "millet"}, - {"id": 18975, "synset": "rattan.n.02", "name": "rattan"}, - {"id": 18976, "synset": "malacca.n.01", "name": "malacca"}, - {"id": 18977, "synset": "reed.n.01", "name": "reed"}, - {"id": 18978, "synset": "sorghum.n.01", "name": "sorghum"}, - {"id": 18979, "synset": "grain_sorghum.n.01", "name": "grain_sorghum"}, - {"id": 18980, "synset": "durra.n.01", "name": "durra"}, - {"id": 18981, "synset": "feterita.n.01", "name": "feterita"}, - {"id": 18982, "synset": "hegari.n.01", "name": "hegari"}, - {"id": 18983, "synset": "kaoliang.n.01", "name": "kaoliang"}, - {"id": 18984, "synset": "milo.n.01", "name": "milo"}, - {"id": 18985, "synset": "shallu.n.01", "name": "shallu"}, - {"id": 18986, "synset": "broomcorn.n.01", "name": "broomcorn"}, - {"id": 18987, "synset": "cordgrass.n.01", "name": "cordgrass"}, - {"id": 18988, "synset": "salt_reed_grass.n.01", "name": "salt_reed_grass"}, - {"id": 18989, "synset": "prairie_cordgrass.n.01", "name": "prairie_cordgrass"}, - {"id": 18990, "synset": "smut_grass.n.01", "name": "smut_grass"}, - {"id": 18991, "synset": "sand_dropseed.n.01", "name": "sand_dropseed"}, - {"id": 18992, "synset": "rush_grass.n.01", "name": "rush_grass"}, - {"id": 18993, "synset": "st._augustine_grass.n.01", "name": "St._Augustine_grass"}, - {"id": 18994, "synset": "grain.n.08", "name": "grain"}, - {"id": 18995, "synset": "cereal.n.01", "name": "cereal"}, - {"id": 18996, "synset": "wheat.n.01", "name": "wheat"}, - {"id": 18997, "synset": "wheat_berry.n.01", "name": "wheat_berry"}, - {"id": 18998, "synset": "durum.n.01", "name": "durum"}, - {"id": 18999, "synset": "spelt.n.01", "name": "spelt"}, - {"id": 19000, "synset": "emmer.n.01", "name": "emmer"}, - {"id": 19001, "synset": "wild_wheat.n.01", "name": "wild_wheat"}, - {"id": 19002, "synset": "corn.n.01", "name": "corn"}, - {"id": 19003, "synset": "mealie.n.01", "name": "mealie"}, - {"id": 19004, "synset": "corn.n.02", "name": "corn"}, - {"id": 19005, "synset": "dent_corn.n.01", "name": "dent_corn"}, - {"id": 19006, "synset": "flint_corn.n.01", "name": "flint_corn"}, - {"id": 19007, "synset": "popcorn.n.01", "name": "popcorn"}, - {"id": 19008, "synset": "zoysia.n.01", "name": "zoysia"}, - {"id": 19009, "synset": "manila_grass.n.01", "name": "Manila_grass"}, - {"id": 19010, "synset": "korean_lawn_grass.n.01", "name": "Korean_lawn_grass"}, - {"id": 19011, "synset": "common_bamboo.n.01", "name": "common_bamboo"}, - {"id": 19012, "synset": "giant_bamboo.n.01", "name": "giant_bamboo"}, - {"id": 19013, "synset": "umbrella_plant.n.03", "name": "umbrella_plant"}, - {"id": 19014, "synset": "chufa.n.01", "name": "chufa"}, - {"id": 19015, "synset": "galingale.n.01", "name": "galingale"}, - {"id": 19016, "synset": "nutgrass.n.01", "name": "nutgrass"}, - {"id": 19017, "synset": "sand_sedge.n.01", "name": "sand_sedge"}, - {"id": 19018, "synset": "cypress_sedge.n.01", "name": "cypress_sedge"}, - {"id": 19019, "synset": "cotton_grass.n.01", "name": "cotton_grass"}, - {"id": 19020, "synset": "common_cotton_grass.n.01", "name": "common_cotton_grass"}, - {"id": 19021, "synset": "hardstem_bulrush.n.01", "name": "hardstem_bulrush"}, - {"id": 19022, "synset": "wool_grass.n.01", "name": "wool_grass"}, - {"id": 19023, "synset": "spike_rush.n.01", "name": "spike_rush"}, - {"id": 19024, "synset": "water_chestnut.n.02", "name": "water_chestnut"}, - {"id": 19025, "synset": "needle_spike_rush.n.01", "name": "needle_spike_rush"}, - {"id": 19026, "synset": "creeping_spike_rush.n.01", "name": "creeping_spike_rush"}, - {"id": 19027, "synset": "pandanus.n.02", "name": "pandanus"}, - {"id": 19028, "synset": "textile_screw_pine.n.01", "name": "textile_screw_pine"}, - {"id": 19029, "synset": "cattail.n.01", "name": "cattail"}, - {"id": 19030, "synset": "cat's-tail.n.01", "name": "cat's-tail"}, - {"id": 19031, "synset": "bur_reed.n.01", "name": "bur_reed"}, - {"id": 19032, "synset": "grain.n.07", "name": "grain"}, - {"id": 19033, "synset": "kernel.n.02", "name": "kernel"}, - {"id": 19034, "synset": "rye.n.01", "name": "rye"}, - {"id": 19035, "synset": "gourd.n.03", "name": "gourd"}, - {"id": 19036, "synset": "pumpkin.n.01", "name": "pumpkin"}, - {"id": 19037, "synset": "squash.n.01", "name": "squash"}, - {"id": 19038, "synset": "summer_squash.n.01", "name": "summer_squash"}, - {"id": 19039, "synset": "yellow_squash.n.01", "name": "yellow_squash"}, - {"id": 19040, "synset": "marrow.n.02", "name": "marrow"}, - {"id": 19041, "synset": "zucchini.n.01", "name": "zucchini"}, - {"id": 19042, "synset": "cocozelle.n.01", "name": "cocozelle"}, - {"id": 19043, "synset": "cymling.n.01", "name": "cymling"}, - {"id": 19044, "synset": "spaghetti_squash.n.01", "name": "spaghetti_squash"}, - {"id": 19045, "synset": "winter_squash.n.01", "name": "winter_squash"}, - {"id": 19046, "synset": "acorn_squash.n.01", "name": "acorn_squash"}, - {"id": 19047, "synset": "hubbard_squash.n.01", "name": "hubbard_squash"}, - {"id": 19048, "synset": "turban_squash.n.01", "name": "turban_squash"}, - {"id": 19049, "synset": "buttercup_squash.n.01", "name": "buttercup_squash"}, - {"id": 19050, "synset": "butternut_squash.n.01", "name": "butternut_squash"}, - {"id": 19051, "synset": "winter_crookneck.n.01", "name": "winter_crookneck"}, - {"id": 19052, "synset": "cushaw.n.01", "name": "cushaw"}, - {"id": 19053, "synset": "prairie_gourd.n.02", "name": "prairie_gourd"}, - {"id": 19054, "synset": "prairie_gourd.n.01", "name": "prairie_gourd"}, - {"id": 19055, "synset": "bryony.n.01", "name": "bryony"}, - {"id": 19056, "synset": "white_bryony.n.01", "name": "white_bryony"}, - {"id": 19057, "synset": "sweet_melon.n.01", "name": "sweet_melon"}, - {"id": 19058, "synset": "cantaloupe.n.01", "name": "cantaloupe"}, - {"id": 19059, "synset": "winter_melon.n.01", "name": "winter_melon"}, - {"id": 19060, "synset": "net_melon.n.01", "name": "net_melon"}, - {"id": 19061, "synset": "cucumber.n.01", "name": "cucumber"}, - {"id": 19062, "synset": "squirting_cucumber.n.01", "name": "squirting_cucumber"}, - {"id": 19063, "synset": "bottle_gourd.n.01", "name": "bottle_gourd"}, - {"id": 19064, "synset": "luffa.n.02", "name": "luffa"}, - {"id": 19065, "synset": "loofah.n.02", "name": "loofah"}, - {"id": 19066, "synset": "angled_loofah.n.01", "name": "angled_loofah"}, - {"id": 19067, "synset": "loofa.n.01", "name": "loofa"}, - {"id": 19068, "synset": "balsam_apple.n.01", "name": "balsam_apple"}, - {"id": 19069, "synset": "balsam_pear.n.01", "name": "balsam_pear"}, - {"id": 19070, "synset": "lobelia.n.01", "name": "lobelia"}, - {"id": 19071, "synset": "water_lobelia.n.01", "name": "water_lobelia"}, - {"id": 19072, "synset": "mallow.n.01", "name": "mallow"}, - {"id": 19073, "synset": "musk_mallow.n.02", "name": "musk_mallow"}, - {"id": 19074, "synset": "common_mallow.n.01", "name": "common_mallow"}, - {"id": 19075, "synset": "okra.n.02", "name": "okra"}, - {"id": 19076, "synset": "okra.n.01", "name": "okra"}, - {"id": 19077, "synset": "abelmosk.n.01", "name": "abelmosk"}, - {"id": 19078, "synset": "flowering_maple.n.01", "name": "flowering_maple"}, - {"id": 19079, "synset": "velvetleaf.n.02", "name": "velvetleaf"}, - {"id": 19080, "synset": "hollyhock.n.02", "name": "hollyhock"}, - {"id": 19081, "synset": "rose_mallow.n.02", "name": "rose_mallow"}, - {"id": 19082, "synset": "althea.n.01", "name": "althea"}, - {"id": 19083, "synset": "marsh_mallow.n.01", "name": "marsh_mallow"}, - {"id": 19084, "synset": "poppy_mallow.n.01", "name": "poppy_mallow"}, - {"id": 19085, "synset": "fringed_poppy_mallow.n.01", "name": "fringed_poppy_mallow"}, - {"id": 19086, "synset": "purple_poppy_mallow.n.01", "name": "purple_poppy_mallow"}, - {"id": 19087, "synset": "clustered_poppy_mallow.n.01", "name": "clustered_poppy_mallow"}, - {"id": 19088, "synset": "sea_island_cotton.n.01", "name": "sea_island_cotton"}, - {"id": 19089, "synset": "levant_cotton.n.01", "name": "Levant_cotton"}, - {"id": 19090, "synset": "upland_cotton.n.01", "name": "upland_cotton"}, - {"id": 19091, "synset": "peruvian_cotton.n.01", "name": "Peruvian_cotton"}, - {"id": 19092, "synset": "wild_cotton.n.01", "name": "wild_cotton"}, - {"id": 19093, "synset": "kenaf.n.02", "name": "kenaf"}, - {"id": 19094, "synset": "sorrel_tree.n.02", "name": "sorrel_tree"}, - {"id": 19095, "synset": "rose_mallow.n.01", "name": "rose_mallow"}, - {"id": 19096, "synset": "cotton_rose.n.01", "name": "cotton_rose"}, - {"id": 19097, "synset": "roselle.n.01", "name": "roselle"}, - {"id": 19098, "synset": "mahoe.n.01", "name": "mahoe"}, - {"id": 19099, "synset": "flower-of-an-hour.n.01", "name": "flower-of-an-hour"}, - {"id": 19100, "synset": "lacebark.n.01", "name": "lacebark"}, - {"id": 19101, "synset": "wild_hollyhock.n.02", "name": "wild_hollyhock"}, - {"id": 19102, "synset": "mountain_hollyhock.n.01", "name": "mountain_hollyhock"}, - {"id": 19103, "synset": "seashore_mallow.n.01", "name": "seashore_mallow"}, - {"id": 19104, "synset": "salt_marsh_mallow.n.01", "name": "salt_marsh_mallow"}, - {"id": 19105, "synset": "chaparral_mallow.n.01", "name": "chaparral_mallow"}, - {"id": 19106, "synset": "malope.n.01", "name": "malope"}, - {"id": 19107, "synset": "false_mallow.n.02", "name": "false_mallow"}, - {"id": 19108, "synset": "waxmallow.n.01", "name": "waxmallow"}, - {"id": 19109, "synset": "glade_mallow.n.01", "name": "glade_mallow"}, - {"id": 19110, "synset": "pavonia.n.01", "name": "pavonia"}, - {"id": 19111, "synset": "ribbon_tree.n.01", "name": "ribbon_tree"}, - {"id": 19112, "synset": "bush_hibiscus.n.01", "name": "bush_hibiscus"}, - {"id": 19113, "synset": "virginia_mallow.n.01", "name": "Virginia_mallow"}, - {"id": 19114, "synset": "queensland_hemp.n.01", "name": "Queensland_hemp"}, - {"id": 19115, "synset": "indian_mallow.n.01", "name": "Indian_mallow"}, - {"id": 19116, "synset": "checkerbloom.n.01", "name": "checkerbloom"}, - {"id": 19117, "synset": "globe_mallow.n.01", "name": "globe_mallow"}, - {"id": 19118, "synset": "prairie_mallow.n.01", "name": "prairie_mallow"}, - {"id": 19119, "synset": "tulipwood_tree.n.01", "name": "tulipwood_tree"}, - {"id": 19120, "synset": "portia_tree.n.01", "name": "portia_tree"}, - {"id": 19121, "synset": "red_silk-cotton_tree.n.01", "name": "red_silk-cotton_tree"}, - {"id": 19122, "synset": "cream-of-tartar_tree.n.01", "name": "cream-of-tartar_tree"}, - {"id": 19123, "synset": "baobab.n.01", "name": "baobab"}, - {"id": 19124, "synset": "kapok.n.02", "name": "kapok"}, - {"id": 19125, "synset": "durian.n.01", "name": "durian"}, - {"id": 19126, "synset": "montezuma.n.01", "name": "Montezuma"}, - {"id": 19127, "synset": "shaving-brush_tree.n.01", "name": "shaving-brush_tree"}, - {"id": 19128, "synset": "quandong.n.03", "name": "quandong"}, - {"id": 19129, "synset": "quandong.n.02", "name": "quandong"}, - {"id": 19130, "synset": "makomako.n.01", "name": "makomako"}, - {"id": 19131, "synset": "jamaican_cherry.n.01", "name": "Jamaican_cherry"}, - {"id": 19132, "synset": "breakax.n.01", "name": "breakax"}, - {"id": 19133, "synset": "sterculia.n.01", "name": "sterculia"}, - {"id": 19134, "synset": "panama_tree.n.01", "name": "Panama_tree"}, - {"id": 19135, "synset": "kalumpang.n.01", "name": "kalumpang"}, - {"id": 19136, "synset": "bottle-tree.n.01", "name": "bottle-tree"}, - {"id": 19137, "synset": "flame_tree.n.04", "name": "flame_tree"}, - {"id": 19138, "synset": "flame_tree.n.03", "name": "flame_tree"}, - {"id": 19139, "synset": "kurrajong.n.01", "name": "kurrajong"}, - {"id": 19140, "synset": "queensland_bottletree.n.01", "name": "Queensland_bottletree"}, - {"id": 19141, "synset": "kola.n.01", "name": "kola"}, - {"id": 19142, "synset": "kola_nut.n.01", "name": "kola_nut"}, - {"id": 19143, "synset": "chinese_parasol_tree.n.01", "name": "Chinese_parasol_tree"}, - {"id": 19144, "synset": "flannelbush.n.01", "name": "flannelbush"}, - {"id": 19145, "synset": "screw_tree.n.01", "name": "screw_tree"}, - {"id": 19146, "synset": "nut-leaved_screw_tree.n.01", "name": "nut-leaved_screw_tree"}, - {"id": 19147, "synset": "red_beech.n.02", "name": "red_beech"}, - {"id": 19148, "synset": "looking_glass_tree.n.01", "name": "looking_glass_tree"}, - {"id": 19149, "synset": "looking-glass_plant.n.01", "name": "looking-glass_plant"}, - {"id": 19150, "synset": "honey_bell.n.01", "name": "honey_bell"}, - {"id": 19151, "synset": "mayeng.n.01", "name": "mayeng"}, - {"id": 19152, "synset": "silver_tree.n.02", "name": "silver_tree"}, - {"id": 19153, "synset": "cacao.n.01", "name": "cacao"}, - {"id": 19154, "synset": "obeche.n.02", "name": "obeche"}, - {"id": 19155, "synset": "linden.n.02", "name": "linden"}, - {"id": 19156, "synset": "american_basswood.n.01", "name": "American_basswood"}, - {"id": 19157, "synset": "small-leaved_linden.n.01", "name": "small-leaved_linden"}, - {"id": 19158, "synset": "white_basswood.n.01", "name": "white_basswood"}, - {"id": 19159, "synset": "japanese_linden.n.01", "name": "Japanese_linden"}, - {"id": 19160, "synset": "silver_lime.n.01", "name": "silver_lime"}, - {"id": 19161, "synset": "corchorus.n.01", "name": "corchorus"}, - {"id": 19162, "synset": "african_hemp.n.02", "name": "African_hemp"}, - {"id": 19163, "synset": "herb.n.01", "name": "herb"}, - {"id": 19164, "synset": "protea.n.01", "name": "protea"}, - {"id": 19165, "synset": "honeypot.n.01", "name": "honeypot"}, - {"id": 19166, "synset": "honeyflower.n.02", "name": "honeyflower"}, - {"id": 19167, "synset": "banksia.n.01", "name": "banksia"}, - {"id": 19168, "synset": "honeysuckle.n.02", "name": "honeysuckle"}, - {"id": 19169, "synset": "smoke_bush.n.02", "name": "smoke_bush"}, - {"id": 19170, "synset": "chilean_firebush.n.01", "name": "Chilean_firebush"}, - {"id": 19171, "synset": "chilean_nut.n.01", "name": "Chilean_nut"}, - {"id": 19172, "synset": "grevillea.n.01", "name": "grevillea"}, - {"id": 19173, "synset": "red-flowered_silky_oak.n.01", "name": "red-flowered_silky_oak"}, - {"id": 19174, "synset": "silky_oak.n.01", "name": "silky_oak"}, - {"id": 19175, "synset": "beefwood.n.05", "name": "beefwood"}, - {"id": 19176, "synset": "cushion_flower.n.01", "name": "cushion_flower"}, - {"id": 19177, "synset": "rewa-rewa.n.01", "name": "rewa-rewa"}, - {"id": 19178, "synset": "honeyflower.n.01", "name": "honeyflower"}, - {"id": 19179, "synset": "silver_tree.n.01", "name": "silver_tree"}, - {"id": 19180, "synset": "lomatia.n.01", "name": "lomatia"}, - {"id": 19181, "synset": "macadamia.n.01", "name": "macadamia"}, - {"id": 19182, "synset": "macadamia_integrifolia.n.01", "name": "Macadamia_integrifolia"}, - {"id": 19183, "synset": "macadamia_nut.n.01", "name": "macadamia_nut"}, - {"id": 19184, "synset": "queensland_nut.n.01", "name": "Queensland_nut"}, - {"id": 19185, "synset": "prickly_ash.n.02", "name": "prickly_ash"}, - {"id": 19186, "synset": "geebung.n.01", "name": "geebung"}, - {"id": 19187, "synset": "wheel_tree.n.01", "name": "wheel_tree"}, - {"id": 19188, "synset": "scrub_beefwood.n.01", "name": "scrub_beefwood"}, - {"id": 19189, "synset": "waratah.n.02", "name": "waratah"}, - {"id": 19190, "synset": "waratah.n.01", "name": "waratah"}, - {"id": 19191, "synset": "casuarina.n.01", "name": "casuarina"}, - {"id": 19192, "synset": "she-oak.n.01", "name": "she-oak"}, - {"id": 19193, "synset": "beefwood.n.03", "name": "beefwood"}, - {"id": 19194, "synset": "australian_pine.n.01", "name": "Australian_pine"}, - {"id": 19195, "synset": "heath.n.01", "name": "heath"}, - {"id": 19196, "synset": "tree_heath.n.02", "name": "tree_heath"}, - {"id": 19197, "synset": "briarroot.n.01", "name": "briarroot"}, - {"id": 19198, "synset": "winter_heath.n.01", "name": "winter_heath"}, - {"id": 19199, "synset": "bell_heather.n.02", "name": "bell_heather"}, - {"id": 19200, "synset": "cornish_heath.n.01", "name": "Cornish_heath"}, - {"id": 19201, "synset": "spanish_heath.n.01", "name": "Spanish_heath"}, - {"id": 19202, "synset": "prince-of-wales'-heath.n.01", "name": "Prince-of-Wales'-heath"}, - {"id": 19203, "synset": "bog_rosemary.n.01", "name": "bog_rosemary"}, - {"id": 19204, "synset": "marsh_andromeda.n.01", "name": "marsh_andromeda"}, - {"id": 19205, "synset": "madrona.n.01", "name": "madrona"}, - {"id": 19206, "synset": "strawberry_tree.n.01", "name": "strawberry_tree"}, - {"id": 19207, "synset": "bearberry.n.03", "name": "bearberry"}, - {"id": 19208, "synset": "alpine_bearberry.n.01", "name": "alpine_bearberry"}, - {"id": 19209, "synset": "heartleaf_manzanita.n.01", "name": "heartleaf_manzanita"}, - {"id": 19210, "synset": "parry_manzanita.n.01", "name": "Parry_manzanita"}, - {"id": 19211, "synset": "spike_heath.n.01", "name": "spike_heath"}, - {"id": 19212, "synset": "bryanthus.n.01", "name": "bryanthus"}, - {"id": 19213, "synset": "leatherleaf.n.02", "name": "leatherleaf"}, - {"id": 19214, "synset": "connemara_heath.n.01", "name": "Connemara_heath"}, - {"id": 19215, "synset": "trailing_arbutus.n.01", "name": "trailing_arbutus"}, - {"id": 19216, "synset": "creeping_snowberry.n.01", "name": "creeping_snowberry"}, - {"id": 19217, "synset": "salal.n.01", "name": "salal"}, - {"id": 19218, "synset": "huckleberry.n.02", "name": "huckleberry"}, - {"id": 19219, "synset": "black_huckleberry.n.01", "name": "black_huckleberry"}, - {"id": 19220, "synset": "dangleberry.n.01", "name": "dangleberry"}, - {"id": 19221, "synset": "box_huckleberry.n.01", "name": "box_huckleberry"}, - {"id": 19222, "synset": "kalmia.n.01", "name": "kalmia"}, - {"id": 19223, "synset": "mountain_laurel.n.01", "name": "mountain_laurel"}, - {"id": 19224, "synset": "swamp_laurel.n.01", "name": "swamp_laurel"}, - {"id": 19225, "synset": "trapper's_tea.n.01", "name": "trapper's_tea"}, - {"id": 19226, "synset": "wild_rosemary.n.01", "name": "wild_rosemary"}, - {"id": 19227, "synset": "sand_myrtle.n.01", "name": "sand_myrtle"}, - {"id": 19228, "synset": "leucothoe.n.01", "name": "leucothoe"}, - {"id": 19229, "synset": "dog_laurel.n.01", "name": "dog_laurel"}, - {"id": 19230, "synset": "sweet_bells.n.01", "name": "sweet_bells"}, - {"id": 19231, "synset": "alpine_azalea.n.01", "name": "alpine_azalea"}, - {"id": 19232, "synset": "staggerbush.n.01", "name": "staggerbush"}, - {"id": 19233, "synset": "maleberry.n.01", "name": "maleberry"}, - {"id": 19234, "synset": "fetterbush.n.02", "name": "fetterbush"}, - {"id": 19235, "synset": "false_azalea.n.01", "name": "false_azalea"}, - {"id": 19236, "synset": "minniebush.n.01", "name": "minniebush"}, - {"id": 19237, "synset": "sorrel_tree.n.01", "name": "sorrel_tree"}, - {"id": 19238, "synset": "mountain_heath.n.01", "name": "mountain_heath"}, - {"id": 19239, "synset": "purple_heather.n.01", "name": "purple_heather"}, - {"id": 19240, "synset": "fetterbush.n.01", "name": "fetterbush"}, - {"id": 19241, "synset": "rhododendron.n.01", "name": "rhododendron"}, - {"id": 19242, "synset": "coast_rhododendron.n.01", "name": "coast_rhododendron"}, - {"id": 19243, "synset": "rosebay.n.01", "name": "rosebay"}, - {"id": 19244, "synset": "swamp_azalea.n.01", "name": "swamp_azalea"}, - {"id": 19245, "synset": "azalea.n.01", "name": "azalea"}, - {"id": 19246, "synset": "cranberry.n.01", "name": "cranberry"}, - {"id": 19247, "synset": "american_cranberry.n.01", "name": "American_cranberry"}, - {"id": 19248, "synset": "european_cranberry.n.01", "name": "European_cranberry"}, - {"id": 19249, "synset": "blueberry.n.01", "name": "blueberry"}, - {"id": 19250, "synset": "farkleberry.n.01", "name": "farkleberry"}, - {"id": 19251, "synset": "low-bush_blueberry.n.01", "name": "low-bush_blueberry"}, - {"id": 19252, "synset": "rabbiteye_blueberry.n.01", "name": "rabbiteye_blueberry"}, - {"id": 19253, "synset": "dwarf_bilberry.n.01", "name": "dwarf_bilberry"}, - {"id": 19254, "synset": "evergreen_blueberry.n.01", "name": "evergreen_blueberry"}, - {"id": 19255, "synset": "evergreen_huckleberry.n.01", "name": "evergreen_huckleberry"}, - {"id": 19256, "synset": "bilberry.n.02", "name": "bilberry"}, - {"id": 19257, "synset": "bilberry.n.01", "name": "bilberry"}, - {"id": 19258, "synset": "bog_bilberry.n.01", "name": "bog_bilberry"}, - {"id": 19259, "synset": "dryland_blueberry.n.01", "name": "dryland_blueberry"}, - {"id": 19260, "synset": "grouseberry.n.01", "name": "grouseberry"}, - {"id": 19261, "synset": "deerberry.n.01", "name": "deerberry"}, - {"id": 19262, "synset": "cowberry.n.01", "name": "cowberry"}, - {"id": 19263, "synset": "diapensia.n.01", "name": "diapensia"}, - {"id": 19264, "synset": "galax.n.01", "name": "galax"}, - {"id": 19265, "synset": "pyxie.n.01", "name": "pyxie"}, - {"id": 19266, "synset": "shortia.n.01", "name": "shortia"}, - {"id": 19267, "synset": "oconee_bells.n.01", "name": "oconee_bells"}, - {"id": 19268, "synset": "australian_heath.n.01", "name": "Australian_heath"}, - {"id": 19269, "synset": "epacris.n.01", "name": "epacris"}, - {"id": 19270, "synset": "common_heath.n.02", "name": "common_heath"}, - {"id": 19271, "synset": "common_heath.n.01", "name": "common_heath"}, - {"id": 19272, "synset": "port_jackson_heath.n.01", "name": "Port_Jackson_heath"}, - {"id": 19273, "synset": "native_cranberry.n.01", "name": "native_cranberry"}, - {"id": 19274, "synset": "pink_fivecorner.n.01", "name": "pink_fivecorner"}, - {"id": 19275, "synset": "wintergreen.n.01", "name": "wintergreen"}, - {"id": 19276, "synset": "false_wintergreen.n.01", "name": "false_wintergreen"}, - {"id": 19277, "synset": "lesser_wintergreen.n.01", "name": "lesser_wintergreen"}, - {"id": 19278, "synset": "wild_lily_of_the_valley.n.02", "name": "wild_lily_of_the_valley"}, - {"id": 19279, "synset": "wild_lily_of_the_valley.n.01", "name": "wild_lily_of_the_valley"}, - {"id": 19280, "synset": "pipsissewa.n.01", "name": "pipsissewa"}, - {"id": 19281, "synset": "love-in-winter.n.01", "name": "love-in-winter"}, - {"id": 19282, "synset": "one-flowered_wintergreen.n.01", "name": "one-flowered_wintergreen"}, - {"id": 19283, "synset": "indian_pipe.n.01", "name": "Indian_pipe"}, - {"id": 19284, "synset": "pinesap.n.01", "name": "pinesap"}, - {"id": 19285, "synset": "beech.n.01", "name": "beech"}, - {"id": 19286, "synset": "common_beech.n.01", "name": "common_beech"}, - {"id": 19287, "synset": "copper_beech.n.01", "name": "copper_beech"}, - {"id": 19288, "synset": "american_beech.n.01", "name": "American_beech"}, - {"id": 19289, "synset": "weeping_beech.n.01", "name": "weeping_beech"}, - {"id": 19290, "synset": "japanese_beech.n.01", "name": "Japanese_beech"}, - {"id": 19291, "synset": "chestnut.n.02", "name": "chestnut"}, - {"id": 19292, "synset": "american_chestnut.n.01", "name": "American_chestnut"}, - {"id": 19293, "synset": "european_chestnut.n.01", "name": "European_chestnut"}, - {"id": 19294, "synset": "chinese_chestnut.n.01", "name": "Chinese_chestnut"}, - {"id": 19295, "synset": "japanese_chestnut.n.01", "name": "Japanese_chestnut"}, - {"id": 19296, "synset": "allegheny_chinkapin.n.01", "name": "Allegheny_chinkapin"}, - {"id": 19297, "synset": "ozark_chinkapin.n.01", "name": "Ozark_chinkapin"}, - {"id": 19298, "synset": "oak_chestnut.n.01", "name": "oak_chestnut"}, - {"id": 19299, "synset": "giant_chinkapin.n.01", "name": "giant_chinkapin"}, - {"id": 19300, "synset": "dwarf_golden_chinkapin.n.01", "name": "dwarf_golden_chinkapin"}, - {"id": 19301, "synset": "tanbark_oak.n.01", "name": "tanbark_oak"}, - {"id": 19302, "synset": "japanese_oak.n.02", "name": "Japanese_oak"}, - {"id": 19303, "synset": "southern_beech.n.01", "name": "southern_beech"}, - {"id": 19304, "synset": "myrtle_beech.n.01", "name": "myrtle_beech"}, - {"id": 19305, "synset": "coigue.n.01", "name": "Coigue"}, - {"id": 19306, "synset": "new_zealand_beech.n.01", "name": "New_Zealand_beech"}, - {"id": 19307, "synset": "silver_beech.n.01", "name": "silver_beech"}, - {"id": 19308, "synset": "roble_beech.n.01", "name": "roble_beech"}, - {"id": 19309, "synset": "rauli_beech.n.01", "name": "rauli_beech"}, - {"id": 19310, "synset": "black_beech.n.01", "name": "black_beech"}, - {"id": 19311, "synset": "hard_beech.n.01", "name": "hard_beech"}, - {"id": 19312, "synset": "acorn.n.01", "name": "acorn"}, - {"id": 19313, "synset": "cupule.n.01", "name": "cupule"}, - {"id": 19314, "synset": "oak.n.02", "name": "oak"}, - {"id": 19315, "synset": "live_oak.n.01", "name": "live_oak"}, - {"id": 19316, "synset": "coast_live_oak.n.01", "name": "coast_live_oak"}, - {"id": 19317, "synset": "white_oak.n.01", "name": "white_oak"}, - {"id": 19318, "synset": "american_white_oak.n.01", "name": "American_white_oak"}, - {"id": 19319, "synset": "arizona_white_oak.n.01", "name": "Arizona_white_oak"}, - {"id": 19320, "synset": "swamp_white_oak.n.01", "name": "swamp_white_oak"}, - {"id": 19321, "synset": "european_turkey_oak.n.01", "name": "European_turkey_oak"}, - {"id": 19322, "synset": "canyon_oak.n.01", "name": "canyon_oak"}, - {"id": 19323, "synset": "scarlet_oak.n.01", "name": "scarlet_oak"}, - {"id": 19324, "synset": "jack_oak.n.02", "name": "jack_oak"}, - {"id": 19325, "synset": "red_oak.n.01", "name": "red_oak"}, - {"id": 19326, "synset": "southern_red_oak.n.01", "name": "southern_red_oak"}, - {"id": 19327, "synset": "oregon_white_oak.n.01", "name": "Oregon_white_oak"}, - {"id": 19328, "synset": "holm_oak.n.02", "name": "holm_oak"}, - {"id": 19329, "synset": "bear_oak.n.01", "name": "bear_oak"}, - {"id": 19330, "synset": "shingle_oak.n.01", "name": "shingle_oak"}, - {"id": 19331, "synset": "bluejack_oak.n.01", "name": "bluejack_oak"}, - {"id": 19332, "synset": "california_black_oak.n.01", "name": "California_black_oak"}, - {"id": 19333, "synset": "american_turkey_oak.n.01", "name": "American_turkey_oak"}, - {"id": 19334, "synset": "laurel_oak.n.01", "name": "laurel_oak"}, - {"id": 19335, "synset": "california_white_oak.n.01", "name": "California_white_oak"}, - {"id": 19336, "synset": "overcup_oak.n.01", "name": "overcup_oak"}, - {"id": 19337, "synset": "bur_oak.n.01", "name": "bur_oak"}, - {"id": 19338, "synset": "scrub_oak.n.01", "name": "scrub_oak"}, - {"id": 19339, "synset": "blackjack_oak.n.01", "name": "blackjack_oak"}, - {"id": 19340, "synset": "swamp_chestnut_oak.n.01", "name": "swamp_chestnut_oak"}, - {"id": 19341, "synset": "japanese_oak.n.01", "name": "Japanese_oak"}, - {"id": 19342, "synset": "chestnut_oak.n.01", "name": "chestnut_oak"}, - {"id": 19343, "synset": "chinquapin_oak.n.01", "name": "chinquapin_oak"}, - {"id": 19344, "synset": "myrtle_oak.n.01", "name": "myrtle_oak"}, - {"id": 19345, "synset": "water_oak.n.01", "name": "water_oak"}, - {"id": 19346, "synset": "nuttall_oak.n.01", "name": "Nuttall_oak"}, - {"id": 19347, "synset": "durmast.n.01", "name": "durmast"}, - {"id": 19348, "synset": "basket_oak.n.01", "name": "basket_oak"}, - {"id": 19349, "synset": "pin_oak.n.01", "name": "pin_oak"}, - {"id": 19350, "synset": "willow_oak.n.01", "name": "willow_oak"}, - {"id": 19351, "synset": "dwarf_chinkapin_oak.n.01", "name": "dwarf_chinkapin_oak"}, - {"id": 19352, "synset": "common_oak.n.01", "name": "common_oak"}, - {"id": 19353, "synset": "northern_red_oak.n.01", "name": "northern_red_oak"}, - {"id": 19354, "synset": "shumard_oak.n.01", "name": "Shumard_oak"}, - {"id": 19355, "synset": "post_oak.n.01", "name": "post_oak"}, - {"id": 19356, "synset": "cork_oak.n.01", "name": "cork_oak"}, - {"id": 19357, "synset": "spanish_oak.n.01", "name": "Spanish_oak"}, - {"id": 19358, "synset": "huckleberry_oak.n.01", "name": "huckleberry_oak"}, - {"id": 19359, "synset": "chinese_cork_oak.n.01", "name": "Chinese_cork_oak"}, - {"id": 19360, "synset": "black_oak.n.01", "name": "black_oak"}, - {"id": 19361, "synset": "southern_live_oak.n.01", "name": "southern_live_oak"}, - {"id": 19362, "synset": "interior_live_oak.n.01", "name": "interior_live_oak"}, - {"id": 19363, "synset": "mast.n.02", "name": "mast"}, - {"id": 19364, "synset": "birch.n.02", "name": "birch"}, - {"id": 19365, "synset": "yellow_birch.n.01", "name": "yellow_birch"}, - {"id": 19366, "synset": "american_white_birch.n.01", "name": "American_white_birch"}, - {"id": 19367, "synset": "grey_birch.n.01", "name": "grey_birch"}, - {"id": 19368, "synset": "silver_birch.n.01", "name": "silver_birch"}, - {"id": 19369, "synset": "downy_birch.n.01", "name": "downy_birch"}, - {"id": 19370, "synset": "black_birch.n.02", "name": "black_birch"}, - {"id": 19371, "synset": "sweet_birch.n.01", "name": "sweet_birch"}, - {"id": 19372, "synset": "yukon_white_birch.n.01", "name": "Yukon_white_birch"}, - {"id": 19373, "synset": "swamp_birch.n.01", "name": "swamp_birch"}, - {"id": 19374, "synset": "newfoundland_dwarf_birch.n.01", "name": "Newfoundland_dwarf_birch"}, - {"id": 19375, "synset": "alder.n.02", "name": "alder"}, - {"id": 19376, "synset": "common_alder.n.01", "name": "common_alder"}, - {"id": 19377, "synset": "grey_alder.n.01", "name": "grey_alder"}, - {"id": 19378, "synset": "seaside_alder.n.01", "name": "seaside_alder"}, - {"id": 19379, "synset": "white_alder.n.01", "name": "white_alder"}, - {"id": 19380, "synset": "red_alder.n.01", "name": "red_alder"}, - {"id": 19381, "synset": "speckled_alder.n.01", "name": "speckled_alder"}, - {"id": 19382, "synset": "smooth_alder.n.01", "name": "smooth_alder"}, - {"id": 19383, "synset": "green_alder.n.02", "name": "green_alder"}, - {"id": 19384, "synset": "green_alder.n.01", "name": "green_alder"}, - {"id": 19385, "synset": "hornbeam.n.01", "name": "hornbeam"}, - {"id": 19386, "synset": "european_hornbeam.n.01", "name": "European_hornbeam"}, - {"id": 19387, "synset": "american_hornbeam.n.01", "name": "American_hornbeam"}, - {"id": 19388, "synset": "hop_hornbeam.n.01", "name": "hop_hornbeam"}, - {"id": 19389, "synset": "old_world_hop_hornbeam.n.01", "name": "Old_World_hop_hornbeam"}, - {"id": 19390, "synset": "eastern_hop_hornbeam.n.01", "name": "Eastern_hop_hornbeam"}, - {"id": 19391, "synset": "hazelnut.n.01", "name": "hazelnut"}, - {"id": 19392, "synset": "american_hazel.n.01", "name": "American_hazel"}, - {"id": 19393, "synset": "cobnut.n.01", "name": "cobnut"}, - {"id": 19394, "synset": "beaked_hazelnut.n.01", "name": "beaked_hazelnut"}, - {"id": 19395, "synset": "centaury.n.01", "name": "centaury"}, - {"id": 19396, "synset": "rosita.n.01", "name": "rosita"}, - {"id": 19397, "synset": "lesser_centaury.n.01", "name": "lesser_centaury"}, - {"id": 19398, "synset": "seaside_centaury.n.01", "name": "seaside_centaury"}, - {"id": 19399, "synset": "slender_centaury.n.01", "name": "slender_centaury"}, - {"id": 19400, "synset": "prairie_gentian.n.01", "name": "prairie_gentian"}, - {"id": 19401, "synset": "persian_violet.n.01", "name": "Persian_violet"}, - {"id": 19402, "synset": "columbo.n.01", "name": "columbo"}, - {"id": 19403, "synset": "gentian.n.01", "name": "gentian"}, - {"id": 19404, "synset": "gentianella.n.02", "name": "gentianella"}, - {"id": 19405, "synset": "closed_gentian.n.02", "name": "closed_gentian"}, - {"id": 19406, "synset": "explorer's_gentian.n.01", "name": "explorer's_gentian"}, - {"id": 19407, "synset": "closed_gentian.n.01", "name": "closed_gentian"}, - {"id": 19408, "synset": "great_yellow_gentian.n.01", "name": "great_yellow_gentian"}, - {"id": 19409, "synset": "marsh_gentian.n.01", "name": "marsh_gentian"}, - {"id": 19410, "synset": "soapwort_gentian.n.01", "name": "soapwort_gentian"}, - {"id": 19411, "synset": "striped_gentian.n.01", "name": "striped_gentian"}, - {"id": 19412, "synset": "agueweed.n.01", "name": "agueweed"}, - {"id": 19413, "synset": "felwort.n.01", "name": "felwort"}, - {"id": 19414, "synset": "fringed_gentian.n.01", "name": "fringed_gentian"}, - {"id": 19415, "synset": "gentianopsis_crinita.n.01", "name": "Gentianopsis_crinita"}, - {"id": 19416, "synset": "gentianopsis_detonsa.n.01", "name": "Gentianopsis_detonsa"}, - {"id": 19417, "synset": "gentianopsid_procera.n.01", "name": "Gentianopsid_procera"}, - {"id": 19418, "synset": "gentianopsis_thermalis.n.01", "name": "Gentianopsis_thermalis"}, - {"id": 19419, "synset": "tufted_gentian.n.01", "name": "tufted_gentian"}, - {"id": 19420, "synset": "spurred_gentian.n.01", "name": "spurred_gentian"}, - {"id": 19421, "synset": "sabbatia.n.01", "name": "sabbatia"}, - {"id": 19422, "synset": "toothbrush_tree.n.01", "name": "toothbrush_tree"}, - {"id": 19423, "synset": "olive_tree.n.01", "name": "olive_tree"}, - {"id": 19424, "synset": "olive.n.02", "name": "olive"}, - {"id": 19425, "synset": "olive.n.01", "name": "olive"}, - {"id": 19426, "synset": "black_maire.n.01", "name": "black_maire"}, - {"id": 19427, "synset": "white_maire.n.01", "name": "white_maire"}, - {"id": 19428, "synset": "fringe_tree.n.01", "name": "fringe_tree"}, - {"id": 19429, "synset": "fringe_bush.n.01", "name": "fringe_bush"}, - {"id": 19430, "synset": "forestiera.n.01", "name": "forestiera"}, - {"id": 19431, "synset": "forsythia.n.01", "name": "forsythia"}, - {"id": 19432, "synset": "ash.n.02", "name": "ash"}, - {"id": 19433, "synset": "white_ash.n.02", "name": "white_ash"}, - {"id": 19434, "synset": "swamp_ash.n.01", "name": "swamp_ash"}, - {"id": 19435, "synset": "flowering_ash.n.03", "name": "flowering_ash"}, - {"id": 19436, "synset": "european_ash.n.01", "name": "European_ash"}, - {"id": 19437, "synset": "oregon_ash.n.01", "name": "Oregon_ash"}, - {"id": 19438, "synset": "black_ash.n.01", "name": "black_ash"}, - {"id": 19439, "synset": "manna_ash.n.01", "name": "manna_ash"}, - {"id": 19440, "synset": "red_ash.n.01", "name": "red_ash"}, - {"id": 19441, "synset": "green_ash.n.01", "name": "green_ash"}, - {"id": 19442, "synset": "blue_ash.n.01", "name": "blue_ash"}, - {"id": 19443, "synset": "mountain_ash.n.03", "name": "mountain_ash"}, - {"id": 19444, "synset": "pumpkin_ash.n.01", "name": "pumpkin_ash"}, - {"id": 19445, "synset": "arizona_ash.n.01", "name": "Arizona_ash"}, - {"id": 19446, "synset": "jasmine.n.01", "name": "jasmine"}, - {"id": 19447, "synset": "primrose_jasmine.n.01", "name": "primrose_jasmine"}, - {"id": 19448, "synset": "winter_jasmine.n.01", "name": "winter_jasmine"}, - {"id": 19449, "synset": "common_jasmine.n.01", "name": "common_jasmine"}, - {"id": 19450, "synset": "privet.n.01", "name": "privet"}, - {"id": 19451, "synset": "amur_privet.n.01", "name": "Amur_privet"}, - {"id": 19452, "synset": "japanese_privet.n.01", "name": "Japanese_privet"}, - {"id": 19453, "synset": "ligustrum_obtusifolium.n.01", "name": "Ligustrum_obtusifolium"}, - {"id": 19454, "synset": "common_privet.n.01", "name": "common_privet"}, - {"id": 19455, "synset": "devilwood.n.01", "name": "devilwood"}, - {"id": 19456, "synset": "mock_privet.n.01", "name": "mock_privet"}, - {"id": 19457, "synset": "lilac.n.01", "name": "lilac"}, - {"id": 19458, "synset": "himalayan_lilac.n.01", "name": "Himalayan_lilac"}, - {"id": 19459, "synset": "persian_lilac.n.02", "name": "Persian_lilac"}, - {"id": 19460, "synset": "japanese_tree_lilac.n.01", "name": "Japanese_tree_lilac"}, - {"id": 19461, "synset": "japanese_lilac.n.01", "name": "Japanese_lilac"}, - {"id": 19462, "synset": "common_lilac.n.01", "name": "common_lilac"}, - {"id": 19463, "synset": "bloodwort.n.01", "name": "bloodwort"}, - {"id": 19464, "synset": "kangaroo_paw.n.01", "name": "kangaroo_paw"}, - {"id": 19465, "synset": "virginian_witch_hazel.n.01", "name": "Virginian_witch_hazel"}, - {"id": 19466, "synset": "vernal_witch_hazel.n.01", "name": "vernal_witch_hazel"}, - {"id": 19467, "synset": "winter_hazel.n.01", "name": "winter_hazel"}, - {"id": 19468, "synset": "fothergilla.n.01", "name": "fothergilla"}, - {"id": 19469, "synset": "liquidambar.n.02", "name": "liquidambar"}, - {"id": 19470, "synset": "sweet_gum.n.03", "name": "sweet_gum"}, - {"id": 19471, "synset": "iron_tree.n.01", "name": "iron_tree"}, - {"id": 19472, "synset": "walnut.n.03", "name": "walnut"}, - {"id": 19473, "synset": "california_black_walnut.n.01", "name": "California_black_walnut"}, - {"id": 19474, "synset": "butternut.n.01", "name": "butternut"}, - {"id": 19475, "synset": "black_walnut.n.01", "name": "black_walnut"}, - {"id": 19476, "synset": "english_walnut.n.01", "name": "English_walnut"}, - {"id": 19477, "synset": "hickory.n.02", "name": "hickory"}, - {"id": 19478, "synset": "water_hickory.n.01", "name": "water_hickory"}, - {"id": 19479, "synset": "pignut.n.01", "name": "pignut"}, - {"id": 19480, "synset": "bitternut.n.01", "name": "bitternut"}, - {"id": 19481, "synset": "pecan.n.02", "name": "pecan"}, - {"id": 19482, "synset": "big_shellbark.n.01", "name": "big_shellbark"}, - {"id": 19483, "synset": "nutmeg_hickory.n.01", "name": "nutmeg_hickory"}, - {"id": 19484, "synset": "shagbark.n.01", "name": "shagbark"}, - {"id": 19485, "synset": "mockernut.n.01", "name": "mockernut"}, - {"id": 19486, "synset": "wing_nut.n.01", "name": "wing_nut"}, - {"id": 19487, "synset": "caucasian_walnut.n.01", "name": "Caucasian_walnut"}, - {"id": 19488, "synset": "dhawa.n.01", "name": "dhawa"}, - {"id": 19489, "synset": "combretum.n.01", "name": "combretum"}, - {"id": 19490, "synset": "hiccup_nut.n.01", "name": "hiccup_nut"}, - {"id": 19491, "synset": "bush_willow.n.02", "name": "bush_willow"}, - {"id": 19492, "synset": "bush_willow.n.01", "name": "bush_willow"}, - {"id": 19493, "synset": "button_tree.n.01", "name": "button_tree"}, - {"id": 19494, "synset": "white_mangrove.n.02", "name": "white_mangrove"}, - {"id": 19495, "synset": "oleaster.n.01", "name": "oleaster"}, - {"id": 19496, "synset": "water_milfoil.n.01", "name": "water_milfoil"}, - {"id": 19497, "synset": "anchovy_pear.n.01", "name": "anchovy_pear"}, - {"id": 19498, "synset": "brazil_nut.n.01", "name": "brazil_nut"}, - {"id": 19499, "synset": "loosestrife.n.01", "name": "loosestrife"}, - {"id": 19500, "synset": "purple_loosestrife.n.01", "name": "purple_loosestrife"}, - {"id": 19501, "synset": "grass_poly.n.01", "name": "grass_poly"}, - {"id": 19502, "synset": "crape_myrtle.n.01", "name": "crape_myrtle"}, - {"id": 19503, "synset": "queen's_crape_myrtle.n.01", "name": "Queen's_crape_myrtle"}, - {"id": 19504, "synset": "myrtaceous_tree.n.01", "name": "myrtaceous_tree"}, - {"id": 19505, "synset": "myrtle.n.02", "name": "myrtle"}, - {"id": 19506, "synset": "common_myrtle.n.01", "name": "common_myrtle"}, - {"id": 19507, "synset": "bayberry.n.01", "name": "bayberry"}, - {"id": 19508, "synset": "allspice.n.01", "name": "allspice"}, - {"id": 19509, "synset": "allspice_tree.n.01", "name": "allspice_tree"}, - {"id": 19510, "synset": "sour_cherry.n.02", "name": "sour_cherry"}, - {"id": 19511, "synset": "nakedwood.n.02", "name": "nakedwood"}, - {"id": 19512, "synset": "surinam_cherry.n.02", "name": "Surinam_cherry"}, - {"id": 19513, "synset": "rose_apple.n.01", "name": "rose_apple"}, - {"id": 19514, "synset": "feijoa.n.01", "name": "feijoa"}, - {"id": 19515, "synset": "jaboticaba.n.01", "name": "jaboticaba"}, - {"id": 19516, "synset": "guava.n.02", "name": "guava"}, - {"id": 19517, "synset": "guava.n.01", "name": "guava"}, - {"id": 19518, "synset": "cattley_guava.n.01", "name": "cattley_guava"}, - {"id": 19519, "synset": "brazilian_guava.n.01", "name": "Brazilian_guava"}, - {"id": 19520, "synset": "gum_tree.n.01", "name": "gum_tree"}, - {"id": 19521, "synset": "eucalyptus.n.02", "name": "eucalyptus"}, - {"id": 19522, "synset": "flooded_gum.n.01", "name": "flooded_gum"}, - {"id": 19523, "synset": "mallee.n.01", "name": "mallee"}, - {"id": 19524, "synset": "stringybark.n.01", "name": "stringybark"}, - {"id": 19525, "synset": "smoothbark.n.01", "name": "smoothbark"}, - {"id": 19526, "synset": "red_gum.n.03", "name": "red_gum"}, - {"id": 19527, "synset": "red_gum.n.02", "name": "red_gum"}, - {"id": 19528, "synset": "river_red_gum.n.01", "name": "river_red_gum"}, - {"id": 19529, "synset": "mountain_swamp_gum.n.01", "name": "mountain_swamp_gum"}, - {"id": 19530, "synset": "snow_gum.n.01", "name": "snow_gum"}, - {"id": 19531, "synset": "alpine_ash.n.01", "name": "alpine_ash"}, - {"id": 19532, "synset": "white_mallee.n.01", "name": "white_mallee"}, - {"id": 19533, "synset": "white_stringybark.n.01", "name": "white_stringybark"}, - {"id": 19534, "synset": "white_mountain_ash.n.01", "name": "white_mountain_ash"}, - {"id": 19535, "synset": "blue_gum.n.01", "name": "blue_gum"}, - {"id": 19536, "synset": "rose_gum.n.01", "name": "rose_gum"}, - {"id": 19537, "synset": "cider_gum.n.01", "name": "cider_gum"}, - {"id": 19538, "synset": "swamp_gum.n.01", "name": "swamp_gum"}, - {"id": 19539, "synset": "spotted_gum.n.01", "name": "spotted_gum"}, - {"id": 19540, "synset": "lemon-scented_gum.n.01", "name": "lemon-scented_gum"}, - {"id": 19541, "synset": "black_mallee.n.01", "name": "black_mallee"}, - {"id": 19542, "synset": "forest_red_gum.n.01", "name": "forest_red_gum"}, - {"id": 19543, "synset": "mountain_ash.n.02", "name": "mountain_ash"}, - {"id": 19544, "synset": "manna_gum.n.01", "name": "manna_gum"}, - {"id": 19545, "synset": "clove.n.02", "name": "clove"}, - {"id": 19546, "synset": "clove.n.01", "name": "clove"}, - {"id": 19547, "synset": "tupelo.n.02", "name": "tupelo"}, - {"id": 19548, "synset": "water_gum.n.01", "name": "water_gum"}, - {"id": 19549, "synset": "sour_gum.n.01", "name": "sour_gum"}, - {"id": 19550, "synset": "enchanter's_nightshade.n.01", "name": "enchanter's_nightshade"}, - {"id": 19551, "synset": "circaea_lutetiana.n.01", "name": "Circaea_lutetiana"}, - {"id": 19552, "synset": "willowherb.n.01", "name": "willowherb"}, - {"id": 19553, "synset": "fireweed.n.01", "name": "fireweed"}, - {"id": 19554, "synset": "california_fuchsia.n.01", "name": "California_fuchsia"}, - {"id": 19555, "synset": "fuchsia.n.01", "name": "fuchsia"}, - {"id": 19556, "synset": "lady's-eardrop.n.01", "name": "lady's-eardrop"}, - {"id": 19557, "synset": "evening_primrose.n.01", "name": "evening_primrose"}, - {"id": 19558, "synset": "common_evening_primrose.n.01", "name": "common_evening_primrose"}, - {"id": 19559, "synset": "sundrops.n.01", "name": "sundrops"}, - {"id": 19560, "synset": "missouri_primrose.n.01", "name": "Missouri_primrose"}, - {"id": 19561, "synset": "pomegranate.n.01", "name": "pomegranate"}, - {"id": 19562, "synset": "mangrove.n.01", "name": "mangrove"}, - {"id": 19563, "synset": "daphne.n.01", "name": "daphne"}, - {"id": 19564, "synset": "garland_flower.n.01", "name": "garland_flower"}, - {"id": 19565, "synset": "spurge_laurel.n.01", "name": "spurge_laurel"}, - {"id": 19566, "synset": "mezereon.n.01", "name": "mezereon"}, - {"id": 19567, "synset": "indian_rhododendron.n.01", "name": "Indian_rhododendron"}, - {"id": 19568, "synset": "medinilla_magnifica.n.01", "name": "Medinilla_magnifica"}, - {"id": 19569, "synset": "deer_grass.n.01", "name": "deer_grass"}, - {"id": 19570, "synset": "canna.n.01", "name": "canna"}, - {"id": 19571, "synset": "achira.n.01", "name": "achira"}, - {"id": 19572, "synset": "arrowroot.n.02", "name": "arrowroot"}, - {"id": 19573, "synset": "banana.n.01", "name": "banana"}, - {"id": 19574, "synset": "dwarf_banana.n.01", "name": "dwarf_banana"}, - {"id": 19575, "synset": "japanese_banana.n.01", "name": "Japanese_banana"}, - {"id": 19576, "synset": "plantain.n.02", "name": "plantain"}, - {"id": 19577, "synset": "edible_banana.n.01", "name": "edible_banana"}, - {"id": 19578, "synset": "abaca.n.02", "name": "abaca"}, - {"id": 19579, "synset": "abyssinian_banana.n.01", "name": "Abyssinian_banana"}, - {"id": 19580, "synset": "ginger.n.01", "name": "ginger"}, - {"id": 19581, "synset": "common_ginger.n.01", "name": "common_ginger"}, - {"id": 19582, "synset": "turmeric.n.01", "name": "turmeric"}, - {"id": 19583, "synset": "galangal.n.01", "name": "galangal"}, - {"id": 19584, "synset": "shellflower.n.02", "name": "shellflower"}, - {"id": 19585, "synset": "grains_of_paradise.n.01", "name": "grains_of_paradise"}, - {"id": 19586, "synset": "cardamom.n.01", "name": "cardamom"}, - {"id": 19587, "synset": "begonia.n.01", "name": "begonia"}, - {"id": 19588, "synset": "fibrous-rooted_begonia.n.01", "name": "fibrous-rooted_begonia"}, - {"id": 19589, "synset": "tuberous_begonia.n.01", "name": "tuberous_begonia"}, - {"id": 19590, "synset": "rhizomatous_begonia.n.01", "name": "rhizomatous_begonia"}, - {"id": 19591, "synset": "christmas_begonia.n.01", "name": "Christmas_begonia"}, - {"id": 19592, "synset": "angel-wing_begonia.n.01", "name": "angel-wing_begonia"}, - {"id": 19593, "synset": "beefsteak_begonia.n.01", "name": "beefsteak_begonia"}, - {"id": 19594, "synset": "star_begonia.n.01", "name": "star_begonia"}, - {"id": 19595, "synset": "rex_begonia.n.01", "name": "rex_begonia"}, - {"id": 19596, "synset": "wax_begonia.n.01", "name": "wax_begonia"}, - {"id": 19597, "synset": "socotra_begonia.n.01", "name": "Socotra_begonia"}, - {"id": 19598, "synset": "hybrid_tuberous_begonia.n.01", "name": "hybrid_tuberous_begonia"}, - {"id": 19599, "synset": "dillenia.n.01", "name": "dillenia"}, - {"id": 19600, "synset": "guinea_gold_vine.n.01", "name": "guinea_gold_vine"}, - {"id": 19601, "synset": "poon.n.02", "name": "poon"}, - {"id": 19602, "synset": "calaba.n.01", "name": "calaba"}, - {"id": 19603, "synset": "maria.n.02", "name": "Maria"}, - {"id": 19604, "synset": "laurelwood.n.01", "name": "laurelwood"}, - {"id": 19605, "synset": "alexandrian_laurel.n.01", "name": "Alexandrian_laurel"}, - {"id": 19606, "synset": "clusia.n.01", "name": "clusia"}, - {"id": 19607, "synset": "wild_fig.n.02", "name": "wild_fig"}, - {"id": 19608, "synset": "waxflower.n.02", "name": "waxflower"}, - {"id": 19609, "synset": "pitch_apple.n.01", "name": "pitch_apple"}, - {"id": 19610, "synset": "mangosteen.n.01", "name": "mangosteen"}, - {"id": 19611, "synset": "gamboge_tree.n.01", "name": "gamboge_tree"}, - {"id": 19612, "synset": "st_john's_wort.n.01", "name": "St_John's_wort"}, - {"id": 19613, "synset": "common_st_john's_wort.n.01", "name": "common_St_John's_wort"}, - {"id": 19614, "synset": "great_st_john's_wort.n.01", "name": "great_St_John's_wort"}, - {"id": 19615, "synset": "creeping_st_john's_wort.n.01", "name": "creeping_St_John's_wort"}, - {"id": 19616, "synset": "low_st_andrew's_cross.n.01", "name": "low_St_Andrew's_cross"}, - {"id": 19617, "synset": "klammath_weed.n.01", "name": "klammath_weed"}, - {"id": 19618, "synset": "shrubby_st_john's_wort.n.01", "name": "shrubby_St_John's_wort"}, - {"id": 19619, "synset": "st_peter's_wort.n.01", "name": "St_Peter's_wort"}, - {"id": 19620, "synset": "marsh_st-john's_wort.n.01", "name": "marsh_St-John's_wort"}, - {"id": 19621, "synset": "mammee_apple.n.01", "name": "mammee_apple"}, - {"id": 19622, "synset": "rose_chestnut.n.01", "name": "rose_chestnut"}, - {"id": 19623, "synset": "bower_actinidia.n.01", "name": "bower_actinidia"}, - {"id": 19624, "synset": "chinese_gooseberry.n.01", "name": "Chinese_gooseberry"}, - {"id": 19625, "synset": "silvervine.n.01", "name": "silvervine"}, - {"id": 19626, "synset": "wild_cinnamon.n.01", "name": "wild_cinnamon"}, - {"id": 19627, "synset": "papaya.n.01", "name": "papaya"}, - {"id": 19628, "synset": "souari.n.01", "name": "souari"}, - {"id": 19629, "synset": "rockrose.n.02", "name": "rockrose"}, - {"id": 19630, "synset": "white-leaved_rockrose.n.01", "name": "white-leaved_rockrose"}, - {"id": 19631, "synset": "common_gum_cistus.n.01", "name": "common_gum_cistus"}, - {"id": 19632, "synset": "frostweed.n.01", "name": "frostweed"}, - {"id": 19633, "synset": "dipterocarp.n.01", "name": "dipterocarp"}, - {"id": 19634, "synset": "red_lauan.n.02", "name": "red_lauan"}, - {"id": 19635, "synset": "governor's_plum.n.01", "name": "governor's_plum"}, - {"id": 19636, "synset": "kei_apple.n.01", "name": "kei_apple"}, - {"id": 19637, "synset": "ketembilla.n.01", "name": "ketembilla"}, - {"id": 19638, "synset": "chaulmoogra.n.01", "name": "chaulmoogra"}, - {"id": 19639, "synset": "wild_peach.n.01", "name": "wild_peach"}, - {"id": 19640, "synset": "candlewood.n.01", "name": "candlewood"}, - {"id": 19641, "synset": "boojum_tree.n.01", "name": "boojum_tree"}, - {"id": 19642, "synset": "bird's-eye_bush.n.01", "name": "bird's-eye_bush"}, - {"id": 19643, "synset": "granadilla.n.03", "name": "granadilla"}, - {"id": 19644, "synset": "granadilla.n.02", "name": "granadilla"}, - {"id": 19645, "synset": "granadilla.n.01", "name": "granadilla"}, - {"id": 19646, "synset": "maypop.n.01", "name": "maypop"}, - {"id": 19647, "synset": "jamaica_honeysuckle.n.01", "name": "Jamaica_honeysuckle"}, - {"id": 19648, "synset": "banana_passion_fruit.n.01", "name": "banana_passion_fruit"}, - {"id": 19649, "synset": "sweet_calabash.n.01", "name": "sweet_calabash"}, - {"id": 19650, "synset": "love-in-a-mist.n.01", "name": "love-in-a-mist"}, - {"id": 19651, "synset": "reseda.n.01", "name": "reseda"}, - {"id": 19652, "synset": "mignonette.n.01", "name": "mignonette"}, - {"id": 19653, "synset": "dyer's_rocket.n.01", "name": "dyer's_rocket"}, - {"id": 19654, "synset": "false_tamarisk.n.01", "name": "false_tamarisk"}, - {"id": 19655, "synset": "halophyte.n.01", "name": "halophyte"}, - {"id": 19656, "synset": "viola.n.01", "name": "viola"}, - {"id": 19657, "synset": "violet.n.01", "name": "violet"}, - {"id": 19658, "synset": "field_pansy.n.01", "name": "field_pansy"}, - {"id": 19659, "synset": "american_dog_violet.n.01", "name": "American_dog_violet"}, - {"id": 19660, "synset": "dog_violet.n.01", "name": "dog_violet"}, - {"id": 19661, "synset": "horned_violet.n.01", "name": "horned_violet"}, - {"id": 19662, "synset": "two-eyed_violet.n.01", "name": "two-eyed_violet"}, - {"id": 19663, "synset": "bird's-foot_violet.n.01", "name": "bird's-foot_violet"}, - {"id": 19664, "synset": "downy_yellow_violet.n.01", "name": "downy_yellow_violet"}, - {"id": 19665, "synset": "long-spurred_violet.n.01", "name": "long-spurred_violet"}, - {"id": 19666, "synset": "pale_violet.n.01", "name": "pale_violet"}, - {"id": 19667, "synset": "hedge_violet.n.01", "name": "hedge_violet"}, - {"id": 19668, "synset": "nettle.n.01", "name": "nettle"}, - {"id": 19669, "synset": "stinging_nettle.n.01", "name": "stinging_nettle"}, - {"id": 19670, "synset": "roman_nettle.n.01", "name": "Roman_nettle"}, - {"id": 19671, "synset": "ramie.n.01", "name": "ramie"}, - {"id": 19672, "synset": "wood_nettle.n.01", "name": "wood_nettle"}, - {"id": 19673, "synset": "australian_nettle.n.01", "name": "Australian_nettle"}, - {"id": 19674, "synset": "pellitory-of-the-wall.n.01", "name": "pellitory-of-the-wall"}, - {"id": 19675, "synset": "richweed.n.02", "name": "richweed"}, - {"id": 19676, "synset": "artillery_plant.n.01", "name": "artillery_plant"}, - {"id": 19677, "synset": "friendship_plant.n.01", "name": "friendship_plant"}, - { - "id": 19678, - "synset": "queensland_grass-cloth_plant.n.01", - "name": "Queensland_grass-cloth_plant", - }, - {"id": 19679, "synset": "pipturus_albidus.n.01", "name": "Pipturus_albidus"}, - {"id": 19680, "synset": "cannabis.n.01", "name": "cannabis"}, - {"id": 19681, "synset": "indian_hemp.n.01", "name": "Indian_hemp"}, - {"id": 19682, "synset": "mulberry.n.01", "name": "mulberry"}, - {"id": 19683, "synset": "white_mulberry.n.01", "name": "white_mulberry"}, - {"id": 19684, "synset": "black_mulberry.n.01", "name": "black_mulberry"}, - {"id": 19685, "synset": "red_mulberry.n.01", "name": "red_mulberry"}, - {"id": 19686, "synset": "osage_orange.n.01", "name": "osage_orange"}, - {"id": 19687, "synset": "breadfruit.n.01", "name": "breadfruit"}, - {"id": 19688, "synset": "jackfruit.n.01", "name": "jackfruit"}, - {"id": 19689, "synset": "marang.n.01", "name": "marang"}, - {"id": 19690, "synset": "fig_tree.n.01", "name": "fig_tree"}, - {"id": 19691, "synset": "fig.n.02", "name": "fig"}, - {"id": 19692, "synset": "caprifig.n.01", "name": "caprifig"}, - {"id": 19693, "synset": "golden_fig.n.01", "name": "golden_fig"}, - {"id": 19694, "synset": "banyan.n.01", "name": "banyan"}, - {"id": 19695, "synset": "pipal.n.01", "name": "pipal"}, - {"id": 19696, "synset": "india-rubber_tree.n.01", "name": "India-rubber_tree"}, - {"id": 19697, "synset": "mistletoe_fig.n.01", "name": "mistletoe_fig"}, - {"id": 19698, "synset": "port_jackson_fig.n.01", "name": "Port_Jackson_fig"}, - {"id": 19699, "synset": "sycamore.n.04", "name": "sycamore"}, - {"id": 19700, "synset": "paper_mulberry.n.01", "name": "paper_mulberry"}, - {"id": 19701, "synset": "trumpetwood.n.01", "name": "trumpetwood"}, - {"id": 19702, "synset": "elm.n.01", "name": "elm"}, - {"id": 19703, "synset": "winged_elm.n.01", "name": "winged_elm"}, - {"id": 19704, "synset": "american_elm.n.01", "name": "American_elm"}, - {"id": 19705, "synset": "smooth-leaved_elm.n.01", "name": "smooth-leaved_elm"}, - {"id": 19706, "synset": "cedar_elm.n.01", "name": "cedar_elm"}, - {"id": 19707, "synset": "witch_elm.n.01", "name": "witch_elm"}, - {"id": 19708, "synset": "dutch_elm.n.01", "name": "Dutch_elm"}, - {"id": 19709, "synset": "huntingdon_elm.n.01", "name": "Huntingdon_elm"}, - {"id": 19710, "synset": "water_elm.n.01", "name": "water_elm"}, - {"id": 19711, "synset": "chinese_elm.n.02", "name": "Chinese_elm"}, - {"id": 19712, "synset": "english_elm.n.01", "name": "English_elm"}, - {"id": 19713, "synset": "siberian_elm.n.01", "name": "Siberian_elm"}, - {"id": 19714, "synset": "slippery_elm.n.01", "name": "slippery_elm"}, - {"id": 19715, "synset": "jersey_elm.n.01", "name": "Jersey_elm"}, - {"id": 19716, "synset": "september_elm.n.01", "name": "September_elm"}, - {"id": 19717, "synset": "rock_elm.n.01", "name": "rock_elm"}, - {"id": 19718, "synset": "hackberry.n.01", "name": "hackberry"}, - {"id": 19719, "synset": "european_hackberry.n.01", "name": "European_hackberry"}, - {"id": 19720, "synset": "american_hackberry.n.01", "name": "American_hackberry"}, - {"id": 19721, "synset": "sugarberry.n.01", "name": "sugarberry"}, - {"id": 19722, "synset": "iridaceous_plant.n.01", "name": "iridaceous_plant"}, - {"id": 19723, "synset": "bearded_iris.n.01", "name": "bearded_iris"}, - {"id": 19724, "synset": "beardless_iris.n.01", "name": "beardless_iris"}, - {"id": 19725, "synset": "orrisroot.n.01", "name": "orrisroot"}, - {"id": 19726, "synset": "dwarf_iris.n.02", "name": "dwarf_iris"}, - {"id": 19727, "synset": "dutch_iris.n.02", "name": "Dutch_iris"}, - {"id": 19728, "synset": "florentine_iris.n.01", "name": "Florentine_iris"}, - {"id": 19729, "synset": "stinking_iris.n.01", "name": "stinking_iris"}, - {"id": 19730, "synset": "german_iris.n.02", "name": "German_iris"}, - {"id": 19731, "synset": "japanese_iris.n.01", "name": "Japanese_iris"}, - {"id": 19732, "synset": "german_iris.n.01", "name": "German_iris"}, - {"id": 19733, "synset": "dalmatian_iris.n.01", "name": "Dalmatian_iris"}, - {"id": 19734, "synset": "persian_iris.n.01", "name": "Persian_iris"}, - {"id": 19735, "synset": "dutch_iris.n.01", "name": "Dutch_iris"}, - {"id": 19736, "synset": "dwarf_iris.n.01", "name": "dwarf_iris"}, - {"id": 19737, "synset": "spanish_iris.n.01", "name": "Spanish_iris"}, - {"id": 19738, "synset": "blackberry-lily.n.01", "name": "blackberry-lily"}, - {"id": 19739, "synset": "crocus.n.01", "name": "crocus"}, - {"id": 19740, "synset": "saffron.n.01", "name": "saffron"}, - {"id": 19741, "synset": "corn_lily.n.01", "name": "corn_lily"}, - {"id": 19742, "synset": "blue-eyed_grass.n.01", "name": "blue-eyed_grass"}, - {"id": 19743, "synset": "wandflower.n.01", "name": "wandflower"}, - {"id": 19744, "synset": "amaryllis.n.01", "name": "amaryllis"}, - {"id": 19745, "synset": "salsilla.n.02", "name": "salsilla"}, - {"id": 19746, "synset": "salsilla.n.01", "name": "salsilla"}, - {"id": 19747, "synset": "blood_lily.n.01", "name": "blood_lily"}, - {"id": 19748, "synset": "cape_tulip.n.01", "name": "Cape_tulip"}, - {"id": 19749, "synset": "hippeastrum.n.01", "name": "hippeastrum"}, - {"id": 19750, "synset": "narcissus.n.01", "name": "narcissus"}, - {"id": 19751, "synset": "daffodil.n.01", "name": "daffodil"}, - {"id": 19752, "synset": "jonquil.n.01", "name": "jonquil"}, - {"id": 19753, "synset": "jonquil.n.02", "name": "jonquil"}, - {"id": 19754, "synset": "jacobean_lily.n.01", "name": "Jacobean_lily"}, - {"id": 19755, "synset": "liliaceous_plant.n.01", "name": "liliaceous_plant"}, - {"id": 19756, "synset": "mountain_lily.n.01", "name": "mountain_lily"}, - {"id": 19757, "synset": "canada_lily.n.01", "name": "Canada_lily"}, - {"id": 19758, "synset": "tiger_lily.n.02", "name": "tiger_lily"}, - {"id": 19759, "synset": "columbia_tiger_lily.n.01", "name": "Columbia_tiger_lily"}, - {"id": 19760, "synset": "tiger_lily.n.01", "name": "tiger_lily"}, - {"id": 19761, "synset": "easter_lily.n.01", "name": "Easter_lily"}, - {"id": 19762, "synset": "coast_lily.n.01", "name": "coast_lily"}, - {"id": 19763, "synset": "turk's-cap.n.02", "name": "Turk's-cap"}, - {"id": 19764, "synset": "michigan_lily.n.01", "name": "Michigan_lily"}, - {"id": 19765, "synset": "leopard_lily.n.01", "name": "leopard_lily"}, - {"id": 19766, "synset": "turk's-cap.n.01", "name": "Turk's-cap"}, - {"id": 19767, "synset": "african_lily.n.01", "name": "African_lily"}, - {"id": 19768, "synset": "colicroot.n.01", "name": "colicroot"}, - {"id": 19769, "synset": "ague_root.n.01", "name": "ague_root"}, - {"id": 19770, "synset": "yellow_colicroot.n.01", "name": "yellow_colicroot"}, - {"id": 19771, "synset": "alliaceous_plant.n.01", "name": "alliaceous_plant"}, - {"id": 19772, "synset": "hooker's_onion.n.01", "name": "Hooker's_onion"}, - {"id": 19773, "synset": "wild_leek.n.02", "name": "wild_leek"}, - {"id": 19774, "synset": "canada_garlic.n.01", "name": "Canada_garlic"}, - {"id": 19775, "synset": "keeled_garlic.n.01", "name": "keeled_garlic"}, - {"id": 19776, "synset": "shallot.n.02", "name": "shallot"}, - {"id": 19777, "synset": "nodding_onion.n.01", "name": "nodding_onion"}, - {"id": 19778, "synset": "welsh_onion.n.01", "name": "Welsh_onion"}, - {"id": 19779, "synset": "red-skinned_onion.n.01", "name": "red-skinned_onion"}, - {"id": 19780, "synset": "daffodil_garlic.n.01", "name": "daffodil_garlic"}, - {"id": 19781, "synset": "few-flowered_leek.n.01", "name": "few-flowered_leek"}, - {"id": 19782, "synset": "garlic.n.01", "name": "garlic"}, - {"id": 19783, "synset": "sand_leek.n.01", "name": "sand_leek"}, - {"id": 19784, "synset": "chives.n.01", "name": "chives"}, - {"id": 19785, "synset": "crow_garlic.n.01", "name": "crow_garlic"}, - {"id": 19786, "synset": "wild_garlic.n.01", "name": "wild_garlic"}, - {"id": 19787, "synset": "garlic_chive.n.01", "name": "garlic_chive"}, - {"id": 19788, "synset": "round-headed_leek.n.01", "name": "round-headed_leek"}, - {"id": 19789, "synset": "three-cornered_leek.n.01", "name": "three-cornered_leek"}, - {"id": 19790, "synset": "cape_aloe.n.01", "name": "cape_aloe"}, - {"id": 19791, "synset": "kniphofia.n.01", "name": "kniphofia"}, - {"id": 19792, "synset": "poker_plant.n.01", "name": "poker_plant"}, - {"id": 19793, "synset": "red-hot_poker.n.01", "name": "red-hot_poker"}, - {"id": 19794, "synset": "fly_poison.n.01", "name": "fly_poison"}, - {"id": 19795, "synset": "amber_lily.n.01", "name": "amber_lily"}, - {"id": 19796, "synset": "asparagus.n.01", "name": "asparagus"}, - {"id": 19797, "synset": "asparagus_fern.n.01", "name": "asparagus_fern"}, - {"id": 19798, "synset": "smilax.n.02", "name": "smilax"}, - {"id": 19799, "synset": "asphodel.n.01", "name": "asphodel"}, - {"id": 19800, "synset": "jacob's_rod.n.01", "name": "Jacob's_rod"}, - {"id": 19801, "synset": "aspidistra.n.01", "name": "aspidistra"}, - {"id": 19802, "synset": "coral_drops.n.01", "name": "coral_drops"}, - {"id": 19803, "synset": "christmas_bells.n.01", "name": "Christmas_bells"}, - {"id": 19804, "synset": "climbing_onion.n.01", "name": "climbing_onion"}, - {"id": 19805, "synset": "mariposa.n.01", "name": "mariposa"}, - {"id": 19806, "synset": "globe_lily.n.01", "name": "globe_lily"}, - {"id": 19807, "synset": "cat's-ear.n.01", "name": "cat's-ear"}, - {"id": 19808, "synset": "white_globe_lily.n.01", "name": "white_globe_lily"}, - {"id": 19809, "synset": "yellow_globe_lily.n.01", "name": "yellow_globe_lily"}, - {"id": 19810, "synset": "rose_globe_lily.n.01", "name": "rose_globe_lily"}, - {"id": 19811, "synset": "star_tulip.n.01", "name": "star_tulip"}, - {"id": 19812, "synset": "desert_mariposa_tulip.n.01", "name": "desert_mariposa_tulip"}, - {"id": 19813, "synset": "yellow_mariposa_tulip.n.01", "name": "yellow_mariposa_tulip"}, - {"id": 19814, "synset": "sagebrush_mariposa_tulip.n.01", "name": "sagebrush_mariposa_tulip"}, - {"id": 19815, "synset": "sego_lily.n.01", "name": "sego_lily"}, - {"id": 19816, "synset": "camas.n.01", "name": "camas"}, - {"id": 19817, "synset": "common_camas.n.01", "name": "common_camas"}, - {"id": 19818, "synset": "leichtlin's_camas.n.01", "name": "Leichtlin's_camas"}, - {"id": 19819, "synset": "wild_hyacinth.n.02", "name": "wild_hyacinth"}, - {"id": 19820, "synset": "dogtooth_violet.n.01", "name": "dogtooth_violet"}, - {"id": 19821, "synset": "white_dogtooth_violet.n.01", "name": "white_dogtooth_violet"}, - {"id": 19822, "synset": "yellow_adder's_tongue.n.01", "name": "yellow_adder's_tongue"}, - {"id": 19823, "synset": "european_dogtooth.n.01", "name": "European_dogtooth"}, - {"id": 19824, "synset": "fawn_lily.n.01", "name": "fawn_lily"}, - {"id": 19825, "synset": "glacier_lily.n.01", "name": "glacier_lily"}, - {"id": 19826, "synset": "avalanche_lily.n.01", "name": "avalanche_lily"}, - {"id": 19827, "synset": "fritillary.n.01", "name": "fritillary"}, - {"id": 19828, "synset": "mission_bells.n.02", "name": "mission_bells"}, - {"id": 19829, "synset": "mission_bells.n.01", "name": "mission_bells"}, - {"id": 19830, "synset": "stink_bell.n.01", "name": "stink_bell"}, - {"id": 19831, "synset": "crown_imperial.n.01", "name": "crown_imperial"}, - {"id": 19832, "synset": "white_fritillary.n.01", "name": "white_fritillary"}, - {"id": 19833, "synset": "snake's_head_fritillary.n.01", "name": "snake's_head_fritillary"}, - {"id": 19834, "synset": "adobe_lily.n.01", "name": "adobe_lily"}, - {"id": 19835, "synset": "scarlet_fritillary.n.01", "name": "scarlet_fritillary"}, - {"id": 19836, "synset": "tulip.n.01", "name": "tulip"}, - {"id": 19837, "synset": "dwarf_tulip.n.01", "name": "dwarf_tulip"}, - {"id": 19838, "synset": "lady_tulip.n.01", "name": "lady_tulip"}, - {"id": 19839, "synset": "tulipa_gesneriana.n.01", "name": "Tulipa_gesneriana"}, - {"id": 19840, "synset": "cottage_tulip.n.01", "name": "cottage_tulip"}, - {"id": 19841, "synset": "darwin_tulip.n.01", "name": "Darwin_tulip"}, - {"id": 19842, "synset": "gloriosa.n.01", "name": "gloriosa"}, - {"id": 19843, "synset": "lemon_lily.n.01", "name": "lemon_lily"}, - {"id": 19844, "synset": "common_hyacinth.n.01", "name": "common_hyacinth"}, - {"id": 19845, "synset": "roman_hyacinth.n.01", "name": "Roman_hyacinth"}, - {"id": 19846, "synset": "summer_hyacinth.n.01", "name": "summer_hyacinth"}, - {"id": 19847, "synset": "star-of-bethlehem.n.01", "name": "star-of-Bethlehem"}, - {"id": 19848, "synset": "bath_asparagus.n.01", "name": "bath_asparagus"}, - {"id": 19849, "synset": "grape_hyacinth.n.01", "name": "grape_hyacinth"}, - {"id": 19850, "synset": "common_grape_hyacinth.n.01", "name": "common_grape_hyacinth"}, - {"id": 19851, "synset": "tassel_hyacinth.n.01", "name": "tassel_hyacinth"}, - {"id": 19852, "synset": "scilla.n.01", "name": "scilla"}, - {"id": 19853, "synset": "spring_squill.n.01", "name": "spring_squill"}, - {"id": 19854, "synset": "false_asphodel.n.01", "name": "false_asphodel"}, - {"id": 19855, "synset": "scotch_asphodel.n.01", "name": "Scotch_asphodel"}, - {"id": 19856, "synset": "sea_squill.n.01", "name": "sea_squill"}, - {"id": 19857, "synset": "squill.n.01", "name": "squill"}, - {"id": 19858, "synset": "butcher's_broom.n.01", "name": "butcher's_broom"}, - {"id": 19859, "synset": "bog_asphodel.n.01", "name": "bog_asphodel"}, - {"id": 19860, "synset": "european_bog_asphodel.n.01", "name": "European_bog_asphodel"}, - {"id": 19861, "synset": "american_bog_asphodel.n.01", "name": "American_bog_asphodel"}, - {"id": 19862, "synset": "hellebore.n.01", "name": "hellebore"}, - {"id": 19863, "synset": "white_hellebore.n.01", "name": "white_hellebore"}, - {"id": 19864, "synset": "squaw_grass.n.01", "name": "squaw_grass"}, - {"id": 19865, "synset": "death_camas.n.01", "name": "death_camas"}, - {"id": 19866, "synset": "alkali_grass.n.01", "name": "alkali_grass"}, - {"id": 19867, "synset": "white_camas.n.01", "name": "white_camas"}, - {"id": 19868, "synset": "poison_camas.n.01", "name": "poison_camas"}, - {"id": 19869, "synset": "grassy_death_camas.n.01", "name": "grassy_death_camas"}, - {"id": 19870, "synset": "prairie_wake-robin.n.01", "name": "prairie_wake-robin"}, - {"id": 19871, "synset": "dwarf-white_trillium.n.01", "name": "dwarf-white_trillium"}, - {"id": 19872, "synset": "herb_paris.n.01", "name": "herb_Paris"}, - {"id": 19873, "synset": "sarsaparilla.n.01", "name": "sarsaparilla"}, - {"id": 19874, "synset": "bullbrier.n.01", "name": "bullbrier"}, - {"id": 19875, "synset": "rough_bindweed.n.01", "name": "rough_bindweed"}, - {"id": 19876, "synset": "clintonia.n.01", "name": "clintonia"}, - {"id": 19877, "synset": "false_lily_of_the_valley.n.02", "name": "false_lily_of_the_valley"}, - {"id": 19878, "synset": "false_lily_of_the_valley.n.01", "name": "false_lily_of_the_valley"}, - {"id": 19879, "synset": "solomon's-seal.n.01", "name": "Solomon's-seal"}, - {"id": 19880, "synset": "great_solomon's-seal.n.01", "name": "great_Solomon's-seal"}, - {"id": 19881, "synset": "bellwort.n.01", "name": "bellwort"}, - {"id": 19882, "synset": "strawflower.n.01", "name": "strawflower"}, - {"id": 19883, "synset": "pia.n.01", "name": "pia"}, - {"id": 19884, "synset": "agave.n.01", "name": "agave"}, - {"id": 19885, "synset": "american_agave.n.01", "name": "American_agave"}, - {"id": 19886, "synset": "sisal.n.02", "name": "sisal"}, - {"id": 19887, "synset": "maguey.n.02", "name": "maguey"}, - {"id": 19888, "synset": "maguey.n.01", "name": "maguey"}, - {"id": 19889, "synset": "agave_tequilana.n.01", "name": "Agave_tequilana"}, - {"id": 19890, "synset": "cabbage_tree.n.03", "name": "cabbage_tree"}, - {"id": 19891, "synset": "dracaena.n.01", "name": "dracaena"}, - {"id": 19892, "synset": "tuberose.n.01", "name": "tuberose"}, - {"id": 19893, "synset": "sansevieria.n.01", "name": "sansevieria"}, - {"id": 19894, "synset": "african_bowstring_hemp.n.01", "name": "African_bowstring_hemp"}, - {"id": 19895, "synset": "ceylon_bowstring_hemp.n.01", "name": "Ceylon_bowstring_hemp"}, - {"id": 19896, "synset": "mother-in-law's_tongue.n.01", "name": "mother-in-law's_tongue"}, - {"id": 19897, "synset": "spanish_bayonet.n.02", "name": "Spanish_bayonet"}, - {"id": 19898, "synset": "spanish_bayonet.n.01", "name": "Spanish_bayonet"}, - {"id": 19899, "synset": "joshua_tree.n.01", "name": "Joshua_tree"}, - {"id": 19900, "synset": "soapweed.n.01", "name": "soapweed"}, - {"id": 19901, "synset": "adam's_needle.n.01", "name": "Adam's_needle"}, - {"id": 19902, "synset": "bear_grass.n.02", "name": "bear_grass"}, - {"id": 19903, "synset": "spanish_dagger.n.01", "name": "Spanish_dagger"}, - {"id": 19904, "synset": "our_lord's_candle.n.01", "name": "Our_Lord's_candle"}, - {"id": 19905, "synset": "water_shamrock.n.01", "name": "water_shamrock"}, - {"id": 19906, "synset": "butterfly_bush.n.01", "name": "butterfly_bush"}, - {"id": 19907, "synset": "yellow_jasmine.n.01", "name": "yellow_jasmine"}, - {"id": 19908, "synset": "flax.n.02", "name": "flax"}, - {"id": 19909, "synset": "calabar_bean.n.01", "name": "calabar_bean"}, - {"id": 19910, "synset": "bonduc.n.02", "name": "bonduc"}, - {"id": 19911, "synset": "divi-divi.n.02", "name": "divi-divi"}, - {"id": 19912, "synset": "mysore_thorn.n.01", "name": "Mysore_thorn"}, - {"id": 19913, "synset": "brazilian_ironwood.n.01", "name": "brazilian_ironwood"}, - {"id": 19914, "synset": "bird_of_paradise.n.01", "name": "bird_of_paradise"}, - {"id": 19915, "synset": "shingle_tree.n.01", "name": "shingle_tree"}, - {"id": 19916, "synset": "mountain_ebony.n.01", "name": "mountain_ebony"}, - {"id": 19917, "synset": "msasa.n.01", "name": "msasa"}, - {"id": 19918, "synset": "cassia.n.01", "name": "cassia"}, - {"id": 19919, "synset": "golden_shower_tree.n.01", "name": "golden_shower_tree"}, - {"id": 19920, "synset": "pink_shower.n.01", "name": "pink_shower"}, - {"id": 19921, "synset": "rainbow_shower.n.01", "name": "rainbow_shower"}, - {"id": 19922, "synset": "horse_cassia.n.01", "name": "horse_cassia"}, - {"id": 19923, "synset": "carob.n.02", "name": "carob"}, - {"id": 19924, "synset": "carob.n.01", "name": "carob"}, - {"id": 19925, "synset": "paloverde.n.01", "name": "paloverde"}, - {"id": 19926, "synset": "royal_poinciana.n.01", "name": "royal_poinciana"}, - {"id": 19927, "synset": "locust_tree.n.01", "name": "locust_tree"}, - {"id": 19928, "synset": "water_locust.n.01", "name": "water_locust"}, - {"id": 19929, "synset": "honey_locust.n.01", "name": "honey_locust"}, - {"id": 19930, "synset": "kentucky_coffee_tree.n.01", "name": "Kentucky_coffee_tree"}, - {"id": 19931, "synset": "logwood.n.02", "name": "logwood"}, - {"id": 19932, "synset": "jerusalem_thorn.n.03", "name": "Jerusalem_thorn"}, - {"id": 19933, "synset": "palo_verde.n.01", "name": "palo_verde"}, - {"id": 19934, "synset": "dalmatian_laburnum.n.01", "name": "Dalmatian_laburnum"}, - {"id": 19935, "synset": "senna.n.01", "name": "senna"}, - {"id": 19936, "synset": "avaram.n.01", "name": "avaram"}, - {"id": 19937, "synset": "alexandria_senna.n.01", "name": "Alexandria_senna"}, - {"id": 19938, "synset": "wild_senna.n.01", "name": "wild_senna"}, - {"id": 19939, "synset": "sicklepod.n.01", "name": "sicklepod"}, - {"id": 19940, "synset": "coffee_senna.n.01", "name": "coffee_senna"}, - {"id": 19941, "synset": "tamarind.n.01", "name": "tamarind"}, - {"id": 19942, "synset": "false_indigo.n.03", "name": "false_indigo"}, - {"id": 19943, "synset": "false_indigo.n.02", "name": "false_indigo"}, - {"id": 19944, "synset": "hog_peanut.n.01", "name": "hog_peanut"}, - {"id": 19945, "synset": "angelim.n.01", "name": "angelim"}, - {"id": 19946, "synset": "cabbage_bark.n.01", "name": "cabbage_bark"}, - {"id": 19947, "synset": "kidney_vetch.n.01", "name": "kidney_vetch"}, - {"id": 19948, "synset": "groundnut.n.01", "name": "groundnut"}, - {"id": 19949, "synset": "rooibos.n.01", "name": "rooibos"}, - {"id": 19950, "synset": "milk_vetch.n.01", "name": "milk_vetch"}, - {"id": 19951, "synset": "alpine_milk_vetch.n.01", "name": "alpine_milk_vetch"}, - {"id": 19952, "synset": "purple_milk_vetch.n.01", "name": "purple_milk_vetch"}, - {"id": 19953, "synset": "camwood.n.01", "name": "camwood"}, - {"id": 19954, "synset": "wild_indigo.n.01", "name": "wild_indigo"}, - {"id": 19955, "synset": "blue_false_indigo.n.01", "name": "blue_false_indigo"}, - {"id": 19956, "synset": "white_false_indigo.n.01", "name": "white_false_indigo"}, - {"id": 19957, "synset": "indigo_broom.n.01", "name": "indigo_broom"}, - {"id": 19958, "synset": "dhak.n.01", "name": "dhak"}, - {"id": 19959, "synset": "pigeon_pea.n.01", "name": "pigeon_pea"}, - {"id": 19960, "synset": "sword_bean.n.01", "name": "sword_bean"}, - {"id": 19961, "synset": "pea_tree.n.01", "name": "pea_tree"}, - {"id": 19962, "synset": "siberian_pea_tree.n.01", "name": "Siberian_pea_tree"}, - {"id": 19963, "synset": "chinese_pea_tree.n.01", "name": "Chinese_pea_tree"}, - {"id": 19964, "synset": "moreton_bay_chestnut.n.01", "name": "Moreton_Bay_chestnut"}, - {"id": 19965, "synset": "butterfly_pea.n.03", "name": "butterfly_pea"}, - {"id": 19966, "synset": "judas_tree.n.01", "name": "Judas_tree"}, - {"id": 19967, "synset": "redbud.n.01", "name": "redbud"}, - {"id": 19968, "synset": "western_redbud.n.01", "name": "western_redbud"}, - {"id": 19969, "synset": "tagasaste.n.01", "name": "tagasaste"}, - {"id": 19970, "synset": "weeping_tree_broom.n.01", "name": "weeping_tree_broom"}, - {"id": 19971, "synset": "flame_pea.n.01", "name": "flame_pea"}, - {"id": 19972, "synset": "chickpea.n.02", "name": "chickpea"}, - {"id": 19973, "synset": "kentucky_yellowwood.n.01", "name": "Kentucky_yellowwood"}, - {"id": 19974, "synset": "glory_pea.n.01", "name": "glory_pea"}, - {"id": 19975, "synset": "desert_pea.n.01", "name": "desert_pea"}, - {"id": 19976, "synset": "parrot's_beak.n.01", "name": "parrot's_beak"}, - {"id": 19977, "synset": "butterfly_pea.n.02", "name": "butterfly_pea"}, - {"id": 19978, "synset": "blue_pea.n.01", "name": "blue_pea"}, - {"id": 19979, "synset": "telegraph_plant.n.01", "name": "telegraph_plant"}, - {"id": 19980, "synset": "bladder_senna.n.01", "name": "bladder_senna"}, - {"id": 19981, "synset": "axseed.n.01", "name": "axseed"}, - {"id": 19982, "synset": "crotalaria.n.01", "name": "crotalaria"}, - {"id": 19983, "synset": "guar.n.01", "name": "guar"}, - {"id": 19984, "synset": "white_broom.n.01", "name": "white_broom"}, - {"id": 19985, "synset": "common_broom.n.01", "name": "common_broom"}, - {"id": 19986, "synset": "rosewood.n.02", "name": "rosewood"}, - {"id": 19987, "synset": "indian_blackwood.n.01", "name": "Indian_blackwood"}, - {"id": 19988, "synset": "sissoo.n.01", "name": "sissoo"}, - {"id": 19989, "synset": "kingwood.n.02", "name": "kingwood"}, - {"id": 19990, "synset": "brazilian_rosewood.n.01", "name": "Brazilian_rosewood"}, - {"id": 19991, "synset": "cocobolo.n.01", "name": "cocobolo"}, - {"id": 19992, "synset": "blackwood.n.02", "name": "blackwood"}, - {"id": 19993, "synset": "bitter_pea.n.01", "name": "bitter_pea"}, - {"id": 19994, "synset": "derris.n.01", "name": "derris"}, - {"id": 19995, "synset": "derris_root.n.01", "name": "derris_root"}, - {"id": 19996, "synset": "prairie_mimosa.n.01", "name": "prairie_mimosa"}, - {"id": 19997, "synset": "tick_trefoil.n.01", "name": "tick_trefoil"}, - {"id": 19998, "synset": "beggarweed.n.01", "name": "beggarweed"}, - {"id": 19999, "synset": "australian_pea.n.01", "name": "Australian_pea"}, - {"id": 20000, "synset": "coral_tree.n.01", "name": "coral_tree"}, - {"id": 20001, "synset": "kaffir_boom.n.02", "name": "kaffir_boom"}, - {"id": 20002, "synset": "coral_bean_tree.n.01", "name": "coral_bean_tree"}, - {"id": 20003, "synset": "ceibo.n.01", "name": "ceibo"}, - {"id": 20004, "synset": "kaffir_boom.n.01", "name": "kaffir_boom"}, - {"id": 20005, "synset": "indian_coral_tree.n.01", "name": "Indian_coral_tree"}, - {"id": 20006, "synset": "cork_tree.n.02", "name": "cork_tree"}, - {"id": 20007, "synset": "goat's_rue.n.02", "name": "goat's_rue"}, - {"id": 20008, "synset": "poison_bush.n.01", "name": "poison_bush"}, - {"id": 20009, "synset": "spanish_broom.n.02", "name": "Spanish_broom"}, - {"id": 20010, "synset": "woodwaxen.n.01", "name": "woodwaxen"}, - {"id": 20011, "synset": "chanar.n.01", "name": "chanar"}, - {"id": 20012, "synset": "gliricidia.n.01", "name": "gliricidia"}, - {"id": 20013, "synset": "soy.n.01", "name": "soy"}, - {"id": 20014, "synset": "licorice.n.01", "name": "licorice"}, - {"id": 20015, "synset": "wild_licorice.n.02", "name": "wild_licorice"}, - {"id": 20016, "synset": "licorice_root.n.01", "name": "licorice_root"}, - { - "id": 20017, - "synset": "western_australia_coral_pea.n.01", - "name": "Western_Australia_coral_pea", - }, - {"id": 20018, "synset": "sweet_vetch.n.01", "name": "sweet_vetch"}, - {"id": 20019, "synset": "french_honeysuckle.n.02", "name": "French_honeysuckle"}, - {"id": 20020, "synset": "anil.n.02", "name": "anil"}, - {"id": 20021, "synset": "scarlet_runner.n.02", "name": "scarlet_runner"}, - {"id": 20022, "synset": "hyacinth_bean.n.01", "name": "hyacinth_bean"}, - {"id": 20023, "synset": "scotch_laburnum.n.01", "name": "Scotch_laburnum"}, - {"id": 20024, "synset": "vetchling.n.01", "name": "vetchling"}, - {"id": 20025, "synset": "wild_pea.n.01", "name": "wild_pea"}, - {"id": 20026, "synset": "everlasting_pea.n.01", "name": "everlasting_pea"}, - {"id": 20027, "synset": "beach_pea.n.01", "name": "beach_pea"}, - {"id": 20028, "synset": "grass_vetch.n.01", "name": "grass_vetch"}, - {"id": 20029, "synset": "marsh_pea.n.01", "name": "marsh_pea"}, - {"id": 20030, "synset": "common_vetchling.n.01", "name": "common_vetchling"}, - {"id": 20031, "synset": "grass_pea.n.01", "name": "grass_pea"}, - {"id": 20032, "synset": "tangier_pea.n.01", "name": "Tangier_pea"}, - {"id": 20033, "synset": "heath_pea.n.01", "name": "heath_pea"}, - {"id": 20034, "synset": "bicolor_lespediza.n.01", "name": "bicolor_lespediza"}, - {"id": 20035, "synset": "japanese_clover.n.01", "name": "japanese_clover"}, - {"id": 20036, "synset": "korean_lespedeza.n.01", "name": "Korean_lespedeza"}, - {"id": 20037, "synset": "sericea_lespedeza.n.01", "name": "sericea_lespedeza"}, - {"id": 20038, "synset": "lentil.n.03", "name": "lentil"}, - {"id": 20039, "synset": "lentil.n.02", "name": "lentil"}, - { - "id": 20040, - "synset": "prairie_bird's-foot_trefoil.n.01", - "name": "prairie_bird's-foot_trefoil", - }, - {"id": 20041, "synset": "bird's_foot_trefoil.n.02", "name": "bird's_foot_trefoil"}, - {"id": 20042, "synset": "winged_pea.n.02", "name": "winged_pea"}, - {"id": 20043, "synset": "lupine.n.01", "name": "lupine"}, - {"id": 20044, "synset": "white_lupine.n.01", "name": "white_lupine"}, - {"id": 20045, "synset": "tree_lupine.n.01", "name": "tree_lupine"}, - {"id": 20046, "synset": "wild_lupine.n.01", "name": "wild_lupine"}, - {"id": 20047, "synset": "bluebonnet.n.01", "name": "bluebonnet"}, - {"id": 20048, "synset": "texas_bluebonnet.n.01", "name": "Texas_bluebonnet"}, - {"id": 20049, "synset": "medic.n.01", "name": "medic"}, - {"id": 20050, "synset": "moon_trefoil.n.01", "name": "moon_trefoil"}, - {"id": 20051, "synset": "sickle_alfalfa.n.01", "name": "sickle_alfalfa"}, - {"id": 20052, "synset": "calvary_clover.n.01", "name": "Calvary_clover"}, - {"id": 20053, "synset": "black_medick.n.01", "name": "black_medick"}, - {"id": 20054, "synset": "alfalfa.n.01", "name": "alfalfa"}, - {"id": 20055, "synset": "millettia.n.01", "name": "millettia"}, - {"id": 20056, "synset": "mucuna.n.01", "name": "mucuna"}, - {"id": 20057, "synset": "cowage.n.02", "name": "cowage"}, - {"id": 20058, "synset": "tolu_tree.n.01", "name": "tolu_tree"}, - {"id": 20059, "synset": "peruvian_balsam.n.01", "name": "Peruvian_balsam"}, - {"id": 20060, "synset": "sainfoin.n.01", "name": "sainfoin"}, - {"id": 20061, "synset": "restharrow.n.02", "name": "restharrow"}, - {"id": 20062, "synset": "bead_tree.n.01", "name": "bead_tree"}, - {"id": 20063, "synset": "jumby_bead.n.01", "name": "jumby_bead"}, - {"id": 20064, "synset": "locoweed.n.01", "name": "locoweed"}, - {"id": 20065, "synset": "purple_locoweed.n.01", "name": "purple_locoweed"}, - {"id": 20066, "synset": "tumbleweed.n.01", "name": "tumbleweed"}, - {"id": 20067, "synset": "yam_bean.n.02", "name": "yam_bean"}, - {"id": 20068, "synset": "shamrock_pea.n.01", "name": "shamrock_pea"}, - {"id": 20069, "synset": "pole_bean.n.01", "name": "pole_bean"}, - {"id": 20070, "synset": "kidney_bean.n.01", "name": "kidney_bean"}, - {"id": 20071, "synset": "haricot.n.01", "name": "haricot"}, - {"id": 20072, "synset": "wax_bean.n.01", "name": "wax_bean"}, - {"id": 20073, "synset": "scarlet_runner.n.01", "name": "scarlet_runner"}, - {"id": 20074, "synset": "lima_bean.n.02", "name": "lima_bean"}, - {"id": 20075, "synset": "sieva_bean.n.01", "name": "sieva_bean"}, - {"id": 20076, "synset": "tepary_bean.n.01", "name": "tepary_bean"}, - {"id": 20077, "synset": "chaparral_pea.n.01", "name": "chaparral_pea"}, - {"id": 20078, "synset": "jamaica_dogwood.n.01", "name": "Jamaica_dogwood"}, - {"id": 20079, "synset": "pea.n.02", "name": "pea"}, - {"id": 20080, "synset": "garden_pea.n.01", "name": "garden_pea"}, - {"id": 20081, "synset": "edible-pod_pea.n.01", "name": "edible-pod_pea"}, - {"id": 20082, "synset": "sugar_snap_pea.n.01", "name": "sugar_snap_pea"}, - {"id": 20083, "synset": "field_pea.n.02", "name": "field_pea"}, - {"id": 20084, "synset": "field_pea.n.01", "name": "field_pea"}, - {"id": 20085, "synset": "common_flat_pea.n.01", "name": "common_flat_pea"}, - {"id": 20086, "synset": "quira.n.02", "name": "quira"}, - {"id": 20087, "synset": "roble.n.01", "name": "roble"}, - {"id": 20088, "synset": "panama_redwood_tree.n.01", "name": "Panama_redwood_tree"}, - {"id": 20089, "synset": "indian_beech.n.01", "name": "Indian_beech"}, - {"id": 20090, "synset": "winged_bean.n.01", "name": "winged_bean"}, - {"id": 20091, "synset": "breadroot.n.01", "name": "breadroot"}, - {"id": 20092, "synset": "bloodwood_tree.n.01", "name": "bloodwood_tree"}, - {"id": 20093, "synset": "kino.n.02", "name": "kino"}, - {"id": 20094, "synset": "red_sandalwood.n.02", "name": "red_sandalwood"}, - {"id": 20095, "synset": "kudzu.n.01", "name": "kudzu"}, - {"id": 20096, "synset": "bristly_locust.n.01", "name": "bristly_locust"}, - {"id": 20097, "synset": "black_locust.n.02", "name": "black_locust"}, - {"id": 20098, "synset": "clammy_locust.n.01", "name": "clammy_locust"}, - {"id": 20099, "synset": "carib_wood.n.01", "name": "carib_wood"}, - {"id": 20100, "synset": "colorado_river_hemp.n.01", "name": "Colorado_River_hemp"}, - {"id": 20101, "synset": "scarlet_wisteria_tree.n.01", "name": "scarlet_wisteria_tree"}, - {"id": 20102, "synset": "japanese_pagoda_tree.n.01", "name": "Japanese_pagoda_tree"}, - {"id": 20103, "synset": "mescal_bean.n.01", "name": "mescal_bean"}, - {"id": 20104, "synset": "kowhai.n.01", "name": "kowhai"}, - {"id": 20105, "synset": "jade_vine.n.01", "name": "jade_vine"}, - {"id": 20106, "synset": "hoary_pea.n.01", "name": "hoary_pea"}, - {"id": 20107, "synset": "bastard_indigo.n.01", "name": "bastard_indigo"}, - {"id": 20108, "synset": "catgut.n.01", "name": "catgut"}, - {"id": 20109, "synset": "bush_pea.n.01", "name": "bush_pea"}, - {"id": 20110, "synset": "false_lupine.n.01", "name": "false_lupine"}, - {"id": 20111, "synset": "carolina_lupine.n.01", "name": "Carolina_lupine"}, - {"id": 20112, "synset": "tipu.n.01", "name": "tipu"}, - {"id": 20113, "synset": "bird's_foot_trefoil.n.01", "name": "bird's_foot_trefoil"}, - {"id": 20114, "synset": "fenugreek.n.01", "name": "fenugreek"}, - {"id": 20115, "synset": "gorse.n.01", "name": "gorse"}, - {"id": 20116, "synset": "vetch.n.01", "name": "vetch"}, - {"id": 20117, "synset": "tufted_vetch.n.01", "name": "tufted_vetch"}, - {"id": 20118, "synset": "broad_bean.n.01", "name": "broad_bean"}, - {"id": 20119, "synset": "bitter_betch.n.01", "name": "bitter_betch"}, - {"id": 20120, "synset": "bush_vetch.n.01", "name": "bush_vetch"}, - {"id": 20121, "synset": "moth_bean.n.01", "name": "moth_bean"}, - {"id": 20122, "synset": "snailflower.n.01", "name": "snailflower"}, - {"id": 20123, "synset": "mung.n.01", "name": "mung"}, - {"id": 20124, "synset": "cowpea.n.02", "name": "cowpea"}, - {"id": 20125, "synset": "cowpea.n.01", "name": "cowpea"}, - {"id": 20126, "synset": "asparagus_bean.n.01", "name": "asparagus_bean"}, - {"id": 20127, "synset": "swamp_oak.n.01", "name": "swamp_oak"}, - {"id": 20128, "synset": "keurboom.n.02", "name": "keurboom"}, - {"id": 20129, "synset": "keurboom.n.01", "name": "keurboom"}, - {"id": 20130, "synset": "japanese_wistaria.n.01", "name": "Japanese_wistaria"}, - {"id": 20131, "synset": "chinese_wistaria.n.01", "name": "Chinese_wistaria"}, - {"id": 20132, "synset": "american_wistaria.n.01", "name": "American_wistaria"}, - {"id": 20133, "synset": "silky_wisteria.n.01", "name": "silky_wisteria"}, - {"id": 20134, "synset": "palm.n.03", "name": "palm"}, - {"id": 20135, "synset": "sago_palm.n.01", "name": "sago_palm"}, - {"id": 20136, "synset": "feather_palm.n.01", "name": "feather_palm"}, - {"id": 20137, "synset": "fan_palm.n.01", "name": "fan_palm"}, - {"id": 20138, "synset": "palmetto.n.01", "name": "palmetto"}, - {"id": 20139, "synset": "coyol.n.01", "name": "coyol"}, - {"id": 20140, "synset": "grugru.n.01", "name": "grugru"}, - {"id": 20141, "synset": "areca.n.01", "name": "areca"}, - {"id": 20142, "synset": "betel_palm.n.01", "name": "betel_palm"}, - {"id": 20143, "synset": "sugar_palm.n.01", "name": "sugar_palm"}, - {"id": 20144, "synset": "piassava_palm.n.01", "name": "piassava_palm"}, - {"id": 20145, "synset": "coquilla_nut.n.01", "name": "coquilla_nut"}, - {"id": 20146, "synset": "palmyra.n.01", "name": "palmyra"}, - {"id": 20147, "synset": "calamus.n.01", "name": "calamus"}, - {"id": 20148, "synset": "rattan.n.01", "name": "rattan"}, - {"id": 20149, "synset": "lawyer_cane.n.01", "name": "lawyer_cane"}, - {"id": 20150, "synset": "fishtail_palm.n.01", "name": "fishtail_palm"}, - {"id": 20151, "synset": "wine_palm.n.01", "name": "wine_palm"}, - {"id": 20152, "synset": "wax_palm.n.03", "name": "wax_palm"}, - {"id": 20153, "synset": "coconut.n.03", "name": "coconut"}, - {"id": 20154, "synset": "carnauba.n.02", "name": "carnauba"}, - {"id": 20155, "synset": "caranday.n.01", "name": "caranday"}, - {"id": 20156, "synset": "corozo.n.01", "name": "corozo"}, - {"id": 20157, "synset": "gebang_palm.n.01", "name": "gebang_palm"}, - {"id": 20158, "synset": "latanier.n.01", "name": "latanier"}, - {"id": 20159, "synset": "talipot.n.01", "name": "talipot"}, - {"id": 20160, "synset": "oil_palm.n.01", "name": "oil_palm"}, - {"id": 20161, "synset": "african_oil_palm.n.01", "name": "African_oil_palm"}, - {"id": 20162, "synset": "american_oil_palm.n.01", "name": "American_oil_palm"}, - {"id": 20163, "synset": "palm_nut.n.01", "name": "palm_nut"}, - {"id": 20164, "synset": "cabbage_palm.n.04", "name": "cabbage_palm"}, - {"id": 20165, "synset": "cabbage_palm.n.03", "name": "cabbage_palm"}, - {"id": 20166, "synset": "true_sago_palm.n.01", "name": "true_sago_palm"}, - {"id": 20167, "synset": "nipa_palm.n.01", "name": "nipa_palm"}, - {"id": 20168, "synset": "babassu.n.01", "name": "babassu"}, - {"id": 20169, "synset": "babassu_nut.n.01", "name": "babassu_nut"}, - {"id": 20170, "synset": "cohune_palm.n.01", "name": "cohune_palm"}, - {"id": 20171, "synset": "cohune_nut.n.01", "name": "cohune_nut"}, - {"id": 20172, "synset": "date_palm.n.01", "name": "date_palm"}, - {"id": 20173, "synset": "ivory_palm.n.01", "name": "ivory_palm"}, - {"id": 20174, "synset": "raffia_palm.n.01", "name": "raffia_palm"}, - {"id": 20175, "synset": "bamboo_palm.n.02", "name": "bamboo_palm"}, - {"id": 20176, "synset": "lady_palm.n.01", "name": "lady_palm"}, - {"id": 20177, "synset": "miniature_fan_palm.n.01", "name": "miniature_fan_palm"}, - {"id": 20178, "synset": "reed_rhapis.n.01", "name": "reed_rhapis"}, - {"id": 20179, "synset": "royal_palm.n.01", "name": "royal_palm"}, - {"id": 20180, "synset": "cabbage_palm.n.02", "name": "cabbage_palm"}, - {"id": 20181, "synset": "cabbage_palmetto.n.01", "name": "cabbage_palmetto"}, - {"id": 20182, "synset": "saw_palmetto.n.01", "name": "saw_palmetto"}, - {"id": 20183, "synset": "thatch_palm.n.01", "name": "thatch_palm"}, - {"id": 20184, "synset": "key_palm.n.01", "name": "key_palm"}, - {"id": 20185, "synset": "english_plantain.n.01", "name": "English_plantain"}, - {"id": 20186, "synset": "broad-leaved_plantain.n.02", "name": "broad-leaved_plantain"}, - {"id": 20187, "synset": "hoary_plantain.n.02", "name": "hoary_plantain"}, - {"id": 20188, "synset": "fleawort.n.01", "name": "fleawort"}, - {"id": 20189, "synset": "rugel's_plantain.n.01", "name": "rugel's_plantain"}, - {"id": 20190, "synset": "hoary_plantain.n.01", "name": "hoary_plantain"}, - {"id": 20191, "synset": "buckwheat.n.01", "name": "buckwheat"}, - {"id": 20192, "synset": "prince's-feather.n.01", "name": "prince's-feather"}, - {"id": 20193, "synset": "eriogonum.n.01", "name": "eriogonum"}, - {"id": 20194, "synset": "umbrella_plant.n.02", "name": "umbrella_plant"}, - {"id": 20195, "synset": "wild_buckwheat.n.01", "name": "wild_buckwheat"}, - {"id": 20196, "synset": "rhubarb.n.02", "name": "rhubarb"}, - {"id": 20197, "synset": "himalayan_rhubarb.n.01", "name": "Himalayan_rhubarb"}, - {"id": 20198, "synset": "pie_plant.n.01", "name": "pie_plant"}, - {"id": 20199, "synset": "chinese_rhubarb.n.01", "name": "Chinese_rhubarb"}, - {"id": 20200, "synset": "sour_dock.n.01", "name": "sour_dock"}, - {"id": 20201, "synset": "sheep_sorrel.n.01", "name": "sheep_sorrel"}, - {"id": 20202, "synset": "bitter_dock.n.01", "name": "bitter_dock"}, - {"id": 20203, "synset": "french_sorrel.n.01", "name": "French_sorrel"}, - {"id": 20204, "synset": "yellow-eyed_grass.n.01", "name": "yellow-eyed_grass"}, - {"id": 20205, "synset": "commelina.n.01", "name": "commelina"}, - {"id": 20206, "synset": "spiderwort.n.01", "name": "spiderwort"}, - {"id": 20207, "synset": "pineapple.n.01", "name": "pineapple"}, - {"id": 20208, "synset": "pipewort.n.01", "name": "pipewort"}, - {"id": 20209, "synset": "water_hyacinth.n.01", "name": "water_hyacinth"}, - {"id": 20210, "synset": "water_star_grass.n.01", "name": "water_star_grass"}, - {"id": 20211, "synset": "naiad.n.01", "name": "naiad"}, - {"id": 20212, "synset": "water_plantain.n.01", "name": "water_plantain"}, - { - "id": 20213, - "synset": "narrow-leaved_water_plantain.n.01", - "name": "narrow-leaved_water_plantain", - }, - {"id": 20214, "synset": "hydrilla.n.01", "name": "hydrilla"}, - {"id": 20215, "synset": "american_frogbit.n.01", "name": "American_frogbit"}, - {"id": 20216, "synset": "waterweed.n.01", "name": "waterweed"}, - {"id": 20217, "synset": "canadian_pondweed.n.01", "name": "Canadian_pondweed"}, - {"id": 20218, "synset": "tape_grass.n.01", "name": "tape_grass"}, - {"id": 20219, "synset": "pondweed.n.01", "name": "pondweed"}, - {"id": 20220, "synset": "curled_leaf_pondweed.n.01", "name": "curled_leaf_pondweed"}, - {"id": 20221, "synset": "loddon_pondweed.n.01", "name": "loddon_pondweed"}, - {"id": 20222, "synset": "frog's_lettuce.n.01", "name": "frog's_lettuce"}, - {"id": 20223, "synset": "arrow_grass.n.01", "name": "arrow_grass"}, - {"id": 20224, "synset": "horned_pondweed.n.01", "name": "horned_pondweed"}, - {"id": 20225, "synset": "eelgrass.n.01", "name": "eelgrass"}, - {"id": 20226, "synset": "rose.n.01", "name": "rose"}, - {"id": 20227, "synset": "hip.n.05", "name": "hip"}, - {"id": 20228, "synset": "banksia_rose.n.01", "name": "banksia_rose"}, - {"id": 20229, "synset": "damask_rose.n.01", "name": "damask_rose"}, - {"id": 20230, "synset": "sweetbrier.n.01", "name": "sweetbrier"}, - {"id": 20231, "synset": "cherokee_rose.n.01", "name": "Cherokee_rose"}, - {"id": 20232, "synset": "musk_rose.n.01", "name": "musk_rose"}, - {"id": 20233, "synset": "agrimonia.n.01", "name": "agrimonia"}, - {"id": 20234, "synset": "harvest-lice.n.01", "name": "harvest-lice"}, - {"id": 20235, "synset": "fragrant_agrimony.n.01", "name": "fragrant_agrimony"}, - {"id": 20236, "synset": "alderleaf_juneberry.n.01", "name": "alderleaf_Juneberry"}, - {"id": 20237, "synset": "flowering_quince.n.01", "name": "flowering_quince"}, - {"id": 20238, "synset": "japonica.n.02", "name": "japonica"}, - {"id": 20239, "synset": "coco_plum.n.01", "name": "coco_plum"}, - {"id": 20240, "synset": "cotoneaster.n.01", "name": "cotoneaster"}, - {"id": 20241, "synset": "cotoneaster_dammeri.n.01", "name": "Cotoneaster_dammeri"}, - {"id": 20242, "synset": "cotoneaster_horizontalis.n.01", "name": "Cotoneaster_horizontalis"}, - {"id": 20243, "synset": "parsley_haw.n.01", "name": "parsley_haw"}, - {"id": 20244, "synset": "scarlet_haw.n.01", "name": "scarlet_haw"}, - {"id": 20245, "synset": "blackthorn.n.02", "name": "blackthorn"}, - {"id": 20246, "synset": "cockspur_thorn.n.01", "name": "cockspur_thorn"}, - {"id": 20247, "synset": "mayhaw.n.01", "name": "mayhaw"}, - {"id": 20248, "synset": "red_haw.n.02", "name": "red_haw"}, - {"id": 20249, "synset": "red_haw.n.01", "name": "red_haw"}, - {"id": 20250, "synset": "quince.n.01", "name": "quince"}, - {"id": 20251, "synset": "mountain_avens.n.01", "name": "mountain_avens"}, - {"id": 20252, "synset": "loquat.n.01", "name": "loquat"}, - {"id": 20253, "synset": "beach_strawberry.n.01", "name": "beach_strawberry"}, - {"id": 20254, "synset": "virginia_strawberry.n.01", "name": "Virginia_strawberry"}, - {"id": 20255, "synset": "avens.n.01", "name": "avens"}, - {"id": 20256, "synset": "yellow_avens.n.02", "name": "yellow_avens"}, - {"id": 20257, "synset": "yellow_avens.n.01", "name": "yellow_avens"}, - {"id": 20258, "synset": "prairie_smoke.n.01", "name": "prairie_smoke"}, - {"id": 20259, "synset": "bennet.n.01", "name": "bennet"}, - {"id": 20260, "synset": "toyon.n.01", "name": "toyon"}, - {"id": 20261, "synset": "apple_tree.n.01", "name": "apple_tree"}, - {"id": 20262, "synset": "apple.n.02", "name": "apple"}, - {"id": 20263, "synset": "wild_apple.n.01", "name": "wild_apple"}, - {"id": 20264, "synset": "crab_apple.n.01", "name": "crab_apple"}, - {"id": 20265, "synset": "siberian_crab.n.01", "name": "Siberian_crab"}, - {"id": 20266, "synset": "wild_crab.n.01", "name": "wild_crab"}, - {"id": 20267, "synset": "american_crab_apple.n.01", "name": "American_crab_apple"}, - {"id": 20268, "synset": "oregon_crab_apple.n.01", "name": "Oregon_crab_apple"}, - {"id": 20269, "synset": "southern_crab_apple.n.01", "name": "Southern_crab_apple"}, - {"id": 20270, "synset": "iowa_crab.n.01", "name": "Iowa_crab"}, - {"id": 20271, "synset": "bechtel_crab.n.01", "name": "Bechtel_crab"}, - {"id": 20272, "synset": "medlar.n.02", "name": "medlar"}, - {"id": 20273, "synset": "cinquefoil.n.01", "name": "cinquefoil"}, - {"id": 20274, "synset": "silverweed.n.02", "name": "silverweed"}, - {"id": 20275, "synset": "salad_burnet.n.01", "name": "salad_burnet"}, - {"id": 20276, "synset": "plum.n.01", "name": "plum"}, - {"id": 20277, "synset": "wild_plum.n.01", "name": "wild_plum"}, - {"id": 20278, "synset": "allegheny_plum.n.01", "name": "Allegheny_plum"}, - {"id": 20279, "synset": "american_red_plum.n.01", "name": "American_red_plum"}, - {"id": 20280, "synset": "chickasaw_plum.n.01", "name": "chickasaw_plum"}, - {"id": 20281, "synset": "beach_plum.n.01", "name": "beach_plum"}, - {"id": 20282, "synset": "common_plum.n.01", "name": "common_plum"}, - {"id": 20283, "synset": "bullace.n.01", "name": "bullace"}, - {"id": 20284, "synset": "damson_plum.n.02", "name": "damson_plum"}, - {"id": 20285, "synset": "big-tree_plum.n.01", "name": "big-tree_plum"}, - {"id": 20286, "synset": "canada_plum.n.01", "name": "Canada_plum"}, - {"id": 20287, "synset": "plumcot.n.01", "name": "plumcot"}, - {"id": 20288, "synset": "apricot.n.01", "name": "apricot"}, - {"id": 20289, "synset": "japanese_apricot.n.01", "name": "Japanese_apricot"}, - {"id": 20290, "synset": "common_apricot.n.01", "name": "common_apricot"}, - {"id": 20291, "synset": "purple_apricot.n.01", "name": "purple_apricot"}, - {"id": 20292, "synset": "cherry.n.02", "name": "cherry"}, - {"id": 20293, "synset": "wild_cherry.n.02", "name": "wild_cherry"}, - {"id": 20294, "synset": "wild_cherry.n.01", "name": "wild_cherry"}, - {"id": 20295, "synset": "sweet_cherry.n.01", "name": "sweet_cherry"}, - {"id": 20296, "synset": "heart_cherry.n.01", "name": "heart_cherry"}, - {"id": 20297, "synset": "gean.n.01", "name": "gean"}, - {"id": 20298, "synset": "capulin.n.01", "name": "capulin"}, - {"id": 20299, "synset": "cherry_laurel.n.02", "name": "cherry_laurel"}, - {"id": 20300, "synset": "cherry_plum.n.01", "name": "cherry_plum"}, - {"id": 20301, "synset": "sour_cherry.n.01", "name": "sour_cherry"}, - {"id": 20302, "synset": "amarelle.n.01", "name": "amarelle"}, - {"id": 20303, "synset": "morello.n.01", "name": "morello"}, - {"id": 20304, "synset": "marasca.n.01", "name": "marasca"}, - {"id": 20305, "synset": "almond_tree.n.01", "name": "almond_tree"}, - {"id": 20306, "synset": "almond.n.01", "name": "almond"}, - {"id": 20307, "synset": "bitter_almond.n.01", "name": "bitter_almond"}, - {"id": 20308, "synset": "jordan_almond.n.01", "name": "jordan_almond"}, - {"id": 20309, "synset": "dwarf_flowering_almond.n.01", "name": "dwarf_flowering_almond"}, - {"id": 20310, "synset": "holly-leaved_cherry.n.01", "name": "holly-leaved_cherry"}, - {"id": 20311, "synset": "fuji.n.01", "name": "fuji"}, - {"id": 20312, "synset": "flowering_almond.n.02", "name": "flowering_almond"}, - {"id": 20313, "synset": "cherry_laurel.n.01", "name": "cherry_laurel"}, - {"id": 20314, "synset": "catalina_cherry.n.01", "name": "Catalina_cherry"}, - {"id": 20315, "synset": "bird_cherry.n.01", "name": "bird_cherry"}, - {"id": 20316, "synset": "hagberry_tree.n.01", "name": "hagberry_tree"}, - {"id": 20317, "synset": "hagberry.n.01", "name": "hagberry"}, - {"id": 20318, "synset": "pin_cherry.n.01", "name": "pin_cherry"}, - {"id": 20319, "synset": "peach.n.01", "name": "peach"}, - {"id": 20320, "synset": "nectarine.n.01", "name": "nectarine"}, - {"id": 20321, "synset": "sand_cherry.n.01", "name": "sand_cherry"}, - {"id": 20322, "synset": "japanese_plum.n.01", "name": "Japanese_plum"}, - {"id": 20323, "synset": "black_cherry.n.01", "name": "black_cherry"}, - {"id": 20324, "synset": "flowering_cherry.n.01", "name": "flowering_cherry"}, - {"id": 20325, "synset": "oriental_cherry.n.01", "name": "oriental_cherry"}, - {"id": 20326, "synset": "japanese_flowering_cherry.n.01", "name": "Japanese_flowering_cherry"}, - {"id": 20327, "synset": "sierra_plum.n.01", "name": "Sierra_plum"}, - {"id": 20328, "synset": "rosebud_cherry.n.01", "name": "rosebud_cherry"}, - {"id": 20329, "synset": "russian_almond.n.01", "name": "Russian_almond"}, - {"id": 20330, "synset": "flowering_almond.n.01", "name": "flowering_almond"}, - {"id": 20331, "synset": "chokecherry.n.02", "name": "chokecherry"}, - {"id": 20332, "synset": "chokecherry.n.01", "name": "chokecherry"}, - {"id": 20333, "synset": "western_chokecherry.n.01", "name": "western_chokecherry"}, - {"id": 20334, "synset": "pyracantha.n.01", "name": "Pyracantha"}, - {"id": 20335, "synset": "pear.n.02", "name": "pear"}, - {"id": 20336, "synset": "fruit_tree.n.01", "name": "fruit_tree"}, - {"id": 20337, "synset": "bramble_bush.n.01", "name": "bramble_bush"}, - {"id": 20338, "synset": "lawyerbush.n.01", "name": "lawyerbush"}, - {"id": 20339, "synset": "stone_bramble.n.01", "name": "stone_bramble"}, - {"id": 20340, "synset": "sand_blackberry.n.01", "name": "sand_blackberry"}, - {"id": 20341, "synset": "boysenberry.n.01", "name": "boysenberry"}, - {"id": 20342, "synset": "loganberry.n.01", "name": "loganberry"}, - {"id": 20343, "synset": "american_dewberry.n.02", "name": "American_dewberry"}, - {"id": 20344, "synset": "northern_dewberry.n.01", "name": "Northern_dewberry"}, - {"id": 20345, "synset": "southern_dewberry.n.01", "name": "Southern_dewberry"}, - {"id": 20346, "synset": "swamp_dewberry.n.01", "name": "swamp_dewberry"}, - {"id": 20347, "synset": "european_dewberry.n.01", "name": "European_dewberry"}, - {"id": 20348, "synset": "raspberry.n.01", "name": "raspberry"}, - {"id": 20349, "synset": "wild_raspberry.n.01", "name": "wild_raspberry"}, - {"id": 20350, "synset": "american_raspberry.n.01", "name": "American_raspberry"}, - {"id": 20351, "synset": "black_raspberry.n.01", "name": "black_raspberry"}, - {"id": 20352, "synset": "salmonberry.n.03", "name": "salmonberry"}, - {"id": 20353, "synset": "salmonberry.n.02", "name": "salmonberry"}, - {"id": 20354, "synset": "wineberry.n.01", "name": "wineberry"}, - {"id": 20355, "synset": "mountain_ash.n.01", "name": "mountain_ash"}, - {"id": 20356, "synset": "rowan.n.01", "name": "rowan"}, - {"id": 20357, "synset": "rowanberry.n.01", "name": "rowanberry"}, - {"id": 20358, "synset": "american_mountain_ash.n.01", "name": "American_mountain_ash"}, - {"id": 20359, "synset": "western_mountain_ash.n.01", "name": "Western_mountain_ash"}, - {"id": 20360, "synset": "service_tree.n.01", "name": "service_tree"}, - {"id": 20361, "synset": "wild_service_tree.n.01", "name": "wild_service_tree"}, - {"id": 20362, "synset": "spirea.n.02", "name": "spirea"}, - {"id": 20363, "synset": "bridal_wreath.n.02", "name": "bridal_wreath"}, - {"id": 20364, "synset": "madderwort.n.01", "name": "madderwort"}, - {"id": 20365, "synset": "indian_madder.n.01", "name": "Indian_madder"}, - {"id": 20366, "synset": "madder.n.01", "name": "madder"}, - {"id": 20367, "synset": "woodruff.n.02", "name": "woodruff"}, - {"id": 20368, "synset": "dagame.n.01", "name": "dagame"}, - {"id": 20369, "synset": "blolly.n.01", "name": "blolly"}, - {"id": 20370, "synset": "coffee.n.02", "name": "coffee"}, - {"id": 20371, "synset": "arabian_coffee.n.01", "name": "Arabian_coffee"}, - {"id": 20372, "synset": "liberian_coffee.n.01", "name": "Liberian_coffee"}, - {"id": 20373, "synset": "robusta_coffee.n.01", "name": "robusta_coffee"}, - {"id": 20374, "synset": "cinchona.n.02", "name": "cinchona"}, - {"id": 20375, "synset": "cartagena_bark.n.01", "name": "Cartagena_bark"}, - {"id": 20376, "synset": "calisaya.n.01", "name": "calisaya"}, - {"id": 20377, "synset": "cinchona_tree.n.01", "name": "cinchona_tree"}, - {"id": 20378, "synset": "cinchona.n.01", "name": "cinchona"}, - {"id": 20379, "synset": "bedstraw.n.01", "name": "bedstraw"}, - {"id": 20380, "synset": "sweet_woodruff.n.01", "name": "sweet_woodruff"}, - {"id": 20381, "synset": "northern_bedstraw.n.01", "name": "Northern_bedstraw"}, - {"id": 20382, "synset": "yellow_bedstraw.n.01", "name": "yellow_bedstraw"}, - {"id": 20383, "synset": "wild_licorice.n.01", "name": "wild_licorice"}, - {"id": 20384, "synset": "cleavers.n.01", "name": "cleavers"}, - {"id": 20385, "synset": "wild_madder.n.01", "name": "wild_madder"}, - {"id": 20386, "synset": "cape_jasmine.n.01", "name": "cape_jasmine"}, - {"id": 20387, "synset": "genipa.n.01", "name": "genipa"}, - {"id": 20388, "synset": "genipap_fruit.n.01", "name": "genipap_fruit"}, - {"id": 20389, "synset": "hamelia.n.01", "name": "hamelia"}, - {"id": 20390, "synset": "scarlet_bush.n.01", "name": "scarlet_bush"}, - {"id": 20391, "synset": "lemonwood.n.02", "name": "lemonwood"}, - {"id": 20392, "synset": "negro_peach.n.01", "name": "negro_peach"}, - {"id": 20393, "synset": "wild_medlar.n.01", "name": "wild_medlar"}, - {"id": 20394, "synset": "spanish_tamarind.n.01", "name": "Spanish_tamarind"}, - {"id": 20395, "synset": "abelia.n.01", "name": "abelia"}, - {"id": 20396, "synset": "bush_honeysuckle.n.02", "name": "bush_honeysuckle"}, - {"id": 20397, "synset": "american_twinflower.n.01", "name": "American_twinflower"}, - {"id": 20398, "synset": "honeysuckle.n.01", "name": "honeysuckle"}, - {"id": 20399, "synset": "american_fly_honeysuckle.n.01", "name": "American_fly_honeysuckle"}, - {"id": 20400, "synset": "italian_honeysuckle.n.01", "name": "Italian_honeysuckle"}, - {"id": 20401, "synset": "yellow_honeysuckle.n.01", "name": "yellow_honeysuckle"}, - {"id": 20402, "synset": "hairy_honeysuckle.n.01", "name": "hairy_honeysuckle"}, - {"id": 20403, "synset": "japanese_honeysuckle.n.01", "name": "Japanese_honeysuckle"}, - {"id": 20404, "synset": "hall's_honeysuckle.n.01", "name": "Hall's_honeysuckle"}, - {"id": 20405, "synset": "morrow's_honeysuckle.n.01", "name": "Morrow's_honeysuckle"}, - {"id": 20406, "synset": "woodbine.n.02", "name": "woodbine"}, - {"id": 20407, "synset": "trumpet_honeysuckle.n.01", "name": "trumpet_honeysuckle"}, - {"id": 20408, "synset": "european_fly_honeysuckle.n.01", "name": "European_fly_honeysuckle"}, - {"id": 20409, "synset": "swamp_fly_honeysuckle.n.01", "name": "swamp_fly_honeysuckle"}, - {"id": 20410, "synset": "snowberry.n.01", "name": "snowberry"}, - {"id": 20411, "synset": "coralberry.n.01", "name": "coralberry"}, - {"id": 20412, "synset": "blue_elder.n.01", "name": "blue_elder"}, - {"id": 20413, "synset": "dwarf_elder.n.01", "name": "dwarf_elder"}, - {"id": 20414, "synset": "american_red_elder.n.01", "name": "American_red_elder"}, - {"id": 20415, "synset": "european_red_elder.n.01", "name": "European_red_elder"}, - {"id": 20416, "synset": "feverroot.n.01", "name": "feverroot"}, - {"id": 20417, "synset": "cranberry_bush.n.01", "name": "cranberry_bush"}, - {"id": 20418, "synset": "wayfaring_tree.n.01", "name": "wayfaring_tree"}, - {"id": 20419, "synset": "guelder_rose.n.01", "name": "guelder_rose"}, - {"id": 20420, "synset": "arrow_wood.n.01", "name": "arrow_wood"}, - {"id": 20421, "synset": "black_haw.n.02", "name": "black_haw"}, - {"id": 20422, "synset": "weigela.n.01", "name": "weigela"}, - {"id": 20423, "synset": "teasel.n.01", "name": "teasel"}, - {"id": 20424, "synset": "common_teasel.n.01", "name": "common_teasel"}, - {"id": 20425, "synset": "fuller's_teasel.n.01", "name": "fuller's_teasel"}, - {"id": 20426, "synset": "wild_teasel.n.01", "name": "wild_teasel"}, - {"id": 20427, "synset": "scabious.n.01", "name": "scabious"}, - {"id": 20428, "synset": "sweet_scabious.n.01", "name": "sweet_scabious"}, - {"id": 20429, "synset": "field_scabious.n.01", "name": "field_scabious"}, - {"id": 20430, "synset": "jewelweed.n.01", "name": "jewelweed"}, - {"id": 20431, "synset": "geranium.n.01", "name": "geranium"}, - {"id": 20432, "synset": "cranesbill.n.01", "name": "cranesbill"}, - {"id": 20433, "synset": "wild_geranium.n.01", "name": "wild_geranium"}, - {"id": 20434, "synset": "meadow_cranesbill.n.01", "name": "meadow_cranesbill"}, - {"id": 20435, "synset": "richardson's_geranium.n.01", "name": "Richardson's_geranium"}, - {"id": 20436, "synset": "herb_robert.n.01", "name": "herb_robert"}, - {"id": 20437, "synset": "sticky_geranium.n.01", "name": "sticky_geranium"}, - {"id": 20438, "synset": "dove's_foot_geranium.n.01", "name": "dove's_foot_geranium"}, - {"id": 20439, "synset": "rose_geranium.n.01", "name": "rose_geranium"}, - {"id": 20440, "synset": "fish_geranium.n.01", "name": "fish_geranium"}, - {"id": 20441, "synset": "ivy_geranium.n.01", "name": "ivy_geranium"}, - {"id": 20442, "synset": "apple_geranium.n.01", "name": "apple_geranium"}, - {"id": 20443, "synset": "lemon_geranium.n.01", "name": "lemon_geranium"}, - {"id": 20444, "synset": "storksbill.n.01", "name": "storksbill"}, - {"id": 20445, "synset": "musk_clover.n.01", "name": "musk_clover"}, - {"id": 20446, "synset": "incense_tree.n.01", "name": "incense_tree"}, - {"id": 20447, "synset": "elephant_tree.n.01", "name": "elephant_tree"}, - {"id": 20448, "synset": "gumbo-limbo.n.01", "name": "gumbo-limbo"}, - {"id": 20449, "synset": "boswellia_carteri.n.01", "name": "Boswellia_carteri"}, - {"id": 20450, "synset": "salai.n.01", "name": "salai"}, - {"id": 20451, "synset": "balm_of_gilead.n.03", "name": "balm_of_gilead"}, - {"id": 20452, "synset": "myrrh_tree.n.01", "name": "myrrh_tree"}, - {"id": 20453, "synset": "protium_heptaphyllum.n.01", "name": "Protium_heptaphyllum"}, - {"id": 20454, "synset": "protium_guianense.n.01", "name": "Protium_guianense"}, - {"id": 20455, "synset": "water_starwort.n.01", "name": "water_starwort"}, - {"id": 20456, "synset": "barbados_cherry.n.01", "name": "barbados_cherry"}, - {"id": 20457, "synset": "mahogany.n.02", "name": "mahogany"}, - {"id": 20458, "synset": "chinaberry.n.02", "name": "chinaberry"}, - {"id": 20459, "synset": "neem.n.01", "name": "neem"}, - {"id": 20460, "synset": "neem_seed.n.01", "name": "neem_seed"}, - {"id": 20461, "synset": "spanish_cedar.n.01", "name": "Spanish_cedar"}, - {"id": 20462, "synset": "satinwood.n.03", "name": "satinwood"}, - {"id": 20463, "synset": "african_scented_mahogany.n.01", "name": "African_scented_mahogany"}, - {"id": 20464, "synset": "silver_ash.n.01", "name": "silver_ash"}, - {"id": 20465, "synset": "native_beech.n.01", "name": "native_beech"}, - {"id": 20466, "synset": "bunji-bunji.n.01", "name": "bunji-bunji"}, - {"id": 20467, "synset": "african_mahogany.n.01", "name": "African_mahogany"}, - {"id": 20468, "synset": "lanseh_tree.n.01", "name": "lanseh_tree"}, - {"id": 20469, "synset": "true_mahogany.n.01", "name": "true_mahogany"}, - {"id": 20470, "synset": "honduras_mahogany.n.01", "name": "Honduras_mahogany"}, - {"id": 20471, "synset": "philippine_mahogany.n.02", "name": "Philippine_mahogany"}, - {"id": 20472, "synset": "caracolito.n.01", "name": "caracolito"}, - {"id": 20473, "synset": "common_wood_sorrel.n.01", "name": "common_wood_sorrel"}, - {"id": 20474, "synset": "bermuda_buttercup.n.01", "name": "Bermuda_buttercup"}, - {"id": 20475, "synset": "creeping_oxalis.n.01", "name": "creeping_oxalis"}, - {"id": 20476, "synset": "goatsfoot.n.01", "name": "goatsfoot"}, - {"id": 20477, "synset": "violet_wood_sorrel.n.01", "name": "violet_wood_sorrel"}, - {"id": 20478, "synset": "oca.n.01", "name": "oca"}, - {"id": 20479, "synset": "carambola.n.01", "name": "carambola"}, - {"id": 20480, "synset": "bilimbi.n.01", "name": "bilimbi"}, - {"id": 20481, "synset": "milkwort.n.01", "name": "milkwort"}, - {"id": 20482, "synset": "senega.n.02", "name": "senega"}, - {"id": 20483, "synset": "orange_milkwort.n.01", "name": "orange_milkwort"}, - {"id": 20484, "synset": "flowering_wintergreen.n.01", "name": "flowering_wintergreen"}, - {"id": 20485, "synset": "seneca_snakeroot.n.01", "name": "Seneca_snakeroot"}, - {"id": 20486, "synset": "common_milkwort.n.01", "name": "common_milkwort"}, - {"id": 20487, "synset": "rue.n.01", "name": "rue"}, - {"id": 20488, "synset": "citrus.n.02", "name": "citrus"}, - {"id": 20489, "synset": "orange.n.03", "name": "orange"}, - {"id": 20490, "synset": "sour_orange.n.01", "name": "sour_orange"}, - {"id": 20491, "synset": "bergamot.n.01", "name": "bergamot"}, - {"id": 20492, "synset": "pomelo.n.01", "name": "pomelo"}, - {"id": 20493, "synset": "citron.n.02", "name": "citron"}, - {"id": 20494, "synset": "grapefruit.n.01", "name": "grapefruit"}, - {"id": 20495, "synset": "mandarin.n.01", "name": "mandarin"}, - {"id": 20496, "synset": "tangerine.n.01", "name": "tangerine"}, - {"id": 20497, "synset": "satsuma.n.01", "name": "satsuma"}, - {"id": 20498, "synset": "sweet_orange.n.02", "name": "sweet_orange"}, - {"id": 20499, "synset": "temple_orange.n.01", "name": "temple_orange"}, - {"id": 20500, "synset": "tangelo.n.01", "name": "tangelo"}, - {"id": 20501, "synset": "rangpur.n.01", "name": "rangpur"}, - {"id": 20502, "synset": "lemon.n.03", "name": "lemon"}, - {"id": 20503, "synset": "sweet_lemon.n.01", "name": "sweet_lemon"}, - {"id": 20504, "synset": "lime.n.04", "name": "lime"}, - {"id": 20505, "synset": "citrange.n.01", "name": "citrange"}, - {"id": 20506, "synset": "fraxinella.n.01", "name": "fraxinella"}, - {"id": 20507, "synset": "kumquat.n.01", "name": "kumquat"}, - {"id": 20508, "synset": "marumi.n.01", "name": "marumi"}, - {"id": 20509, "synset": "nagami.n.01", "name": "nagami"}, - {"id": 20510, "synset": "cork_tree.n.01", "name": "cork_tree"}, - {"id": 20511, "synset": "trifoliate_orange.n.01", "name": "trifoliate_orange"}, - {"id": 20512, "synset": "prickly_ash.n.01", "name": "prickly_ash"}, - {"id": 20513, "synset": "toothache_tree.n.01", "name": "toothache_tree"}, - {"id": 20514, "synset": "hercules'-club.n.01", "name": "Hercules'-club"}, - {"id": 20515, "synset": "bitterwood_tree.n.01", "name": "bitterwood_tree"}, - {"id": 20516, "synset": "marupa.n.01", "name": "marupa"}, - {"id": 20517, "synset": "paradise_tree.n.01", "name": "paradise_tree"}, - {"id": 20518, "synset": "ailanthus.n.01", "name": "ailanthus"}, - {"id": 20519, "synset": "tree_of_heaven.n.01", "name": "tree_of_heaven"}, - {"id": 20520, "synset": "wild_mango.n.01", "name": "wild_mango"}, - {"id": 20521, "synset": "pepper_tree.n.02", "name": "pepper_tree"}, - {"id": 20522, "synset": "jamaica_quassia.n.02", "name": "Jamaica_quassia"}, - {"id": 20523, "synset": "quassia.n.02", "name": "quassia"}, - {"id": 20524, "synset": "nasturtium.n.01", "name": "nasturtium"}, - {"id": 20525, "synset": "garden_nasturtium.n.01", "name": "garden_nasturtium"}, - {"id": 20526, "synset": "bush_nasturtium.n.01", "name": "bush_nasturtium"}, - {"id": 20527, "synset": "canarybird_flower.n.01", "name": "canarybird_flower"}, - {"id": 20528, "synset": "bean_caper.n.01", "name": "bean_caper"}, - {"id": 20529, "synset": "palo_santo.n.01", "name": "palo_santo"}, - {"id": 20530, "synset": "lignum_vitae.n.02", "name": "lignum_vitae"}, - {"id": 20531, "synset": "creosote_bush.n.01", "name": "creosote_bush"}, - {"id": 20532, "synset": "caltrop.n.01", "name": "caltrop"}, - {"id": 20533, "synset": "willow.n.01", "name": "willow"}, - {"id": 20534, "synset": "osier.n.02", "name": "osier"}, - {"id": 20535, "synset": "white_willow.n.01", "name": "white_willow"}, - {"id": 20536, "synset": "silver_willow.n.01", "name": "silver_willow"}, - {"id": 20537, "synset": "golden_willow.n.01", "name": "golden_willow"}, - {"id": 20538, "synset": "cricket-bat_willow.n.01", "name": "cricket-bat_willow"}, - {"id": 20539, "synset": "arctic_willow.n.01", "name": "arctic_willow"}, - {"id": 20540, "synset": "weeping_willow.n.01", "name": "weeping_willow"}, - {"id": 20541, "synset": "wisconsin_weeping_willow.n.01", "name": "Wisconsin_weeping_willow"}, - {"id": 20542, "synset": "pussy_willow.n.01", "name": "pussy_willow"}, - {"id": 20543, "synset": "sallow.n.01", "name": "sallow"}, - {"id": 20544, "synset": "goat_willow.n.01", "name": "goat_willow"}, - {"id": 20545, "synset": "peachleaf_willow.n.01", "name": "peachleaf_willow"}, - {"id": 20546, "synset": "almond_willow.n.01", "name": "almond_willow"}, - {"id": 20547, "synset": "hoary_willow.n.01", "name": "hoary_willow"}, - {"id": 20548, "synset": "crack_willow.n.01", "name": "crack_willow"}, - {"id": 20549, "synset": "prairie_willow.n.01", "name": "prairie_willow"}, - {"id": 20550, "synset": "dwarf_willow.n.01", "name": "dwarf_willow"}, - {"id": 20551, "synset": "grey_willow.n.01", "name": "grey_willow"}, - {"id": 20552, "synset": "arroyo_willow.n.01", "name": "arroyo_willow"}, - {"id": 20553, "synset": "shining_willow.n.01", "name": "shining_willow"}, - {"id": 20554, "synset": "swamp_willow.n.01", "name": "swamp_willow"}, - {"id": 20555, "synset": "bay_willow.n.01", "name": "bay_willow"}, - {"id": 20556, "synset": "purple_willow.n.01", "name": "purple_willow"}, - {"id": 20557, "synset": "balsam_willow.n.01", "name": "balsam_willow"}, - {"id": 20558, "synset": "creeping_willow.n.01", "name": "creeping_willow"}, - {"id": 20559, "synset": "sitka_willow.n.01", "name": "Sitka_willow"}, - {"id": 20560, "synset": "dwarf_grey_willow.n.01", "name": "dwarf_grey_willow"}, - {"id": 20561, "synset": "bearberry_willow.n.01", "name": "bearberry_willow"}, - {"id": 20562, "synset": "common_osier.n.01", "name": "common_osier"}, - {"id": 20563, "synset": "poplar.n.02", "name": "poplar"}, - {"id": 20564, "synset": "balsam_poplar.n.01", "name": "balsam_poplar"}, - {"id": 20565, "synset": "white_poplar.n.01", "name": "white_poplar"}, - {"id": 20566, "synset": "grey_poplar.n.01", "name": "grey_poplar"}, - {"id": 20567, "synset": "black_poplar.n.01", "name": "black_poplar"}, - {"id": 20568, "synset": "lombardy_poplar.n.01", "name": "Lombardy_poplar"}, - {"id": 20569, "synset": "cottonwood.n.01", "name": "cottonwood"}, - {"id": 20570, "synset": "eastern_cottonwood.n.01", "name": "Eastern_cottonwood"}, - {"id": 20571, "synset": "black_cottonwood.n.02", "name": "black_cottonwood"}, - {"id": 20572, "synset": "swamp_cottonwood.n.01", "name": "swamp_cottonwood"}, - {"id": 20573, "synset": "aspen.n.01", "name": "aspen"}, - {"id": 20574, "synset": "quaking_aspen.n.01", "name": "quaking_aspen"}, - {"id": 20575, "synset": "american_quaking_aspen.n.01", "name": "American_quaking_aspen"}, - {"id": 20576, "synset": "canadian_aspen.n.01", "name": "Canadian_aspen"}, - {"id": 20577, "synset": "sandalwood_tree.n.01", "name": "sandalwood_tree"}, - {"id": 20578, "synset": "quandong.n.01", "name": "quandong"}, - {"id": 20579, "synset": "rabbitwood.n.01", "name": "rabbitwood"}, - {"id": 20580, "synset": "loranthaceae.n.01", "name": "Loranthaceae"}, - {"id": 20581, "synset": "mistletoe.n.03", "name": "mistletoe"}, - {"id": 20582, "synset": "american_mistletoe.n.02", "name": "American_mistletoe"}, - {"id": 20583, "synset": "mistletoe.n.02", "name": "mistletoe"}, - {"id": 20584, "synset": "american_mistletoe.n.01", "name": "American_mistletoe"}, - {"id": 20585, "synset": "aalii.n.01", "name": "aalii"}, - {"id": 20586, "synset": "soapberry.n.01", "name": "soapberry"}, - {"id": 20587, "synset": "wild_china_tree.n.01", "name": "wild_China_tree"}, - {"id": 20588, "synset": "china_tree.n.01", "name": "China_tree"}, - {"id": 20589, "synset": "akee.n.01", "name": "akee"}, - {"id": 20590, "synset": "soapberry_vine.n.01", "name": "soapberry_vine"}, - {"id": 20591, "synset": "heartseed.n.01", "name": "heartseed"}, - {"id": 20592, "synset": "balloon_vine.n.01", "name": "balloon_vine"}, - {"id": 20593, "synset": "longan.n.01", "name": "longan"}, - {"id": 20594, "synset": "harpullia.n.01", "name": "harpullia"}, - {"id": 20595, "synset": "harpulla.n.01", "name": "harpulla"}, - {"id": 20596, "synset": "moreton_bay_tulipwood.n.01", "name": "Moreton_Bay_tulipwood"}, - {"id": 20597, "synset": "litchi.n.01", "name": "litchi"}, - {"id": 20598, "synset": "spanish_lime.n.01", "name": "Spanish_lime"}, - {"id": 20599, "synset": "rambutan.n.01", "name": "rambutan"}, - {"id": 20600, "synset": "pulasan.n.01", "name": "pulasan"}, - {"id": 20601, "synset": "pachysandra.n.01", "name": "pachysandra"}, - {"id": 20602, "synset": "allegheny_spurge.n.01", "name": "Allegheny_spurge"}, - {"id": 20603, "synset": "bittersweet.n.02", "name": "bittersweet"}, - {"id": 20604, "synset": "spindle_tree.n.01", "name": "spindle_tree"}, - {"id": 20605, "synset": "winged_spindle_tree.n.01", "name": "winged_spindle_tree"}, - {"id": 20606, "synset": "wahoo.n.02", "name": "wahoo"}, - {"id": 20607, "synset": "strawberry_bush.n.01", "name": "strawberry_bush"}, - {"id": 20608, "synset": "evergreen_bittersweet.n.01", "name": "evergreen_bittersweet"}, - {"id": 20609, "synset": "cyrilla.n.01", "name": "cyrilla"}, - {"id": 20610, "synset": "titi.n.01", "name": "titi"}, - {"id": 20611, "synset": "crowberry.n.01", "name": "crowberry"}, - {"id": 20612, "synset": "maple.n.02", "name": "maple"}, - {"id": 20613, "synset": "silver_maple.n.01", "name": "silver_maple"}, - {"id": 20614, "synset": "sugar_maple.n.01", "name": "sugar_maple"}, - {"id": 20615, "synset": "red_maple.n.01", "name": "red_maple"}, - {"id": 20616, "synset": "moosewood.n.01", "name": "moosewood"}, - {"id": 20617, "synset": "oregon_maple.n.01", "name": "Oregon_maple"}, - {"id": 20618, "synset": "dwarf_maple.n.01", "name": "dwarf_maple"}, - {"id": 20619, "synset": "mountain_maple.n.01", "name": "mountain_maple"}, - {"id": 20620, "synset": "vine_maple.n.01", "name": "vine_maple"}, - {"id": 20621, "synset": "hedge_maple.n.01", "name": "hedge_maple"}, - {"id": 20622, "synset": "norway_maple.n.01", "name": "Norway_maple"}, - {"id": 20623, "synset": "sycamore.n.03", "name": "sycamore"}, - {"id": 20624, "synset": "box_elder.n.01", "name": "box_elder"}, - {"id": 20625, "synset": "california_box_elder.n.01", "name": "California_box_elder"}, - {"id": 20626, "synset": "pointed-leaf_maple.n.01", "name": "pointed-leaf_maple"}, - {"id": 20627, "synset": "japanese_maple.n.02", "name": "Japanese_maple"}, - {"id": 20628, "synset": "japanese_maple.n.01", "name": "Japanese_maple"}, - {"id": 20629, "synset": "holly.n.01", "name": "holly"}, - {"id": 20630, "synset": "chinese_holly.n.01", "name": "Chinese_holly"}, - {"id": 20631, "synset": "bearberry.n.02", "name": "bearberry"}, - {"id": 20632, "synset": "inkberry.n.01", "name": "inkberry"}, - {"id": 20633, "synset": "mate.n.07", "name": "mate"}, - {"id": 20634, "synset": "american_holly.n.01", "name": "American_holly"}, - {"id": 20635, "synset": "low_gallberry_holly.n.01", "name": "low_gallberry_holly"}, - {"id": 20636, "synset": "tall_gallberry_holly.n.01", "name": "tall_gallberry_holly"}, - {"id": 20637, "synset": "yaupon_holly.n.01", "name": "yaupon_holly"}, - {"id": 20638, "synset": "deciduous_holly.n.01", "name": "deciduous_holly"}, - {"id": 20639, "synset": "juneberry_holly.n.01", "name": "juneberry_holly"}, - {"id": 20640, "synset": "largeleaf_holly.n.01", "name": "largeleaf_holly"}, - {"id": 20641, "synset": "geogia_holly.n.01", "name": "Geogia_holly"}, - {"id": 20642, "synset": "common_winterberry_holly.n.01", "name": "common_winterberry_holly"}, - {"id": 20643, "synset": "smooth_winterberry_holly.n.01", "name": "smooth_winterberry_holly"}, - {"id": 20644, "synset": "cashew.n.01", "name": "cashew"}, - {"id": 20645, "synset": "goncalo_alves.n.01", "name": "goncalo_alves"}, - {"id": 20646, "synset": "venetian_sumac.n.01", "name": "Venetian_sumac"}, - {"id": 20647, "synset": "laurel_sumac.n.01", "name": "laurel_sumac"}, - {"id": 20648, "synset": "mango.n.01", "name": "mango"}, - {"id": 20649, "synset": "pistachio.n.01", "name": "pistachio"}, - {"id": 20650, "synset": "terebinth.n.01", "name": "terebinth"}, - {"id": 20651, "synset": "mastic.n.03", "name": "mastic"}, - {"id": 20652, "synset": "australian_sumac.n.01", "name": "Australian_sumac"}, - {"id": 20653, "synset": "sumac.n.02", "name": "sumac"}, - {"id": 20654, "synset": "smooth_sumac.n.01", "name": "smooth_sumac"}, - {"id": 20655, "synset": "sugar-bush.n.01", "name": "sugar-bush"}, - {"id": 20656, "synset": "staghorn_sumac.n.01", "name": "staghorn_sumac"}, - {"id": 20657, "synset": "squawbush.n.01", "name": "squawbush"}, - {"id": 20658, "synset": "aroeira_blanca.n.01", "name": "aroeira_blanca"}, - {"id": 20659, "synset": "pepper_tree.n.01", "name": "pepper_tree"}, - {"id": 20660, "synset": "brazilian_pepper_tree.n.01", "name": "Brazilian_pepper_tree"}, - {"id": 20661, "synset": "hog_plum.n.01", "name": "hog_plum"}, - {"id": 20662, "synset": "mombin.n.01", "name": "mombin"}, - {"id": 20663, "synset": "poison_ash.n.01", "name": "poison_ash"}, - {"id": 20664, "synset": "poison_ivy.n.02", "name": "poison_ivy"}, - {"id": 20665, "synset": "western_poison_oak.n.01", "name": "western_poison_oak"}, - {"id": 20666, "synset": "eastern_poison_oak.n.01", "name": "eastern_poison_oak"}, - {"id": 20667, "synset": "varnish_tree.n.02", "name": "varnish_tree"}, - {"id": 20668, "synset": "horse_chestnut.n.01", "name": "horse_chestnut"}, - {"id": 20669, "synset": "buckeye.n.01", "name": "buckeye"}, - {"id": 20670, "synset": "sweet_buckeye.n.01", "name": "sweet_buckeye"}, - {"id": 20671, "synset": "ohio_buckeye.n.01", "name": "Ohio_buckeye"}, - {"id": 20672, "synset": "dwarf_buckeye.n.01", "name": "dwarf_buckeye"}, - {"id": 20673, "synset": "red_buckeye.n.01", "name": "red_buckeye"}, - {"id": 20674, "synset": "particolored_buckeye.n.01", "name": "particolored_buckeye"}, - {"id": 20675, "synset": "ebony.n.03", "name": "ebony"}, - {"id": 20676, "synset": "marblewood.n.02", "name": "marblewood"}, - {"id": 20677, "synset": "marblewood.n.01", "name": "marblewood"}, - {"id": 20678, "synset": "persimmon.n.01", "name": "persimmon"}, - {"id": 20679, "synset": "japanese_persimmon.n.01", "name": "Japanese_persimmon"}, - {"id": 20680, "synset": "american_persimmon.n.01", "name": "American_persimmon"}, - {"id": 20681, "synset": "date_plum.n.01", "name": "date_plum"}, - {"id": 20682, "synset": "buckthorn.n.02", "name": "buckthorn"}, - {"id": 20683, "synset": "southern_buckthorn.n.01", "name": "southern_buckthorn"}, - {"id": 20684, "synset": "false_buckthorn.n.01", "name": "false_buckthorn"}, - {"id": 20685, "synset": "star_apple.n.01", "name": "star_apple"}, - {"id": 20686, "synset": "satinleaf.n.01", "name": "satinleaf"}, - {"id": 20687, "synset": "balata.n.02", "name": "balata"}, - {"id": 20688, "synset": "sapodilla.n.01", "name": "sapodilla"}, - {"id": 20689, "synset": "gutta-percha_tree.n.02", "name": "gutta-percha_tree"}, - {"id": 20690, "synset": "gutta-percha_tree.n.01", "name": "gutta-percha_tree"}, - {"id": 20691, "synset": "canistel.n.01", "name": "canistel"}, - {"id": 20692, "synset": "marmalade_tree.n.01", "name": "marmalade_tree"}, - {"id": 20693, "synset": "sweetleaf.n.01", "name": "sweetleaf"}, - {"id": 20694, "synset": "asiatic_sweetleaf.n.01", "name": "Asiatic_sweetleaf"}, - {"id": 20695, "synset": "styrax.n.01", "name": "styrax"}, - {"id": 20696, "synset": "snowbell.n.01", "name": "snowbell"}, - {"id": 20697, "synset": "japanese_snowbell.n.01", "name": "Japanese_snowbell"}, - {"id": 20698, "synset": "texas_snowbell.n.01", "name": "Texas_snowbell"}, - {"id": 20699, "synset": "silver-bell_tree.n.01", "name": "silver-bell_tree"}, - {"id": 20700, "synset": "carnivorous_plant.n.01", "name": "carnivorous_plant"}, - {"id": 20701, "synset": "pitcher_plant.n.01", "name": "pitcher_plant"}, - {"id": 20702, "synset": "common_pitcher_plant.n.01", "name": "common_pitcher_plant"}, - {"id": 20703, "synset": "hooded_pitcher_plant.n.01", "name": "hooded_pitcher_plant"}, - {"id": 20704, "synset": "huntsman's_horn.n.01", "name": "huntsman's_horn"}, - {"id": 20705, "synset": "tropical_pitcher_plant.n.01", "name": "tropical_pitcher_plant"}, - {"id": 20706, "synset": "sundew.n.01", "name": "sundew"}, - {"id": 20707, "synset": "venus's_flytrap.n.01", "name": "Venus's_flytrap"}, - {"id": 20708, "synset": "waterwheel_plant.n.01", "name": "waterwheel_plant"}, - {"id": 20709, "synset": "drosophyllum_lusitanicum.n.01", "name": "Drosophyllum_lusitanicum"}, - {"id": 20710, "synset": "roridula.n.01", "name": "roridula"}, - {"id": 20711, "synset": "australian_pitcher_plant.n.01", "name": "Australian_pitcher_plant"}, - {"id": 20712, "synset": "sedum.n.01", "name": "sedum"}, - {"id": 20713, "synset": "stonecrop.n.01", "name": "stonecrop"}, - {"id": 20714, "synset": "rose-root.n.01", "name": "rose-root"}, - {"id": 20715, "synset": "orpine.n.01", "name": "orpine"}, - {"id": 20716, "synset": "pinwheel.n.01", "name": "pinwheel"}, - {"id": 20717, "synset": "christmas_bush.n.01", "name": "Christmas_bush"}, - {"id": 20718, "synset": "hortensia.n.01", "name": "hortensia"}, - {"id": 20719, "synset": "fall-blooming_hydrangea.n.01", "name": "fall-blooming_hydrangea"}, - {"id": 20720, "synset": "carpenteria.n.01", "name": "carpenteria"}, - {"id": 20721, "synset": "decumary.n.01", "name": "decumary"}, - {"id": 20722, "synset": "deutzia.n.01", "name": "deutzia"}, - {"id": 20723, "synset": "philadelphus.n.01", "name": "philadelphus"}, - {"id": 20724, "synset": "mock_orange.n.01", "name": "mock_orange"}, - {"id": 20725, "synset": "saxifrage.n.01", "name": "saxifrage"}, - {"id": 20726, "synset": "yellow_mountain_saxifrage.n.01", "name": "yellow_mountain_saxifrage"}, - {"id": 20727, "synset": "meadow_saxifrage.n.01", "name": "meadow_saxifrage"}, - {"id": 20728, "synset": "mossy_saxifrage.n.01", "name": "mossy_saxifrage"}, - {"id": 20729, "synset": "western_saxifrage.n.01", "name": "western_saxifrage"}, - {"id": 20730, "synset": "purple_saxifrage.n.01", "name": "purple_saxifrage"}, - {"id": 20731, "synset": "star_saxifrage.n.01", "name": "star_saxifrage"}, - {"id": 20732, "synset": "strawberry_geranium.n.01", "name": "strawberry_geranium"}, - {"id": 20733, "synset": "astilbe.n.01", "name": "astilbe"}, - {"id": 20734, "synset": "false_goatsbeard.n.01", "name": "false_goatsbeard"}, - {"id": 20735, "synset": "dwarf_astilbe.n.01", "name": "dwarf_astilbe"}, - {"id": 20736, "synset": "spirea.n.01", "name": "spirea"}, - {"id": 20737, "synset": "bergenia.n.01", "name": "bergenia"}, - {"id": 20738, "synset": "coast_boykinia.n.01", "name": "coast_boykinia"}, - {"id": 20739, "synset": "golden_saxifrage.n.01", "name": "golden_saxifrage"}, - {"id": 20740, "synset": "umbrella_plant.n.01", "name": "umbrella_plant"}, - {"id": 20741, "synset": "bridal_wreath.n.01", "name": "bridal_wreath"}, - {"id": 20742, "synset": "alumroot.n.01", "name": "alumroot"}, - {"id": 20743, "synset": "coralbells.n.01", "name": "coralbells"}, - {"id": 20744, "synset": "leatherleaf_saxifrage.n.01", "name": "leatherleaf_saxifrage"}, - {"id": 20745, "synset": "woodland_star.n.01", "name": "woodland_star"}, - {"id": 20746, "synset": "prairie_star.n.01", "name": "prairie_star"}, - {"id": 20747, "synset": "miterwort.n.01", "name": "miterwort"}, - {"id": 20748, "synset": "five-point_bishop's_cap.n.01", "name": "five-point_bishop's_cap"}, - {"id": 20749, "synset": "parnassia.n.01", "name": "parnassia"}, - {"id": 20750, "synset": "bog_star.n.01", "name": "bog_star"}, - { - "id": 20751, - "synset": "fringed_grass_of_parnassus.n.01", - "name": "fringed_grass_of_Parnassus", - }, - {"id": 20752, "synset": "false_alumroot.n.01", "name": "false_alumroot"}, - {"id": 20753, "synset": "foamflower.n.01", "name": "foamflower"}, - {"id": 20754, "synset": "false_miterwort.n.01", "name": "false_miterwort"}, - {"id": 20755, "synset": "pickaback_plant.n.01", "name": "pickaback_plant"}, - {"id": 20756, "synset": "currant.n.02", "name": "currant"}, - {"id": 20757, "synset": "black_currant.n.01", "name": "black_currant"}, - {"id": 20758, "synset": "white_currant.n.01", "name": "white_currant"}, - {"id": 20759, "synset": "gooseberry.n.01", "name": "gooseberry"}, - {"id": 20760, "synset": "plane_tree.n.01", "name": "plane_tree"}, - {"id": 20761, "synset": "london_plane.n.01", "name": "London_plane"}, - {"id": 20762, "synset": "american_sycamore.n.01", "name": "American_sycamore"}, - {"id": 20763, "synset": "oriental_plane.n.01", "name": "oriental_plane"}, - {"id": 20764, "synset": "california_sycamore.n.01", "name": "California_sycamore"}, - {"id": 20765, "synset": "arizona_sycamore.n.01", "name": "Arizona_sycamore"}, - {"id": 20766, "synset": "greek_valerian.n.01", "name": "Greek_valerian"}, - {"id": 20767, "synset": "northern_jacob's_ladder.n.01", "name": "northern_Jacob's_ladder"}, - {"id": 20768, "synset": "skunkweed.n.01", "name": "skunkweed"}, - {"id": 20769, "synset": "phlox.n.01", "name": "phlox"}, - {"id": 20770, "synset": "moss_pink.n.02", "name": "moss_pink"}, - {"id": 20771, "synset": "evening-snow.n.01", "name": "evening-snow"}, - {"id": 20772, "synset": "acanthus.n.01", "name": "acanthus"}, - {"id": 20773, "synset": "bear's_breech.n.01", "name": "bear's_breech"}, - {"id": 20774, "synset": "caricature_plant.n.01", "name": "caricature_plant"}, - {"id": 20775, "synset": "black-eyed_susan.n.01", "name": "black-eyed_Susan"}, - {"id": 20776, "synset": "catalpa.n.01", "name": "catalpa"}, - {"id": 20777, "synset": "catalpa_bignioides.n.01", "name": "Catalpa_bignioides"}, - {"id": 20778, "synset": "catalpa_speciosa.n.01", "name": "Catalpa_speciosa"}, - {"id": 20779, "synset": "desert_willow.n.01", "name": "desert_willow"}, - {"id": 20780, "synset": "calabash.n.02", "name": "calabash"}, - {"id": 20781, "synset": "calabash.n.01", "name": "calabash"}, - {"id": 20782, "synset": "borage.n.01", "name": "borage"}, - {"id": 20783, "synset": "common_amsinckia.n.01", "name": "common_amsinckia"}, - {"id": 20784, "synset": "anchusa.n.01", "name": "anchusa"}, - {"id": 20785, "synset": "bugloss.n.01", "name": "bugloss"}, - {"id": 20786, "synset": "cape_forget-me-not.n.02", "name": "cape_forget-me-not"}, - {"id": 20787, "synset": "cape_forget-me-not.n.01", "name": "cape_forget-me-not"}, - {"id": 20788, "synset": "spanish_elm.n.02", "name": "Spanish_elm"}, - {"id": 20789, "synset": "princewood.n.01", "name": "princewood"}, - {"id": 20790, "synset": "chinese_forget-me-not.n.01", "name": "Chinese_forget-me-not"}, - {"id": 20791, "synset": "hound's-tongue.n.02", "name": "hound's-tongue"}, - {"id": 20792, "synset": "hound's-tongue.n.01", "name": "hound's-tongue"}, - {"id": 20793, "synset": "blueweed.n.01", "name": "blueweed"}, - {"id": 20794, "synset": "beggar's_lice.n.01", "name": "beggar's_lice"}, - {"id": 20795, "synset": "gromwell.n.01", "name": "gromwell"}, - {"id": 20796, "synset": "puccoon.n.01", "name": "puccoon"}, - {"id": 20797, "synset": "virginia_bluebell.n.01", "name": "Virginia_bluebell"}, - {"id": 20798, "synset": "garden_forget-me-not.n.01", "name": "garden_forget-me-not"}, - {"id": 20799, "synset": "forget-me-not.n.01", "name": "forget-me-not"}, - {"id": 20800, "synset": "false_gromwell.n.01", "name": "false_gromwell"}, - {"id": 20801, "synset": "comfrey.n.01", "name": "comfrey"}, - {"id": 20802, "synset": "common_comfrey.n.01", "name": "common_comfrey"}, - {"id": 20803, "synset": "convolvulus.n.01", "name": "convolvulus"}, - {"id": 20804, "synset": "bindweed.n.01", "name": "bindweed"}, - {"id": 20805, "synset": "field_bindweed.n.01", "name": "field_bindweed"}, - {"id": 20806, "synset": "scammony.n.03", "name": "scammony"}, - {"id": 20807, "synset": "silverweed.n.01", "name": "silverweed"}, - {"id": 20808, "synset": "dodder.n.01", "name": "dodder"}, - {"id": 20809, "synset": "dichondra.n.01", "name": "dichondra"}, - {"id": 20810, "synset": "cypress_vine.n.01", "name": "cypress_vine"}, - {"id": 20811, "synset": "moonflower.n.01", "name": "moonflower"}, - {"id": 20812, "synset": "wild_potato_vine.n.01", "name": "wild_potato_vine"}, - {"id": 20813, "synset": "red_morning-glory.n.01", "name": "red_morning-glory"}, - {"id": 20814, "synset": "man-of-the-earth.n.01", "name": "man-of-the-earth"}, - {"id": 20815, "synset": "scammony.n.01", "name": "scammony"}, - {"id": 20816, "synset": "japanese_morning_glory.n.01", "name": "Japanese_morning_glory"}, - { - "id": 20817, - "synset": "imperial_japanese_morning_glory.n.01", - "name": "imperial_Japanese_morning_glory", - }, - {"id": 20818, "synset": "gesneriad.n.01", "name": "gesneriad"}, - {"id": 20819, "synset": "gesneria.n.01", "name": "gesneria"}, - {"id": 20820, "synset": "achimenes.n.01", "name": "achimenes"}, - {"id": 20821, "synset": "aeschynanthus.n.01", "name": "aeschynanthus"}, - {"id": 20822, "synset": "lace-flower_vine.n.01", "name": "lace-flower_vine"}, - {"id": 20823, "synset": "columnea.n.01", "name": "columnea"}, - {"id": 20824, "synset": "episcia.n.01", "name": "episcia"}, - {"id": 20825, "synset": "gloxinia.n.01", "name": "gloxinia"}, - {"id": 20826, "synset": "canterbury_bell.n.01", "name": "Canterbury_bell"}, - {"id": 20827, "synset": "kohleria.n.01", "name": "kohleria"}, - {"id": 20828, "synset": "african_violet.n.01", "name": "African_violet"}, - {"id": 20829, "synset": "streptocarpus.n.01", "name": "streptocarpus"}, - {"id": 20830, "synset": "cape_primrose.n.01", "name": "Cape_primrose"}, - {"id": 20831, "synset": "waterleaf.n.01", "name": "waterleaf"}, - {"id": 20832, "synset": "virginia_waterleaf.n.01", "name": "Virginia_waterleaf"}, - {"id": 20833, "synset": "yellow_bells.n.01", "name": "yellow_bells"}, - {"id": 20834, "synset": "yerba_santa.n.01", "name": "yerba_santa"}, - {"id": 20835, "synset": "nemophila.n.01", "name": "nemophila"}, - {"id": 20836, "synset": "baby_blue-eyes.n.01", "name": "baby_blue-eyes"}, - {"id": 20837, "synset": "five-spot.n.02", "name": "five-spot"}, - {"id": 20838, "synset": "scorpionweed.n.01", "name": "scorpionweed"}, - {"id": 20839, "synset": "california_bluebell.n.02", "name": "California_bluebell"}, - {"id": 20840, "synset": "california_bluebell.n.01", "name": "California_bluebell"}, - {"id": 20841, "synset": "fiddleneck.n.01", "name": "fiddleneck"}, - {"id": 20842, "synset": "fiesta_flower.n.01", "name": "fiesta_flower"}, - {"id": 20843, "synset": "basil_thyme.n.01", "name": "basil_thyme"}, - {"id": 20844, "synset": "giant_hyssop.n.01", "name": "giant_hyssop"}, - {"id": 20845, "synset": "yellow_giant_hyssop.n.01", "name": "yellow_giant_hyssop"}, - {"id": 20846, "synset": "anise_hyssop.n.01", "name": "anise_hyssop"}, - {"id": 20847, "synset": "mexican_hyssop.n.01", "name": "Mexican_hyssop"}, - {"id": 20848, "synset": "bugle.n.02", "name": "bugle"}, - {"id": 20849, "synset": "creeping_bugle.n.01", "name": "creeping_bugle"}, - {"id": 20850, "synset": "erect_bugle.n.01", "name": "erect_bugle"}, - {"id": 20851, "synset": "pyramid_bugle.n.01", "name": "pyramid_bugle"}, - {"id": 20852, "synset": "wood_mint.n.01", "name": "wood_mint"}, - {"id": 20853, "synset": "hairy_wood_mint.n.01", "name": "hairy_wood_mint"}, - {"id": 20854, "synset": "downy_wood_mint.n.01", "name": "downy_wood_mint"}, - {"id": 20855, "synset": "calamint.n.01", "name": "calamint"}, - {"id": 20856, "synset": "common_calamint.n.01", "name": "common_calamint"}, - {"id": 20857, "synset": "large-flowered_calamint.n.01", "name": "large-flowered_calamint"}, - {"id": 20858, "synset": "lesser_calamint.n.01", "name": "lesser_calamint"}, - {"id": 20859, "synset": "wild_basil.n.01", "name": "wild_basil"}, - {"id": 20860, "synset": "horse_balm.n.01", "name": "horse_balm"}, - {"id": 20861, "synset": "coleus.n.01", "name": "coleus"}, - {"id": 20862, "synset": "country_borage.n.01", "name": "country_borage"}, - {"id": 20863, "synset": "painted_nettle.n.01", "name": "painted_nettle"}, - {"id": 20864, "synset": "apalachicola_rosemary.n.01", "name": "Apalachicola_rosemary"}, - {"id": 20865, "synset": "dragonhead.n.01", "name": "dragonhead"}, - {"id": 20866, "synset": "elsholtzia.n.01", "name": "elsholtzia"}, - {"id": 20867, "synset": "hemp_nettle.n.01", "name": "hemp_nettle"}, - {"id": 20868, "synset": "ground_ivy.n.01", "name": "ground_ivy"}, - {"id": 20869, "synset": "pennyroyal.n.02", "name": "pennyroyal"}, - {"id": 20870, "synset": "hyssop.n.01", "name": "hyssop"}, - {"id": 20871, "synset": "dead_nettle.n.02", "name": "dead_nettle"}, - {"id": 20872, "synset": "white_dead_nettle.n.01", "name": "white_dead_nettle"}, - {"id": 20873, "synset": "henbit.n.01", "name": "henbit"}, - {"id": 20874, "synset": "english_lavender.n.01", "name": "English_lavender"}, - {"id": 20875, "synset": "french_lavender.n.02", "name": "French_lavender"}, - {"id": 20876, "synset": "spike_lavender.n.01", "name": "spike_lavender"}, - {"id": 20877, "synset": "dagga.n.01", "name": "dagga"}, - {"id": 20878, "synset": "lion's-ear.n.01", "name": "lion's-ear"}, - {"id": 20879, "synset": "motherwort.n.01", "name": "motherwort"}, - {"id": 20880, "synset": "pitcher_sage.n.02", "name": "pitcher_sage"}, - {"id": 20881, "synset": "bugleweed.n.01", "name": "bugleweed"}, - {"id": 20882, "synset": "water_horehound.n.01", "name": "water_horehound"}, - {"id": 20883, "synset": "gipsywort.n.01", "name": "gipsywort"}, - {"id": 20884, "synset": "origanum.n.01", "name": "origanum"}, - {"id": 20885, "synset": "oregano.n.01", "name": "oregano"}, - {"id": 20886, "synset": "sweet_marjoram.n.01", "name": "sweet_marjoram"}, - {"id": 20887, "synset": "horehound.n.01", "name": "horehound"}, - {"id": 20888, "synset": "common_horehound.n.01", "name": "common_horehound"}, - {"id": 20889, "synset": "lemon_balm.n.01", "name": "lemon_balm"}, - {"id": 20890, "synset": "corn_mint.n.01", "name": "corn_mint"}, - {"id": 20891, "synset": "water-mint.n.01", "name": "water-mint"}, - {"id": 20892, "synset": "bergamot_mint.n.02", "name": "bergamot_mint"}, - {"id": 20893, "synset": "horsemint.n.03", "name": "horsemint"}, - {"id": 20894, "synset": "peppermint.n.01", "name": "peppermint"}, - {"id": 20895, "synset": "spearmint.n.01", "name": "spearmint"}, - {"id": 20896, "synset": "apple_mint.n.01", "name": "apple_mint"}, - {"id": 20897, "synset": "pennyroyal.n.01", "name": "pennyroyal"}, - {"id": 20898, "synset": "yerba_buena.n.01", "name": "yerba_buena"}, - {"id": 20899, "synset": "molucca_balm.n.01", "name": "molucca_balm"}, - {"id": 20900, "synset": "monarda.n.01", "name": "monarda"}, - {"id": 20901, "synset": "bee_balm.n.02", "name": "bee_balm"}, - {"id": 20902, "synset": "horsemint.n.02", "name": "horsemint"}, - {"id": 20903, "synset": "bee_balm.n.01", "name": "bee_balm"}, - {"id": 20904, "synset": "lemon_mint.n.01", "name": "lemon_mint"}, - {"id": 20905, "synset": "plains_lemon_monarda.n.01", "name": "plains_lemon_monarda"}, - {"id": 20906, "synset": "basil_balm.n.01", "name": "basil_balm"}, - {"id": 20907, "synset": "mustang_mint.n.01", "name": "mustang_mint"}, - {"id": 20908, "synset": "catmint.n.01", "name": "catmint"}, - {"id": 20909, "synset": "basil.n.01", "name": "basil"}, - {"id": 20910, "synset": "beefsteak_plant.n.01", "name": "beefsteak_plant"}, - {"id": 20911, "synset": "phlomis.n.01", "name": "phlomis"}, - {"id": 20912, "synset": "jerusalem_sage.n.01", "name": "Jerusalem_sage"}, - {"id": 20913, "synset": "physostegia.n.01", "name": "physostegia"}, - {"id": 20914, "synset": "plectranthus.n.01", "name": "plectranthus"}, - {"id": 20915, "synset": "patchouli.n.01", "name": "patchouli"}, - {"id": 20916, "synset": "self-heal.n.01", "name": "self-heal"}, - {"id": 20917, "synset": "mountain_mint.n.01", "name": "mountain_mint"}, - {"id": 20918, "synset": "rosemary.n.01", "name": "rosemary"}, - {"id": 20919, "synset": "clary_sage.n.01", "name": "clary_sage"}, - {"id": 20920, "synset": "purple_sage.n.01", "name": "purple_sage"}, - {"id": 20921, "synset": "cancerweed.n.01", "name": "cancerweed"}, - {"id": 20922, "synset": "common_sage.n.01", "name": "common_sage"}, - {"id": 20923, "synset": "meadow_clary.n.01", "name": "meadow_clary"}, - {"id": 20924, "synset": "clary.n.01", "name": "clary"}, - {"id": 20925, "synset": "pitcher_sage.n.01", "name": "pitcher_sage"}, - {"id": 20926, "synset": "mexican_mint.n.01", "name": "Mexican_mint"}, - {"id": 20927, "synset": "wild_sage.n.01", "name": "wild_sage"}, - {"id": 20928, "synset": "savory.n.01", "name": "savory"}, - {"id": 20929, "synset": "summer_savory.n.01", "name": "summer_savory"}, - {"id": 20930, "synset": "winter_savory.n.01", "name": "winter_savory"}, - {"id": 20931, "synset": "skullcap.n.02", "name": "skullcap"}, - {"id": 20932, "synset": "blue_pimpernel.n.01", "name": "blue_pimpernel"}, - {"id": 20933, "synset": "hedge_nettle.n.02", "name": "hedge_nettle"}, - {"id": 20934, "synset": "hedge_nettle.n.01", "name": "hedge_nettle"}, - {"id": 20935, "synset": "germander.n.01", "name": "germander"}, - {"id": 20936, "synset": "american_germander.n.01", "name": "American_germander"}, - {"id": 20937, "synset": "cat_thyme.n.01", "name": "cat_thyme"}, - {"id": 20938, "synset": "wood_sage.n.01", "name": "wood_sage"}, - {"id": 20939, "synset": "thyme.n.01", "name": "thyme"}, - {"id": 20940, "synset": "common_thyme.n.01", "name": "common_thyme"}, - {"id": 20941, "synset": "wild_thyme.n.01", "name": "wild_thyme"}, - {"id": 20942, "synset": "blue_curls.n.01", "name": "blue_curls"}, - {"id": 20943, "synset": "turpentine_camphor_weed.n.01", "name": "turpentine_camphor_weed"}, - {"id": 20944, "synset": "bastard_pennyroyal.n.01", "name": "bastard_pennyroyal"}, - {"id": 20945, "synset": "bladderwort.n.01", "name": "bladderwort"}, - {"id": 20946, "synset": "butterwort.n.01", "name": "butterwort"}, - {"id": 20947, "synset": "genlisea.n.01", "name": "genlisea"}, - {"id": 20948, "synset": "martynia.n.01", "name": "martynia"}, - {"id": 20949, "synset": "common_unicorn_plant.n.01", "name": "common_unicorn_plant"}, - {"id": 20950, "synset": "sand_devil's_claw.n.01", "name": "sand_devil's_claw"}, - {"id": 20951, "synset": "sweet_unicorn_plant.n.01", "name": "sweet_unicorn_plant"}, - {"id": 20952, "synset": "figwort.n.01", "name": "figwort"}, - {"id": 20953, "synset": "snapdragon.n.01", "name": "snapdragon"}, - {"id": 20954, "synset": "white_snapdragon.n.01", "name": "white_snapdragon"}, - {"id": 20955, "synset": "yellow_twining_snapdragon.n.01", "name": "yellow_twining_snapdragon"}, - {"id": 20956, "synset": "mediterranean_snapdragon.n.01", "name": "Mediterranean_snapdragon"}, - {"id": 20957, "synset": "kitten-tails.n.01", "name": "kitten-tails"}, - {"id": 20958, "synset": "alpine_besseya.n.01", "name": "Alpine_besseya"}, - {"id": 20959, "synset": "false_foxglove.n.02", "name": "false_foxglove"}, - {"id": 20960, "synset": "false_foxglove.n.01", "name": "false_foxglove"}, - {"id": 20961, "synset": "calceolaria.n.01", "name": "calceolaria"}, - {"id": 20962, "synset": "indian_paintbrush.n.02", "name": "Indian_paintbrush"}, - {"id": 20963, "synset": "desert_paintbrush.n.01", "name": "desert_paintbrush"}, - {"id": 20964, "synset": "giant_red_paintbrush.n.01", "name": "giant_red_paintbrush"}, - {"id": 20965, "synset": "great_plains_paintbrush.n.01", "name": "great_plains_paintbrush"}, - {"id": 20966, "synset": "sulfur_paintbrush.n.01", "name": "sulfur_paintbrush"}, - {"id": 20967, "synset": "shellflower.n.01", "name": "shellflower"}, - {"id": 20968, "synset": "maiden_blue-eyed_mary.n.01", "name": "maiden_blue-eyed_Mary"}, - {"id": 20969, "synset": "blue-eyed_mary.n.01", "name": "blue-eyed_Mary"}, - {"id": 20970, "synset": "foxglove.n.01", "name": "foxglove"}, - {"id": 20971, "synset": "common_foxglove.n.01", "name": "common_foxglove"}, - {"id": 20972, "synset": "yellow_foxglove.n.01", "name": "yellow_foxglove"}, - {"id": 20973, "synset": "gerardia.n.01", "name": "gerardia"}, - {"id": 20974, "synset": "blue_toadflax.n.01", "name": "blue_toadflax"}, - {"id": 20975, "synset": "toadflax.n.01", "name": "toadflax"}, - {"id": 20976, "synset": "golden-beard_penstemon.n.01", "name": "golden-beard_penstemon"}, - {"id": 20977, "synset": "scarlet_bugler.n.01", "name": "scarlet_bugler"}, - {"id": 20978, "synset": "red_shrubby_penstemon.n.01", "name": "red_shrubby_penstemon"}, - {"id": 20979, "synset": "platte_river_penstemon.n.01", "name": "Platte_River_penstemon"}, - {"id": 20980, "synset": "hot-rock_penstemon.n.01", "name": "hot-rock_penstemon"}, - {"id": 20981, "synset": "jones'_penstemon.n.01", "name": "Jones'_penstemon"}, - {"id": 20982, "synset": "shrubby_penstemon.n.01", "name": "shrubby_penstemon"}, - {"id": 20983, "synset": "narrow-leaf_penstemon.n.01", "name": "narrow-leaf_penstemon"}, - {"id": 20984, "synset": "balloon_flower.n.01", "name": "balloon_flower"}, - {"id": 20985, "synset": "parry's_penstemon.n.01", "name": "Parry's_penstemon"}, - {"id": 20986, "synset": "rock_penstemon.n.01", "name": "rock_penstemon"}, - {"id": 20987, "synset": "rydberg's_penstemon.n.01", "name": "Rydberg's_penstemon"}, - {"id": 20988, "synset": "cascade_penstemon.n.01", "name": "cascade_penstemon"}, - {"id": 20989, "synset": "whipple's_penstemon.n.01", "name": "Whipple's_penstemon"}, - {"id": 20990, "synset": "moth_mullein.n.01", "name": "moth_mullein"}, - {"id": 20991, "synset": "white_mullein.n.01", "name": "white_mullein"}, - {"id": 20992, "synset": "purple_mullein.n.01", "name": "purple_mullein"}, - {"id": 20993, "synset": "common_mullein.n.01", "name": "common_mullein"}, - {"id": 20994, "synset": "veronica.n.01", "name": "veronica"}, - {"id": 20995, "synset": "field_speedwell.n.01", "name": "field_speedwell"}, - {"id": 20996, "synset": "brooklime.n.02", "name": "brooklime"}, - {"id": 20997, "synset": "corn_speedwell.n.01", "name": "corn_speedwell"}, - {"id": 20998, "synset": "brooklime.n.01", "name": "brooklime"}, - {"id": 20999, "synset": "germander_speedwell.n.01", "name": "germander_speedwell"}, - {"id": 21000, "synset": "water_speedwell.n.01", "name": "water_speedwell"}, - {"id": 21001, "synset": "common_speedwell.n.01", "name": "common_speedwell"}, - {"id": 21002, "synset": "purslane_speedwell.n.01", "name": "purslane_speedwell"}, - {"id": 21003, "synset": "thyme-leaved_speedwell.n.01", "name": "thyme-leaved_speedwell"}, - {"id": 21004, "synset": "nightshade.n.01", "name": "nightshade"}, - {"id": 21005, "synset": "horse_nettle.n.01", "name": "horse_nettle"}, - {"id": 21006, "synset": "african_holly.n.01", "name": "African_holly"}, - {"id": 21007, "synset": "potato_vine.n.02", "name": "potato_vine"}, - {"id": 21008, "synset": "garden_huckleberry.n.01", "name": "garden_huckleberry"}, - {"id": 21009, "synset": "naranjilla.n.01", "name": "naranjilla"}, - {"id": 21010, "synset": "potato_vine.n.01", "name": "potato_vine"}, - {"id": 21011, "synset": "potato_tree.n.01", "name": "potato_tree"}, - {"id": 21012, "synset": "belladonna.n.01", "name": "belladonna"}, - {"id": 21013, "synset": "bush_violet.n.01", "name": "bush_violet"}, - {"id": 21014, "synset": "lady-of-the-night.n.01", "name": "lady-of-the-night"}, - {"id": 21015, "synset": "angel's_trumpet.n.02", "name": "angel's_trumpet"}, - {"id": 21016, "synset": "angel's_trumpet.n.01", "name": "angel's_trumpet"}, - {"id": 21017, "synset": "red_angel's_trumpet.n.01", "name": "red_angel's_trumpet"}, - {"id": 21018, "synset": "cone_pepper.n.01", "name": "cone_pepper"}, - {"id": 21019, "synset": "bird_pepper.n.01", "name": "bird_pepper"}, - {"id": 21020, "synset": "day_jessamine.n.01", "name": "day_jessamine"}, - {"id": 21021, "synset": "night_jasmine.n.01", "name": "night_jasmine"}, - {"id": 21022, "synset": "tree_tomato.n.01", "name": "tree_tomato"}, - {"id": 21023, "synset": "thorn_apple.n.01", "name": "thorn_apple"}, - {"id": 21024, "synset": "jimsonweed.n.01", "name": "jimsonweed"}, - {"id": 21025, "synset": "pichi.n.01", "name": "pichi"}, - {"id": 21026, "synset": "henbane.n.01", "name": "henbane"}, - {"id": 21027, "synset": "egyptian_henbane.n.01", "name": "Egyptian_henbane"}, - {"id": 21028, "synset": "matrimony_vine.n.01", "name": "matrimony_vine"}, - {"id": 21029, "synset": "common_matrimony_vine.n.01", "name": "common_matrimony_vine"}, - {"id": 21030, "synset": "christmasberry.n.01", "name": "Christmasberry"}, - {"id": 21031, "synset": "plum_tomato.n.01", "name": "plum_tomato"}, - {"id": 21032, "synset": "mandrake.n.02", "name": "mandrake"}, - {"id": 21033, "synset": "mandrake_root.n.01", "name": "mandrake_root"}, - {"id": 21034, "synset": "apple_of_peru.n.01", "name": "apple_of_Peru"}, - {"id": 21035, "synset": "flowering_tobacco.n.01", "name": "flowering_tobacco"}, - {"id": 21036, "synset": "common_tobacco.n.01", "name": "common_tobacco"}, - {"id": 21037, "synset": "wild_tobacco.n.01", "name": "wild_tobacco"}, - {"id": 21038, "synset": "cupflower.n.02", "name": "cupflower"}, - {"id": 21039, "synset": "whitecup.n.01", "name": "whitecup"}, - {"id": 21040, "synset": "petunia.n.01", "name": "petunia"}, - {"id": 21041, "synset": "large_white_petunia.n.01", "name": "large_white_petunia"}, - {"id": 21042, "synset": "violet-flowered_petunia.n.01", "name": "violet-flowered_petunia"}, - {"id": 21043, "synset": "hybrid_petunia.n.01", "name": "hybrid_petunia"}, - {"id": 21044, "synset": "cape_gooseberry.n.01", "name": "cape_gooseberry"}, - {"id": 21045, "synset": "strawberry_tomato.n.01", "name": "strawberry_tomato"}, - {"id": 21046, "synset": "tomatillo.n.02", "name": "tomatillo"}, - {"id": 21047, "synset": "tomatillo.n.01", "name": "tomatillo"}, - {"id": 21048, "synset": "yellow_henbane.n.01", "name": "yellow_henbane"}, - {"id": 21049, "synset": "cock's_eggs.n.01", "name": "cock's_eggs"}, - {"id": 21050, "synset": "salpiglossis.n.01", "name": "salpiglossis"}, - {"id": 21051, "synset": "painted_tongue.n.01", "name": "painted_tongue"}, - {"id": 21052, "synset": "butterfly_flower.n.01", "name": "butterfly_flower"}, - {"id": 21053, "synset": "scopolia_carniolica.n.01", "name": "Scopolia_carniolica"}, - {"id": 21054, "synset": "chalice_vine.n.01", "name": "chalice_vine"}, - {"id": 21055, "synset": "verbena.n.01", "name": "verbena"}, - {"id": 21056, "synset": "lantana.n.01", "name": "lantana"}, - {"id": 21057, "synset": "black_mangrove.n.02", "name": "black_mangrove"}, - {"id": 21058, "synset": "white_mangrove.n.01", "name": "white_mangrove"}, - {"id": 21059, "synset": "black_mangrove.n.01", "name": "black_mangrove"}, - {"id": 21060, "synset": "teak.n.02", "name": "teak"}, - {"id": 21061, "synset": "spurge.n.01", "name": "spurge"}, - {"id": 21062, "synset": "sun_spurge.n.01", "name": "sun_spurge"}, - {"id": 21063, "synset": "petty_spurge.n.01", "name": "petty_spurge"}, - {"id": 21064, "synset": "medusa's_head.n.01", "name": "medusa's_head"}, - {"id": 21065, "synset": "wild_spurge.n.01", "name": "wild_spurge"}, - {"id": 21066, "synset": "snow-on-the-mountain.n.01", "name": "snow-on-the-mountain"}, - {"id": 21067, "synset": "cypress_spurge.n.01", "name": "cypress_spurge"}, - {"id": 21068, "synset": "leafy_spurge.n.01", "name": "leafy_spurge"}, - {"id": 21069, "synset": "hairy_spurge.n.01", "name": "hairy_spurge"}, - {"id": 21070, "synset": "poinsettia.n.01", "name": "poinsettia"}, - {"id": 21071, "synset": "japanese_poinsettia.n.01", "name": "Japanese_poinsettia"}, - {"id": 21072, "synset": "fire-on-the-mountain.n.01", "name": "fire-on-the-mountain"}, - {"id": 21073, "synset": "wood_spurge.n.01", "name": "wood_spurge"}, - {"id": 21074, "synset": "dwarf_spurge.n.01", "name": "dwarf_spurge"}, - {"id": 21075, "synset": "scarlet_plume.n.01", "name": "scarlet_plume"}, - {"id": 21076, "synset": "naboom.n.01", "name": "naboom"}, - {"id": 21077, "synset": "crown_of_thorns.n.02", "name": "crown_of_thorns"}, - {"id": 21078, "synset": "toothed_spurge.n.01", "name": "toothed_spurge"}, - {"id": 21079, "synset": "three-seeded_mercury.n.01", "name": "three-seeded_mercury"}, - {"id": 21080, "synset": "croton.n.02", "name": "croton"}, - {"id": 21081, "synset": "cascarilla.n.01", "name": "cascarilla"}, - {"id": 21082, "synset": "cascarilla_bark.n.01", "name": "cascarilla_bark"}, - {"id": 21083, "synset": "castor-oil_plant.n.01", "name": "castor-oil_plant"}, - {"id": 21084, "synset": "spurge_nettle.n.01", "name": "spurge_nettle"}, - {"id": 21085, "synset": "physic_nut.n.01", "name": "physic_nut"}, - {"id": 21086, "synset": "para_rubber_tree.n.01", "name": "Para_rubber_tree"}, - {"id": 21087, "synset": "cassava.n.03", "name": "cassava"}, - {"id": 21088, "synset": "bitter_cassava.n.01", "name": "bitter_cassava"}, - {"id": 21089, "synset": "cassava.n.02", "name": "cassava"}, - {"id": 21090, "synset": "sweet_cassava.n.01", "name": "sweet_cassava"}, - {"id": 21091, "synset": "candlenut.n.01", "name": "candlenut"}, - {"id": 21092, "synset": "tung_tree.n.01", "name": "tung_tree"}, - {"id": 21093, "synset": "slipper_spurge.n.01", "name": "slipper_spurge"}, - {"id": 21094, "synset": "candelilla.n.01", "name": "candelilla"}, - {"id": 21095, "synset": "jewbush.n.01", "name": "Jewbush"}, - {"id": 21096, "synset": "jumping_bean.n.01", "name": "jumping_bean"}, - {"id": 21097, "synset": "camellia.n.01", "name": "camellia"}, - {"id": 21098, "synset": "japonica.n.01", "name": "japonica"}, - {"id": 21099, "synset": "umbellifer.n.01", "name": "umbellifer"}, - {"id": 21100, "synset": "wild_parsley.n.01", "name": "wild_parsley"}, - {"id": 21101, "synset": "fool's_parsley.n.01", "name": "fool's_parsley"}, - {"id": 21102, "synset": "dill.n.01", "name": "dill"}, - {"id": 21103, "synset": "angelica.n.01", "name": "angelica"}, - {"id": 21104, "synset": "garden_angelica.n.01", "name": "garden_angelica"}, - {"id": 21105, "synset": "wild_angelica.n.01", "name": "wild_angelica"}, - {"id": 21106, "synset": "chervil.n.01", "name": "chervil"}, - {"id": 21107, "synset": "cow_parsley.n.01", "name": "cow_parsley"}, - {"id": 21108, "synset": "wild_celery.n.01", "name": "wild_celery"}, - {"id": 21109, "synset": "astrantia.n.01", "name": "astrantia"}, - {"id": 21110, "synset": "greater_masterwort.n.01", "name": "greater_masterwort"}, - {"id": 21111, "synset": "caraway.n.01", "name": "caraway"}, - {"id": 21112, "synset": "whorled_caraway.n.01", "name": "whorled_caraway"}, - {"id": 21113, "synset": "water_hemlock.n.01", "name": "water_hemlock"}, - {"id": 21114, "synset": "spotted_cowbane.n.01", "name": "spotted_cowbane"}, - {"id": 21115, "synset": "hemlock.n.02", "name": "hemlock"}, - {"id": 21116, "synset": "earthnut.n.02", "name": "earthnut"}, - {"id": 21117, "synset": "cumin.n.01", "name": "cumin"}, - {"id": 21118, "synset": "wild_carrot.n.01", "name": "wild_carrot"}, - {"id": 21119, "synset": "eryngo.n.01", "name": "eryngo"}, - {"id": 21120, "synset": "sea_holly.n.01", "name": "sea_holly"}, - {"id": 21121, "synset": "button_snakeroot.n.02", "name": "button_snakeroot"}, - {"id": 21122, "synset": "rattlesnake_master.n.01", "name": "rattlesnake_master"}, - {"id": 21123, "synset": "fennel.n.01", "name": "fennel"}, - {"id": 21124, "synset": "common_fennel.n.01", "name": "common_fennel"}, - {"id": 21125, "synset": "florence_fennel.n.01", "name": "Florence_fennel"}, - {"id": 21126, "synset": "cow_parsnip.n.01", "name": "cow_parsnip"}, - {"id": 21127, "synset": "lovage.n.01", "name": "lovage"}, - {"id": 21128, "synset": "sweet_cicely.n.01", "name": "sweet_cicely"}, - {"id": 21129, "synset": "water_fennel.n.01", "name": "water_fennel"}, - {"id": 21130, "synset": "parsnip.n.02", "name": "parsnip"}, - {"id": 21131, "synset": "cultivated_parsnip.n.01", "name": "cultivated_parsnip"}, - {"id": 21132, "synset": "wild_parsnip.n.01", "name": "wild_parsnip"}, - {"id": 21133, "synset": "parsley.n.01", "name": "parsley"}, - {"id": 21134, "synset": "italian_parsley.n.01", "name": "Italian_parsley"}, - {"id": 21135, "synset": "hamburg_parsley.n.01", "name": "Hamburg_parsley"}, - {"id": 21136, "synset": "anise.n.01", "name": "anise"}, - {"id": 21137, "synset": "sanicle.n.01", "name": "sanicle"}, - {"id": 21138, "synset": "purple_sanicle.n.01", "name": "purple_sanicle"}, - {"id": 21139, "synset": "european_sanicle.n.01", "name": "European_sanicle"}, - {"id": 21140, "synset": "water_parsnip.n.01", "name": "water_parsnip"}, - {"id": 21141, "synset": "greater_water_parsnip.n.01", "name": "greater_water_parsnip"}, - {"id": 21142, "synset": "skirret.n.01", "name": "skirret"}, - {"id": 21143, "synset": "dogwood.n.01", "name": "dogwood"}, - {"id": 21144, "synset": "common_white_dogwood.n.01", "name": "common_white_dogwood"}, - {"id": 21145, "synset": "red_osier.n.01", "name": "red_osier"}, - {"id": 21146, "synset": "silky_dogwood.n.02", "name": "silky_dogwood"}, - {"id": 21147, "synset": "silky_cornel.n.01", "name": "silky_cornel"}, - {"id": 21148, "synset": "common_european_dogwood.n.01", "name": "common_European_dogwood"}, - {"id": 21149, "synset": "bunchberry.n.01", "name": "bunchberry"}, - {"id": 21150, "synset": "cornelian_cherry.n.01", "name": "cornelian_cherry"}, - {"id": 21151, "synset": "puka.n.01", "name": "puka"}, - {"id": 21152, "synset": "kapuka.n.01", "name": "kapuka"}, - {"id": 21153, "synset": "valerian.n.01", "name": "valerian"}, - {"id": 21154, "synset": "common_valerian.n.01", "name": "common_valerian"}, - {"id": 21155, "synset": "common_corn_salad.n.01", "name": "common_corn_salad"}, - {"id": 21156, "synset": "red_valerian.n.01", "name": "red_valerian"}, - {"id": 21157, "synset": "filmy_fern.n.02", "name": "filmy_fern"}, - {"id": 21158, "synset": "bristle_fern.n.01", "name": "bristle_fern"}, - {"id": 21159, "synset": "hare's-foot_bristle_fern.n.01", "name": "hare's-foot_bristle_fern"}, - {"id": 21160, "synset": "killarney_fern.n.01", "name": "Killarney_fern"}, - {"id": 21161, "synset": "kidney_fern.n.01", "name": "kidney_fern"}, - {"id": 21162, "synset": "flowering_fern.n.02", "name": "flowering_fern"}, - {"id": 21163, "synset": "royal_fern.n.01", "name": "royal_fern"}, - {"id": 21164, "synset": "interrupted_fern.n.01", "name": "interrupted_fern"}, - {"id": 21165, "synset": "crape_fern.n.01", "name": "crape_fern"}, - {"id": 21166, "synset": "crepe_fern.n.01", "name": "crepe_fern"}, - {"id": 21167, "synset": "curly_grass.n.01", "name": "curly_grass"}, - {"id": 21168, "synset": "pine_fern.n.01", "name": "pine_fern"}, - {"id": 21169, "synset": "climbing_fern.n.01", "name": "climbing_fern"}, - {"id": 21170, "synset": "creeping_fern.n.01", "name": "creeping_fern"}, - {"id": 21171, "synset": "climbing_maidenhair.n.01", "name": "climbing_maidenhair"}, - {"id": 21172, "synset": "scented_fern.n.02", "name": "scented_fern"}, - {"id": 21173, "synset": "clover_fern.n.01", "name": "clover_fern"}, - {"id": 21174, "synset": "nardoo.n.01", "name": "nardoo"}, - {"id": 21175, "synset": "water_clover.n.01", "name": "water_clover"}, - {"id": 21176, "synset": "pillwort.n.01", "name": "pillwort"}, - {"id": 21177, "synset": "regnellidium.n.01", "name": "regnellidium"}, - {"id": 21178, "synset": "floating-moss.n.01", "name": "floating-moss"}, - {"id": 21179, "synset": "mosquito_fern.n.01", "name": "mosquito_fern"}, - {"id": 21180, "synset": "adder's_tongue.n.01", "name": "adder's_tongue"}, - {"id": 21181, "synset": "ribbon_fern.n.03", "name": "ribbon_fern"}, - {"id": 21182, "synset": "grape_fern.n.01", "name": "grape_fern"}, - {"id": 21183, "synset": "daisyleaf_grape_fern.n.01", "name": "daisyleaf_grape_fern"}, - {"id": 21184, "synset": "leathery_grape_fern.n.01", "name": "leathery_grape_fern"}, - {"id": 21185, "synset": "rattlesnake_fern.n.01", "name": "rattlesnake_fern"}, - {"id": 21186, "synset": "flowering_fern.n.01", "name": "flowering_fern"}, - {"id": 21187, "synset": "powdery_mildew.n.01", "name": "powdery_mildew"}, - {"id": 21188, "synset": "dutch_elm_fungus.n.01", "name": "Dutch_elm_fungus"}, - {"id": 21189, "synset": "ergot.n.02", "name": "ergot"}, - {"id": 21190, "synset": "rye_ergot.n.01", "name": "rye_ergot"}, - {"id": 21191, "synset": "black_root_rot_fungus.n.01", "name": "black_root_rot_fungus"}, - {"id": 21192, "synset": "dead-man's-fingers.n.01", "name": "dead-man's-fingers"}, - {"id": 21193, "synset": "sclerotinia.n.01", "name": "sclerotinia"}, - {"id": 21194, "synset": "brown_cup.n.01", "name": "brown_cup"}, - {"id": 21195, "synset": "earthball.n.01", "name": "earthball"}, - {"id": 21196, "synset": "scleroderma_citrinum.n.01", "name": "Scleroderma_citrinum"}, - {"id": 21197, "synset": "scleroderma_flavidium.n.01", "name": "Scleroderma_flavidium"}, - {"id": 21198, "synset": "scleroderma_bovista.n.01", "name": "Scleroderma_bovista"}, - {"id": 21199, "synset": "podaxaceae.n.01", "name": "Podaxaceae"}, - {"id": 21200, "synset": "stalked_puffball.n.02", "name": "stalked_puffball"}, - {"id": 21201, "synset": "stalked_puffball.n.01", "name": "stalked_puffball"}, - {"id": 21202, "synset": "false_truffle.n.01", "name": "false_truffle"}, - {"id": 21203, "synset": "rhizopogon_idahoensis.n.01", "name": "Rhizopogon_idahoensis"}, - {"id": 21204, "synset": "truncocolumella_citrina.n.01", "name": "Truncocolumella_citrina"}, - {"id": 21205, "synset": "mucor.n.01", "name": "mucor"}, - {"id": 21206, "synset": "rhizopus.n.01", "name": "rhizopus"}, - {"id": 21207, "synset": "bread_mold.n.01", "name": "bread_mold"}, - {"id": 21208, "synset": "slime_mold.n.01", "name": "slime_mold"}, - {"id": 21209, "synset": "true_slime_mold.n.01", "name": "true_slime_mold"}, - {"id": 21210, "synset": "cellular_slime_mold.n.01", "name": "cellular_slime_mold"}, - {"id": 21211, "synset": "dictostylium.n.01", "name": "dictostylium"}, - {"id": 21212, "synset": "pond-scum_parasite.n.01", "name": "pond-scum_parasite"}, - {"id": 21213, "synset": "potato_wart_fungus.n.01", "name": "potato_wart_fungus"}, - {"id": 21214, "synset": "white_fungus.n.01", "name": "white_fungus"}, - {"id": 21215, "synset": "water_mold.n.01", "name": "water_mold"}, - {"id": 21216, "synset": "downy_mildew.n.01", "name": "downy_mildew"}, - {"id": 21217, "synset": "blue_mold_fungus.n.01", "name": "blue_mold_fungus"}, - {"id": 21218, "synset": "onion_mildew.n.01", "name": "onion_mildew"}, - {"id": 21219, "synset": "tobacco_mildew.n.01", "name": "tobacco_mildew"}, - {"id": 21220, "synset": "white_rust.n.01", "name": "white_rust"}, - {"id": 21221, "synset": "pythium.n.01", "name": "pythium"}, - {"id": 21222, "synset": "damping_off_fungus.n.01", "name": "damping_off_fungus"}, - {"id": 21223, "synset": "phytophthora_citrophthora.n.01", "name": "Phytophthora_citrophthora"}, - {"id": 21224, "synset": "phytophthora_infestans.n.01", "name": "Phytophthora_infestans"}, - {"id": 21225, "synset": "clubroot_fungus.n.01", "name": "clubroot_fungus"}, - {"id": 21226, "synset": "geglossaceae.n.01", "name": "Geglossaceae"}, - {"id": 21227, "synset": "sarcosomataceae.n.01", "name": "Sarcosomataceae"}, - {"id": 21228, "synset": "rufous_rubber_cup.n.01", "name": "Rufous_rubber_cup"}, - {"id": 21229, "synset": "devil's_cigar.n.01", "name": "devil's_cigar"}, - {"id": 21230, "synset": "devil's_urn.n.01", "name": "devil's_urn"}, - {"id": 21231, "synset": "truffle.n.01", "name": "truffle"}, - {"id": 21232, "synset": "club_fungus.n.01", "name": "club_fungus"}, - {"id": 21233, "synset": "coral_fungus.n.01", "name": "coral_fungus"}, - {"id": 21234, "synset": "tooth_fungus.n.01", "name": "tooth_fungus"}, - {"id": 21235, "synset": "lichen.n.02", "name": "lichen"}, - {"id": 21236, "synset": "ascolichen.n.01", "name": "ascolichen"}, - {"id": 21237, "synset": "basidiolichen.n.01", "name": "basidiolichen"}, - {"id": 21238, "synset": "lecanora.n.01", "name": "lecanora"}, - {"id": 21239, "synset": "manna_lichen.n.01", "name": "manna_lichen"}, - {"id": 21240, "synset": "archil.n.02", "name": "archil"}, - {"id": 21241, "synset": "roccella.n.01", "name": "roccella"}, - {"id": 21242, "synset": "beard_lichen.n.01", "name": "beard_lichen"}, - {"id": 21243, "synset": "horsehair_lichen.n.01", "name": "horsehair_lichen"}, - {"id": 21244, "synset": "reindeer_moss.n.01", "name": "reindeer_moss"}, - {"id": 21245, "synset": "crottle.n.01", "name": "crottle"}, - {"id": 21246, "synset": "iceland_moss.n.01", "name": "Iceland_moss"}, - {"id": 21247, "synset": "fungus.n.01", "name": "fungus"}, - {"id": 21248, "synset": "promycelium.n.01", "name": "promycelium"}, - {"id": 21249, "synset": "true_fungus.n.01", "name": "true_fungus"}, - {"id": 21250, "synset": "basidiomycete.n.01", "name": "basidiomycete"}, - {"id": 21251, "synset": "mushroom.n.03", "name": "mushroom"}, - {"id": 21252, "synset": "agaric.n.02", "name": "agaric"}, - {"id": 21253, "synset": "mushroom.n.01", "name": "mushroom"}, - {"id": 21254, "synset": "toadstool.n.01", "name": "toadstool"}, - {"id": 21255, "synset": "horse_mushroom.n.01", "name": "horse_mushroom"}, - {"id": 21256, "synset": "meadow_mushroom.n.01", "name": "meadow_mushroom"}, - {"id": 21257, "synset": "shiitake.n.01", "name": "shiitake"}, - {"id": 21258, "synset": "scaly_lentinus.n.01", "name": "scaly_lentinus"}, - {"id": 21259, "synset": "royal_agaric.n.01", "name": "royal_agaric"}, - {"id": 21260, "synset": "false_deathcap.n.01", "name": "false_deathcap"}, - {"id": 21261, "synset": "fly_agaric.n.01", "name": "fly_agaric"}, - {"id": 21262, "synset": "death_cap.n.01", "name": "death_cap"}, - {"id": 21263, "synset": "blushing_mushroom.n.01", "name": "blushing_mushroom"}, - {"id": 21264, "synset": "destroying_angel.n.01", "name": "destroying_angel"}, - {"id": 21265, "synset": "chanterelle.n.01", "name": "chanterelle"}, - {"id": 21266, "synset": "floccose_chanterelle.n.01", "name": "floccose_chanterelle"}, - {"id": 21267, "synset": "pig's_ears.n.01", "name": "pig's_ears"}, - {"id": 21268, "synset": "cinnabar_chanterelle.n.01", "name": "cinnabar_chanterelle"}, - {"id": 21269, "synset": "jack-o-lantern_fungus.n.01", "name": "jack-o-lantern_fungus"}, - {"id": 21270, "synset": "inky_cap.n.01", "name": "inky_cap"}, - {"id": 21271, "synset": "shaggymane.n.01", "name": "shaggymane"}, - {"id": 21272, "synset": "milkcap.n.01", "name": "milkcap"}, - {"id": 21273, "synset": "fairy-ring_mushroom.n.01", "name": "fairy-ring_mushroom"}, - {"id": 21274, "synset": "fairy_ring.n.01", "name": "fairy_ring"}, - {"id": 21275, "synset": "oyster_mushroom.n.01", "name": "oyster_mushroom"}, - {"id": 21276, "synset": "olive-tree_agaric.n.01", "name": "olive-tree_agaric"}, - {"id": 21277, "synset": "pholiota_astragalina.n.01", "name": "Pholiota_astragalina"}, - {"id": 21278, "synset": "pholiota_aurea.n.01", "name": "Pholiota_aurea"}, - {"id": 21279, "synset": "pholiota_destruens.n.01", "name": "Pholiota_destruens"}, - {"id": 21280, "synset": "pholiota_flammans.n.01", "name": "Pholiota_flammans"}, - {"id": 21281, "synset": "pholiota_flavida.n.01", "name": "Pholiota_flavida"}, - {"id": 21282, "synset": "nameko.n.01", "name": "nameko"}, - { - "id": 21283, - "synset": "pholiota_squarrosa-adiposa.n.01", - "name": "Pholiota_squarrosa-adiposa", - }, - {"id": 21284, "synset": "pholiota_squarrosa.n.01", "name": "Pholiota_squarrosa"}, - {"id": 21285, "synset": "pholiota_squarrosoides.n.01", "name": "Pholiota_squarrosoides"}, - {"id": 21286, "synset": "stropharia_ambigua.n.01", "name": "Stropharia_ambigua"}, - {"id": 21287, "synset": "stropharia_hornemannii.n.01", "name": "Stropharia_hornemannii"}, - { - "id": 21288, - "synset": "stropharia_rugoso-annulata.n.01", - "name": "Stropharia_rugoso-annulata", - }, - {"id": 21289, "synset": "gill_fungus.n.01", "name": "gill_fungus"}, - {"id": 21290, "synset": "entoloma_lividum.n.01", "name": "Entoloma_lividum"}, - {"id": 21291, "synset": "entoloma_aprile.n.01", "name": "Entoloma_aprile"}, - {"id": 21292, "synset": "chlorophyllum_molybdites.n.01", "name": "Chlorophyllum_molybdites"}, - {"id": 21293, "synset": "lepiota.n.01", "name": "lepiota"}, - {"id": 21294, "synset": "parasol_mushroom.n.01", "name": "parasol_mushroom"}, - {"id": 21295, "synset": "poisonous_parasol.n.01", "name": "poisonous_parasol"}, - {"id": 21296, "synset": "lepiota_naucina.n.01", "name": "Lepiota_naucina"}, - {"id": 21297, "synset": "lepiota_rhacodes.n.01", "name": "Lepiota_rhacodes"}, - {"id": 21298, "synset": "american_parasol.n.01", "name": "American_parasol"}, - {"id": 21299, "synset": "lepiota_rubrotincta.n.01", "name": "Lepiota_rubrotincta"}, - {"id": 21300, "synset": "lepiota_clypeolaria.n.01", "name": "Lepiota_clypeolaria"}, - {"id": 21301, "synset": "onion_stem.n.01", "name": "onion_stem"}, - {"id": 21302, "synset": "pink_disease_fungus.n.01", "name": "pink_disease_fungus"}, - {"id": 21303, "synset": "bottom_rot_fungus.n.01", "name": "bottom_rot_fungus"}, - {"id": 21304, "synset": "potato_fungus.n.01", "name": "potato_fungus"}, - {"id": 21305, "synset": "coffee_fungus.n.01", "name": "coffee_fungus"}, - {"id": 21306, "synset": "blewits.n.01", "name": "blewits"}, - {"id": 21307, "synset": "sandy_mushroom.n.01", "name": "sandy_mushroom"}, - {"id": 21308, "synset": "tricholoma_pessundatum.n.01", "name": "Tricholoma_pessundatum"}, - {"id": 21309, "synset": "tricholoma_sejunctum.n.01", "name": "Tricholoma_sejunctum"}, - {"id": 21310, "synset": "man-on-a-horse.n.01", "name": "man-on-a-horse"}, - {"id": 21311, "synset": "tricholoma_venenata.n.01", "name": "Tricholoma_venenata"}, - {"id": 21312, "synset": "tricholoma_pardinum.n.01", "name": "Tricholoma_pardinum"}, - {"id": 21313, "synset": "tricholoma_vaccinum.n.01", "name": "Tricholoma_vaccinum"}, - {"id": 21314, "synset": "tricholoma_aurantium.n.01", "name": "Tricholoma_aurantium"}, - {"id": 21315, "synset": "volvaria_bombycina.n.01", "name": "Volvaria_bombycina"}, - {"id": 21316, "synset": "pluteus_aurantiorugosus.n.01", "name": "Pluteus_aurantiorugosus"}, - {"id": 21317, "synset": "pluteus_magnus.n.01", "name": "Pluteus_magnus"}, - {"id": 21318, "synset": "deer_mushroom.n.01", "name": "deer_mushroom"}, - {"id": 21319, "synset": "straw_mushroom.n.01", "name": "straw_mushroom"}, - {"id": 21320, "synset": "volvariella_bombycina.n.01", "name": "Volvariella_bombycina"}, - {"id": 21321, "synset": "clitocybe_clavipes.n.01", "name": "Clitocybe_clavipes"}, - {"id": 21322, "synset": "clitocybe_dealbata.n.01", "name": "Clitocybe_dealbata"}, - {"id": 21323, "synset": "clitocybe_inornata.n.01", "name": "Clitocybe_inornata"}, - {"id": 21324, "synset": "clitocybe_robusta.n.01", "name": "Clitocybe_robusta"}, - {"id": 21325, "synset": "clitocybe_irina.n.01", "name": "Clitocybe_irina"}, - {"id": 21326, "synset": "clitocybe_subconnexa.n.01", "name": "Clitocybe_subconnexa"}, - {"id": 21327, "synset": "winter_mushroom.n.01", "name": "winter_mushroom"}, - {"id": 21328, "synset": "mycelium.n.01", "name": "mycelium"}, - {"id": 21329, "synset": "sclerotium.n.02", "name": "sclerotium"}, - {"id": 21330, "synset": "sac_fungus.n.01", "name": "sac_fungus"}, - {"id": 21331, "synset": "ascomycete.n.01", "name": "ascomycete"}, - {"id": 21332, "synset": "clavicipitaceae.n.01", "name": "Clavicipitaceae"}, - {"id": 21333, "synset": "grainy_club.n.01", "name": "grainy_club"}, - {"id": 21334, "synset": "yeast.n.02", "name": "yeast"}, - {"id": 21335, "synset": "baker's_yeast.n.01", "name": "baker's_yeast"}, - {"id": 21336, "synset": "wine-maker's_yeast.n.01", "name": "wine-maker's_yeast"}, - {"id": 21337, "synset": "aspergillus_fumigatus.n.01", "name": "Aspergillus_fumigatus"}, - {"id": 21338, "synset": "brown_root_rot_fungus.n.01", "name": "brown_root_rot_fungus"}, - {"id": 21339, "synset": "discomycete.n.01", "name": "discomycete"}, - {"id": 21340, "synset": "leotia_lubrica.n.01", "name": "Leotia_lubrica"}, - {"id": 21341, "synset": "mitrula_elegans.n.01", "name": "Mitrula_elegans"}, - {"id": 21342, "synset": "sarcoscypha_coccinea.n.01", "name": "Sarcoscypha_coccinea"}, - {"id": 21343, "synset": "caloscypha_fulgens.n.01", "name": "Caloscypha_fulgens"}, - {"id": 21344, "synset": "aleuria_aurantia.n.01", "name": "Aleuria_aurantia"}, - {"id": 21345, "synset": "elf_cup.n.01", "name": "elf_cup"}, - {"id": 21346, "synset": "peziza_domicilina.n.01", "name": "Peziza_domicilina"}, - {"id": 21347, "synset": "blood_cup.n.01", "name": "blood_cup"}, - {"id": 21348, "synset": "urnula_craterium.n.01", "name": "Urnula_craterium"}, - {"id": 21349, "synset": "galiella_rufa.n.01", "name": "Galiella_rufa"}, - {"id": 21350, "synset": "jafnea_semitosta.n.01", "name": "Jafnea_semitosta"}, - {"id": 21351, "synset": "morel.n.01", "name": "morel"}, - {"id": 21352, "synset": "common_morel.n.01", "name": "common_morel"}, - {"id": 21353, "synset": "disciotis_venosa.n.01", "name": "Disciotis_venosa"}, - {"id": 21354, "synset": "verpa.n.01", "name": "Verpa"}, - {"id": 21355, "synset": "verpa_bohemica.n.01", "name": "Verpa_bohemica"}, - {"id": 21356, "synset": "verpa_conica.n.01", "name": "Verpa_conica"}, - {"id": 21357, "synset": "black_morel.n.01", "name": "black_morel"}, - {"id": 21358, "synset": "morchella_crassipes.n.01", "name": "Morchella_crassipes"}, - {"id": 21359, "synset": "morchella_semilibera.n.01", "name": "Morchella_semilibera"}, - {"id": 21360, "synset": "wynnea_americana.n.01", "name": "Wynnea_americana"}, - {"id": 21361, "synset": "wynnea_sparassoides.n.01", "name": "Wynnea_sparassoides"}, - {"id": 21362, "synset": "false_morel.n.01", "name": "false_morel"}, - {"id": 21363, "synset": "lorchel.n.01", "name": "lorchel"}, - {"id": 21364, "synset": "helvella.n.01", "name": "helvella"}, - {"id": 21365, "synset": "helvella_crispa.n.01", "name": "Helvella_crispa"}, - {"id": 21366, "synset": "helvella_acetabulum.n.01", "name": "Helvella_acetabulum"}, - {"id": 21367, "synset": "helvella_sulcata.n.01", "name": "Helvella_sulcata"}, - {"id": 21368, "synset": "discina.n.01", "name": "discina"}, - {"id": 21369, "synset": "gyromitra.n.01", "name": "gyromitra"}, - {"id": 21370, "synset": "gyromitra_californica.n.01", "name": "Gyromitra_californica"}, - {"id": 21371, "synset": "gyromitra_sphaerospora.n.01", "name": "Gyromitra_sphaerospora"}, - {"id": 21372, "synset": "gyromitra_esculenta.n.01", "name": "Gyromitra_esculenta"}, - {"id": 21373, "synset": "gyromitra_infula.n.01", "name": "Gyromitra_infula"}, - {"id": 21374, "synset": "gyromitra_fastigiata.n.01", "name": "Gyromitra_fastigiata"}, - {"id": 21375, "synset": "gyromitra_gigas.n.01", "name": "Gyromitra_gigas"}, - {"id": 21376, "synset": "gasteromycete.n.01", "name": "gasteromycete"}, - {"id": 21377, "synset": "stinkhorn.n.01", "name": "stinkhorn"}, - {"id": 21378, "synset": "common_stinkhorn.n.01", "name": "common_stinkhorn"}, - {"id": 21379, "synset": "phallus_ravenelii.n.01", "name": "Phallus_ravenelii"}, - {"id": 21380, "synset": "dog_stinkhorn.n.01", "name": "dog_stinkhorn"}, - {"id": 21381, "synset": "calostoma_lutescens.n.01", "name": "Calostoma_lutescens"}, - {"id": 21382, "synset": "calostoma_cinnabarina.n.01", "name": "Calostoma_cinnabarina"}, - {"id": 21383, "synset": "calostoma_ravenelii.n.01", "name": "Calostoma_ravenelii"}, - {"id": 21384, "synset": "stinky_squid.n.01", "name": "stinky_squid"}, - {"id": 21385, "synset": "puffball.n.01", "name": "puffball"}, - {"id": 21386, "synset": "giant_puffball.n.01", "name": "giant_puffball"}, - {"id": 21387, "synset": "earthstar.n.01", "name": "earthstar"}, - {"id": 21388, "synset": "geastrum_coronatum.n.01", "name": "Geastrum_coronatum"}, - {"id": 21389, "synset": "radiigera_fuscogleba.n.01", "name": "Radiigera_fuscogleba"}, - {"id": 21390, "synset": "astreus_pteridis.n.01", "name": "Astreus_pteridis"}, - {"id": 21391, "synset": "astreus_hygrometricus.n.01", "name": "Astreus_hygrometricus"}, - {"id": 21392, "synset": "bird's-nest_fungus.n.01", "name": "bird's-nest_fungus"}, - {"id": 21393, "synset": "gastrocybe_lateritia.n.01", "name": "Gastrocybe_lateritia"}, - {"id": 21394, "synset": "macowanites_americanus.n.01", "name": "Macowanites_americanus"}, - {"id": 21395, "synset": "polypore.n.01", "name": "polypore"}, - {"id": 21396, "synset": "bracket_fungus.n.01", "name": "bracket_fungus"}, - {"id": 21397, "synset": "albatrellus_dispansus.n.01", "name": "Albatrellus_dispansus"}, - {"id": 21398, "synset": "albatrellus_ovinus.n.01", "name": "Albatrellus_ovinus"}, - {"id": 21399, "synset": "neolentinus_ponderosus.n.01", "name": "Neolentinus_ponderosus"}, - {"id": 21400, "synset": "oligoporus_leucospongia.n.01", "name": "Oligoporus_leucospongia"}, - {"id": 21401, "synset": "polyporus_tenuiculus.n.01", "name": "Polyporus_tenuiculus"}, - {"id": 21402, "synset": "hen-of-the-woods.n.01", "name": "hen-of-the-woods"}, - {"id": 21403, "synset": "polyporus_squamosus.n.01", "name": "Polyporus_squamosus"}, - {"id": 21404, "synset": "beefsteak_fungus.n.01", "name": "beefsteak_fungus"}, - {"id": 21405, "synset": "agaric.n.01", "name": "agaric"}, - {"id": 21406, "synset": "bolete.n.01", "name": "bolete"}, - {"id": 21407, "synset": "boletus_chrysenteron.n.01", "name": "Boletus_chrysenteron"}, - {"id": 21408, "synset": "boletus_edulis.n.01", "name": "Boletus_edulis"}, - {"id": 21409, "synset": "frost's_bolete.n.01", "name": "Frost's_bolete"}, - {"id": 21410, "synset": "boletus_luridus.n.01", "name": "Boletus_luridus"}, - {"id": 21411, "synset": "boletus_mirabilis.n.01", "name": "Boletus_mirabilis"}, - {"id": 21412, "synset": "boletus_pallidus.n.01", "name": "Boletus_pallidus"}, - {"id": 21413, "synset": "boletus_pulcherrimus.n.01", "name": "Boletus_pulcherrimus"}, - {"id": 21414, "synset": "boletus_pulverulentus.n.01", "name": "Boletus_pulverulentus"}, - {"id": 21415, "synset": "boletus_roxanae.n.01", "name": "Boletus_roxanae"}, - {"id": 21416, "synset": "boletus_subvelutipes.n.01", "name": "Boletus_subvelutipes"}, - {"id": 21417, "synset": "boletus_variipes.n.01", "name": "Boletus_variipes"}, - {"id": 21418, "synset": "boletus_zelleri.n.01", "name": "Boletus_zelleri"}, - {"id": 21419, "synset": "fuscoboletinus_paluster.n.01", "name": "Fuscoboletinus_paluster"}, - {"id": 21420, "synset": "fuscoboletinus_serotinus.n.01", "name": "Fuscoboletinus_serotinus"}, - {"id": 21421, "synset": "leccinum_fibrillosum.n.01", "name": "Leccinum_fibrillosum"}, - {"id": 21422, "synset": "suillus_albivelatus.n.01", "name": "Suillus_albivelatus"}, - {"id": 21423, "synset": "old-man-of-the-woods.n.01", "name": "old-man-of-the-woods"}, - {"id": 21424, "synset": "boletellus_russellii.n.01", "name": "Boletellus_russellii"}, - {"id": 21425, "synset": "jelly_fungus.n.01", "name": "jelly_fungus"}, - {"id": 21426, "synset": "snow_mushroom.n.01", "name": "snow_mushroom"}, - {"id": 21427, "synset": "witches'_butter.n.01", "name": "witches'_butter"}, - {"id": 21428, "synset": "tremella_foliacea.n.01", "name": "Tremella_foliacea"}, - {"id": 21429, "synset": "tremella_reticulata.n.01", "name": "Tremella_reticulata"}, - {"id": 21430, "synset": "jew's-ear.n.01", "name": "Jew's-ear"}, - {"id": 21431, "synset": "rust.n.04", "name": "rust"}, - {"id": 21432, "synset": "aecium.n.01", "name": "aecium"}, - {"id": 21433, "synset": "flax_rust.n.01", "name": "flax_rust"}, - {"id": 21434, "synset": "blister_rust.n.02", "name": "blister_rust"}, - {"id": 21435, "synset": "wheat_rust.n.01", "name": "wheat_rust"}, - {"id": 21436, "synset": "apple_rust.n.01", "name": "apple_rust"}, - {"id": 21437, "synset": "smut.n.03", "name": "smut"}, - {"id": 21438, "synset": "covered_smut.n.01", "name": "covered_smut"}, - {"id": 21439, "synset": "loose_smut.n.02", "name": "loose_smut"}, - {"id": 21440, "synset": "cornsmut.n.01", "name": "cornsmut"}, - {"id": 21441, "synset": "boil_smut.n.01", "name": "boil_smut"}, - {"id": 21442, "synset": "sphacelotheca.n.01", "name": "Sphacelotheca"}, - {"id": 21443, "synset": "head_smut.n.01", "name": "head_smut"}, - {"id": 21444, "synset": "bunt.n.04", "name": "bunt"}, - {"id": 21445, "synset": "bunt.n.03", "name": "bunt"}, - {"id": 21446, "synset": "onion_smut.n.01", "name": "onion_smut"}, - {"id": 21447, "synset": "flag_smut_fungus.n.01", "name": "flag_smut_fungus"}, - {"id": 21448, "synset": "wheat_flag_smut.n.01", "name": "wheat_flag_smut"}, - {"id": 21449, "synset": "felt_fungus.n.01", "name": "felt_fungus"}, - {"id": 21450, "synset": "waxycap.n.01", "name": "waxycap"}, - {"id": 21451, "synset": "hygrocybe_acutoconica.n.01", "name": "Hygrocybe_acutoconica"}, - {"id": 21452, "synset": "hygrophorus_borealis.n.01", "name": "Hygrophorus_borealis"}, - {"id": 21453, "synset": "hygrophorus_caeruleus.n.01", "name": "Hygrophorus_caeruleus"}, - {"id": 21454, "synset": "hygrophorus_inocybiformis.n.01", "name": "Hygrophorus_inocybiformis"}, - {"id": 21455, "synset": "hygrophorus_kauffmanii.n.01", "name": "Hygrophorus_kauffmanii"}, - {"id": 21456, "synset": "hygrophorus_marzuolus.n.01", "name": "Hygrophorus_marzuolus"}, - {"id": 21457, "synset": "hygrophorus_purpurascens.n.01", "name": "Hygrophorus_purpurascens"}, - {"id": 21458, "synset": "hygrophorus_russula.n.01", "name": "Hygrophorus_russula"}, - {"id": 21459, "synset": "hygrophorus_sordidus.n.01", "name": "Hygrophorus_sordidus"}, - {"id": 21460, "synset": "hygrophorus_tennesseensis.n.01", "name": "Hygrophorus_tennesseensis"}, - {"id": 21461, "synset": "hygrophorus_turundus.n.01", "name": "Hygrophorus_turundus"}, - { - "id": 21462, - "synset": "neohygrophorus_angelesianus.n.01", - "name": "Neohygrophorus_angelesianus", - }, - {"id": 21463, "synset": "cortinarius_armillatus.n.01", "name": "Cortinarius_armillatus"}, - {"id": 21464, "synset": "cortinarius_atkinsonianus.n.01", "name": "Cortinarius_atkinsonianus"}, - {"id": 21465, "synset": "cortinarius_corrugatus.n.01", "name": "Cortinarius_corrugatus"}, - {"id": 21466, "synset": "cortinarius_gentilis.n.01", "name": "Cortinarius_gentilis"}, - {"id": 21467, "synset": "cortinarius_mutabilis.n.01", "name": "Cortinarius_mutabilis"}, - { - "id": 21468, - "synset": "cortinarius_semisanguineus.n.01", - "name": "Cortinarius_semisanguineus", - }, - {"id": 21469, "synset": "cortinarius_subfoetidus.n.01", "name": "Cortinarius_subfoetidus"}, - {"id": 21470, "synset": "cortinarius_violaceus.n.01", "name": "Cortinarius_violaceus"}, - {"id": 21471, "synset": "gymnopilus_spectabilis.n.01", "name": "Gymnopilus_spectabilis"}, - {"id": 21472, "synset": "gymnopilus_validipes.n.01", "name": "Gymnopilus_validipes"}, - {"id": 21473, "synset": "gymnopilus_ventricosus.n.01", "name": "Gymnopilus_ventricosus"}, - {"id": 21474, "synset": "mold.n.05", "name": "mold"}, - {"id": 21475, "synset": "mildew.n.02", "name": "mildew"}, - {"id": 21476, "synset": "verticillium.n.01", "name": "verticillium"}, - {"id": 21477, "synset": "monilia.n.01", "name": "monilia"}, - {"id": 21478, "synset": "candida.n.01", "name": "candida"}, - {"id": 21479, "synset": "candida_albicans.n.01", "name": "Candida_albicans"}, - {"id": 21480, "synset": "blastomycete.n.01", "name": "blastomycete"}, - {"id": 21481, "synset": "yellow_spot_fungus.n.01", "name": "yellow_spot_fungus"}, - {"id": 21482, "synset": "green_smut_fungus.n.01", "name": "green_smut_fungus"}, - {"id": 21483, "synset": "dry_rot.n.02", "name": "dry_rot"}, - {"id": 21484, "synset": "rhizoctinia.n.01", "name": "rhizoctinia"}, - {"id": 21485, "synset": "houseplant.n.01", "name": "houseplant"}, - {"id": 21486, "synset": "bedder.n.01", "name": "bedder"}, - {"id": 21487, "synset": "succulent.n.01", "name": "succulent"}, - {"id": 21488, "synset": "cultivar.n.01", "name": "cultivar"}, - {"id": 21489, "synset": "weed.n.01", "name": "weed"}, - {"id": 21490, "synset": "wort.n.01", "name": "wort"}, - {"id": 21491, "synset": "brier.n.02", "name": "brier"}, - {"id": 21492, "synset": "aril.n.01", "name": "aril"}, - {"id": 21493, "synset": "sporophyll.n.01", "name": "sporophyll"}, - {"id": 21494, "synset": "sporangium.n.01", "name": "sporangium"}, - {"id": 21495, "synset": "sporangiophore.n.01", "name": "sporangiophore"}, - {"id": 21496, "synset": "ascus.n.01", "name": "ascus"}, - {"id": 21497, "synset": "ascospore.n.01", "name": "ascospore"}, - {"id": 21498, "synset": "arthrospore.n.02", "name": "arthrospore"}, - {"id": 21499, "synset": "eusporangium.n.01", "name": "eusporangium"}, - {"id": 21500, "synset": "tetrasporangium.n.01", "name": "tetrasporangium"}, - {"id": 21501, "synset": "gametangium.n.01", "name": "gametangium"}, - {"id": 21502, "synset": "sorus.n.02", "name": "sorus"}, - {"id": 21503, "synset": "sorus.n.01", "name": "sorus"}, - {"id": 21504, "synset": "partial_veil.n.01", "name": "partial_veil"}, - {"id": 21505, "synset": "lignum.n.01", "name": "lignum"}, - {"id": 21506, "synset": "vascular_ray.n.01", "name": "vascular_ray"}, - {"id": 21507, "synset": "phloem.n.01", "name": "phloem"}, - {"id": 21508, "synset": "evergreen.n.01", "name": "evergreen"}, - {"id": 21509, "synset": "deciduous_plant.n.01", "name": "deciduous_plant"}, - {"id": 21510, "synset": "poisonous_plant.n.01", "name": "poisonous_plant"}, - {"id": 21511, "synset": "vine.n.01", "name": "vine"}, - {"id": 21512, "synset": "creeper.n.01", "name": "creeper"}, - {"id": 21513, "synset": "tendril.n.01", "name": "tendril"}, - {"id": 21514, "synset": "root_climber.n.01", "name": "root_climber"}, - {"id": 21515, "synset": "lignosae.n.01", "name": "lignosae"}, - {"id": 21516, "synset": "arborescent_plant.n.01", "name": "arborescent_plant"}, - {"id": 21517, "synset": "snag.n.02", "name": "snag"}, - {"id": 21518, "synset": "tree.n.01", "name": "tree"}, - {"id": 21519, "synset": "timber_tree.n.01", "name": "timber_tree"}, - {"id": 21520, "synset": "treelet.n.01", "name": "treelet"}, - {"id": 21521, "synset": "arbor.n.01", "name": "arbor"}, - {"id": 21522, "synset": "bean_tree.n.01", "name": "bean_tree"}, - {"id": 21523, "synset": "pollard.n.01", "name": "pollard"}, - {"id": 21524, "synset": "sapling.n.01", "name": "sapling"}, - {"id": 21525, "synset": "shade_tree.n.01", "name": "shade_tree"}, - {"id": 21526, "synset": "gymnospermous_tree.n.01", "name": "gymnospermous_tree"}, - {"id": 21527, "synset": "conifer.n.01", "name": "conifer"}, - {"id": 21528, "synset": "angiospermous_tree.n.01", "name": "angiospermous_tree"}, - {"id": 21529, "synset": "nut_tree.n.01", "name": "nut_tree"}, - {"id": 21530, "synset": "spice_tree.n.01", "name": "spice_tree"}, - {"id": 21531, "synset": "fever_tree.n.01", "name": "fever_tree"}, - {"id": 21532, "synset": "stump.n.01", "name": "stump"}, - {"id": 21533, "synset": "bonsai.n.01", "name": "bonsai"}, - {"id": 21534, "synset": "ming_tree.n.02", "name": "ming_tree"}, - {"id": 21535, "synset": "ming_tree.n.01", "name": "ming_tree"}, - {"id": 21536, "synset": "undershrub.n.01", "name": "undershrub"}, - {"id": 21537, "synset": "subshrub.n.01", "name": "subshrub"}, - {"id": 21538, "synset": "bramble.n.01", "name": "bramble"}, - {"id": 21539, "synset": "liana.n.01", "name": "liana"}, - {"id": 21540, "synset": "geophyte.n.01", "name": "geophyte"}, - {"id": 21541, "synset": "desert_plant.n.01", "name": "desert_plant"}, - {"id": 21542, "synset": "mesophyte.n.01", "name": "mesophyte"}, - {"id": 21543, "synset": "marsh_plant.n.01", "name": "marsh_plant"}, - {"id": 21544, "synset": "hemiepiphyte.n.01", "name": "hemiepiphyte"}, - {"id": 21545, "synset": "strangler.n.01", "name": "strangler"}, - {"id": 21546, "synset": "lithophyte.n.01", "name": "lithophyte"}, - {"id": 21547, "synset": "saprobe.n.01", "name": "saprobe"}, - {"id": 21548, "synset": "autophyte.n.01", "name": "autophyte"}, - {"id": 21549, "synset": "root.n.01", "name": "root"}, - {"id": 21550, "synset": "taproot.n.01", "name": "taproot"}, - {"id": 21551, "synset": "prop_root.n.01", "name": "prop_root"}, - {"id": 21552, "synset": "prophyll.n.01", "name": "prophyll"}, - {"id": 21553, "synset": "rootstock.n.02", "name": "rootstock"}, - {"id": 21554, "synset": "quickset.n.01", "name": "quickset"}, - {"id": 21555, "synset": "stolon.n.01", "name": "stolon"}, - {"id": 21556, "synset": "tuberous_plant.n.01", "name": "tuberous_plant"}, - {"id": 21557, "synset": "rhizome.n.01", "name": "rhizome"}, - {"id": 21558, "synset": "rachis.n.01", "name": "rachis"}, - {"id": 21559, "synset": "caudex.n.02", "name": "caudex"}, - {"id": 21560, "synset": "cladode.n.01", "name": "cladode"}, - {"id": 21561, "synset": "receptacle.n.02", "name": "receptacle"}, - {"id": 21562, "synset": "scape.n.01", "name": "scape"}, - {"id": 21563, "synset": "umbel.n.01", "name": "umbel"}, - {"id": 21564, "synset": "petiole.n.01", "name": "petiole"}, - {"id": 21565, "synset": "peduncle.n.02", "name": "peduncle"}, - {"id": 21566, "synset": "pedicel.n.01", "name": "pedicel"}, - {"id": 21567, "synset": "flower_cluster.n.01", "name": "flower_cluster"}, - {"id": 21568, "synset": "raceme.n.01", "name": "raceme"}, - {"id": 21569, "synset": "panicle.n.01", "name": "panicle"}, - {"id": 21570, "synset": "thyrse.n.01", "name": "thyrse"}, - {"id": 21571, "synset": "cyme.n.01", "name": "cyme"}, - {"id": 21572, "synset": "cymule.n.01", "name": "cymule"}, - {"id": 21573, "synset": "glomerule.n.01", "name": "glomerule"}, - {"id": 21574, "synset": "scorpioid_cyme.n.01", "name": "scorpioid_cyme"}, - {"id": 21575, "synset": "ear.n.05", "name": "ear"}, - {"id": 21576, "synset": "spadix.n.01", "name": "spadix"}, - {"id": 21577, "synset": "bulbous_plant.n.01", "name": "bulbous_plant"}, - {"id": 21578, "synset": "bulbil.n.01", "name": "bulbil"}, - {"id": 21579, "synset": "cormous_plant.n.01", "name": "cormous_plant"}, - {"id": 21580, "synset": "fruit.n.01", "name": "fruit"}, - {"id": 21581, "synset": "fruitlet.n.01", "name": "fruitlet"}, - {"id": 21582, "synset": "seed.n.01", "name": "seed"}, - {"id": 21583, "synset": "bean.n.02", "name": "bean"}, - {"id": 21584, "synset": "nut.n.01", "name": "nut"}, - {"id": 21585, "synset": "nutlet.n.01", "name": "nutlet"}, - {"id": 21586, "synset": "kernel.n.01", "name": "kernel"}, - {"id": 21587, "synset": "syconium.n.01", "name": "syconium"}, - {"id": 21588, "synset": "berry.n.02", "name": "berry"}, - {"id": 21589, "synset": "aggregate_fruit.n.01", "name": "aggregate_fruit"}, - {"id": 21590, "synset": "simple_fruit.n.01", "name": "simple_fruit"}, - {"id": 21591, "synset": "acinus.n.01", "name": "acinus"}, - {"id": 21592, "synset": "drupe.n.01", "name": "drupe"}, - {"id": 21593, "synset": "drupelet.n.01", "name": "drupelet"}, - {"id": 21594, "synset": "pome.n.01", "name": "pome"}, - {"id": 21595, "synset": "pod.n.02", "name": "pod"}, - {"id": 21596, "synset": "loment.n.01", "name": "loment"}, - {"id": 21597, "synset": "pyxidium.n.01", "name": "pyxidium"}, - {"id": 21598, "synset": "husk.n.02", "name": "husk"}, - {"id": 21599, "synset": "cornhusk.n.01", "name": "cornhusk"}, - {"id": 21600, "synset": "pod.n.01", "name": "pod"}, - {"id": 21601, "synset": "accessory_fruit.n.01", "name": "accessory_fruit"}, - {"id": 21602, "synset": "buckthorn.n.01", "name": "buckthorn"}, - {"id": 21603, "synset": "buckthorn_berry.n.01", "name": "buckthorn_berry"}, - {"id": 21604, "synset": "cascara_buckthorn.n.01", "name": "cascara_buckthorn"}, - {"id": 21605, "synset": "cascara.n.01", "name": "cascara"}, - {"id": 21606, "synset": "carolina_buckthorn.n.01", "name": "Carolina_buckthorn"}, - {"id": 21607, "synset": "coffeeberry.n.01", "name": "coffeeberry"}, - {"id": 21608, "synset": "redberry.n.01", "name": "redberry"}, - {"id": 21609, "synset": "nakedwood.n.01", "name": "nakedwood"}, - {"id": 21610, "synset": "jujube.n.01", "name": "jujube"}, - {"id": 21611, "synset": "christ's-thorn.n.01", "name": "Christ's-thorn"}, - {"id": 21612, "synset": "hazel.n.01", "name": "hazel"}, - {"id": 21613, "synset": "fox_grape.n.01", "name": "fox_grape"}, - {"id": 21614, "synset": "muscadine.n.01", "name": "muscadine"}, - {"id": 21615, "synset": "vinifera.n.01", "name": "vinifera"}, - {"id": 21616, "synset": "pinot_blanc.n.01", "name": "Pinot_blanc"}, - {"id": 21617, "synset": "sauvignon_grape.n.01", "name": "Sauvignon_grape"}, - {"id": 21618, "synset": "sauvignon_blanc.n.01", "name": "Sauvignon_blanc"}, - {"id": 21619, "synset": "muscadet.n.01", "name": "Muscadet"}, - {"id": 21620, "synset": "riesling.n.01", "name": "Riesling"}, - {"id": 21621, "synset": "zinfandel.n.01", "name": "Zinfandel"}, - {"id": 21622, "synset": "chenin_blanc.n.01", "name": "Chenin_blanc"}, - {"id": 21623, "synset": "malvasia.n.01", "name": "malvasia"}, - {"id": 21624, "synset": "verdicchio.n.01", "name": "Verdicchio"}, - {"id": 21625, "synset": "boston_ivy.n.01", "name": "Boston_ivy"}, - {"id": 21626, "synset": "virginia_creeper.n.01", "name": "Virginia_creeper"}, - {"id": 21627, "synset": "true_pepper.n.01", "name": "true_pepper"}, - {"id": 21628, "synset": "betel.n.01", "name": "betel"}, - {"id": 21629, "synset": "cubeb.n.01", "name": "cubeb"}, - {"id": 21630, "synset": "schizocarp.n.01", "name": "schizocarp"}, - {"id": 21631, "synset": "peperomia.n.01", "name": "peperomia"}, - {"id": 21632, "synset": "watermelon_begonia.n.01", "name": "watermelon_begonia"}, - {"id": 21633, "synset": "yerba_mansa.n.01", "name": "yerba_mansa"}, - {"id": 21634, "synset": "pinna.n.01", "name": "pinna"}, - {"id": 21635, "synset": "frond.n.01", "name": "frond"}, - {"id": 21636, "synset": "bract.n.01", "name": "bract"}, - {"id": 21637, "synset": "bracteole.n.01", "name": "bracteole"}, - {"id": 21638, "synset": "involucre.n.01", "name": "involucre"}, - {"id": 21639, "synset": "glume.n.01", "name": "glume"}, - {"id": 21640, "synset": "palmate_leaf.n.01", "name": "palmate_leaf"}, - {"id": 21641, "synset": "pinnate_leaf.n.01", "name": "pinnate_leaf"}, - {"id": 21642, "synset": "bijugate_leaf.n.01", "name": "bijugate_leaf"}, - {"id": 21643, "synset": "decompound_leaf.n.01", "name": "decompound_leaf"}, - {"id": 21644, "synset": "acuminate_leaf.n.01", "name": "acuminate_leaf"}, - {"id": 21645, "synset": "deltoid_leaf.n.01", "name": "deltoid_leaf"}, - {"id": 21646, "synset": "ensiform_leaf.n.01", "name": "ensiform_leaf"}, - {"id": 21647, "synset": "linear_leaf.n.01", "name": "linear_leaf"}, - {"id": 21648, "synset": "lyrate_leaf.n.01", "name": "lyrate_leaf"}, - {"id": 21649, "synset": "obtuse_leaf.n.01", "name": "obtuse_leaf"}, - {"id": 21650, "synset": "oblanceolate_leaf.n.01", "name": "oblanceolate_leaf"}, - {"id": 21651, "synset": "pandurate_leaf.n.01", "name": "pandurate_leaf"}, - {"id": 21652, "synset": "reniform_leaf.n.01", "name": "reniform_leaf"}, - {"id": 21653, "synset": "spatulate_leaf.n.01", "name": "spatulate_leaf"}, - {"id": 21654, "synset": "even-pinnate_leaf.n.01", "name": "even-pinnate_leaf"}, - {"id": 21655, "synset": "odd-pinnate_leaf.n.01", "name": "odd-pinnate_leaf"}, - {"id": 21656, "synset": "pedate_leaf.n.01", "name": "pedate_leaf"}, - {"id": 21657, "synset": "crenate_leaf.n.01", "name": "crenate_leaf"}, - {"id": 21658, "synset": "dentate_leaf.n.01", "name": "dentate_leaf"}, - {"id": 21659, "synset": "denticulate_leaf.n.01", "name": "denticulate_leaf"}, - {"id": 21660, "synset": "erose_leaf.n.01", "name": "erose_leaf"}, - {"id": 21661, "synset": "runcinate_leaf.n.01", "name": "runcinate_leaf"}, - {"id": 21662, "synset": "prickly-edged_leaf.n.01", "name": "prickly-edged_leaf"}, - {"id": 21663, "synset": "deadwood.n.01", "name": "deadwood"}, - {"id": 21664, "synset": "haulm.n.01", "name": "haulm"}, - {"id": 21665, "synset": "branchlet.n.01", "name": "branchlet"}, - {"id": 21666, "synset": "osier.n.01", "name": "osier"}, - {"id": 21667, "synset": "giant_scrambling_fern.n.01", "name": "giant_scrambling_fern"}, - {"id": 21668, "synset": "umbrella_fern.n.01", "name": "umbrella_fern"}, - {"id": 21669, "synset": "floating_fern.n.02", "name": "floating_fern"}, - {"id": 21670, "synset": "polypody.n.01", "name": "polypody"}, - {"id": 21671, "synset": "licorice_fern.n.01", "name": "licorice_fern"}, - {"id": 21672, "synset": "grey_polypody.n.01", "name": "grey_polypody"}, - {"id": 21673, "synset": "leatherleaf.n.01", "name": "leatherleaf"}, - {"id": 21674, "synset": "rock_polypody.n.01", "name": "rock_polypody"}, - {"id": 21675, "synset": "common_polypody.n.01", "name": "common_polypody"}, - {"id": 21676, "synset": "bear's-paw_fern.n.01", "name": "bear's-paw_fern"}, - {"id": 21677, "synset": "strap_fern.n.01", "name": "strap_fern"}, - {"id": 21678, "synset": "florida_strap_fern.n.01", "name": "Florida_strap_fern"}, - {"id": 21679, "synset": "basket_fern.n.02", "name": "basket_fern"}, - {"id": 21680, "synset": "snake_polypody.n.01", "name": "snake_polypody"}, - {"id": 21681, "synset": "climbing_bird's_nest_fern.n.01", "name": "climbing_bird's_nest_fern"}, - {"id": 21682, "synset": "golden_polypody.n.01", "name": "golden_polypody"}, - {"id": 21683, "synset": "staghorn_fern.n.01", "name": "staghorn_fern"}, - {"id": 21684, "synset": "south_american_staghorn.n.01", "name": "South_American_staghorn"}, - {"id": 21685, "synset": "common_staghorn_fern.n.01", "name": "common_staghorn_fern"}, - {"id": 21686, "synset": "felt_fern.n.01", "name": "felt_fern"}, - {"id": 21687, "synset": "potato_fern.n.02", "name": "potato_fern"}, - {"id": 21688, "synset": "myrmecophyte.n.01", "name": "myrmecophyte"}, - {"id": 21689, "synset": "grass_fern.n.01", "name": "grass_fern"}, - {"id": 21690, "synset": "spleenwort.n.01", "name": "spleenwort"}, - {"id": 21691, "synset": "black_spleenwort.n.01", "name": "black_spleenwort"}, - {"id": 21692, "synset": "bird's_nest_fern.n.01", "name": "bird's_nest_fern"}, - {"id": 21693, "synset": "ebony_spleenwort.n.01", "name": "ebony_spleenwort"}, - {"id": 21694, "synset": "black-stem_spleenwort.n.01", "name": "black-stem_spleenwort"}, - {"id": 21695, "synset": "walking_fern.n.01", "name": "walking_fern"}, - {"id": 21696, "synset": "green_spleenwort.n.01", "name": "green_spleenwort"}, - {"id": 21697, "synset": "mountain_spleenwort.n.01", "name": "mountain_spleenwort"}, - {"id": 21698, "synset": "lobed_spleenwort.n.01", "name": "lobed_spleenwort"}, - {"id": 21699, "synset": "lanceolate_spleenwort.n.01", "name": "lanceolate_spleenwort"}, - {"id": 21700, "synset": "hart's-tongue.n.02", "name": "hart's-tongue"}, - {"id": 21701, "synset": "scale_fern.n.01", "name": "scale_fern"}, - {"id": 21702, "synset": "scolopendrium.n.01", "name": "scolopendrium"}, - {"id": 21703, "synset": "deer_fern.n.01", "name": "deer_fern"}, - {"id": 21704, "synset": "doodia.n.01", "name": "doodia"}, - {"id": 21705, "synset": "chain_fern.n.01", "name": "chain_fern"}, - {"id": 21706, "synset": "virginia_chain_fern.n.01", "name": "Virginia_chain_fern"}, - {"id": 21707, "synset": "silver_tree_fern.n.01", "name": "silver_tree_fern"}, - {"id": 21708, "synset": "davallia.n.01", "name": "davallia"}, - {"id": 21709, "synset": "hare's-foot_fern.n.01", "name": "hare's-foot_fern"}, - { - "id": 21710, - "synset": "canary_island_hare's_foot_fern.n.01", - "name": "Canary_Island_hare's_foot_fern", - }, - {"id": 21711, "synset": "squirrel's-foot_fern.n.01", "name": "squirrel's-foot_fern"}, - {"id": 21712, "synset": "bracken.n.01", "name": "bracken"}, - {"id": 21713, "synset": "soft_tree_fern.n.01", "name": "soft_tree_fern"}, - {"id": 21714, "synset": "scythian_lamb.n.01", "name": "Scythian_lamb"}, - {"id": 21715, "synset": "false_bracken.n.01", "name": "false_bracken"}, - {"id": 21716, "synset": "thyrsopteris.n.01", "name": "thyrsopteris"}, - {"id": 21717, "synset": "shield_fern.n.01", "name": "shield_fern"}, - {"id": 21718, "synset": "broad_buckler-fern.n.01", "name": "broad_buckler-fern"}, - {"id": 21719, "synset": "fragrant_cliff_fern.n.01", "name": "fragrant_cliff_fern"}, - {"id": 21720, "synset": "goldie's_fern.n.01", "name": "Goldie's_fern"}, - {"id": 21721, "synset": "wood_fern.n.01", "name": "wood_fern"}, - {"id": 21722, "synset": "male_fern.n.01", "name": "male_fern"}, - {"id": 21723, "synset": "marginal_wood_fern.n.01", "name": "marginal_wood_fern"}, - {"id": 21724, "synset": "mountain_male_fern.n.01", "name": "mountain_male_fern"}, - {"id": 21725, "synset": "lady_fern.n.01", "name": "lady_fern"}, - {"id": 21726, "synset": "alpine_lady_fern.n.01", "name": "Alpine_lady_fern"}, - {"id": 21727, "synset": "silvery_spleenwort.n.02", "name": "silvery_spleenwort"}, - {"id": 21728, "synset": "holly_fern.n.02", "name": "holly_fern"}, - {"id": 21729, "synset": "bladder_fern.n.01", "name": "bladder_fern"}, - {"id": 21730, "synset": "brittle_bladder_fern.n.01", "name": "brittle_bladder_fern"}, - {"id": 21731, "synset": "mountain_bladder_fern.n.01", "name": "mountain_bladder_fern"}, - {"id": 21732, "synset": "bulblet_fern.n.01", "name": "bulblet_fern"}, - {"id": 21733, "synset": "silvery_spleenwort.n.01", "name": "silvery_spleenwort"}, - {"id": 21734, "synset": "oak_fern.n.01", "name": "oak_fern"}, - {"id": 21735, "synset": "limestone_fern.n.01", "name": "limestone_fern"}, - {"id": 21736, "synset": "ostrich_fern.n.01", "name": "ostrich_fern"}, - {"id": 21737, "synset": "hart's-tongue.n.01", "name": "hart's-tongue"}, - {"id": 21738, "synset": "sensitive_fern.n.01", "name": "sensitive_fern"}, - {"id": 21739, "synset": "christmas_fern.n.01", "name": "Christmas_fern"}, - {"id": 21740, "synset": "holly_fern.n.01", "name": "holly_fern"}, - {"id": 21741, "synset": "braun's_holly_fern.n.01", "name": "Braun's_holly_fern"}, - {"id": 21742, "synset": "western_holly_fern.n.01", "name": "western_holly_fern"}, - {"id": 21743, "synset": "soft_shield_fern.n.01", "name": "soft_shield_fern"}, - {"id": 21744, "synset": "leather_fern.n.02", "name": "leather_fern"}, - {"id": 21745, "synset": "button_fern.n.02", "name": "button_fern"}, - {"id": 21746, "synset": "indian_button_fern.n.01", "name": "Indian_button_fern"}, - {"id": 21747, "synset": "woodsia.n.01", "name": "woodsia"}, - {"id": 21748, "synset": "rusty_woodsia.n.01", "name": "rusty_woodsia"}, - {"id": 21749, "synset": "alpine_woodsia.n.01", "name": "Alpine_woodsia"}, - {"id": 21750, "synset": "smooth_woodsia.n.01", "name": "smooth_woodsia"}, - {"id": 21751, "synset": "boston_fern.n.01", "name": "Boston_fern"}, - {"id": 21752, "synset": "basket_fern.n.01", "name": "basket_fern"}, - {"id": 21753, "synset": "golden_fern.n.02", "name": "golden_fern"}, - {"id": 21754, "synset": "maidenhair.n.01", "name": "maidenhair"}, - {"id": 21755, "synset": "common_maidenhair.n.01", "name": "common_maidenhair"}, - {"id": 21756, "synset": "american_maidenhair_fern.n.01", "name": "American_maidenhair_fern"}, - {"id": 21757, "synset": "bermuda_maidenhair.n.01", "name": "Bermuda_maidenhair"}, - {"id": 21758, "synset": "brittle_maidenhair.n.01", "name": "brittle_maidenhair"}, - {"id": 21759, "synset": "farley_maidenhair.n.01", "name": "Farley_maidenhair"}, - {"id": 21760, "synset": "annual_fern.n.01", "name": "annual_fern"}, - {"id": 21761, "synset": "lip_fern.n.01", "name": "lip_fern"}, - {"id": 21762, "synset": "smooth_lip_fern.n.01", "name": "smooth_lip_fern"}, - {"id": 21763, "synset": "lace_fern.n.01", "name": "lace_fern"}, - {"id": 21764, "synset": "wooly_lip_fern.n.01", "name": "wooly_lip_fern"}, - {"id": 21765, "synset": "southwestern_lip_fern.n.01", "name": "southwestern_lip_fern"}, - {"id": 21766, "synset": "bamboo_fern.n.01", "name": "bamboo_fern"}, - {"id": 21767, "synset": "american_rock_brake.n.01", "name": "American_rock_brake"}, - {"id": 21768, "synset": "european_parsley_fern.n.01", "name": "European_parsley_fern"}, - {"id": 21769, "synset": "hand_fern.n.01", "name": "hand_fern"}, - {"id": 21770, "synset": "cliff_brake.n.01", "name": "cliff_brake"}, - {"id": 21771, "synset": "coffee_fern.n.01", "name": "coffee_fern"}, - {"id": 21772, "synset": "purple_rock_brake.n.01", "name": "purple_rock_brake"}, - {"id": 21773, "synset": "bird's-foot_fern.n.01", "name": "bird's-foot_fern"}, - {"id": 21774, "synset": "button_fern.n.01", "name": "button_fern"}, - {"id": 21775, "synset": "silver_fern.n.02", "name": "silver_fern"}, - {"id": 21776, "synset": "golden_fern.n.01", "name": "golden_fern"}, - {"id": 21777, "synset": "gold_fern.n.01", "name": "gold_fern"}, - {"id": 21778, "synset": "pteris_cretica.n.01", "name": "Pteris_cretica"}, - {"id": 21779, "synset": "spider_brake.n.01", "name": "spider_brake"}, - {"id": 21780, "synset": "ribbon_fern.n.01", "name": "ribbon_fern"}, - {"id": 21781, "synset": "potato_fern.n.01", "name": "potato_fern"}, - {"id": 21782, "synset": "angiopteris.n.01", "name": "angiopteris"}, - {"id": 21783, "synset": "skeleton_fork_fern.n.01", "name": "skeleton_fork_fern"}, - {"id": 21784, "synset": "horsetail.n.01", "name": "horsetail"}, - {"id": 21785, "synset": "common_horsetail.n.01", "name": "common_horsetail"}, - {"id": 21786, "synset": "swamp_horsetail.n.01", "name": "swamp_horsetail"}, - {"id": 21787, "synset": "scouring_rush.n.01", "name": "scouring_rush"}, - {"id": 21788, "synset": "marsh_horsetail.n.01", "name": "marsh_horsetail"}, - {"id": 21789, "synset": "wood_horsetail.n.01", "name": "wood_horsetail"}, - {"id": 21790, "synset": "variegated_horsetail.n.01", "name": "variegated_horsetail"}, - {"id": 21791, "synset": "club_moss.n.01", "name": "club_moss"}, - {"id": 21792, "synset": "shining_clubmoss.n.01", "name": "shining_clubmoss"}, - {"id": 21793, "synset": "alpine_clubmoss.n.01", "name": "alpine_clubmoss"}, - {"id": 21794, "synset": "fir_clubmoss.n.01", "name": "fir_clubmoss"}, - {"id": 21795, "synset": "ground_cedar.n.01", "name": "ground_cedar"}, - {"id": 21796, "synset": "ground_fir.n.01", "name": "ground_fir"}, - {"id": 21797, "synset": "foxtail_grass.n.01", "name": "foxtail_grass"}, - {"id": 21798, "synset": "spikemoss.n.01", "name": "spikemoss"}, - {"id": 21799, "synset": "meadow_spikemoss.n.01", "name": "meadow_spikemoss"}, - {"id": 21800, "synset": "desert_selaginella.n.01", "name": "desert_selaginella"}, - {"id": 21801, "synset": "resurrection_plant.n.01", "name": "resurrection_plant"}, - {"id": 21802, "synset": "florida_selaginella.n.01", "name": "florida_selaginella"}, - {"id": 21803, "synset": "quillwort.n.01", "name": "quillwort"}, - {"id": 21804, "synset": "earthtongue.n.01", "name": "earthtongue"}, - {"id": 21805, "synset": "snuffbox_fern.n.01", "name": "snuffbox_fern"}, - {"id": 21806, "synset": "christella.n.01", "name": "christella"}, - {"id": 21807, "synset": "mountain_fern.n.01", "name": "mountain_fern"}, - {"id": 21808, "synset": "new_york_fern.n.01", "name": "New_York_fern"}, - {"id": 21809, "synset": "massachusetts_fern.n.01", "name": "Massachusetts_fern"}, - {"id": 21810, "synset": "beech_fern.n.01", "name": "beech_fern"}, - {"id": 21811, "synset": "broad_beech_fern.n.01", "name": "broad_beech_fern"}, - {"id": 21812, "synset": "long_beech_fern.n.01", "name": "long_beech_fern"}, - {"id": 21813, "synset": "shoestring_fungus.n.01", "name": "shoestring_fungus"}, - {"id": 21814, "synset": "armillaria_caligata.n.01", "name": "Armillaria_caligata"}, - {"id": 21815, "synset": "armillaria_ponderosa.n.01", "name": "Armillaria_ponderosa"}, - {"id": 21816, "synset": "armillaria_zelleri.n.01", "name": "Armillaria_zelleri"}, - {"id": 21817, "synset": "honey_mushroom.n.01", "name": "honey_mushroom"}, - {"id": 21818, "synset": "milkweed.n.01", "name": "milkweed"}, - {"id": 21819, "synset": "white_milkweed.n.01", "name": "white_milkweed"}, - {"id": 21820, "synset": "poke_milkweed.n.01", "name": "poke_milkweed"}, - {"id": 21821, "synset": "swamp_milkweed.n.01", "name": "swamp_milkweed"}, - {"id": 21822, "synset": "mead's_milkweed.n.01", "name": "Mead's_milkweed"}, - {"id": 21823, "synset": "purple_silkweed.n.01", "name": "purple_silkweed"}, - {"id": 21824, "synset": "showy_milkweed.n.01", "name": "showy_milkweed"}, - {"id": 21825, "synset": "poison_milkweed.n.01", "name": "poison_milkweed"}, - {"id": 21826, "synset": "butterfly_weed.n.01", "name": "butterfly_weed"}, - {"id": 21827, "synset": "whorled_milkweed.n.01", "name": "whorled_milkweed"}, - {"id": 21828, "synset": "cruel_plant.n.01", "name": "cruel_plant"}, - {"id": 21829, "synset": "wax_plant.n.01", "name": "wax_plant"}, - {"id": 21830, "synset": "silk_vine.n.01", "name": "silk_vine"}, - {"id": 21831, "synset": "stapelia.n.01", "name": "stapelia"}, - {"id": 21832, "synset": "stapelias_asterias.n.01", "name": "Stapelias_asterias"}, - {"id": 21833, "synset": "stephanotis.n.01", "name": "stephanotis"}, - {"id": 21834, "synset": "madagascar_jasmine.n.01", "name": "Madagascar_jasmine"}, - {"id": 21835, "synset": "negro_vine.n.01", "name": "negro_vine"}, - {"id": 21836, "synset": "zygospore.n.01", "name": "zygospore"}, - {"id": 21837, "synset": "tree_of_knowledge.n.01", "name": "tree_of_knowledge"}, - {"id": 21838, "synset": "orangery.n.01", "name": "orangery"}, - {"id": 21839, "synset": "pocketbook.n.01", "name": "pocketbook"}, - {"id": 21840, "synset": "shit.n.04", "name": "shit"}, - {"id": 21841, "synset": "cordage.n.01", "name": "cordage"}, - {"id": 21842, "synset": "yard.n.01", "name": "yard"}, - {"id": 21843, "synset": "extremum.n.02", "name": "extremum"}, - {"id": 21844, "synset": "leaf_shape.n.01", "name": "leaf_shape"}, - {"id": 21845, "synset": "equilateral.n.01", "name": "equilateral"}, - {"id": 21846, "synset": "figure.n.06", "name": "figure"}, - {"id": 21847, "synset": "pencil.n.03", "name": "pencil"}, - {"id": 21848, "synset": "plane_figure.n.01", "name": "plane_figure"}, - {"id": 21849, "synset": "solid_figure.n.01", "name": "solid_figure"}, - {"id": 21850, "synset": "line.n.04", "name": "line"}, - {"id": 21851, "synset": "bulb.n.04", "name": "bulb"}, - {"id": 21852, "synset": "convex_shape.n.01", "name": "convex_shape"}, - {"id": 21853, "synset": "concave_shape.n.01", "name": "concave_shape"}, - {"id": 21854, "synset": "cylinder.n.01", "name": "cylinder"}, - {"id": 21855, "synset": "round_shape.n.01", "name": "round_shape"}, - {"id": 21856, "synset": "heart.n.07", "name": "heart"}, - {"id": 21857, "synset": "polygon.n.01", "name": "polygon"}, - {"id": 21858, "synset": "convex_polygon.n.01", "name": "convex_polygon"}, - {"id": 21859, "synset": "concave_polygon.n.01", "name": "concave_polygon"}, - {"id": 21860, "synset": "reentrant_polygon.n.01", "name": "reentrant_polygon"}, - {"id": 21861, "synset": "amorphous_shape.n.01", "name": "amorphous_shape"}, - {"id": 21862, "synset": "closed_curve.n.01", "name": "closed_curve"}, - {"id": 21863, "synset": "simple_closed_curve.n.01", "name": "simple_closed_curve"}, - {"id": 21864, "synset": "s-shape.n.01", "name": "S-shape"}, - {"id": 21865, "synset": "wave.n.07", "name": "wave"}, - {"id": 21866, "synset": "extrados.n.01", "name": "extrados"}, - {"id": 21867, "synset": "hook.n.02", "name": "hook"}, - {"id": 21868, "synset": "envelope.n.03", "name": "envelope"}, - {"id": 21869, "synset": "bight.n.02", "name": "bight"}, - {"id": 21870, "synset": "diameter.n.02", "name": "diameter"}, - {"id": 21871, "synset": "cone.n.02", "name": "cone"}, - {"id": 21872, "synset": "funnel.n.01", "name": "funnel"}, - {"id": 21873, "synset": "oblong.n.01", "name": "oblong"}, - {"id": 21874, "synset": "circle.n.01", "name": "circle"}, - {"id": 21875, "synset": "circle.n.03", "name": "circle"}, - {"id": 21876, "synset": "equator.n.02", "name": "equator"}, - {"id": 21877, "synset": "scallop.n.01", "name": "scallop"}, - {"id": 21878, "synset": "ring.n.02", "name": "ring"}, - {"id": 21879, "synset": "loop.n.02", "name": "loop"}, - {"id": 21880, "synset": "bight.n.01", "name": "bight"}, - {"id": 21881, "synset": "helix.n.01", "name": "helix"}, - {"id": 21882, "synset": "element_of_a_cone.n.01", "name": "element_of_a_cone"}, - {"id": 21883, "synset": "element_of_a_cylinder.n.01", "name": "element_of_a_cylinder"}, - {"id": 21884, "synset": "ellipse.n.01", "name": "ellipse"}, - {"id": 21885, "synset": "quadrate.n.02", "name": "quadrate"}, - {"id": 21886, "synset": "triangle.n.01", "name": "triangle"}, - {"id": 21887, "synset": "acute_triangle.n.01", "name": "acute_triangle"}, - {"id": 21888, "synset": "isosceles_triangle.n.01", "name": "isosceles_triangle"}, - {"id": 21889, "synset": "obtuse_triangle.n.01", "name": "obtuse_triangle"}, - {"id": 21890, "synset": "right_triangle.n.01", "name": "right_triangle"}, - {"id": 21891, "synset": "scalene_triangle.n.01", "name": "scalene_triangle"}, - {"id": 21892, "synset": "parallel.n.03", "name": "parallel"}, - {"id": 21893, "synset": "trapezoid.n.01", "name": "trapezoid"}, - {"id": 21894, "synset": "star.n.05", "name": "star"}, - {"id": 21895, "synset": "pentagon.n.03", "name": "pentagon"}, - {"id": 21896, "synset": "hexagon.n.01", "name": "hexagon"}, - {"id": 21897, "synset": "heptagon.n.01", "name": "heptagon"}, - {"id": 21898, "synset": "octagon.n.01", "name": "octagon"}, - {"id": 21899, "synset": "nonagon.n.01", "name": "nonagon"}, - {"id": 21900, "synset": "decagon.n.01", "name": "decagon"}, - {"id": 21901, "synset": "rhombus.n.01", "name": "rhombus"}, - {"id": 21902, "synset": "spherical_polygon.n.01", "name": "spherical_polygon"}, - {"id": 21903, "synset": "spherical_triangle.n.01", "name": "spherical_triangle"}, - {"id": 21904, "synset": "convex_polyhedron.n.01", "name": "convex_polyhedron"}, - {"id": 21905, "synset": "concave_polyhedron.n.01", "name": "concave_polyhedron"}, - {"id": 21906, "synset": "cuboid.n.01", "name": "cuboid"}, - {"id": 21907, "synset": "quadrangular_prism.n.01", "name": "quadrangular_prism"}, - {"id": 21908, "synset": "bell.n.05", "name": "bell"}, - {"id": 21909, "synset": "angular_distance.n.01", "name": "angular_distance"}, - {"id": 21910, "synset": "true_anomaly.n.01", "name": "true_anomaly"}, - {"id": 21911, "synset": "spherical_angle.n.01", "name": "spherical_angle"}, - {"id": 21912, "synset": "angle_of_refraction.n.01", "name": "angle_of_refraction"}, - {"id": 21913, "synset": "acute_angle.n.01", "name": "acute_angle"}, - {"id": 21914, "synset": "groove.n.01", "name": "groove"}, - {"id": 21915, "synset": "rut.n.01", "name": "rut"}, - {"id": 21916, "synset": "bulge.n.01", "name": "bulge"}, - {"id": 21917, "synset": "belly.n.03", "name": "belly"}, - {"id": 21918, "synset": "bow.n.05", "name": "bow"}, - {"id": 21919, "synset": "crescent.n.01", "name": "crescent"}, - {"id": 21920, "synset": "ellipsoid.n.01", "name": "ellipsoid"}, - {"id": 21921, "synset": "hypotenuse.n.01", "name": "hypotenuse"}, - {"id": 21922, "synset": "balance.n.04", "name": "balance"}, - {"id": 21923, "synset": "conformation.n.01", "name": "conformation"}, - {"id": 21924, "synset": "symmetry.n.02", "name": "symmetry"}, - {"id": 21925, "synset": "spheroid.n.01", "name": "spheroid"}, - {"id": 21926, "synset": "spherule.n.01", "name": "spherule"}, - {"id": 21927, "synset": "toroid.n.01", "name": "toroid"}, - {"id": 21928, "synset": "column.n.04", "name": "column"}, - {"id": 21929, "synset": "barrel.n.03", "name": "barrel"}, - {"id": 21930, "synset": "pipe.n.03", "name": "pipe"}, - {"id": 21931, "synset": "pellet.n.01", "name": "pellet"}, - {"id": 21932, "synset": "bolus.n.01", "name": "bolus"}, - {"id": 21933, "synset": "dewdrop.n.01", "name": "dewdrop"}, - {"id": 21934, "synset": "ridge.n.02", "name": "ridge"}, - {"id": 21935, "synset": "rim.n.01", "name": "rim"}, - {"id": 21936, "synset": "taper.n.01", "name": "taper"}, - {"id": 21937, "synset": "boundary.n.02", "name": "boundary"}, - {"id": 21938, "synset": "incisure.n.01", "name": "incisure"}, - {"id": 21939, "synset": "notch.n.01", "name": "notch"}, - {"id": 21940, "synset": "wrinkle.n.01", "name": "wrinkle"}, - {"id": 21941, "synset": "dermatoglyphic.n.01", "name": "dermatoglyphic"}, - {"id": 21942, "synset": "frown_line.n.01", "name": "frown_line"}, - {"id": 21943, "synset": "line_of_life.n.01", "name": "line_of_life"}, - {"id": 21944, "synset": "line_of_heart.n.01", "name": "line_of_heart"}, - {"id": 21945, "synset": "crevice.n.01", "name": "crevice"}, - {"id": 21946, "synset": "cleft.n.01", "name": "cleft"}, - {"id": 21947, "synset": "roulette.n.01", "name": "roulette"}, - {"id": 21948, "synset": "node.n.01", "name": "node"}, - {"id": 21949, "synset": "tree.n.02", "name": "tree"}, - {"id": 21950, "synset": "stemma.n.01", "name": "stemma"}, - {"id": 21951, "synset": "brachium.n.01", "name": "brachium"}, - {"id": 21952, "synset": "fork.n.03", "name": "fork"}, - {"id": 21953, "synset": "block.n.03", "name": "block"}, - {"id": 21954, "synset": "ovoid.n.01", "name": "ovoid"}, - {"id": 21955, "synset": "tetrahedron.n.01", "name": "tetrahedron"}, - {"id": 21956, "synset": "pentahedron.n.01", "name": "pentahedron"}, - {"id": 21957, "synset": "hexahedron.n.01", "name": "hexahedron"}, - {"id": 21958, "synset": "regular_polyhedron.n.01", "name": "regular_polyhedron"}, - {"id": 21959, "synset": "polyhedral_angle.n.01", "name": "polyhedral_angle"}, - {"id": 21960, "synset": "cube.n.01", "name": "cube"}, - {"id": 21961, "synset": "truncated_pyramid.n.01", "name": "truncated_pyramid"}, - {"id": 21962, "synset": "truncated_cone.n.01", "name": "truncated_cone"}, - {"id": 21963, "synset": "tail.n.03", "name": "tail"}, - {"id": 21964, "synset": "tongue.n.03", "name": "tongue"}, - {"id": 21965, "synset": "trapezohedron.n.01", "name": "trapezohedron"}, - {"id": 21966, "synset": "wedge.n.01", "name": "wedge"}, - {"id": 21967, "synset": "keel.n.01", "name": "keel"}, - {"id": 21968, "synset": "place.n.06", "name": "place"}, - {"id": 21969, "synset": "herpes.n.01", "name": "herpes"}, - {"id": 21970, "synset": "chlamydia.n.01", "name": "chlamydia"}, - {"id": 21971, "synset": "wall.n.04", "name": "wall"}, - {"id": 21972, "synset": "micronutrient.n.01", "name": "micronutrient"}, - {"id": 21973, "synset": "chyme.n.01", "name": "chyme"}, - {"id": 21974, "synset": "ragweed_pollen.n.01", "name": "ragweed_pollen"}, - {"id": 21975, "synset": "pina_cloth.n.01", "name": "pina_cloth"}, - { - "id": 21976, - "synset": "chlorobenzylidenemalononitrile.n.01", - "name": "chlorobenzylidenemalononitrile", - }, - {"id": 21977, "synset": "carbon.n.01", "name": "carbon"}, - {"id": 21978, "synset": "charcoal.n.01", "name": "charcoal"}, - {"id": 21979, "synset": "rock.n.02", "name": "rock"}, - {"id": 21980, "synset": "gravel.n.01", "name": "gravel"}, - {"id": 21981, "synset": "aflatoxin.n.01", "name": "aflatoxin"}, - {"id": 21982, "synset": "alpha-tocopheral.n.01", "name": "alpha-tocopheral"}, - {"id": 21983, "synset": "leopard.n.01", "name": "leopard"}, - {"id": 21984, "synset": "bricks_and_mortar.n.01", "name": "bricks_and_mortar"}, - {"id": 21985, "synset": "lagging.n.01", "name": "lagging"}, - {"id": 21986, "synset": "hydraulic_cement.n.01", "name": "hydraulic_cement"}, - {"id": 21987, "synset": "choline.n.01", "name": "choline"}, - {"id": 21988, "synset": "concrete.n.01", "name": "concrete"}, - {"id": 21989, "synset": "glass_wool.n.01", "name": "glass_wool"}, - {"id": 21990, "synset": "soil.n.02", "name": "soil"}, - {"id": 21991, "synset": "high_explosive.n.01", "name": "high_explosive"}, - {"id": 21992, "synset": "litter.n.02", "name": "litter"}, - {"id": 21993, "synset": "fish_meal.n.01", "name": "fish_meal"}, - {"id": 21994, "synset": "greek_fire.n.01", "name": "Greek_fire"}, - {"id": 21995, "synset": "culture_medium.n.01", "name": "culture_medium"}, - {"id": 21996, "synset": "agar.n.01", "name": "agar"}, - {"id": 21997, "synset": "blood_agar.n.01", "name": "blood_agar"}, - {"id": 21998, "synset": "hip_tile.n.01", "name": "hip_tile"}, - {"id": 21999, "synset": "hyacinth.n.01", "name": "hyacinth"}, - {"id": 22000, "synset": "hydroxide_ion.n.01", "name": "hydroxide_ion"}, - {"id": 22001, "synset": "ice.n.01", "name": "ice"}, - {"id": 22002, "synset": "inositol.n.01", "name": "inositol"}, - {"id": 22003, "synset": "linoleum.n.01", "name": "linoleum"}, - {"id": 22004, "synset": "lithia_water.n.01", "name": "lithia_water"}, - {"id": 22005, "synset": "lodestone.n.01", "name": "lodestone"}, - {"id": 22006, "synset": "pantothenic_acid.n.01", "name": "pantothenic_acid"}, - {"id": 22007, "synset": "paper.n.01", "name": "paper"}, - {"id": 22008, "synset": "papyrus.n.01", "name": "papyrus"}, - {"id": 22009, "synset": "pantile.n.01", "name": "pantile"}, - {"id": 22010, "synset": "blacktop.n.01", "name": "blacktop"}, - {"id": 22011, "synset": "tarmacadam.n.01", "name": "tarmacadam"}, - {"id": 22012, "synset": "paving.n.01", "name": "paving"}, - {"id": 22013, "synset": "plaster.n.01", "name": "plaster"}, - {"id": 22014, "synset": "poison_gas.n.01", "name": "poison_gas"}, - {"id": 22015, "synset": "ridge_tile.n.01", "name": "ridge_tile"}, - {"id": 22016, "synset": "roughcast.n.01", "name": "roughcast"}, - {"id": 22017, "synset": "sand.n.01", "name": "sand"}, - {"id": 22018, "synset": "spackle.n.01", "name": "spackle"}, - {"id": 22019, "synset": "render.n.01", "name": "render"}, - {"id": 22020, "synset": "wattle_and_daub.n.01", "name": "wattle_and_daub"}, - {"id": 22021, "synset": "stucco.n.01", "name": "stucco"}, - {"id": 22022, "synset": "tear_gas.n.01", "name": "tear_gas"}, - {"id": 22023, "synset": "linseed.n.01", "name": "linseed"}, - {"id": 22024, "synset": "vitamin.n.01", "name": "vitamin"}, - {"id": 22025, "synset": "fat-soluble_vitamin.n.01", "name": "fat-soluble_vitamin"}, - {"id": 22026, "synset": "water-soluble_vitamin.n.01", "name": "water-soluble_vitamin"}, - {"id": 22027, "synset": "vitamin_a.n.01", "name": "vitamin_A"}, - {"id": 22028, "synset": "vitamin_a1.n.01", "name": "vitamin_A1"}, - {"id": 22029, "synset": "vitamin_a2.n.01", "name": "vitamin_A2"}, - {"id": 22030, "synset": "b-complex_vitamin.n.01", "name": "B-complex_vitamin"}, - {"id": 22031, "synset": "vitamin_b1.n.01", "name": "vitamin_B1"}, - {"id": 22032, "synset": "vitamin_b12.n.01", "name": "vitamin_B12"}, - {"id": 22033, "synset": "vitamin_b2.n.01", "name": "vitamin_B2"}, - {"id": 22034, "synset": "vitamin_b6.n.01", "name": "vitamin_B6"}, - {"id": 22035, "synset": "vitamin_bc.n.01", "name": "vitamin_Bc"}, - {"id": 22036, "synset": "niacin.n.01", "name": "niacin"}, - {"id": 22037, "synset": "vitamin_d.n.01", "name": "vitamin_D"}, - {"id": 22038, "synset": "vitamin_e.n.01", "name": "vitamin_E"}, - {"id": 22039, "synset": "biotin.n.01", "name": "biotin"}, - {"id": 22040, "synset": "vitamin_k.n.01", "name": "vitamin_K"}, - {"id": 22041, "synset": "vitamin_k1.n.01", "name": "vitamin_K1"}, - {"id": 22042, "synset": "vitamin_k3.n.01", "name": "vitamin_K3"}, - {"id": 22043, "synset": "vitamin_p.n.01", "name": "vitamin_P"}, - {"id": 22044, "synset": "vitamin_c.n.01", "name": "vitamin_C"}, - {"id": 22045, "synset": "planking.n.01", "name": "planking"}, - {"id": 22046, "synset": "chipboard.n.01", "name": "chipboard"}, - {"id": 22047, "synset": "knothole.n.01", "name": "knothole"}, -] diff --git a/dimos/models/Detic/detic/data/datasets/lvis_v1.py b/dimos/models/Detic/detic/data/datasets/lvis_v1.py deleted file mode 100644 index 659a5fbbc0..0000000000 --- a/dimos/models/Detic/detic/data/datasets/lvis_v1.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import logging -import os - -from detectron2.data import DatasetCatalog, MetadataCatalog -from detectron2.data.datasets.lvis import get_lvis_instances_meta -from detectron2.structures import BoxMode -from fvcore.common.file_io import PathManager -from fvcore.common.timer import Timer -from typing import Optional - -logger = logging.getLogger(__name__) - -__all__ = ["custom_load_lvis_json", "custom_register_lvis_instances"] - - -def custom_register_lvis_instances(name: str, metadata, json_file, image_root) -> None: - """ """ - DatasetCatalog.register(name, lambda: custom_load_lvis_json(json_file, image_root, name)) - MetadataCatalog.get(name).set( - json_file=json_file, image_root=image_root, evaluator_type="lvis", **metadata - ) - - -def custom_load_lvis_json(json_file, image_root, dataset_name: Optional[str]=None): - """ - Modifications: - use `file_name` - convert neg_category_ids - add pos_category_ids - """ - from lvis import LVIS - - json_file = PathManager.get_local_path(json_file) - - timer = Timer() - lvis_api = LVIS(json_file) - if timer.seconds() > 1: - logger.info(f"Loading {json_file} takes {timer.seconds():.2f} seconds.") - - catid2contid = { - x["id"]: i - for i, x in enumerate(sorted(lvis_api.dataset["categories"], key=lambda x: x["id"])) - } - if len(lvis_api.dataset["categories"]) == 1203: - for x in lvis_api.dataset["categories"]: - assert catid2contid[x["id"]] == x["id"] - 1 - img_ids = sorted(lvis_api.imgs.keys()) - imgs = lvis_api.load_imgs(img_ids) - anns = [lvis_api.img_ann_map[img_id] for img_id in img_ids] - - ann_ids = [ann["id"] for anns_per_image in anns for ann in anns_per_image] - assert len(set(ann_ids)) == len(ann_ids), f"Annotation ids in '{json_file}' are not unique" - - imgs_anns = list(zip(imgs, anns, strict=False)) - logger.info(f"Loaded {len(imgs_anns)} images in the LVIS v1 format from {json_file}") - - dataset_dicts = [] - - for img_dict, anno_dict_list in imgs_anns: - record = {} - if "file_name" in img_dict: - file_name = img_dict["file_name"] - if img_dict["file_name"].startswith("COCO"): - file_name = file_name[-16:] - record["file_name"] = os.path.join(image_root, file_name) - elif "coco_url" in img_dict: - # e.g., http://images.cocodataset.org/train2017/000000391895.jpg - file_name = img_dict["coco_url"][30:] - record["file_name"] = os.path.join(image_root, file_name) - elif "tar_index" in img_dict: - record["tar_index"] = img_dict["tar_index"] - - record["height"] = img_dict["height"] - record["width"] = img_dict["width"] - record["not_exhaustive_category_ids"] = img_dict.get("not_exhaustive_category_ids", []) - record["neg_category_ids"] = img_dict.get("neg_category_ids", []) - # NOTE: modified by Xingyi: convert to 0-based - record["neg_category_ids"] = [catid2contid[x] for x in record["neg_category_ids"]] - if "pos_category_ids" in img_dict: - record["pos_category_ids"] = [ - catid2contid[x] for x in img_dict.get("pos_category_ids", []) - ] - if "captions" in img_dict: - record["captions"] = img_dict["captions"] - if "caption_features" in img_dict: - record["caption_features"] = img_dict["caption_features"] - image_id = record["image_id"] = img_dict["id"] - - objs = [] - for anno in anno_dict_list: - assert anno["image_id"] == image_id - if anno.get("iscrowd", 0) > 0: - continue - obj = {"bbox": anno["bbox"], "bbox_mode": BoxMode.XYWH_ABS} - obj["category_id"] = catid2contid[anno["category_id"]] - if "segmentation" in anno: - segm = anno["segmentation"] - valid_segm = [poly for poly in segm if len(poly) % 2 == 0 and len(poly) >= 6] - # assert len(segm) == len( - # valid_segm - # ), "Annotation contains an invalid polygon with < 3 points" - if not len(segm) == len(valid_segm): - print("Annotation contains an invalid polygon with < 3 points") - assert len(segm) > 0 - obj["segmentation"] = segm - objs.append(obj) - record["annotations"] = objs - dataset_dicts.append(record) - - return dataset_dicts - - -_CUSTOM_SPLITS_LVIS = { - "lvis_v1_train+coco": ("coco/", "lvis/lvis_v1_train+coco_mask.json"), - "lvis_v1_train_norare": ("coco/", "lvis/lvis_v1_train_norare.json"), -} - - -for key, (image_root, json_file) in _CUSTOM_SPLITS_LVIS.items(): - custom_register_lvis_instances( - key, - get_lvis_instances_meta(key), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) - - -def get_lvis_22k_meta(): - from .lvis_22k_categories import CATEGORIES - - cat_ids = [k["id"] for k in CATEGORIES] - assert min(cat_ids) == 1 and max(cat_ids) == len(cat_ids), ( - "Category ids are not in [1, #categories], as expected" - ) - # Ensure that the category list is sorted by id - lvis_categories = sorted(CATEGORIES, key=lambda x: x["id"]) - thing_classes = [k["name"] for k in lvis_categories] - meta = {"thing_classes": thing_classes} - return meta - - -_CUSTOM_SPLITS_LVIS_22K = { - "lvis_v1_train_22k": ("coco/", "lvis/lvis_v1_train_lvis-22k.json"), -} - -for key, (image_root, json_file) in _CUSTOM_SPLITS_LVIS_22K.items(): - custom_register_lvis_instances( - key, - get_lvis_22k_meta(), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/detic/data/datasets/objects365.py b/dimos/models/Detic/detic/data/datasets/objects365.py deleted file mode 100644 index 236e609287..0000000000 --- a/dimos/models/Detic/detic/data/datasets/objects365.py +++ /dev/null @@ -1,781 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import os - -from detectron2.data.datasets.register_coco import register_coco_instances - -# categories_v2 = [ -# {'id': 1, 'name': 'Person'}, -# {'id': 2, 'name': 'Sneakers'}, -# {'id': 3, 'name': 'Chair'}, -# {'id': 4, 'name': 'Other Shoes'}, -# {'id': 5, 'name': 'Hat'}, -# {'id': 6, 'name': 'Car'}, -# {'id': 7, 'name': 'Lamp'}, -# {'id': 8, 'name': 'Glasses'}, -# {'id': 9, 'name': 'Bottle'}, -# {'id': 10, 'name': 'Desk'}, -# {'id': 11, 'name': 'Cup'}, -# {'id': 12, 'name': 'Street Lights'}, -# {'id': 13, 'name': 'Cabinet/shelf'}, -# {'id': 14, 'name': 'Handbag/Satchel'}, -# {'id': 15, 'name': 'Bracelet'}, -# {'id': 16, 'name': 'Plate'}, -# {'id': 17, 'name': 'Picture/Frame'}, -# {'id': 18, 'name': 'Helmet'}, -# {'id': 19, 'name': 'Book'}, -# {'id': 20, 'name': 'Gloves'}, -# {'id': 21, 'name': 'Storage box'}, -# {'id': 22, 'name': 'Boat'}, -# {'id': 23, 'name': 'Leather Shoes'}, -# {'id': 24, 'name': 'Flower'}, -# {'id': 25, 'name': 'Bench'}, -# {'id': 26, 'name': 'Potted Plant'}, -# {'id': 27, 'name': 'Bowl/Basin'}, -# {'id': 28, 'name': 'Flag'}, -# {'id': 29, 'name': 'Pillow'}, -# {'id': 30, 'name': 'Boots'}, -# {'id': 31, 'name': 'Vase'}, -# {'id': 32, 'name': 'Microphone'}, -# {'id': 33, 'name': 'Necklace'}, -# {'id': 34, 'name': 'Ring'}, -# {'id': 35, 'name': 'SUV'}, -# {'id': 36, 'name': 'Wine Glass'}, -# {'id': 37, 'name': 'Belt'}, -# {'id': 38, 'name': 'Moniter/TV'}, -# {'id': 39, 'name': 'Backpack'}, -# {'id': 40, 'name': 'Umbrella'}, -# {'id': 41, 'name': 'Traffic Light'}, -# {'id': 42, 'name': 'Speaker'}, -# {'id': 43, 'name': 'Watch'}, -# {'id': 44, 'name': 'Tie'}, -# {'id': 45, 'name': 'Trash bin Can'}, -# {'id': 46, 'name': 'Slippers'}, -# {'id': 47, 'name': 'Bicycle'}, -# {'id': 48, 'name': 'Stool'}, -# {'id': 49, 'name': 'Barrel/bucket'}, -# {'id': 50, 'name': 'Van'}, -# {'id': 51, 'name': 'Couch'}, -# {'id': 52, 'name': 'Sandals'}, -# {'id': 53, 'name': 'Bakset'}, -# {'id': 54, 'name': 'Drum'}, -# {'id': 55, 'name': 'Pen/Pencil'}, -# {'id': 56, 'name': 'Bus'}, -# {'id': 57, 'name': 'Wild Bird'}, -# {'id': 58, 'name': 'High Heels'}, -# {'id': 59, 'name': 'Motorcycle'}, -# {'id': 60, 'name': 'Guitar'}, -# {'id': 61, 'name': 'Carpet'}, -# {'id': 62, 'name': 'Cell Phone'}, -# {'id': 63, 'name': 'Bread'}, -# {'id': 64, 'name': 'Camera'}, -# {'id': 65, 'name': 'Canned'}, -# {'id': 66, 'name': 'Truck'}, -# {'id': 67, 'name': 'Traffic cone'}, -# {'id': 68, 'name': 'Cymbal'}, -# {'id': 69, 'name': 'Lifesaver'}, -# {'id': 70, 'name': 'Towel'}, -# {'id': 71, 'name': 'Stuffed Toy'}, -# {'id': 72, 'name': 'Candle'}, -# {'id': 73, 'name': 'Sailboat'}, -# {'id': 74, 'name': 'Laptop'}, -# {'id': 75, 'name': 'Awning'}, -# {'id': 76, 'name': 'Bed'}, -# {'id': 77, 'name': 'Faucet'}, -# {'id': 78, 'name': 'Tent'}, -# {'id': 79, 'name': 'Horse'}, -# {'id': 80, 'name': 'Mirror'}, -# {'id': 81, 'name': 'Power outlet'}, -# {'id': 82, 'name': 'Sink'}, -# {'id': 83, 'name': 'Apple'}, -# {'id': 84, 'name': 'Air Conditioner'}, -# {'id': 85, 'name': 'Knife'}, -# {'id': 86, 'name': 'Hockey Stick'}, -# {'id': 87, 'name': 'Paddle'}, -# {'id': 88, 'name': 'Pickup Truck'}, -# {'id': 89, 'name': 'Fork'}, -# {'id': 90, 'name': 'Traffic Sign'}, -# {'id': 91, 'name': 'Ballon'}, -# {'id': 92, 'name': 'Tripod'}, -# {'id': 93, 'name': 'Dog'}, -# {'id': 94, 'name': 'Spoon'}, -# {'id': 95, 'name': 'Clock'}, -# {'id': 96, 'name': 'Pot'}, -# {'id': 97, 'name': 'Cow'}, -# {'id': 98, 'name': 'Cake'}, -# {'id': 99, 'name': 'Dinning Table'}, -# {'id': 100, 'name': 'Sheep'}, -# {'id': 101, 'name': 'Hanger'}, -# {'id': 102, 'name': 'Blackboard/Whiteboard'}, -# {'id': 103, 'name': 'Napkin'}, -# {'id': 104, 'name': 'Other Fish'}, -# {'id': 105, 'name': 'Orange/Tangerine'}, -# {'id': 106, 'name': 'Toiletry'}, -# {'id': 107, 'name': 'Keyboard'}, -# {'id': 108, 'name': 'Tomato'}, -# {'id': 109, 'name': 'Lantern'}, -# {'id': 110, 'name': 'Machinery Vehicle'}, -# {'id': 111, 'name': 'Fan'}, -# {'id': 112, 'name': 'Green Vegetables'}, -# {'id': 113, 'name': 'Banana'}, -# {'id': 114, 'name': 'Baseball Glove'}, -# {'id': 115, 'name': 'Airplane'}, -# {'id': 116, 'name': 'Mouse'}, -# {'id': 117, 'name': 'Train'}, -# {'id': 118, 'name': 'Pumpkin'}, -# {'id': 119, 'name': 'Soccer'}, -# {'id': 120, 'name': 'Skiboard'}, -# {'id': 121, 'name': 'Luggage'}, -# {'id': 122, 'name': 'Nightstand'}, -# {'id': 123, 'name': 'Tea pot'}, -# {'id': 124, 'name': 'Telephone'}, -# {'id': 125, 'name': 'Trolley'}, -# {'id': 126, 'name': 'Head Phone'}, -# {'id': 127, 'name': 'Sports Car'}, -# {'id': 128, 'name': 'Stop Sign'}, -# {'id': 129, 'name': 'Dessert'}, -# {'id': 130, 'name': 'Scooter'}, -# {'id': 131, 'name': 'Stroller'}, -# {'id': 132, 'name': 'Crane'}, -# {'id': 133, 'name': 'Remote'}, -# {'id': 134, 'name': 'Refrigerator'}, -# {'id': 135, 'name': 'Oven'}, -# {'id': 136, 'name': 'Lemon'}, -# {'id': 137, 'name': 'Duck'}, -# {'id': 138, 'name': 'Baseball Bat'}, -# {'id': 139, 'name': 'Surveillance Camera'}, -# {'id': 140, 'name': 'Cat'}, -# {'id': 141, 'name': 'Jug'}, -# {'id': 142, 'name': 'Broccoli'}, -# {'id': 143, 'name': 'Piano'}, -# {'id': 144, 'name': 'Pizza'}, -# {'id': 145, 'name': 'Elephant'}, -# {'id': 146, 'name': 'Skateboard'}, -# {'id': 147, 'name': 'Surfboard'}, -# {'id': 148, 'name': 'Gun'}, -# {'id': 149, 'name': 'Skating and Skiing shoes'}, -# {'id': 150, 'name': 'Gas stove'}, -# {'id': 151, 'name': 'Donut'}, -# {'id': 152, 'name': 'Bow Tie'}, -# {'id': 153, 'name': 'Carrot'}, -# {'id': 154, 'name': 'Toilet'}, -# {'id': 155, 'name': 'Kite'}, -# {'id': 156, 'name': 'Strawberry'}, -# {'id': 157, 'name': 'Other Balls'}, -# {'id': 158, 'name': 'Shovel'}, -# {'id': 159, 'name': 'Pepper'}, -# {'id': 160, 'name': 'Computer Box'}, -# {'id': 161, 'name': 'Toilet Paper'}, -# {'id': 162, 'name': 'Cleaning Products'}, -# {'id': 163, 'name': 'Chopsticks'}, -# {'id': 164, 'name': 'Microwave'}, -# {'id': 165, 'name': 'Pigeon'}, -# {'id': 166, 'name': 'Baseball'}, -# {'id': 167, 'name': 'Cutting/chopping Board'}, -# {'id': 168, 'name': 'Coffee Table'}, -# {'id': 169, 'name': 'Side Table'}, -# {'id': 170, 'name': 'Scissors'}, -# {'id': 171, 'name': 'Marker'}, -# {'id': 172, 'name': 'Pie'}, -# {'id': 173, 'name': 'Ladder'}, -# {'id': 174, 'name': 'Snowboard'}, -# {'id': 175, 'name': 'Cookies'}, -# {'id': 176, 'name': 'Radiator'}, -# {'id': 177, 'name': 'Fire Hydrant'}, -# {'id': 178, 'name': 'Basketball'}, -# {'id': 179, 'name': 'Zebra'}, -# {'id': 180, 'name': 'Grape'}, -# {'id': 181, 'name': 'Giraffe'}, -# {'id': 182, 'name': 'Potato'}, -# {'id': 183, 'name': 'Sausage'}, -# {'id': 184, 'name': 'Tricycle'}, -# {'id': 185, 'name': 'Violin'}, -# {'id': 186, 'name': 'Egg'}, -# {'id': 187, 'name': 'Fire Extinguisher'}, -# {'id': 188, 'name': 'Candy'}, -# {'id': 189, 'name': 'Fire Truck'}, -# {'id': 190, 'name': 'Billards'}, -# {'id': 191, 'name': 'Converter'}, -# {'id': 192, 'name': 'Bathtub'}, -# {'id': 193, 'name': 'Wheelchair'}, -# {'id': 194, 'name': 'Golf Club'}, -# {'id': 195, 'name': 'Briefcase'}, -# {'id': 196, 'name': 'Cucumber'}, -# {'id': 197, 'name': 'Cigar/Cigarette '}, -# {'id': 198, 'name': 'Paint Brush'}, -# {'id': 199, 'name': 'Pear'}, -# {'id': 200, 'name': 'Heavy Truck'}, -# {'id': 201, 'name': 'Hamburger'}, -# {'id': 202, 'name': 'Extractor'}, -# {'id': 203, 'name': 'Extention Cord'}, -# {'id': 204, 'name': 'Tong'}, -# {'id': 205, 'name': 'Tennis Racket'}, -# {'id': 206, 'name': 'Folder'}, -# {'id': 207, 'name': 'American Football'}, -# {'id': 208, 'name': 'earphone'}, -# {'id': 209, 'name': 'Mask'}, -# {'id': 210, 'name': 'Kettle'}, -# {'id': 211, 'name': 'Tennis'}, -# {'id': 212, 'name': 'Ship'}, -# {'id': 213, 'name': 'Swing'}, -# {'id': 214, 'name': 'Coffee Machine'}, -# {'id': 215, 'name': 'Slide'}, -# {'id': 216, 'name': 'Carriage'}, -# {'id': 217, 'name': 'Onion'}, -# {'id': 218, 'name': 'Green beans'}, -# {'id': 219, 'name': 'Projector'}, -# {'id': 220, 'name': 'Frisbee'}, -# {'id': 221, 'name': 'Washing Machine/Drying Machine'}, -# {'id': 222, 'name': 'Chicken'}, -# {'id': 223, 'name': 'Printer'}, -# {'id': 224, 'name': 'Watermelon'}, -# {'id': 225, 'name': 'Saxophone'}, -# {'id': 226, 'name': 'Tissue'}, -# {'id': 227, 'name': 'Toothbrush'}, -# {'id': 228, 'name': 'Ice cream'}, -# {'id': 229, 'name': 'Hotair ballon'}, -# {'id': 230, 'name': 'Cello'}, -# {'id': 231, 'name': 'French Fries'}, -# {'id': 232, 'name': 'Scale'}, -# {'id': 233, 'name': 'Trophy'}, -# {'id': 234, 'name': 'Cabbage'}, -# {'id': 235, 'name': 'Hot dog'}, -# {'id': 236, 'name': 'Blender'}, -# {'id': 237, 'name': 'Peach'}, -# {'id': 238, 'name': 'Rice'}, -# {'id': 239, 'name': 'Wallet/Purse'}, -# {'id': 240, 'name': 'Volleyball'}, -# {'id': 241, 'name': 'Deer'}, -# {'id': 242, 'name': 'Goose'}, -# {'id': 243, 'name': 'Tape'}, -# {'id': 244, 'name': 'Tablet'}, -# {'id': 245, 'name': 'Cosmetics'}, -# {'id': 246, 'name': 'Trumpet'}, -# {'id': 247, 'name': 'Pineapple'}, -# {'id': 248, 'name': 'Golf Ball'}, -# {'id': 249, 'name': 'Ambulance'}, -# {'id': 250, 'name': 'Parking meter'}, -# {'id': 251, 'name': 'Mango'}, -# {'id': 252, 'name': 'Key'}, -# {'id': 253, 'name': 'Hurdle'}, -# {'id': 254, 'name': 'Fishing Rod'}, -# {'id': 255, 'name': 'Medal'}, -# {'id': 256, 'name': 'Flute'}, -# {'id': 257, 'name': 'Brush'}, -# {'id': 258, 'name': 'Penguin'}, -# {'id': 259, 'name': 'Megaphone'}, -# {'id': 260, 'name': 'Corn'}, -# {'id': 261, 'name': 'Lettuce'}, -# {'id': 262, 'name': 'Garlic'}, -# {'id': 263, 'name': 'Swan'}, -# {'id': 264, 'name': 'Helicopter'}, -# {'id': 265, 'name': 'Green Onion'}, -# {'id': 266, 'name': 'Sandwich'}, -# {'id': 267, 'name': 'Nuts'}, -# {'id': 268, 'name': 'Speed Limit Sign'}, -# {'id': 269, 'name': 'Induction Cooker'}, -# {'id': 270, 'name': 'Broom'}, -# {'id': 271, 'name': 'Trombone'}, -# {'id': 272, 'name': 'Plum'}, -# {'id': 273, 'name': 'Rickshaw'}, -# {'id': 274, 'name': 'Goldfish'}, -# {'id': 275, 'name': 'Kiwi fruit'}, -# {'id': 276, 'name': 'Router/modem'}, -# {'id': 277, 'name': 'Poker Card'}, -# {'id': 278, 'name': 'Toaster'}, -# {'id': 279, 'name': 'Shrimp'}, -# {'id': 280, 'name': 'Sushi'}, -# {'id': 281, 'name': 'Cheese'}, -# {'id': 282, 'name': 'Notepaper'}, -# {'id': 283, 'name': 'Cherry'}, -# {'id': 284, 'name': 'Pliers'}, -# {'id': 285, 'name': 'CD'}, -# {'id': 286, 'name': 'Pasta'}, -# {'id': 287, 'name': 'Hammer'}, -# {'id': 288, 'name': 'Cue'}, -# {'id': 289, 'name': 'Avocado'}, -# {'id': 290, 'name': 'Hamimelon'}, -# {'id': 291, 'name': 'Flask'}, -# {'id': 292, 'name': 'Mushroon'}, -# {'id': 293, 'name': 'Screwdriver'}, -# {'id': 294, 'name': 'Soap'}, -# {'id': 295, 'name': 'Recorder'}, -# {'id': 296, 'name': 'Bear'}, -# {'id': 297, 'name': 'Eggplant'}, -# {'id': 298, 'name': 'Board Eraser'}, -# {'id': 299, 'name': 'Coconut'}, -# {'id': 300, 'name': 'Tape Measur/ Ruler'}, -# {'id': 301, 'name': 'Pig'}, -# {'id': 302, 'name': 'Showerhead'}, -# {'id': 303, 'name': 'Globe'}, -# {'id': 304, 'name': 'Chips'}, -# {'id': 305, 'name': 'Steak'}, -# {'id': 306, 'name': 'Crosswalk Sign'}, -# {'id': 307, 'name': 'Stapler'}, -# {'id': 308, 'name': 'Campel'}, -# {'id': 309, 'name': 'Formula 1 '}, -# {'id': 310, 'name': 'Pomegranate'}, -# {'id': 311, 'name': 'Dishwasher'}, -# {'id': 312, 'name': 'Crab'}, -# {'id': 313, 'name': 'Hoverboard'}, -# {'id': 314, 'name': 'Meat ball'}, -# {'id': 315, 'name': 'Rice Cooker'}, -# {'id': 316, 'name': 'Tuba'}, -# {'id': 317, 'name': 'Calculator'}, -# {'id': 318, 'name': 'Papaya'}, -# {'id': 319, 'name': 'Antelope'}, -# {'id': 320, 'name': 'Parrot'}, -# {'id': 321, 'name': 'Seal'}, -# {'id': 322, 'name': 'Buttefly'}, -# {'id': 323, 'name': 'Dumbbell'}, -# {'id': 324, 'name': 'Donkey'}, -# {'id': 325, 'name': 'Lion'}, -# {'id': 326, 'name': 'Urinal'}, -# {'id': 327, 'name': 'Dolphin'}, -# {'id': 328, 'name': 'Electric Drill'}, -# {'id': 329, 'name': 'Hair Dryer'}, -# {'id': 330, 'name': 'Egg tart'}, -# {'id': 331, 'name': 'Jellyfish'}, -# {'id': 332, 'name': 'Treadmill'}, -# {'id': 333, 'name': 'Lighter'}, -# {'id': 334, 'name': 'Grapefruit'}, -# {'id': 335, 'name': 'Game board'}, -# {'id': 336, 'name': 'Mop'}, -# {'id': 337, 'name': 'Radish'}, -# {'id': 338, 'name': 'Baozi'}, -# {'id': 339, 'name': 'Target'}, -# {'id': 340, 'name': 'French'}, -# {'id': 341, 'name': 'Spring Rolls'}, -# {'id': 342, 'name': 'Monkey'}, -# {'id': 343, 'name': 'Rabbit'}, -# {'id': 344, 'name': 'Pencil Case'}, -# {'id': 345, 'name': 'Yak'}, -# {'id': 346, 'name': 'Red Cabbage'}, -# {'id': 347, 'name': 'Binoculars'}, -# {'id': 348, 'name': 'Asparagus'}, -# {'id': 349, 'name': 'Barbell'}, -# {'id': 350, 'name': 'Scallop'}, -# {'id': 351, 'name': 'Noddles'}, -# {'id': 352, 'name': 'Comb'}, -# {'id': 353, 'name': 'Dumpling'}, -# {'id': 354, 'name': 'Oyster'}, -# {'id': 355, 'name': 'Table Teniis paddle'}, -# {'id': 356, 'name': 'Cosmetics Brush/Eyeliner Pencil'}, -# {'id': 357, 'name': 'Chainsaw'}, -# {'id': 358, 'name': 'Eraser'}, -# {'id': 359, 'name': 'Lobster'}, -# {'id': 360, 'name': 'Durian'}, -# {'id': 361, 'name': 'Okra'}, -# {'id': 362, 'name': 'Lipstick'}, -# {'id': 363, 'name': 'Cosmetics Mirror'}, -# {'id': 364, 'name': 'Curling'}, -# {'id': 365, 'name': 'Table Tennis '}, -# ] - -""" -The official Objects365 category names contains typos. -Below is a manual fix. -""" -categories_v2_fix = [ - {"id": 1, "name": "Person"}, - {"id": 2, "name": "Sneakers"}, - {"id": 3, "name": "Chair"}, - {"id": 4, "name": "Other Shoes"}, - {"id": 5, "name": "Hat"}, - {"id": 6, "name": "Car"}, - {"id": 7, "name": "Lamp"}, - {"id": 8, "name": "Glasses"}, - {"id": 9, "name": "Bottle"}, - {"id": 10, "name": "Desk"}, - {"id": 11, "name": "Cup"}, - {"id": 12, "name": "Street Lights"}, - {"id": 13, "name": "Cabinet/shelf"}, - {"id": 14, "name": "Handbag/Satchel"}, - {"id": 15, "name": "Bracelet"}, - {"id": 16, "name": "Plate"}, - {"id": 17, "name": "Picture/Frame"}, - {"id": 18, "name": "Helmet"}, - {"id": 19, "name": "Book"}, - {"id": 20, "name": "Gloves"}, - {"id": 21, "name": "Storage box"}, - {"id": 22, "name": "Boat"}, - {"id": 23, "name": "Leather Shoes"}, - {"id": 24, "name": "Flower"}, - {"id": 25, "name": "Bench"}, - {"id": 26, "name": "Potted Plant"}, - {"id": 27, "name": "Bowl/Basin"}, - {"id": 28, "name": "Flag"}, - {"id": 29, "name": "Pillow"}, - {"id": 30, "name": "Boots"}, - {"id": 31, "name": "Vase"}, - {"id": 32, "name": "Microphone"}, - {"id": 33, "name": "Necklace"}, - {"id": 34, "name": "Ring"}, - {"id": 35, "name": "SUV"}, - {"id": 36, "name": "Wine Glass"}, - {"id": 37, "name": "Belt"}, - {"id": 38, "name": "Monitor/TV"}, - {"id": 39, "name": "Backpack"}, - {"id": 40, "name": "Umbrella"}, - {"id": 41, "name": "Traffic Light"}, - {"id": 42, "name": "Speaker"}, - {"id": 43, "name": "Watch"}, - {"id": 44, "name": "Tie"}, - {"id": 45, "name": "Trash bin Can"}, - {"id": 46, "name": "Slippers"}, - {"id": 47, "name": "Bicycle"}, - {"id": 48, "name": "Stool"}, - {"id": 49, "name": "Barrel/bucket"}, - {"id": 50, "name": "Van"}, - {"id": 51, "name": "Couch"}, - {"id": 52, "name": "Sandals"}, - {"id": 53, "name": "Basket"}, - {"id": 54, "name": "Drum"}, - {"id": 55, "name": "Pen/Pencil"}, - {"id": 56, "name": "Bus"}, - {"id": 57, "name": "Wild Bird"}, - {"id": 58, "name": "High Heels"}, - {"id": 59, "name": "Motorcycle"}, - {"id": 60, "name": "Guitar"}, - {"id": 61, "name": "Carpet"}, - {"id": 62, "name": "Cell Phone"}, - {"id": 63, "name": "Bread"}, - {"id": 64, "name": "Camera"}, - {"id": 65, "name": "Canned"}, - {"id": 66, "name": "Truck"}, - {"id": 67, "name": "Traffic cone"}, - {"id": 68, "name": "Cymbal"}, - {"id": 69, "name": "Lifesaver"}, - {"id": 70, "name": "Towel"}, - {"id": 71, "name": "Stuffed Toy"}, - {"id": 72, "name": "Candle"}, - {"id": 73, "name": "Sailboat"}, - {"id": 74, "name": "Laptop"}, - {"id": 75, "name": "Awning"}, - {"id": 76, "name": "Bed"}, - {"id": 77, "name": "Faucet"}, - {"id": 78, "name": "Tent"}, - {"id": 79, "name": "Horse"}, - {"id": 80, "name": "Mirror"}, - {"id": 81, "name": "Power outlet"}, - {"id": 82, "name": "Sink"}, - {"id": 83, "name": "Apple"}, - {"id": 84, "name": "Air Conditioner"}, - {"id": 85, "name": "Knife"}, - {"id": 86, "name": "Hockey Stick"}, - {"id": 87, "name": "Paddle"}, - {"id": 88, "name": "Pickup Truck"}, - {"id": 89, "name": "Fork"}, - {"id": 90, "name": "Traffic Sign"}, - {"id": 91, "name": "Ballon"}, - {"id": 92, "name": "Tripod"}, - {"id": 93, "name": "Dog"}, - {"id": 94, "name": "Spoon"}, - {"id": 95, "name": "Clock"}, - {"id": 96, "name": "Pot"}, - {"id": 97, "name": "Cow"}, - {"id": 98, "name": "Cake"}, - {"id": 99, "name": "Dining Table"}, - {"id": 100, "name": "Sheep"}, - {"id": 101, "name": "Hanger"}, - {"id": 102, "name": "Blackboard/Whiteboard"}, - {"id": 103, "name": "Napkin"}, - {"id": 104, "name": "Other Fish"}, - {"id": 105, "name": "Orange/Tangerine"}, - {"id": 106, "name": "Toiletry"}, - {"id": 107, "name": "Keyboard"}, - {"id": 108, "name": "Tomato"}, - {"id": 109, "name": "Lantern"}, - {"id": 110, "name": "Machinery Vehicle"}, - {"id": 111, "name": "Fan"}, - {"id": 112, "name": "Green Vegetables"}, - {"id": 113, "name": "Banana"}, - {"id": 114, "name": "Baseball Glove"}, - {"id": 115, "name": "Airplane"}, - {"id": 116, "name": "Mouse"}, - {"id": 117, "name": "Train"}, - {"id": 118, "name": "Pumpkin"}, - {"id": 119, "name": "Soccer"}, - {"id": 120, "name": "Skiboard"}, - {"id": 121, "name": "Luggage"}, - {"id": 122, "name": "Nightstand"}, - {"id": 123, "name": "Teapot"}, - {"id": 124, "name": "Telephone"}, - {"id": 125, "name": "Trolley"}, - {"id": 126, "name": "Head Phone"}, - {"id": 127, "name": "Sports Car"}, - {"id": 128, "name": "Stop Sign"}, - {"id": 129, "name": "Dessert"}, - {"id": 130, "name": "Scooter"}, - {"id": 131, "name": "Stroller"}, - {"id": 132, "name": "Crane"}, - {"id": 133, "name": "Remote"}, - {"id": 134, "name": "Refrigerator"}, - {"id": 135, "name": "Oven"}, - {"id": 136, "name": "Lemon"}, - {"id": 137, "name": "Duck"}, - {"id": 138, "name": "Baseball Bat"}, - {"id": 139, "name": "Surveillance Camera"}, - {"id": 140, "name": "Cat"}, - {"id": 141, "name": "Jug"}, - {"id": 142, "name": "Broccoli"}, - {"id": 143, "name": "Piano"}, - {"id": 144, "name": "Pizza"}, - {"id": 145, "name": "Elephant"}, - {"id": 146, "name": "Skateboard"}, - {"id": 147, "name": "Surfboard"}, - {"id": 148, "name": "Gun"}, - {"id": 149, "name": "Skating and Skiing shoes"}, - {"id": 150, "name": "Gas stove"}, - {"id": 151, "name": "Donut"}, - {"id": 152, "name": "Bow Tie"}, - {"id": 153, "name": "Carrot"}, - {"id": 154, "name": "Toilet"}, - {"id": 155, "name": "Kite"}, - {"id": 156, "name": "Strawberry"}, - {"id": 157, "name": "Other Balls"}, - {"id": 158, "name": "Shovel"}, - {"id": 159, "name": "Pepper"}, - {"id": 160, "name": "Computer Box"}, - {"id": 161, "name": "Toilet Paper"}, - {"id": 162, "name": "Cleaning Products"}, - {"id": 163, "name": "Chopsticks"}, - {"id": 164, "name": "Microwave"}, - {"id": 165, "name": "Pigeon"}, - {"id": 166, "name": "Baseball"}, - {"id": 167, "name": "Cutting/chopping Board"}, - {"id": 168, "name": "Coffee Table"}, - {"id": 169, "name": "Side Table"}, - {"id": 170, "name": "Scissors"}, - {"id": 171, "name": "Marker"}, - {"id": 172, "name": "Pie"}, - {"id": 173, "name": "Ladder"}, - {"id": 174, "name": "Snowboard"}, - {"id": 175, "name": "Cookies"}, - {"id": 176, "name": "Radiator"}, - {"id": 177, "name": "Fire Hydrant"}, - {"id": 178, "name": "Basketball"}, - {"id": 179, "name": "Zebra"}, - {"id": 180, "name": "Grape"}, - {"id": 181, "name": "Giraffe"}, - {"id": 182, "name": "Potato"}, - {"id": 183, "name": "Sausage"}, - {"id": 184, "name": "Tricycle"}, - {"id": 185, "name": "Violin"}, - {"id": 186, "name": "Egg"}, - {"id": 187, "name": "Fire Extinguisher"}, - {"id": 188, "name": "Candy"}, - {"id": 189, "name": "Fire Truck"}, - {"id": 190, "name": "Billards"}, - {"id": 191, "name": "Converter"}, - {"id": 192, "name": "Bathtub"}, - {"id": 193, "name": "Wheelchair"}, - {"id": 194, "name": "Golf Club"}, - {"id": 195, "name": "Briefcase"}, - {"id": 196, "name": "Cucumber"}, - {"id": 197, "name": "Cigar/Cigarette "}, - {"id": 198, "name": "Paint Brush"}, - {"id": 199, "name": "Pear"}, - {"id": 200, "name": "Heavy Truck"}, - {"id": 201, "name": "Hamburger"}, - {"id": 202, "name": "Extractor"}, - {"id": 203, "name": "Extension Cord"}, - {"id": 204, "name": "Tong"}, - {"id": 205, "name": "Tennis Racket"}, - {"id": 206, "name": "Folder"}, - {"id": 207, "name": "American Football"}, - {"id": 208, "name": "earphone"}, - {"id": 209, "name": "Mask"}, - {"id": 210, "name": "Kettle"}, - {"id": 211, "name": "Tennis"}, - {"id": 212, "name": "Ship"}, - {"id": 213, "name": "Swing"}, - {"id": 214, "name": "Coffee Machine"}, - {"id": 215, "name": "Slide"}, - {"id": 216, "name": "Carriage"}, - {"id": 217, "name": "Onion"}, - {"id": 218, "name": "Green beans"}, - {"id": 219, "name": "Projector"}, - {"id": 220, "name": "Frisbee"}, - {"id": 221, "name": "Washing Machine/Drying Machine"}, - {"id": 222, "name": "Chicken"}, - {"id": 223, "name": "Printer"}, - {"id": 224, "name": "Watermelon"}, - {"id": 225, "name": "Saxophone"}, - {"id": 226, "name": "Tissue"}, - {"id": 227, "name": "Toothbrush"}, - {"id": 228, "name": "Ice cream"}, - {"id": 229, "name": "Hot air balloon"}, - {"id": 230, "name": "Cello"}, - {"id": 231, "name": "French Fries"}, - {"id": 232, "name": "Scale"}, - {"id": 233, "name": "Trophy"}, - {"id": 234, "name": "Cabbage"}, - {"id": 235, "name": "Hot dog"}, - {"id": 236, "name": "Blender"}, - {"id": 237, "name": "Peach"}, - {"id": 238, "name": "Rice"}, - {"id": 239, "name": "Wallet/Purse"}, - {"id": 240, "name": "Volleyball"}, - {"id": 241, "name": "Deer"}, - {"id": 242, "name": "Goose"}, - {"id": 243, "name": "Tape"}, - {"id": 244, "name": "Tablet"}, - {"id": 245, "name": "Cosmetics"}, - {"id": 246, "name": "Trumpet"}, - {"id": 247, "name": "Pineapple"}, - {"id": 248, "name": "Golf Ball"}, - {"id": 249, "name": "Ambulance"}, - {"id": 250, "name": "Parking meter"}, - {"id": 251, "name": "Mango"}, - {"id": 252, "name": "Key"}, - {"id": 253, "name": "Hurdle"}, - {"id": 254, "name": "Fishing Rod"}, - {"id": 255, "name": "Medal"}, - {"id": 256, "name": "Flute"}, - {"id": 257, "name": "Brush"}, - {"id": 258, "name": "Penguin"}, - {"id": 259, "name": "Megaphone"}, - {"id": 260, "name": "Corn"}, - {"id": 261, "name": "Lettuce"}, - {"id": 262, "name": "Garlic"}, - {"id": 263, "name": "Swan"}, - {"id": 264, "name": "Helicopter"}, - {"id": 265, "name": "Green Onion"}, - {"id": 266, "name": "Sandwich"}, - {"id": 267, "name": "Nuts"}, - {"id": 268, "name": "Speed Limit Sign"}, - {"id": 269, "name": "Induction Cooker"}, - {"id": 270, "name": "Broom"}, - {"id": 271, "name": "Trombone"}, - {"id": 272, "name": "Plum"}, - {"id": 273, "name": "Rickshaw"}, - {"id": 274, "name": "Goldfish"}, - {"id": 275, "name": "Kiwi fruit"}, - {"id": 276, "name": "Router/modem"}, - {"id": 277, "name": "Poker Card"}, - {"id": 278, "name": "Toaster"}, - {"id": 279, "name": "Shrimp"}, - {"id": 280, "name": "Sushi"}, - {"id": 281, "name": "Cheese"}, - {"id": 282, "name": "Notepaper"}, - {"id": 283, "name": "Cherry"}, - {"id": 284, "name": "Pliers"}, - {"id": 285, "name": "CD"}, - {"id": 286, "name": "Pasta"}, - {"id": 287, "name": "Hammer"}, - {"id": 288, "name": "Cue"}, - {"id": 289, "name": "Avocado"}, - {"id": 290, "name": "Hami melon"}, - {"id": 291, "name": "Flask"}, - {"id": 292, "name": "Mushroom"}, - {"id": 293, "name": "Screwdriver"}, - {"id": 294, "name": "Soap"}, - {"id": 295, "name": "Recorder"}, - {"id": 296, "name": "Bear"}, - {"id": 297, "name": "Eggplant"}, - {"id": 298, "name": "Board Eraser"}, - {"id": 299, "name": "Coconut"}, - {"id": 300, "name": "Tape Measure/ Ruler"}, - {"id": 301, "name": "Pig"}, - {"id": 302, "name": "Showerhead"}, - {"id": 303, "name": "Globe"}, - {"id": 304, "name": "Chips"}, - {"id": 305, "name": "Steak"}, - {"id": 306, "name": "Crosswalk Sign"}, - {"id": 307, "name": "Stapler"}, - {"id": 308, "name": "Camel"}, - {"id": 309, "name": "Formula 1 "}, - {"id": 310, "name": "Pomegranate"}, - {"id": 311, "name": "Dishwasher"}, - {"id": 312, "name": "Crab"}, - {"id": 313, "name": "Hoverboard"}, - {"id": 314, "name": "Meatball"}, - {"id": 315, "name": "Rice Cooker"}, - {"id": 316, "name": "Tuba"}, - {"id": 317, "name": "Calculator"}, - {"id": 318, "name": "Papaya"}, - {"id": 319, "name": "Antelope"}, - {"id": 320, "name": "Parrot"}, - {"id": 321, "name": "Seal"}, - {"id": 322, "name": "Butterfly"}, - {"id": 323, "name": "Dumbbell"}, - {"id": 324, "name": "Donkey"}, - {"id": 325, "name": "Lion"}, - {"id": 326, "name": "Urinal"}, - {"id": 327, "name": "Dolphin"}, - {"id": 328, "name": "Electric Drill"}, - {"id": 329, "name": "Hair Dryer"}, - {"id": 330, "name": "Egg tart"}, - {"id": 331, "name": "Jellyfish"}, - {"id": 332, "name": "Treadmill"}, - {"id": 333, "name": "Lighter"}, - {"id": 334, "name": "Grapefruit"}, - {"id": 335, "name": "Game board"}, - {"id": 336, "name": "Mop"}, - {"id": 337, "name": "Radish"}, - {"id": 338, "name": "Baozi"}, - {"id": 339, "name": "Target"}, - {"id": 340, "name": "French"}, - {"id": 341, "name": "Spring Rolls"}, - {"id": 342, "name": "Monkey"}, - {"id": 343, "name": "Rabbit"}, - {"id": 344, "name": "Pencil Case"}, - {"id": 345, "name": "Yak"}, - {"id": 346, "name": "Red Cabbage"}, - {"id": 347, "name": "Binoculars"}, - {"id": 348, "name": "Asparagus"}, - {"id": 349, "name": "Barbell"}, - {"id": 350, "name": "Scallop"}, - {"id": 351, "name": "Noddles"}, - {"id": 352, "name": "Comb"}, - {"id": 353, "name": "Dumpling"}, - {"id": 354, "name": "Oyster"}, - {"id": 355, "name": "Table Tennis paddle"}, - {"id": 356, "name": "Cosmetics Brush/Eyeliner Pencil"}, - {"id": 357, "name": "Chainsaw"}, - {"id": 358, "name": "Eraser"}, - {"id": 359, "name": "Lobster"}, - {"id": 360, "name": "Durian"}, - {"id": 361, "name": "Okra"}, - {"id": 362, "name": "Lipstick"}, - {"id": 363, "name": "Cosmetics Mirror"}, - {"id": 364, "name": "Curling"}, - {"id": 365, "name": "Table Tennis "}, -] - - -def _get_builtin_metadata(): - id_to_name = {x["id"]: x["name"] for x in categories_v2_fix} - thing_dataset_id_to_contiguous_id = { - x["id"]: i for i, x in enumerate(sorted(categories_v2_fix, key=lambda x: x["id"])) - } - thing_classes = [id_to_name[k] for k in sorted(id_to_name)] - return { - "thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id, - "thing_classes": thing_classes, - } - - -_PREDEFINED_SPLITS_OBJECTS365 = { - "objects365_v2_train": ( - "objects365/train", - "objects365/annotations/zhiyuan_objv2_train_fixname_fixmiss.json", - ), - # 80,000 images, 1,240,587 annotations - "objects365_v2_val": ( - "objects365/val", - "objects365/annotations/zhiyuan_objv2_val_fixname.json", - ), - "objects365_v2_val_rare": ( - "objects365/val", - "objects365/annotations/zhiyuan_objv2_val_fixname_rare.json", - ), -} - -for key, (image_root, json_file) in _PREDEFINED_SPLITS_OBJECTS365.items(): - register_coco_instances( - key, - _get_builtin_metadata(), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/detic/data/datasets/oid.py b/dimos/models/Detic/detic/data/datasets/oid.py deleted file mode 100644 index 0308a8da1d..0000000000 --- a/dimos/models/Detic/detic/data/datasets/oid.py +++ /dev/null @@ -1,544 +0,0 @@ -# Part of the code is from https://github.com/xingyizhou/UniDet/blob/master/projects/UniDet/unidet/data/datasets/oid.py -# Copyright (c) Facebook, Inc. and its affiliates. -import os - -from .register_oid import register_oid_instances - -categories = [ - {"id": 1, "name": "Infant bed", "freebase_id": "/m/061hd_"}, - {"id": 2, "name": "Rose", "freebase_id": "/m/06m11"}, - {"id": 3, "name": "Flag", "freebase_id": "/m/03120"}, - {"id": 4, "name": "Flashlight", "freebase_id": "/m/01kb5b"}, - {"id": 5, "name": "Sea turtle", "freebase_id": "/m/0120dh"}, - {"id": 6, "name": "Camera", "freebase_id": "/m/0dv5r"}, - {"id": 7, "name": "Animal", "freebase_id": "/m/0jbk"}, - {"id": 8, "name": "Glove", "freebase_id": "/m/0174n1"}, - {"id": 9, "name": "Crocodile", "freebase_id": "/m/09f_2"}, - {"id": 10, "name": "Cattle", "freebase_id": "/m/01xq0k1"}, - {"id": 11, "name": "House", "freebase_id": "/m/03jm5"}, - {"id": 12, "name": "Guacamole", "freebase_id": "/m/02g30s"}, - {"id": 13, "name": "Penguin", "freebase_id": "/m/05z6w"}, - {"id": 14, "name": "Vehicle registration plate", "freebase_id": "/m/01jfm_"}, - {"id": 15, "name": "Bench", "freebase_id": "/m/076lb9"}, - {"id": 16, "name": "Ladybug", "freebase_id": "/m/0gj37"}, - {"id": 17, "name": "Human nose", "freebase_id": "/m/0k0pj"}, - {"id": 18, "name": "Watermelon", "freebase_id": "/m/0kpqd"}, - {"id": 19, "name": "Flute", "freebase_id": "/m/0l14j_"}, - {"id": 20, "name": "Butterfly", "freebase_id": "/m/0cyf8"}, - {"id": 21, "name": "Washing machine", "freebase_id": "/m/0174k2"}, - {"id": 22, "name": "Raccoon", "freebase_id": "/m/0dq75"}, - {"id": 23, "name": "Segway", "freebase_id": "/m/076bq"}, - {"id": 24, "name": "Taco", "freebase_id": "/m/07crc"}, - {"id": 25, "name": "Jellyfish", "freebase_id": "/m/0d8zb"}, - {"id": 26, "name": "Cake", "freebase_id": "/m/0fszt"}, - {"id": 27, "name": "Pen", "freebase_id": "/m/0k1tl"}, - {"id": 28, "name": "Cannon", "freebase_id": "/m/020kz"}, - {"id": 29, "name": "Bread", "freebase_id": "/m/09728"}, - {"id": 30, "name": "Tree", "freebase_id": "/m/07j7r"}, - {"id": 31, "name": "Shellfish", "freebase_id": "/m/0fbdv"}, - {"id": 32, "name": "Bed", "freebase_id": "/m/03ssj5"}, - {"id": 33, "name": "Hamster", "freebase_id": "/m/03qrc"}, - {"id": 34, "name": "Hat", "freebase_id": "/m/02dl1y"}, - {"id": 35, "name": "Toaster", "freebase_id": "/m/01k6s3"}, - {"id": 36, "name": "Sombrero", "freebase_id": "/m/02jfl0"}, - {"id": 37, "name": "Tiara", "freebase_id": "/m/01krhy"}, - {"id": 38, "name": "Bowl", "freebase_id": "/m/04kkgm"}, - {"id": 39, "name": "Dragonfly", "freebase_id": "/m/0ft9s"}, - {"id": 40, "name": "Moths and butterflies", "freebase_id": "/m/0d_2m"}, - {"id": 41, "name": "Antelope", "freebase_id": "/m/0czz2"}, - {"id": 42, "name": "Vegetable", "freebase_id": "/m/0f4s2w"}, - {"id": 43, "name": "Torch", "freebase_id": "/m/07dd4"}, - {"id": 44, "name": "Building", "freebase_id": "/m/0cgh4"}, - {"id": 45, "name": "Power plugs and sockets", "freebase_id": "/m/03bbps"}, - {"id": 46, "name": "Blender", "freebase_id": "/m/02pjr4"}, - {"id": 47, "name": "Billiard table", "freebase_id": "/m/04p0qw"}, - {"id": 48, "name": "Cutting board", "freebase_id": "/m/02pdsw"}, - {"id": 49, "name": "Bronze sculpture", "freebase_id": "/m/01yx86"}, - {"id": 50, "name": "Turtle", "freebase_id": "/m/09dzg"}, - {"id": 51, "name": "Broccoli", "freebase_id": "/m/0hkxq"}, - {"id": 52, "name": "Tiger", "freebase_id": "/m/07dm6"}, - {"id": 53, "name": "Mirror", "freebase_id": "/m/054_l"}, - {"id": 54, "name": "Bear", "freebase_id": "/m/01dws"}, - {"id": 55, "name": "Zucchini", "freebase_id": "/m/027pcv"}, - {"id": 56, "name": "Dress", "freebase_id": "/m/01d40f"}, - {"id": 57, "name": "Volleyball", "freebase_id": "/m/02rgn06"}, - {"id": 58, "name": "Guitar", "freebase_id": "/m/0342h"}, - {"id": 59, "name": "Reptile", "freebase_id": "/m/06bt6"}, - {"id": 60, "name": "Golf cart", "freebase_id": "/m/0323sq"}, - {"id": 61, "name": "Tart", "freebase_id": "/m/02zvsm"}, - {"id": 62, "name": "Fedora", "freebase_id": "/m/02fq_6"}, - {"id": 63, "name": "Carnivore", "freebase_id": "/m/01lrl"}, - {"id": 64, "name": "Car", "freebase_id": "/m/0k4j"}, - {"id": 65, "name": "Lighthouse", "freebase_id": "/m/04h7h"}, - {"id": 66, "name": "Coffeemaker", "freebase_id": "/m/07xyvk"}, - {"id": 67, "name": "Food processor", "freebase_id": "/m/03y6mg"}, - {"id": 68, "name": "Truck", "freebase_id": "/m/07r04"}, - {"id": 69, "name": "Bookcase", "freebase_id": "/m/03__z0"}, - {"id": 70, "name": "Surfboard", "freebase_id": "/m/019w40"}, - {"id": 71, "name": "Footwear", "freebase_id": "/m/09j5n"}, - {"id": 72, "name": "Bench", "freebase_id": "/m/0cvnqh"}, - {"id": 73, "name": "Necklace", "freebase_id": "/m/01llwg"}, - {"id": 74, "name": "Flower", "freebase_id": "/m/0c9ph5"}, - {"id": 75, "name": "Radish", "freebase_id": "/m/015x5n"}, - {"id": 76, "name": "Marine mammal", "freebase_id": "/m/0gd2v"}, - {"id": 77, "name": "Frying pan", "freebase_id": "/m/04v6l4"}, - {"id": 78, "name": "Tap", "freebase_id": "/m/02jz0l"}, - {"id": 79, "name": "Peach", "freebase_id": "/m/0dj6p"}, - {"id": 80, "name": "Knife", "freebase_id": "/m/04ctx"}, - {"id": 81, "name": "Handbag", "freebase_id": "/m/080hkjn"}, - {"id": 82, "name": "Laptop", "freebase_id": "/m/01c648"}, - {"id": 83, "name": "Tent", "freebase_id": "/m/01j61q"}, - {"id": 84, "name": "Ambulance", "freebase_id": "/m/012n7d"}, - {"id": 85, "name": "Christmas tree", "freebase_id": "/m/025nd"}, - {"id": 86, "name": "Eagle", "freebase_id": "/m/09csl"}, - {"id": 87, "name": "Limousine", "freebase_id": "/m/01lcw4"}, - {"id": 88, "name": "Kitchen & dining room table", "freebase_id": "/m/0h8n5zk"}, - {"id": 89, "name": "Polar bear", "freebase_id": "/m/0633h"}, - {"id": 90, "name": "Tower", "freebase_id": "/m/01fdzj"}, - {"id": 91, "name": "Football", "freebase_id": "/m/01226z"}, - {"id": 92, "name": "Willow", "freebase_id": "/m/0mw_6"}, - {"id": 93, "name": "Human head", "freebase_id": "/m/04hgtk"}, - {"id": 94, "name": "Stop sign", "freebase_id": "/m/02pv19"}, - {"id": 95, "name": "Banana", "freebase_id": "/m/09qck"}, - {"id": 96, "name": "Mixer", "freebase_id": "/m/063rgb"}, - {"id": 97, "name": "Binoculars", "freebase_id": "/m/0lt4_"}, - {"id": 98, "name": "Dessert", "freebase_id": "/m/0270h"}, - {"id": 99, "name": "Bee", "freebase_id": "/m/01h3n"}, - {"id": 100, "name": "Chair", "freebase_id": "/m/01mzpv"}, - {"id": 101, "name": "Wood-burning stove", "freebase_id": "/m/04169hn"}, - {"id": 102, "name": "Flowerpot", "freebase_id": "/m/0fm3zh"}, - {"id": 103, "name": "Beaker", "freebase_id": "/m/0d20w4"}, - {"id": 104, "name": "Oyster", "freebase_id": "/m/0_cp5"}, - {"id": 105, "name": "Woodpecker", "freebase_id": "/m/01dy8n"}, - {"id": 106, "name": "Harp", "freebase_id": "/m/03m5k"}, - {"id": 107, "name": "Bathtub", "freebase_id": "/m/03dnzn"}, - {"id": 108, "name": "Wall clock", "freebase_id": "/m/0h8mzrc"}, - {"id": 109, "name": "Sports uniform", "freebase_id": "/m/0h8mhzd"}, - {"id": 110, "name": "Rhinoceros", "freebase_id": "/m/03d443"}, - {"id": 111, "name": "Beehive", "freebase_id": "/m/01gllr"}, - {"id": 112, "name": "Cupboard", "freebase_id": "/m/0642b4"}, - {"id": 113, "name": "Chicken", "freebase_id": "/m/09b5t"}, - {"id": 114, "name": "Man", "freebase_id": "/m/04yx4"}, - {"id": 115, "name": "Blue jay", "freebase_id": "/m/01f8m5"}, - {"id": 116, "name": "Cucumber", "freebase_id": "/m/015x4r"}, - {"id": 117, "name": "Balloon", "freebase_id": "/m/01j51"}, - {"id": 118, "name": "Kite", "freebase_id": "/m/02zt3"}, - {"id": 119, "name": "Fireplace", "freebase_id": "/m/03tw93"}, - {"id": 120, "name": "Lantern", "freebase_id": "/m/01jfsr"}, - {"id": 121, "name": "Missile", "freebase_id": "/m/04ylt"}, - {"id": 122, "name": "Book", "freebase_id": "/m/0bt_c3"}, - {"id": 123, "name": "Spoon", "freebase_id": "/m/0cmx8"}, - {"id": 124, "name": "Grapefruit", "freebase_id": "/m/0hqkz"}, - {"id": 125, "name": "Squirrel", "freebase_id": "/m/071qp"}, - {"id": 126, "name": "Orange", "freebase_id": "/m/0cyhj_"}, - {"id": 127, "name": "Coat", "freebase_id": "/m/01xygc"}, - {"id": 128, "name": "Punching bag", "freebase_id": "/m/0420v5"}, - {"id": 129, "name": "Zebra", "freebase_id": "/m/0898b"}, - {"id": 130, "name": "Billboard", "freebase_id": "/m/01knjb"}, - {"id": 131, "name": "Bicycle", "freebase_id": "/m/0199g"}, - {"id": 132, "name": "Door handle", "freebase_id": "/m/03c7gz"}, - {"id": 133, "name": "Mechanical fan", "freebase_id": "/m/02x984l"}, - {"id": 134, "name": "Ring binder", "freebase_id": "/m/04zwwv"}, - {"id": 135, "name": "Table", "freebase_id": "/m/04bcr3"}, - {"id": 136, "name": "Parrot", "freebase_id": "/m/0gv1x"}, - {"id": 137, "name": "Sock", "freebase_id": "/m/01nq26"}, - {"id": 138, "name": "Vase", "freebase_id": "/m/02s195"}, - {"id": 139, "name": "Weapon", "freebase_id": "/m/083kb"}, - {"id": 140, "name": "Shotgun", "freebase_id": "/m/06nrc"}, - {"id": 141, "name": "Glasses", "freebase_id": "/m/0jyfg"}, - {"id": 142, "name": "Seahorse", "freebase_id": "/m/0nybt"}, - {"id": 143, "name": "Belt", "freebase_id": "/m/0176mf"}, - {"id": 144, "name": "Watercraft", "freebase_id": "/m/01rzcn"}, - {"id": 145, "name": "Window", "freebase_id": "/m/0d4v4"}, - {"id": 146, "name": "Giraffe", "freebase_id": "/m/03bk1"}, - {"id": 147, "name": "Lion", "freebase_id": "/m/096mb"}, - {"id": 148, "name": "Tire", "freebase_id": "/m/0h9mv"}, - {"id": 149, "name": "Vehicle", "freebase_id": "/m/07yv9"}, - {"id": 150, "name": "Canoe", "freebase_id": "/m/0ph39"}, - {"id": 151, "name": "Tie", "freebase_id": "/m/01rkbr"}, - {"id": 152, "name": "Shelf", "freebase_id": "/m/0gjbg72"}, - {"id": 153, "name": "Picture frame", "freebase_id": "/m/06z37_"}, - {"id": 154, "name": "Printer", "freebase_id": "/m/01m4t"}, - {"id": 155, "name": "Human leg", "freebase_id": "/m/035r7c"}, - {"id": 156, "name": "Boat", "freebase_id": "/m/019jd"}, - {"id": 157, "name": "Slow cooker", "freebase_id": "/m/02tsc9"}, - {"id": 158, "name": "Croissant", "freebase_id": "/m/015wgc"}, - {"id": 159, "name": "Candle", "freebase_id": "/m/0c06p"}, - {"id": 160, "name": "Pancake", "freebase_id": "/m/01dwwc"}, - {"id": 161, "name": "Pillow", "freebase_id": "/m/034c16"}, - {"id": 162, "name": "Coin", "freebase_id": "/m/0242l"}, - {"id": 163, "name": "Stretcher", "freebase_id": "/m/02lbcq"}, - {"id": 164, "name": "Sandal", "freebase_id": "/m/03nfch"}, - {"id": 165, "name": "Woman", "freebase_id": "/m/03bt1vf"}, - {"id": 166, "name": "Stairs", "freebase_id": "/m/01lynh"}, - {"id": 167, "name": "Harpsichord", "freebase_id": "/m/03q5t"}, - {"id": 168, "name": "Stool", "freebase_id": "/m/0fqt361"}, - {"id": 169, "name": "Bus", "freebase_id": "/m/01bjv"}, - {"id": 170, "name": "Suitcase", "freebase_id": "/m/01s55n"}, - {"id": 171, "name": "Human mouth", "freebase_id": "/m/0283dt1"}, - {"id": 172, "name": "Juice", "freebase_id": "/m/01z1kdw"}, - {"id": 173, "name": "Skull", "freebase_id": "/m/016m2d"}, - {"id": 174, "name": "Door", "freebase_id": "/m/02dgv"}, - {"id": 175, "name": "Violin", "freebase_id": "/m/07y_7"}, - {"id": 176, "name": "Chopsticks", "freebase_id": "/m/01_5g"}, - {"id": 177, "name": "Digital clock", "freebase_id": "/m/06_72j"}, - {"id": 178, "name": "Sunflower", "freebase_id": "/m/0ftb8"}, - {"id": 179, "name": "Leopard", "freebase_id": "/m/0c29q"}, - {"id": 180, "name": "Bell pepper", "freebase_id": "/m/0jg57"}, - {"id": 181, "name": "Harbor seal", "freebase_id": "/m/02l8p9"}, - {"id": 182, "name": "Snake", "freebase_id": "/m/078jl"}, - {"id": 183, "name": "Sewing machine", "freebase_id": "/m/0llzx"}, - {"id": 184, "name": "Goose", "freebase_id": "/m/0dbvp"}, - {"id": 185, "name": "Helicopter", "freebase_id": "/m/09ct_"}, - {"id": 186, "name": "Seat belt", "freebase_id": "/m/0dkzw"}, - {"id": 187, "name": "Coffee cup", "freebase_id": "/m/02p5f1q"}, - {"id": 188, "name": "Microwave oven", "freebase_id": "/m/0fx9l"}, - {"id": 189, "name": "Hot dog", "freebase_id": "/m/01b9xk"}, - {"id": 190, "name": "Countertop", "freebase_id": "/m/0b3fp9"}, - {"id": 191, "name": "Serving tray", "freebase_id": "/m/0h8n27j"}, - {"id": 192, "name": "Dog bed", "freebase_id": "/m/0h8n6f9"}, - {"id": 193, "name": "Beer", "freebase_id": "/m/01599"}, - {"id": 194, "name": "Sunglasses", "freebase_id": "/m/017ftj"}, - {"id": 195, "name": "Golf ball", "freebase_id": "/m/044r5d"}, - {"id": 196, "name": "Waffle", "freebase_id": "/m/01dwsz"}, - {"id": 197, "name": "Palm tree", "freebase_id": "/m/0cdl1"}, - {"id": 198, "name": "Trumpet", "freebase_id": "/m/07gql"}, - {"id": 199, "name": "Ruler", "freebase_id": "/m/0hdln"}, - {"id": 200, "name": "Helmet", "freebase_id": "/m/0zvk5"}, - {"id": 201, "name": "Ladder", "freebase_id": "/m/012w5l"}, - {"id": 202, "name": "Office building", "freebase_id": "/m/021sj1"}, - {"id": 203, "name": "Tablet computer", "freebase_id": "/m/0bh9flk"}, - {"id": 204, "name": "Toilet paper", "freebase_id": "/m/09gtd"}, - {"id": 205, "name": "Pomegranate", "freebase_id": "/m/0jwn_"}, - {"id": 206, "name": "Skirt", "freebase_id": "/m/02wv6h6"}, - {"id": 207, "name": "Gas stove", "freebase_id": "/m/02wv84t"}, - {"id": 208, "name": "Cookie", "freebase_id": "/m/021mn"}, - {"id": 209, "name": "Cart", "freebase_id": "/m/018p4k"}, - {"id": 210, "name": "Raven", "freebase_id": "/m/06j2d"}, - {"id": 211, "name": "Egg", "freebase_id": "/m/033cnk"}, - {"id": 212, "name": "Burrito", "freebase_id": "/m/01j3zr"}, - {"id": 213, "name": "Goat", "freebase_id": "/m/03fwl"}, - {"id": 214, "name": "Kitchen knife", "freebase_id": "/m/058qzx"}, - {"id": 215, "name": "Skateboard", "freebase_id": "/m/06_fw"}, - {"id": 216, "name": "Salt and pepper shakers", "freebase_id": "/m/02x8cch"}, - {"id": 217, "name": "Lynx", "freebase_id": "/m/04g2r"}, - {"id": 218, "name": "Boot", "freebase_id": "/m/01b638"}, - {"id": 219, "name": "Platter", "freebase_id": "/m/099ssp"}, - {"id": 220, "name": "Ski", "freebase_id": "/m/071p9"}, - {"id": 221, "name": "Swimwear", "freebase_id": "/m/01gkx_"}, - {"id": 222, "name": "Swimming pool", "freebase_id": "/m/0b_rs"}, - {"id": 223, "name": "Drinking straw", "freebase_id": "/m/03v5tg"}, - {"id": 224, "name": "Wrench", "freebase_id": "/m/01j5ks"}, - {"id": 225, "name": "Drum", "freebase_id": "/m/026t6"}, - {"id": 226, "name": "Ant", "freebase_id": "/m/0_k2"}, - {"id": 227, "name": "Human ear", "freebase_id": "/m/039xj_"}, - {"id": 228, "name": "Headphones", "freebase_id": "/m/01b7fy"}, - {"id": 229, "name": "Fountain", "freebase_id": "/m/0220r2"}, - {"id": 230, "name": "Bird", "freebase_id": "/m/015p6"}, - {"id": 231, "name": "Jeans", "freebase_id": "/m/0fly7"}, - {"id": 232, "name": "Television", "freebase_id": "/m/07c52"}, - {"id": 233, "name": "Crab", "freebase_id": "/m/0n28_"}, - {"id": 234, "name": "Microphone", "freebase_id": "/m/0hg7b"}, - {"id": 235, "name": "Home appliance", "freebase_id": "/m/019dx1"}, - {"id": 236, "name": "Snowplow", "freebase_id": "/m/04vv5k"}, - {"id": 237, "name": "Beetle", "freebase_id": "/m/020jm"}, - {"id": 238, "name": "Artichoke", "freebase_id": "/m/047v4b"}, - {"id": 239, "name": "Jet ski", "freebase_id": "/m/01xs3r"}, - {"id": 240, "name": "Stationary bicycle", "freebase_id": "/m/03kt2w"}, - {"id": 241, "name": "Human hair", "freebase_id": "/m/03q69"}, - {"id": 242, "name": "Brown bear", "freebase_id": "/m/01dxs"}, - {"id": 243, "name": "Starfish", "freebase_id": "/m/01h8tj"}, - {"id": 244, "name": "Fork", "freebase_id": "/m/0dt3t"}, - {"id": 245, "name": "Lobster", "freebase_id": "/m/0cjq5"}, - {"id": 246, "name": "Corded phone", "freebase_id": "/m/0h8lkj8"}, - {"id": 247, "name": "Drink", "freebase_id": "/m/0271t"}, - {"id": 248, "name": "Saucer", "freebase_id": "/m/03q5c7"}, - {"id": 249, "name": "Carrot", "freebase_id": "/m/0fj52s"}, - {"id": 250, "name": "Insect", "freebase_id": "/m/03vt0"}, - {"id": 251, "name": "Clock", "freebase_id": "/m/01x3z"}, - {"id": 252, "name": "Castle", "freebase_id": "/m/0d5gx"}, - {"id": 253, "name": "Tennis racket", "freebase_id": "/m/0h8my_4"}, - {"id": 254, "name": "Ceiling fan", "freebase_id": "/m/03ldnb"}, - {"id": 255, "name": "Asparagus", "freebase_id": "/m/0cjs7"}, - {"id": 256, "name": "Jaguar", "freebase_id": "/m/0449p"}, - {"id": 257, "name": "Musical instrument", "freebase_id": "/m/04szw"}, - {"id": 258, "name": "Train", "freebase_id": "/m/07jdr"}, - {"id": 259, "name": "Cat", "freebase_id": "/m/01yrx"}, - {"id": 260, "name": "Rifle", "freebase_id": "/m/06c54"}, - {"id": 261, "name": "Dumbbell", "freebase_id": "/m/04h8sr"}, - {"id": 262, "name": "Mobile phone", "freebase_id": "/m/050k8"}, - {"id": 263, "name": "Taxi", "freebase_id": "/m/0pg52"}, - {"id": 264, "name": "Shower", "freebase_id": "/m/02f9f_"}, - {"id": 265, "name": "Pitcher", "freebase_id": "/m/054fyh"}, - {"id": 266, "name": "Lemon", "freebase_id": "/m/09k_b"}, - {"id": 267, "name": "Invertebrate", "freebase_id": "/m/03xxp"}, - {"id": 268, "name": "Turkey", "freebase_id": "/m/0jly1"}, - {"id": 269, "name": "High heels", "freebase_id": "/m/06k2mb"}, - {"id": 270, "name": "Bust", "freebase_id": "/m/04yqq2"}, - {"id": 271, "name": "Elephant", "freebase_id": "/m/0bwd_0j"}, - {"id": 272, "name": "Scarf", "freebase_id": "/m/02h19r"}, - {"id": 273, "name": "Barrel", "freebase_id": "/m/02zn6n"}, - {"id": 274, "name": "Trombone", "freebase_id": "/m/07c6l"}, - {"id": 275, "name": "Pumpkin", "freebase_id": "/m/05zsy"}, - {"id": 276, "name": "Box", "freebase_id": "/m/025dyy"}, - {"id": 277, "name": "Tomato", "freebase_id": "/m/07j87"}, - {"id": 278, "name": "Frog", "freebase_id": "/m/09ld4"}, - {"id": 279, "name": "Bidet", "freebase_id": "/m/01vbnl"}, - {"id": 280, "name": "Human face", "freebase_id": "/m/0dzct"}, - {"id": 281, "name": "Houseplant", "freebase_id": "/m/03fp41"}, - {"id": 282, "name": "Van", "freebase_id": "/m/0h2r6"}, - {"id": 283, "name": "Shark", "freebase_id": "/m/0by6g"}, - {"id": 284, "name": "Ice cream", "freebase_id": "/m/0cxn2"}, - {"id": 285, "name": "Swim cap", "freebase_id": "/m/04tn4x"}, - {"id": 286, "name": "Falcon", "freebase_id": "/m/0f6wt"}, - {"id": 287, "name": "Ostrich", "freebase_id": "/m/05n4y"}, - {"id": 288, "name": "Handgun", "freebase_id": "/m/0gxl3"}, - {"id": 289, "name": "Whiteboard", "freebase_id": "/m/02d9qx"}, - {"id": 290, "name": "Lizard", "freebase_id": "/m/04m9y"}, - {"id": 291, "name": "Pasta", "freebase_id": "/m/05z55"}, - {"id": 292, "name": "Snowmobile", "freebase_id": "/m/01x3jk"}, - {"id": 293, "name": "Light bulb", "freebase_id": "/m/0h8l4fh"}, - {"id": 294, "name": "Window blind", "freebase_id": "/m/031b6r"}, - {"id": 295, "name": "Muffin", "freebase_id": "/m/01tcjp"}, - {"id": 296, "name": "Pretzel", "freebase_id": "/m/01f91_"}, - {"id": 297, "name": "Computer monitor", "freebase_id": "/m/02522"}, - {"id": 298, "name": "Horn", "freebase_id": "/m/0319l"}, - {"id": 299, "name": "Furniture", "freebase_id": "/m/0c_jw"}, - {"id": 300, "name": "Sandwich", "freebase_id": "/m/0l515"}, - {"id": 301, "name": "Fox", "freebase_id": "/m/0306r"}, - {"id": 302, "name": "Convenience store", "freebase_id": "/m/0crjs"}, - {"id": 303, "name": "Fish", "freebase_id": "/m/0ch_cf"}, - {"id": 304, "name": "Fruit", "freebase_id": "/m/02xwb"}, - {"id": 305, "name": "Earrings", "freebase_id": "/m/01r546"}, - {"id": 306, "name": "Curtain", "freebase_id": "/m/03rszm"}, - {"id": 307, "name": "Grape", "freebase_id": "/m/0388q"}, - {"id": 308, "name": "Sofa bed", "freebase_id": "/m/03m3pdh"}, - {"id": 309, "name": "Horse", "freebase_id": "/m/03k3r"}, - {"id": 310, "name": "Luggage and bags", "freebase_id": "/m/0hf58v5"}, - {"id": 311, "name": "Desk", "freebase_id": "/m/01y9k5"}, - {"id": 312, "name": "Crutch", "freebase_id": "/m/05441v"}, - {"id": 313, "name": "Bicycle helmet", "freebase_id": "/m/03p3bw"}, - {"id": 314, "name": "Tick", "freebase_id": "/m/0175cv"}, - {"id": 315, "name": "Airplane", "freebase_id": "/m/0cmf2"}, - {"id": 316, "name": "Canary", "freebase_id": "/m/0ccs93"}, - {"id": 317, "name": "Spatula", "freebase_id": "/m/02d1br"}, - {"id": 318, "name": "Watch", "freebase_id": "/m/0gjkl"}, - {"id": 319, "name": "Lily", "freebase_id": "/m/0jqgx"}, - {"id": 320, "name": "Kitchen appliance", "freebase_id": "/m/0h99cwc"}, - {"id": 321, "name": "Filing cabinet", "freebase_id": "/m/047j0r"}, - {"id": 322, "name": "Aircraft", "freebase_id": "/m/0k5j"}, - {"id": 323, "name": "Cake stand", "freebase_id": "/m/0h8n6ft"}, - {"id": 324, "name": "Candy", "freebase_id": "/m/0gm28"}, - {"id": 325, "name": "Sink", "freebase_id": "/m/0130jx"}, - {"id": 326, "name": "Mouse", "freebase_id": "/m/04rmv"}, - {"id": 327, "name": "Wine", "freebase_id": "/m/081qc"}, - {"id": 328, "name": "Wheelchair", "freebase_id": "/m/0qmmr"}, - {"id": 329, "name": "Goldfish", "freebase_id": "/m/03fj2"}, - {"id": 330, "name": "Refrigerator", "freebase_id": "/m/040b_t"}, - {"id": 331, "name": "French fries", "freebase_id": "/m/02y6n"}, - {"id": 332, "name": "Drawer", "freebase_id": "/m/0fqfqc"}, - {"id": 333, "name": "Treadmill", "freebase_id": "/m/030610"}, - {"id": 334, "name": "Picnic basket", "freebase_id": "/m/07kng9"}, - {"id": 335, "name": "Dice", "freebase_id": "/m/029b3"}, - {"id": 336, "name": "Cabbage", "freebase_id": "/m/0fbw6"}, - {"id": 337, "name": "Football helmet", "freebase_id": "/m/07qxg_"}, - {"id": 338, "name": "Pig", "freebase_id": "/m/068zj"}, - {"id": 339, "name": "Person", "freebase_id": "/m/01g317"}, - {"id": 340, "name": "Shorts", "freebase_id": "/m/01bfm9"}, - {"id": 341, "name": "Gondola", "freebase_id": "/m/02068x"}, - {"id": 342, "name": "Honeycomb", "freebase_id": "/m/0fz0h"}, - {"id": 343, "name": "Doughnut", "freebase_id": "/m/0jy4k"}, - {"id": 344, "name": "Chest of drawers", "freebase_id": "/m/05kyg_"}, - {"id": 345, "name": "Land vehicle", "freebase_id": "/m/01prls"}, - {"id": 346, "name": "Bat", "freebase_id": "/m/01h44"}, - {"id": 347, "name": "Monkey", "freebase_id": "/m/08pbxl"}, - {"id": 348, "name": "Dagger", "freebase_id": "/m/02gzp"}, - {"id": 349, "name": "Tableware", "freebase_id": "/m/04brg2"}, - {"id": 350, "name": "Human foot", "freebase_id": "/m/031n1"}, - {"id": 351, "name": "Mug", "freebase_id": "/m/02jvh9"}, - {"id": 352, "name": "Alarm clock", "freebase_id": "/m/046dlr"}, - {"id": 353, "name": "Pressure cooker", "freebase_id": "/m/0h8ntjv"}, - {"id": 354, "name": "Human hand", "freebase_id": "/m/0k65p"}, - {"id": 355, "name": "Tortoise", "freebase_id": "/m/011k07"}, - {"id": 356, "name": "Baseball glove", "freebase_id": "/m/03grzl"}, - {"id": 357, "name": "Sword", "freebase_id": "/m/06y5r"}, - {"id": 358, "name": "Pear", "freebase_id": "/m/061_f"}, - {"id": 359, "name": "Miniskirt", "freebase_id": "/m/01cmb2"}, - {"id": 360, "name": "Traffic sign", "freebase_id": "/m/01mqdt"}, - {"id": 361, "name": "Girl", "freebase_id": "/m/05r655"}, - {"id": 362, "name": "Roller skates", "freebase_id": "/m/02p3w7d"}, - {"id": 363, "name": "Dinosaur", "freebase_id": "/m/029tx"}, - {"id": 364, "name": "Porch", "freebase_id": "/m/04m6gz"}, - {"id": 365, "name": "Human beard", "freebase_id": "/m/015h_t"}, - {"id": 366, "name": "Submarine sandwich", "freebase_id": "/m/06pcq"}, - {"id": 367, "name": "Screwdriver", "freebase_id": "/m/01bms0"}, - {"id": 368, "name": "Strawberry", "freebase_id": "/m/07fbm7"}, - {"id": 369, "name": "Wine glass", "freebase_id": "/m/09tvcd"}, - {"id": 370, "name": "Seafood", "freebase_id": "/m/06nwz"}, - {"id": 371, "name": "Racket", "freebase_id": "/m/0dv9c"}, - {"id": 372, "name": "Wheel", "freebase_id": "/m/083wq"}, - {"id": 373, "name": "Sea lion", "freebase_id": "/m/0gd36"}, - {"id": 374, "name": "Toy", "freebase_id": "/m/0138tl"}, - {"id": 375, "name": "Tea", "freebase_id": "/m/07clx"}, - {"id": 376, "name": "Tennis ball", "freebase_id": "/m/05ctyq"}, - {"id": 377, "name": "Waste container", "freebase_id": "/m/0bjyj5"}, - {"id": 378, "name": "Mule", "freebase_id": "/m/0dbzx"}, - {"id": 379, "name": "Cricket ball", "freebase_id": "/m/02ctlc"}, - {"id": 380, "name": "Pineapple", "freebase_id": "/m/0fp6w"}, - {"id": 381, "name": "Coconut", "freebase_id": "/m/0djtd"}, - {"id": 382, "name": "Doll", "freebase_id": "/m/0167gd"}, - {"id": 383, "name": "Coffee table", "freebase_id": "/m/078n6m"}, - {"id": 384, "name": "Snowman", "freebase_id": "/m/0152hh"}, - {"id": 385, "name": "Lavender", "freebase_id": "/m/04gth"}, - {"id": 386, "name": "Shrimp", "freebase_id": "/m/0ll1f78"}, - {"id": 387, "name": "Maple", "freebase_id": "/m/0cffdh"}, - {"id": 388, "name": "Cowboy hat", "freebase_id": "/m/025rp__"}, - {"id": 389, "name": "Goggles", "freebase_id": "/m/02_n6y"}, - {"id": 390, "name": "Rugby ball", "freebase_id": "/m/0wdt60w"}, - {"id": 391, "name": "Caterpillar", "freebase_id": "/m/0cydv"}, - {"id": 392, "name": "Poster", "freebase_id": "/m/01n5jq"}, - {"id": 393, "name": "Rocket", "freebase_id": "/m/09rvcxw"}, - {"id": 394, "name": "Organ", "freebase_id": "/m/013y1f"}, - {"id": 395, "name": "Saxophone", "freebase_id": "/m/06ncr"}, - {"id": 396, "name": "Traffic light", "freebase_id": "/m/015qff"}, - {"id": 397, "name": "Cocktail", "freebase_id": "/m/024g6"}, - {"id": 398, "name": "Plastic bag", "freebase_id": "/m/05gqfk"}, - {"id": 399, "name": "Squash", "freebase_id": "/m/0dv77"}, - {"id": 400, "name": "Mushroom", "freebase_id": "/m/052sf"}, - {"id": 401, "name": "Hamburger", "freebase_id": "/m/0cdn1"}, - {"id": 402, "name": "Light switch", "freebase_id": "/m/03jbxj"}, - {"id": 403, "name": "Parachute", "freebase_id": "/m/0cyfs"}, - {"id": 404, "name": "Teddy bear", "freebase_id": "/m/0kmg4"}, - {"id": 405, "name": "Winter melon", "freebase_id": "/m/02cvgx"}, - {"id": 406, "name": "Deer", "freebase_id": "/m/09kx5"}, - {"id": 407, "name": "Musical keyboard", "freebase_id": "/m/057cc"}, - {"id": 408, "name": "Plumbing fixture", "freebase_id": "/m/02pkr5"}, - {"id": 409, "name": "Scoreboard", "freebase_id": "/m/057p5t"}, - {"id": 410, "name": "Baseball bat", "freebase_id": "/m/03g8mr"}, - {"id": 411, "name": "Envelope", "freebase_id": "/m/0frqm"}, - {"id": 412, "name": "Adhesive tape", "freebase_id": "/m/03m3vtv"}, - {"id": 413, "name": "Briefcase", "freebase_id": "/m/0584n8"}, - {"id": 414, "name": "Paddle", "freebase_id": "/m/014y4n"}, - {"id": 415, "name": "Bow and arrow", "freebase_id": "/m/01g3x7"}, - {"id": 416, "name": "Telephone", "freebase_id": "/m/07cx4"}, - {"id": 417, "name": "Sheep", "freebase_id": "/m/07bgp"}, - {"id": 418, "name": "Jacket", "freebase_id": "/m/032b3c"}, - {"id": 419, "name": "Boy", "freebase_id": "/m/01bl7v"}, - {"id": 420, "name": "Pizza", "freebase_id": "/m/0663v"}, - {"id": 421, "name": "Otter", "freebase_id": "/m/0cn6p"}, - {"id": 422, "name": "Office supplies", "freebase_id": "/m/02rdsp"}, - {"id": 423, "name": "Couch", "freebase_id": "/m/02crq1"}, - {"id": 424, "name": "Cello", "freebase_id": "/m/01xqw"}, - {"id": 425, "name": "Bull", "freebase_id": "/m/0cnyhnx"}, - {"id": 426, "name": "Camel", "freebase_id": "/m/01x_v"}, - {"id": 427, "name": "Ball", "freebase_id": "/m/018xm"}, - {"id": 428, "name": "Duck", "freebase_id": "/m/09ddx"}, - {"id": 429, "name": "Whale", "freebase_id": "/m/084zz"}, - {"id": 430, "name": "Shirt", "freebase_id": "/m/01n4qj"}, - {"id": 431, "name": "Tank", "freebase_id": "/m/07cmd"}, - {"id": 432, "name": "Motorcycle", "freebase_id": "/m/04_sv"}, - {"id": 433, "name": "Accordion", "freebase_id": "/m/0mkg"}, - {"id": 434, "name": "Owl", "freebase_id": "/m/09d5_"}, - {"id": 435, "name": "Porcupine", "freebase_id": "/m/0c568"}, - {"id": 436, "name": "Sun hat", "freebase_id": "/m/02wbtzl"}, - {"id": 437, "name": "Nail", "freebase_id": "/m/05bm6"}, - {"id": 438, "name": "Scissors", "freebase_id": "/m/01lsmm"}, - {"id": 439, "name": "Swan", "freebase_id": "/m/0dftk"}, - {"id": 440, "name": "Lamp", "freebase_id": "/m/0dtln"}, - {"id": 441, "name": "Crown", "freebase_id": "/m/0nl46"}, - {"id": 442, "name": "Piano", "freebase_id": "/m/05r5c"}, - {"id": 443, "name": "Sculpture", "freebase_id": "/m/06msq"}, - {"id": 444, "name": "Cheetah", "freebase_id": "/m/0cd4d"}, - {"id": 445, "name": "Oboe", "freebase_id": "/m/05kms"}, - {"id": 446, "name": "Tin can", "freebase_id": "/m/02jnhm"}, - {"id": 447, "name": "Mango", "freebase_id": "/m/0fldg"}, - {"id": 448, "name": "Tripod", "freebase_id": "/m/073bxn"}, - {"id": 449, "name": "Oven", "freebase_id": "/m/029bxz"}, - {"id": 450, "name": "Mouse", "freebase_id": "/m/020lf"}, - {"id": 451, "name": "Barge", "freebase_id": "/m/01btn"}, - {"id": 452, "name": "Coffee", "freebase_id": "/m/02vqfm"}, - {"id": 453, "name": "Snowboard", "freebase_id": "/m/06__v"}, - {"id": 454, "name": "Common fig", "freebase_id": "/m/043nyj"}, - {"id": 455, "name": "Salad", "freebase_id": "/m/0grw1"}, - {"id": 456, "name": "Marine invertebrates", "freebase_id": "/m/03hl4l9"}, - {"id": 457, "name": "Umbrella", "freebase_id": "/m/0hnnb"}, - {"id": 458, "name": "Kangaroo", "freebase_id": "/m/04c0y"}, - {"id": 459, "name": "Human arm", "freebase_id": "/m/0dzf4"}, - {"id": 460, "name": "Measuring cup", "freebase_id": "/m/07v9_z"}, - {"id": 461, "name": "Snail", "freebase_id": "/m/0f9_l"}, - {"id": 462, "name": "Loveseat", "freebase_id": "/m/0703r8"}, - {"id": 463, "name": "Suit", "freebase_id": "/m/01xyhv"}, - {"id": 464, "name": "Teapot", "freebase_id": "/m/01fh4r"}, - {"id": 465, "name": "Bottle", "freebase_id": "/m/04dr76w"}, - {"id": 466, "name": "Alpaca", "freebase_id": "/m/0pcr"}, - {"id": 467, "name": "Kettle", "freebase_id": "/m/03s_tn"}, - {"id": 468, "name": "Trousers", "freebase_id": "/m/07mhn"}, - {"id": 469, "name": "Popcorn", "freebase_id": "/m/01hrv5"}, - {"id": 470, "name": "Centipede", "freebase_id": "/m/019h78"}, - {"id": 471, "name": "Spider", "freebase_id": "/m/09kmb"}, - {"id": 472, "name": "Sparrow", "freebase_id": "/m/0h23m"}, - {"id": 473, "name": "Plate", "freebase_id": "/m/050gv4"}, - {"id": 474, "name": "Bagel", "freebase_id": "/m/01fb_0"}, - {"id": 475, "name": "Personal care", "freebase_id": "/m/02w3_ws"}, - {"id": 476, "name": "Apple", "freebase_id": "/m/014j1m"}, - {"id": 477, "name": "Brassiere", "freebase_id": "/m/01gmv2"}, - {"id": 478, "name": "Bathroom cabinet", "freebase_id": "/m/04y4h8h"}, - {"id": 479, "name": "studio couch", "freebase_id": "/m/026qbn5"}, - {"id": 480, "name": "Computer keyboard", "freebase_id": "/m/01m2v"}, - {"id": 481, "name": "Table tennis racket", "freebase_id": "/m/05_5p_0"}, - {"id": 482, "name": "Sushi", "freebase_id": "/m/07030"}, - {"id": 483, "name": "Cabinetry", "freebase_id": "/m/01s105"}, - {"id": 484, "name": "Street light", "freebase_id": "/m/033rq4"}, - {"id": 485, "name": "Towel", "freebase_id": "/m/0162_1"}, - {"id": 486, "name": "Nightstand", "freebase_id": "/m/02z51p"}, - {"id": 487, "name": "Rabbit", "freebase_id": "/m/06mf6"}, - {"id": 488, "name": "Dolphin", "freebase_id": "/m/02hj4"}, - {"id": 489, "name": "Dog", "freebase_id": "/m/0bt9lr"}, - {"id": 490, "name": "Jug", "freebase_id": "/m/08hvt4"}, - {"id": 491, "name": "Wok", "freebase_id": "/m/084rd"}, - {"id": 492, "name": "Fire hydrant", "freebase_id": "/m/01pns0"}, - {"id": 493, "name": "Human eye", "freebase_id": "/m/014sv8"}, - {"id": 494, "name": "Skyscraper", "freebase_id": "/m/079cl"}, - {"id": 495, "name": "Backpack", "freebase_id": "/m/01940j"}, - {"id": 496, "name": "Potato", "freebase_id": "/m/05vtc"}, - {"id": 497, "name": "Paper towel", "freebase_id": "/m/02w3r3"}, - {"id": 498, "name": "Lifejacket", "freebase_id": "/m/054xkw"}, - {"id": 499, "name": "Bicycle wheel", "freebase_id": "/m/01bqk0"}, - {"id": 500, "name": "Toilet", "freebase_id": "/m/09g1w"}, -] - - -def _get_builtin_metadata(cats): - {x["id"]: x["name"] for x in cats} - thing_dataset_id_to_contiguous_id = {i + 1: i for i in range(len(cats))} - thing_classes = [x["name"] for x in sorted(cats, key=lambda x: x["id"])] - return { - "thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id, - "thing_classes": thing_classes, - } - - -_PREDEFINED_SPLITS_OID = { - # cat threshold: 500, 1500: r 170, c 151, f 179 - "oid_train": ("oid/images/", "oid/annotations/oid_challenge_2019_train_bbox.json"), - # "expanded" duplicates annotations to their father classes based on the official - # hierarchy. This is used in the official evaulation protocol. - # https://storage.googleapis.com/openimages/web/evaluation.html - "oid_val_expanded": ( - "oid/images/validation/", - "oid/annotations/oid_challenge_2019_val_expanded.json", - ), - "oid_val_expanded_rare": ( - "oid/images/validation/", - "oid/annotations/oid_challenge_2019_val_expanded_rare.json", - ), -} - - -for key, (image_root, json_file) in _PREDEFINED_SPLITS_OID.items(): - register_oid_instances( - key, - _get_builtin_metadata(categories), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/detic/data/datasets/register_oid.py b/dimos/models/Detic/detic/data/datasets/register_oid.py deleted file mode 100644 index 0739556041..0000000000 --- a/dimos/models/Detic/detic/data/datasets/register_oid.py +++ /dev/null @@ -1,115 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -# Modified by Xingyi Zhou from https://github.com/facebookresearch/detectron2/blob/master/detectron2/data/datasets/coco.py -import contextlib -import io -import logging -import os - -from detectron2.data import DatasetCatalog, MetadataCatalog -from detectron2.structures import BoxMode -from fvcore.common.file_io import PathManager -from fvcore.common.timer import Timer -from typing import Optional - -logger = logging.getLogger(__name__) - -""" -This file contains functions to register a COCO-format dataset to the DatasetCatalog. -""" - -__all__ = ["register_coco_instances", "register_coco_panoptic_separated"] - - -def register_oid_instances(name: str, metadata, json_file, image_root) -> None: - """ """ - # 1. register a function which returns dicts - DatasetCatalog.register(name, lambda: load_coco_json_mem_efficient(json_file, image_root, name)) - - # 2. Optionally, add metadata about this dataset, - # since they might be useful in evaluation, visualization or logging - MetadataCatalog.get(name).set( - json_file=json_file, image_root=image_root, evaluator_type="oid", **metadata - ) - - -def load_coco_json_mem_efficient( - json_file, image_root, dataset_name: Optional[str]=None, extra_annotation_keys=None -): - """ - Actually not mem efficient - """ - from pycocotools.coco import COCO - - timer = Timer() - json_file = PathManager.get_local_path(json_file) - with contextlib.redirect_stdout(io.StringIO()): - coco_api = COCO(json_file) - if timer.seconds() > 1: - logger.info(f"Loading {json_file} takes {timer.seconds():.2f} seconds.") - - id_map = None - if dataset_name is not None: - meta = MetadataCatalog.get(dataset_name) - cat_ids = sorted(coco_api.getCatIds()) - cats = coco_api.loadCats(cat_ids) - # The categories in a custom json file may not be sorted. - thing_classes = [c["name"] for c in sorted(cats, key=lambda x: x["id"])] - meta.thing_classes = thing_classes - - if not (min(cat_ids) == 1 and max(cat_ids) == len(cat_ids)): - if "coco" not in dataset_name: - logger.warning( - """ - Category ids in annotations are not in [1, #categories]! We'll apply a mapping for you. - """ - ) - id_map = {v: i for i, v in enumerate(cat_ids)} - meta.thing_dataset_id_to_contiguous_id = id_map - - # sort indices for reproducible results - img_ids = sorted(coco_api.imgs.keys()) - imgs = coco_api.loadImgs(img_ids) - logger.info(f"Loaded {len(imgs)} images in COCO format from {json_file}") - - dataset_dicts = [] - - ann_keys = ["iscrowd", "bbox", "category_id"] + (extra_annotation_keys or []) - - for img_dict in imgs: - record = {} - record["file_name"] = os.path.join(image_root, img_dict["file_name"]) - record["height"] = img_dict["height"] - record["width"] = img_dict["width"] - image_id = record["image_id"] = img_dict["id"] - anno_dict_list = coco_api.imgToAnns[image_id] - if "neg_category_ids" in img_dict: - record["neg_category_ids"] = [id_map[x] for x in img_dict["neg_category_ids"]] - - objs = [] - for anno in anno_dict_list: - assert anno["image_id"] == image_id - - assert anno.get("ignore", 0) == 0 - - obj = {key: anno[key] for key in ann_keys if key in anno} - - segm = anno.get("segmentation", None) - if segm: # either list[list[float]] or dict(RLE) - if not isinstance(segm, dict): - # filter out invalid polygons (< 3 points) - segm = [poly for poly in segm if len(poly) % 2 == 0 and len(poly) >= 6] - if len(segm) == 0: - num_instances_without_valid_segmentation += 1 - continue # ignore this instance - obj["segmentation"] = segm - - obj["bbox_mode"] = BoxMode.XYWH_ABS - - if id_map: - obj["category_id"] = id_map[obj["category_id"]] - objs.append(obj) - record["annotations"] = objs - dataset_dicts.append(record) - - del coco_api - return dataset_dicts diff --git a/dimos/models/Detic/detic/data/tar_dataset.py b/dimos/models/Detic/detic/data/tar_dataset.py deleted file mode 100644 index 8c87a056d1..0000000000 --- a/dimos/models/Detic/detic/data/tar_dataset.py +++ /dev/null @@ -1,145 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) Facebook, Inc. and its affiliates. -import gzip -import io -import os - -import numpy as np -from PIL import Image -from torch.utils.data import Dataset - -try: - from PIL import UnidentifiedImageError - - unidentified_error_available = True -except ImportError: - # UnidentifiedImageError isn't available in older versions of PIL - unidentified_error_available = False - - -class DiskTarDataset(Dataset): - def __init__( - self, - tarfile_path: str="dataset/imagenet/ImageNet-21k/metadata/tar_files.npy", - tar_index_dir: str="dataset/imagenet/ImageNet-21k/metadata/tarindex_npy", - preload: bool=False, - num_synsets: str="all", - ) -> None: - """ - - preload (bool): Recommend to set preload to False when using - - num_synsets (integer or string "all"): set to small number for debugging - will load subset of dataset - """ - tar_files = np.load(tarfile_path) - - chunk_datasets = [] - dataset_lens = [] - if isinstance(num_synsets, int): - assert num_synsets < len(tar_files) - tar_files = tar_files[:num_synsets] - for tar_file in tar_files: - dataset = _TarDataset(tar_file, tar_index_dir, preload=preload) - chunk_datasets.append(dataset) - dataset_lens.append(len(dataset)) - - self.chunk_datasets = chunk_datasets - self.dataset_lens = np.array(dataset_lens).astype(np.int32) - self.dataset_cumsums = np.cumsum(self.dataset_lens) - self.num_samples = sum(self.dataset_lens) - labels = np.zeros(self.dataset_lens.sum(), dtype=np.int64) - sI = 0 - for k in range(len(self.dataset_lens)): - assert (sI + self.dataset_lens[k]) <= len(labels), ( - f"{k} {sI + self.dataset_lens[k]} vs. {len(labels)}" - ) - labels[sI : (sI + self.dataset_lens[k])] = k - sI += self.dataset_lens[k] - self.labels = labels - - def __len__(self) -> int: - return self.num_samples - - def __getitem__(self, index): - assert index >= 0 and index < len(self) - # find the dataset file we need to go to - d_index = np.searchsorted(self.dataset_cumsums, index) - - # edge case, if index is at edge of chunks, move right - if index in self.dataset_cumsums: - d_index += 1 - - assert d_index == self.labels[index], ( - f"{d_index} vs. {self.labels[index]} mismatch for {index}" - ) - - # change index to local dataset index - if d_index == 0: - local_index = index - else: - local_index = index - self.dataset_cumsums[d_index - 1] - data_bytes = self.chunk_datasets[d_index][local_index] - exception_to_catch = UnidentifiedImageError if unidentified_error_available else Exception - try: - image = Image.open(data_bytes).convert("RGB") - except exception_to_catch: - image = Image.fromarray(np.ones((224, 224, 3), dtype=np.uint8) * 128) - d_index = -1 - - # label is the dataset (synset) we indexed into - return image, d_index, index - - def __repr__(self) -> str: - st = f"DiskTarDataset(subdatasets={len(self.dataset_lens)},samples={self.num_samples})" - return st - - -class _TarDataset: - def __init__(self, filename, npy_index_dir, preload: bool=False) -> None: - # translated from - # fbcode/experimental/deeplearning/matthijs/comp_descs/tardataset.lua - self.filename = filename - self.names = [] - self.offsets = [] - self.npy_index_dir = npy_index_dir - names, offsets = self.load_index() - - self.num_samples = len(names) - if preload: - self.data = np.memmap(filename, mode="r", dtype="uint8") - self.offsets = offsets - else: - self.data = None - - def __len__(self) -> int: - return self.num_samples - - def load_index(self): - basename = os.path.basename(self.filename) - basename = os.path.splitext(basename)[0] - names = np.load(os.path.join(self.npy_index_dir, f"{basename}_names.npy")) - offsets = np.load(os.path.join(self.npy_index_dir, f"{basename}_offsets.npy")) - return names, offsets - - def __getitem__(self, idx: int): - if self.data is None: - self.data = np.memmap(self.filename, mode="r", dtype="uint8") - _, self.offsets = self.load_index() - - ofs = self.offsets[idx] * 512 - fsize = 512 * (self.offsets[idx + 1] - self.offsets[idx]) - data = self.data[ofs : ofs + fsize] - - if data[:13].tostring() == "././@LongLink": - data = data[3 * 512 :] - else: - data = data[512:] - - # just to make it more fun a few JPEGs are GZIP compressed... - # catch this case - if tuple(data[:2]) == (0x1F, 0x8B): - s = io.BytesIO(data.tostring()) - g = gzip.GzipFile(None, "r", 0, s) - sdata = g.read() - else: - sdata = data.tostring() - return io.BytesIO(sdata) diff --git a/dimos/models/Detic/detic/data/transforms/custom_augmentation_impl.py b/dimos/models/Detic/detic/data/transforms/custom_augmentation_impl.py deleted file mode 100644 index 7cabc91e0f..0000000000 --- a/dimos/models/Detic/detic/data/transforms/custom_augmentation_impl.py +++ /dev/null @@ -1,49 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# Part of the code is from https://github.com/rwightman/efficientdet-pytorch/blob/master/effdet/data/transforms.py -# Modified by Xingyi Zhou -# The original code is under Apache-2.0 License -from detectron2.data.transforms.augmentation import Augmentation -import numpy as np -from PIL import Image - -from .custom_transform import EfficientDetResizeCropTransform - -__all__ = [ - "EfficientDetResizeCrop", -] - - -class EfficientDetResizeCrop(Augmentation): - """ - Scale the shorter edge to the given size, with a limit of `max_size` on the longer edge. - If `max_size` is reached, then downscale so that the longer edge does not exceed max_size. - """ - - def __init__(self, size: int, scale, interp=Image.BILINEAR) -> None: - """ """ - super().__init__() - self.target_size = (size, size) - self.scale = scale - self.interp = interp - - def get_transform(self, img): - # Select a random scale factor. - scale_factor = np.random.uniform(*self.scale) - scaled_target_height = scale_factor * self.target_size[0] - scaled_target_width = scale_factor * self.target_size[1] - # Recompute the accurate scale_factor using rounded scaled image size. - width, height = img.shape[1], img.shape[0] - img_scale_y = scaled_target_height / height - img_scale_x = scaled_target_width / width - img_scale = min(img_scale_y, img_scale_x) - - # Select non-zero random offset (x, y) if scaled image is larger than target size - scaled_h = int(height * img_scale) - scaled_w = int(width * img_scale) - offset_y = scaled_h - self.target_size[0] - offset_x = scaled_w - self.target_size[1] - offset_y = int(max(0.0, float(offset_y)) * np.random.uniform(0, 1)) - offset_x = int(max(0.0, float(offset_x)) * np.random.uniform(0, 1)) - return EfficientDetResizeCropTransform( - scaled_h, scaled_w, offset_y, offset_x, img_scale, self.target_size, self.interp - ) diff --git a/dimos/models/Detic/detic/data/transforms/custom_transform.py b/dimos/models/Detic/detic/data/transforms/custom_transform.py deleted file mode 100644 index 2017c27a5f..0000000000 --- a/dimos/models/Detic/detic/data/transforms/custom_transform.py +++ /dev/null @@ -1,102 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# Part of the code is from https://github.com/rwightman/efficientdet-pytorch/blob/master/effdet/data/transforms.py -# Modified by Xingyi Zhou -# The original code is under Apache-2.0 License -from fvcore.transforms.transform import ( - Transform, -) -import numpy as np -from PIL import Image -import torch -import torch.nn.functional as F - -try: - import cv2 -except ImportError: - # OpenCV is an optional dependency at the moment - pass - -__all__ = [ - "EfficientDetResizeCropTransform", -] - - -class EfficientDetResizeCropTransform(Transform): - """ """ - - def __init__(self, scaled_h, scaled_w, offset_y, offset_x, img_scale, target_size: int, interp=None) -> None: - """ - Args: - h, w (int): original image size - new_h, new_w (int): new image size - interp: PIL interpolation methods, defaults to bilinear. - """ - # TODO decide on PIL vs opencv - super().__init__() - if interp is None: - interp = Image.BILINEAR - self._set_attributes(locals()) - - def apply_image(self, img, interp=None): - assert len(img.shape) <= 4 - - if img.dtype == np.uint8: - pil_image = Image.fromarray(img) - interp_method = interp if interp is not None else self.interp - pil_image = pil_image.resize((self.scaled_w, self.scaled_h), interp_method) - ret = np.asarray(pil_image) - right = min(self.scaled_w, self.offset_x + self.target_size[1]) - lower = min(self.scaled_h, self.offset_y + self.target_size[0]) - if len(ret.shape) <= 3: - ret = ret[self.offset_y : lower, self.offset_x : right] - else: - ret = ret[..., self.offset_y : lower, self.offset_x : right, :] - else: - # PIL only supports uint8 - img = torch.from_numpy(img) - shape = list(img.shape) - shape_4d = shape[:2] + [1] * (4 - len(shape)) + shape[2:] - img = img.view(shape_4d).permute(2, 3, 0, 1) # hw(c) -> nchw - _PIL_RESIZE_TO_INTERPOLATE_MODE = {Image.BILINEAR: "bilinear", Image.BICUBIC: "bicubic"} - mode = _PIL_RESIZE_TO_INTERPOLATE_MODE[self.interp] - img = F.interpolate(img, (self.scaled_h, self.scaled_w), mode=mode, align_corners=False) - shape[:2] = (self.scaled_h, self.scaled_w) - ret = img.permute(2, 3, 0, 1).view(shape).numpy() # nchw -> hw(c) - right = min(self.scaled_w, self.offset_x + self.target_size[1]) - lower = min(self.scaled_h, self.offset_y + self.target_size[0]) - if len(ret.shape) <= 3: - ret = ret[self.offset_y : lower, self.offset_x : right] - else: - ret = ret[..., self.offset_y : lower, self.offset_x : right, :] - return ret - - def apply_coords(self, coords): - coords[:, 0] = coords[:, 0] * self.img_scale - coords[:, 1] = coords[:, 1] * self.img_scale - coords[:, 0] -= self.offset_x - coords[:, 1] -= self.offset_y - return coords - - def apply_segmentation(self, segmentation): - segmentation = self.apply_image(segmentation, interp=Image.NEAREST) - return segmentation - - def inverse(self): - raise NotImplementedError - - def inverse_apply_coords(self, coords): - coords[:, 0] += self.offset_x - coords[:, 1] += self.offset_y - coords[:, 0] = coords[:, 0] / self.img_scale - coords[:, 1] = coords[:, 1] / self.img_scale - return coords - - def inverse_apply_box(self, box: np.ndarray) -> np.ndarray: - """ """ - idxs = np.array([(0, 1), (2, 1), (0, 3), (2, 3)]).flatten() - coords = np.asarray(box).reshape(-1, 4)[:, idxs].reshape(-1, 2) - coords = self.inverse_apply_coords(coords).reshape((-1, 4, 2)) - minxy = coords.min(axis=1) - maxxy = coords.max(axis=1) - trans_boxes = np.concatenate((minxy, maxxy), axis=1) - return trans_boxes diff --git a/dimos/models/Detic/detic/evaluation/custom_coco_eval.py b/dimos/models/Detic/detic/evaluation/custom_coco_eval.py deleted file mode 100644 index 759d885f00..0000000000 --- a/dimos/models/Detic/detic/evaluation/custom_coco_eval.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import itertools - -from detectron2.evaluation.coco_evaluation import COCOEvaluator -from detectron2.utils.logger import create_small_table -import numpy as np -from tabulate import tabulate - -from ..data.datasets.coco_zeroshot import categories_seen, categories_unseen -from typing import Optional, Sequence - - -class CustomCOCOEvaluator(COCOEvaluator): - def _derive_coco_results(self, coco_eval, iou_type, class_names: Optional[Sequence[str]]=None): - """ - Additionally plot mAP for 'seen classes' and 'unseen classes' - """ - - metrics = { - "bbox": ["AP", "AP50", "AP75", "APs", "APm", "APl"], - "segm": ["AP", "AP50", "AP75", "APs", "APm", "APl"], - "keypoints": ["AP", "AP50", "AP75", "APm", "APl"], - }[iou_type] - - if coco_eval is None: - self._logger.warn("No predictions from the model!") - return {metric: float("nan") for metric in metrics} - - # the standard metrics - results = { - metric: float(coco_eval.stats[idx] * 100 if coco_eval.stats[idx] >= 0 else "nan") - for idx, metric in enumerate(metrics) - } - self._logger.info( - f"Evaluation results for {iou_type}: \n" + create_small_table(results) - ) - if not np.isfinite(sum(results.values())): - self._logger.info("Some metrics cannot be computed and is shown as NaN.") - - if class_names is None or len(class_names) <= 1: - return results - # Compute per-category AP - # from https://github.com/facebookresearch/Detectron/blob/a6a835f5b8208c45d0dce217ce9bbda915f44df7/detectron/datasets/json_dataset_evaluator.py#L222-L252 - precisions = coco_eval.eval["precision"] - # precision has dims (iou, recall, cls, area range, max dets) - assert len(class_names) == precisions.shape[2] - - seen_names = set([x["name"] for x in categories_seen]) - unseen_names = set([x["name"] for x in categories_unseen]) - results_per_category = [] - results_per_category50 = [] - results_per_category50_seen = [] - results_per_category50_unseen = [] - for idx, name in enumerate(class_names): - # area range index 0: all area ranges - # max dets index -1: typically 100 per image - precision = precisions[:, :, idx, 0, -1] - precision = precision[precision > -1] - ap = np.mean(precision) if precision.size else float("nan") - results_per_category.append((f"{name}", float(ap * 100))) - precision50 = precisions[0, :, idx, 0, -1] - precision50 = precision50[precision50 > -1] - ap50 = np.mean(precision50) if precision50.size else float("nan") - results_per_category50.append((f"{name}", float(ap50 * 100))) - if name in seen_names: - results_per_category50_seen.append(float(ap50 * 100)) - if name in unseen_names: - results_per_category50_unseen.append(float(ap50 * 100)) - - # tabulate it - N_COLS = min(6, len(results_per_category) * 2) - results_flatten = list(itertools.chain(*results_per_category)) - results_2d = itertools.zip_longest(*[results_flatten[i::N_COLS] for i in range(N_COLS)]) - table = tabulate( - results_2d, - tablefmt="pipe", - floatfmt=".3f", - headers=["category", "AP"] * (N_COLS // 2), - numalign="left", - ) - self._logger.info(f"Per-category {iou_type} AP: \n" + table) - - N_COLS = min(6, len(results_per_category50) * 2) - results_flatten = list(itertools.chain(*results_per_category50)) - results_2d = itertools.zip_longest(*[results_flatten[i::N_COLS] for i in range(N_COLS)]) - table = tabulate( - results_2d, - tablefmt="pipe", - floatfmt=".3f", - headers=["category", "AP50"] * (N_COLS // 2), - numalign="left", - ) - self._logger.info(f"Per-category {iou_type} AP50: \n" + table) - self._logger.info( - f"Seen {iou_type} AP50: {sum(results_per_category50_seen) / len(results_per_category50_seen)}" - ) - self._logger.info( - f"Unseen {iou_type} AP50: {sum(results_per_category50_unseen) / len(results_per_category50_unseen)}" - ) - - results.update({"AP-" + name: ap for name, ap in results_per_category}) - results["AP50-seen"] = sum(results_per_category50_seen) / len(results_per_category50_seen) - results["AP50-unseen"] = sum(results_per_category50_unseen) / len( - results_per_category50_unseen - ) - return results diff --git a/dimos/models/Detic/detic/evaluation/oideval.py b/dimos/models/Detic/detic/evaluation/oideval.py deleted file mode 100644 index aa5a954aef..0000000000 --- a/dimos/models/Detic/detic/evaluation/oideval.py +++ /dev/null @@ -1,683 +0,0 @@ -# Part of the code is from https://github.com/tensorflow/models/blob/master/research/object_detection/metrics/oid_challenge_evaluation.py -# Copyright 2018 The TensorFlow Authors. All Rights Reserved. -# The original code is under Apache License, Version 2.0 (the "License"); -# Part of the code is from https://github.com/lvis-dataset/lvis-api/blob/master/lvis/eval.py -# Copyright (c) 2019, Agrim Gupta and Ross Girshick -# Modified by Xingyi Zhou -# This script re-implement OpenImages evaluation in detectron2 -# The code is from https://github.com/xingyizhou/UniDet/blob/master/projects/UniDet/unidet/evaluation/oideval.py -# The original code is under Apache-2.0 License -# Copyright (c) Facebook, Inc. and its affiliates. -from collections import OrderedDict, defaultdict -import copy -import datetime -import itertools -import json -import logging -import os - -from detectron2.data import MetadataCatalog -from detectron2.evaluation import DatasetEvaluator -from detectron2.evaluation.coco_evaluation import instances_to_coco_json -import detectron2.utils.comm as comm -from detectron2.utils.logger import create_small_table -from fvcore.common.file_io import PathManager -from lvis.lvis import LVIS -from lvis.results import LVISResults -import numpy as np -import pycocotools.mask as mask_utils -from tabulate import tabulate -import torch -from typing import Optional, Sequence - - -def compute_average_precision(precision, recall): - """Compute Average Precision according to the definition in VOCdevkit. - Precision is modified to ensure that it does not decrease as recall - decrease. - Args: - precision: A float [N, 1] numpy array of precisions - recall: A float [N, 1] numpy array of recalls - Raises: - ValueError: if the input is not of the correct format - Returns: - average_precison: The area under the precision recall curve. NaN if - precision and recall are None. - """ - if precision is None: - if recall is not None: - raise ValueError("If precision is None, recall must also be None") - return np.NAN - - if not isinstance(precision, np.ndarray) or not isinstance(recall, np.ndarray): - raise ValueError("precision and recall must be numpy array") - if precision.dtype != np.float or recall.dtype != np.float: - raise ValueError("input must be float numpy array.") - if len(precision) != len(recall): - raise ValueError("precision and recall must be of the same size.") - if not precision.size: - return 0.0 - if np.amin(precision) < 0 or np.amax(precision) > 1: - raise ValueError("Precision must be in the range of [0, 1].") - if np.amin(recall) < 0 or np.amax(recall) > 1: - raise ValueError("recall must be in the range of [0, 1].") - if not all(recall[i] <= recall[i + 1] for i in range(len(recall) - 1)): - raise ValueError("recall must be a non-decreasing array") - - recall = np.concatenate([[0], recall, [1]]) - precision = np.concatenate([[0], precision, [0]]) - - for i in range(len(precision) - 2, -1, -1): - precision[i] = np.maximum(precision[i], precision[i + 1]) - indices = np.where(recall[1:] != recall[:-1])[0] + 1 - average_precision = np.sum((recall[indices] - recall[indices - 1]) * precision[indices]) - return average_precision - - -class OIDEval: - def __init__( - self, - lvis_gt, - lvis_dt, - iou_type: str="bbox", - expand_pred_label: bool=False, - oid_hierarchy_path: str="./datasets/oid/annotations/challenge-2019-label500-hierarchy.json", - ) -> None: - """Constructor for OIDEval. - Args: - lvis_gt (LVIS class instance, or str containing path of annotation file) - lvis_dt (LVISResult class instance, or str containing path of result file, - or list of dict) - iou_type (str): segm or bbox evaluation - """ - self.logger = logging.getLogger(__name__) - - if iou_type not in ["bbox", "segm"]: - raise ValueError(f"iou_type: {iou_type} is not supported.") - - if isinstance(lvis_gt, LVIS): - self.lvis_gt = lvis_gt - elif isinstance(lvis_gt, str): - self.lvis_gt = LVIS(lvis_gt) - else: - raise TypeError(f"Unsupported type {lvis_gt} of lvis_gt.") - - if isinstance(lvis_dt, LVISResults): - self.lvis_dt = lvis_dt - elif isinstance(lvis_dt, str | list): - # self.lvis_dt = LVISResults(self.lvis_gt, lvis_dt, max_dets=-1) - self.lvis_dt = LVISResults(self.lvis_gt, lvis_dt) - else: - raise TypeError(f"Unsupported type {lvis_dt} of lvis_dt.") - - if expand_pred_label: - oid_hierarchy = json.load(open(oid_hierarchy_path)) - cat_info = self.lvis_gt.dataset["categories"] - freebase2id = {x["freebase_id"]: x["id"] for x in cat_info} - {x["id"]: x["freebase_id"] for x in cat_info} - {x["id"]: x["name"] for x in cat_info} - - fas = defaultdict(set) - - def dfs(hierarchy, cur_id): - all_childs = set() - if "Subcategory" in hierarchy: - for x in hierarchy["Subcategory"]: - childs = dfs(x, freebase2id[x["LabelName"]]) - all_childs.update(childs) - if cur_id != -1: - for c in all_childs: - fas[c].add(cur_id) - all_childs.add(cur_id) - return all_childs - - dfs(oid_hierarchy, -1) - - expanded_pred = [] - id_count = 0 - for d in self.lvis_dt.dataset["annotations"]: - cur_id = d["category_id"] - ids = [cur_id] + [x for x in fas[cur_id]] - for cat_id in ids: - new_box = copy.deepcopy(d) - id_count = id_count + 1 - new_box["id"] = id_count - new_box["category_id"] = cat_id - expanded_pred.append(new_box) - - print( - "Expanding original {} preds to {} preds".format( - len(self.lvis_dt.dataset["annotations"]), len(expanded_pred) - ) - ) - self.lvis_dt.dataset["annotations"] = expanded_pred - self.lvis_dt._create_index() - - # per-image per-category evaluation results - self.eval_imgs = defaultdict(list) - self.eval = {} # accumulated evaluation results - self._gts = defaultdict(list) # gt for evaluation - self._dts = defaultdict(list) # dt for evaluation - self.params = Params(iou_type=iou_type) # parameters - self.results = OrderedDict() - self.ious = {} # ious between all gts and dts - - self.params.img_ids = sorted(self.lvis_gt.get_img_ids()) - self.params.cat_ids = sorted(self.lvis_gt.get_cat_ids()) - - def _to_mask(self, anns, lvis) -> None: - for ann in anns: - rle = lvis.ann_to_rle(ann) - ann["segmentation"] = rle - - def _prepare(self) -> None: - """Prepare self._gts and self._dts for evaluation based on params.""" - - cat_ids = self.params.cat_ids if self.params.cat_ids else None - - gts = self.lvis_gt.load_anns( - self.lvis_gt.get_ann_ids(img_ids=self.params.img_ids, cat_ids=cat_ids) - ) - dts = self.lvis_dt.load_anns( - self.lvis_dt.get_ann_ids(img_ids=self.params.img_ids, cat_ids=cat_ids) - ) - # convert ground truth to mask if iou_type == 'segm' - if self.params.iou_type == "segm": - self._to_mask(gts, self.lvis_gt) - self._to_mask(dts, self.lvis_dt) - - for gt in gts: - self._gts[gt["image_id"], gt["category_id"]].append(gt) - - # For federated dataset evaluation we will filter out all dt for an - # image which belong to categories not present in gt and not present in - # the negative list for an image. In other words detector is not penalized - # for categories about which we don't have gt information about their - # presence or absence in an image. - img_data = self.lvis_gt.load_imgs(ids=self.params.img_ids) - # per image map of categories not present in image - img_nl = {d["id"]: d["neg_category_ids"] for d in img_data} - # per image list of categories present in image - img_pl = {d["id"]: d["pos_category_ids"] for d in img_data} - # img_pl = defaultdict(set) - for ann in gts: - # img_pl[ann["image_id"]].add(ann["category_id"]) - assert ann["category_id"] in img_pl[ann["image_id"]] - # print('check pos ids OK.') - - for dt in dts: - img_id, cat_id = dt["image_id"], dt["category_id"] - if cat_id not in img_nl[img_id] and cat_id not in img_pl[img_id]: - continue - self._dts[img_id, cat_id].append(dt) - - def evaluate(self) -> None: - """ - Run per image evaluation on given images and store results - (a list of dict) in self.eval_imgs. - """ - self.logger.info("Running per image evaluation.") - self.logger.info(f"Evaluate annotation type *{self.params.iou_type}*") - - self.params.img_ids = list(np.unique(self.params.img_ids)) - - if self.params.use_cats: - cat_ids = self.params.cat_ids - else: - cat_ids = [-1] - - self._prepare() - - self.ious = { - (img_id, cat_id): self.compute_iou(img_id, cat_id) - for img_id in self.params.img_ids - for cat_id in cat_ids - } - - # loop through images, area range, max detection number - print("Evaluating ...") - self.eval_imgs = [ - self.evaluate_img_google(img_id, cat_id, area_rng) - for cat_id in cat_ids - for area_rng in self.params.area_rng - for img_id in self.params.img_ids - ] - - def _get_gt_dt(self, img_id, cat_id): - """Create gt, dt which are list of anns/dets. If use_cats is true - only anns/dets corresponding to tuple (img_id, cat_id) will be - used. Else, all anns/dets in image are used and cat_id is not used. - """ - if self.params.use_cats: - gt = self._gts[img_id, cat_id] - dt = self._dts[img_id, cat_id] - else: - gt = [_ann for _cat_id in self.params.cat_ids for _ann in self._gts[img_id, cat_id]] - dt = [_ann for _cat_id in self.params.cat_ids for _ann in self._dts[img_id, cat_id]] - return gt, dt - - def compute_iou(self, img_id, cat_id): - gt, dt = self._get_gt_dt(img_id, cat_id) - - if len(gt) == 0 and len(dt) == 0: - return [] - - # Sort detections in decreasing order of score. - idx = np.argsort([-d["score"] for d in dt], kind="mergesort") - dt = [dt[i] for i in idx] - - # iscrowd = [int(False)] * len(gt) - iscrowd = [int("iscrowd" in g and g["iscrowd"] > 0) for g in gt] - - if self.params.iou_type == "segm": - ann_type = "segmentation" - elif self.params.iou_type == "bbox": - ann_type = "bbox" - else: - raise ValueError("Unknown iou_type for iou computation.") - gt = [g[ann_type] for g in gt] - dt = [d[ann_type] for d in dt] - - # compute iou between each dt and gt region - # will return array of shape len(dt), len(gt) - ious = mask_utils.iou(dt, gt, iscrowd) - return ious - - def evaluate_img_google(self, img_id, cat_id, area_rng): - gt, dt = self._get_gt_dt(img_id, cat_id) - if len(gt) == 0 and len(dt) == 0: - return None - - if len(dt) == 0: - return { - "image_id": img_id, - "category_id": cat_id, - "area_rng": area_rng, - "dt_ids": [], - "dt_matches": np.array([], dtype=np.int32).reshape(1, -1), - "dt_scores": [], - "dt_ignore": np.array([], dtype=np.int32).reshape(1, -1), - "num_gt": len(gt), - } - - no_crowd_inds = [i for i, g in enumerate(gt) if ("iscrowd" not in g) or g["iscrowd"] == 0] - crowd_inds = [i for i, g in enumerate(gt) if "iscrowd" in g and g["iscrowd"] == 1] - dt_idx = np.argsort([-d["score"] for d in dt], kind="mergesort") - - if len(self.ious[img_id, cat_id]) > 0: - ious = self.ious[img_id, cat_id] - iou = ious[:, no_crowd_inds] - iou = iou[dt_idx] - ioa = ious[:, crowd_inds] - ioa = ioa[dt_idx] - else: - iou = np.zeros((len(dt_idx), 0)) - ioa = np.zeros((len(dt_idx), 0)) - scores = np.array([dt[i]["score"] for i in dt_idx]) - - num_detected_boxes = len(dt) - tp_fp_labels = np.zeros(num_detected_boxes, dtype=bool) - is_matched_to_group_of = np.zeros(num_detected_boxes, dtype=bool) - - def compute_match_iou(iou) -> None: - max_overlap_gt_ids = np.argmax(iou, axis=1) - is_gt_detected = np.zeros(iou.shape[1], dtype=bool) - for i in range(num_detected_boxes): - gt_id = max_overlap_gt_ids[i] - is_evaluatable = ( - not tp_fp_labels[i] and iou[i, gt_id] >= 0.5 and not is_matched_to_group_of[i] - ) - if is_evaluatable: - if not is_gt_detected[gt_id]: - tp_fp_labels[i] = True - is_gt_detected[gt_id] = True - - def compute_match_ioa(ioa): - scores_group_of = np.zeros(ioa.shape[1], dtype=float) - tp_fp_labels_group_of = np.ones(ioa.shape[1], dtype=float) - max_overlap_group_of_gt_ids = np.argmax(ioa, axis=1) - for i in range(num_detected_boxes): - gt_id = max_overlap_group_of_gt_ids[i] - is_evaluatable = ( - not tp_fp_labels[i] and ioa[i, gt_id] >= 0.5 and not is_matched_to_group_of[i] - ) - if is_evaluatable: - is_matched_to_group_of[i] = True - scores_group_of[gt_id] = max(scores_group_of[gt_id], scores[i]) - selector = np.where((scores_group_of > 0) & (tp_fp_labels_group_of > 0)) - scores_group_of = scores_group_of[selector] - tp_fp_labels_group_of = tp_fp_labels_group_of[selector] - - return scores_group_of, tp_fp_labels_group_of - - if iou.shape[1] > 0: - compute_match_iou(iou) - - scores_box_group_of = np.ndarray([0], dtype=float) - tp_fp_labels_box_group_of = np.ndarray([0], dtype=float) - - if ioa.shape[1] > 0: - scores_box_group_of, tp_fp_labels_box_group_of = compute_match_ioa(ioa) - - valid_entries = ~is_matched_to_group_of - - scores = np.concatenate((scores[valid_entries], scores_box_group_of)) - tp_fps = np.concatenate( - (tp_fp_labels[valid_entries].astype(float), tp_fp_labels_box_group_of) - ) - - return { - "image_id": img_id, - "category_id": cat_id, - "area_rng": area_rng, - "dt_matches": np.array([1 if x > 0 else 0 for x in tp_fps], dtype=np.int32).reshape( - 1, -1 - ), - "dt_scores": [x for x in scores], - "dt_ignore": np.array([0 for x in scores], dtype=np.int32).reshape(1, -1), - "num_gt": len(gt), - } - - def accumulate(self) -> None: - """Accumulate per image evaluation results and store the result in - self.eval. - """ - self.logger.info("Accumulating evaluation results.") - - if not self.eval_imgs: - self.logger.warn("Please run evaluate first.") - - if self.params.use_cats: - cat_ids = self.params.cat_ids - else: - cat_ids = [-1] - - num_thrs = 1 - num_recalls = 1 - - num_cats = len(cat_ids) - num_area_rngs = 1 - num_imgs = len(self.params.img_ids) - - # -1 for absent categories - precision = -np.ones((num_thrs, num_recalls, num_cats, num_area_rngs)) - recall = -np.ones((num_thrs, num_cats, num_area_rngs)) - - # Initialize dt_pointers - dt_pointers = {} - for cat_idx in range(num_cats): - dt_pointers[cat_idx] = {} - for area_idx in range(num_area_rngs): - dt_pointers[cat_idx][area_idx] = {} - - # Per category evaluation - for cat_idx in range(num_cats): - Nk = cat_idx * num_area_rngs * num_imgs - for area_idx in range(num_area_rngs): - Na = area_idx * num_imgs - E = [self.eval_imgs[Nk + Na + img_idx] for img_idx in range(num_imgs)] - # Remove elements which are None - E = [e for e in E if e is not None] - if len(E) == 0: - continue - - dt_scores = np.concatenate([e["dt_scores"] for e in E], axis=0) - dt_idx = np.argsort(-dt_scores, kind="mergesort") - dt_scores = dt_scores[dt_idx] - dt_m = np.concatenate([e["dt_matches"] for e in E], axis=1)[:, dt_idx] - dt_ig = np.concatenate([e["dt_ignore"] for e in E], axis=1)[:, dt_idx] - - num_gt = sum([e["num_gt"] for e in E]) - if num_gt == 0: - continue - - tps = np.logical_and(dt_m, np.logical_not(dt_ig)) - fps = np.logical_and(np.logical_not(dt_m), np.logical_not(dt_ig)) - tp_sum = np.cumsum(tps, axis=1).astype(dtype=np.float) - fp_sum = np.cumsum(fps, axis=1).astype(dtype=np.float) - - dt_pointers[cat_idx][area_idx] = { - "tps": tps, - "fps": fps, - } - - for iou_thr_idx, (tp, fp) in enumerate(zip(tp_sum, fp_sum, strict=False)): - tp = np.array(tp) - fp = np.array(fp) - num_tp = len(tp) - rc = tp / num_gt - - if num_tp: - recall[iou_thr_idx, cat_idx, area_idx] = rc[-1] - else: - recall[iou_thr_idx, cat_idx, area_idx] = 0 - - # np.spacing(1) ~= eps - pr = tp / (fp + tp + np.spacing(1)) - pr = pr.tolist() - - for i in range(num_tp - 1, 0, -1): - if pr[i] > pr[i - 1]: - pr[i - 1] = pr[i] - - mAP = compute_average_precision( - np.array(pr, np.float).reshape(-1), np.array(rc, np.float).reshape(-1) - ) - precision[iou_thr_idx, :, cat_idx, area_idx] = mAP - - self.eval = { - "params": self.params, - "counts": [num_thrs, num_recalls, num_cats, num_area_rngs], - "date": datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S"), - "precision": precision, - "recall": recall, - "dt_pointers": dt_pointers, - } - - def _summarize(self, summary_type): - s = self.eval["precision"] - if len(s[s > -1]) == 0: - mean_s = -1 - else: - mean_s = np.mean(s[s > -1]) - # print(s.reshape(1, 1, -1, 1)) - return mean_s - - def summarize(self): - """Compute and display summary metrics for evaluation results.""" - if not self.eval: - raise RuntimeError("Please run accumulate() first.") - - self.results["AP50"] = self._summarize("ap") - - def run(self) -> None: - """Wrapper function which calculates the results.""" - self.evaluate() - self.accumulate() - self.summarize() - - def print_results(self) -> None: - template = " {:<18} {} @[ IoU={:<9} | area={:>6s} | maxDets={:>3d} catIds={:>3s}] = {:0.3f}" - - for key, value in self.results.items(): - max_dets = self.params.max_dets - if "AP" in key: - title = "Average Precision" - _type = "(AP)" - else: - title = "Average Recall" - _type = "(AR)" - - if len(key) > 2 and key[2].isdigit(): - iou_thr = float(key[2:]) / 100 - iou = f"{iou_thr:0.2f}" - else: - iou = f"{self.params.iou_thrs[0]:0.2f}:{self.params.iou_thrs[-1]:0.2f}" - - cat_group_name = "all" - area_rng = "all" - - print(template.format(title, _type, iou, area_rng, max_dets, cat_group_name, value)) - - def get_results(self): - if not self.results: - self.logger.warn("results is empty. Call run().") - return self.results - - -class Params: - def __init__(self, iou_type) -> None: - self.img_ids = [] - self.cat_ids = [] - # np.arange causes trouble. the data point on arange is slightly - # larger than the true value - self.iou_thrs = np.linspace( - 0.5, 0.95, int(np.round((0.95 - 0.5) / 0.05)) + 1, endpoint=True - ) - self.google_style = True - # print('Using google style PR curve') - self.iou_thrs = self.iou_thrs[:1] - self.max_dets = 1000 - - self.area_rng = [ - [0**2, 1e5**2], - ] - self.area_rng_lbl = ["all"] - self.use_cats = 1 - self.iou_type = iou_type - - -class OIDEvaluator(DatasetEvaluator): - def __init__(self, dataset_name: str, cfg, distributed, output_dir=None) -> None: - self._distributed = distributed - self._output_dir = output_dir - - self._cpu_device = torch.device("cpu") - self._logger = logging.getLogger(__name__) - - self._metadata = MetadataCatalog.get(dataset_name) - json_file = PathManager.get_local_path(self._metadata.json_file) - self._oid_api = LVIS(json_file) - # Test set json files do not contain annotations (evaluation must be - # performed using the LVIS evaluation server). - self._do_evaluation = len(self._oid_api.get_ann_ids()) > 0 - self._mask_on = cfg.MODEL.MASK_ON - - def reset(self) -> None: - self._predictions = [] - self._oid_results = [] - - def process(self, inputs, outputs) -> None: - for input, output in zip(inputs, outputs, strict=False): - prediction = {"image_id": input["image_id"]} - instances = output["instances"].to(self._cpu_device) - prediction["instances"] = instances_to_coco_json(instances, input["image_id"]) - self._predictions.append(prediction) - - def evaluate(self): - if self._distributed: - comm.synchronize() - self._predictions = comm.gather(self._predictions, dst=0) - self._predictions = list(itertools.chain(*self._predictions)) - - if not comm.is_main_process(): - return - - if len(self._predictions) == 0: - self._logger.warning("[LVISEvaluator] Did not receive valid predictions.") - return {} - - self._logger.info("Preparing results in the OID format ...") - self._oid_results = list(itertools.chain(*[x["instances"] for x in self._predictions])) - - # unmap the category ids for LVIS (from 0-indexed to 1-indexed) - for result in self._oid_results: - result["category_id"] += 1 - - PathManager.mkdirs(self._output_dir) - file_path = os.path.join(self._output_dir, "oid_instances_results.json") - self._logger.info(f"Saving results to {file_path}") - with PathManager.open(file_path, "w") as f: - f.write(json.dumps(self._oid_results)) - f.flush() - - if not self._do_evaluation: - self._logger.info("Annotations are not available for evaluation.") - return - - self._logger.info("Evaluating predictions ...") - self._results = OrderedDict() - res, mAP = _evaluate_predictions_on_oid( - self._oid_api, - file_path, - eval_seg=self._mask_on, - class_names=self._metadata.get("thing_classes"), - ) - self._results["bbox"] = res - mAP_out_path = os.path.join(self._output_dir, "oid_mAP.npy") - self._logger.info("Saving mAP to" + mAP_out_path) - np.save(mAP_out_path, mAP) - return copy.deepcopy(self._results) - - -def _evaluate_predictions_on_oid(oid_gt, oid_results_path, eval_seg: bool=False, class_names: Optional[Sequence[str]]=None): - logger = logging.getLogger(__name__) - - results = {} - oid_eval = OIDEval(oid_gt, oid_results_path, "bbox", expand_pred_label=False) - oid_eval.run() - oid_eval.print_results() - results["AP50"] = oid_eval.get_results()["AP50"] - - if eval_seg: - oid_eval = OIDEval(oid_gt, oid_results_path, "segm", expand_pred_label=False) - oid_eval.run() - oid_eval.print_results() - results["AP50_segm"] = oid_eval.get_results()["AP50"] - else: - oid_eval = OIDEval(oid_gt, oid_results_path, "bbox", expand_pred_label=True) - oid_eval.run() - oid_eval.print_results() - results["AP50_expand"] = oid_eval.get_results()["AP50"] - - mAP = np.zeros(len(class_names)) - 1 - precisions = oid_eval.eval["precision"] - assert len(class_names) == precisions.shape[2] - results_per_category = [] - id2apiid = sorted(oid_gt.get_cat_ids()) - inst_aware_ap, inst_count = 0, 0 - for idx, name in enumerate(class_names): - precision = precisions[:, :, idx, 0] - precision = precision[precision > -1] - ap = np.mean(precision) if precision.size else float("nan") - inst_num = len(oid_gt.get_ann_ids(cat_ids=[id2apiid[idx]])) - if inst_num > 0: - results_per_category.append( - ( - "{} {}".format( - name.replace(" ", "_"), - inst_num if inst_num < 1000 else f"{inst_num / 1000:.1f}k", - ), - float(ap * 100), - ) - ) - inst_aware_ap += inst_num * ap - inst_count += inst_num - mAP[idx] = ap - # logger.info("{} {} {:.2f}".format(name, inst_num, ap * 100)) - inst_aware_ap = inst_aware_ap * 100 / inst_count - N_COLS = min(6, len(results_per_category) * 2) - results_flatten = list(itertools.chain(*results_per_category)) - results_2d = itertools.zip_longest(*[results_flatten[i::N_COLS] for i in range(N_COLS)]) - table = tabulate( - results_2d, - tablefmt="pipe", - floatfmt=".3f", - headers=["category", "AP"] * (N_COLS // 2), - numalign="left", - ) - logger.info("Per-category {} AP: \n".format("bbox") + table) - logger.info("Instance-aware {} AP: {:.4f}".format("bbox", inst_aware_ap)) - - logger.info("Evaluation results for bbox: \n" + create_small_table(results)) - return results, mAP diff --git a/dimos/models/Detic/detic/modeling/backbone/swintransformer.py b/dimos/models/Detic/detic/modeling/backbone/swintransformer.py deleted file mode 100644 index b7da6328e3..0000000000 --- a/dimos/models/Detic/detic/modeling/backbone/swintransformer.py +++ /dev/null @@ -1,825 +0,0 @@ -# -------------------------------------------------------- -# Swin Transformer -# Copyright (c) 2021 Microsoft -# Licensed under The MIT License [see LICENSE for details] -# Written by Ze Liu, Yutong Lin, Yixuan Wei -# -------------------------------------------------------- - -# Copyright (c) Facebook, Inc. and its affiliates. -# Modified by Xingyi Zhou from https://github.com/SwinTransformer/Swin-Transformer-Object-Detection/blob/master/mmdet/models/backbones/swin_transformer.py - - -from centernet.modeling.backbone.bifpn import BiFPN -from centernet.modeling.backbone.fpn_p5 import LastLevelP6P7_P5 -from detectron2.layers import ShapeSpec -from detectron2.modeling.backbone.backbone import Backbone -from detectron2.modeling.backbone.build import BACKBONE_REGISTRY -from detectron2.modeling.backbone.fpn import FPN -import numpy as np -from timm.models.layers import DropPath, to_2tuple, trunc_normal_ -import torch -import torch.nn as nn -import torch.nn.functional as F -import torch.utils.checkpoint as checkpoint -from typing import Optional, Sequence - -# from .checkpoint import load_checkpoint - - -class Mlp(nn.Module): - """Multilayer perceptron.""" - - def __init__( - self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop: float=0.0 - ) -> None: - super().__init__() - out_features = out_features or in_features - hidden_features = hidden_features or in_features - self.fc1 = nn.Linear(in_features, hidden_features) - self.act = act_layer() - self.fc2 = nn.Linear(hidden_features, out_features) - self.drop = nn.Dropout(drop) - - def forward(self, x): - x = self.fc1(x) - x = self.act(x) - x = self.drop(x) - x = self.fc2(x) - x = self.drop(x) - return x - - -def window_partition(x, window_size: int): - """ - Args: - x: (B, H, W, C) - window_size (int): window size - Returns: - windows: (num_windows*B, window_size, window_size, C) - """ - B, H, W, C = x.shape - x = x.view(B, H // window_size, window_size, W // window_size, window_size, C) - windows = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(-1, window_size, window_size, C) - return windows - - -def window_reverse(windows, window_size: int, H, W): - """ - Args: - windows: (num_windows*B, window_size, window_size, C) - window_size (int): Window size - H (int): Height of image - W (int): Width of image - Returns: - x: (B, H, W, C) - """ - B = int(windows.shape[0] / (H * W / window_size / window_size)) - x = windows.view(B, H // window_size, W // window_size, window_size, window_size, -1) - x = x.permute(0, 1, 3, 2, 4, 5).contiguous().view(B, H, W, -1) - return x - - -class WindowAttention(nn.Module): - """Window based multi-head self attention (W-MSA) module with relative position bias. - It supports both of shifted and non-shifted window. - Args: - dim (int): Number of input channels. - window_size (tuple[int]): The height and width of the window. - num_heads (int): Number of attention heads. - qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True - qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set - attn_drop (float, optional): Dropout ratio of attention weight. Default: 0.0 - proj_drop (float, optional): Dropout ratio of output. Default: 0.0 - """ - - def __init__( - self, - dim: int, - window_size: int, - num_heads: int, - qkv_bias: bool=True, - qk_scale=None, - attn_drop: float=0.0, - proj_drop: float=0.0, - ) -> None: - super().__init__() - self.dim = dim - self.window_size = window_size # Wh, Ww - self.num_heads = num_heads - head_dim = dim // num_heads - self.scale = qk_scale or head_dim**-0.5 - - # define a parameter table of relative position bias - self.relative_position_bias_table = nn.Parameter( - torch.zeros((2 * window_size[0] - 1) * (2 * window_size[1] - 1), num_heads) - ) # 2*Wh-1 * 2*Ww-1, nH - - # get pair-wise relative position index for each token inside the window - coords_h = torch.arange(self.window_size[0]) - coords_w = torch.arange(self.window_size[1]) - coords = torch.stack(torch.meshgrid([coords_h, coords_w])) # 2, Wh, Ww - coords_flatten = torch.flatten(coords, 1) # 2, Wh*Ww - relative_coords = coords_flatten[:, :, None] - coords_flatten[:, None, :] # 2, Wh*Ww, Wh*Ww - relative_coords = relative_coords.permute(1, 2, 0).contiguous() # Wh*Ww, Wh*Ww, 2 - relative_coords[:, :, 0] += self.window_size[0] - 1 # shift to start from 0 - relative_coords[:, :, 1] += self.window_size[1] - 1 - relative_coords[:, :, 0] *= 2 * self.window_size[1] - 1 - relative_position_index = relative_coords.sum(-1) # Wh*Ww, Wh*Ww - self.register_buffer("relative_position_index", relative_position_index) - - self.qkv = nn.Linear(dim, dim * 3, bias=qkv_bias) - self.attn_drop = nn.Dropout(attn_drop) - self.proj = nn.Linear(dim, dim) - self.proj_drop = nn.Dropout(proj_drop) - - trunc_normal_(self.relative_position_bias_table, std=0.02) - self.softmax = nn.Softmax(dim=-1) - - def forward(self, x, mask=None): - """Forward function. - Args: - x: input features with shape of (num_windows*B, N, C) - mask: (0/-inf) mask with shape of (num_windows, Wh*Ww, Wh*Ww) or None - """ - B_, N, C = x.shape - qkv = ( - self.qkv(x) - .reshape(B_, N, 3, self.num_heads, C // self.num_heads) - .permute(2, 0, 3, 1, 4) - ) - q, k, v = qkv[0], qkv[1], qkv[2] # make torchscript happy (cannot use tensor as tuple) - - q = q * self.scale - attn = q @ k.transpose(-2, -1) - - relative_position_bias = self.relative_position_bias_table[ - self.relative_position_index.view(-1) - ].view( - self.window_size[0] * self.window_size[1], self.window_size[0] * self.window_size[1], -1 - ) # Wh*Ww,Wh*Ww,nH - relative_position_bias = relative_position_bias.permute( - 2, 0, 1 - ).contiguous() # nH, Wh*Ww, Wh*Ww - attn = attn + relative_position_bias.unsqueeze(0) - - if mask is not None: - nW = mask.shape[0] - attn = attn.view(B_ // nW, nW, self.num_heads, N, N) + mask.unsqueeze(1).unsqueeze(0) - attn = attn.view(-1, self.num_heads, N, N) - attn = self.softmax(attn) - else: - attn = self.softmax(attn) - - attn = self.attn_drop(attn) - - x = (attn @ v).transpose(1, 2).reshape(B_, N, C) - x = self.proj(x) - x = self.proj_drop(x) - return x - - -class SwinTransformerBlock(nn.Module): - """Swin Transformer Block. - Args: - dim (int): Number of input channels. - num_heads (int): Number of attention heads. - window_size (int): Window size. - shift_size (int): Shift size for SW-MSA. - mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. - qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True - qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set. - drop (float, optional): Dropout rate. Default: 0.0 - attn_drop (float, optional): Attention dropout rate. Default: 0.0 - drop_path (float, optional): Stochastic depth rate. Default: 0.0 - act_layer (nn.Module, optional): Activation layer. Default: nn.GELU - norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm - """ - - def __init__( - self, - dim: int, - num_heads: int, - window_size: int=7, - shift_size: int=0, - mlp_ratio: float=4.0, - qkv_bias: bool=True, - qk_scale=None, - drop: float=0.0, - attn_drop: float=0.0, - drop_path: float=0.0, - act_layer=nn.GELU, - norm_layer=nn.LayerNorm, - ) -> None: - super().__init__() - self.dim = dim - self.num_heads = num_heads - self.window_size = window_size - self.shift_size = shift_size - self.mlp_ratio = mlp_ratio - assert 0 <= self.shift_size < self.window_size, "shift_size must in 0-window_size" - - self.norm1 = norm_layer(dim) - self.attn = WindowAttention( - dim, - window_size=to_2tuple(self.window_size), - num_heads=num_heads, - qkv_bias=qkv_bias, - qk_scale=qk_scale, - attn_drop=attn_drop, - proj_drop=drop, - ) - - self.drop_path = DropPath(drop_path) if drop_path > 0.0 else nn.Identity() - self.norm2 = norm_layer(dim) - mlp_hidden_dim = int(dim * mlp_ratio) - self.mlp = Mlp( - in_features=dim, hidden_features=mlp_hidden_dim, act_layer=act_layer, drop=drop - ) - - self.H = None - self.W = None - - def forward(self, x, mask_matrix): - """Forward function. - Args: - x: Input feature, tensor size (B, H*W, C). - H, W: Spatial resolution of the input feature. - mask_matrix: Attention mask for cyclic shift. - """ - B, L, C = x.shape - H, W = self.H, self.W - assert L == H * W, "input feature has wrong size" - - shortcut = x - x = self.norm1(x) - x = x.view(B, H, W, C) - - # pad feature maps to multiples of window size - pad_l = pad_t = 0 - pad_r = (self.window_size - W % self.window_size) % self.window_size - pad_b = (self.window_size - H % self.window_size) % self.window_size - x = F.pad(x, (0, 0, pad_l, pad_r, pad_t, pad_b)) - _, Hp, Wp, _ = x.shape - - # cyclic shift - if self.shift_size > 0: - shifted_x = torch.roll(x, shifts=(-self.shift_size, -self.shift_size), dims=(1, 2)) - attn_mask = mask_matrix - else: - shifted_x = x - attn_mask = None - - # partition windows - x_windows = window_partition( - shifted_x, self.window_size - ) # nW*B, window_size, window_size, C - x_windows = x_windows.view( - -1, self.window_size * self.window_size, C - ) # nW*B, window_size*window_size, C - - # W-MSA/SW-MSA - attn_windows = self.attn(x_windows, mask=attn_mask) # nW*B, window_size*window_size, C - - # merge windows - attn_windows = attn_windows.view(-1, self.window_size, self.window_size, C) - shifted_x = window_reverse(attn_windows, self.window_size, Hp, Wp) # B H' W' C - - # reverse cyclic shift - if self.shift_size > 0: - x = torch.roll(shifted_x, shifts=(self.shift_size, self.shift_size), dims=(1, 2)) - else: - x = shifted_x - - if pad_r > 0 or pad_b > 0: - x = x[:, :H, :W, :].contiguous() - - x = x.view(B, H * W, C) - - # FFN - x = shortcut + self.drop_path(x) - x = x + self.drop_path(self.mlp(self.norm2(x))) - - return x - - -class PatchMerging(nn.Module): - """Patch Merging Layer - Args: - dim (int): Number of input channels. - norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm - """ - - def __init__(self, dim: int, norm_layer=nn.LayerNorm) -> None: - super().__init__() - self.dim = dim - self.reduction = nn.Linear(4 * dim, 2 * dim, bias=False) - self.norm = norm_layer(4 * dim) - - def forward(self, x, H, W): - """Forward function. - Args: - x: Input feature, tensor size (B, H*W, C). - H, W: Spatial resolution of the input feature. - """ - B, L, C = x.shape - assert L == H * W, "input feature has wrong size" - - x = x.view(B, H, W, C) - - # padding - pad_input = (H % 2 == 1) or (W % 2 == 1) - if pad_input: - x = F.pad(x, (0, 0, 0, W % 2, 0, H % 2)) - - x0 = x[:, 0::2, 0::2, :] # B H/2 W/2 C - x1 = x[:, 1::2, 0::2, :] # B H/2 W/2 C - x2 = x[:, 0::2, 1::2, :] # B H/2 W/2 C - x3 = x[:, 1::2, 1::2, :] # B H/2 W/2 C - x = torch.cat([x0, x1, x2, x3], -1) # B H/2 W/2 4*C - x = x.view(B, -1, 4 * C) # B H/2*W/2 4*C - - x = self.norm(x) - x = self.reduction(x) - - return x - - -class BasicLayer(nn.Module): - """A basic Swin Transformer layer for one stage. - Args: - dim (int): Number of feature channels - depth (int): Depths of this stage. - num_heads (int): Number of attention head. - window_size (int): Local window size. Default: 7. - mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4. - qkv_bias (bool, optional): If True, add a learnable bias to query, key, value. Default: True - qk_scale (float | None, optional): Override default qk scale of head_dim ** -0.5 if set. - drop (float, optional): Dropout rate. Default: 0.0 - attn_drop (float, optional): Attention dropout rate. Default: 0.0 - drop_path (float | tuple[float], optional): Stochastic depth rate. Default: 0.0 - norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm - downsample (nn.Module | None, optional): Downsample layer at the end of the layer. Default: None - use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. - """ - - def __init__( - self, - dim: int, - depth: int, - num_heads: int, - window_size: int=7, - mlp_ratio: float=4.0, - qkv_bias: bool=True, - qk_scale=None, - drop: float=0.0, - attn_drop: float=0.0, - drop_path: float=0.0, - norm_layer=nn.LayerNorm, - downsample=None, - use_checkpoint: bool=False, - ) -> None: - super().__init__() - self.window_size = window_size - self.shift_size = window_size // 2 - self.depth = depth - self.use_checkpoint = use_checkpoint - - # build blocks - self.blocks = nn.ModuleList( - [ - SwinTransformerBlock( - dim=dim, - num_heads=num_heads, - window_size=window_size, - shift_size=0 if (i % 2 == 0) else window_size // 2, - mlp_ratio=mlp_ratio, - qkv_bias=qkv_bias, - qk_scale=qk_scale, - drop=drop, - attn_drop=attn_drop, - drop_path=drop_path[i] if isinstance(drop_path, list) else drop_path, - norm_layer=norm_layer, - ) - for i in range(depth) - ] - ) - - # patch merging layer - if downsample is not None: - self.downsample = downsample(dim=dim, norm_layer=norm_layer) - else: - self.downsample = None - - def forward(self, x, H, W): - """Forward function. - Args: - x: Input feature, tensor size (B, H*W, C). - H, W: Spatial resolution of the input feature. - """ - - # calculate attention mask for SW-MSA - Hp = int(np.ceil(H / self.window_size)) * self.window_size - Wp = int(np.ceil(W / self.window_size)) * self.window_size - img_mask = torch.zeros((1, Hp, Wp, 1), device=x.device) # 1 Hp Wp 1 - h_slices = ( - slice(0, -self.window_size), - slice(-self.window_size, -self.shift_size), - slice(-self.shift_size, None), - ) - w_slices = ( - slice(0, -self.window_size), - slice(-self.window_size, -self.shift_size), - slice(-self.shift_size, None), - ) - cnt = 0 - for h in h_slices: - for w in w_slices: - img_mask[:, h, w, :] = cnt - cnt += 1 - - mask_windows = window_partition( - img_mask, self.window_size - ) # nW, window_size, window_size, 1 - mask_windows = mask_windows.view(-1, self.window_size * self.window_size) - attn_mask = mask_windows.unsqueeze(1) - mask_windows.unsqueeze(2) - attn_mask = attn_mask.masked_fill(attn_mask != 0, (-100.0)).masked_fill( - attn_mask == 0, 0.0 - ) - - for blk in self.blocks: - blk.H, blk.W = H, W - if self.use_checkpoint: - x = checkpoint.checkpoint(blk, x, attn_mask) - else: - x = blk(x, attn_mask) - if self.downsample is not None: - x_down = self.downsample(x, H, W) - Wh, Ww = (H + 1) // 2, (W + 1) // 2 - return x, H, W, x_down, Wh, Ww - else: - return x, H, W, x, H, W - - -class PatchEmbed(nn.Module): - """Image to Patch Embedding - Args: - patch_size (int): Patch token size. Default: 4. - in_chans (int): Number of input image channels. Default: 3. - embed_dim (int): Number of linear projection output channels. Default: 96. - norm_layer (nn.Module, optional): Normalization layer. Default: None - """ - - def __init__(self, patch_size: int=4, in_chans: int=3, embed_dim: int=96, norm_layer=None) -> None: - super().__init__() - patch_size = to_2tuple(patch_size) - self.patch_size = patch_size - - self.in_chans = in_chans - self.embed_dim = embed_dim - - self.proj = nn.Conv2d(in_chans, embed_dim, kernel_size=patch_size, stride=patch_size) - if norm_layer is not None: - self.norm = norm_layer(embed_dim) - else: - self.norm = None - - def forward(self, x): - """Forward function.""" - # padding - _, _, H, W = x.size() - if W % self.patch_size[1] != 0: - x = F.pad(x, (0, self.patch_size[1] - W % self.patch_size[1])) - if H % self.patch_size[0] != 0: - x = F.pad(x, (0, 0, 0, self.patch_size[0] - H % self.patch_size[0])) - - x = self.proj(x) # B C Wh Ww - if self.norm is not None: - Wh, Ww = x.size(2), x.size(3) - x = x.flatten(2).transpose(1, 2) - x = self.norm(x) - x = x.transpose(1, 2).view(-1, self.embed_dim, Wh, Ww) - - return x - - -class SwinTransformer(Backbone): - """Swin Transformer backbone. - A PyTorch impl of : `Swin Transformer: Hierarchical Vision Transformer using Shifted Windows` - - https://arxiv.org/pdf/2103.14030 - Args: - pretrain_img_size (int): Input image size for training the pretrained model, - used in absolute postion embedding. Default 224. - patch_size (int | tuple(int)): Patch size. Default: 4. - in_chans (int): Number of input image channels. Default: 3. - embed_dim (int): Number of linear projection output channels. Default: 96. - depths (tuple[int]): Depths of each Swin Transformer stage. - num_heads (tuple[int]): Number of attention head of each stage. - window_size (int): Window size. Default: 7. - mlp_ratio (float): Ratio of mlp hidden dim to embedding dim. Default: 4. - qkv_bias (bool): If True, add a learnable bias to query, key, value. Default: True - qk_scale (float): Override default qk scale of head_dim ** -0.5 if set. - drop_rate (float): Dropout rate. - attn_drop_rate (float): Attention dropout rate. Default: 0. - drop_path_rate (float): Stochastic depth rate. Default: 0.2. - norm_layer (nn.Module): Normalization layer. Default: nn.LayerNorm. - ape (bool): If True, add absolute position embedding to the patch embedding. Default: False. - patch_norm (bool): If True, add normalization after patch embedding. Default: True. - out_indices (Sequence[int]): Output from which stages. - frozen_stages (int): Stages to be frozen (stop grad and set eval mode). - -1 means not freezing any parameters. - use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. - """ - - def __init__( - self, - pretrain_img_size: int=224, - patch_size: int=4, - in_chans: int=3, - embed_dim: int=96, - depths: Optional[Sequence[int]]=None, - num_heads: Optional[int]=None, - window_size: int=7, - mlp_ratio: float=4.0, - qkv_bias: bool=True, - qk_scale=None, - drop_rate: float=0.0, - attn_drop_rate: float=0.0, - drop_path_rate: float=0.2, - norm_layer=nn.LayerNorm, - ape: bool=False, - patch_norm: bool=True, - out_indices=(0, 1, 2, 3), - frozen_stages=-1, - use_checkpoint: bool=False, - ) -> None: - if num_heads is None: - num_heads = [3, 6, 12, 24] - if depths is None: - depths = [2, 2, 6, 2] - super().__init__() - - self.pretrain_img_size = pretrain_img_size - self.num_layers = len(depths) - self.embed_dim = embed_dim - self.ape = ape - self.patch_norm = patch_norm - self.out_indices = out_indices - self.frozen_stages = frozen_stages - - # split image into non-overlapping patches - self.patch_embed = PatchEmbed( - patch_size=patch_size, - in_chans=in_chans, - embed_dim=embed_dim, - norm_layer=norm_layer if self.patch_norm else None, - ) - - # absolute position embedding - if self.ape: - pretrain_img_size = to_2tuple(pretrain_img_size) - patch_size = to_2tuple(patch_size) - patches_resolution = [ - pretrain_img_size[0] // patch_size[0], - pretrain_img_size[1] // patch_size[1], - ] - - self.absolute_pos_embed = nn.Parameter( - torch.zeros(1, embed_dim, patches_resolution[0], patches_resolution[1]) - ) - trunc_normal_(self.absolute_pos_embed, std=0.02) - - self.pos_drop = nn.Dropout(p=drop_rate) - - # stochastic depth - dpr = [ - x.item() for x in torch.linspace(0, drop_path_rate, sum(depths)) - ] # stochastic depth decay rule - - # build layers - self.layers = nn.ModuleList() - for i_layer in range(self.num_layers): - layer = BasicLayer( - dim=int(embed_dim * 2**i_layer), - depth=depths[i_layer], - num_heads=num_heads[i_layer], - window_size=window_size, - mlp_ratio=mlp_ratio, - qkv_bias=qkv_bias, - qk_scale=qk_scale, - drop=drop_rate, - attn_drop=attn_drop_rate, - drop_path=dpr[sum(depths[:i_layer]) : sum(depths[: i_layer + 1])], - norm_layer=norm_layer, - downsample=PatchMerging if (i_layer < self.num_layers - 1) else None, - use_checkpoint=use_checkpoint, - ) - self.layers.append(layer) - - num_features = [int(embed_dim * 2**i) for i in range(self.num_layers)] - self.num_features = num_features - - # add a norm layer for each output - for i_layer in out_indices: - layer = norm_layer(num_features[i_layer]) - layer_name = f"norm{i_layer}" - self.add_module(layer_name, layer) - - self._freeze_stages() - self._out_features = [f"swin{i}" for i in self.out_indices] - self._out_feature_channels = { - f"swin{i}": self.embed_dim * 2**i for i in self.out_indices - } - self._out_feature_strides = {f"swin{i}": 2 ** (i + 2) for i in self.out_indices} - self._size_devisibility = 32 - - def _freeze_stages(self) -> None: - if self.frozen_stages >= 0: - self.patch_embed.eval() - for param in self.patch_embed.parameters(): - param.requires_grad = False - - if self.frozen_stages >= 1 and self.ape: - self.absolute_pos_embed.requires_grad = False - - if self.frozen_stages >= 2: - self.pos_drop.eval() - for i in range(0, self.frozen_stages - 1): - m = self.layers[i] - m.eval() - for param in m.parameters(): - param.requires_grad = False - - def init_weights(self, pretrained: Optional[bool]=None): - """Initialize the weights in backbone. - Args: - pretrained (str, optional): Path to pre-trained weights. - Defaults to None. - """ - - def _init_weights(m) -> None: - if isinstance(m, nn.Linear): - trunc_normal_(m.weight, std=0.02) - if isinstance(m, nn.Linear) and m.bias is not None: - nn.init.constant_(m.bias, 0) - elif isinstance(m, nn.LayerNorm): - nn.init.constant_(m.bias, 0) - nn.init.constant_(m.weight, 1.0) - - if isinstance(pretrained, str): - self.apply(_init_weights) - # load_checkpoint(self, pretrained, strict=False) - elif pretrained is None: - self.apply(_init_weights) - else: - raise TypeError("pretrained must be a str or None") - - def forward(self, x): - """Forward function.""" - x = self.patch_embed(x) - - Wh, Ww = x.size(2), x.size(3) - if self.ape: - # interpolate the position embedding to the corresponding size - absolute_pos_embed = F.interpolate( - self.absolute_pos_embed, size=(Wh, Ww), mode="bicubic" - ) - x = (x + absolute_pos_embed).flatten(2).transpose(1, 2) # B Wh*Ww C - else: - x = x.flatten(2).transpose(1, 2) - x = self.pos_drop(x) - - # outs = [] - outs = {} - for i in range(self.num_layers): - layer = self.layers[i] - x_out, H, W, x, Wh, Ww = layer(x, Wh, Ww) - - if i in self.out_indices: - norm_layer = getattr(self, f"norm{i}") - x_out = norm_layer(x_out) - - out = x_out.view(-1, H, W, self.num_features[i]).permute(0, 3, 1, 2).contiguous() - # outs.append(out) - outs[f"swin{i}"] = out - - return outs - - def train(self, mode: bool=True) -> None: - """Convert the model into training mode while keep layers freezed.""" - super().train(mode) - self._freeze_stages() - - -size2config = { - "T": { - "window_size": 7, - "embed_dim": 96, - "depth": [2, 2, 6, 2], - "num_heads": [3, 6, 12, 24], - "drop_path_rate": 0.2, - "pretrained": "models/swin_tiny_patch4_window7_224.pth", - }, - "S": { - "window_size": 7, - "embed_dim": 96, - "depth": [2, 2, 18, 2], - "num_heads": [3, 6, 12, 24], - "drop_path_rate": 0.2, - "pretrained": "models/swin_small_patch4_window7_224.pth", - }, - "B": { - "window_size": 7, - "embed_dim": 128, - "depth": [2, 2, 18, 2], - "num_heads": [4, 8, 16, 32], - "drop_path_rate": 0.3, - "pretrained": "models/swin_base_patch4_window7_224.pth", - }, - "B-22k": { - "window_size": 7, - "embed_dim": 128, - "depth": [2, 2, 18, 2], - "num_heads": [4, 8, 16, 32], - "drop_path_rate": 0.3, - "pretrained": "models/swin_base_patch4_window7_224_22k.pth", - }, - "B-22k-384": { - "window_size": 12, - "embed_dim": 128, - "depth": [2, 2, 18, 2], - "num_heads": [4, 8, 16, 32], - "drop_path_rate": 0.3, - "pretrained": "models/swin_base_patch4_window12_384_22k.pth", - }, - "L-22k": { - "window_size": 7, - "embed_dim": 192, - "depth": [2, 2, 18, 2], - "num_heads": [6, 12, 24, 48], - "drop_path_rate": 0.3, # TODO (xingyi): this is unclear - "pretrained": "models/swin_large_patch4_window7_224_22k.pth", - }, - "L-22k-384": { - "window_size": 12, - "embed_dim": 192, - "depth": [2, 2, 18, 2], - "num_heads": [6, 12, 24, 48], - "drop_path_rate": 0.3, # TODO (xingyi): this is unclear - "pretrained": "models/swin_large_patch4_window12_384_22k.pth", - }, -} - - -@BACKBONE_REGISTRY.register() -def build_swintransformer_backbone(cfg, input_shape): - """ """ - config = size2config[cfg.MODEL.SWIN.SIZE] - out_indices = cfg.MODEL.SWIN.OUT_FEATURES - model = SwinTransformer( - embed_dim=config["embed_dim"], - window_size=config["window_size"], - depths=config["depth"], - num_heads=config["num_heads"], - drop_path_rate=config["drop_path_rate"], - out_indices=out_indices, - frozen_stages=-1, - use_checkpoint=cfg.MODEL.SWIN.USE_CHECKPOINT, - ) - # print('Initializing', config['pretrained']) - model.init_weights(config["pretrained"]) - return model - - -@BACKBONE_REGISTRY.register() -def build_swintransformer_fpn_backbone(cfg, input_shape: ShapeSpec): - """ """ - bottom_up = build_swintransformer_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=LastLevelP6P7_P5(out_channels, out_channels), - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - return backbone - - -@BACKBONE_REGISTRY.register() -def build_swintransformer_bifpn_backbone(cfg, input_shape: ShapeSpec): - """ """ - bottom_up = build_swintransformer_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - backbone = BiFPN( - cfg=cfg, - bottom_up=bottom_up, - in_features=in_features, - out_channels=cfg.MODEL.BIFPN.OUT_CHANNELS, - norm=cfg.MODEL.BIFPN.NORM, - num_levels=cfg.MODEL.BIFPN.NUM_LEVELS, - num_bifpn=cfg.MODEL.BIFPN.NUM_BIFPN, - separable_conv=cfg.MODEL.BIFPN.SEPARABLE_CONV, - ) - return backbone diff --git a/dimos/models/Detic/detic/modeling/backbone/timm.py b/dimos/models/Detic/detic/modeling/backbone/timm.py deleted file mode 100644 index a15e03f875..0000000000 --- a/dimos/models/Detic/detic/modeling/backbone/timm.py +++ /dev/null @@ -1,217 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. -import copy - -from detectron2.layers.batch_norm import FrozenBatchNorm2d -from detectron2.modeling.backbone import FPN, Backbone -from detectron2.modeling.backbone.build import BACKBONE_REGISTRY -import fvcore.nn.weight_init as weight_init -from timm import create_model -from timm.models.convnext import ConvNeXt, checkpoint_filter_fn, default_cfgs -from timm.models.helpers import build_model_with_cfg -from timm.models.registry import register_model -from timm.models.resnet import Bottleneck, ResNet, default_cfgs as default_cfgs_resnet -import torch -from torch import nn -import torch.nn.functional as F - - -@register_model -def convnext_tiny_21k(pretrained: bool=False, **kwargs): - model_args = dict(depths=(3, 3, 9, 3), dims=(96, 192, 384, 768), **kwargs) - cfg = default_cfgs["convnext_tiny"] - cfg["url"] = "https://dl.fbaipublicfiles.com/convnext/convnext_tiny_22k_224.pth" - model = build_model_with_cfg( - ConvNeXt, - "convnext_tiny", - pretrained, - default_cfg=cfg, - pretrained_filter_fn=checkpoint_filter_fn, - feature_cfg=dict(out_indices=(0, 1, 2, 3), flatten_sequential=True), - **model_args, - ) - return model - - -class CustomResNet(ResNet): - def __init__(self, **kwargs) -> None: - self.out_indices = kwargs.pop("out_indices") - super().__init__(**kwargs) - - def forward(self, x): - x = self.conv1(x) - x = self.bn1(x) - x = self.act1(x) - x = self.maxpool(x) - ret = [x] - x = self.layer1(x) - ret.append(x) - x = self.layer2(x) - ret.append(x) - x = self.layer3(x) - ret.append(x) - x = self.layer4(x) - ret.append(x) - return [ret[i] for i in self.out_indices] - - def load_pretrained(self, cached_file) -> None: - data = torch.load(cached_file, map_location="cpu") - if "state_dict" in data: - self.load_state_dict(data["state_dict"]) - else: - self.load_state_dict(data) - - -model_params = { - "resnet50_in21k": dict(block=Bottleneck, layers=[3, 4, 6, 3]), -} - - -def create_timm_resnet(variant, out_indices, pretrained: bool=False, **kwargs): - params = model_params[variant] - default_cfgs_resnet["resnet50_in21k"] = copy.deepcopy(default_cfgs_resnet["resnet50"]) - default_cfgs_resnet["resnet50_in21k"]["url"] = ( - "https://miil-public-eu.oss-eu-central-1.aliyuncs.com/model-zoo/ImageNet_21K_P/models/resnet50_miil_21k.pth" - ) - default_cfgs_resnet["resnet50_in21k"]["num_classes"] = 11221 - - return build_model_with_cfg( - CustomResNet, - variant, - pretrained, - default_cfg=default_cfgs_resnet[variant], - out_indices=out_indices, - pretrained_custom_load=True, - **params, - **kwargs, - ) - - -class LastLevelP6P7_P5(nn.Module): - """ """ - - def __init__(self, in_channels, out_channels) -> None: - super().__init__() - self.num_levels = 2 - self.in_feature = "p5" - self.p6 = nn.Conv2d(in_channels, out_channels, 3, 2, 1) - self.p7 = nn.Conv2d(out_channels, out_channels, 3, 2, 1) - for module in [self.p6, self.p7]: - weight_init.c2_xavier_fill(module) - - def forward(self, c5): - p6 = self.p6(c5) - p7 = self.p7(F.relu(p6)) - return [p6, p7] - - -def freeze_module(x): - """ """ - for p in x.parameters(): - p.requires_grad = False - FrozenBatchNorm2d.convert_frozen_batchnorm(x) - return x - - -class TIMM(Backbone): - def __init__(self, base_name: str, out_levels, freeze_at: int=0, norm: str="FrozenBN", pretrained: bool=False) -> None: - super().__init__() - out_indices = [x - 1 for x in out_levels] - if base_name in model_params: - self.base = create_timm_resnet(base_name, out_indices=out_indices, pretrained=False) - elif "eff" in base_name or "resnet" in base_name or "regnet" in base_name: - self.base = create_model( - base_name, features_only=True, out_indices=out_indices, pretrained=pretrained - ) - elif "convnext" in base_name: - drop_path_rate = 0.2 if ("tiny" in base_name or "small" in base_name) else 0.3 - self.base = create_model( - base_name, - features_only=True, - out_indices=out_indices, - pretrained=pretrained, - drop_path_rate=drop_path_rate, - ) - else: - assert 0, base_name - feature_info = [ - dict(num_chs=f["num_chs"], reduction=f["reduction"]) - for i, f in enumerate(self.base.feature_info) - ] - self._out_features = [f"layer{x}" for x in out_levels] - self._out_feature_channels = { - f"layer{l}": feature_info[l - 1]["num_chs"] for l in out_levels - } - self._out_feature_strides = { - f"layer{l}": feature_info[l - 1]["reduction"] for l in out_levels - } - self._size_divisibility = max(self._out_feature_strides.values()) - if "resnet" in base_name: - self.freeze(freeze_at) - if norm == "FrozenBN": - self = FrozenBatchNorm2d.convert_frozen_batchnorm(self) - - def freeze(self, freeze_at: int=0) -> None: - """ """ - if freeze_at >= 1: - print("Frezing", self.base.conv1) - self.base.conv1 = freeze_module(self.base.conv1) - if freeze_at >= 2: - print("Frezing", self.base.layer1) - self.base.layer1 = freeze_module(self.base.layer1) - - def forward(self, x): - features = self.base(x) - ret = {k: v for k, v in zip(self._out_features, features, strict=False)} - return ret - - @property - def size_divisibility(self): - return self._size_divisibility - - -@BACKBONE_REGISTRY.register() -def build_timm_backbone(cfg, input_shape): - model = TIMM( - cfg.MODEL.TIMM.BASE_NAME, - cfg.MODEL.TIMM.OUT_LEVELS, - freeze_at=cfg.MODEL.TIMM.FREEZE_AT, - norm=cfg.MODEL.TIMM.NORM, - pretrained=cfg.MODEL.TIMM.PRETRAINED, - ) - return model - - -@BACKBONE_REGISTRY.register() -def build_p67_timm_fpn_backbone(cfg, input_shape): - """ """ - bottom_up = build_timm_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=LastLevelP6P7_P5(out_channels, out_channels), - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - return backbone - - -@BACKBONE_REGISTRY.register() -def build_p35_timm_fpn_backbone(cfg, input_shape): - """ """ - bottom_up = build_timm_backbone(cfg, input_shape) - - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=None, - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - return backbone diff --git a/dimos/models/Detic/detic/modeling/debug.py b/dimos/models/Detic/detic/modeling/debug.py deleted file mode 100644 index f37849019e..0000000000 --- a/dimos/models/Detic/detic/modeling/debug.py +++ /dev/null @@ -1,408 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import os - -import cv2 -import numpy as np -import torch -import torch.nn.functional as F -from typing import Optional, Sequence - -COLORS = ((np.random.rand(1300, 3) * 0.4 + 0.6) * 255).astype(np.uint8).reshape(1300, 1, 1, 3) - - -def _get_color_image(heatmap): - heatmap = heatmap.reshape(heatmap.shape[0], heatmap.shape[1], heatmap.shape[2], 1) - if heatmap.shape[0] == 1: - color_map = ( - (heatmap * np.ones((1, 1, 1, 3), np.uint8) * 255).max(axis=0).astype(np.uint8) - ) # H, W, 3 - else: - color_map = (heatmap * COLORS[: heatmap.shape[0]]).max(axis=0).astype(np.uint8) # H, W, 3 - - return color_map - - -def _blend_image(image, color_map, a: float=0.7): - color_map = cv2.resize(color_map, (image.shape[1], image.shape[0])) - ret = np.clip(image * (1 - a) + color_map * a, 0, 255).astype(np.uint8) - return ret - - -def _blend_image_heatmaps(image, color_maps, a: float=0.7): - merges = np.zeros((image.shape[0], image.shape[1], 3), np.float32) - for color_map in color_maps: - color_map = cv2.resize(color_map, (image.shape[1], image.shape[0])) - merges = np.maximum(merges, color_map) - ret = np.clip(image * (1 - a) + merges * a, 0, 255).astype(np.uint8) - return ret - - -def _decompose_level(x, shapes_per_level, N): - """ - x: LNHiWi x C - """ - x = x.view(x.shape[0], -1) - ret = [] - st = 0 - for l in range(len(shapes_per_level)): - ret.append([]) - h = shapes_per_level[l][0].int().item() - w = shapes_per_level[l][1].int().item() - for i in range(N): - ret[l].append(x[st + h * w * i : st + h * w * (i + 1)].view(h, w, -1).permute(2, 0, 1)) - st += h * w * N - return ret - - -def _imagelist_to_tensor(images): - images = [x for x in images] - image_sizes = [x.shape[-2:] for x in images] - h = max([size[0] for size in image_sizes]) - w = max([size[1] for size in image_sizes]) - S = 32 - h, w = ((h - 1) // S + 1) * S, ((w - 1) // S + 1) * S - images = [F.pad(x, (0, w - x.shape[2], 0, h - x.shape[1], 0, 0)) for x in images] - images = torch.stack(images) - return images - - -def _ind2il(ind, shapes_per_level, N): - r = ind - l = 0 - S = 0 - while r - S >= N * shapes_per_level[l][0] * shapes_per_level[l][1]: - S += N * shapes_per_level[l][0] * shapes_per_level[l][1] - l += 1 - i = (r - S) // (shapes_per_level[l][0] * shapes_per_level[l][1]) - return i, l - - -def debug_train( - images, - gt_instances, - flattened_hms, - reg_targets, - labels: Sequence[str], - pos_inds, - shapes_per_level, - locations, - strides: Sequence[int], -) -> None: - """ - images: N x 3 x H x W - flattened_hms: LNHiWi x C - shapes_per_level: L x 2 [(H_i, W_i)] - locations: LNHiWi x 2 - """ - reg_inds = torch.nonzero(reg_targets.max(dim=1)[0] > 0).squeeze(1) - N = len(images) - images = _imagelist_to_tensor(images) - repeated_locations = [torch.cat([loc] * N, dim=0) for loc in locations] - locations = torch.cat(repeated_locations, dim=0) - gt_hms = _decompose_level(flattened_hms, shapes_per_level, N) - masks = flattened_hms.new_zeros((flattened_hms.shape[0], 1)) - masks[pos_inds] = 1 - masks = _decompose_level(masks, shapes_per_level, N) - for i in range(len(images)): - image = images[i].detach().cpu().numpy().transpose(1, 2, 0) - color_maps = [] - for l in range(len(gt_hms)): - color_map = _get_color_image(gt_hms[l][i].detach().cpu().numpy()) - color_maps.append(color_map) - cv2.imshow(f"gthm_{l}", color_map) - blend = _blend_image_heatmaps(image.copy(), color_maps) - if gt_instances is not None: - bboxes = gt_instances[i].gt_boxes.tensor - for j in range(len(bboxes)): - bbox = bboxes[j] - cv2.rectangle( - blend, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - (0, 0, 255), - 3, - cv2.LINE_AA, - ) - - for j in range(len(pos_inds)): - image_id, l = _ind2il(pos_inds[j], shapes_per_level, N) - if image_id != i: - continue - loc = locations[pos_inds[j]] - cv2.drawMarker( - blend, (int(loc[0]), int(loc[1])), (0, 255, 255), markerSize=(l + 1) * 16 - ) - - for j in range(len(reg_inds)): - image_id, l = _ind2il(reg_inds[j], shapes_per_level, N) - if image_id != i: - continue - ltrb = reg_targets[reg_inds[j]] - ltrb *= strides[l] - loc = locations[reg_inds[j]] - bbox = [(loc[0] - ltrb[0]), (loc[1] - ltrb[1]), (loc[0] + ltrb[2]), (loc[1] + ltrb[3])] - cv2.rectangle( - blend, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - (255, 0, 0), - 1, - cv2.LINE_AA, - ) - cv2.circle(blend, (int(loc[0]), int(loc[1])), 2, (255, 0, 0), -1) - - cv2.imshow("blend", blend) - cv2.waitKey() - - -def debug_test( - images, - logits_pred, - reg_pred, - agn_hm_pred=None, - preds=None, - vis_thresh: float=0.3, - debug_show_name: bool=False, - mult_agn: bool=False, -) -> None: - """ - images: N x 3 x H x W - class_target: LNHiWi x C - cat_agn_heatmap: LNHiWi - shapes_per_level: L x 2 [(H_i, W_i)] - """ - if preds is None: - preds = [] - if agn_hm_pred is None: - agn_hm_pred = [] - len(images) - for i in range(len(images)): - image = images[i].detach().cpu().numpy().transpose(1, 2, 0) - image.copy().astype(np.uint8) - pred_image = image.copy().astype(np.uint8) - color_maps = [] - L = len(logits_pred) - for l in range(L): - if logits_pred[0] is not None: - stride = min(image.shape[0], image.shape[1]) / min( - logits_pred[l][i].shape[1], logits_pred[l][i].shape[2] - ) - else: - stride = min(image.shape[0], image.shape[1]) / min( - agn_hm_pred[l][i].shape[1], agn_hm_pred[l][i].shape[2] - ) - stride = stride if stride < 60 else 64 if stride < 100 else 128 - if logits_pred[0] is not None: - if mult_agn: - logits_pred[l][i] = logits_pred[l][i] * agn_hm_pred[l][i] - color_map = _get_color_image(logits_pred[l][i].detach().cpu().numpy()) - color_maps.append(color_map) - cv2.imshow(f"predhm_{l}", color_map) - - if debug_show_name: - from detectron2.data.datasets.lvis_v1_categories import LVIS_CATEGORIES - - cat2name = [x["name"] for x in LVIS_CATEGORIES] - for j in range(len(preds[i].scores) if preds is not None else 0): - if preds[i].scores[j] > vis_thresh: - bbox = ( - preds[i].proposal_boxes[j] - if preds[i].has("proposal_boxes") - else preds[i].pred_boxes[j] - ) - bbox = bbox.tensor[0].detach().cpu().numpy().astype(np.int32) - cat = int(preds[i].pred_classes[j]) if preds[i].has("pred_classes") else 0 - cl = COLORS[cat, 0, 0] - cv2.rectangle( - pred_image, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - (int(cl[0]), int(cl[1]), int(cl[2])), - 2, - cv2.LINE_AA, - ) - if debug_show_name: - txt = "{}{:.1f}".format( - cat2name[cat] if cat > 0 else "", preds[i].scores[j] - ) - font = cv2.FONT_HERSHEY_SIMPLEX - cat_size = cv2.getTextSize(txt, font, 0.5, 2)[0] - cv2.rectangle( - pred_image, - (int(bbox[0]), int(bbox[1] - cat_size[1] - 2)), - (int(bbox[0] + cat_size[0]), int(bbox[1] - 2)), - (int(cl[0]), int(cl[1]), int(cl[2])), - -1, - ) - cv2.putText( - pred_image, - txt, - (int(bbox[0]), int(bbox[1] - 2)), - font, - 0.5, - (0, 0, 0), - thickness=1, - lineType=cv2.LINE_AA, - ) - - if agn_hm_pred[l] is not None: - agn_hm_ = agn_hm_pred[l][i, 0, :, :, None].detach().cpu().numpy() - agn_hm_ = (agn_hm_ * np.array([255, 255, 255]).reshape(1, 1, 3)).astype(np.uint8) - cv2.imshow(f"agn_hm_{l}", agn_hm_) - blend = _blend_image_heatmaps(image.copy(), color_maps) - cv2.imshow("blend", blend) - cv2.imshow("preds", pred_image) - cv2.waitKey() - - -global cnt -cnt = 0 - - -def debug_second_stage( - images, - instances, - proposals=None, - vis_thresh: float=0.3, - save_debug: bool=False, - debug_show_name: bool=False, - image_labels: Optional[Sequence[str]]=None, - save_debug_path: str="output/save_debug/", - bgr: bool=False, -) -> None: - if image_labels is None: - image_labels = [] - images = _imagelist_to_tensor(images) - if "COCO" in save_debug_path: - from detectron2.data.datasets.builtin_meta import COCO_CATEGORIES - - cat2name = [x["name"] for x in COCO_CATEGORIES] - else: - from detectron2.data.datasets.lvis_v1_categories import LVIS_CATEGORIES - - cat2name = ["({}){}".format(x["frequency"], x["name"]) for x in LVIS_CATEGORIES] - for i in range(len(images)): - image = images[i].detach().cpu().numpy().transpose(1, 2, 0).astype(np.uint8).copy() - if bgr: - image = image[:, :, ::-1].copy() - if instances[i].has("gt_boxes"): - bboxes = instances[i].gt_boxes.tensor.cpu().numpy() - scores = np.ones(bboxes.shape[0]) - cats = instances[i].gt_classes.cpu().numpy() - else: - bboxes = instances[i].pred_boxes.tensor.cpu().numpy() - scores = instances[i].scores.cpu().numpy() - cats = instances[i].pred_classes.cpu().numpy() - for j in range(len(bboxes)): - if scores[j] > vis_thresh: - bbox = bboxes[j] - cl = COLORS[cats[j], 0, 0] - cl = (int(cl[0]), int(cl[1]), int(cl[2])) - cv2.rectangle( - image, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - cl, - 2, - cv2.LINE_AA, - ) - if debug_show_name: - cat = cats[j] - txt = "{}{:.1f}".format(cat2name[cat] if cat > 0 else "", scores[j]) - font = cv2.FONT_HERSHEY_SIMPLEX - cat_size = cv2.getTextSize(txt, font, 0.5, 2)[0] - cv2.rectangle( - image, - (int(bbox[0]), int(bbox[1] - cat_size[1] - 2)), - (int(bbox[0] + cat_size[0]), int(bbox[1] - 2)), - (int(cl[0]), int(cl[1]), int(cl[2])), - -1, - ) - cv2.putText( - image, - txt, - (int(bbox[0]), int(bbox[1] - 2)), - font, - 0.5, - (0, 0, 0), - thickness=1, - lineType=cv2.LINE_AA, - ) - if proposals is not None: - proposal_image = ( - images[i].detach().cpu().numpy().transpose(1, 2, 0).astype(np.uint8).copy() - ) - if bgr: - proposal_image = proposal_image.copy() - else: - proposal_image = proposal_image[:, :, ::-1].copy() - bboxes = proposals[i].proposal_boxes.tensor.cpu().numpy() - if proposals[i].has("scores"): - scores = proposals[i].scores.detach().cpu().numpy() - else: - scores = proposals[i].objectness_logits.detach().cpu().numpy() - # selected = -1 - # if proposals[i].has('image_loss'): - # selected = proposals[i].image_loss.argmin() - if proposals[i].has("selected"): - selected = proposals[i].selected - else: - selected = [-1 for _ in range(len(bboxes))] - for j in range(len(bboxes)): - if scores[j] > vis_thresh or selected[j] >= 0: - bbox = bboxes[j] - cl = (209, 159, 83) - th = 2 - if selected[j] >= 0: - cl = (0, 0, 0xA4) - th = 4 - cv2.rectangle( - proposal_image, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - cl, - th, - cv2.LINE_AA, - ) - if selected[j] >= 0 and debug_show_name: - cat = selected[j].item() - txt = f"{cat2name[cat]}" - font = cv2.FONT_HERSHEY_SIMPLEX - cat_size = cv2.getTextSize(txt, font, 0.5, 2)[0] - cv2.rectangle( - proposal_image, - (int(bbox[0]), int(bbox[1] - cat_size[1] - 2)), - (int(bbox[0] + cat_size[0]), int(bbox[1] - 2)), - (int(cl[0]), int(cl[1]), int(cl[2])), - -1, - ) - cv2.putText( - proposal_image, - txt, - (int(bbox[0]), int(bbox[1] - 2)), - font, - 0.5, - (0, 0, 0), - thickness=1, - lineType=cv2.LINE_AA, - ) - - if save_debug: - global cnt - cnt = (cnt + 1) % 5000 - if not os.path.exists(save_debug_path): - os.mkdir(save_debug_path) - save_name = f"{save_debug_path}/{cnt:05d}.jpg" - if i < len(image_labels): - image_label = image_labels[i] - save_name = f"{save_debug_path}/{cnt:05d}" - for x in image_label: - class_name = cat2name[x] - save_name = save_name + f"|{class_name}" - save_name = save_name + ".jpg" - cv2.imwrite(save_name, proposal_image) - else: - cv2.imshow("image", image) - if proposals is not None: - cv2.imshow("proposals", proposal_image) - cv2.waitKey() diff --git a/dimos/models/Detic/detic/modeling/meta_arch/custom_rcnn.py b/dimos/models/Detic/detic/modeling/meta_arch/custom_rcnn.py deleted file mode 100644 index 872084f7cb..0000000000 --- a/dimos/models/Detic/detic/modeling/meta_arch/custom_rcnn.py +++ /dev/null @@ -1,227 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from typing import Dict, List, Optional, Tuple - -from detectron2.config import configurable -from detectron2.modeling.meta_arch.build import META_ARCH_REGISTRY -from detectron2.modeling.meta_arch.rcnn import GeneralizedRCNN -from detectron2.structures import Instances -import detectron2.utils.comm as comm -from detectron2.utils.events import get_event_storage -import torch -from torch.cuda.amp import autocast - -from ..text.text_encoder import build_text_encoder -from ..utils import get_fed_loss_inds, load_class_freq - - -@META_ARCH_REGISTRY.register() -class CustomRCNN(GeneralizedRCNN): - """ - Add image labels - """ - - @configurable - def __init__( - self, - with_image_labels: bool=False, - dataset_loss_weight=None, - fp16: bool=False, - sync_caption_batch: bool=False, - roi_head_name: str="", - cap_batch_ratio: int=4, - with_caption: bool=False, - dynamic_classifier: bool=False, - **kwargs, - ) -> None: - """ """ - if dataset_loss_weight is None: - dataset_loss_weight = [] - self.with_image_labels = with_image_labels - self.dataset_loss_weight = dataset_loss_weight - self.fp16 = fp16 - self.with_caption = with_caption - self.sync_caption_batch = sync_caption_batch - self.roi_head_name = roi_head_name - self.cap_batch_ratio = cap_batch_ratio - self.dynamic_classifier = dynamic_classifier - self.return_proposal = False - if self.dynamic_classifier: - self.freq_weight = kwargs.pop("freq_weight") - self.num_classes = kwargs.pop("num_classes") - self.num_sample_cats = kwargs.pop("num_sample_cats") - super().__init__(**kwargs) - assert self.proposal_generator is not None - if self.with_caption: - assert not self.dynamic_classifier - self.text_encoder = build_text_encoder(pretrain=True) - for v in self.text_encoder.parameters(): - v.requires_grad = False - - @classmethod - def from_config(cls, cfg): - ret = super().from_config(cfg) - ret.update( - { - "with_image_labels": cfg.WITH_IMAGE_LABELS, - "dataset_loss_weight": cfg.MODEL.DATASET_LOSS_WEIGHT, - "fp16": cfg.FP16, - "with_caption": cfg.MODEL.WITH_CAPTION, - "sync_caption_batch": cfg.MODEL.SYNC_CAPTION_BATCH, - "dynamic_classifier": cfg.MODEL.DYNAMIC_CLASSIFIER, - "roi_head_name": cfg.MODEL.ROI_HEADS.NAME, - "cap_batch_ratio": cfg.MODEL.CAP_BATCH_RATIO, - } - ) - if ret["dynamic_classifier"]: - ret["freq_weight"] = load_class_freq( - cfg.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH, cfg.MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT - ) - ret["num_classes"] = cfg.MODEL.ROI_HEADS.NUM_CLASSES - ret["num_sample_cats"] = cfg.MODEL.NUM_SAMPLE_CATS - return ret - - def inference( - self, - batched_inputs: tuple[dict[str, torch.Tensor]], - detected_instances: list[Instances] | None = None, - do_postprocess: bool = True, - ): - assert not self.training - assert detected_instances is None - - images = self.preprocess_image(batched_inputs) - features = self.backbone(images.tensor) - proposals, _ = self.proposal_generator(images, features, None) - results, _ = self.roi_heads(images, features, proposals) - if do_postprocess: - assert not torch.jit.is_scripting(), "Scripting is not supported for postprocess." - return CustomRCNN._postprocess(results, batched_inputs, images.image_sizes) - else: - return results - - def forward(self, batched_inputs: list[dict[str, torch.Tensor]]): - """ - Add ann_type - Ignore proposal loss when training with image labels - """ - if not self.training: - return self.inference(batched_inputs) - - images = self.preprocess_image(batched_inputs) - - ann_type = "box" - gt_instances = [x["instances"].to(self.device) for x in batched_inputs] - if self.with_image_labels: - for inst, x in zip(gt_instances, batched_inputs, strict=False): - inst._ann_type = x["ann_type"] - inst._pos_category_ids = x["pos_category_ids"] - ann_types = [x["ann_type"] for x in batched_inputs] - assert len(set(ann_types)) == 1 - ann_type = ann_types[0] - if ann_type in ["prop", "proptag"]: - for t in gt_instances: - t.gt_classes *= 0 - - if self.fp16: # TODO (zhouxy): improve - with autocast(): - features = self.backbone(images.tensor.half()) - features = {k: v.float() for k, v in features.items()} - else: - features = self.backbone(images.tensor) - - cls_features, cls_inds, caption_features = None, None, None - - if self.with_caption and "caption" in ann_type: - inds = [torch.randint(len(x["captions"]), (1,))[0].item() for x in batched_inputs] - caps = [x["captions"][ind] for ind, x in zip(inds, batched_inputs, strict=False)] - caption_features = self.text_encoder(caps).float() - if self.sync_caption_batch: - caption_features = self._sync_caption_features( - caption_features, ann_type, len(batched_inputs) - ) - - if self.dynamic_classifier and ann_type != "caption": - cls_inds = self._sample_cls_inds(gt_instances, ann_type) # inds, inv_inds - ind_with_bg = [*cls_inds[0].tolist(), -1] - cls_features = ( - self.roi_heads.box_predictor[0] - .cls_score.zs_weight[:, ind_with_bg] - .permute(1, 0) - .contiguous() - ) - - classifier_info = cls_features, cls_inds, caption_features - proposals, proposal_losses = self.proposal_generator(images, features, gt_instances) - - if self.roi_head_name in ["StandardROIHeads", "CascadeROIHeads"]: - proposals, detector_losses = self.roi_heads(images, features, proposals, gt_instances) - else: - proposals, detector_losses = self.roi_heads( - images, - features, - proposals, - gt_instances, - ann_type=ann_type, - classifier_info=classifier_info, - ) - - if self.vis_period > 0: - storage = get_event_storage() - if storage.iter % self.vis_period == 0: - self.visualize_training(batched_inputs, proposals) - - losses = {} - losses.update(detector_losses) - if self.with_image_labels: - if ann_type in ["box", "prop", "proptag"]: - losses.update(proposal_losses) - else: # ignore proposal loss for non-bbox data - losses.update({k: v * 0 for k, v in proposal_losses.items()}) - else: - losses.update(proposal_losses) - if len(self.dataset_loss_weight) > 0: - dataset_sources = [x["dataset_source"] for x in batched_inputs] - assert len(set(dataset_sources)) == 1 - dataset_source = dataset_sources[0] - for k in losses: - losses[k] *= self.dataset_loss_weight[dataset_source] - - if self.return_proposal: - return proposals, losses - else: - return losses - - def _sync_caption_features(self, caption_features, ann_type, BS): - has_caption_feature = caption_features is not None - BS = (BS * self.cap_batch_ratio) if (ann_type == "box") else BS - rank = torch.full((BS, 1), comm.get_rank(), dtype=torch.float32, device=self.device) - if not has_caption_feature: - caption_features = rank.new_zeros((BS, 512)) - caption_features = torch.cat([caption_features, rank], dim=1) - global_caption_features = comm.all_gather(caption_features) - caption_features = ( - torch.cat([x.to(self.device) for x in global_caption_features], dim=0) - if has_caption_feature - else None - ) # (NB) x (D + 1) - return caption_features - - def _sample_cls_inds(self, gt_instances, ann_type: str="box"): - if ann_type == "box": - gt_classes = torch.cat([x.gt_classes for x in gt_instances]) - C = len(self.freq_weight) - freq_weight = self.freq_weight - else: - gt_classes = torch.cat( - [ - torch.tensor(x._pos_category_ids, dtype=torch.long, device=x.gt_classes.device) - for x in gt_instances - ] - ) - C = self.num_classes - freq_weight = None - assert gt_classes.max() < C, f"{gt_classes.max()} {C}" - inds = get_fed_loss_inds(gt_classes, self.num_sample_cats, C, weight=freq_weight) - cls_id_map = gt_classes.new_full((self.num_classes + 1,), len(inds)) - cls_id_map[inds] = torch.arange(len(inds), device=cls_id_map.device) - return inds, cls_id_map diff --git a/dimos/models/Detic/detic/modeling/meta_arch/d2_deformable_detr.py b/dimos/models/Detic/detic/modeling/meta_arch/d2_deformable_detr.py deleted file mode 100644 index 9c2ec8e81e..0000000000 --- a/dimos/models/Detic/detic/modeling/meta_arch/d2_deformable_detr.py +++ /dev/null @@ -1,318 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from detectron2.modeling import META_ARCH_REGISTRY, build_backbone -from detectron2.structures import Boxes, Instances -from models.backbone import Joiner -from models.deformable_detr import DeformableDETR, SetCriterion -from models.deformable_transformer import DeformableTransformer -from models.matcher import HungarianMatcher -from models.position_encoding import PositionEmbeddingSine -from models.segmentation import sigmoid_focal_loss -import torch -from torch import nn -import torch.nn.functional as F -from util.box_ops import box_cxcywh_to_xyxy, box_xyxy_to_cxcywh -from util.misc import NestedTensor, accuracy - -from ..utils import get_fed_loss_inds, load_class_freq -from typing import Sequence - -__all__ = ["DeformableDetr"] - - -class CustomSetCriterion(SetCriterion): - def __init__( - self, num_classes: int, matcher, weight_dict, losses, focal_alpha: float=0.25, use_fed_loss: bool=False - ) -> None: - super().__init__(num_classes, matcher, weight_dict, losses, focal_alpha) - self.use_fed_loss = use_fed_loss - if self.use_fed_loss: - self.register_buffer("fed_loss_weight", load_class_freq(freq_weight=0.5)) - - def loss_labels(self, outputs, targets, indices, num_boxes: int, log: bool=True): - """Classification loss (NLL) - targets dicts must contain the key "labels" containing a tensor of dim [nb_target_boxes] - """ - assert "pred_logits" in outputs - src_logits = outputs["pred_logits"] - - idx = self._get_src_permutation_idx(indices) - target_classes_o = torch.cat([t["labels"][J] for t, (_, J) in zip(targets, indices, strict=False)]) - target_classes = torch.full( - src_logits.shape[:2], self.num_classes, dtype=torch.int64, device=src_logits.device - ) - target_classes[idx] = target_classes_o - - target_classes_onehot = torch.zeros( - [src_logits.shape[0], src_logits.shape[1], src_logits.shape[2] + 1], - dtype=src_logits.dtype, - layout=src_logits.layout, - device=src_logits.device, - ) - target_classes_onehot.scatter_(2, target_classes.unsqueeze(-1), 1) - - target_classes_onehot = target_classes_onehot[:, :, :-1] # B x N x C - if self.use_fed_loss: - inds = get_fed_loss_inds( - gt_classes=target_classes_o, - num_sample_cats=50, - weight=self.fed_loss_weight, - C=target_classes_onehot.shape[2], - ) - loss_ce = ( - sigmoid_focal_loss( - src_logits[:, :, inds], - target_classes_onehot[:, :, inds], - num_boxes, - alpha=self.focal_alpha, - gamma=2, - ) - * src_logits.shape[1] - ) - else: - loss_ce = ( - sigmoid_focal_loss( - src_logits, target_classes_onehot, num_boxes, alpha=self.focal_alpha, gamma=2 - ) - * src_logits.shape[1] - ) - losses = {"loss_ce": loss_ce} - - if log: - # TODO this should probably be a separate loss, not hacked in this one here - losses["class_error"] = 100 - accuracy(src_logits[idx], target_classes_o)[0] - return losses - - -class MaskedBackbone(nn.Module): - """This is a thin wrapper around D2's backbone to provide padding masking""" - - def __init__(self, cfg) -> None: - super().__init__() - self.backbone = build_backbone(cfg) - backbone_shape = self.backbone.output_shape() - self.feature_strides = [backbone_shape[f].stride for f in backbone_shape.keys()] - self.strides = [backbone_shape[f].stride for f in backbone_shape.keys()] - self.num_channels = [backbone_shape[x].channels for x in backbone_shape.keys()] - - def forward(self, tensor_list: NestedTensor): - xs = self.backbone(tensor_list.tensors) - out = {} - for name, x in xs.items(): - m = tensor_list.mask - assert m is not None - mask = F.interpolate(m[None].float(), size=x.shape[-2:]).to(torch.bool)[0] - out[name] = NestedTensor(x, mask) - return out - - -@META_ARCH_REGISTRY.register() -class DeformableDetr(nn.Module): - """ - Implement Deformable Detr - """ - - def __init__(self, cfg) -> None: - super().__init__() - self.with_image_labels = cfg.WITH_IMAGE_LABELS - self.weak_weight = cfg.MODEL.DETR.WEAK_WEIGHT - - self.device = torch.device(cfg.MODEL.DEVICE) - self.test_topk = cfg.TEST.DETECTIONS_PER_IMAGE - self.num_classes = cfg.MODEL.DETR.NUM_CLASSES - self.mask_on = cfg.MODEL.MASK_ON - hidden_dim = cfg.MODEL.DETR.HIDDEN_DIM - num_queries = cfg.MODEL.DETR.NUM_OBJECT_QUERIES - - # Transformer parameters: - nheads = cfg.MODEL.DETR.NHEADS - dropout = cfg.MODEL.DETR.DROPOUT - dim_feedforward = cfg.MODEL.DETR.DIM_FEEDFORWARD - enc_layers = cfg.MODEL.DETR.ENC_LAYERS - dec_layers = cfg.MODEL.DETR.DEC_LAYERS - num_feature_levels = cfg.MODEL.DETR.NUM_FEATURE_LEVELS - two_stage = cfg.MODEL.DETR.TWO_STAGE - with_box_refine = cfg.MODEL.DETR.WITH_BOX_REFINE - - # Loss parameters: - giou_weight = cfg.MODEL.DETR.GIOU_WEIGHT - l1_weight = cfg.MODEL.DETR.L1_WEIGHT - deep_supervision = cfg.MODEL.DETR.DEEP_SUPERVISION - cls_weight = cfg.MODEL.DETR.CLS_WEIGHT - focal_alpha = cfg.MODEL.DETR.FOCAL_ALPHA - - N_steps = hidden_dim // 2 - d2_backbone = MaskedBackbone(cfg) - backbone = Joiner(d2_backbone, PositionEmbeddingSine(N_steps, normalize=True)) - - transformer = DeformableTransformer( - d_model=hidden_dim, - nhead=nheads, - num_encoder_layers=enc_layers, - num_decoder_layers=dec_layers, - dim_feedforward=dim_feedforward, - dropout=dropout, - activation="relu", - return_intermediate_dec=True, - num_feature_levels=num_feature_levels, - dec_n_points=4, - enc_n_points=4, - two_stage=two_stage, - two_stage_num_proposals=num_queries, - ) - - self.detr = DeformableDETR( - backbone, - transformer, - num_classes=self.num_classes, - num_queries=num_queries, - num_feature_levels=num_feature_levels, - aux_loss=deep_supervision, - with_box_refine=with_box_refine, - two_stage=two_stage, - ) - - if self.mask_on: - assert 0, "Mask is not supported yet :(" - - matcher = HungarianMatcher( - cost_class=cls_weight, cost_bbox=l1_weight, cost_giou=giou_weight - ) - weight_dict = {"loss_ce": cls_weight, "loss_bbox": l1_weight} - weight_dict["loss_giou"] = giou_weight - if deep_supervision: - aux_weight_dict = {} - for i in range(dec_layers - 1): - aux_weight_dict.update({k + f"_{i}": v for k, v in weight_dict.items()}) - weight_dict.update(aux_weight_dict) - print("weight_dict", weight_dict) - losses = ["labels", "boxes", "cardinality"] - if self.mask_on: - losses += ["masks"] - self.criterion = CustomSetCriterion( - self.num_classes, - matcher=matcher, - weight_dict=weight_dict, - focal_alpha=focal_alpha, - losses=losses, - use_fed_loss=cfg.MODEL.DETR.USE_FED_LOSS, - ) - pixel_mean = torch.Tensor(cfg.MODEL.PIXEL_MEAN).to(self.device).view(3, 1, 1) - pixel_std = torch.Tensor(cfg.MODEL.PIXEL_STD).to(self.device).view(3, 1, 1) - self.normalizer = lambda x: (x - pixel_mean) / pixel_std - - def forward(self, batched_inputs): - """ - Args: - Returns: - dict[str: Tensor]: - mapping from a named loss to a tensor storing the loss. Used during training only. - """ - images = self.preprocess_image(batched_inputs) - output = self.detr(images) - if self.training: - gt_instances = [x["instances"].to(self.device) for x in batched_inputs] - targets = self.prepare_targets(gt_instances) - loss_dict = self.criterion(output, targets) - weight_dict = self.criterion.weight_dict - for k in loss_dict.keys(): - if k in weight_dict: - loss_dict[k] *= weight_dict[k] - if self.with_image_labels: - if batched_inputs[0]["ann_type"] in ["image", "captiontag"]: - loss_dict["loss_image"] = self.weak_weight * self._weak_loss( - output, batched_inputs - ) - else: - loss_dict["loss_image"] = images[0].new_zeros([1], dtype=torch.float32)[0] - # import pdb; pdb.set_trace() - return loss_dict - else: - image_sizes = output["pred_boxes"].new_tensor( - [(t["height"], t["width"]) for t in batched_inputs] - ) - results = self.post_process(output, image_sizes) - return results - - def prepare_targets(self, targets): - new_targets = [] - for targets_per_image in targets: - h, w = targets_per_image.image_size - image_size_xyxy = torch.as_tensor([w, h, w, h], dtype=torch.float, device=self.device) - gt_classes = targets_per_image.gt_classes - gt_boxes = targets_per_image.gt_boxes.tensor / image_size_xyxy - gt_boxes = box_xyxy_to_cxcywh(gt_boxes) - new_targets.append({"labels": gt_classes, "boxes": gt_boxes}) - if self.mask_on and hasattr(targets_per_image, "gt_masks"): - assert 0, "Mask is not supported yet :(" - gt_masks = targets_per_image.gt_masks - gt_masks = convert_coco_poly_to_mask(gt_masks.polygons, h, w) - new_targets[-1].update({"masks": gt_masks}) - return new_targets - - def post_process(self, outputs, target_sizes: Sequence[int]): - """ """ - out_logits, out_bbox = outputs["pred_logits"], outputs["pred_boxes"] - assert len(out_logits) == len(target_sizes) - assert target_sizes.shape[1] == 2 - - prob = out_logits.sigmoid() - topk_values, topk_indexes = torch.topk( - prob.view(out_logits.shape[0], -1), self.test_topk, dim=1 - ) - scores = topk_values - topk_boxes = topk_indexes // out_logits.shape[2] - labels = topk_indexes % out_logits.shape[2] - boxes = box_cxcywh_to_xyxy(out_bbox) - boxes = torch.gather(boxes, 1, topk_boxes.unsqueeze(-1).repeat(1, 1, 4)) - - # and from relative [0, 1] to absolute [0, height] coordinates - img_h, img_w = target_sizes.unbind(1) - scale_fct = torch.stack([img_w, img_h, img_w, img_h], dim=1) - boxes = boxes * scale_fct[:, None, :] - - results = [] - for s, l, b, size in zip(scores, labels, boxes, target_sizes, strict=False): - r = Instances((size[0], size[1])) - r.pred_boxes = Boxes(b) - r.scores = s - r.pred_classes = l - results.append({"instances": r}) - return results - - def preprocess_image(self, batched_inputs): - """ - Normalize, pad and batch the input images. - """ - images = [self.normalizer(x["image"].to(self.device)) for x in batched_inputs] - return images - - def _weak_loss(self, outputs, batched_inputs): - loss = 0 - for b, x in enumerate(batched_inputs): - labels = x["pos_category_ids"] - pred_logits = [outputs["pred_logits"][b]] - pred_boxes = [outputs["pred_boxes"][b]] - for xx in outputs["aux_outputs"]: - pred_logits.append(xx["pred_logits"][b]) - pred_boxes.append(xx["pred_boxes"][b]) - pred_logits = torch.stack(pred_logits, dim=0) # L x N x C - pred_boxes = torch.stack(pred_boxes, dim=0) # L x N x 4 - for label in labels: - loss += self._max_size_loss(pred_logits, pred_boxes, label) / len(labels) - loss = loss / len(batched_inputs) - return loss - - def _max_size_loss(self, logits, boxes, label: str): - """ - Inputs: - logits: L x N x C - boxes: L x N x 4 - """ - target = logits.new_zeros((logits.shape[0], logits.shape[2])) - target[:, label] = 1.0 - sizes = boxes[..., 2] * boxes[..., 3] # L x N - ind = sizes.argmax(dim=1) # L - loss = F.binary_cross_entropy_with_logits( - logits[range(len(ind)), ind], target, reduction="sum" - ) - return loss diff --git a/dimos/models/Detic/detic/modeling/roi_heads/detic_fast_rcnn.py b/dimos/models/Detic/detic/modeling/roi_heads/detic_fast_rcnn.py deleted file mode 100644 index aaa7ca233e..0000000000 --- a/dimos/models/Detic/detic/modeling/roi_heads/detic_fast_rcnn.py +++ /dev/null @@ -1,569 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import math - -from detectron2.config import configurable -from detectron2.layers import ShapeSpec, cat, nonzero_tuple -from detectron2.modeling.roi_heads.fast_rcnn import ( - FastRCNNOutputLayers, - _log_classification_stats, - fast_rcnn_inference, -) -import detectron2.utils.comm as comm -from detectron2.utils.events import get_event_storage -from fvcore.nn import giou_loss, smooth_l1_loss -import fvcore.nn.weight_init as weight_init -import torch -from torch import nn -from torch.nn import functional as F - -from ..utils import get_fed_loss_inds, load_class_freq -from .zero_shot_classifier import ZeroShotClassifier -from typing import Sequence - -__all__ = ["DeticFastRCNNOutputLayers"] - - -class DeticFastRCNNOutputLayers(FastRCNNOutputLayers): - @configurable - def __init__( - self, - input_shape: ShapeSpec, - *, - mult_proposal_score: bool=False, - cls_score=None, - sync_caption_batch: bool=False, - use_sigmoid_ce: bool=False, - use_fed_loss: bool=False, - ignore_zero_cats: bool=False, - fed_loss_num_cat: int=50, - dynamic_classifier: bool=False, - image_label_loss: str="", - use_zeroshot_cls: bool=False, - image_loss_weight: float=0.1, - with_softmax_prop: bool=False, - caption_weight: float=1.0, - neg_cap_weight: float=1.0, - add_image_box: bool=False, - debug: bool=False, - prior_prob: float=0.01, - cat_freq_path: str="", - fed_loss_freq_weight: float=0.5, - softmax_weak_loss: bool=False, - **kwargs, - ) -> None: - super().__init__( - input_shape=input_shape, - **kwargs, - ) - self.mult_proposal_score = mult_proposal_score - self.sync_caption_batch = sync_caption_batch - self.use_sigmoid_ce = use_sigmoid_ce - self.use_fed_loss = use_fed_loss - self.ignore_zero_cats = ignore_zero_cats - self.fed_loss_num_cat = fed_loss_num_cat - self.dynamic_classifier = dynamic_classifier - self.image_label_loss = image_label_loss - self.use_zeroshot_cls = use_zeroshot_cls - self.image_loss_weight = image_loss_weight - self.with_softmax_prop = with_softmax_prop - self.caption_weight = caption_weight - self.neg_cap_weight = neg_cap_weight - self.add_image_box = add_image_box - self.softmax_weak_loss = softmax_weak_loss - self.debug = debug - - if softmax_weak_loss: - assert image_label_loss in ["max_size"] - - if self.use_sigmoid_ce: - bias_value = -math.log((1 - prior_prob) / prior_prob) - nn.init.constant_(self.cls_score.bias, bias_value) - - if self.use_fed_loss or self.ignore_zero_cats: - freq_weight = load_class_freq(cat_freq_path, fed_loss_freq_weight) - self.register_buffer("freq_weight", freq_weight) - else: - self.freq_weight = None - - if self.use_fed_loss and len(self.freq_weight) < self.num_classes: - # assert self.num_classes == 11493 - print("Extending federated loss weight") - self.freq_weight = torch.cat( - [ - self.freq_weight, - self.freq_weight.new_zeros(self.num_classes - len(self.freq_weight)), - ] - ) - - assert (not self.dynamic_classifier) or (not self.use_fed_loss) - input_size = input_shape.channels * (input_shape.width or 1) * (input_shape.height or 1) - - if self.use_zeroshot_cls: - del self.cls_score - del self.bbox_pred - assert cls_score is not None - self.cls_score = cls_score - self.bbox_pred = nn.Sequential( - nn.Linear(input_size, input_size), nn.ReLU(inplace=True), nn.Linear(input_size, 4) - ) - weight_init.c2_xavier_fill(self.bbox_pred[0]) - nn.init.normal_(self.bbox_pred[-1].weight, std=0.001) - nn.init.constant_(self.bbox_pred[-1].bias, 0) - - if self.with_softmax_prop: - self.prop_score = nn.Sequential( - nn.Linear(input_size, input_size), - nn.ReLU(inplace=True), - nn.Linear(input_size, self.num_classes + 1), - ) - weight_init.c2_xavier_fill(self.prop_score[0]) - nn.init.normal_(self.prop_score[-1].weight, mean=0, std=0.001) - nn.init.constant_(self.prop_score[-1].bias, 0) - - @classmethod - def from_config(cls, cfg, input_shape): - ret = super().from_config(cfg, input_shape) - ret.update( - { - "mult_proposal_score": cfg.MODEL.ROI_BOX_HEAD.MULT_PROPOSAL_SCORE, - "sync_caption_batch": cfg.MODEL.SYNC_CAPTION_BATCH, - "use_sigmoid_ce": cfg.MODEL.ROI_BOX_HEAD.USE_SIGMOID_CE, - "use_fed_loss": cfg.MODEL.ROI_BOX_HEAD.USE_FED_LOSS, - "ignore_zero_cats": cfg.MODEL.ROI_BOX_HEAD.IGNORE_ZERO_CATS, - "fed_loss_num_cat": cfg.MODEL.ROI_BOX_HEAD.FED_LOSS_NUM_CAT, - "dynamic_classifier": cfg.MODEL.DYNAMIC_CLASSIFIER, - "image_label_loss": cfg.MODEL.ROI_BOX_HEAD.IMAGE_LABEL_LOSS, - "use_zeroshot_cls": cfg.MODEL.ROI_BOX_HEAD.USE_ZEROSHOT_CLS, - "image_loss_weight": cfg.MODEL.ROI_BOX_HEAD.IMAGE_LOSS_WEIGHT, - "with_softmax_prop": cfg.MODEL.ROI_BOX_HEAD.WITH_SOFTMAX_PROP, - "caption_weight": cfg.MODEL.ROI_BOX_HEAD.CAPTION_WEIGHT, - "neg_cap_weight": cfg.MODEL.ROI_BOX_HEAD.NEG_CAP_WEIGHT, - "add_image_box": cfg.MODEL.ROI_BOX_HEAD.ADD_IMAGE_BOX, - "debug": cfg.DEBUG or cfg.SAVE_DEBUG or cfg.IS_DEBUG, - "prior_prob": cfg.MODEL.ROI_BOX_HEAD.PRIOR_PROB, - "cat_freq_path": cfg.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH, - "fed_loss_freq_weight": cfg.MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT, - "softmax_weak_loss": cfg.MODEL.ROI_BOX_HEAD.SOFTMAX_WEAK_LOSS, - } - ) - if ret["use_zeroshot_cls"]: - ret["cls_score"] = ZeroShotClassifier(cfg, input_shape) - return ret - - def losses( - self, predictions, proposals, use_advanced_loss: bool=True, classifier_info=(None, None, None) - ): - """ - enable advanced loss - """ - scores, proposal_deltas = predictions - gt_classes = ( - cat([p.gt_classes for p in proposals], dim=0) if len(proposals) else torch.empty(0) - ) - num_classes = self.num_classes - if self.dynamic_classifier: - _, cls_id_map = classifier_info[1] - gt_classes = cls_id_map[gt_classes] - num_classes = scores.shape[1] - 1 - assert cls_id_map[self.num_classes] == num_classes - _log_classification_stats(scores, gt_classes) - - if len(proposals): - proposal_boxes = cat([p.proposal_boxes.tensor for p in proposals], dim=0) # Nx4 - assert not proposal_boxes.requires_grad, "Proposals should not require gradients!" - gt_boxes = cat( - [(p.gt_boxes if p.has("gt_boxes") else p.proposal_boxes).tensor for p in proposals], - dim=0, - ) - else: - proposal_boxes = gt_boxes = torch.empty((0, 4), device=proposal_deltas.device) - - if self.use_sigmoid_ce: - loss_cls = self.sigmoid_cross_entropy_loss(scores, gt_classes) - else: - loss_cls = self.softmax_cross_entropy_loss(scores, gt_classes) - return { - "loss_cls": loss_cls, - "loss_box_reg": self.box_reg_loss( - proposal_boxes, gt_boxes, proposal_deltas, gt_classes, num_classes=num_classes - ), - } - - def sigmoid_cross_entropy_loss(self, pred_class_logits, gt_classes): - if pred_class_logits.numel() == 0: - return pred_class_logits.new_zeros([1])[0] # This is more robust than .sum() * 0. - - B = pred_class_logits.shape[0] - C = pred_class_logits.shape[1] - 1 - - target = pred_class_logits.new_zeros(B, C + 1) - target[range(len(gt_classes)), gt_classes] = 1 # B x (C + 1) - target = target[:, :C] # B x C - - weight = 1 - - if self.use_fed_loss and (self.freq_weight is not None): # fedloss - appeared = get_fed_loss_inds( - gt_classes, num_sample_cats=self.fed_loss_num_cat, C=C, weight=self.freq_weight - ) - appeared_mask = appeared.new_zeros(C + 1) - appeared_mask[appeared] = 1 # C + 1 - appeared_mask = appeared_mask[:C] - fed_w = appeared_mask.view(1, C).expand(B, C) - weight = weight * fed_w.float() - if self.ignore_zero_cats and (self.freq_weight is not None): - w = (self.freq_weight.view(-1) > 1e-4).float() - weight = weight * w.view(1, C).expand(B, C) - # import pdb; pdb.set_trace() - - cls_loss = F.binary_cross_entropy_with_logits( - pred_class_logits[:, :-1], target, reduction="none" - ) # B x C - loss = torch.sum(cls_loss * weight) / B - return loss - - def softmax_cross_entropy_loss(self, pred_class_logits, gt_classes): - """ - change _no_instance handling - """ - if pred_class_logits.numel() == 0: - return pred_class_logits.new_zeros([1])[0] - - if self.ignore_zero_cats and (self.freq_weight is not None): - zero_weight = torch.cat( - [(self.freq_weight.view(-1) > 1e-4).float(), self.freq_weight.new_ones(1)] - ) # C + 1 - loss = F.cross_entropy( - pred_class_logits, gt_classes, weight=zero_weight, reduction="mean" - ) - elif self.use_fed_loss and (self.freq_weight is not None): # fedloss - C = pred_class_logits.shape[1] - 1 - appeared = get_fed_loss_inds( - gt_classes, num_sample_cats=self.fed_loss_num_cat, C=C, weight=self.freq_weight - ) - appeared_mask = appeared.new_zeros(C + 1).float() - appeared_mask[appeared] = 1.0 # C + 1 - appeared_mask[C] = 1.0 - loss = F.cross_entropy( - pred_class_logits, gt_classes, weight=appeared_mask, reduction="mean" - ) - else: - loss = F.cross_entropy(pred_class_logits, gt_classes, reduction="mean") - return loss - - def box_reg_loss(self, proposal_boxes, gt_boxes, pred_deltas, gt_classes, num_classes: int=-1): - """ - Allow custom background index - """ - num_classes = num_classes if num_classes > 0 else self.num_classes - box_dim = proposal_boxes.shape[1] # 4 or 5 - fg_inds = nonzero_tuple((gt_classes >= 0) & (gt_classes < num_classes))[0] - if pred_deltas.shape[1] == box_dim: # cls-agnostic regression - fg_pred_deltas = pred_deltas[fg_inds] - else: - fg_pred_deltas = pred_deltas.view(-1, self.num_classes, box_dim)[ - fg_inds, gt_classes[fg_inds] - ] - - if self.box_reg_loss_type == "smooth_l1": - gt_pred_deltas = self.box2box_transform.get_deltas( - proposal_boxes[fg_inds], - gt_boxes[fg_inds], - ) - loss_box_reg = smooth_l1_loss( - fg_pred_deltas, gt_pred_deltas, self.smooth_l1_beta, reduction="sum" - ) - elif self.box_reg_loss_type == "giou": - fg_pred_boxes = self.box2box_transform.apply_deltas( - fg_pred_deltas, proposal_boxes[fg_inds] - ) - loss_box_reg = giou_loss(fg_pred_boxes, gt_boxes[fg_inds], reduction="sum") - else: - raise ValueError(f"Invalid bbox reg loss type '{self.box_reg_loss_type}'") - return loss_box_reg / max(gt_classes.numel(), 1.0) - - def inference(self, predictions, proposals): - """ - enable use proposal boxes - """ - predictions = (predictions[0], predictions[1]) - boxes = self.predict_boxes(predictions, proposals) - scores = self.predict_probs(predictions, proposals) - if self.mult_proposal_score: - proposal_scores = [p.get("objectness_logits") for p in proposals] - scores = [(s * ps[:, None]) ** 0.5 for s, ps in zip(scores, proposal_scores, strict=False)] - image_shapes = [x.image_size for x in proposals] - return fast_rcnn_inference( - boxes, - scores, - image_shapes, - self.test_score_thresh, - self.test_nms_thresh, - self.test_topk_per_image, - ) - - def predict_probs(self, predictions, proposals): - """ - support sigmoid - """ - # scores, _ = predictions - scores = predictions[0] - num_inst_per_image = [len(p) for p in proposals] - if self.use_sigmoid_ce: - probs = scores.sigmoid() - else: - probs = F.softmax(scores, dim=-1) - return probs.split(num_inst_per_image, dim=0) - - def image_label_losses( - self, - predictions, - proposals, - image_labels: Sequence[str], - classifier_info=(None, None, None), - ann_type: str="image", - ): - """ - Inputs: - scores: N x (C + 1) - image_labels B x 1 - """ - num_inst_per_image = [len(p) for p in proposals] - scores = predictions[0] - scores = scores.split(num_inst_per_image, dim=0) # B x n x (C + 1) - if self.with_softmax_prop: - prop_scores = predictions[2].split(num_inst_per_image, dim=0) - else: - prop_scores = [None for _ in num_inst_per_image] - B = len(scores) - img_box_count = 0 - select_size_count = 0 - select_x_count = 0 - select_y_count = 0 - max_score_count = 0 - storage = get_event_storage() - loss = scores[0].new_zeros([1])[0] - caption_loss = scores[0].new_zeros([1])[0] - for idx, (score, labels, prop_score, p) in enumerate( - zip(scores, image_labels, prop_scores, proposals, strict=False) - ): - if score.shape[0] == 0: - loss += score.new_zeros([1])[0] - continue - if "caption" in ann_type: - score, caption_loss_img = self._caption_loss(score, classifier_info, idx, B) - caption_loss += self.caption_weight * caption_loss_img - if ann_type == "caption": - continue - - if self.debug: - p.selected = score.new_zeros((len(p),), dtype=torch.long) - 1 - for i_l, label in enumerate(labels): - if self.dynamic_classifier: - if idx == 0 and i_l == 0 and comm.is_main_process(): - storage.put_scalar("stats_label", label) - label = classifier_info[1][1][label] - assert label < score.shape[1] - if self.image_label_loss in ["wsod", "wsddn"]: - loss_i, ind = self._wsddn_loss(score, prop_score, label) - elif self.image_label_loss == "max_score": - loss_i, ind = self._max_score_loss(score, label) - elif self.image_label_loss == "max_size": - loss_i, ind = self._max_size_loss(score, label, p) - elif self.image_label_loss == "first": - loss_i, ind = self._first_loss(score, label) - elif self.image_label_loss == "image": - loss_i, ind = self._image_loss(score, label) - elif self.image_label_loss == "min_loss": - loss_i, ind = self._min_loss_loss(score, label) - else: - assert 0 - loss += loss_i / len(labels) - if type(ind) == type([]): - img_box_count = sum(ind) / len(ind) - if self.debug: - for ind_i in ind: - p.selected[ind_i] = label - else: - img_box_count = ind - select_size_count = p[ind].proposal_boxes.area() / ( - p.image_size[0] * p.image_size[1] - ) - max_score_count = score[ind, label].sigmoid() - select_x_count = ( - (p.proposal_boxes.tensor[ind, 0] + p.proposal_boxes.tensor[ind, 2]) - / 2 - / p.image_size[1] - ) - select_y_count = ( - (p.proposal_boxes.tensor[ind, 1] + p.proposal_boxes.tensor[ind, 3]) - / 2 - / p.image_size[0] - ) - if self.debug: - p.selected[ind] = label - - loss = loss / B - storage.put_scalar("stats_l_image", loss.item()) - if "caption" in ann_type: - caption_loss = caption_loss / B - loss = loss + caption_loss - storage.put_scalar("stats_l_caption", caption_loss.item()) - if comm.is_main_process(): - storage.put_scalar("pool_stats", img_box_count) - storage.put_scalar("stats_select_size", select_size_count) - storage.put_scalar("stats_select_x", select_x_count) - storage.put_scalar("stats_select_y", select_y_count) - storage.put_scalar("stats_max_label_score", max_score_count) - - return { - "image_loss": loss * self.image_loss_weight, - "loss_cls": score.new_zeros([1])[0], - "loss_box_reg": score.new_zeros([1])[0], - } - - def forward(self, x, classifier_info=(None, None, None)): - """ - enable classifier_info - """ - if x.dim() > 2: - x = torch.flatten(x, start_dim=1) - scores = [] - - if classifier_info[0] is not None: - cls_scores = self.cls_score(x, classifier=classifier_info[0]) - scores.append(cls_scores) - else: - cls_scores = self.cls_score(x) - scores.append(cls_scores) - - if classifier_info[2] is not None: - cap_cls = classifier_info[2] - if self.sync_caption_batch: - caption_scores = self.cls_score(x, classifier=cap_cls[:, :-1]) - else: - caption_scores = self.cls_score(x, classifier=cap_cls) - scores.append(caption_scores) - scores = torch.cat(scores, dim=1) # B x C' or B x N or B x (C'+N) - - proposal_deltas = self.bbox_pred(x) - if self.with_softmax_prop: - prop_score = self.prop_score(x) - return scores, proposal_deltas, prop_score - else: - return scores, proposal_deltas - - def _caption_loss(self, score, classifier_info, idx: int, B): - assert classifier_info[2] is not None - assert self.add_image_box - cls_and_cap_num = score.shape[1] - cap_num = classifier_info[2].shape[0] - score, caption_score = score.split([cls_and_cap_num - cap_num, cap_num], dim=1) - # n x (C + 1), n x B - caption_score = caption_score[-1:] # 1 x B # -1: image level box - caption_target = caption_score.new_zeros( - caption_score.shape - ) # 1 x B or 1 x MB, M: num machines - if self.sync_caption_batch: - # caption_target: 1 x MB - rank = comm.get_rank() - global_idx = B * rank + idx - assert (classifier_info[2][global_idx, -1] - rank) ** 2 < 1e-8, f"{rank} {global_idx} {classifier_info[2][global_idx, -1]} {classifier_info[2].shape} {classifier_info[2][:, -1]}" - caption_target[:, global_idx] = 1.0 - else: - assert caption_score.shape[1] == B - caption_target[:, idx] = 1.0 - caption_loss_img = F.binary_cross_entropy_with_logits( - caption_score, caption_target, reduction="none" - ) - if self.sync_caption_batch: - fg_mask = (caption_target > 0.5).float() - assert (fg_mask.sum().item() - 1.0) ** 2 < 1e-8, f"{fg_mask.shape} {fg_mask}" - pos_loss = (caption_loss_img * fg_mask).sum() - neg_loss = (caption_loss_img * (1.0 - fg_mask)).sum() - caption_loss_img = pos_loss + self.neg_cap_weight * neg_loss - else: - caption_loss_img = caption_loss_img.sum() - return score, caption_loss_img - - def _wsddn_loss(self, score, prop_score, label: str): - assert prop_score is not None - loss = 0 - final_score = score.sigmoid() * F.softmax(prop_score, dim=0) # B x (C + 1) - img_score = torch.clamp(torch.sum(final_score, dim=0), min=1e-10, max=1 - 1e-10) # (C + 1) - target = img_score.new_zeros(img_score.shape) # (C + 1) - target[label] = 1.0 - loss += F.binary_cross_entropy(img_score, target) - ind = final_score[:, label].argmax() - return loss, ind - - def _max_score_loss(self, score, label: str): - loss = 0 - target = score.new_zeros(score.shape[1]) - target[label] = 1.0 - ind = score[:, label].argmax().item() - loss += F.binary_cross_entropy_with_logits(score[ind], target, reduction="sum") - return loss, ind - - def _min_loss_loss(self, score, label: str): - loss = 0 - target = score.new_zeros(score.shape) - target[:, label] = 1.0 - with torch.no_grad(): - x = F.binary_cross_entropy_with_logits(score, target, reduction="none").sum(dim=1) # n - ind = x.argmin().item() - loss += F.binary_cross_entropy_with_logits(score[ind], target[0], reduction="sum") - return loss, ind - - def _first_loss(self, score, label: str): - loss = 0 - target = score.new_zeros(score.shape[1]) - target[label] = 1.0 - ind = 0 - loss += F.binary_cross_entropy_with_logits(score[ind], target, reduction="sum") - return loss, ind - - def _image_loss(self, score, label: str): - assert self.add_image_box - target = score.new_zeros(score.shape[1]) - target[label] = 1.0 - ind = score.shape[0] - 1 - loss = F.binary_cross_entropy_with_logits(score[ind], target, reduction="sum") - return loss, ind - - def _max_size_loss(self, score, label: str, p): - loss = 0 - target = score.new_zeros(score.shape[1]) - target[label] = 1.0 - sizes = p.proposal_boxes.area() - ind = sizes[:-1].argmax().item() if len(sizes) > 1 else 0 - if self.softmax_weak_loss: - loss += F.cross_entropy( - score[ind : ind + 1], - score.new_tensor(label, dtype=torch.long).view(1), - reduction="sum", - ) - else: - loss += F.binary_cross_entropy_with_logits(score[ind], target, reduction="sum") - return loss, ind - - -def put_label_distribution(storage, hist_name: str, hist_counts, num_classes: int) -> None: - """ """ - ht_min, ht_max = 0, num_classes - hist_edges = torch.linspace( - start=ht_min, end=ht_max, steps=num_classes + 1, dtype=torch.float32 - ) - - hist_params = dict( - tag=hist_name, - min=ht_min, - max=ht_max, - num=float(hist_counts.sum()), - sum=float((hist_counts * torch.arange(len(hist_counts))).sum()), - sum_squares=float(((hist_counts * torch.arange(len(hist_counts))) ** 2).sum()), - bucket_limits=hist_edges[1:].tolist(), - bucket_counts=hist_counts.tolist(), - global_step=storage._iter, - ) - storage._histograms.append(hist_params) diff --git a/dimos/models/Detic/detic/modeling/roi_heads/detic_roi_heads.py b/dimos/models/Detic/detic/modeling/roi_heads/detic_roi_heads.py deleted file mode 100644 index a8f1f4efe2..0000000000 --- a/dimos/models/Detic/detic/modeling/roi_heads/detic_roi_heads.py +++ /dev/null @@ -1,258 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from detectron2.config import configurable -from detectron2.modeling.box_regression import Box2BoxTransform -from detectron2.modeling.roi_heads.cascade_rcnn import CascadeROIHeads, _ScaleGradient -from detectron2.modeling.roi_heads.fast_rcnn import fast_rcnn_inference -from detectron2.modeling.roi_heads.roi_heads import ROI_HEADS_REGISTRY -from detectron2.structures import Boxes, Instances -from detectron2.utils.events import get_event_storage -import torch - -from .detic_fast_rcnn import DeticFastRCNNOutputLayers -from typing import Sequence - - -@ROI_HEADS_REGISTRY.register() -class DeticCascadeROIHeads(CascadeROIHeads): - @configurable - def __init__( - self, - *, - mult_proposal_score: bool = False, - with_image_labels: bool = False, - add_image_box: bool = False, - image_box_size: float = 1.0, - ws_num_props: int = 512, - add_feature_to_prop: bool = False, - mask_weight: float = 1.0, - one_class_per_proposal: bool = False, - **kwargs, - ) -> None: - super().__init__(**kwargs) - self.mult_proposal_score = mult_proposal_score - self.with_image_labels = with_image_labels - self.add_image_box = add_image_box - self.image_box_size = image_box_size - self.ws_num_props = ws_num_props - self.add_feature_to_prop = add_feature_to_prop - self.mask_weight = mask_weight - self.one_class_per_proposal = one_class_per_proposal - - @classmethod - def from_config(cls, cfg, input_shape): - ret = super().from_config(cfg, input_shape) - ret.update( - { - "mult_proposal_score": cfg.MODEL.ROI_BOX_HEAD.MULT_PROPOSAL_SCORE, - "with_image_labels": cfg.WITH_IMAGE_LABELS, - "add_image_box": cfg.MODEL.ROI_BOX_HEAD.ADD_IMAGE_BOX, - "image_box_size": cfg.MODEL.ROI_BOX_HEAD.IMAGE_BOX_SIZE, - "ws_num_props": cfg.MODEL.ROI_BOX_HEAD.WS_NUM_PROPS, - "add_feature_to_prop": cfg.MODEL.ROI_BOX_HEAD.ADD_FEATURE_TO_PROP, - "mask_weight": cfg.MODEL.ROI_HEADS.MASK_WEIGHT, - "one_class_per_proposal": cfg.MODEL.ROI_HEADS.ONE_CLASS_PER_PROPOSAL, - } - ) - return ret - - @classmethod - def _init_box_head(cls, cfg, input_shape): - ret = super()._init_box_head(cfg, input_shape) - del ret["box_predictors"] - cascade_bbox_reg_weights = cfg.MODEL.ROI_BOX_CASCADE_HEAD.BBOX_REG_WEIGHTS - box_predictors = [] - for box_head, bbox_reg_weights in zip(ret["box_heads"], cascade_bbox_reg_weights, strict=False): - box_predictors.append( - DeticFastRCNNOutputLayers( - cfg, - box_head.output_shape, - box2box_transform=Box2BoxTransform(weights=bbox_reg_weights), - ) - ) - ret["box_predictors"] = box_predictors - return ret - - def _forward_box( - self, features, proposals, targets=None, ann_type: str="box", classifier_info=(None, None, None) - ): - """ - Add mult proposal scores at testing - Add ann_type - """ - if (not self.training) and self.mult_proposal_score: - if len(proposals) > 0 and proposals[0].has("scores"): - proposal_scores = [p.get("scores") for p in proposals] - else: - proposal_scores = [p.get("objectness_logits") for p in proposals] - - features = [features[f] for f in self.box_in_features] - head_outputs = [] # (predictor, predictions, proposals) - prev_pred_boxes = None - image_sizes = [x.image_size for x in proposals] - - for k in range(self.num_cascade_stages): - if k > 0: - proposals = self._create_proposals_from_boxes( - prev_pred_boxes, image_sizes, logits=[p.objectness_logits for p in proposals] - ) - if self.training and ann_type in ["box"]: - proposals = self._match_and_label_boxes(proposals, k, targets) - predictions = self._run_stage(features, proposals, k, classifier_info=classifier_info) - prev_pred_boxes = self.box_predictor[k].predict_boxes( - (predictions[0], predictions[1]), proposals - ) - head_outputs.append((self.box_predictor[k], predictions, proposals)) - - if self.training: - losses = {} - storage = get_event_storage() - for stage, (predictor, predictions, proposals) in enumerate(head_outputs): - with storage.name_scope(f"stage{stage}"): - if ann_type != "box": - stage_losses = {} - if ann_type in ["image", "caption", "captiontag"]: - image_labels = [x._pos_category_ids for x in targets] - weak_losses = predictor.image_label_losses( - predictions, - proposals, - image_labels, - classifier_info=classifier_info, - ann_type=ann_type, - ) - stage_losses.update(weak_losses) - else: # supervised - stage_losses = predictor.losses( - (predictions[0], predictions[1]), - proposals, - classifier_info=classifier_info, - ) - if self.with_image_labels: - stage_losses["image_loss"] = predictions[0].new_zeros([1])[0] - losses.update({k + f"_stage{stage}": v for k, v in stage_losses.items()}) - return losses - else: - # Each is a list[Tensor] of length #image. Each tensor is Ri x (K+1) - scores_per_stage = [h[0].predict_probs(h[1], h[2]) for h in head_outputs] - scores = [ - sum(list(scores_per_image)) * (1.0 / self.num_cascade_stages) - for scores_per_image in zip(*scores_per_stage, strict=False) - ] - if self.mult_proposal_score: - scores = [(s * ps[:, None]) ** 0.5 for s, ps in zip(scores, proposal_scores, strict=False)] - if self.one_class_per_proposal: - scores = [s * (s == s[:, :-1].max(dim=1)[0][:, None]).float() for s in scores] - predictor, predictions, proposals = head_outputs[-1] - boxes = predictor.predict_boxes((predictions[0], predictions[1]), proposals) - pred_instances, _ = fast_rcnn_inference( - boxes, - scores, - image_sizes, - predictor.test_score_thresh, - predictor.test_nms_thresh, - predictor.test_topk_per_image, - ) - return pred_instances - - def forward( - self, - images, - features, - proposals, - targets=None, - ann_type: str="box", - classifier_info=(None, None, None), - ): - """ - enable debug and image labels - classifier_info is shared across the batch - """ - if self.training: - if ann_type in ["box", "prop", "proptag"]: - proposals = self.label_and_sample_proposals(proposals, targets) - else: - proposals = self.get_top_proposals(proposals) - - losses = self._forward_box( - features, proposals, targets, ann_type=ann_type, classifier_info=classifier_info - ) - if ann_type == "box" and targets[0].has("gt_masks"): - mask_losses = self._forward_mask(features, proposals) - losses.update({k: v * self.mask_weight for k, v in mask_losses.items()}) - losses.update(self._forward_keypoint(features, proposals)) - else: - losses.update( - self._get_empty_mask_loss( - features, proposals, device=proposals[0].objectness_logits.device - ) - ) - return proposals, losses - else: - pred_instances = self._forward_box(features, proposals, classifier_info=classifier_info) - pred_instances = self.forward_with_given_boxes(features, pred_instances) - return pred_instances, {} - - def get_top_proposals(self, proposals): - for i in range(len(proposals)): - proposals[i].proposal_boxes.clip(proposals[i].image_size) - proposals = [p[: self.ws_num_props] for p in proposals] - for i, p in enumerate(proposals): - p.proposal_boxes.tensor = p.proposal_boxes.tensor.detach() - if self.add_image_box: - proposals[i] = self._add_image_box(p) - return proposals - - def _add_image_box(self, p): - image_box = Instances(p.image_size) - n = 1 - h, w = p.image_size - f = self.image_box_size - image_box.proposal_boxes = Boxes( - p.proposal_boxes.tensor.new_tensor( - [ - w * (1.0 - f) / 2.0, - h * (1.0 - f) / 2.0, - w * (1.0 - (1.0 - f) / 2.0), - h * (1.0 - (1.0 - f) / 2.0), - ] - ).view(n, 4) - ) - image_box.objectness_logits = p.objectness_logits.new_ones(n) - return Instances.cat([p, image_box]) - - def _get_empty_mask_loss(self, features, proposals, device): - if self.mask_on: - return {"loss_mask": torch.zeros((1,), device=device, dtype=torch.float32)[0]} - else: - return {} - - def _create_proposals_from_boxes(self, boxes, image_sizes: Sequence[int], logits): - """ - Add objectness_logits - """ - boxes = [Boxes(b.detach()) for b in boxes] - proposals = [] - for boxes_per_image, image_size, logit in zip(boxes, image_sizes, logits, strict=False): - boxes_per_image.clip(image_size) - if self.training: - inds = boxes_per_image.nonempty() - boxes_per_image = boxes_per_image[inds] - logit = logit[inds] - prop = Instances(image_size) - prop.proposal_boxes = boxes_per_image - prop.objectness_logits = logit - proposals.append(prop) - return proposals - - def _run_stage(self, features, proposals, stage, classifier_info=(None, None, None)): - """ - Support classifier_info and add_feature_to_prop - """ - pool_boxes = [x.proposal_boxes for x in proposals] - box_features = self.box_pooler(features, pool_boxes) - box_features = _ScaleGradient.apply(box_features, 1.0 / self.num_cascade_stages) - box_features = self.box_head[stage](box_features) - if self.add_feature_to_prop: - feats_per_image = box_features.split([len(p) for p in proposals], dim=0) - for feat, p in zip(feats_per_image, proposals, strict=False): - p.feat = feat - return self.box_predictor[stage](box_features, classifier_info=classifier_info) diff --git a/dimos/models/Detic/detic/modeling/roi_heads/res5_roi_heads.py b/dimos/models/Detic/detic/modeling/roi_heads/res5_roi_heads.py deleted file mode 100644 index 642f889b5d..0000000000 --- a/dimos/models/Detic/detic/modeling/roi_heads/res5_roi_heads.py +++ /dev/null @@ -1,175 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from detectron2.config import configurable -from detectron2.layers import ShapeSpec -from detectron2.modeling.roi_heads.roi_heads import ROI_HEADS_REGISTRY, Res5ROIHeads -from detectron2.structures import Boxes, Instances -import torch - -from ..debug import debug_second_stage -from .detic_fast_rcnn import DeticFastRCNNOutputLayers - - -@ROI_HEADS_REGISTRY.register() -class CustomRes5ROIHeads(Res5ROIHeads): - @configurable - def __init__(self, **kwargs) -> None: - cfg = kwargs.pop("cfg") - super().__init__(**kwargs) - stage_channel_factor = 2**3 - out_channels = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS * stage_channel_factor - - self.with_image_labels = cfg.WITH_IMAGE_LABELS - self.ws_num_props = cfg.MODEL.ROI_BOX_HEAD.WS_NUM_PROPS - self.add_image_box = cfg.MODEL.ROI_BOX_HEAD.ADD_IMAGE_BOX - self.add_feature_to_prop = cfg.MODEL.ROI_BOX_HEAD.ADD_FEATURE_TO_PROP - self.image_box_size = cfg.MODEL.ROI_BOX_HEAD.IMAGE_BOX_SIZE - self.box_predictor = DeticFastRCNNOutputLayers( - cfg, ShapeSpec(channels=out_channels, height=1, width=1) - ) - - self.save_debug = cfg.SAVE_DEBUG - self.save_debug_path = cfg.SAVE_DEBUG_PATH - if self.save_debug: - self.debug_show_name = cfg.DEBUG_SHOW_NAME - self.vis_thresh = cfg.VIS_THRESH - self.pixel_mean = ( - torch.Tensor(cfg.MODEL.PIXEL_MEAN).to(torch.device(cfg.MODEL.DEVICE)).view(3, 1, 1) - ) - self.pixel_std = ( - torch.Tensor(cfg.MODEL.PIXEL_STD).to(torch.device(cfg.MODEL.DEVICE)).view(3, 1, 1) - ) - self.bgr = cfg.INPUT.FORMAT == "BGR" - - @classmethod - def from_config(cls, cfg, input_shape): - ret = super().from_config(cfg, input_shape) - ret["cfg"] = cfg - return ret - - def forward( - self, - images, - features, - proposals, - targets=None, - ann_type: str="box", - classifier_info=(None, None, None), - ): - """ - enable debug and image labels - classifier_info is shared across the batch - """ - if not self.save_debug: - del images - - if self.training: - if ann_type in ["box"]: - proposals = self.label_and_sample_proposals(proposals, targets) - else: - proposals = self.get_top_proposals(proposals) - - proposal_boxes = [x.proposal_boxes for x in proposals] - box_features = self._shared_roi_transform( - [features[f] for f in self.in_features], proposal_boxes - ) - predictions = self.box_predictor( - box_features.mean(dim=[2, 3]), classifier_info=classifier_info - ) - - if self.add_feature_to_prop: - feats_per_image = box_features.mean(dim=[2, 3]).split( - [len(p) for p in proposals], dim=0 - ) - for feat, p in zip(feats_per_image, proposals, strict=False): - p.feat = feat - - if self.training: - del features - if ann_type != "box": - image_labels = [x._pos_category_ids for x in targets] - losses = self.box_predictor.image_label_losses( - predictions, - proposals, - image_labels, - classifier_info=classifier_info, - ann_type=ann_type, - ) - else: - losses = self.box_predictor.losses((predictions[0], predictions[1]), proposals) - if self.with_image_labels: - assert "image_loss" not in losses - losses["image_loss"] = predictions[0].new_zeros([1])[0] - if self.save_debug: - def denormalizer(x): - return x * self.pixel_std + self.pixel_mean - if ann_type != "box": - image_labels = [x._pos_category_ids for x in targets] - else: - image_labels = [[] for x in targets] - debug_second_stage( - [denormalizer(x.clone()) for x in images], - targets, - proposals=proposals, - save_debug=self.save_debug, - debug_show_name=self.debug_show_name, - vis_thresh=self.vis_thresh, - image_labels=image_labels, - save_debug_path=self.save_debug_path, - bgr=self.bgr, - ) - return proposals, losses - else: - pred_instances, _ = self.box_predictor.inference(predictions, proposals) - pred_instances = self.forward_with_given_boxes(features, pred_instances) - if self.save_debug: - def denormalizer(x): - return x * self.pixel_std + self.pixel_mean - debug_second_stage( - [denormalizer(x.clone()) for x in images], - pred_instances, - proposals=proposals, - save_debug=self.save_debug, - debug_show_name=self.debug_show_name, - vis_thresh=self.vis_thresh, - save_debug_path=self.save_debug_path, - bgr=self.bgr, - ) - return pred_instances, {} - - def get_top_proposals(self, proposals): - for i in range(len(proposals)): - proposals[i].proposal_boxes.clip(proposals[i].image_size) - proposals = [p[: self.ws_num_props] for p in proposals] - for i, p in enumerate(proposals): - p.proposal_boxes.tensor = p.proposal_boxes.tensor.detach() - if self.add_image_box: - proposals[i] = self._add_image_box(p) - return proposals - - def _add_image_box(self, p, use_score: bool=False): - image_box = Instances(p.image_size) - n = 1 - h, w = p.image_size - if self.image_box_size < 1.0: - f = self.image_box_size - image_box.proposal_boxes = Boxes( - p.proposal_boxes.tensor.new_tensor( - [ - w * (1.0 - f) / 2.0, - h * (1.0 - f) / 2.0, - w * (1.0 - (1.0 - f) / 2.0), - h * (1.0 - (1.0 - f) / 2.0), - ] - ).view(n, 4) - ) - else: - image_box.proposal_boxes = Boxes( - p.proposal_boxes.tensor.new_tensor([0, 0, w, h]).view(n, 4) - ) - if use_score: - image_box.scores = p.objectness_logits.new_ones(n) - image_box.pred_classes = p.objectness_logits.new_zeros(n, dtype=torch.long) - image_box.objectness_logits = p.objectness_logits.new_ones(n) - else: - image_box.objectness_logits = p.objectness_logits.new_ones(n) - return Instances.cat([p, image_box]) diff --git a/dimos/models/Detic/detic/modeling/roi_heads/zero_shot_classifier.py b/dimos/models/Detic/detic/modeling/roi_heads/zero_shot_classifier.py deleted file mode 100644 index d436e6be34..0000000000 --- a/dimos/models/Detic/detic/modeling/roi_heads/zero_shot_classifier.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from detectron2.config import configurable -from detectron2.layers import ShapeSpec -import numpy as np -import torch -from torch import nn -from torch.nn import functional as F - - -class ZeroShotClassifier(nn.Module): - @configurable - def __init__( - self, - input_shape: ShapeSpec, - *, - num_classes: int, - zs_weight_path: str, - zs_weight_dim: int = 512, - use_bias: float = 0.0, - norm_weight: bool = True, - norm_temperature: float = 50.0, - ) -> None: - super().__init__() - if isinstance(input_shape, int): # some backward compatibility - input_shape = ShapeSpec(channels=input_shape) - input_size = input_shape.channels * (input_shape.width or 1) * (input_shape.height or 1) - self.norm_weight = norm_weight - self.norm_temperature = norm_temperature - - self.use_bias = use_bias < 0 - if self.use_bias: - self.cls_bias = nn.Parameter(torch.ones(1) * use_bias) - - self.linear = nn.Linear(input_size, zs_weight_dim) - - if zs_weight_path == "rand": - zs_weight = torch.randn((zs_weight_dim, num_classes)) - nn.init.normal_(zs_weight, std=0.01) - else: - zs_weight = ( - torch.tensor(np.load(zs_weight_path), dtype=torch.float32) - .permute(1, 0) - .contiguous() - ) # D x C - zs_weight = torch.cat( - [zs_weight, zs_weight.new_zeros((zs_weight_dim, 1))], dim=1 - ) # D x (C + 1) - - if self.norm_weight: - zs_weight = F.normalize(zs_weight, p=2, dim=0) - - if zs_weight_path == "rand": - self.zs_weight = nn.Parameter(zs_weight) - else: - self.register_buffer("zs_weight", zs_weight) - - assert self.zs_weight.shape[1] == num_classes + 1, self.zs_weight.shape - - @classmethod - def from_config(cls, cfg, input_shape): - return { - "input_shape": input_shape, - "num_classes": cfg.MODEL.ROI_HEADS.NUM_CLASSES, - "zs_weight_path": cfg.MODEL.ROI_BOX_HEAD.ZEROSHOT_WEIGHT_PATH, - "zs_weight_dim": cfg.MODEL.ROI_BOX_HEAD.ZEROSHOT_WEIGHT_DIM, - "use_bias": cfg.MODEL.ROI_BOX_HEAD.USE_BIAS, - "norm_weight": cfg.MODEL.ROI_BOX_HEAD.NORM_WEIGHT, - "norm_temperature": cfg.MODEL.ROI_BOX_HEAD.NORM_TEMP, - } - - def forward(self, x, classifier=None): - """ - Inputs: - x: B x D' - classifier_info: (C', C' x D) - """ - x = self.linear(x) - if classifier is not None: - zs_weight = classifier.permute(1, 0).contiguous() # D x C' - zs_weight = F.normalize(zs_weight, p=2, dim=0) if self.norm_weight else zs_weight - else: - zs_weight = self.zs_weight - if self.norm_weight: - x = self.norm_temperature * F.normalize(x, p=2, dim=1) - x = torch.mm(x, zs_weight) - if self.use_bias: - x = x + self.cls_bias - return x diff --git a/dimos/models/Detic/detic/modeling/text/text_encoder.py b/dimos/models/Detic/detic/modeling/text/text_encoder.py deleted file mode 100644 index 7c9b15bdf5..0000000000 --- a/dimos/models/Detic/detic/modeling/text/text_encoder.py +++ /dev/null @@ -1,198 +0,0 @@ -# This code is modified from https://github.com/openai/CLIP/blob/main/clip/clip.py -# Modified by Xingyi Zhou -# The original code is under MIT license -# Copyright (c) Facebook, Inc. and its affiliates. -from collections import OrderedDict -from typing import List, Union - -from clip.simple_tokenizer import SimpleTokenizer as _Tokenizer -import torch -from torch import nn - -__all__ = ["tokenize"] - -count = 0 - - -class LayerNorm(nn.LayerNorm): - """Subclass torch's LayerNorm to handle fp16.""" - - def forward(self, x: torch.Tensor): - orig_type = x.dtype - ret = super().forward(x.type(torch.float32)) - return ret.type(orig_type) - - -class QuickGELU(nn.Module): - def forward(self, x: torch.Tensor): - return x * torch.sigmoid(1.702 * x) - - -class ResidualAttentionBlock(nn.Module): - def __init__(self, d_model: int, n_head: int, attn_mask: torch.Tensor = None) -> None: - super().__init__() - - self.attn = nn.MultiheadAttention(d_model, n_head) - self.ln_1 = LayerNorm(d_model) - self.mlp = nn.Sequential( - OrderedDict( - [ - ("c_fc", nn.Linear(d_model, d_model * 4)), - ("gelu", QuickGELU()), - ("c_proj", nn.Linear(d_model * 4, d_model)), - ] - ) - ) - self.ln_2 = LayerNorm(d_model) - self.attn_mask = attn_mask - - def attention(self, x: torch.Tensor): - self.attn_mask = ( - self.attn_mask.to(dtype=x.dtype, device=x.device) - if self.attn_mask is not None - else None - ) - return self.attn(x, x, x, need_weights=False, attn_mask=self.attn_mask)[0] - - def forward(self, x: torch.Tensor): - x = x + self.attention(self.ln_1(x)) - x = x + self.mlp(self.ln_2(x)) - return x - - -class Transformer(nn.Module): - def __init__(self, width: int, layers: int, heads: int, attn_mask: torch.Tensor = None) -> None: - super().__init__() - self.width = width - self.layers = layers - self.resblocks = nn.Sequential( - *[ResidualAttentionBlock(width, heads, attn_mask) for _ in range(layers)] - ) - - def forward(self, x: torch.Tensor): - return self.resblocks(x) - - -class CLIPTEXT(nn.Module): - def __init__( - self, - embed_dim: int=512, - # text - context_length: int=77, - vocab_size: int=49408, - transformer_width: int=512, - transformer_heads: int=8, - transformer_layers: int=12, - ) -> None: - super().__init__() - - self._tokenizer = _Tokenizer() - self.context_length = context_length - - self.transformer = Transformer( - width=transformer_width, - layers=transformer_layers, - heads=transformer_heads, - attn_mask=self.build_attention_mask(), - ) - - self.vocab_size = vocab_size - self.token_embedding = nn.Embedding(vocab_size, transformer_width) - self.positional_embedding = nn.Parameter( - torch.empty(self.context_length, transformer_width) - ) - self.ln_final = LayerNorm(transformer_width) - - self.text_projection = nn.Parameter(torch.empty(transformer_width, embed_dim)) - # self.logit_scale = nn.Parameter(torch.ones([]) * np.log(1 / 0.07)) - - self.initialize_parameters() - - def initialize_parameters(self) -> None: - nn.init.normal_(self.token_embedding.weight, std=0.02) - nn.init.normal_(self.positional_embedding, std=0.01) - - proj_std = (self.transformer.width**-0.5) * ((2 * self.transformer.layers) ** -0.5) - attn_std = self.transformer.width**-0.5 - fc_std = (2 * self.transformer.width) ** -0.5 - for block in self.transformer.resblocks: - nn.init.normal_(block.attn.in_proj_weight, std=attn_std) - nn.init.normal_(block.attn.out_proj.weight, std=proj_std) - nn.init.normal_(block.mlp.c_fc.weight, std=fc_std) - nn.init.normal_(block.mlp.c_proj.weight, std=proj_std) - - if self.text_projection is not None: - nn.init.normal_(self.text_projection, std=self.transformer.width**-0.5) - - def build_attention_mask(self): - # lazily create causal attention mask, with full attention between the vision tokens - # pytorch uses additive attention mask; fill with -inf - mask = torch.empty(self.context_length, self.context_length) - mask.fill_(float("-inf")) - mask.triu_(1) # zero out the lower diagonal - return mask - - @property - def device(self): - return self.text_projection.device - - @property - def dtype(self): - return self.text_projection.dtype - - def tokenize(self, texts: Union[str, list[str]], context_length: int = 77) -> torch.LongTensor: - """ """ - if isinstance(texts, str): - texts = [texts] - - sot_token = self._tokenizer.encoder["<|startoftext|>"] - eot_token = self._tokenizer.encoder["<|endoftext|>"] - all_tokens = [[sot_token, *self._tokenizer.encode(text), eot_token] for text in texts] - result = torch.zeros(len(all_tokens), context_length, dtype=torch.long) - - for i, tokens in enumerate(all_tokens): - if len(tokens) > context_length: - st = torch.randint(len(tokens) - context_length + 1, (1,))[0].item() - tokens = tokens[st : st + context_length] - # raise RuntimeError(f"Input {texts[i]} is too long for context length {context_length}") - result[i, : len(tokens)] = torch.tensor(tokens) - - return result - - def encode_text(self, text: str): - x = self.token_embedding(text).type(self.dtype) # [batch_size, n_ctx, d_model] - x = x + self.positional_embedding.type(self.dtype) - x = x.permute(1, 0, 2) # NLD -> LND - x = self.transformer(x) - x = x.permute(1, 0, 2) # LND -> NLD - x = self.ln_final(x).type(self.dtype) - # take features from the eot embedding (eot_token is the highest number in each sequence) - x = x[torch.arange(x.shape[0]), text.argmax(dim=-1)] @ self.text_projection - return x - - def forward(self, captions): - """ - captions: list of strings - """ - text = self.tokenize(captions).to(self.device) # B x L x D - features = self.encode_text(text) # B x D - return features - - -def build_text_encoder(pretrain: bool=True): - text_encoder = CLIPTEXT() - if pretrain: - import clip - - pretrained_model, _ = clip.load("ViT-B/32", device="cpu") - state_dict = pretrained_model.state_dict() - to_delete_keys = ["logit_scale", "input_resolution", "context_length", "vocab_size"] + [ - k for k in state_dict.keys() if k.startswith("visual.") - ] - for k in to_delete_keys: - if k in state_dict: - del state_dict[k] - print("Loading pretrained CLIP") - text_encoder.load_state_dict(state_dict) - # import pdb; pdb.set_trace() - return text_encoder diff --git a/dimos/models/Detic/detic/modeling/utils.py b/dimos/models/Detic/detic/modeling/utils.py deleted file mode 100644 index f24a0699a1..0000000000 --- a/dimos/models/Detic/detic/modeling/utils.py +++ /dev/null @@ -1,46 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import json - -import numpy as np -import torch -from torch.nn import functional as F - - -def load_class_freq(path: str="datasets/metadata/lvis_v1_train_cat_info.json", freq_weight: float=1.0): - cat_info = json.load(open(path)) - cat_info = torch.tensor([c["image_count"] for c in sorted(cat_info, key=lambda x: x["id"])]) - freq_weight = cat_info.float() ** freq_weight - return freq_weight - - -def get_fed_loss_inds(gt_classes, num_sample_cats: int, C, weight=None): - appeared = torch.unique(gt_classes) # C' - prob = appeared.new_ones(C + 1).float() - prob[-1] = 0 - if len(appeared) < num_sample_cats: - if weight is not None: - prob[:C] = weight.float().clone() - prob[appeared] = 0 - more_appeared = torch.multinomial(prob, num_sample_cats - len(appeared), replacement=False) - appeared = torch.cat([appeared, more_appeared]) - return appeared - - -def reset_cls_test(model, cls_path, num_classes: int) -> None: - model.roi_heads.num_classes = num_classes - if type(cls_path) == str: - print("Resetting zs_weight", cls_path) - zs_weight = ( - torch.tensor(np.load(cls_path), dtype=torch.float32).permute(1, 0).contiguous() - ) # D x C - else: - zs_weight = cls_path - zs_weight = torch.cat( - [zs_weight, zs_weight.new_zeros((zs_weight.shape[0], 1))], dim=1 - ) # D x (C + 1) - if model.roi_heads.box_predictor[0].cls_score.norm_weight: - zs_weight = F.normalize(zs_weight, p=2, dim=0) - zs_weight = zs_weight.to(model.device) - for k in range(len(model.roi_heads.box_predictor)): - del model.roi_heads.box_predictor[k].cls_score.zs_weight - model.roi_heads.box_predictor[k].cls_score.zs_weight = zs_weight diff --git a/dimos/models/Detic/detic/predictor.py b/dimos/models/Detic/detic/predictor.py deleted file mode 100644 index a85941e25a..0000000000 --- a/dimos/models/Detic/detic/predictor.py +++ /dev/null @@ -1,254 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import atexit -import bisect -from collections import deque -import multiprocessing as mp - -import cv2 -from detectron2.data import MetadataCatalog -from detectron2.engine.defaults import DefaultPredictor -from detectron2.utils.video_visualizer import VideoVisualizer -from detectron2.utils.visualizer import ColorMode, Visualizer -import torch - -from .modeling.utils import reset_cls_test - - -def get_clip_embeddings(vocabulary, prompt: str="a "): - from detic.modeling.text.text_encoder import build_text_encoder - - text_encoder = build_text_encoder(pretrain=True) - text_encoder.eval() - texts = [prompt + x for x in vocabulary] - emb = text_encoder(texts).detach().permute(1, 0).contiguous().cpu() - return emb - - -BUILDIN_CLASSIFIER = { - "lvis": "datasets/metadata/lvis_v1_clip_a+cname.npy", - "objects365": "datasets/metadata/o365_clip_a+cnamefix.npy", - "openimages": "datasets/metadata/oid_clip_a+cname.npy", - "coco": "datasets/metadata/coco_clip_a+cname.npy", -} - -BUILDIN_METADATA_PATH = { - "lvis": "lvis_v1_val", - "objects365": "objects365_v2_val", - "openimages": "oid_val_expanded", - "coco": "coco_2017_val", -} - - -class VisualizationDemo: - def __init__(self, cfg, args, instance_mode=ColorMode.IMAGE, parallel: bool=False) -> None: - """ - Args: - cfg (CfgNode): - instance_mode (ColorMode): - parallel (bool): whether to run the model in different processes from visualization. - Useful since the visualization logic can be slow. - """ - if args.vocabulary == "custom": - self.metadata = MetadataCatalog.get("__unused") - self.metadata.thing_classes = args.custom_vocabulary.split(",") - classifier = get_clip_embeddings(self.metadata.thing_classes) - else: - self.metadata = MetadataCatalog.get(BUILDIN_METADATA_PATH[args.vocabulary]) - classifier = BUILDIN_CLASSIFIER[args.vocabulary] - - num_classes = len(self.metadata.thing_classes) - self.cpu_device = torch.device("cpu") - self.instance_mode = instance_mode - - self.parallel = parallel - if parallel: - num_gpu = torch.cuda.device_count() - self.predictor = AsyncPredictor(cfg, num_gpus=num_gpu) - else: - self.predictor = DefaultPredictor(cfg) - reset_cls_test(self.predictor.model, classifier, num_classes) - - def run_on_image(self, image): - """ - Args: - image (np.ndarray): an image of shape (H, W, C) (in BGR order). - This is the format used by OpenCV. - - Returns: - predictions (dict): the output of the model. - vis_output (VisImage): the visualized image output. - """ - vis_output = None - predictions = self.predictor(image) - # Convert image from OpenCV BGR format to Matplotlib RGB format. - image = image[:, :, ::-1] - visualizer = Visualizer(image, self.metadata, instance_mode=self.instance_mode) - if "panoptic_seg" in predictions: - panoptic_seg, segments_info = predictions["panoptic_seg"] - vis_output = visualizer.draw_panoptic_seg_predictions( - panoptic_seg.to(self.cpu_device), segments_info - ) - else: - if "sem_seg" in predictions: - vis_output = visualizer.draw_sem_seg( - predictions["sem_seg"].argmax(dim=0).to(self.cpu_device) - ) - if "instances" in predictions: - instances = predictions["instances"].to(self.cpu_device) - vis_output = visualizer.draw_instance_predictions(predictions=instances) - - return predictions, vis_output - - def _frame_from_video(self, video): - while video.isOpened(): - success, frame = video.read() - if success: - yield frame - else: - break - - def run_on_video(self, video): - """ - Visualizes predictions on frames of the input video. - - Args: - video (cv2.VideoCapture): a :class:`VideoCapture` object, whose source can be - either a webcam or a video file. - - Yields: - ndarray: BGR visualizations of each video frame. - """ - video_visualizer = VideoVisualizer(self.metadata, self.instance_mode) - - def process_predictions(frame, predictions): - frame = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB) - if "panoptic_seg" in predictions: - panoptic_seg, segments_info = predictions["panoptic_seg"] - vis_frame = video_visualizer.draw_panoptic_seg_predictions( - frame, panoptic_seg.to(self.cpu_device), segments_info - ) - elif "instances" in predictions: - predictions = predictions["instances"].to(self.cpu_device) - vis_frame = video_visualizer.draw_instance_predictions(frame, predictions) - elif "sem_seg" in predictions: - vis_frame = video_visualizer.draw_sem_seg( - frame, predictions["sem_seg"].argmax(dim=0).to(self.cpu_device) - ) - - # Converts Matplotlib RGB format to OpenCV BGR format - vis_frame = cv2.cvtColor(vis_frame.get_image(), cv2.COLOR_RGB2BGR) - return vis_frame - - frame_gen = self._frame_from_video(video) - if self.parallel: - buffer_size = self.predictor.default_buffer_size - - frame_data = deque() - - for cnt, frame in enumerate(frame_gen): - frame_data.append(frame) - self.predictor.put(frame) - - if cnt >= buffer_size: - frame = frame_data.popleft() - predictions = self.predictor.get() - yield process_predictions(frame, predictions) - - while len(frame_data): - frame = frame_data.popleft() - predictions = self.predictor.get() - yield process_predictions(frame, predictions) - else: - for frame in frame_gen: - yield process_predictions(frame, self.predictor(frame)) - - -class AsyncPredictor: - """ - A predictor that runs the model asynchronously, possibly on >1 GPUs. - Because rendering the visualization takes considerably amount of time, - this helps improve throughput a little bit when rendering videos. - """ - - class _StopToken: - pass - - class _PredictWorker(mp.Process): - def __init__(self, cfg, task_queue, result_queue) -> None: - self.cfg = cfg - self.task_queue = task_queue - self.result_queue = result_queue - super().__init__() - - def run(self) -> None: - predictor = DefaultPredictor(self.cfg) - - while True: - task = self.task_queue.get() - if isinstance(task, AsyncPredictor._StopToken): - break - idx, data = task - result = predictor(data) - self.result_queue.put((idx, result)) - - def __init__(self, cfg, num_gpus: int = 1) -> None: - """ - Args: - cfg (CfgNode): - num_gpus (int): if 0, will run on CPU - """ - num_workers = max(num_gpus, 1) - self.task_queue = mp.Queue(maxsize=num_workers * 3) - self.result_queue = mp.Queue(maxsize=num_workers * 3) - self.procs = [] - for gpuid in range(max(num_gpus, 1)): - cfg = cfg.clone() - cfg.defrost() - cfg.MODEL.DEVICE = f"cuda:{gpuid}" if num_gpus > 0 else "cpu" - self.procs.append( - AsyncPredictor._PredictWorker(cfg, self.task_queue, self.result_queue) - ) - - self.put_idx = 0 - self.get_idx = 0 - self.result_rank = [] - self.result_data = [] - - for p in self.procs: - p.start() - atexit.register(self.shutdown) - - def put(self, image) -> None: - self.put_idx += 1 - self.task_queue.put((self.put_idx, image)) - - def get(self): - self.get_idx += 1 # the index needed for this request - if len(self.result_rank) and self.result_rank[0] == self.get_idx: - res = self.result_data[0] - del self.result_data[0], self.result_rank[0] - return res - - while True: - # make sure the results are returned in the correct order - idx, res = self.result_queue.get() - if idx == self.get_idx: - return res - insert = bisect.bisect(self.result_rank, idx) - self.result_rank.insert(insert, idx) - self.result_data.insert(insert, res) - - def __len__(self) -> int: - return self.put_idx - self.get_idx - - def __call__(self, image): - self.put(image) - return self.get() - - def shutdown(self) -> None: - for _ in self.procs: - self.task_queue.put(AsyncPredictor._StopToken()) - - @property - def default_buffer_size(self): - return len(self.procs) * 5 diff --git a/dimos/models/Detic/docs/INSTALL.md b/dimos/models/Detic/docs/INSTALL.md deleted file mode 100644 index 1d5fbc4ae1..0000000000 --- a/dimos/models/Detic/docs/INSTALL.md +++ /dev/null @@ -1,33 +0,0 @@ -# Installation - -### Requirements -- Linux or macOS with Python ≄ 3.6 -- PyTorch ≄ 1.8. - Install them together at [pytorch.org](https://pytorch.org) to make sure of this. Note, please check - PyTorch version matches that is required by Detectron2. -- Detectron2: follow [Detectron2 installation instructions](https://detectron2.readthedocs.io/tutorials/install.html). - - -### Example conda environment setup -```bash -conda create --name detic python=3.8 -y -conda activate detic -conda install pytorch torchvision torchaudio cudatoolkit=11.1 -c pytorch-lts -c nvidia - -# under your working directory -git clone git@github.com:facebookresearch/detectron2.git -cd detectron2 -pip install -e . - -cd .. -git clone https://github.com/facebookresearch/Detic.git --recurse-submodules -cd Detic -pip install -r requirements.txt -``` - -Our project uses two submodules, [CenterNet2](https://github.com/xingyizhou/CenterNet2.git) and [Deformable-DETR](https://github.com/fundamentalvision/Deformable-DETR.git). If you forget to add `--recurse-submodules`, do `git submodule init` and then `git submodule update`. To train models with Deformable-DETR (optional), we need to compile it - -``` -cd third_party/Deformable-DETR/models/ops -./make.sh -``` \ No newline at end of file diff --git a/dimos/models/Detic/docs/MODEL_ZOO.md b/dimos/models/Detic/docs/MODEL_ZOO.md deleted file mode 100644 index fe7c795197..0000000000 --- a/dimos/models/Detic/docs/MODEL_ZOO.md +++ /dev/null @@ -1,143 +0,0 @@ -# Detic model zoo - -## Introduction - -This file documents a collection of models reported in our paper. -The training time was measured on [Big Basin](https://engineering.fb.com/data-center-engineering/introducing-big-basin-our-next-generation-ai-hardware/) -servers with 8 NVIDIA V100 GPUs & NVLink. - -#### How to Read the Tables - -The "Name" column contains a link to the config file. -To train a model, run - -``` -python train_net.py --num-gpus 8 --config-file /path/to/config/name.yaml -``` - -To evaluate a model with a trained/ pretrained model, run - -``` -python train_net.py --num-gpus 8 --config-file /path/to/config/name.yaml --eval-only MODEL.WEIGHTS /path/to/weight.pth -``` - -#### Third-party ImageNet-21K Pretrained Models - -Our paper uses ImageNet-21K pretrained models that are not part of Detectron2 (ResNet-50-21K from [MIIL](https://github.com/Alibaba-MIIL/ImageNet21K) and SwinB-21K from [Swin-Transformer](https://github.com/microsoft/Swin-Transformer)). Before training, -please download the models and place them under `DETIC_ROOT/models/`, and following [this tool](../tools/convert-thirdparty-pretrained-model-to-d2.py) to convert the format. - - -## Open-vocabulary LVIS - -| Name |Training time | mask mAP | mask mAP_novel | Download | -|-----------------------|------------------|-----------|-----------------|----------| -|[Box-Supervised_C2_R50_640_4x](../configs/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.yaml) | 17h | 30.2 | 16.4 | [model](https://dl.fbaipublicfiles.com/detic/BoxSup-C2_Lbase_CLIP_R5021k_640b64_4x.pth) | -|[Detic_C2_IN-L_R50_640_4x](../configs/Detic_LbaseI_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml) | 22h | 32.4 | 24.9 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LbaseI_CLIP_R5021k_640b64_4x_ft4x_max-size.pth) | -|[Detic_C2_CCimg_R50_640_4x](../configs/Detic_LbaseCCimg_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml) | 22h | 31.0 | 19.8 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LbaseCCimg_CLIP_R5021k_640b64_4x_ft4x_max-size.pth) | -|[Detic_C2_CCcapimg_R50_640_4x](../configs/Detic_LbaseCCcapimg_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml) | 22h | 31.0 | 21.3 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LbaseCCcapimg_CLIP_R5021k_640b64_4x_ft4x_max-size.pth) | -|[Box-Supervised_C2_SwinB_896_4x](../configs/BoxSup-C2_Lbase_CLIP_SwinB_896b32_4x.yaml) | 43h | 38.4 | 21.9 | [model](https://dl.fbaipublicfiles.com/detic/BoxSup-C2_Lbase_CLIP_SwinB_896b32_4x.pth) | -|[Detic_C2_IN-L_SwinB_896_4x](../configs/Detic_LbaseI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml) | 47h | 40.7 | 33.8 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LbaseI_CLIP_SwinB_896b32_4x_ft4x_max-size.pth) | - - -#### Note - -- The open-vocabulary LVIS setup is LVIS without rare class annotations in training. We evaluate rare classes as novel classes in testing. - -- The models with `C2` are trained using our improved LVIS baseline (Appendix D of the paper), including CenterNet2 detector, Federated Loss, large-scale jittering, etc. - -- All models use [CLIP](https://github.com/openai/CLIP) embeddings as classifiers. This makes the box-supervised models have non-zero mAP on novel classes. - -- The models with `IN-L` use the overlap classes between ImageNet-21K and LVIS as image-labeled data. - -- The models with `CC` use Conception Captions. `CCimg` uses image labels extracted from the captions (using a naive text-match) as image-labeled data. `CCcapimg` additionally uses the row captions (Appendix C of the paper). - -- The Detic models are finetuned on the corresponding Box-Supervised models above (indicated by MODEL.WEIGHTS in the config files). Please train or download the Box-Supervised model and place them under `DETIC_ROOT/models/` before training the Detic models. - - -## Standard LVIS - -| Name |Training time | mask mAP | mask mAP_rare | Download | -|-----------------------|------------------|-----------|-----------------|----------| -|[Box-Supervised_C2_R50_640_4x](../configs/BoxSup-C2_L_CLIP_R5021k_640b64_4x.yaml) | 17h | 31.5 | 25.6 | [model](https://dl.fbaipublicfiles.com/detic/BoxSup-C2_L_CLIP_R5021k_640b64_4x.pth) | -|[Detic_C2_R50_640_4x](../configs/Detic_LI_CLIP_R5021k_640b64_4x_ft4x_max-size.yaml) | 22h | 33.2 | 29.7 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LI_CLIP_R5021k_640b64_4x_ft4x_max-size.pth) | -|[Box-Supervised_C2_SwinB_896_4x](../configs/BoxSup-C2_L_CLIP_SwinB_896b32_4x.yaml) | 43h | 40.7 | 35.9 | [model](https://dl.fbaipublicfiles.com/detic/BoxSup-C2_L_CLIP_SwinB_896b32_4x.pth) | -|[Detic_C2_SwinB_896_4x](../configs/Detic_LI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml) | 47h | 41.7 | 41.7 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LI_CLIP_SwinB_896b32_4x_ft4x_max-size.pth) | - - -| Name |Training time | box mAP | box mAP_rare | Download | -|-----------------------|------------------|-----------|-----------------|----------| -|[Box-Supervised_DeformDETR_R50_4x](../configs/BoxSup-DeformDETR_L_R50_4x.yaml) | 31h | 31.7 | 21.4 | [model](https://dl.fbaipublicfiles.com/detic/BoxSup-DeformDETR_L_R50_4x.pth) | -|[Detic_DeformDETR_R50_4x](../configs/Detic_DeformDETR_LI_R50_4x_ft4x.yaml) | 47h | 32.5 | 26.2 | [model](https://dl.fbaipublicfiles.com/detic/Detic_DeformDETR_LI_R50_4x_ft4x.pth) | - - -#### Note - -- All Detic models use the overlap classes between ImageNet-21K and LVIS as image-labeled data; - -- The models with `C2` are trained using our improved LVIS baseline in the paper, including CenterNet2 detector, Federated loss, large-scale jittering, etc. - -- The models with `DeformDETR` are Deformable DETR models. We train the models with Federated Loss. - -## Open-vocabulary COCO - -| Name |Training time | box mAP50 | box mAP50_novel | Download | -|-----------------------|------------------|-----------|-----------------|----------| -|[BoxSup_CLIP_R50_1x](../configs/BoxSup_OVCOCO_CLIP_R50_1x.yaml) | 12h | 39.3 | 1.3 | [model](https://dl.fbaipublicfiles.com/detic/BoxSup_OVCOCO_CLIP_R50_1x.pth) | -|[Detic_CLIP_R50_1x_image](../configs/Detic_OVCOCO_CLIP_R50_1x_max-size.yaml) | 13h | 44.7 | 24.1 | [model](https://dl.fbaipublicfiles.com/detic/Detic_OVCOCO_CLIP_R50_1x_max-size.pth) | -|[Detic_CLIP_R50_1x_caption](../configs/Detic_OVCOCO_CLIP_R50_1x_caption.yaml) | 16h | 43.8 | 21.0 | [model](https://dl.fbaipublicfiles.com/detic/Detic_OVCOCO_CLIP_R50_1x_caption.pth) | -|[Detic_CLIP_R50_1x_caption-image](../configs/Detic_OVCOCO_CLIP_R50_1x_max-size_caption.yaml) | 16h | 45.0 | 27.8 | [model](https://dl.fbaipublicfiles.com/detic/Detic_OVCOCO_CLIP_R50_1x_max-size_caption.pth) | - -#### Note - -- All models are trained with ResNet50-C4 without multi-scale augmentation. All models use CLIP embeddings as the classifier. - -- We extract class names from COCO-captions as image-labels. `Detic_CLIP_R50_1x_image` uses the max-size loss; `Detic_CLIP_R50_1x_caption` directly uses CLIP caption embedding within each mini-batch for classification; `Detic_CLIP_R50_1x_caption-image` uses both losses. - -- We report box mAP50 under the "generalized" open-vocabulary setting. - - -## Cross-dataset evaluation - - -| Name |Training time | Objects365 box mAP | OpenImages box mAP50 | Download | -|-----------------------|------------------|-----------|-----------------|----------| -|[Box-Supervised_C2_SwinB_896_4x](../configs/BoxSup-C2_L_CLIP_SwinB_896b32_4x.yaml) | 43h | 19.1 | 46.2 | [model](https://dl.fbaipublicfiles.com/detic/BoxSup-C2_L_CLIP_SwinB_896b32_4x.pth) | -|[Detic_C2_SwinB_896_4x](../configs/Detic_LI_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml) | 47h | 21.2 |53.0 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LI_CLIP_SwinB_896b32_4x_ft4x_max-size.pth) | -|[Detic_C2_SwinB_896_4x_IN-21K](../configs/Detic_LI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml) | 47h | 21.4 | 55.2 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth) | -|[Box-Supervised_C2_SwinB_896_4x+COCO](../configs/BoxSup-C2_LCOCO_CLIP_SwinB_896b32_4x.yaml) | 43h | 19.7 | 46.4 | [model](https://dl.fbaipublicfiles.com/detic/BoxSup-C2_LCOCO_CLIP_SwinB_896b32_4x.pth) | -|[Detic_C2_SwinB_896_4x_IN-21K+COCO](../configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml) | 47h | 21.6 | 54.6 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth) | - - - -#### Note - -- `Box-Supervised_C2_SwinB_896_4x` and `Detic_C2_SwinB_896_4x` are the same model in the [Standard LVIS](#standard-lvis) section, but evaluated with Objects365/ OpenImages vocabulary (i.e. CLIP embeddings of the corresponding class names as classifier). To run the evaluation on Objects365/ OpenImages, run - - ``` - python train_net.py --num-gpus 8 --config-file configs/Detic_C2_SwinB_896_4x.yaml --eval-only DATASETS.TEST "('oid_val_expanded','objects365_v2_val',)" MODEL.RESET_CLS_TESTS True MODEL.TEST_CLASSIFIERS "('datasets/metadata/oid_clip_a+cname.npy','datasets/metadata/o365_clip_a+cnamefix.npy',)" MODEL.TEST_NUM_CLASSES "(500,365)" MODEL.MASK_ON False - ``` - -- `Detic_C2_SwinB_896_4x_IN-21K` trains on the full ImageNet-22K. We additionally use a dynamic class sampling ("Modified Federated Loss" in Section 4.4) and use a larger data sampling ratio of ImageNet images (1:16 instead of 1:4). - -- `Detic_C2_SwinB_896_4x_IN-21K-COCO` is a model trained on combined LVIS-COCO and ImageNet-21K for better demo purposes. LVIS models do not detect persons well due to its federated annotation protocol. LVIS+COCO models give better visual results. - - -## Real-time models - -| Name | Run time (ms) | LVIS box mAP | Download | -|-----------------------|------------------|-----------|-----------------| -|[Detic_C2_SwinB_896_4x_IN-21K+COCO (800x1333, no threshold)](../configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml) | 115 | 44.4 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth) | -|[Detic_C2_SwinB_896_4x_IN-21K+COCO](../configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml) | 46 | 35.0 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth) | -|[Detic_C2_ConvNeXtT_896_4x_IN-21K+COCO](../configs/Detic_LCOCOI21k_CLIP_CXT21k_640b32_4x_ft4x_max-size.yaml) | 26 | 30.7 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_CXT21k_640b32_4x_ft4x_max-size.pth) | -|[Detic_C2_R5021k_896_4x_IN-21K+COCO](../configs/Detic_LCOCOI21k_CLIP_R5021k_640b32_4x_ft4x_max-size.yaml) | 23 | 29.0 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_R5021k_640b32_4x_ft4x_max-size.pth) | -|[Detic_C2_R18_896_4x_IN-21K+COCO](../configs/Detic_LCOCOI21k_CLIP_R18_640b32_4x_ft4x_max-size.yaml) | 18 | 22.1 | [model](https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_R18_640b32_4x_ft4x_max-size.pth) | - -- `Detic_C2_SwinB_896_4x_IN-21K+COCO (800x1333, thresh 0.02)` is the entry on the [Cross-dataset evaluation](#Cross-dataset evaluation) section without the mask head. All other entries use a max-size of 640 and an output score threshold of 0.3 using the following command (e.g., with R50). - - ``` - python train_net.py --config-file configs/Detic_LCOCOI21k_CLIP_R5021k_640b32_4x_ft4x_max-size.yaml --num-gpus 2 --eval-only DATASETS.TEST "('lvis_v1_val',)" MODEL.RESET_CLS_TESTS True MODEL.TEST_CLASSIFIERS "('datasets/metadata/lvis_v1_clip_a+cname.npy',)" MODEL.TEST_NUM_CLASSES "(1203,)" MODEL.MASK_ON False MODEL.WEIGHTS models/Detic_LCOCOI21k_CLIP_R5021k_640b32_4x_ft4x_max-size.pth INPUT.MIN_SIZE_TEST 640 INPUT.MAX_SIZE_TEST 640 MODEL.ROI_HEADS.SCORE_THRESH_TEST 0.3 - ``` - -- All models are trained using the same training recipe except for different backbones. -- The ConvNeXtT and Res50 models are initialized from their corresponding ImageNet-21K pretrained models. The Res18 model is initialized from its ImageNet-1K pretrained model. -- The runtimes are measured on a local workstation with a Titan RTX GPU. diff --git a/dimos/models/Detic/docs/example_output_custom.jpeg b/dimos/models/Detic/docs/example_output_custom.jpeg deleted file mode 100644 index ac6aa3fb93..0000000000 Binary files a/dimos/models/Detic/docs/example_output_custom.jpeg and /dev/null differ diff --git a/dimos/models/Detic/docs/example_output_lvis.jpeg b/dimos/models/Detic/docs/example_output_lvis.jpeg deleted file mode 100644 index 3d22122059..0000000000 Binary files a/dimos/models/Detic/docs/example_output_lvis.jpeg and /dev/null differ diff --git a/dimos/models/Detic/docs/teaser.jpeg b/dimos/models/Detic/docs/teaser.jpeg deleted file mode 100644 index 2e8fbac2f8..0000000000 Binary files a/dimos/models/Detic/docs/teaser.jpeg and /dev/null differ diff --git a/dimos/models/Detic/lazy_train_net.py b/dimos/models/Detic/lazy_train_net.py deleted file mode 100644 index 3525a1f63a..0000000000 --- a/dimos/models/Detic/lazy_train_net.py +++ /dev/null @@ -1,132 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -""" -Training script using the new "LazyConfig" python config files. -This scripts reads a given python config file and runs the training or evaluation. -It can be used to train any models or dataset as long as they can be -instantiated by the recursive construction defined in the given config file. -Besides lazy construction of models, dataloader, etc., this scripts expects a -few common configuration parameters currently defined in "configs/common/train.py". -To add more complicated training logic, you can easily add other configs -in the config file and implement a new train_net.py to handle them. -""" - -import logging -import sys - -from detectron2.checkpoint import DetectionCheckpointer -from detectron2.config import LazyConfig, instantiate -from detectron2.engine import ( - AMPTrainer, - SimpleTrainer, - default_argument_parser, - default_setup, - default_writers, - hooks, - launch, -) -from detectron2.engine.defaults import create_ddp_model -from detectron2.evaluation import inference_on_dataset, print_csv_format -from detectron2.utils import comm - -sys.path.insert(0, "third_party/CenterNet2/") -sys.path.insert(0, "third_party/Deformable-DETR") -logger = logging.getLogger("detectron2") - - -def do_test(cfg, model): - if "evaluator" in cfg.dataloader: - ret = inference_on_dataset( - model, instantiate(cfg.dataloader.test), instantiate(cfg.dataloader.evaluator) - ) - print_csv_format(ret) - return ret - - -def do_train(args, cfg) -> None: - """ - Args: - cfg: an object with the following attributes: - model: instantiate to a module - dataloader.{train,test}: instantiate to dataloaders - dataloader.evaluator: instantiate to evaluator for test set - optimizer: instantaite to an optimizer - lr_multiplier: instantiate to a fvcore scheduler - train: other misc config defined in `common_train.py`, including: - output_dir (str) - init_checkpoint (str) - amp.enabled (bool) - max_iter (int) - eval_period, log_period (int) - device (str) - checkpointer (dict) - ddp (dict) - """ - model = instantiate(cfg.model) - logger = logging.getLogger("detectron2") - logger.info(f"Model:\n{model}") - model.to(cfg.train.device) - - cfg.optimizer.params.model = model - optim = instantiate(cfg.optimizer) - - train_loader = instantiate(cfg.dataloader.train) - - model = create_ddp_model(model, **cfg.train.ddp) - trainer = (AMPTrainer if cfg.train.amp.enabled else SimpleTrainer)(model, train_loader, optim) - checkpointer = DetectionCheckpointer( - model, - cfg.train.output_dir, - optimizer=optim, - trainer=trainer, - ) - train_hooks = [ - hooks.IterationTimer(), - hooks.LRScheduler(scheduler=instantiate(cfg.lr_multiplier)), - hooks.PeriodicCheckpointer(checkpointer, **cfg.train.checkpointer) - if comm.is_main_process() - else None, - hooks.EvalHook(cfg.train.eval_period, lambda: do_test(cfg, model)), - hooks.PeriodicWriter( - default_writers(cfg.train.output_dir, cfg.train.max_iter), - period=cfg.train.log_period, - ) - if comm.is_main_process() - else None, - ] - trainer.register_hooks(train_hooks) - - checkpointer.resume_or_load(cfg.train.init_checkpoint, resume=args.resume) - if args.resume and checkpointer.has_checkpoint(): - # The checkpoint stores the training iteration that just finished, thus we start - # at the next iteration - start_iter = trainer.iter + 1 - else: - start_iter = 0 - trainer.train(start_iter, cfg.train.max_iter) - - -def main(args) -> None: - cfg = LazyConfig.load(args.config_file) - cfg = LazyConfig.apply_overrides(cfg, args.opts) - default_setup(cfg, args) - - if args.eval_only: - model = instantiate(cfg.model) - model.to(cfg.train.device) - model = create_ddp_model(model) - DetectionCheckpointer(model).load(cfg.train.init_checkpoint) - print(do_test(cfg, model)) - else: - do_train(args, cfg) - - -if __name__ == "__main__": - args = default_argument_parser().parse_args() - launch( - main, - args.num_gpus, - num_machines=args.num_machines, - machine_rank=args.machine_rank, - dist_url=args.dist_url, - args=(args,), - ) diff --git a/dimos/models/Detic/predict.py b/dimos/models/Detic/predict.py deleted file mode 100644 index bf71d007a1..0000000000 --- a/dimos/models/Detic/predict.py +++ /dev/null @@ -1,102 +0,0 @@ -from pathlib import Path -import sys -import tempfile -import time - -import cog -import cv2 -from detectron2.config import get_cfg -from detectron2.data import MetadataCatalog - -# import some common detectron2 utilities -from detectron2.engine import DefaultPredictor -from detectron2.utils.visualizer import Visualizer - -# Detic libraries -sys.path.insert(0, "third_party/CenterNet2/") -from centernet.config import add_centernet_config -from detic.config import add_detic_config -from detic.modeling.text.text_encoder import build_text_encoder -from detic.modeling.utils import reset_cls_test - - -class Predictor(cog.Predictor): - def setup(self) -> None: - cfg = get_cfg() - add_centernet_config(cfg) - add_detic_config(cfg) - cfg.merge_from_file("configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml") - cfg.MODEL.WEIGHTS = "Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth" - cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.5 # set threshold for this model - cfg.MODEL.ROI_BOX_HEAD.ZEROSHOT_WEIGHT_PATH = "rand" - cfg.MODEL.ROI_HEADS.ONE_CLASS_PER_PROPOSAL = True - self.predictor = DefaultPredictor(cfg) - self.BUILDIN_CLASSIFIER = { - "lvis": "datasets/metadata/lvis_v1_clip_a+cname.npy", - "objects365": "datasets/metadata/o365_clip_a+cnamefix.npy", - "openimages": "datasets/metadata/oid_clip_a+cname.npy", - "coco": "datasets/metadata/coco_clip_a+cname.npy", - } - self.BUILDIN_METADATA_PATH = { - "lvis": "lvis_v1_val", - "objects365": "objects365_v2_val", - "openimages": "oid_val_expanded", - "coco": "coco_2017_val", - } - - @cog.input( - "image", - type=Path, - help="input image", - ) - @cog.input( - "vocabulary", - type=str, - default="lvis", - options=["lvis", "objects365", "openimages", "coco", "custom"], - help="Choose vocabulary", - ) - @cog.input( - "custom_vocabulary", - type=str, - default=None, - help="Type your own vocabularies, separated by coma ','", - ) - def predict(self, image, vocabulary, custom_vocabulary): - image = cv2.imread(str(image)) - if not vocabulary == "custom": - metadata = MetadataCatalog.get(self.BUILDIN_METADATA_PATH[vocabulary]) - classifier = self.BUILDIN_CLASSIFIER[vocabulary] - num_classes = len(metadata.thing_classes) - reset_cls_test(self.predictor.model, classifier, num_classes) - - else: - assert custom_vocabulary is not None and len(custom_vocabulary.split(",")) > 0, ( - "Please provide your own vocabularies when vocabulary is set to 'custom'." - ) - metadata = MetadataCatalog.get(str(time.time())) - metadata.thing_classes = custom_vocabulary.split(",") - classifier = get_clip_embeddings(metadata.thing_classes) - num_classes = len(metadata.thing_classes) - reset_cls_test(self.predictor.model, classifier, num_classes) - # Reset visualization threshold - output_score_threshold = 0.3 - for cascade_stages in range(len(self.predictor.model.roi_heads.box_predictor)): - self.predictor.model.roi_heads.box_predictor[ - cascade_stages - ].test_score_thresh = output_score_threshold - - outputs = self.predictor(image) - v = Visualizer(image[:, :, ::-1], metadata) - out = v.draw_instance_predictions(outputs["instances"].to("cpu")) - out_path = Path(tempfile.mkdtemp()) / "out.png" - cv2.imwrite(str(out_path), out.get_image()[:, :, ::-1]) - return out_path - - -def get_clip_embeddings(vocabulary, prompt: str="a "): - text_encoder = build_text_encoder(pretrain=True) - text_encoder.eval() - texts = [prompt + x for x in vocabulary] - emb = text_encoder(texts).detach().permute(1, 0).contiguous().cpu() - return emb diff --git a/dimos/models/Detic/requirements.txt b/dimos/models/Detic/requirements.txt deleted file mode 100644 index 518274db24..0000000000 --- a/dimos/models/Detic/requirements.txt +++ /dev/null @@ -1,11 +0,0 @@ -opencv-python -mss -timm -dataclasses -ftfy -regex -fasttext -scikit-learn -lvis -nltk -git+https://github.com/openai/CLIP.git diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/CODE_OF_CONDUCT.md b/dimos/models/Detic/third_party/CenterNet2/.github/CODE_OF_CONDUCT.md deleted file mode 100644 index 0f7ad8bfc1..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/CODE_OF_CONDUCT.md +++ /dev/null @@ -1,5 +0,0 @@ -# Code of Conduct - -Facebook has adopted a Code of Conduct that we expect project participants to adhere to. -Please read the [full text](https://code.fb.com/codeofconduct/) -so that you can understand what actions will and will not be tolerated. diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/CONTRIBUTING.md b/dimos/models/Detic/third_party/CenterNet2/.github/CONTRIBUTING.md deleted file mode 100644 index 9bab709cae..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/CONTRIBUTING.md +++ /dev/null @@ -1,68 +0,0 @@ -# Contributing to detectron2 - -## Issues -We use GitHub issues to track public bugs and questions. -Please make sure to follow one of the -[issue templates](https://github.com/facebookresearch/detectron2/issues/new/choose) -when reporting any issues. - -Facebook has a [bounty program](https://www.facebook.com/whitehat/) for the safe -disclosure of security bugs. In those cases, please go through the process -outlined on that page and do not file a public issue. - -## Pull Requests -We actively welcome pull requests. - -However, if you're adding any significant features (e.g. > 50 lines), please -make sure to discuss with maintainers about your motivation and proposals in an issue -before sending a PR. This is to save your time so you don't spend time on a PR that we'll not accept. - -We do not always accept new features, and we take the following -factors into consideration: - -1. Whether the same feature can be achieved without modifying detectron2. - Detectron2 is designed so that you can implement many extensions from the outside, e.g. - those in [projects](https://github.com/facebookresearch/detectron2/tree/master/projects). - * If some part of detectron2 is not extensible enough, you can also bring up a more general issue to - improve it. Such feature request may be useful to more users. -2. Whether the feature is potentially useful to a large audience (e.g. an impactful detection paper, a popular dataset, - a significant speedup, a widely useful utility), - or only to a small portion of users (e.g., a less-known paper, an improvement not in the object - detection field, a trick that's not very popular in the community, code to handle a non-standard type of data) - * Adoption of additional models, datasets, new task are by default not added to detectron2 before they - receive significant popularity in the community. - We sometimes accept such features in `projects/`, or as a link in `projects/README.md`. -3. Whether the proposed solution has a good design / interface. This can be discussed in the issue prior to PRs, or - in the form of a draft PR. -4. Whether the proposed solution adds extra mental/practical overhead to users who don't - need such feature. -5. Whether the proposed solution breaks existing APIs. - -To add a feature to an existing function/class `Func`, there are always two approaches: -(1) add new arguments to `Func`; (2) write a new `Func_with_new_feature`. -To meet the above criteria, we often prefer approach (2), because: - -1. It does not involve modifying or potentially breaking existing code. -2. It does not add overhead to users who do not need the new feature. -3. Adding new arguments to a function/class is not scalable w.r.t. all the possible new research ideas in the future. - -When sending a PR, please do: - -1. If a PR contains multiple orthogonal changes, split it to several PRs. -2. If you've added code that should be tested, add tests. -3. For PRs that need experiments (e.g. adding a new model or new methods), - you don't need to update model zoo, but do provide experiment results in the description of the PR. -4. If APIs are changed, update the documentation. -5. We use the [Google style docstrings](https://www.sphinx-doc.org/en/master/usage/extensions/napoleon.html) in python. -6. Make sure your code lints with `./dev/linter.sh`. - - -## Contributor License Agreement ("CLA") -In order to accept your pull request, we need you to submit a CLA. You only need -to do this once to work on any of Facebook's open source projects. - -Complete your CLA here: - -## License -By contributing to detectron2, you agree that your contributions will be licensed -under the LICENSE file in the root directory of this source tree. diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/Detectron2-Logo-Horz.svg b/dimos/models/Detic/third_party/CenterNet2/.github/Detectron2-Logo-Horz.svg deleted file mode 100644 index eb2d643ddd..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/Detectron2-Logo-Horz.svg +++ /dev/null @@ -1 +0,0 @@ -Detectron2-Logo-Horz \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE.md b/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE.md deleted file mode 100644 index 5e8aaa2d37..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE.md +++ /dev/null @@ -1,5 +0,0 @@ - -Please select an issue template from -https://github.com/facebookresearch/detectron2/issues/new/choose . - -Otherwise your issue will be closed. diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/bugs.md b/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/bugs.md deleted file mode 100644 index d0235c708a..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/bugs.md +++ /dev/null @@ -1,38 +0,0 @@ ---- -name: "šŸ› Bugs" -about: Report bugs in detectron2 -title: Please read & provide the following - ---- - -## Instructions To Reproduce the šŸ› Bug: -1. Full runnable code or full changes you made: -``` -If making changes to the project itself, please use output of the following command: -git rev-parse HEAD; git diff - - -``` -2. What exact command you run: -3. __Full logs__ or other relevant observations: -``` - -``` -4. please simplify the steps as much as possible so they do not require additional resources to - run, such as a private dataset. - -## Expected behavior: - -If there are no obvious error in "full logs" provided above, -please tell us the expected behavior. - -## Environment: - -Provide your environment information using the following command: -``` -wget -nc -q https://github.com/facebookresearch/detectron2/raw/main/detectron2/utils/collect_env.py && python collect_env.py -``` - -If your issue looks like an installation issue / environment issue, -please first try to solve it yourself with the instructions in -https://detectron2.readthedocs.io/tutorials/install.html#common-installation-issues diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/config.yml b/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/config.yml deleted file mode 100644 index c60c2e1430..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/config.yml +++ /dev/null @@ -1,17 +0,0 @@ -# require an issue template to be chosen -blank_issues_enabled: false - -contact_links: - - name: How-To / All Other Questions - url: https://github.com/facebookresearch/detectron2/discussions - about: Use "github discussions" for community support on general questions that don't belong to the above issue categories - - name: Detectron2 Documentation - url: https://detectron2.readthedocs.io/index.html - about: Check if your question is answered in tutorials or API docs - -# Unexpected behaviors & bugs are split to two templates. -# When they are one template, users think "it's not a bug" and don't choose the template. -# -# But the file name is still "unexpected-problems-bugs.md" so that old references -# to this issue template still works. -# It's ok since this template should be a superset of "bugs.md" (unexpected behaviors is a superset of bugs) diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/documentation.md b/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/documentation.md deleted file mode 100644 index 88214d62e5..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/documentation.md +++ /dev/null @@ -1,14 +0,0 @@ ---- -name: "\U0001F4DA Documentation Issue" -about: Report a problem about existing documentation, comments, website or tutorials. -labels: documentation - ---- - -## šŸ“š Documentation Issue - -This issue category is for problems about existing documentation, not for asking how-to questions. - -* Provide a link to an existing documentation/comment/tutorial: - -* How should the above documentation/comment/tutorial improve: diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/feature-request.md b/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/feature-request.md deleted file mode 100644 index 03a1e93d72..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/feature-request.md +++ /dev/null @@ -1,31 +0,0 @@ ---- -name: "\U0001F680Feature Request" -about: Suggest an improvement or new feature -labels: enhancement - ---- - -## šŸš€ Feature -A clear and concise description of the feature proposal. - -## Motivation & Examples - -Tell us why the feature is useful. - -Describe what the feature would look like, if it is implemented. -Best demonstrated using **code examples** in addition to words. - -## Note - -We only consider adding new features if they are relevant to many users. - -If you request implementation of research papers -- we only consider papers that have enough significance and prevalance in the object detection field. - -We do not take requests for most projects in the `projects/` directory, because they are research code release that is mainly for other researchers to reproduce results. - -"Make X faster/accurate" is not a valid feature request. "Implement a concrete feature that can make X faster/accurate" can be a valid feature request. - -Instead of adding features inside detectron2, -you can implement many features by [extending detectron2](https://detectron2.readthedocs.io/tutorials/extend.html). -The [projects/](https://github.com/facebookresearch/detectron2/tree/main/projects/) directory contains many of such examples. - diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/unexpected-problems-bugs.md b/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/unexpected-problems-bugs.md deleted file mode 100644 index 5db8f22415..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/ISSUE_TEMPLATE/unexpected-problems-bugs.md +++ /dev/null @@ -1,44 +0,0 @@ ---- -name: "😩 Unexpected behaviors" -about: Report unexpected behaviors when using detectron2 -title: Please read & provide the following - ---- - -If you do not know the root cause of the problem, please post according to this template: - -## Instructions To Reproduce the Issue: - -Check https://stackoverflow.com/help/minimal-reproducible-example for how to ask good questions. -Simplify the steps to reproduce the issue using suggestions from the above link, and provide them below: - -1. Full runnable code or full changes you made: -``` -If making changes to the project itself, please use output of the following command: -git rev-parse HEAD; git diff - - -``` -2. What exact command you run: -3. __Full logs__ or other relevant observations: -``` - -``` - -## Expected behavior: - -If there are no obvious crash in "full logs" provided above, -please tell us the expected behavior. - -If you expect a model to converge / work better, we do not help with such issues, unless -a model fails to reproduce the results in detectron2 model zoo, or proves existence of bugs. - -## Environment: - -Paste the output of the following command: -``` -wget -nc -nv https://github.com/facebookresearch/detectron2/raw/main/detectron2/utils/collect_env.py && python collect_env.py -``` - -If your issue looks like an installation issue / environment issue, -please first check common issues in https://detectron2.readthedocs.io/tutorials/install.html#common-installation-issues diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/pull_request_template.md b/dimos/models/Detic/third_party/CenterNet2/.github/pull_request_template.md deleted file mode 100644 index d71729baee..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/pull_request_template.md +++ /dev/null @@ -1,10 +0,0 @@ -Thanks for your contribution! - -If you're sending a large PR (e.g., >100 lines), -please open an issue first about the feature / bug, and indicate how you want to contribute. - -We do not always accept features. -See https://detectron2.readthedocs.io/notes/contributing.html#pull-requests about how we handle PRs. - -Before submitting a PR, please run `dev/linter.sh` to lint the code. - diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/check-template.yml b/dimos/models/Detic/third_party/CenterNet2/.github/workflows/check-template.yml deleted file mode 100644 index 3caed9df3c..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/check-template.yml +++ /dev/null @@ -1,86 +0,0 @@ -name: Check issue template - -on: - issues: - types: [opened] - -jobs: - check-template: - runs-on: ubuntu-latest - # comment this out when testing with https://github.com/nektos/act - if: ${{ github.repository_owner == 'facebookresearch' }} - steps: - - uses: actions/checkout@v2 - - uses: actions/github-script@v3 - with: - github-token: ${{secrets.GITHUB_TOKEN}} - script: | - // Arguments available: - // - github: A pre-authenticated octokit/rest.js client - // - context: An object containing the context of the workflow run - // - core: A reference to the @actions/core package - // - io: A reference to the @actions/io package - const fs = require('fs'); - const editDistance = require(`${process.env.GITHUB_WORKSPACE}/.github/workflows/levenshtein.js`).getEditDistance - issue = await github.issues.get({ - owner: context.issue.owner, - repo: context.issue.repo, - issue_number: context.issue.number, - }); - const hasLabel = issue.data.labels.length > 0; - if (hasLabel || issue.state === "closed") { - // don't require template on them - core.debug("Issue " + issue.data.title + " was skipped."); - return; - } - - sameAsTemplate = function(filename, body) { - let tmpl = fs.readFileSync(`.github/ISSUE_TEMPLATE/${filename}`, 'utf8'); - tmpl = tmpl.toLowerCase().split("---").slice(2).join("").trim(); - tmpl = tmpl.replace(/(\r\n|\n|\r)/gm, ""); - let bodyr = body.replace(/(\r\n|\n|\r)/gm, ""); - let dist = editDistance(tmpl, bodyr); - return dist < 8; - }; - - checkFail = async function(msg) { - core.info("Processing '" + issue.data.title + "' with message: " + msg); - await github.issues.addLabels({ - owner: context.issue.owner, - repo: context.issue.repo, - issue_number: context.issue.number, - labels: ["needs-more-info"], - }); - await github.issues.createComment({ - owner: context.issue.owner, - repo: context.issue.repo, - issue_number: context.issue.number, - body: msg, - }); - }; - - const body = issue.data.body.toLowerCase().trim(); - - if (sameAsTemplate("bugs.md", body) || sameAsTemplate("unexpected-problems-bugs.md", body)) { - await checkFail(` - We found that not enough information is provided about this issue. - Please provide details following the [issue template](https://github.com/facebookresearch/detectron2/issues/new/choose).`) - return; - } - - const hasInstructions = body.indexOf("reproduce") != -1; - const hasEnvironment = (body.indexOf("environment") != -1) || (body.indexOf("colab") != -1) || (body.indexOf("docker") != -1); - if (hasInstructions && hasEnvironment) { - core.debug("Issue " + issue.data.title + " follows template."); - return; - } - - let message = "You've chosen to report an unexpected problem or bug. Unless you already know the root cause of it, please include details about it by filling the [issue template](https://github.com/facebookresearch/detectron2/issues/new/choose).\n"; - message += "The following information is missing: "; - if (!hasInstructions) { - message += "\"Instructions To Reproduce the Issue and __Full__ Logs\"; "; - } - if (!hasEnvironment) { - message += "\"Your Environment\"; "; - } - await checkFail(message); diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/levenshtein.js b/dimos/models/Detic/third_party/CenterNet2/.github/workflows/levenshtein.js deleted file mode 100644 index 67a5e3613c..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/levenshtein.js +++ /dev/null @@ -1,44 +0,0 @@ -/* -Copyright (c) 2011 Andrei Mackenzie - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. -*/ - -// Compute the edit distance between the two given strings -exports.getEditDistance = function(a, b){ - if(a.length == 0) return b.length; - if(b.length == 0) return a.length; - - var matrix = []; - - // increment along the first column of each row - var i; - for(i = 0; i <= b.length; i++){ - matrix[i] = [i]; - } - - // increment each column in the first row - var j; - for(j = 0; j <= a.length; j++){ - matrix[0][j] = j; - } - - // Fill in the rest of the matrix - for(i = 1; i <= b.length; i++){ - for(j = 1; j <= a.length; j++){ - if(b.charAt(i-1) == a.charAt(j-1)){ - matrix[i][j] = matrix[i-1][j-1]; - } else { - matrix[i][j] = Math.min(matrix[i-1][j-1] + 1, // substitution - Math.min(matrix[i][j-1] + 1, // insertion - matrix[i-1][j] + 1)); // deletion - } - } - } - - return matrix[b.length][a.length]; -}; diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/needs-reply.yml b/dimos/models/Detic/third_party/CenterNet2/.github/workflows/needs-reply.yml deleted file mode 100644 index 4affabd349..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/needs-reply.yml +++ /dev/null @@ -1,98 +0,0 @@ -name: Close/Lock issues after inactivity - -on: - schedule: - - cron: "0 0 * * *" - -jobs: - close-issues-needs-more-info: - runs-on: ubuntu-latest - if: ${{ github.repository_owner == 'facebookresearch' }} - steps: - - name: Close old issues that need reply - uses: actions/github-script@v3 - with: - github-token: ${{secrets.GITHUB_TOKEN}} - # Modified from https://github.com/dwieeb/needs-reply - script: | - // Arguments available: - // - github: A pre-authenticated octokit/rest.js client - // - context: An object containing the context of the workflow run - // - core: A reference to the @actions/core package - // - io: A reference to the @actions/io package - const kLabelToCheck = "needs-more-info"; - const kInvalidLabel = "invalid/unrelated"; - const kDaysBeforeClose = 7; - const kMessage = "Requested information was not provided in 7 days, so we're closing this issue.\n\nPlease open new issue if information becomes available. Otherwise, use [github discussions](https://github.com/facebookresearch/detectron2/discussions) for free-form discussions." - - issues = await github.issues.listForRepo({ - owner: context.repo.owner, - repo: context.repo.repo, - state: 'open', - labels: kLabelToCheck, - sort: 'updated', - direction: 'asc', - per_page: 30, - page: 1, - }); - issues = issues.data; - if (issues.length === 0) { - core.info('No more issues found to process. Exiting.'); - return; - } - for (const issue of issues) { - if (!!issue.pull_request) - continue; - core.info(`Processing issue #${issue.number}`); - - let updatedAt = new Date(issue.updated_at).getTime(); - const numComments = issue.comments; - const comments = await github.issues.listComments({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: issue.number, - per_page: 30, - page: Math.floor((numComments - 1) / 30) + 1, // the last page - }); - const lastComments = comments.data - .map(l => new Date(l.created_at).getTime()) - .sort(); - if (lastComments.length > 0) { - updatedAt = lastComments[lastComments.length - 1]; - } - - const now = new Date().getTime(); - const daysSinceUpdated = (now - updatedAt) / 1000 / 60 / 60 / 24; - - if (daysSinceUpdated < kDaysBeforeClose) { - core.info(`Skipping #${issue.number} because it has been updated in the last ${daysSinceUpdated} days`); - continue; - } - core.info(`Closing #${issue.number} because it has not been updated in the last ${daysSinceUpdated} days`); - await github.issues.createComment({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: issue.number, - body: kMessage, - }); - const newLabels = numComments <= 2 ? [kInvalidLabel, kLabelToCheck] : issue.labels; - await github.issues.update({ - owner: context.repo.owner, - repo: context.repo.repo, - issue_number: issue.number, - labels: newLabels, - state: 'closed', - }); - } - - lock-issues-after-closed: - runs-on: ubuntu-latest - if: ${{ github.repository_owner == 'facebookresearch' }} - steps: - - name: Lock closed issues that have no activity for a while - uses: dessant/lock-threads@v2 - with: - github-token: ${{ github.token }} - issue-lock-inactive-days: '300' - process-only: 'issues' - issue-exclude-labels: 'enhancement,bug,documentation' diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/remove-needs-reply.yml b/dimos/models/Detic/third_party/CenterNet2/.github/workflows/remove-needs-reply.yml deleted file mode 100644 index 1f000b28ca..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/remove-needs-reply.yml +++ /dev/null @@ -1,25 +0,0 @@ -name: Remove needs-more-info label - -on: - issue_comment: - types: [created] - issues: - types: [edited] - -jobs: - remove-needs-more-info-label: - runs-on: ubuntu-latest - # 1. issue_comment events could include PR comment, filter them out - # 2. Only trigger action if event was produced by the original author - if: ${{ !github.event.issue.pull_request && github.event.sender.login == github.event.issue.user.login }} - steps: - - name: Remove needs-more-info label - uses: octokit/request-action@v2.x - continue-on-error: true - with: - route: DELETE /repos/:repository/issues/:issue/labels/:label - repository: ${{ github.repository }} - issue: ${{ github.event.issue.number }} - label: needs-more-info - env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} diff --git a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/workflow.yml b/dimos/models/Detic/third_party/CenterNet2/.github/workflows/workflow.yml deleted file mode 100644 index 6085b32a50..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.github/workflows/workflow.yml +++ /dev/null @@ -1,81 +0,0 @@ -name: CI -on: [push, pull_request] - -# Run linter with github actions for quick feedbacks. -# Run macos tests with github actions. Linux (CPU & GPU) tests currently runs on CircleCI -jobs: - linter: - runs-on: ubuntu-latest - # run on PRs, or commits to facebookresearch (not internal) - if: ${{ github.repository_owner == 'facebookresearch' || github.event_name == 'pull_request' }} - steps: - - uses: actions/checkout@v2 - - name: Set up Python 3.6 - uses: actions/setup-python@v2 - with: - python-version: 3.6 - - name: Install dependencies - # flake8-bugbear flake8-comprehensions are useful but not available internally - run: | - python -m pip install --upgrade pip - python -m pip install flake8==3.8.1 isort==4.3.21 - python -m pip install black==21.4b2 - flake8 --version - - name: Lint - run: | - echo "Running isort" - isort -c -sp . - echo "Running black" - black -l 100 --check . - echo "Running flake8" - flake8 . - - macos_tests: - runs-on: macos-latest - # run on PRs, or commits to facebookresearch (not internal) - if: ${{ github.repository_owner == 'facebookresearch' || github.event_name == 'pull_request' }} - strategy: - fail-fast: false - matrix: - torch: ["1.8", "1.9", "1.10"] - include: - - torch: "1.8" - torchvision: 0.9 - - torch: "1.9" - torchvision: "0.10" - - torch: "1.10" - torchvision: "0.11.1" - env: - # point datasets to ~/.torch so it's cached by CI - DETECTRON2_DATASETS: ~/.torch/datasets - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Set up Python 3.6 - uses: actions/setup-python@v2 - with: - python-version: 3.6 - - name: Cache dependencies - uses: actions/cache@v2 - with: - path: | - ${{ env.pythonLocation }}/lib/python3.6/site-packages - ~/.torch - key: ${{ runner.os }}-torch${{ matrix.torch }}-${{ hashFiles('setup.py') }}-20210420 - - - name: Install dependencies - run: | - python -m pip install -U pip - python -m pip install ninja opencv-python-headless onnx pytest-xdist - python -m pip install torch==${{matrix.torch}} torchvision==${{matrix.torchvision}} -f https://download.pytorch.org/whl/torch_stable.html - # install from github to get latest; install iopath first since fvcore depends on it - python -m pip install -U 'git+https://github.com/facebookresearch/iopath' - python -m pip install -U 'git+https://github.com/facebookresearch/fvcore' - - - name: Build and install - run: | - CC=clang CXX=clang++ python -m pip install -e .[all] - python -m detectron2.utils.collect_env - ./datasets/prepare_for_tests.sh - - name: Run unittests - run: python -m pytest -n 4 --durations=15 -v tests/ diff --git a/dimos/models/Detic/third_party/CenterNet2/.gitignore b/dimos/models/Detic/third_party/CenterNet2/.gitignore deleted file mode 100644 index e045ffa557..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/.gitignore +++ /dev/null @@ -1,58 +0,0 @@ -third_party/detectron2 -slurm* -# output dir -output -instant_test_output -inference_test_output - - -*.png -*.json -*.diff -# *.jpg -!/projects/DensePose/doc/images/*.jpg - -# compilation and distribution -__pycache__ -_ext -*.pyc -*.pyd -*.so -*.dll -*.egg-info/ -build/ -dist/ -wheels/ - -# pytorch/python/numpy formats -*.pth -*.pkl -*.npy -*.ts -model_ts*.txt - -# ipython/jupyter notebooks -*.ipynb -**/.ipynb_checkpoints/ - -# Editor temporaries -*.swn -*.swo -*.swp -*~ - -# editor settings -.idea -.vscode -_darcs - -# project dirs -/detectron2/model_zoo/configs -/datasets/* -!/datasets/*.* -!/datasets/lvis/ -/datasets/lvis/* -!/datasets/lvis/lvis_v1_train_cat_info.json -/projects/*/datasets -/models -/snippet diff --git a/dimos/models/Detic/third_party/CenterNet2/LICENSE b/dimos/models/Detic/third_party/CenterNet2/LICENSE deleted file mode 100644 index cd1b070674..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/LICENSE +++ /dev/null @@ -1,202 +0,0 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - -1. Definitions. - -"License" shall mean the terms and conditions for use, reproduction, -and distribution as defined by Sections 1 through 9 of this document. - -"Licensor" shall mean the copyright owner or entity authorized by -the copyright owner that is granting the License. - -"Legal Entity" shall mean the union of the acting entity and all -other entities that control, are controlled by, or are under common -control with that entity. For the purposes of this definition, -"control" means (i) the power, direct or indirect, to cause the -direction or management of such entity, whether by contract or -otherwise, or (ii) ownership of fifty percent (50%) or more of the -outstanding shares, or (iii) beneficial ownership of such entity. - -"You" (or "Your") shall mean an individual or Legal Entity -exercising permissions granted by this License. - -"Source" form shall mean the preferred form for making modifications, -including but not limited to software source code, documentation -source, and configuration files. - -"Object" form shall mean any form resulting from mechanical -transformation or translation of a Source form, including but -not limited to compiled object code, generated documentation, -and conversions to other media types. - -"Work" shall mean the work of authorship, whether in Source or -Object form, made available under the License, as indicated by a -copyright notice that is included in or attached to the work -(an example is provided in the Appendix below). - -"Derivative Works" shall mean any work, whether in Source or Object -form, that is based on (or derived from) the Work and for which the -editorial revisions, annotations, elaborations, or other modifications -represent, as a whole, an original work of authorship. For the purposes -of this License, Derivative Works shall not include works that remain -separable from, or merely link (or bind by name) to the interfaces of, -the Work and Derivative Works thereof. - -"Contribution" shall mean any work of authorship, including -the original version of the Work and any modifications or additions -to that Work or Derivative Works thereof, that is intentionally -submitted to Licensor for inclusion in the Work by the copyright owner -or by an individual or Legal Entity authorized to submit on behalf of -the copyright owner. For the purposes of this definition, "submitted" -means any form of electronic, verbal, or written communication sent -to the Licensor or its representatives, including but not limited to -communication on electronic mailing lists, source code control systems, -and issue tracking systems that are managed by, or on behalf of, the -Licensor for the purpose of discussing and improving the Work, but -excluding communication that is conspicuously marked or otherwise -designated in writing by the copyright owner as "Not a Contribution." - -"Contributor" shall mean Licensor and any individual or Legal Entity -on behalf of whom a Contribution has been received by Licensor and -subsequently incorporated within the Work. - -2. Grant of Copyright License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -copyright license to reproduce, prepare Derivative Works of, -publicly display, publicly perform, sublicense, and distribute the -Work and such Derivative Works in Source or Object form. - -3. Grant of Patent License. Subject to the terms and conditions of -this License, each Contributor hereby grants to You a perpetual, -worldwide, non-exclusive, no-charge, royalty-free, irrevocable -(except as stated in this section) patent license to make, have made, -use, offer to sell, sell, import, and otherwise transfer the Work, -where such license applies only to those patent claims licensable -by such Contributor that are necessarily infringed by their -Contribution(s) alone or by combination of their Contribution(s) -with the Work to which such Contribution(s) was submitted. If You -institute patent litigation against any entity (including a -cross-claim or counterclaim in a lawsuit) alleging that the Work -or a Contribution incorporated within the Work constitutes direct -or contributory patent infringement, then any patent licenses -granted to You under this License for that Work shall terminate -as of the date such litigation is filed. - -4. Redistribution. You may reproduce and distribute copies of the -Work or Derivative Works thereof in any medium, with or without -modifications, and in Source or Object form, provided that You -meet the following conditions: - -(a) You must give any other recipients of the Work or -Derivative Works a copy of this License; and - -(b) You must cause any modified files to carry prominent notices -stating that You changed the files; and - -(c) You must retain, in the Source form of any Derivative Works -that You distribute, all copyright, patent, trademark, and -attribution notices from the Source form of the Work, -excluding those notices that do not pertain to any part of -the Derivative Works; and - -(d) If the Work includes a "NOTICE" text file as part of its -distribution, then any Derivative Works that You distribute must -include a readable copy of the attribution notices contained -within such NOTICE file, excluding those notices that do not -pertain to any part of the Derivative Works, in at least one -of the following places: within a NOTICE text file distributed -as part of the Derivative Works; within the Source form or -documentation, if provided along with the Derivative Works; or, -within a display generated by the Derivative Works, if and -wherever such third-party notices normally appear. The contents -of the NOTICE file are for informational purposes only and -do not modify the License. You may add Your own attribution -notices within Derivative Works that You distribute, alongside -or as an addendum to the NOTICE text from the Work, provided -that such additional attribution notices cannot be construed -as modifying the License. - -You may add Your own copyright statement to Your modifications and -may provide additional or different license terms and conditions -for use, reproduction, or distribution of Your modifications, or -for any such Derivative Works as a whole, provided Your use, -reproduction, and distribution of the Work otherwise complies with -the conditions stated in this License. - -5. Submission of Contributions. Unless You explicitly state otherwise, -any Contribution intentionally submitted for inclusion in the Work -by You to the Licensor shall be under the terms and conditions of -this License, without any additional terms or conditions. -Notwithstanding the above, nothing herein shall supersede or modify -the terms of any separate license agreement you may have executed -with Licensor regarding such Contributions. - -6. Trademarks. This License does not grant permission to use the trade -names, trademarks, service marks, or product names of the Licensor, -except as required for reasonable and customary use in describing the -origin of the Work and reproducing the content of the NOTICE file. - -7. Disclaimer of Warranty. Unless required by applicable law or -agreed to in writing, Licensor provides the Work (and each -Contributor provides its Contributions) on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or -implied, including, without limitation, any warranties or conditions -of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A -PARTICULAR PURPOSE. You are solely responsible for determining the -appropriateness of using or redistributing the Work and assume any -risks associated with Your exercise of permissions under this License. - -8. Limitation of Liability. In no event and under no legal theory, -whether in tort (including negligence), contract, or otherwise, -unless required by applicable law (such as deliberate and grossly -negligent acts) or agreed to in writing, shall any Contributor be -liable to You for damages, including any direct, indirect, special, -incidental, or consequential damages of any character arising as a -result of this License or out of the use or inability to use the -Work (including but not limited to damages for loss of goodwill, -work stoppage, computer failure or malfunction, or any and all -other commercial damages or losses), even if such Contributor -has been advised of the possibility of such damages. - -9. Accepting Warranty or Additional Liability. While redistributing -the Work or Derivative Works thereof, You may choose to offer, -and charge a fee for, acceptance of support, warranty, indemnity, -or other liability obligations and/or rights consistent with this -License. However, in accepting such obligations, You may act only -on Your own behalf and on Your sole responsibility, not on behalf -of any other Contributor, and only if You agree to indemnify, -defend, and hold each Contributor harmless for any liability -incurred by, or claims asserted against, such Contributor by reason -of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following -boilerplate notice, with the fields enclosed by brackets "[]" -replaced with your own identifying information. (Don't include -the brackets!) The text should be enclosed in the appropriate -comment syntax for the file format. We also recommend that a -file or class name and description of purpose be included on the -same "printed page" as the copyright notice for easier -identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/dimos/models/Detic/third_party/CenterNet2/README.md b/dimos/models/Detic/third_party/CenterNet2/README.md deleted file mode 100644 index 7ccbf8818f..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/README.md +++ /dev/null @@ -1,81 +0,0 @@ -# Probabilistic two-stage detection -Two-stage object detectors that use class-agnostic one-stage detectors as the proposal network. - - -

- -> [**Probabilistic two-stage detection**](http://arxiv.org/abs/2103.07461), -> Xingyi Zhou, Vladlen Koltun, Philipp Krähenbühl, -> *arXiv technical report ([arXiv 2103.07461](http://arxiv.org/abs/2103.07461))* - -Contact: [zhouxy@cs.utexas.edu](mailto:zhouxy@cs.utexas.edu). Any questions or discussions are welcomed! - -## Summary - -- Two-stage CenterNet: First stage estimates object probabilities, second stage conditionally classifies objects. - -- Resulting detector is faster and more accurate than both traditional two-stage detectors (fewer proposals required), and one-stage detectors (lighter first stage head). - -- Our best model achieves 56.4 mAP on COCO test-dev. - -- This repo also includes a detectron2-based CenterNet implementation with better accuracy (42.5 mAP at 70FPS) and a new FPN version of CenterNet (40.2 mAP with Res50_1x). - -## Main results - -All models are trained with multi-scale training, and tested with a single scale. The FPS is tested on a Titan RTX GPU. -More models and details can be found in the [MODEL_ZOO](docs/MODEL_ZOO.md). - -#### COCO - -| Model | COCO val mAP | FPS | -|-------------------------------------------|---------------|-------| -| CenterNet-S4_DLA_8x | 42.5 | 71 | -| CenterNet2_R50_1x | 42.9 | 24 | -| CenterNet2_X101-DCN_2x | 49.9 | 8 | -| CenterNet2_R2-101-DCN-BiFPN_4x+4x_1560_ST | 56.1 | 5 | -| CenterNet2_DLA-BiFPN-P5_24x_ST | 49.2 | 38 | - - -#### LVIS - -| Model | val mAP box | -| ------------------------- | ----------- | -| CenterNet2_R50_1x | 26.5 | -| CenterNet2_FedLoss_R50_1x | 28.3 | - - -#### Objects365 - -| Model | val mAP | -|-------------------------------------------|----------| -| CenterNet2_R50_1x | 22.6 | - -## Installation - -Our project is developed on [detectron2](https://github.com/facebookresearch/detectron2). Please follow the official detectron2 [installation](https://github.com/facebookresearch/detectron2/blob/master/INSTALL.md). - -We use the default detectron2 demo script. To run inference on an image folder using our pre-trained model, run - -~~~ -python demo.py --config-file configs/CenterNet2_R50_1x.yaml --input path/to/image/ --opts MODEL.WEIGHTS models/CenterNet2_R50_1x.pth -~~~ - -## Benchmark evaluation and training - -Please check detectron2 [GETTING_STARTED.md](https://github.com/facebookresearch/detectron2/blob/master/GETTING_STARTED.md) for running evaluation and training. Our config files are under `configs` and the pre-trained models are in the [MODEL_ZOO](docs/MODEL_ZOO.md). - - -## License - -Our code is under [Apache 2.0 license](LICENSE). `centernet/modeling/backbone/bifpn_fcos.py` are from [AdelaiDet](https://github.com/aim-uofa/AdelaiDet), which follows the original [non-commercial license](https://github.com/aim-uofa/AdelaiDet/blob/master/LICENSE). - -## Citation - -If you find this project useful for your research, please use the following BibTeX entry. - - @inproceedings{zhou2021probablistic, - title={Probabilistic two-stage detection}, - author={Zhou, Xingyi and Koltun, Vladlen and Kr{\"a}henb{\"u}hl, Philipp}, - booktitle={arXiv preprint arXiv:2103.07461}, - year={2021} - } diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/__init__.py b/dimos/models/Detic/third_party/CenterNet2/centernet/__init__.py deleted file mode 100644 index 5e2e7afac6..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/__init__.py +++ /dev/null @@ -1,12 +0,0 @@ -from .data.datasets import nuimages -from .data.datasets.coco import _PREDEFINED_SPLITS_COCO -from .data.datasets.objects365 import categories_v1 -from .modeling.backbone.bifpn import build_resnet_bifpn_backbone -from .modeling.backbone.bifpn_fcos import build_fcos_resnet_bifpn_backbone -from .modeling.backbone.dla import build_dla_backbone -from .modeling.backbone.dlafpn import build_dla_fpn3_backbone -from .modeling.backbone.fpn_p5 import build_p67_resnet_fpn_backbone -from .modeling.backbone.res2net import build_p67_res2net_fpn_backbone -from .modeling.dense_heads.centernet import CenterNet -from .modeling.meta_arch.centernet_detector import CenterNetDetector -from .modeling.roi_heads.custom_roi_heads import CustomCascadeROIHeads, CustomROIHeads diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/config.py b/dimos/models/Detic/third_party/CenterNet2/centernet/config.py deleted file mode 100644 index 255eb36340..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/config.py +++ /dev/null @@ -1,88 +0,0 @@ -from detectron2.config import CfgNode as CN - - -def add_centernet_config(cfg) -> None: - _C = cfg - - _C.MODEL.CENTERNET = CN() - _C.MODEL.CENTERNET.NUM_CLASSES = 80 - _C.MODEL.CENTERNET.IN_FEATURES = ["p3", "p4", "p5", "p6", "p7"] - _C.MODEL.CENTERNET.FPN_STRIDES = [8, 16, 32, 64, 128] - _C.MODEL.CENTERNET.PRIOR_PROB = 0.01 - _C.MODEL.CENTERNET.INFERENCE_TH = 0.05 - _C.MODEL.CENTERNET.CENTER_NMS = False - _C.MODEL.CENTERNET.NMS_TH_TRAIN = 0.6 - _C.MODEL.CENTERNET.NMS_TH_TEST = 0.6 - _C.MODEL.CENTERNET.PRE_NMS_TOPK_TRAIN = 1000 - _C.MODEL.CENTERNET.POST_NMS_TOPK_TRAIN = 100 - _C.MODEL.CENTERNET.PRE_NMS_TOPK_TEST = 1000 - _C.MODEL.CENTERNET.POST_NMS_TOPK_TEST = 100 - _C.MODEL.CENTERNET.NORM = "GN" - _C.MODEL.CENTERNET.USE_DEFORMABLE = False - _C.MODEL.CENTERNET.NUM_CLS_CONVS = 4 - _C.MODEL.CENTERNET.NUM_BOX_CONVS = 4 - _C.MODEL.CENTERNET.NUM_SHARE_CONVS = 0 - _C.MODEL.CENTERNET.LOC_LOSS_TYPE = "giou" - _C.MODEL.CENTERNET.SIGMOID_CLAMP = 1e-4 - _C.MODEL.CENTERNET.HM_MIN_OVERLAP = 0.8 - _C.MODEL.CENTERNET.MIN_RADIUS = 4 - _C.MODEL.CENTERNET.SOI = [[0, 80], [64, 160], [128, 320], [256, 640], [512, 10000000]] - _C.MODEL.CENTERNET.POS_WEIGHT = 1.0 - _C.MODEL.CENTERNET.NEG_WEIGHT = 1.0 - _C.MODEL.CENTERNET.REG_WEIGHT = 2.0 - _C.MODEL.CENTERNET.HM_FOCAL_BETA = 4 - _C.MODEL.CENTERNET.HM_FOCAL_ALPHA = 0.25 - _C.MODEL.CENTERNET.LOSS_GAMMA = 2.0 - _C.MODEL.CENTERNET.WITH_AGN_HM = False - _C.MODEL.CENTERNET.ONLY_PROPOSAL = False - _C.MODEL.CENTERNET.AS_PROPOSAL = False - _C.MODEL.CENTERNET.IGNORE_HIGH_FP = -1.0 - _C.MODEL.CENTERNET.MORE_POS = False - _C.MODEL.CENTERNET.MORE_POS_THRESH = 0.2 - _C.MODEL.CENTERNET.MORE_POS_TOPK = 9 - _C.MODEL.CENTERNET.NOT_NORM_REG = True - _C.MODEL.CENTERNET.NOT_NMS = False - _C.MODEL.CENTERNET.NO_REDUCE = False - - _C.MODEL.ROI_BOX_HEAD.USE_SIGMOID_CE = False - _C.MODEL.ROI_BOX_HEAD.PRIOR_PROB = 0.01 - _C.MODEL.ROI_BOX_HEAD.USE_EQL_LOSS = False - _C.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH = "datasets/lvis/lvis_v1_train_cat_info.json" - _C.MODEL.ROI_BOX_HEAD.EQL_FREQ_CAT = 200 - _C.MODEL.ROI_BOX_HEAD.USE_FED_LOSS = False - _C.MODEL.ROI_BOX_HEAD.FED_LOSS_NUM_CAT = 50 - _C.MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT = 0.5 - _C.MODEL.ROI_BOX_HEAD.MULT_PROPOSAL_SCORE = False - - _C.MODEL.BIFPN = CN() - _C.MODEL.BIFPN.NUM_LEVELS = 5 - _C.MODEL.BIFPN.NUM_BIFPN = 6 - _C.MODEL.BIFPN.NORM = "GN" - _C.MODEL.BIFPN.OUT_CHANNELS = 160 - _C.MODEL.BIFPN.SEPARABLE_CONV = False - - _C.MODEL.DLA = CN() - _C.MODEL.DLA.OUT_FEATURES = ["dla2"] - _C.MODEL.DLA.USE_DLA_UP = True - _C.MODEL.DLA.NUM_LAYERS = 34 - _C.MODEL.DLA.MS_OUTPUT = False - _C.MODEL.DLA.NORM = "BN" - _C.MODEL.DLA.DLAUP_IN_FEATURES = ["dla3", "dla4", "dla5"] - _C.MODEL.DLA.DLAUP_NODE = "conv" - - _C.SOLVER.RESET_ITER = False - _C.SOLVER.TRAIN_ITER = -1 - - _C.INPUT.CUSTOM_AUG = "" - _C.INPUT.TRAIN_SIZE = 640 - _C.INPUT.TEST_SIZE = 640 - _C.INPUT.SCALE_RANGE = (0.1, 2.0) - # 'default' for fixed short/ long edge, 'square' for max size=INPUT.SIZE - _C.INPUT.TEST_INPUT_TYPE = "default" - _C.INPUT.NOT_CLAMP_BOX = False - - _C.DEBUG = False - _C.SAVE_DEBUG = False - _C.SAVE_PTH = False - _C.VIS_THRESH = 0.3 - _C.DEBUG_SHOW_NAME = False diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/data/custom_build_augmentation.py b/dimos/models/Detic/third_party/CenterNet2/centernet/data/custom_build_augmentation.py deleted file mode 100644 index 1bcb7cee66..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/custom_build_augmentation.py +++ /dev/null @@ -1,43 +0,0 @@ -from detectron2.data import transforms as T - -from .transforms.custom_augmentation_impl import EfficientDetResizeCrop - - -def build_custom_augmentation(cfg, is_train: bool): - """ - Create a list of default :class:`Augmentation` from config. - Now it includes resizing and flipping. - - Returns: - list[Augmentation] - """ - if cfg.INPUT.CUSTOM_AUG == "ResizeShortestEdge": - if is_train: - min_size = cfg.INPUT.MIN_SIZE_TRAIN - max_size = cfg.INPUT.MAX_SIZE_TRAIN - sample_style = cfg.INPUT.MIN_SIZE_TRAIN_SAMPLING - else: - min_size = cfg.INPUT.MIN_SIZE_TEST - max_size = cfg.INPUT.MAX_SIZE_TEST - sample_style = "choice" - augmentation = [T.ResizeShortestEdge(min_size, max_size, sample_style)] - elif cfg.INPUT.CUSTOM_AUG == "EfficientDetResizeCrop": - if is_train: - scale = cfg.INPUT.SCALE_RANGE - size = cfg.INPUT.TRAIN_SIZE - else: - scale = (1, 1) - size = cfg.INPUT.TEST_SIZE - augmentation = [EfficientDetResizeCrop(size, scale)] - else: - assert 0, cfg.INPUT.CUSTOM_AUG - - if is_train: - augmentation.append(T.RandomFlip()) - return augmentation - - -build_custom_transform_gen = build_custom_augmentation -""" -Alias for backward-compatibility. -""" diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/data/custom_dataset_dataloader.py b/dimos/models/Detic/third_party/CenterNet2/centernet/data/custom_dataset_dataloader.py deleted file mode 100644 index a7cfdd523d..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/custom_dataset_dataloader.py +++ /dev/null @@ -1,217 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -from collections import defaultdict -import itertools -import logging -from typing import Iterator, Sequence, Optional - -from detectron2.data.build import ( - build_batch_data_loader, - check_metadata_consistency, - filter_images_with_few_keypoints, - filter_images_with_only_crowd_annotations, - get_detection_dataset_dicts, - print_instances_class_histogram, -) -from detectron2.data.catalog import DatasetCatalog, MetadataCatalog -from detectron2.data.common import DatasetFromList, MapDataset -from detectron2.data.samplers import RepeatFactorTrainingSampler, TrainingSampler -from detectron2.utils import comm -import torch -import torch.utils.data -from torch.utils.data.sampler import Sampler - -# from .custom_build_augmentation import build_custom_augmentation - - -def build_custom_train_loader(cfg, mapper=None): - """ - Modified from detectron2.data.build.build_custom_train_loader, but supports - different samplers - """ - source_aware = cfg.DATALOADER.SOURCE_AWARE - if source_aware: - dataset_dicts = get_detection_dataset_dicts_with_source( - cfg.DATASETS.TRAIN, - filter_empty=cfg.DATALOADER.FILTER_EMPTY_ANNOTATIONS, - min_keypoints=cfg.MODEL.ROI_KEYPOINT_HEAD.MIN_KEYPOINTS_PER_IMAGE - if cfg.MODEL.KEYPOINT_ON - else 0, - proposal_files=cfg.DATASETS.PROPOSAL_FILES_TRAIN if cfg.MODEL.LOAD_PROPOSALS else None, - ) - sizes = [0 for _ in range(len(cfg.DATASETS.TRAIN))] - for d in dataset_dicts: - sizes[d["dataset_source"]] += 1 - print("dataset sizes", sizes) - else: - dataset_dicts = get_detection_dataset_dicts( - cfg.DATASETS.TRAIN, - filter_empty=cfg.DATALOADER.FILTER_EMPTY_ANNOTATIONS, - min_keypoints=cfg.MODEL.ROI_KEYPOINT_HEAD.MIN_KEYPOINTS_PER_IMAGE - if cfg.MODEL.KEYPOINT_ON - else 0, - proposal_files=cfg.DATASETS.PROPOSAL_FILES_TRAIN if cfg.MODEL.LOAD_PROPOSALS else None, - ) - dataset = DatasetFromList(dataset_dicts, copy=False) - - if mapper is None: - assert 0 - # mapper = DatasetMapper(cfg, True) - dataset = MapDataset(dataset, mapper) - - sampler_name = cfg.DATALOADER.SAMPLER_TRAIN - logger = logging.getLogger(__name__) - logger.info(f"Using training sampler {sampler_name}") - # TODO avoid if-else? - if sampler_name == "TrainingSampler": - sampler = TrainingSampler(len(dataset)) - elif sampler_name == "MultiDatasetSampler": - assert source_aware - sampler = MultiDatasetSampler(cfg, sizes, dataset_dicts) - elif sampler_name == "RepeatFactorTrainingSampler": - repeat_factors = RepeatFactorTrainingSampler.repeat_factors_from_category_frequency( - dataset_dicts, cfg.DATALOADER.REPEAT_THRESHOLD - ) - sampler = RepeatFactorTrainingSampler(repeat_factors) - elif sampler_name == "ClassAwareSampler": - sampler = ClassAwareSampler(dataset_dicts) - else: - raise ValueError(f"Unknown training sampler: {sampler_name}") - - return build_batch_data_loader( - dataset, - sampler, - cfg.SOLVER.IMS_PER_BATCH, - aspect_ratio_grouping=cfg.DATALOADER.ASPECT_RATIO_GROUPING, - num_workers=cfg.DATALOADER.NUM_WORKERS, - ) - - -class ClassAwareSampler(Sampler): - def __init__(self, dataset_dicts, seed: int | None = None) -> None: - """ - Args: - size (int): the total number of data of the underlying dataset to sample from - seed (int): the initial seed of the shuffle. Must be the same - across all workers. If None, will use a random seed shared - among workers (require synchronization among all workers). - """ - self._size = len(dataset_dicts) - assert self._size > 0 - if seed is None: - seed = comm.shared_random_seed() - self._seed = int(seed) - - self._rank = comm.get_rank() - self._world_size = comm.get_world_size() - self.weights = self._get_class_balance_factor(dataset_dicts) - - def __iter__(self) -> Iterator: - start = self._rank - yield from itertools.islice(self._infinite_indices(), start, None, self._world_size) - - def _infinite_indices(self): - g = torch.Generator() - g.manual_seed(self._seed) - while True: - ids = torch.multinomial(self.weights, self._size, generator=g, replacement=True) - yield from ids - - def _get_class_balance_factor(self, dataset_dicts, l: float=1.0): - # 1. For each category c, compute the fraction of images that contain it: f(c) - ret = [] - category_freq = defaultdict(int) - for dataset_dict in dataset_dicts: # For each image (without repeats) - cat_ids = {ann["category_id"] for ann in dataset_dict["annotations"]} - for cat_id in cat_ids: - category_freq[cat_id] += 1 - for _i, dataset_dict in enumerate(dataset_dicts): - cat_ids = {ann["category_id"] for ann in dataset_dict["annotations"]} - ret.append(sum([1.0 / (category_freq[cat_id] ** l) for cat_id in cat_ids])) - return torch.tensor(ret).float() - - -def get_detection_dataset_dicts_with_source( - dataset_names: Sequence[str], filter_empty: bool=True, min_keypoints: int=0, proposal_files=None -): - assert len(dataset_names) - dataset_dicts = [DatasetCatalog.get(dataset_name) for dataset_name in dataset_names] - for dataset_name, dicts in zip(dataset_names, dataset_dicts, strict=False): - assert len(dicts), f"Dataset '{dataset_name}' is empty!" - - for source_id, (dataset_name, dicts) in enumerate(zip(dataset_names, dataset_dicts, strict=False)): - assert len(dicts), f"Dataset '{dataset_name}' is empty!" - for d in dicts: - d["dataset_source"] = source_id - - if "annotations" in dicts[0]: - try: - class_names = MetadataCatalog.get(dataset_name).thing_classes - check_metadata_consistency("thing_classes", dataset_name) - print_instances_class_histogram(dicts, class_names) - except AttributeError: # class names are not available for this dataset - pass - - assert proposal_files is None - - dataset_dicts = list(itertools.chain.from_iterable(dataset_dicts)) - - has_instances = "annotations" in dataset_dicts[0] - if filter_empty and has_instances: - dataset_dicts = filter_images_with_only_crowd_annotations(dataset_dicts) - if min_keypoints > 0 and has_instances: - dataset_dicts = filter_images_with_few_keypoints(dataset_dicts, min_keypoints) - - return dataset_dicts - - -class MultiDatasetSampler(Sampler): - def __init__(self, cfg, sizes: Sequence[int], dataset_dicts, seed: int | None = None) -> None: - """ - Args: - size (int): the total number of data of the underlying dataset to sample from - seed (int): the initial seed of the shuffle. Must be the same - across all workers. If None, will use a random seed shared - among workers (require synchronization among all workers). - """ - self.sizes = sizes - dataset_ratio = cfg.DATALOADER.DATASET_RATIO - self._batch_size = cfg.SOLVER.IMS_PER_BATCH - assert len(dataset_ratio) == len(sizes), ( - f"length of dataset ratio {len(dataset_ratio)} should be equal to number if dataset {len(sizes)}" - ) - if seed is None: - seed = comm.shared_random_seed() - self._seed = int(seed) - self._rank = comm.get_rank() - self._world_size = comm.get_world_size() - - self._ims_per_gpu = self._batch_size // self._world_size - self.dataset_ids = torch.tensor( - [d["dataset_source"] for d in dataset_dicts], dtype=torch.long - ) - - dataset_weight = [ - torch.ones(s) * max(sizes) / s * r / sum(dataset_ratio) - for i, (r, s) in enumerate(zip(dataset_ratio, sizes, strict=False)) - ] - dataset_weight = torch.cat(dataset_weight) - self.weights = dataset_weight - self.sample_epoch_size = len(self.weights) - - def __iter__(self) -> Iterator: - start = self._rank - yield from itertools.islice(self._infinite_indices(), start, None, self._world_size) - - def _infinite_indices(self): - g = torch.Generator() - g.manual_seed(self._seed) - while True: - ids = torch.multinomial( - self.weights, self.sample_epoch_size, generator=g, replacement=True - ) - nums = [(self.dataset_ids[ids] == i).sum().int().item() for i in range(len(self.sizes))] - print("_rank, len, nums", self._rank, len(ids), nums, flush=True) - # print('_rank, len, nums, self.dataset_ids[ids[:10]], ', - # self._rank, len(ids), nums, self.dataset_ids[ids[:10]], - # flush=True) - yield from ids diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/coco.py b/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/coco.py deleted file mode 100644 index 33ff5a6980..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/coco.py +++ /dev/null @@ -1,53 +0,0 @@ -import os - -from detectron2.data import DatasetCatalog, MetadataCatalog -from detectron2.data.datasets.builtin_meta import _get_builtin_metadata -from detectron2.data.datasets.coco import load_coco_json -from detectron2.data.datasets.register_coco import register_coco_instances - - -def register_distill_coco_instances(name: str, metadata, json_file, image_root) -> None: - """ - add extra_annotation_keys - """ - assert isinstance(name, str), name - assert isinstance(json_file, str | os.PathLike), json_file - assert isinstance(image_root, str | os.PathLike), image_root - # 1. register a function which returns dicts - DatasetCatalog.register( - name, lambda: load_coco_json(json_file, image_root, name, extra_annotation_keys=["score"]) - ) - - # 2. Optionally, add metadata about this dataset, - # since they might be useful in evaluation, visualization or logging - MetadataCatalog.get(name).set( - json_file=json_file, image_root=image_root, evaluator_type="coco", **metadata - ) - - -_PREDEFINED_SPLITS_COCO = { - "coco_2017_unlabeled": ("coco/unlabeled2017", "coco/annotations/image_info_unlabeled2017.json"), -} - -for key, (image_root, json_file) in _PREDEFINED_SPLITS_COCO.items(): - register_coco_instances( - key, - _get_builtin_metadata("coco"), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) - -_PREDEFINED_SPLITS_DISTILL_COCO = { - "coco_un_yolov4_55_0.5": ( - "coco/unlabeled2017", - "coco/annotations/yolov4_cocounlabeled_55_ann0.5.json", - ), -} - -for key, (image_root, json_file) in _PREDEFINED_SPLITS_DISTILL_COCO.items(): - register_distill_coco_instances( - key, - _get_builtin_metadata("coco"), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/nuimages.py b/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/nuimages.py deleted file mode 100644 index fdcd40242f..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/nuimages.py +++ /dev/null @@ -1,41 +0,0 @@ -import os - -from detectron2.data.datasets.register_coco import register_coco_instances - -categories = [ - {"id": 0, "name": "car"}, - {"id": 1, "name": "truck"}, - {"id": 2, "name": "trailer"}, - {"id": 3, "name": "bus"}, - {"id": 4, "name": "construction_vehicle"}, - {"id": 5, "name": "bicycle"}, - {"id": 6, "name": "motorcycle"}, - {"id": 7, "name": "pedestrian"}, - {"id": 8, "name": "traffic_cone"}, - {"id": 9, "name": "barrier"}, -] - - -def _get_builtin_metadata(): - id_to_name = {x["id"]: x["name"] for x in categories} - thing_dataset_id_to_contiguous_id = {i: i for i in range(len(categories))} - thing_classes = [id_to_name[k] for k in sorted(id_to_name)] - return { - "thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id, - "thing_classes": thing_classes, - } - - -_PREDEFINED_SPLITS = { - "nuimages_train": ("nuimages", "nuimages/annotations/nuimages_v1.0-train.json"), - "nuimages_val": ("nuimages", "nuimages/annotations/nuimages_v1.0-val.json"), - "nuimages_mini": ("nuimages", "nuimages/annotations/nuimages_v1.0-mini.json"), -} - -for key, (image_root, json_file) in _PREDEFINED_SPLITS.items(): - register_coco_instances( - key, - _get_builtin_metadata(), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/objects365.py b/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/objects365.py deleted file mode 100644 index e3e8383a91..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/objects365.py +++ /dev/null @@ -1,398 +0,0 @@ -import os - -from detectron2.data.datasets.register_coco import register_coco_instances - -categories_v1 = [ - {"id": 164, "name": "cutting/chopping board"}, - {"id": 49, "name": "tie"}, - {"id": 306, "name": "crosswalk sign"}, - {"id": 145, "name": "gun"}, - {"id": 14, "name": "street lights"}, - {"id": 223, "name": "bar soap"}, - {"id": 74, "name": "wild bird"}, - {"id": 219, "name": "ice cream"}, - {"id": 37, "name": "stool"}, - {"id": 25, "name": "storage box"}, - {"id": 153, "name": "giraffe"}, - {"id": 52, "name": "pen/pencil"}, - {"id": 61, "name": "high heels"}, - {"id": 340, "name": "mangosteen"}, - {"id": 22, "name": "bracelet"}, - {"id": 155, "name": "piano"}, - {"id": 162, "name": "vent"}, - {"id": 75, "name": "laptop"}, - {"id": 236, "name": "toaster"}, - {"id": 231, "name": "fire truck"}, - {"id": 42, "name": "basket"}, - {"id": 150, "name": "zebra"}, - {"id": 124, "name": "head phone"}, - {"id": 90, "name": "sheep"}, - {"id": 322, "name": "steak"}, - {"id": 39, "name": "couch"}, - {"id": 209, "name": "toothbrush"}, - {"id": 59, "name": "bicycle"}, - {"id": 336, "name": "red cabbage"}, - {"id": 228, "name": "golf ball"}, - {"id": 120, "name": "tomato"}, - {"id": 132, "name": "computer box"}, - {"id": 8, "name": "cup"}, - {"id": 183, "name": "basketball"}, - {"id": 298, "name": "butterfly"}, - {"id": 250, "name": "garlic"}, - {"id": 12, "name": "desk"}, - {"id": 141, "name": "microwave"}, - {"id": 171, "name": "strawberry"}, - {"id": 200, "name": "kettle"}, - {"id": 63, "name": "van"}, - {"id": 300, "name": "cheese"}, - {"id": 215, "name": "marker"}, - {"id": 100, "name": "blackboard/whiteboard"}, - {"id": 186, "name": "printer"}, - {"id": 333, "name": "bread/bun"}, - {"id": 243, "name": "penguin"}, - {"id": 364, "name": "iron"}, - {"id": 180, "name": "ladder"}, - {"id": 34, "name": "flag"}, - {"id": 78, "name": "cell phone"}, - {"id": 97, "name": "fan"}, - {"id": 224, "name": "scale"}, - {"id": 151, "name": "duck"}, - {"id": 319, "name": "flute"}, - {"id": 156, "name": "stop sign"}, - {"id": 290, "name": "rickshaw"}, - {"id": 128, "name": "sailboat"}, - {"id": 165, "name": "tennis racket"}, - {"id": 241, "name": "cigar"}, - {"id": 101, "name": "balloon"}, - {"id": 308, "name": "hair drier"}, - {"id": 167, "name": "skating and skiing shoes"}, - {"id": 237, "name": "helicopter"}, - {"id": 65, "name": "sink"}, - {"id": 129, "name": "tangerine"}, - {"id": 330, "name": "crab"}, - {"id": 320, "name": "measuring cup"}, - {"id": 260, "name": "fishing rod"}, - {"id": 346, "name": "saw"}, - {"id": 216, "name": "ship"}, - {"id": 46, "name": "coffee table"}, - {"id": 194, "name": "facial mask"}, - {"id": 281, "name": "stapler"}, - {"id": 118, "name": "refrigerator"}, - {"id": 40, "name": "belt"}, - {"id": 349, "name": "starfish"}, - {"id": 87, "name": "hanger"}, - {"id": 116, "name": "baseball glove"}, - {"id": 261, "name": "cherry"}, - {"id": 334, "name": "baozi"}, - {"id": 267, "name": "screwdriver"}, - {"id": 158, "name": "converter"}, - {"id": 335, "name": "lion"}, - {"id": 170, "name": "baseball"}, - {"id": 111, "name": "skis"}, - {"id": 136, "name": "broccoli"}, - {"id": 342, "name": "eraser"}, - {"id": 337, "name": "polar bear"}, - {"id": 139, "name": "shovel"}, - {"id": 193, "name": "extension cord"}, - {"id": 284, "name": "goldfish"}, - {"id": 174, "name": "pepper"}, - {"id": 138, "name": "stroller"}, - {"id": 328, "name": "yak"}, - {"id": 83, "name": "clock"}, - {"id": 235, "name": "tricycle"}, - {"id": 248, "name": "parking meter"}, - {"id": 274, "name": "trophy"}, - {"id": 324, "name": "binoculars"}, - {"id": 51, "name": "traffic light"}, - {"id": 314, "name": "donkey"}, - {"id": 45, "name": "barrel/bucket"}, - {"id": 292, "name": "pomegranate"}, - {"id": 13, "name": "handbag"}, - {"id": 262, "name": "tablet"}, - {"id": 68, "name": "apple"}, - {"id": 226, "name": "cabbage"}, - {"id": 23, "name": "flower"}, - {"id": 58, "name": "faucet"}, - {"id": 206, "name": "tong"}, - {"id": 291, "name": "trombone"}, - {"id": 160, "name": "carrot"}, - {"id": 172, "name": "bow tie"}, - {"id": 122, "name": "tent"}, - {"id": 163, "name": "cookies"}, - {"id": 115, "name": "remote"}, - {"id": 175, "name": "coffee machine"}, - {"id": 238, "name": "green beans"}, - {"id": 233, "name": "cello"}, - {"id": 28, "name": "wine glass"}, - {"id": 295, "name": "mushroom"}, - {"id": 344, "name": "scallop"}, - {"id": 125, "name": "lantern"}, - {"id": 123, "name": "shampoo/shower gel"}, - {"id": 285, "name": "meat balls"}, - {"id": 266, "name": "key"}, - {"id": 296, "name": "calculator"}, - {"id": 168, "name": "scissors"}, - {"id": 103, "name": "cymbal"}, - {"id": 6, "name": "bottle"}, - {"id": 264, "name": "nuts"}, - {"id": 234, "name": "notepaper"}, - {"id": 211, "name": "mango"}, - {"id": 287, "name": "toothpaste"}, - {"id": 196, "name": "chopsticks"}, - {"id": 140, "name": "baseball bat"}, - {"id": 244, "name": "hurdle"}, - {"id": 195, "name": "tennis ball"}, - {"id": 144, "name": "surveillance camera"}, - {"id": 271, "name": "volleyball"}, - {"id": 94, "name": "keyboard"}, - {"id": 339, "name": "seal"}, - {"id": 11, "name": "picture/frame"}, - {"id": 348, "name": "okra"}, - {"id": 191, "name": "sausage"}, - {"id": 166, "name": "candy"}, - {"id": 62, "name": "ring"}, - {"id": 311, "name": "dolphin"}, - {"id": 273, "name": "eggplant"}, - {"id": 84, "name": "drum"}, - {"id": 143, "name": "surfboard"}, - {"id": 288, "name": "antelope"}, - {"id": 204, "name": "clutch"}, - {"id": 207, "name": "slide"}, - {"id": 43, "name": "towel/napkin"}, - {"id": 352, "name": "durian"}, - {"id": 276, "name": "board eraser"}, - {"id": 315, "name": "electric drill"}, - {"id": 312, "name": "sushi"}, - {"id": 198, "name": "pie"}, - {"id": 106, "name": "pickup truck"}, - {"id": 176, "name": "bathtub"}, - {"id": 26, "name": "vase"}, - {"id": 133, "name": "elephant"}, - {"id": 256, "name": "sandwich"}, - {"id": 327, "name": "noodles"}, - {"id": 10, "name": "glasses"}, - {"id": 109, "name": "airplane"}, - {"id": 95, "name": "tripod"}, - {"id": 247, "name": "CD"}, - {"id": 121, "name": "machinery vehicle"}, - {"id": 365, "name": "flashlight"}, - {"id": 53, "name": "microphone"}, - {"id": 270, "name": "pliers"}, - {"id": 362, "name": "chainsaw"}, - {"id": 259, "name": "bear"}, - {"id": 197, "name": "electronic stove and gas stove"}, - {"id": 89, "name": "pot/pan"}, - {"id": 220, "name": "tape"}, - {"id": 338, "name": "lighter"}, - {"id": 177, "name": "snowboard"}, - {"id": 214, "name": "violin"}, - {"id": 217, "name": "chicken"}, - {"id": 2, "name": "sneakers"}, - {"id": 161, "name": "washing machine"}, - {"id": 131, "name": "kite"}, - {"id": 354, "name": "rabbit"}, - {"id": 86, "name": "bus"}, - {"id": 275, "name": "dates"}, - {"id": 282, "name": "camel"}, - {"id": 88, "name": "nightstand"}, - {"id": 179, "name": "grapes"}, - {"id": 229, "name": "pine apple"}, - {"id": 56, "name": "necklace"}, - {"id": 18, "name": "leather shoes"}, - {"id": 358, "name": "hoverboard"}, - {"id": 345, "name": "pencil case"}, - {"id": 359, "name": "pasta"}, - {"id": 157, "name": "radiator"}, - {"id": 201, "name": "hamburger"}, - {"id": 268, "name": "globe"}, - {"id": 332, "name": "barbell"}, - {"id": 329, "name": "mop"}, - {"id": 252, "name": "horn"}, - {"id": 350, "name": "eagle"}, - {"id": 169, "name": "folder"}, - {"id": 137, "name": "toilet"}, - {"id": 5, "name": "lamp"}, - {"id": 27, "name": "bench"}, - {"id": 249, "name": "swan"}, - {"id": 76, "name": "knife"}, - {"id": 341, "name": "comb"}, - {"id": 64, "name": "watch"}, - {"id": 105, "name": "telephone"}, - {"id": 3, "name": "chair"}, - {"id": 33, "name": "boat"}, - {"id": 107, "name": "orange"}, - {"id": 60, "name": "bread"}, - {"id": 147, "name": "cat"}, - {"id": 135, "name": "gas stove"}, - {"id": 307, "name": "papaya"}, - {"id": 227, "name": "router/modem"}, - {"id": 357, "name": "asparagus"}, - {"id": 73, "name": "motorcycle"}, - {"id": 77, "name": "traffic sign"}, - {"id": 67, "name": "fish"}, - {"id": 326, "name": "radish"}, - {"id": 213, "name": "egg"}, - {"id": 203, "name": "cucumber"}, - {"id": 17, "name": "helmet"}, - {"id": 110, "name": "luggage"}, - {"id": 80, "name": "truck"}, - {"id": 199, "name": "frisbee"}, - {"id": 232, "name": "peach"}, - {"id": 1, "name": "person"}, - {"id": 29, "name": "boots"}, - {"id": 310, "name": "chips"}, - {"id": 142, "name": "skateboard"}, - {"id": 44, "name": "slippers"}, - {"id": 4, "name": "hat"}, - {"id": 178, "name": "suitcase"}, - {"id": 24, "name": "tv"}, - {"id": 119, "name": "train"}, - {"id": 82, "name": "power outlet"}, - {"id": 245, "name": "swing"}, - {"id": 15, "name": "book"}, - {"id": 294, "name": "jellyfish"}, - {"id": 192, "name": "fire extinguisher"}, - {"id": 212, "name": "deer"}, - {"id": 181, "name": "pear"}, - {"id": 347, "name": "table tennis paddle"}, - {"id": 113, "name": "trolley"}, - {"id": 91, "name": "guitar"}, - {"id": 202, "name": "golf club"}, - {"id": 221, "name": "wheelchair"}, - {"id": 254, "name": "saxophone"}, - {"id": 117, "name": "paper towel"}, - {"id": 303, "name": "race car"}, - {"id": 240, "name": "carriage"}, - {"id": 246, "name": "radio"}, - {"id": 318, "name": "parrot"}, - {"id": 251, "name": "french fries"}, - {"id": 98, "name": "dog"}, - {"id": 112, "name": "soccer"}, - {"id": 355, "name": "french horn"}, - {"id": 79, "name": "paddle"}, - {"id": 283, "name": "lettuce"}, - {"id": 9, "name": "car"}, - {"id": 258, "name": "kiwi fruit"}, - {"id": 325, "name": "llama"}, - {"id": 187, "name": "billiards"}, - {"id": 210, "name": "facial cleanser"}, - {"id": 81, "name": "cow"}, - {"id": 331, "name": "microscope"}, - {"id": 148, "name": "lemon"}, - {"id": 302, "name": "pomelo"}, - {"id": 85, "name": "fork"}, - {"id": 154, "name": "pumpkin"}, - {"id": 289, "name": "shrimp"}, - {"id": 71, "name": "teddy bear"}, - {"id": 184, "name": "potato"}, - {"id": 102, "name": "air conditioner"}, - {"id": 208, "name": "hot dog"}, - {"id": 222, "name": "plum"}, - {"id": 316, "name": "spring rolls"}, - {"id": 230, "name": "crane"}, - {"id": 149, "name": "liquid soap"}, - {"id": 55, "name": "canned"}, - {"id": 35, "name": "speaker"}, - {"id": 108, "name": "banana"}, - {"id": 297, "name": "treadmill"}, - {"id": 99, "name": "spoon"}, - {"id": 104, "name": "mouse"}, - {"id": 182, "name": "american football"}, - {"id": 299, "name": "egg tart"}, - {"id": 127, "name": "cleaning products"}, - {"id": 313, "name": "urinal"}, - {"id": 286, "name": "medal"}, - {"id": 239, "name": "brush"}, - {"id": 96, "name": "hockey"}, - {"id": 279, "name": "dumbbell"}, - {"id": 32, "name": "umbrella"}, - {"id": 272, "name": "hammer"}, - {"id": 16, "name": "plate"}, - {"id": 21, "name": "potted plant"}, - {"id": 242, "name": "earphone"}, - {"id": 70, "name": "candle"}, - {"id": 185, "name": "paint brush"}, - {"id": 48, "name": "toy"}, - {"id": 130, "name": "pizza"}, - {"id": 255, "name": "trumpet"}, - {"id": 361, "name": "hotair balloon"}, - {"id": 188, "name": "fire hydrant"}, - {"id": 50, "name": "bed"}, - {"id": 253, "name": "avocado"}, - {"id": 293, "name": "coconut"}, - {"id": 257, "name": "cue"}, - {"id": 280, "name": "hamimelon"}, - {"id": 66, "name": "horse"}, - {"id": 173, "name": "pigeon"}, - {"id": 190, "name": "projector"}, - {"id": 69, "name": "camera"}, - {"id": 30, "name": "bowl"}, - {"id": 269, "name": "broom"}, - {"id": 343, "name": "pitaya"}, - {"id": 305, "name": "tuba"}, - {"id": 309, "name": "green onion"}, - {"id": 363, "name": "lobster"}, - {"id": 225, "name": "watermelon"}, - {"id": 47, "name": "suv"}, - {"id": 31, "name": "dining table"}, - {"id": 54, "name": "sandals"}, - {"id": 351, "name": "monkey"}, - {"id": 218, "name": "onion"}, - {"id": 36, "name": "trash bin/can"}, - {"id": 20, "name": "glove"}, - {"id": 277, "name": "rice"}, - {"id": 152, "name": "sports car"}, - {"id": 360, "name": "target"}, - {"id": 205, "name": "blender"}, - {"id": 19, "name": "pillow"}, - {"id": 72, "name": "cake"}, - {"id": 93, "name": "tea pot"}, - {"id": 353, "name": "game board"}, - {"id": 38, "name": "backpack"}, - {"id": 356, "name": "ambulance"}, - {"id": 146, "name": "life saver"}, - {"id": 189, "name": "goose"}, - {"id": 278, "name": "tape measure/ruler"}, - {"id": 92, "name": "traffic cone"}, - {"id": 134, "name": "toiletries"}, - {"id": 114, "name": "oven"}, - {"id": 317, "name": "tortoise/turtle"}, - {"id": 265, "name": "corn"}, - {"id": 126, "name": "donut"}, - {"id": 57, "name": "mirror"}, - {"id": 7, "name": "cabinet/shelf"}, - {"id": 263, "name": "green vegetables"}, - {"id": 159, "name": "tissue "}, - {"id": 321, "name": "shark"}, - {"id": 301, "name": "pig"}, - {"id": 41, "name": "carpet"}, - {"id": 304, "name": "rice cooker"}, - {"id": 323, "name": "poker card"}, -] - - -def _get_builtin_metadata(version): - if version == "v1": - id_to_name = {x["id"]: x["name"] for x in categories_v1} - else: - assert 0, version - thing_dataset_id_to_contiguous_id = {i + 1: i for i in range(365)} - thing_classes = [id_to_name[k] for k in sorted(id_to_name)] - return { - "thing_dataset_id_to_contiguous_id": thing_dataset_id_to_contiguous_id, - "thing_classes": thing_classes, - } - - -_PREDEFINED_SPLITS_OBJECTS365 = { - "objects365_train": ("objects365/train", "objects365/annotations/objects365_train.json"), - "objects365_val": ("objects365/val", "objects365/annotations/objects365_val.json"), -} - -for key, (image_root, json_file) in _PREDEFINED_SPLITS_OBJECTS365.items(): - register_coco_instances( - key, - _get_builtin_metadata("v1"), - os.path.join("datasets", json_file) if "://" not in json_file else json_file, - os.path.join("datasets", image_root), - ) diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/data/transforms/custom_augmentation_impl.py b/dimos/models/Detic/third_party/CenterNet2/centernet/data/transforms/custom_augmentation_impl.py deleted file mode 100644 index f4ec0ad07f..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/transforms/custom_augmentation_impl.py +++ /dev/null @@ -1,53 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# Modified by Xingyi Zhou -""" -Implement many useful :class:`Augmentation`. -""" - -from detectron2.data.transforms.augmentation import Augmentation -import numpy as np -from PIL import Image - -from .custom_transform import EfficientDetResizeCropTransform - -__all__ = [ - "EfficientDetResizeCrop", -] - - -class EfficientDetResizeCrop(Augmentation): - """ - Scale the shorter edge to the given size, with a limit of `max_size` on the longer edge. - If `max_size` is reached, then downscale so that the longer edge does not exceed max_size. - """ - - def __init__(self, size: int, scale, interp=Image.BILINEAR) -> None: - """ - Args: - """ - super().__init__() - self.target_size = (size, size) - self.scale = scale - self.interp = interp - - def get_transform(self, img): - # Select a random scale factor. - scale_factor = np.random.uniform(*self.scale) - scaled_target_height = scale_factor * self.target_size[0] - scaled_target_width = scale_factor * self.target_size[1] - # Recompute the accurate scale_factor using rounded scaled image size. - width, height = img.shape[1], img.shape[0] - img_scale_y = scaled_target_height / height - img_scale_x = scaled_target_width / width - img_scale = min(img_scale_y, img_scale_x) - - # Select non-zero random offset (x, y) if scaled image is larger than target size - scaled_h = int(height * img_scale) - scaled_w = int(width * img_scale) - offset_y = scaled_h - self.target_size[0] - offset_x = scaled_w - self.target_size[1] - offset_y = int(max(0.0, float(offset_y)) * np.random.uniform(0, 1)) - offset_x = int(max(0.0, float(offset_x)) * np.random.uniform(0, 1)) - return EfficientDetResizeCropTransform( - scaled_h, scaled_w, offset_y, offset_x, img_scale, self.target_size, self.interp - ) diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/data/transforms/custom_transform.py b/dimos/models/Detic/third_party/CenterNet2/centernet/data/transforms/custom_transform.py deleted file mode 100644 index 6635a5999b..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/transforms/custom_transform.py +++ /dev/null @@ -1,88 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# Modified by Xingyi Zhou -# File: transform.py - -from fvcore.transforms.transform import ( - Transform, -) -import numpy as np -from PIL import Image -import torch -import torch.nn.functional as F - -try: - import cv2 -except ImportError: - # OpenCV is an optional dependency at the moment - pass - -__all__ = [ - "EfficientDetResizeCropTransform", -] - - -class EfficientDetResizeCropTransform(Transform): - """ """ - - def __init__(self, scaled_h, scaled_w, offset_y, offset_x, img_scale, target_size: int, interp=None) -> None: - """ - Args: - h, w (int): original image size - new_h, new_w (int): new image size - interp: PIL interpolation methods, defaults to bilinear. - """ - # TODO decide on PIL vs opencv - super().__init__() - if interp is None: - interp = Image.BILINEAR - self._set_attributes(locals()) - - def apply_image(self, img, interp=None): - # assert img.shape[:2] == (self.h, self.w) - assert len(img.shape) <= 4 - - if img.dtype == np.uint8: - pil_image = Image.fromarray(img) - interp_method = interp if interp is not None else self.interp - pil_image = pil_image.resize((self.scaled_w, self.scaled_h), interp_method) - ret = np.asarray(pil_image) - right = min(self.scaled_w, self.offset_x + self.target_size[1]) - lower = min(self.scaled_h, self.offset_y + self.target_size[0]) - # img = img.crop((self.offset_x, self.offset_y, right, lower)) - if len(ret.shape) <= 3: - ret = ret[self.offset_y : lower, self.offset_x : right] - else: - ret = ret[..., self.offset_y : lower, self.offset_x : right, :] - else: - # PIL only supports uint8 - img = torch.from_numpy(img) - shape = list(img.shape) - shape_4d = shape[:2] + [1] * (4 - len(shape)) + shape[2:] - img = img.view(shape_4d).permute(2, 3, 0, 1) # hw(c) -> nchw - _PIL_RESIZE_TO_INTERPOLATE_MODE = {Image.BILINEAR: "bilinear", Image.BICUBIC: "bicubic"} - mode = _PIL_RESIZE_TO_INTERPOLATE_MODE[self.interp] - img = F.interpolate(img, (self.scaled_h, self.scaled_w), mode=mode, align_corners=False) - shape[:2] = (self.scaled_h, self.scaled_w) - ret = img.permute(2, 3, 0, 1).view(shape).numpy() # nchw -> hw(c) - right = min(self.scaled_w, self.offset_x + self.target_size[1]) - lower = min(self.scaled_h, self.offset_y + self.target_size[0]) - if len(ret.shape) <= 3: - ret = ret[self.offset_y : lower, self.offset_x : right] - else: - ret = ret[..., self.offset_y : lower, self.offset_x : right, :] - return ret - - def apply_coords(self, coords): - coords[:, 0] = coords[:, 0] * self.img_scale - coords[:, 1] = coords[:, 1] * self.img_scale - coords[:, 0] -= self.offset_x - coords[:, 1] -= self.offset_y - return coords - - def apply_segmentation(self, segmentation): - segmentation = self.apply_image(segmentation, interp=Image.NEAREST) - return segmentation - - def inverse(self): - raise NotImplementedError - # return ResizeTransform(self.new_h, self.new_w, self.h, self.w, self.interp) diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/bifpn.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/bifpn.py deleted file mode 100644 index 733b502da4..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/bifpn.py +++ /dev/null @@ -1,527 +0,0 @@ -# Modified from https://github.com/rwightman/efficientdet-pytorch/blob/master/effdet/efficientdet.py -# The original file is under Apache-2.0 License -from collections import OrderedDict -import math - -from detectron2.layers import Conv2d, ShapeSpec -from detectron2.layers.batch_norm import get_norm -from detectron2.modeling.backbone import Backbone -from detectron2.modeling.backbone.build import BACKBONE_REGISTRY -from detectron2.modeling.backbone.resnet import build_resnet_backbone -import torch -from torch import nn - -from .dlafpn import dla34 - - -def get_fpn_config(base_reduction: int=8): - """BiFPN config with sum.""" - p = { - "nodes": [ - {"reduction": base_reduction << 3, "inputs_offsets": [3, 4]}, - {"reduction": base_reduction << 2, "inputs_offsets": [2, 5]}, - {"reduction": base_reduction << 1, "inputs_offsets": [1, 6]}, - {"reduction": base_reduction, "inputs_offsets": [0, 7]}, - {"reduction": base_reduction << 1, "inputs_offsets": [1, 7, 8]}, - {"reduction": base_reduction << 2, "inputs_offsets": [2, 6, 9]}, - {"reduction": base_reduction << 3, "inputs_offsets": [3, 5, 10]}, - {"reduction": base_reduction << 4, "inputs_offsets": [4, 11]}, - ], - "weight_method": "fastattn", - } - return p - - -def swish(x, inplace: bool = False): - """Swish - Described in: https://arxiv.org/abs/1710.05941""" - return x.mul_(x.sigmoid()) if inplace else x.mul(x.sigmoid()) - - -class Swish(nn.Module): - def __init__(self, inplace: bool = False) -> None: - super().__init__() - self.inplace = inplace - - def forward(self, x): - return swish(x, self.inplace) - - -class SequentialAppend(nn.Sequential): - def __init__(self, *args) -> None: - super().__init__(*args) - - def forward(self, x): - for module in self: - x.append(module(x)) - return x - - -class SequentialAppendLast(nn.Sequential): - def __init__(self, *args) -> None: - super().__init__(*args) - - # def forward(self, x: List[torch.Tensor]): - def forward(self, x): - for module in self: - x.append(module(x[-1])) - return x - - -class ConvBnAct2d(nn.Module): - def __init__( - self, - in_channels, - out_channels, - kernel_size: int, - stride: int=1, - dilation: int=1, - padding: str="", - bias: bool=False, - norm: str="", - act_layer=Swish, - ) -> None: - super().__init__() - # self.conv = create_conv2d( - # in_channels, out_channels, kernel_size, stride=stride, dilation=dilation, padding=padding, bias=bias) - self.conv = Conv2d( - in_channels, - out_channels, - kernel_size=kernel_size, - stride=stride, - padding=kernel_size // 2, - bias=(norm == ""), - ) - self.bn = get_norm(norm, out_channels) - self.act = None if act_layer is None else act_layer(inplace=True) - - def forward(self, x): - x = self.conv(x) - if self.bn is not None: - x = self.bn(x) - if self.act is not None: - x = self.act(x) - return x - - -class SeparableConv2d(nn.Module): - """Separable Conv""" - - def __init__( - self, - in_channels, - out_channels, - kernel_size: int=3, - stride: int=1, - dilation: int=1, - padding: str="", - bias: bool=False, - channel_multiplier: float=1.0, - pw_kernel_size: int=1, - act_layer=Swish, - norm: str="", - ) -> None: - super().__init__() - - # self.conv_dw = create_conv2d( - # in_channels, int(in_channels * channel_multiplier), kernel_size, - # stride=stride, dilation=dilation, padding=padding, depthwise=True) - - self.conv_dw = Conv2d( - in_channels, - int(in_channels * channel_multiplier), - kernel_size=kernel_size, - stride=stride, - padding=kernel_size // 2, - bias=bias, - groups=out_channels, - ) - # print('conv_dw', kernel_size, stride) - # self.conv_pw = create_conv2d( - # int(in_channels * channel_multiplier), out_channels, pw_kernel_size, padding=padding, bias=bias) - - self.conv_pw = Conv2d( - int(in_channels * channel_multiplier), - out_channels, - kernel_size=pw_kernel_size, - padding=pw_kernel_size // 2, - bias=(norm == ""), - ) - # print('conv_pw', pw_kernel_size) - - self.bn = get_norm(norm, out_channels) - self.act = None if act_layer is None else act_layer(inplace=True) - - def forward(self, x): - x = self.conv_dw(x) - x = self.conv_pw(x) - if self.bn is not None: - x = self.bn(x) - if self.act is not None: - x = self.act(x) - return x - - -class ResampleFeatureMap(nn.Sequential): - def __init__( - self, - in_channels, - out_channels, - reduction_ratio: float=1.0, - pad_type: str="", - pooling_type: str="max", - norm: str="", - apply_bn: bool=False, - conv_after_downsample: bool=False, - redundant_bias: bool=False, - ) -> None: - super().__init__() - pooling_type = pooling_type or "max" - self.in_channels = in_channels - self.out_channels = out_channels - self.reduction_ratio = reduction_ratio - self.conv_after_downsample = conv_after_downsample - - conv = None - if in_channels != out_channels: - conv = ConvBnAct2d( - in_channels, - out_channels, - kernel_size=1, - padding=pad_type, - norm=norm if apply_bn else "", - bias=not apply_bn or redundant_bias, - act_layer=None, - ) - - if reduction_ratio > 1: - stride_size = int(reduction_ratio) - if conv is not None and not self.conv_after_downsample: - self.add_module("conv", conv) - self.add_module( - "downsample", - # create_pool2d( - # pooling_type, kernel_size=stride_size + 1, stride=stride_size, padding=pad_type) - # nn.MaxPool2d(kernel_size=stride_size + 1, stride=stride_size, padding=pad_type) - nn.MaxPool2d(kernel_size=stride_size, stride=stride_size), - ) - if conv is not None and self.conv_after_downsample: - self.add_module("conv", conv) - else: - if conv is not None: - self.add_module("conv", conv) - if reduction_ratio < 1: - scale = int(1 // reduction_ratio) - self.add_module("upsample", nn.UpsamplingNearest2d(scale_factor=scale)) - - -class FpnCombine(nn.Module): - def __init__( - self, - feature_info, - fpn_config, - fpn_channels, - inputs_offsets, - target_reduction, - pad_type: str="", - pooling_type: str="max", - norm: str="", - apply_bn_for_resampling: bool=False, - conv_after_downsample: bool=False, - redundant_bias: bool=False, - weight_method: str="attn", - ) -> None: - super().__init__() - self.inputs_offsets = inputs_offsets - self.weight_method = weight_method - - self.resample = nn.ModuleDict() - for _idx, offset in enumerate(inputs_offsets): - in_channels = fpn_channels - if offset < len(feature_info): - in_channels = feature_info[offset]["num_chs"] - input_reduction = feature_info[offset]["reduction"] - else: - node_idx = offset - len(feature_info) - # print('node_idx, len', node_idx, len(fpn_config['nodes'])) - input_reduction = fpn_config["nodes"][node_idx]["reduction"] - reduction_ratio = target_reduction / input_reduction - self.resample[str(offset)] = ResampleFeatureMap( - in_channels, - fpn_channels, - reduction_ratio=reduction_ratio, - pad_type=pad_type, - pooling_type=pooling_type, - norm=norm, - apply_bn=apply_bn_for_resampling, - conv_after_downsample=conv_after_downsample, - redundant_bias=redundant_bias, - ) - - if weight_method == "attn" or weight_method == "fastattn": - # WSM - self.edge_weights = nn.Parameter(torch.ones(len(inputs_offsets)), requires_grad=True) - else: - self.edge_weights = None - - def forward(self, x): - dtype = x[0].dtype - nodes = [] - for offset in self.inputs_offsets: - input_node = x[offset] - input_node = self.resample[str(offset)](input_node) - nodes.append(input_node) - - if self.weight_method == "attn": - normalized_weights = torch.softmax(self.edge_weights.type(dtype), dim=0) - x = torch.stack(nodes, dim=-1) * normalized_weights - elif self.weight_method == "fastattn": - edge_weights = nn.functional.relu(self.edge_weights.type(dtype)) - weights_sum = torch.sum(edge_weights) - x = torch.stack( - [(nodes[i] * edge_weights[i]) / (weights_sum + 0.0001) for i in range(len(nodes))], - dim=-1, - ) - elif self.weight_method == "sum": - x = torch.stack(nodes, dim=-1) - else: - raise ValueError(f"unknown weight_method {self.weight_method}") - x = torch.sum(x, dim=-1) - return x - - -class BiFpnLayer(nn.Module): - def __init__( - self, - feature_info, - fpn_config, - fpn_channels, - num_levels: int=5, - pad_type: str="", - pooling_type: str="max", - norm: str="", - act_layer=Swish, - apply_bn_for_resampling: bool=False, - conv_after_downsample: bool=True, - conv_bn_relu_pattern: bool=False, - separable_conv: bool=True, - redundant_bias: bool=False, - ) -> None: - super().__init__() - self.fpn_config = fpn_config - self.num_levels = num_levels - self.conv_bn_relu_pattern = False - - self.feature_info = [] - self.fnode = SequentialAppend() - for i, fnode_cfg in enumerate(fpn_config["nodes"]): - # logging.debug('fnode {} : {}'.format(i, fnode_cfg)) - # print('fnode {} : {}'.format(i, fnode_cfg)) - fnode_layers = OrderedDict() - - # combine features - reduction = fnode_cfg["reduction"] - fnode_layers["combine"] = FpnCombine( - feature_info, - fpn_config, - fpn_channels, - fnode_cfg["inputs_offsets"], - target_reduction=reduction, - pad_type=pad_type, - pooling_type=pooling_type, - norm=norm, - apply_bn_for_resampling=apply_bn_for_resampling, - conv_after_downsample=conv_after_downsample, - redundant_bias=redundant_bias, - weight_method=fpn_config["weight_method"], - ) - self.feature_info.append(dict(num_chs=fpn_channels, reduction=reduction)) - - # after combine ops - after_combine = OrderedDict() - if not conv_bn_relu_pattern: - after_combine["act"] = act_layer(inplace=True) - conv_bias = redundant_bias - conv_act = None - else: - conv_bias = False - conv_act = act_layer - conv_kwargs = dict( - in_channels=fpn_channels, - out_channels=fpn_channels, - kernel_size=3, - padding=pad_type, - bias=conv_bias, - norm=norm, - act_layer=conv_act, - ) - after_combine["conv"] = ( - SeparableConv2d(**conv_kwargs) if separable_conv else ConvBnAct2d(**conv_kwargs) - ) - fnode_layers["after_combine"] = nn.Sequential(after_combine) - - self.fnode.add_module(str(i), nn.Sequential(fnode_layers)) - - self.feature_info = self.feature_info[-num_levels::] - - def forward(self, x): - x = self.fnode(x) - return x[-self.num_levels : :] - - -class BiFPN(Backbone): - def __init__( - self, - cfg, - bottom_up, - in_features, - out_channels, - norm: str="", - num_levels: int=5, - num_bifpn: int=4, - separable_conv: bool=False, - ) -> None: - super().__init__() - assert isinstance(bottom_up, Backbone) - - # Feature map strides and channels from the bottom up network (e.g. ResNet) - input_shapes = bottom_up.output_shape() - in_strides = [input_shapes[f].stride for f in in_features] - in_channels = [input_shapes[f].channels for f in in_features] - - self.num_levels = num_levels - self.num_bifpn = num_bifpn - self.bottom_up = bottom_up - self.in_features = in_features - self._size_divisibility = 128 - levels = [int(math.log2(s)) for s in in_strides] - self._out_feature_strides = {f"p{int(math.log2(s))}": s for s in in_strides} - if len(in_features) < num_levels: - for l in range(num_levels - len(in_features)): - s = l + levels[-1] - self._out_feature_strides[f"p{s + 1}"] = 2 ** (s + 1) - self._out_features = list(sorted(self._out_feature_strides.keys())) - self._out_feature_channels = {k: out_channels for k in self._out_features} - - # print('self._out_feature_strides', self._out_feature_strides) - # print('self._out_feature_channels', self._out_feature_channels) - - feature_info = [ - {"num_chs": in_channels[level], "reduction": in_strides[level]} - for level in range(len(self.in_features)) - ] - # self.config = config - fpn_config = get_fpn_config() - self.resample = SequentialAppendLast() - for level in range(num_levels): - if level < len(feature_info): - in_chs = in_channels[level] # feature_info[level]['num_chs'] - reduction = in_strides[level] # feature_info[level]['reduction'] - else: - # Adds a coarser level by downsampling the last feature map - reduction_ratio = 2 - self.resample.add_module( - str(level), - ResampleFeatureMap( - in_channels=in_chs, - out_channels=out_channels, - pad_type="same", - pooling_type=None, - norm=norm, - reduction_ratio=reduction_ratio, - apply_bn=True, - conv_after_downsample=False, - redundant_bias=False, - ), - ) - in_chs = out_channels - reduction = int(reduction * reduction_ratio) - feature_info.append(dict(num_chs=in_chs, reduction=reduction)) - - self.cell = nn.Sequential() - for rep in range(self.num_bifpn): - # logging.debug('building cell {}'.format(rep)) - # print('building cell {}'.format(rep)) - fpn_layer = BiFpnLayer( - feature_info=feature_info, - fpn_config=fpn_config, - fpn_channels=out_channels, - num_levels=self.num_levels, - pad_type="same", - pooling_type=None, - norm=norm, - act_layer=Swish, - separable_conv=separable_conv, - apply_bn_for_resampling=True, - conv_after_downsample=False, - conv_bn_relu_pattern=False, - redundant_bias=False, - ) - self.cell.add_module(str(rep), fpn_layer) - feature_info = fpn_layer.feature_info - # import pdb; pdb.set_trace() - - @property - def size_divisibility(self): - return self._size_divisibility - - def forward(self, x): - # print('input shapes', x.shape) - bottom_up_features = self.bottom_up(x) - x = [bottom_up_features[f] for f in self.in_features] - assert len(self.resample) == self.num_levels - len(x) - x = self.resample(x) - [xx.shape for xx in x] - # print('resample shapes', shapes) - x = self.cell(x) - out = {f: xx for f, xx in zip(self._out_features, x, strict=False)} - # import pdb; pdb.set_trace() - return out - - -@BACKBONE_REGISTRY.register() -def build_resnet_bifpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = build_resnet_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - backbone = BiFPN( - cfg=cfg, - bottom_up=bottom_up, - in_features=in_features, - out_channels=cfg.MODEL.BIFPN.OUT_CHANNELS, - norm=cfg.MODEL.BIFPN.NORM, - num_levels=cfg.MODEL.BIFPN.NUM_LEVELS, - num_bifpn=cfg.MODEL.BIFPN.NUM_BIFPN, - separable_conv=cfg.MODEL.BIFPN.SEPARABLE_CONV, - ) - return backbone - - -@BACKBONE_REGISTRY.register() -def build_p37_dla_bifpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = dla34(cfg) - in_features = cfg.MODEL.FPN.IN_FEATURES - assert cfg.MODEL.BIFPN.NUM_LEVELS == 5 - - backbone = BiFPN( - cfg=cfg, - bottom_up=bottom_up, - in_features=in_features, - out_channels=cfg.MODEL.BIFPN.OUT_CHANNELS, - norm=cfg.MODEL.BIFPN.NORM, - num_levels=cfg.MODEL.BIFPN.NUM_LEVELS, - num_bifpn=cfg.MODEL.BIFPN.NUM_BIFPN, - separable_conv=cfg.MODEL.BIFPN.SEPARABLE_CONV, - ) - return backbone diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/bifpn_fcos.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/bifpn_fcos.py deleted file mode 100644 index 27ad4e62fc..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/bifpn_fcos.py +++ /dev/null @@ -1,455 +0,0 @@ -# This file is modified from https://github.com/aim-uofa/AdelaiDet/blob/master/adet/modeling/backbone/bifpn.py -# The original file is under 2-clause BSD License for academic use, and *non-commercial use*. -from detectron2.layers import Conv2d, ShapeSpec, get_norm -from detectron2.modeling import BACKBONE_REGISTRY -from detectron2.modeling.backbone import Backbone, build_resnet_backbone -import torch -from torch import nn -import torch.nn.functional as F - -from .dlafpn import dla34 -from typing import Sequence - -__all__ = [] - - -def swish(x): - return x * x.sigmoid() - - -def split_name(name: str): - for i, c in enumerate(name): - if not c.isalpha(): - return name[:i], int(name[i:]) - raise ValueError() - - -class FeatureMapResampler(nn.Module): - def __init__(self, in_channels, out_channels, stride: int, norm: str="") -> None: - super().__init__() - if in_channels != out_channels: - self.reduction = Conv2d( - in_channels, - out_channels, - kernel_size=1, - bias=(norm == ""), - norm=get_norm(norm, out_channels), - activation=None, - ) - else: - self.reduction = None - - assert stride <= 2 - self.stride = stride - - def forward(self, x): - if self.reduction is not None: - x = self.reduction(x) - - if self.stride == 2: - x = F.max_pool2d(x, kernel_size=self.stride + 1, stride=self.stride, padding=1) - elif self.stride == 1: - pass - else: - raise NotImplementedError() - return x - - -class BackboneWithTopLevels(Backbone): - def __init__(self, backbone, out_channels, num_top_levels: int, norm: str="") -> None: - super().__init__() - self.backbone = backbone - backbone_output_shape = backbone.output_shape() - - self._out_feature_channels = { - name: shape.channels for name, shape in backbone_output_shape.items() - } - self._out_feature_strides = { - name: shape.stride for name, shape in backbone_output_shape.items() - } - self._out_features = list(self._out_feature_strides.keys()) - - last_feature_name = max(self._out_feature_strides.keys(), key=lambda x: split_name(x)[1]) - self.last_feature_name = last_feature_name - self.num_top_levels = num_top_levels - - last_channels = self._out_feature_channels[last_feature_name] - last_stride = self._out_feature_strides[last_feature_name] - - prefix, suffix = split_name(last_feature_name) - prev_channels = last_channels - for i in range(num_top_levels): - name = prefix + str(suffix + i + 1) - self.add_module(name, FeatureMapResampler(prev_channels, out_channels, 2, norm)) - prev_channels = out_channels - - self._out_feature_channels[name] = out_channels - self._out_feature_strides[name] = last_stride * 2 ** (i + 1) - self._out_features.append(name) - - def forward(self, x): - outputs = self.backbone(x) - last_features = outputs[self.last_feature_name] - prefix, suffix = split_name(self.last_feature_name) - - x = last_features - for i in range(self.num_top_levels): - name = prefix + str(suffix + i + 1) - x = self.__getattr__(name)(x) - outputs[name] = x - - return outputs - - -class SingleBiFPN(Backbone): - """ - This module implements Feature Pyramid Network. - It creates pyramid features built on top of some input feature maps. - """ - - def __init__(self, in_channels_list, out_channels, norm: str="") -> None: - """ - Args: - bottom_up (Backbone): module representing the bottom up subnetwork. - Must be a subclass of :class:`Backbone`. The multi-scale feature - maps generated by the bottom up network, and listed in `in_features`, - are used to generate FPN levels. - in_features (list[str]): names of the input feature maps coming - from the backbone to which FPN is attached. For example, if the - backbone produces ["res2", "res3", "res4"], any *contiguous* sublist - of these may be used; order must be from high to low resolution. - out_channels (int): number of channels in the output feature maps. - norm (str): the normalization to use. - """ - super().__init__() - - self.out_channels = out_channels - # build 5-levels bifpn - if len(in_channels_list) == 5: - self.nodes = [ - {"feat_level": 3, "inputs_offsets": [3, 4]}, - {"feat_level": 2, "inputs_offsets": [2, 5]}, - {"feat_level": 1, "inputs_offsets": [1, 6]}, - {"feat_level": 0, "inputs_offsets": [0, 7]}, - {"feat_level": 1, "inputs_offsets": [1, 7, 8]}, - {"feat_level": 2, "inputs_offsets": [2, 6, 9]}, - {"feat_level": 3, "inputs_offsets": [3, 5, 10]}, - {"feat_level": 4, "inputs_offsets": [4, 11]}, - ] - elif len(in_channels_list) == 3: - self.nodes = [ - {"feat_level": 1, "inputs_offsets": [1, 2]}, - {"feat_level": 0, "inputs_offsets": [0, 3]}, - {"feat_level": 1, "inputs_offsets": [1, 3, 4]}, - {"feat_level": 2, "inputs_offsets": [2, 5]}, - ] - else: - raise NotImplementedError - - node_info = [_ for _ in in_channels_list] - - num_output_connections = [0 for _ in in_channels_list] - for fnode in self.nodes: - feat_level = fnode["feat_level"] - inputs_offsets = fnode["inputs_offsets"] - inputs_offsets_str = "_".join(map(str, inputs_offsets)) - for input_offset in inputs_offsets: - num_output_connections[input_offset] += 1 - - in_channels = node_info[input_offset] - if in_channels != out_channels: - lateral_conv = Conv2d( - in_channels, out_channels, kernel_size=1, norm=get_norm(norm, out_channels) - ) - self.add_module(f"lateral_{input_offset}_f{feat_level}", lateral_conv) - node_info.append(out_channels) - num_output_connections.append(0) - - # generate attention weights - name = f"weights_f{feat_level}_{inputs_offsets_str}" - self.__setattr__( - name, - nn.Parameter( - torch.ones(len(inputs_offsets), dtype=torch.float32), requires_grad=True - ), - ) - - # generate convolutions after combination - name = f"outputs_f{feat_level}_{inputs_offsets_str}" - self.add_module( - name, - Conv2d( - out_channels, - out_channels, - kernel_size=3, - padding=1, - norm=get_norm(norm, out_channels), - bias=(norm == ""), - ), - ) - - def forward(self, feats): - """ - Args: - input (dict[str->Tensor]): mapping feature map name (e.g., "p5") to - feature map tensor for each feature level in high to low resolution order. - Returns: - dict[str->Tensor]: - mapping from feature map name to FPN feature map tensor - in high to low resolution order. Returned feature names follow the FPN - paper convention: "p", where stage has stride = 2 ** stage e.g., - ["n2", "n3", ..., "n6"]. - """ - feats = [_ for _ in feats] - num_levels = len(feats) - num_output_connections = [0 for _ in feats] - for fnode in self.nodes: - feat_level = fnode["feat_level"] - inputs_offsets = fnode["inputs_offsets"] - inputs_offsets_str = "_".join(map(str, inputs_offsets)) - input_nodes = [] - _, _, target_h, target_w = feats[feat_level].size() - for input_offset in inputs_offsets: - num_output_connections[input_offset] += 1 - input_node = feats[input_offset] - - # reduction - if input_node.size(1) != self.out_channels: - name = f"lateral_{input_offset}_f{feat_level}" - input_node = self.__getattr__(name)(input_node) - - # maybe downsample - _, _, h, w = input_node.size() - if h > target_h and w > target_w: - height_stride_size = int((h - 1) // target_h + 1) - width_stride_size = int((w - 1) // target_w + 1) - assert height_stride_size == width_stride_size == 2 - input_node = F.max_pool2d( - input_node, - kernel_size=(height_stride_size + 1, width_stride_size + 1), - stride=(height_stride_size, width_stride_size), - padding=1, - ) - elif h <= target_h and w <= target_w: - if h < target_h or w < target_w: - input_node = F.interpolate( - input_node, size=(target_h, target_w), mode="nearest" - ) - else: - raise NotImplementedError() - input_nodes.append(input_node) - - # attention - name = f"weights_f{feat_level}_{inputs_offsets_str}" - weights = F.relu(self.__getattr__(name)) - norm_weights = weights / (weights.sum() + 0.0001) - - new_node = torch.stack(input_nodes, dim=-1) - new_node = (norm_weights * new_node).sum(dim=-1) - new_node = swish(new_node) - - name = f"outputs_f{feat_level}_{inputs_offsets_str}" - feats.append(self.__getattr__(name)(new_node)) - - num_output_connections.append(0) - - output_feats = [] - for idx in range(num_levels): - for i, fnode in enumerate(reversed(self.nodes)): - if fnode["feat_level"] == idx: - output_feats.append(feats[-1 - i]) - break - else: - raise ValueError() - return output_feats - - -class BiFPN(Backbone): - """ - This module implements Feature Pyramid Network. - It creates pyramid features built on top of some input feature maps. - """ - - def __init__(self, bottom_up, in_features, out_channels, num_top_levels: int, num_repeats: int, norm: str="") -> None: - """ - Args: - bottom_up (Backbone): module representing the bottom up subnetwork. - Must be a subclass of :class:`Backbone`. The multi-scale feature - maps generated by the bottom up network, and listed in `in_features`, - are used to generate FPN levels. - in_features (list[str]): names of the input feature maps coming - from the backbone to which FPN is attached. For example, if the - backbone produces ["res2", "res3", "res4"], any *contiguous* sublist - of these may be used; order must be from high to low resolution. - out_channels (int): number of channels in the output feature maps. - num_top_levels (int): the number of the top levels (p6 or p7). - num_repeats (int): the number of repeats of BiFPN. - norm (str): the normalization to use. - """ - super().__init__() - assert isinstance(bottom_up, Backbone) - - # add extra feature levels (i.e., 6 and 7) - self.bottom_up = BackboneWithTopLevels(bottom_up, out_channels, num_top_levels, norm) - bottom_up_output_shapes = self.bottom_up.output_shape() - - in_features = sorted(in_features, key=lambda x: split_name(x)[1]) - self._size_divisibility = 128 # bottom_up_output_shapes[in_features[-1]].stride - self.out_channels = out_channels - self.min_level = split_name(in_features[0])[1] - - # add the names for top blocks - prefix, last_suffix = split_name(in_features[-1]) - for i in range(num_top_levels): - in_features.append(prefix + str(last_suffix + i + 1)) - self.in_features = in_features - - # generate output features - self._out_features = [f"p{split_name(name)[1]}" for name in in_features] - self._out_feature_strides = { - out_name: bottom_up_output_shapes[in_name].stride - for out_name, in_name in zip(self._out_features, in_features, strict=False) - } - self._out_feature_channels = {k: out_channels for k in self._out_features} - - # build bifpn - self.repeated_bifpn = nn.ModuleList() - for i in range(num_repeats): - if i == 0: - in_channels_list = [bottom_up_output_shapes[name].channels for name in in_features] - else: - in_channels_list = [self._out_feature_channels[name] for name in self._out_features] - self.repeated_bifpn.append(SingleBiFPN(in_channels_list, out_channels, norm)) - - @property - def size_divisibility(self): - return self._size_divisibility - - def forward(self, x): - """ - Args: - input (dict[str->Tensor]): mapping feature map name (e.g., "p5") to - feature map tensor for each feature level in high to low resolution order. - Returns: - dict[str->Tensor]: - mapping from feature map name to FPN feature map tensor - in high to low resolution order. Returned feature names follow the FPN - paper convention: "p", where stage has stride = 2 ** stage e.g., - ["n2", "n3", ..., "n6"]. - """ - bottom_up_features = self.bottom_up(x) - feats = [bottom_up_features[f] for f in self.in_features] - - for bifpn in self.repeated_bifpn: - feats = bifpn(feats) - - return dict(zip(self._out_features, feats, strict=False)) - - -def _assert_strides_are_log2_contiguous(strides: Sequence[int]) -> None: - """ - Assert that each stride is 2x times its preceding stride, i.e. "contiguous in log2". - """ - for i, stride in enumerate(strides[1:], 1): - assert stride == 2 * strides[i - 1], f"Strides {stride} {strides[i - 1]} are not log2 contiguous" - - -@BACKBONE_REGISTRY.register() -def build_fcos_resnet_bifpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = build_resnet_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.BIFPN.OUT_CHANNELS - num_repeats = cfg.MODEL.BIFPN.NUM_BIFPN - top_levels = 2 - - backbone = BiFPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - num_top_levels=top_levels, - num_repeats=num_repeats, - norm=cfg.MODEL.BIFPN.NORM, - ) - return backbone - - -@BACKBONE_REGISTRY.register() -def build_p35_fcos_resnet_bifpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = build_resnet_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.BIFPN.OUT_CHANNELS - num_repeats = cfg.MODEL.BIFPN.NUM_BIFPN - top_levels = 0 - - backbone = BiFPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - num_top_levels=top_levels, - num_repeats=num_repeats, - norm=cfg.MODEL.BIFPN.NORM, - ) - return backbone - - -@BACKBONE_REGISTRY.register() -def build_p35_fcos_dla_bifpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = dla34(cfg) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.BIFPN.OUT_CHANNELS - num_repeats = cfg.MODEL.BIFPN.NUM_BIFPN - top_levels = 0 - - backbone = BiFPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - num_top_levels=top_levels, - num_repeats=num_repeats, - norm=cfg.MODEL.BIFPN.NORM, - ) - return backbone - - -@BACKBONE_REGISTRY.register() -def build_p37_fcos_dla_bifpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = dla34(cfg) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.BIFPN.OUT_CHANNELS - num_repeats = cfg.MODEL.BIFPN.NUM_BIFPN - assert cfg.MODEL.BIFPN.NUM_LEVELS == 5 - top_levels = 2 - - backbone = BiFPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - num_top_levels=top_levels, - num_repeats=num_repeats, - norm=cfg.MODEL.BIFPN.NORM, - ) - return backbone diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dla.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dla.py deleted file mode 100644 index 8b6464153b..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dla.py +++ /dev/null @@ -1,542 +0,0 @@ -import math -from os.path import join - -from detectron2.layers import ( - Conv2d, - DeformConv, - ModulatedDeformConv, - ShapeSpec, - get_norm, -) -from detectron2.modeling.backbone.backbone import Backbone -from detectron2.modeling.backbone.build import BACKBONE_REGISTRY -from detectron2.modeling.backbone.fpn import FPN -from detectron2.modeling.backbone.resnet import BasicStem, BottleneckBlock, DeformBottleneckBlock -import fvcore.nn.weight_init as weight_init -import numpy as np -import torch -from torch import nn -import torch.nn.functional as F -import torch.utils.model_zoo as model_zoo - -__all__ = [ - "BasicStem", - "BottleneckBlock", - "DeformBottleneckBlock", -] - -DCNV1 = False - -HASH = { - 34: "ba72cf86", - 60: "24839fc4", -} - - -def get_model_url(data, name: str, hash): - return join("http://dl.yf.io/dla/models", data, f"{name}-{hash}.pth") - - -class BasicBlock(nn.Module): - def __init__(self, inplanes, planes, stride: int=1, dilation: int=1, norm: str="BN") -> None: - super().__init__() - self.conv1 = nn.Conv2d( - inplanes, - planes, - kernel_size=3, - stride=stride, - padding=dilation, - bias=False, - dilation=dilation, - ) - self.bn1 = get_norm(norm, planes) - self.relu = nn.ReLU(inplace=True) - self.conv2 = nn.Conv2d( - planes, planes, kernel_size=3, stride=1, padding=dilation, bias=False, dilation=dilation - ) - self.bn2 = get_norm(norm, planes) - self.stride = stride - - def forward(self, x, residual=None): - if residual is None: - residual = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - - out += residual - out = self.relu(out) - - return out - - -class Bottleneck(nn.Module): - expansion = 2 - - def __init__(self, inplanes, planes, stride: int=1, dilation: int=1, norm: str="BN") -> None: - super().__init__() - expansion = Bottleneck.expansion - bottle_planes = planes // expansion - self.conv1 = nn.Conv2d(inplanes, bottle_planes, kernel_size=1, bias=False) - self.bn1 = get_norm(norm, bottle_planes) - self.conv2 = nn.Conv2d( - bottle_planes, - bottle_planes, - kernel_size=3, - stride=stride, - padding=dilation, - bias=False, - dilation=dilation, - ) - self.bn2 = get_norm(norm, bottle_planes) - self.conv3 = nn.Conv2d(bottle_planes, planes, kernel_size=1, bias=False) - self.bn3 = get_norm(norm, planes) - self.relu = nn.ReLU(inplace=True) - self.stride = stride - - def forward(self, x, residual=None): - if residual is None: - residual = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - out = self.relu(out) - - out = self.conv3(out) - out = self.bn3(out) - - out += residual - out = self.relu(out) - - return out - - -class Root(nn.Module): - def __init__(self, in_channels, out_channels, kernel_size: int, residual, norm: str="BN") -> None: - super().__init__() - self.conv = nn.Conv2d( - in_channels, out_channels, 1, stride=1, bias=False, padding=(kernel_size - 1) // 2 - ) - self.bn = get_norm(norm, out_channels) - self.relu = nn.ReLU(inplace=True) - self.residual = residual - - def forward(self, *x): - children = x - x = self.conv(torch.cat(x, 1)) - x = self.bn(x) - if self.residual: - x += children[0] - x = self.relu(x) - - return x - - -class Tree(nn.Module): - def __init__( - self, - levels, - block, - in_channels, - out_channels, - stride: int=1, - level_root: bool=False, - root_dim: int=0, - root_kernel_size: int=1, - dilation: int=1, - root_residual: bool=False, - norm: str="BN", - ) -> None: - super().__init__() - if root_dim == 0: - root_dim = 2 * out_channels - if level_root: - root_dim += in_channels - if levels == 1: - self.tree1 = block(in_channels, out_channels, stride, dilation=dilation, norm=norm) - self.tree2 = block(out_channels, out_channels, 1, dilation=dilation, norm=norm) - else: - self.tree1 = Tree( - levels - 1, - block, - in_channels, - out_channels, - stride, - root_dim=0, - root_kernel_size=root_kernel_size, - dilation=dilation, - root_residual=root_residual, - norm=norm, - ) - self.tree2 = Tree( - levels - 1, - block, - out_channels, - out_channels, - root_dim=root_dim + out_channels, - root_kernel_size=root_kernel_size, - dilation=dilation, - root_residual=root_residual, - norm=norm, - ) - if levels == 1: - self.root = Root(root_dim, out_channels, root_kernel_size, root_residual, norm=norm) - self.level_root = level_root - self.root_dim = root_dim - self.downsample = None - self.project = None - self.levels = levels - if stride > 1: - self.downsample = nn.MaxPool2d(stride, stride=stride) - if in_channels != out_channels: - self.project = nn.Sequential( - nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, bias=False), - get_norm(norm, out_channels), - ) - - def forward(self, x, residual=None, children=None): - children = [] if children is None else children - bottom = self.downsample(x) if self.downsample else x - residual = self.project(bottom) if self.project else bottom - if self.level_root: - children.append(bottom) - x1 = self.tree1(x, residual) - if self.levels == 1: - x2 = self.tree2(x1) - x = self.root(x2, x1, *children) - else: - children.append(x1) - x = self.tree2(x1, children=children) - return x - - -class DLA(nn.Module): - def __init__( - self, num_layers: int, levels, channels, block=BasicBlock, residual_root: bool=False, norm: str="BN" - ) -> None: - """ - Args: - """ - super().__init__() - self.norm = norm - self.channels = channels - self.base_layer = nn.Sequential( - nn.Conv2d(3, channels[0], kernel_size=7, stride=1, padding=3, bias=False), - get_norm(self.norm, channels[0]), - nn.ReLU(inplace=True), - ) - self.level0 = self._make_conv_level(channels[0], channels[0], levels[0]) - self.level1 = self._make_conv_level(channels[0], channels[1], levels[1], stride=2) - self.level2 = Tree( - levels[2], - block, - channels[1], - channels[2], - 2, - level_root=False, - root_residual=residual_root, - norm=norm, - ) - self.level3 = Tree( - levels[3], - block, - channels[2], - channels[3], - 2, - level_root=True, - root_residual=residual_root, - norm=norm, - ) - self.level4 = Tree( - levels[4], - block, - channels[3], - channels[4], - 2, - level_root=True, - root_residual=residual_root, - norm=norm, - ) - self.level5 = Tree( - levels[5], - block, - channels[4], - channels[5], - 2, - level_root=True, - root_residual=residual_root, - norm=norm, - ) - self.load_pretrained_model( - data="imagenet", name=f"dla{num_layers}", hash=HASH[num_layers] - ) - - def load_pretrained_model(self, data, name: str, hash) -> None: - model_url = get_model_url(data, name, hash) - model_weights = model_zoo.load_url(model_url) - num_classes = len(model_weights[list(model_weights.keys())[-1]]) - self.fc = nn.Conv2d( - self.channels[-1], num_classes, kernel_size=1, stride=1, padding=0, bias=True - ) - print("Loading pretrained") - self.load_state_dict(model_weights, strict=False) - - def _make_conv_level(self, inplanes, planes, convs, stride: int=1, dilation: int=1): - modules = [] - for i in range(convs): - modules.extend( - [ - nn.Conv2d( - inplanes, - planes, - kernel_size=3, - stride=stride if i == 0 else 1, - padding=dilation, - bias=False, - dilation=dilation, - ), - get_norm(self.norm, planes), - nn.ReLU(inplace=True), - ] - ) - inplanes = planes - return nn.Sequential(*modules) - - def forward(self, x): - y = [] - x = self.base_layer(x) - for i in range(6): - x = getattr(self, f"level{i}")(x) - y.append(x) - return y - - -def fill_up_weights(up) -> None: - w = up.weight.data - f = math.ceil(w.size(2) / 2) - c = (2 * f - 1 - f % 2) / (2.0 * f) - for i in range(w.size(2)): - for j in range(w.size(3)): - w[0, 0, i, j] = (1 - math.fabs(i / f - c)) * (1 - math.fabs(j / f - c)) - for c in range(1, w.size(0)): - w[c, 0, :, :] = w[0, 0, :, :] - - -class _DeformConv(nn.Module): - def __init__(self, chi, cho, norm: str="BN") -> None: - super().__init__() - self.actf = nn.Sequential(get_norm(norm, cho), nn.ReLU(inplace=True)) - if DCNV1: - self.offset = Conv2d(chi, 18, kernel_size=3, stride=1, padding=1, dilation=1) - self.conv = DeformConv( - chi, cho, kernel_size=(3, 3), stride=1, padding=1, dilation=1, deformable_groups=1 - ) - else: - self.offset = Conv2d(chi, 27, kernel_size=3, stride=1, padding=1, dilation=1) - self.conv = ModulatedDeformConv( - chi, cho, kernel_size=3, stride=1, padding=1, dilation=1, deformable_groups=1 - ) - nn.init.constant_(self.offset.weight, 0) - nn.init.constant_(self.offset.bias, 0) - - def forward(self, x): - if DCNV1: - offset = self.offset(x) - x = self.conv(x, offset) - else: - offset_mask = self.offset(x) - offset_x, offset_y, mask = torch.chunk(offset_mask, 3, dim=1) - offset = torch.cat((offset_x, offset_y), dim=1) - mask = mask.sigmoid() - x = self.conv(x, offset, mask) - x = self.actf(x) - return x - - -class IDAUp(nn.Module): - def __init__(self, o, channels, up_f, norm: str="BN") -> None: - super().__init__() - for i in range(1, len(channels)): - c = channels[i] - f = int(up_f[i]) - proj = _DeformConv(c, o, norm=norm) - node = _DeformConv(o, o, norm=norm) - - up = nn.ConvTranspose2d( - o, o, f * 2, stride=f, padding=f // 2, output_padding=0, groups=o, bias=False - ) - fill_up_weights(up) - - setattr(self, "proj_" + str(i), proj) - setattr(self, "up_" + str(i), up) - setattr(self, "node_" + str(i), node) - - def forward(self, layers, startp, endp) -> None: - for i in range(startp + 1, endp): - upsample = getattr(self, "up_" + str(i - startp)) - project = getattr(self, "proj_" + str(i - startp)) - layers[i] = upsample(project(layers[i])) - node = getattr(self, "node_" + str(i - startp)) - layers[i] = node(layers[i] + layers[i - 1]) - - -class DLAUp(nn.Module): - def __init__(self, startp, channels, scales, in_channels=None, norm: str="BN") -> None: - super().__init__() - self.startp = startp - if in_channels is None: - in_channels = channels - self.channels = channels - channels = list(channels) - scales = np.array(scales, dtype=int) - for i in range(len(channels) - 1): - j = -i - 2 - setattr( - self, - f"ida_{i}", - IDAUp(channels[j], in_channels[j:], scales[j:] // scales[j], norm=norm), - ) - scales[j + 1 :] = scales[j] - in_channels[j + 1 :] = [channels[j] for _ in channels[j + 1 :]] - - def forward(self, layers): - out = [layers[-1]] # start with 32 - for i in range(len(layers) - self.startp - 1): - ida = getattr(self, f"ida_{i}") - ida(layers, len(layers) - i - 2, len(layers)) - out.insert(0, layers[-1]) - return out - - -DLA_CONFIGS = { - 34: ([1, 1, 1, 2, 2, 1], [16, 32, 64, 128, 256, 512], BasicBlock), - 60: ([1, 1, 1, 2, 3, 1], [16, 32, 128, 256, 512, 1024], Bottleneck), -} - - -class DLASeg(Backbone): - def __init__(self, num_layers: int, out_features, use_dla_up: bool=True, ms_output: bool=False, norm: str="BN") -> None: - super().__init__() - # depth = 34 - levels, channels, Block = DLA_CONFIGS[num_layers] - self.base = DLA( - num_layers=num_layers, levels=levels, channels=channels, block=Block, norm=norm - ) - down_ratio = 4 - self.first_level = int(np.log2(down_ratio)) - self.ms_output = ms_output - self.last_level = 5 if not self.ms_output else 6 - channels = self.base.channels - scales = [2**i for i in range(len(channels[self.first_level :]))] - self.use_dla_up = use_dla_up - if self.use_dla_up: - self.dla_up = DLAUp(self.first_level, channels[self.first_level :], scales, norm=norm) - out_channel = channels[self.first_level] - if not self.ms_output: # stride 4 DLA - self.ida_up = IDAUp( - out_channel, - channels[self.first_level : self.last_level], - [2**i for i in range(self.last_level - self.first_level)], - norm=norm, - ) - self._out_features = out_features - self._out_feature_channels = {f"dla{i}": channels[i] for i in range(6)} - self._out_feature_strides = {f"dla{i}": 2**i for i in range(6)} - self._size_divisibility = 32 - - @property - def size_divisibility(self): - return self._size_divisibility - - def forward(self, x): - x = self.base(x) - if self.use_dla_up: - x = self.dla_up(x) - if not self.ms_output: # stride 4 dla - y = [] - for i in range(self.last_level - self.first_level): - y.append(x[i].clone()) - self.ida_up(y, 0, len(y)) - ret = {} - for i in range(self.last_level - self.first_level): - out_feature = f"dla{i}" - if out_feature in self._out_features: - ret[out_feature] = y[i] - else: - ret = {} - st = self.first_level if self.use_dla_up else 0 - for i in range(self.last_level - st): - out_feature = f"dla{i + st}" - if out_feature in self._out_features: - ret[out_feature] = x[i] - - return ret - - -@BACKBONE_REGISTRY.register() -def build_dla_backbone(cfg, input_shape): - """ - Create a ResNet instance from config. - - Returns: - ResNet: a :class:`ResNet` instance. - """ - return DLASeg( - out_features=cfg.MODEL.DLA.OUT_FEATURES, - num_layers=cfg.MODEL.DLA.NUM_LAYERS, - use_dla_up=cfg.MODEL.DLA.USE_DLA_UP, - ms_output=cfg.MODEL.DLA.MS_OUTPUT, - norm=cfg.MODEL.DLA.NORM, - ) - - -class LastLevelP6P7(nn.Module): - """ - This module is used in RetinaNet to generate extra layers, P6 and P7 from - C5 feature. - """ - - def __init__(self, in_channels, out_channels) -> None: - super().__init__() - self.num_levels = 2 - self.in_feature = "dla5" - self.p6 = nn.Conv2d(in_channels, out_channels, 3, 2, 1) - self.p7 = nn.Conv2d(out_channels, out_channels, 3, 2, 1) - for module in [self.p6, self.p7]: - weight_init.c2_xavier_fill(module) - - def forward(self, c5): - p6 = self.p6(c5) - p7 = self.p7(F.relu(p6)) - return [p6, p7] - - -@BACKBONE_REGISTRY.register() -def build_retinanet_dla_fpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = build_dla_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - in_channels_p6p7 = bottom_up.output_shape()["dla5"].channels - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=LastLevelP6P7(in_channels_p6p7, out_channels), - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - return backbone diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dlafpn.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dlafpn.py deleted file mode 100644 index 54f05bf719..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dlafpn.py +++ /dev/null @@ -1,563 +0,0 @@ -#!/usr/bin/env python - -# this file is from https://github.com/ucbdrive/dla/blob/master/dla.py. - -import math -from os.path import join - -from detectron2.layers import Conv2d, ModulatedDeformConv, ShapeSpec -from detectron2.layers.batch_norm import get_norm -from detectron2.modeling.backbone import FPN, Backbone -from detectron2.modeling.backbone.build import BACKBONE_REGISTRY -import fvcore.nn.weight_init as weight_init -import numpy as np -import torch -from torch import nn -import torch.nn.functional as F -import torch.utils.model_zoo as model_zoo -from typing import Optional - -WEB_ROOT = "http://dl.yf.io/dla/models" - - -def get_model_url(data, name: str, hash): - return join("http://dl.yf.io/dla/models", data, f"{name}-{hash}.pth") - - -def conv3x3(in_planes, out_planes, stride: int=1): - "3x3 convolution with padding" - return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, padding=1, bias=False) - - -class BasicBlock(nn.Module): - def __init__(self, cfg, inplanes, planes, stride: int=1, dilation: int=1) -> None: - super().__init__() - self.conv1 = nn.Conv2d( - inplanes, - planes, - kernel_size=3, - stride=stride, - padding=dilation, - bias=False, - dilation=dilation, - ) - self.bn1 = get_norm(cfg.MODEL.DLA.NORM, planes) - self.relu = nn.ReLU(inplace=True) - self.conv2 = nn.Conv2d( - planes, planes, kernel_size=3, stride=1, padding=dilation, bias=False, dilation=dilation - ) - self.bn2 = get_norm(cfg.MODEL.DLA.NORM, planes) - self.stride = stride - - def forward(self, x, residual=None): - if residual is None: - residual = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - - out += residual - out = self.relu(out) - - return out - - -class Bottleneck(nn.Module): - expansion = 2 - - def __init__(self, cfg, inplanes, planes, stride: int=1, dilation: int=1) -> None: - super().__init__() - expansion = Bottleneck.expansion - bottle_planes = planes // expansion - self.conv1 = nn.Conv2d(inplanes, bottle_planes, kernel_size=1, bias=False) - self.bn1 = get_norm(cfg.MODEL.DLA.NORM, bottle_planes) - self.conv2 = nn.Conv2d( - bottle_planes, - bottle_planes, - kernel_size=3, - stride=stride, - padding=dilation, - bias=False, - dilation=dilation, - ) - self.bn2 = get_norm(cfg.MODEL.DLA.NORM, bottle_planes) - self.conv3 = nn.Conv2d(bottle_planes, planes, kernel_size=1, bias=False) - self.bn3 = get_norm(cfg.MODEL.DLA.NORM, planes) - self.relu = nn.ReLU(inplace=True) - self.stride = stride - - def forward(self, x, residual=None): - if residual is None: - residual = x - - out = self.conv1(x) - out = self.bn1(out) - out = self.relu(out) - - out = self.conv2(out) - out = self.bn2(out) - out = self.relu(out) - - out = self.conv3(out) - out = self.bn3(out) - - out += residual - out = self.relu(out) - - return out - - -class Root(nn.Module): - def __init__(self, cfg, in_channels, out_channels, kernel_size: int, residual) -> None: - super().__init__() - self.conv = nn.Conv2d( - in_channels, - out_channels, - kernel_size, - stride=1, - bias=False, - padding=(kernel_size - 1) // 2, - ) - self.bn = get_norm(cfg.MODEL.DLA.NORM, out_channels) - self.relu = nn.ReLU(inplace=True) - self.residual = residual - - def forward(self, *x): - children = x - x = self.conv(torch.cat(x, 1)) - x = self.bn(x) - if self.residual: - x += children[0] - x = self.relu(x) - - return x - - -class Tree(nn.Module): - def __init__( - self, - cfg, - levels, - block, - in_channels, - out_channels, - stride: int=1, - level_root: bool=False, - root_dim: int=0, - root_kernel_size: int=1, - dilation: int=1, - root_residual: bool=False, - ) -> None: - super().__init__() - if root_dim == 0: - root_dim = 2 * out_channels - if level_root: - root_dim += in_channels - if levels == 1: - self.tree1 = block(cfg, in_channels, out_channels, stride, dilation=dilation) - self.tree2 = block(cfg, out_channels, out_channels, 1, dilation=dilation) - else: - self.tree1 = Tree( - cfg, - levels - 1, - block, - in_channels, - out_channels, - stride, - root_dim=0, - root_kernel_size=root_kernel_size, - dilation=dilation, - root_residual=root_residual, - ) - self.tree2 = Tree( - cfg, - levels - 1, - block, - out_channels, - out_channels, - root_dim=root_dim + out_channels, - root_kernel_size=root_kernel_size, - dilation=dilation, - root_residual=root_residual, - ) - if levels == 1: - self.root = Root(cfg, root_dim, out_channels, root_kernel_size, root_residual) - self.level_root = level_root - self.root_dim = root_dim - self.downsample = None - self.project = None - self.levels = levels - if stride > 1: - self.downsample = nn.MaxPool2d(stride, stride=stride) - if in_channels != out_channels: - self.project = nn.Sequential( - nn.Conv2d(in_channels, out_channels, kernel_size=1, stride=1, bias=False), - get_norm(cfg.MODEL.DLA.NORM, out_channels), - ) - - def forward(self, x, residual=None, children=None): - if self.training and residual is not None: - x = x + residual.sum() * 0.0 - children = [] if children is None else children - bottom = self.downsample(x) if self.downsample else x - residual = self.project(bottom) if self.project else bottom - if self.level_root: - children.append(bottom) - x1 = self.tree1(x, residual) - if self.levels == 1: - x2 = self.tree2(x1) - x = self.root(x2, x1, *children) - else: - children.append(x1) - x = self.tree2(x1, children=children) - return x - - -class DLA(Backbone): - def __init__(self, cfg, levels, channels, block=BasicBlock, residual_root: bool=False) -> None: - super().__init__() - self.cfg = cfg - self.channels = channels - - self._out_features = [f"dla{i}" for i in range(6)] - self._out_feature_channels = {k: channels[i] for i, k in enumerate(self._out_features)} - self._out_feature_strides = {k: 2**i for i, k in enumerate(self._out_features)} - - self.base_layer = nn.Sequential( - nn.Conv2d(3, channels[0], kernel_size=7, stride=1, padding=3, bias=False), - get_norm(cfg.MODEL.DLA.NORM, channels[0]), - nn.ReLU(inplace=True), - ) - self.level0 = self._make_conv_level(channels[0], channels[0], levels[0]) - self.level1 = self._make_conv_level(channels[0], channels[1], levels[1], stride=2) - self.level2 = Tree( - cfg, - levels[2], - block, - channels[1], - channels[2], - 2, - level_root=False, - root_residual=residual_root, - ) - self.level3 = Tree( - cfg, - levels[3], - block, - channels[2], - channels[3], - 2, - level_root=True, - root_residual=residual_root, - ) - self.level4 = Tree( - cfg, - levels[4], - block, - channels[3], - channels[4], - 2, - level_root=True, - root_residual=residual_root, - ) - self.level5 = Tree( - cfg, - levels[5], - block, - channels[4], - channels[5], - 2, - level_root=True, - root_residual=residual_root, - ) - - for m in self.modules(): - if isinstance(m, nn.Conv2d): - n = m.kernel_size[0] * m.kernel_size[1] * m.out_channels - m.weight.data.normal_(0, math.sqrt(2.0 / n)) - - self.load_pretrained_model(data="imagenet", name="dla34", hash="ba72cf86") - - def load_pretrained_model(self, data, name: str, hash) -> None: - model_url = get_model_url(data, name, hash) - model_weights = model_zoo.load_url(model_url) - del model_weights["fc.weight"] - del model_weights["fc.bias"] - print("Loading pretrained DLA!") - self.load_state_dict(model_weights, strict=True) - - def _make_conv_level(self, inplanes, planes, convs, stride: int=1, dilation: int=1): - modules = [] - for i in range(convs): - modules.extend( - [ - nn.Conv2d( - inplanes, - planes, - kernel_size=3, - stride=stride if i == 0 else 1, - padding=dilation, - bias=False, - dilation=dilation, - ), - get_norm(self.cfg.MODEL.DLA.NORM, planes), - nn.ReLU(inplace=True), - ] - ) - inplanes = planes - return nn.Sequential(*modules) - - def forward(self, x): - y = {} - x = self.base_layer(x) - for i in range(6): - name = f"level{i}" - x = getattr(self, name)(x) - y[f"dla{i}"] = x - return y - - -def fill_up_weights(up) -> None: - w = up.weight.data - f = math.ceil(w.size(2) / 2) - c = (2 * f - 1 - f % 2) / (2.0 * f) - for i in range(w.size(2)): - for j in range(w.size(3)): - w[0, 0, i, j] = (1 - math.fabs(i / f - c)) * (1 - math.fabs(j / f - c)) - for c in range(1, w.size(0)): - w[c, 0, :, :] = w[0, 0, :, :] - - -class Conv(nn.Module): - def __init__(self, chi, cho, norm) -> None: - super().__init__() - self.conv = nn.Sequential( - nn.Conv2d(chi, cho, kernel_size=1, stride=1, bias=False), - get_norm(norm, cho), - nn.ReLU(inplace=True), - ) - - def forward(self, x): - return self.conv(x) - - -class DeformConv(nn.Module): - def __init__(self, chi, cho, norm) -> None: - super().__init__() - self.actf = nn.Sequential(get_norm(norm, cho), nn.ReLU(inplace=True)) - self.offset = Conv2d(chi, 27, kernel_size=3, stride=1, padding=1, dilation=1) - self.conv = ModulatedDeformConv( - chi, cho, kernel_size=3, stride=1, padding=1, dilation=1, deformable_groups=1 - ) - nn.init.constant_(self.offset.weight, 0) - nn.init.constant_(self.offset.bias, 0) - - def forward(self, x): - offset_mask = self.offset(x) - offset_x, offset_y, mask = torch.chunk(offset_mask, 3, dim=1) - offset = torch.cat((offset_x, offset_y), dim=1) - mask = mask.sigmoid() - x = self.conv(x, offset, mask) - x = self.actf(x) - return x - - -class IDAUp(nn.Module): - def __init__(self, o, channels, up_f, norm: str="FrozenBN", node_type=Conv) -> None: - super().__init__() - for i in range(1, len(channels)): - c = channels[i] - f = int(up_f[i]) - proj = node_type(c, o, norm) - node = node_type(o, o, norm) - - up = nn.ConvTranspose2d( - o, o, f * 2, stride=f, padding=f // 2, output_padding=0, groups=o, bias=False - ) - fill_up_weights(up) - - setattr(self, "proj_" + str(i), proj) - setattr(self, "up_" + str(i), up) - setattr(self, "node_" + str(i), node) - - def forward(self, layers, startp, endp) -> None: - for i in range(startp + 1, endp): - upsample = getattr(self, "up_" + str(i - startp)) - project = getattr(self, "proj_" + str(i - startp)) - layers[i] = upsample(project(layers[i])) - node = getattr(self, "node_" + str(i - startp)) - layers[i] = node(layers[i] + layers[i - 1]) - - -DLAUP_NODE_MAP = { - "conv": Conv, - "dcn": DeformConv, -} - - -class DLAUP(Backbone): - def __init__(self, bottom_up, in_features, norm, dlaup_node: str="conv") -> None: - super().__init__() - assert isinstance(bottom_up, Backbone) - self.bottom_up = bottom_up - input_shapes = bottom_up.output_shape() - in_strides = [input_shapes[f].stride for f in in_features] - in_channels = [input_shapes[f].channels for f in in_features] - in_levels = [int(math.log2(input_shapes[f].stride)) for f in in_features] - self.in_features = in_features - out_features = [f"dlaup{l}" for l in in_levels] - self._out_features = out_features - self._out_feature_channels = { - f"dlaup{l}": in_channels[i] for i, l in enumerate(in_levels) - } - self._out_feature_strides = {f"dlaup{l}": 2**l for l in in_levels} - - print("self._out_features", self._out_features) - print("self._out_feature_channels", self._out_feature_channels) - print("self._out_feature_strides", self._out_feature_strides) - self._size_divisibility = 32 - - node_type = DLAUP_NODE_MAP[dlaup_node] - - self.startp = int(math.log2(in_strides[0])) - self.channels = in_channels - channels = list(in_channels) - scales = np.array([2**i for i in range(len(out_features))], dtype=int) - for i in range(len(channels) - 1): - j = -i - 2 - setattr( - self, - f"ida_{i}", - IDAUp( - channels[j], - in_channels[j:], - scales[j:] // scales[j], - norm=norm, - node_type=node_type, - ), - ) - scales[j + 1 :] = scales[j] - in_channels[j + 1 :] = [channels[j] for _ in channels[j + 1 :]] - - @property - def size_divisibility(self): - return self._size_divisibility - - def forward(self, x): - bottom_up_features = self.bottom_up(x) - layers = [bottom_up_features[f] for f in self.in_features] - out = [layers[-1]] # start with 32 - for i in range(len(layers) - 1): - ida = getattr(self, f"ida_{i}") - ida(layers, len(layers) - i - 2, len(layers)) - out.insert(0, layers[-1]) - ret = {} - for k, v in zip(self._out_features, out, strict=False): - ret[k] = v - # import pdb; pdb.set_trace() - return ret - - -def dla34(cfg, pretrained: Optional[bool]=None): # DLA-34 - model = DLA(cfg, [1, 1, 1, 2, 2, 1], [16, 32, 64, 128, 256, 512], block=BasicBlock) - return model - - -class LastLevelP6P7(nn.Module): - """ - This module is used in RetinaNet to generate extra layers, P6 and P7 from - C5 feature. - """ - - def __init__(self, in_channels, out_channels) -> None: - super().__init__() - self.num_levels = 2 - self.in_feature = "dla5" - self.p6 = nn.Conv2d(in_channels, out_channels, 3, 2, 1) - self.p7 = nn.Conv2d(out_channels, out_channels, 3, 2, 1) - for module in [self.p6, self.p7]: - weight_init.c2_xavier_fill(module) - - def forward(self, c5): - p6 = self.p6(c5) - p7 = self.p7(F.relu(p6)) - return [p6, p7] - - -@BACKBONE_REGISTRY.register() -def build_dla_fpn3_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - - depth_to_creator = {"dla34": dla34} - bottom_up = depth_to_creator[f"dla{cfg.MODEL.DLA.NUM_LAYERS}"](cfg) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=None, - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - - return backbone - - -@BACKBONE_REGISTRY.register() -def build_dla_fpn5_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - - depth_to_creator = {"dla34": dla34} - bottom_up = depth_to_creator[f"dla{cfg.MODEL.DLA.NUM_LAYERS}"](cfg) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - in_channels_top = bottom_up.output_shape()["dla5"].channels - - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=LastLevelP6P7(in_channels_top, out_channels), - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - - return backbone - - -@BACKBONE_REGISTRY.register() -def build_dlaup_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - - depth_to_creator = {"dla34": dla34} - bottom_up = depth_to_creator[f"dla{cfg.MODEL.DLA.NUM_LAYERS}"](cfg) - - backbone = DLAUP( - bottom_up=bottom_up, - in_features=cfg.MODEL.DLA.DLAUP_IN_FEATURES, - norm=cfg.MODEL.DLA.NORM, - dlaup_node=cfg.MODEL.DLA.DLAUP_NODE, - ) - - return backbone diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/fpn_p5.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/fpn_p5.py deleted file mode 100644 index 4ce285b6c6..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/fpn_p5.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -from detectron2.layers import ShapeSpec -from detectron2.modeling.backbone.build import BACKBONE_REGISTRY -from detectron2.modeling.backbone.fpn import FPN -from detectron2.modeling.backbone.resnet import build_resnet_backbone -import fvcore.nn.weight_init as weight_init -from torch import nn -import torch.nn.functional as F - - -class LastLevelP6P7_P5(nn.Module): - """ - This module is used in RetinaNet to generate extra layers, P6 and P7 from - C5 feature. - """ - - def __init__(self, in_channels, out_channels) -> None: - super().__init__() - self.num_levels = 2 - self.in_feature = "p5" - self.p6 = nn.Conv2d(in_channels, out_channels, 3, 2, 1) - self.p7 = nn.Conv2d(out_channels, out_channels, 3, 2, 1) - for module in [self.p6, self.p7]: - weight_init.c2_xavier_fill(module) - - def forward(self, c5): - p6 = self.p6(c5) - p7 = self.p7(F.relu(p6)) - return [p6, p7] - - -@BACKBONE_REGISTRY.register() -def build_p67_resnet_fpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = build_resnet_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=LastLevelP6P7_P5(out_channels, out_channels), - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - return backbone - - -@BACKBONE_REGISTRY.register() -def build_p35_resnet_fpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = build_resnet_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=None, - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - return backbone diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/res2net.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/res2net.py deleted file mode 100644 index e04400032e..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/res2net.py +++ /dev/null @@ -1,810 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# This file is modified from https://github.com/Res2Net/Res2Net-detectron2/blob/master/detectron2/modeling/backbone/resnet.py -# The original file is under Apache-2.0 License -from detectron2.layers import ( - CNNBlockBase, - Conv2d, - DeformConv, - ModulatedDeformConv, - ShapeSpec, - get_norm, -) -from detectron2.modeling.backbone import Backbone -from detectron2.modeling.backbone.build import BACKBONE_REGISTRY -from detectron2.modeling.backbone.fpn import FPN -import fvcore.nn.weight_init as weight_init -import numpy as np -import torch -from torch import nn -import torch.nn.functional as F - -from .bifpn import BiFPN -from .fpn_p5 import LastLevelP6P7_P5 -from typing import Optional - -__all__ = [ - "BasicBlock", - "BasicStem", - "BottleneckBlock", - "DeformBottleneckBlock", - "ResNet", - "ResNetBlockBase", - "build_res2net_backbone", - "make_stage", -] - - -ResNetBlockBase = CNNBlockBase -""" -Alias for backward compatibiltiy. -""" - - -class BasicBlock(CNNBlockBase): - """ - The basic residual block for ResNet-18 and ResNet-34, with two 3x3 conv layers - and a projection shortcut if needed. - """ - - def __init__(self, in_channels, out_channels, *, stride: int=1, norm: str="BN") -> None: - """ - Args: - in_channels (int): Number of input channels. - out_channels (int): Number of output channels. - stride (int): Stride for the first conv. - norm (str or callable): normalization for all conv layers. - See :func:`layers.get_norm` for supported format. - """ - super().__init__(in_channels, out_channels, stride) - - if in_channels != out_channels: - self.shortcut = Conv2d( - in_channels, - out_channels, - kernel_size=1, - stride=stride, - bias=False, - norm=get_norm(norm, out_channels), - ) - else: - self.shortcut = None - - self.conv1 = Conv2d( - in_channels, - out_channels, - kernel_size=3, - stride=stride, - padding=1, - bias=False, - norm=get_norm(norm, out_channels), - ) - - self.conv2 = Conv2d( - out_channels, - out_channels, - kernel_size=3, - stride=1, - padding=1, - bias=False, - norm=get_norm(norm, out_channels), - ) - - for layer in [self.conv1, self.conv2, self.shortcut]: - if layer is not None: # shortcut can be None - weight_init.c2_msra_fill(layer) - - def forward(self, x): - out = self.conv1(x) - out = F.relu_(out) - out = self.conv2(out) - - if self.shortcut is not None: - shortcut = self.shortcut(x) - else: - shortcut = x - - out += shortcut - out = F.relu_(out) - return out - - -class BottleneckBlock(CNNBlockBase): - """ - The standard bottle2neck residual block used by Res2Net-50, 101 and 152. - """ - - def __init__( - self, - in_channels, - out_channels, - *, - bottleneck_channels, - stride: int=1, - num_groups: int=1, - norm: str="BN", - stride_in_1x1: bool=False, - dilation: int=1, - basewidth: int=26, - scale: int=4, - ) -> None: - """ - Args: - bottleneck_channels (int): number of output channels for the 3x3 - "bottleneck" conv layers. - num_groups (int): number of groups for the 3x3 conv layer. - norm (str or callable): normalization for all conv layers. - See :func:`layers.get_norm` for supported format. - stride_in_1x1 (bool): when stride>1, whether to put stride in the - first 1x1 convolution or the bottleneck 3x3 convolution. - dilation (int): the dilation rate of the 3x3 conv layer. - """ - super().__init__(in_channels, out_channels, stride) - - if in_channels != out_channels: - self.shortcut = nn.Sequential( - nn.AvgPool2d( - kernel_size=stride, stride=stride, ceil_mode=True, count_include_pad=False - ), - Conv2d( - in_channels, - out_channels, - kernel_size=1, - stride=1, - bias=False, - norm=get_norm(norm, out_channels), - ), - ) - else: - self.shortcut = None - - # The original MSRA ResNet models have stride in the first 1x1 conv - # The subsequent fb.torch.resnet and Caffe2 ResNe[X]t implementations have - # stride in the 3x3 conv - stride_1x1, stride_3x3 = (stride, 1) if stride_in_1x1 else (1, stride) - width = bottleneck_channels // scale - - self.conv1 = Conv2d( - in_channels, - bottleneck_channels, - kernel_size=1, - stride=stride_1x1, - bias=False, - norm=get_norm(norm, bottleneck_channels), - ) - if scale == 1: - self.nums = 1 - else: - self.nums = scale - 1 - if self.in_channels != self.out_channels and stride_3x3 != 2: - self.pool = nn.AvgPool2d(kernel_size=3, stride=stride_3x3, padding=1) - - convs = [] - bns = [] - for _i in range(self.nums): - convs.append( - nn.Conv2d( - width, - width, - kernel_size=3, - stride=stride_3x3, - padding=1 * dilation, - bias=False, - groups=num_groups, - dilation=dilation, - ) - ) - bns.append(get_norm(norm, width)) - self.convs = nn.ModuleList(convs) - self.bns = nn.ModuleList(bns) - - self.conv3 = Conv2d( - bottleneck_channels, - out_channels, - kernel_size=1, - bias=False, - norm=get_norm(norm, out_channels), - ) - self.scale = scale - self.width = width - self.in_channels = in_channels - self.out_channels = out_channels - self.stride_3x3 = stride_3x3 - for layer in [self.conv1, self.conv3]: - if layer is not None: # shortcut can be None - weight_init.c2_msra_fill(layer) - if self.shortcut is not None: - for layer in self.shortcut.modules(): - if isinstance(layer, Conv2d): - weight_init.c2_msra_fill(layer) - - for layer in self.convs: - if layer is not None: # shortcut can be None - weight_init.c2_msra_fill(layer) - - # Zero-initialize the last normalization in each residual branch, - # so that at the beginning, the residual branch starts with zeros, - # and each residual block behaves like an identity. - # See Sec 5.1 in "Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour": - # "For BN layers, the learnable scaling coefficient γ is initialized - # to be 1, except for each residual block's last BN - # where γ is initialized to be 0." - - # nn.init.constant_(self.conv3.norm.weight, 0) - # TODO this somehow hurts performance when training GN models from scratch. - # Add it as an option when we need to use this code to train a backbone. - - def forward(self, x): - out = self.conv1(x) - out = F.relu_(out) - - spx = torch.split(out, self.width, 1) - for i in range(self.nums): - if i == 0 or self.in_channels != self.out_channels: - sp = spx[i] - else: - sp = sp + spx[i] - sp = self.convs[i](sp) - sp = F.relu_(self.bns[i](sp)) - if i == 0: - out = sp - else: - out = torch.cat((out, sp), 1) - if self.scale != 1 and self.stride_3x3 == 1: - out = torch.cat((out, spx[self.nums]), 1) - elif self.scale != 1 and self.stride_3x3 == 2: - out = torch.cat((out, self.pool(spx[self.nums])), 1) - - out = self.conv3(out) - - if self.shortcut is not None: - shortcut = self.shortcut(x) - else: - shortcut = x - - out += shortcut - out = F.relu_(out) - return out - - -class DeformBottleneckBlock(ResNetBlockBase): - """ - Not implemented for res2net yet. - Similar to :class:`BottleneckBlock`, but with deformable conv in the 3x3 convolution. - """ - - def __init__( - self, - in_channels, - out_channels, - *, - bottleneck_channels, - stride: int=1, - num_groups: int=1, - norm: str="BN", - stride_in_1x1: bool=False, - dilation: int=1, - deform_modulated: bool=False, - deform_num_groups: int=1, - basewidth: int=26, - scale: int=4, - ) -> None: - super().__init__(in_channels, out_channels, stride) - self.deform_modulated = deform_modulated - - if in_channels != out_channels: - # self.shortcut = Conv2d( - # in_channels, - # out_channels, - # kernel_size=1, - # stride=stride, - # bias=False, - # norm=get_norm(norm, out_channels), - # ) - self.shortcut = nn.Sequential( - nn.AvgPool2d( - kernel_size=stride, stride=stride, ceil_mode=True, count_include_pad=False - ), - Conv2d( - in_channels, - out_channels, - kernel_size=1, - stride=1, - bias=False, - norm=get_norm(norm, out_channels), - ), - ) - else: - self.shortcut = None - - stride_1x1, stride_3x3 = (stride, 1) if stride_in_1x1 else (1, stride) - width = bottleneck_channels // scale - - self.conv1 = Conv2d( - in_channels, - bottleneck_channels, - kernel_size=1, - stride=stride_1x1, - bias=False, - norm=get_norm(norm, bottleneck_channels), - ) - - if scale == 1: - self.nums = 1 - else: - self.nums = scale - 1 - if self.in_channels != self.out_channels and stride_3x3 != 2: - self.pool = nn.AvgPool2d(kernel_size=3, stride=stride_3x3, padding=1) - - if deform_modulated: - deform_conv_op = ModulatedDeformConv - # offset channels are 2 or 3 (if with modulated) * kernel_size * kernel_size - offset_channels = 27 - else: - deform_conv_op = DeformConv - offset_channels = 18 - - # self.conv2_offset = Conv2d( - # bottleneck_channels, - # offset_channels * deform_num_groups, - # kernel_size=3, - # stride=stride_3x3, - # padding=1 * dilation, - # dilation=dilation, - # ) - # self.conv2 = deform_conv_op( - # bottleneck_channels, - # bottleneck_channels, - # kernel_size=3, - # stride=stride_3x3, - # padding=1 * dilation, - # bias=False, - # groups=num_groups, - # dilation=dilation, - # deformable_groups=deform_num_groups, - # norm=get_norm(norm, bottleneck_channels), - # ) - - conv2_offsets = [] - convs = [] - bns = [] - for _i in range(self.nums): - conv2_offsets.append( - Conv2d( - width, - offset_channels * deform_num_groups, - kernel_size=3, - stride=stride_3x3, - padding=1 * dilation, - bias=False, - groups=num_groups, - dilation=dilation, - ) - ) - convs.append( - deform_conv_op( - width, - width, - kernel_size=3, - stride=stride_3x3, - padding=1 * dilation, - bias=False, - groups=num_groups, - dilation=dilation, - deformable_groups=deform_num_groups, - ) - ) - bns.append(get_norm(norm, width)) - self.conv2_offsets = nn.ModuleList(conv2_offsets) - self.convs = nn.ModuleList(convs) - self.bns = nn.ModuleList(bns) - - self.conv3 = Conv2d( - bottleneck_channels, - out_channels, - kernel_size=1, - bias=False, - norm=get_norm(norm, out_channels), - ) - self.scale = scale - self.width = width - self.in_channels = in_channels - self.out_channels = out_channels - self.stride_3x3 = stride_3x3 - # for layer in [self.conv1, self.conv2, self.conv3, self.shortcut]: - # if layer is not None: # shortcut can be None - # weight_init.c2_msra_fill(layer) - - # nn.init.constant_(self.conv2_offset.weight, 0) - # nn.init.constant_(self.conv2_offset.bias, 0) - for layer in [self.conv1, self.conv3]: - if layer is not None: # shortcut can be None - weight_init.c2_msra_fill(layer) - if self.shortcut is not None: - for layer in self.shortcut.modules(): - if isinstance(layer, Conv2d): - weight_init.c2_msra_fill(layer) - - for layer in self.convs: - if layer is not None: # shortcut can be None - weight_init.c2_msra_fill(layer) - - for layer in self.conv2_offsets: - if layer.weight is not None: - nn.init.constant_(layer.weight, 0) - if layer.bias is not None: - nn.init.constant_(layer.bias, 0) - - def forward(self, x): - out = self.conv1(x) - out = F.relu_(out) - - # if self.deform_modulated: - # offset_mask = self.conv2_offset(out) - # offset_x, offset_y, mask = torch.chunk(offset_mask, 3, dim=1) - # offset = torch.cat((offset_x, offset_y), dim=1) - # mask = mask.sigmoid() - # out = self.conv2(out, offset, mask) - # else: - # offset = self.conv2_offset(out) - # out = self.conv2(out, offset) - # out = F.relu_(out) - - spx = torch.split(out, self.width, 1) - for i in range(self.nums): - if i == 0 or self.in_channels != self.out_channels: - sp = spx[i].contiguous() - else: - sp = sp + spx[i].contiguous() - - # sp = self.convs[i](sp) - if self.deform_modulated: - offset_mask = self.conv2_offsets[i](sp) - offset_x, offset_y, mask = torch.chunk(offset_mask, 3, dim=1) - offset = torch.cat((offset_x, offset_y), dim=1) - mask = mask.sigmoid() - sp = self.convs[i](sp, offset, mask) - else: - offset = self.conv2_offsets[i](sp) - sp = self.convs[i](sp, offset) - sp = F.relu_(self.bns[i](sp)) - if i == 0: - out = sp - else: - out = torch.cat((out, sp), 1) - if self.scale != 1 and self.stride_3x3 == 1: - out = torch.cat((out, spx[self.nums]), 1) - elif self.scale != 1 and self.stride_3x3 == 2: - out = torch.cat((out, self.pool(spx[self.nums])), 1) - - out = self.conv3(out) - - if self.shortcut is not None: - shortcut = self.shortcut(x) - else: - shortcut = x - - out += shortcut - out = F.relu_(out) - return out - - -def make_stage(block_class, num_blocks: int, first_stride, *, in_channels, out_channels, **kwargs): - """ - Create a list of blocks just like those in a ResNet stage. - Args: - block_class (type): a subclass of ResNetBlockBase - num_blocks (int): - first_stride (int): the stride of the first block. The other blocks will have stride=1. - in_channels (int): input channels of the entire stage. - out_channels (int): output channels of **every block** in the stage. - kwargs: other arguments passed to the constructor of every block. - Returns: - list[nn.Module]: a list of block module. - """ - assert "stride" not in kwargs, "Stride of blocks in make_stage cannot be changed." - blocks = [] - for i in range(num_blocks): - blocks.append( - block_class( - in_channels=in_channels, - out_channels=out_channels, - stride=first_stride if i == 0 else 1, - **kwargs, - ) - ) - in_channels = out_channels - return blocks - - -class BasicStem(CNNBlockBase): - """ - The standard ResNet stem (layers before the first residual block). - """ - - def __init__(self, in_channels: int=3, out_channels: int=64, norm: str="BN") -> None: - """ - Args: - norm (str or callable): norm after the first conv layer. - See :func:`layers.get_norm` for supported format. - """ - super().__init__(in_channels, out_channels, 4) - self.in_channels = in_channels - self.conv1 = nn.Sequential( - Conv2d( - in_channels, - 32, - kernel_size=3, - stride=2, - padding=1, - bias=False, - ), - get_norm(norm, 32), - nn.ReLU(inplace=True), - Conv2d( - 32, - 32, - kernel_size=3, - stride=1, - padding=1, - bias=False, - ), - get_norm(norm, 32), - nn.ReLU(inplace=True), - Conv2d( - 32, - out_channels, - kernel_size=3, - stride=1, - padding=1, - bias=False, - ), - ) - self.bn1 = get_norm(norm, out_channels) - - for layer in self.conv1: - if isinstance(layer, Conv2d): - weight_init.c2_msra_fill(layer) - - def forward(self, x): - x = self.conv1(x) - x = self.bn1(x) - x = F.relu_(x) - x = F.max_pool2d(x, kernel_size=3, stride=2, padding=1) - return x - - -class ResNet(Backbone): - def __init__(self, stem, stages, num_classes: Optional[int]=None, out_features=None) -> None: - """ - Args: - stem (nn.Module): a stem module - stages (list[list[CNNBlockBase]]): several (typically 4) stages, - each contains multiple :class:`CNNBlockBase`. - num_classes (None or int): if None, will not perform classification. - Otherwise, will create a linear layer. - out_features (list[str]): name of the layers whose outputs should - be returned in forward. Can be anything in "stem", "linear", or "res2" ... - If None, will return the output of the last layer. - """ - super().__init__() - self.stem = stem - self.num_classes = num_classes - - current_stride = self.stem.stride - self._out_feature_strides = {"stem": current_stride} - self._out_feature_channels = {"stem": self.stem.out_channels} - - self.stages_and_names = [] - for i, blocks in enumerate(stages): - assert len(blocks) > 0, len(blocks) - for block in blocks: - assert isinstance(block, CNNBlockBase), block - - name = "res" + str(i + 2) - stage = nn.Sequential(*blocks) - - self.add_module(name, stage) - self.stages_and_names.append((stage, name)) - - self._out_feature_strides[name] = current_stride = int( - current_stride * np.prod([k.stride for k in blocks]) - ) - self._out_feature_channels[name] = curr_channels = blocks[-1].out_channels - - if num_classes is not None: - self.avgpool = nn.AdaptiveAvgPool2d((1, 1)) - self.linear = nn.Linear(curr_channels, num_classes) - - # Sec 5.1 in "Accurate, Large Minibatch SGD: Training ImageNet in 1 Hour": - # "The 1000-way fully-connected layer is initialized by - # drawing weights from a zero-mean Gaussian with standard deviation of 0.01." - nn.init.normal_(self.linear.weight, std=0.01) - name = "linear" - - if out_features is None: - out_features = [name] - self._out_features = out_features - assert len(self._out_features) - children = [x[0] for x in self.named_children()] - for out_feature in self._out_features: - assert out_feature in children, "Available children: {}".format(", ".join(children)) - - def forward(self, x): - outputs = {} - x = self.stem(x) - if "stem" in self._out_features: - outputs["stem"] = x - for stage, name in self.stages_and_names: - x = stage(x) - if name in self._out_features: - outputs[name] = x - if self.num_classes is not None: - x = self.avgpool(x) - x = torch.flatten(x, 1) - x = self.linear(x) - if "linear" in self._out_features: - outputs["linear"] = x - return outputs - - def output_shape(self): - return { - name: ShapeSpec( - channels=self._out_feature_channels[name], stride=self._out_feature_strides[name] - ) - for name in self._out_features - } - - def freeze(self, freeze_at: int=0): - """ - Freeze the first several stages of the ResNet. Commonly used in - fine-tuning. - Args: - freeze_at (int): number of stem and stages to freeze. - `1` means freezing the stem. `2` means freezing the stem and - the first stage, etc. - Returns: - nn.Module: this ResNet itself - """ - if freeze_at >= 1: - self.stem.freeze() - for idx, (stage, _) in enumerate(self.stages_and_names, start=2): - if freeze_at >= idx: - for block in stage.children(): - block.freeze() - return self - - -@BACKBONE_REGISTRY.register() -def build_res2net_backbone(cfg, input_shape): - """ - Create a Res2Net instance from config. - Returns: - ResNet: a :class:`ResNet` instance. - """ - # need registration of new blocks/stems? - norm = cfg.MODEL.RESNETS.NORM - stem = BasicStem( - in_channels=input_shape.channels, - out_channels=cfg.MODEL.RESNETS.STEM_OUT_CHANNELS, - norm=norm, - ) - - # fmt: off - freeze_at = cfg.MODEL.BACKBONE.FREEZE_AT - out_features = cfg.MODEL.RESNETS.OUT_FEATURES - depth = cfg.MODEL.RESNETS.DEPTH - num_groups = cfg.MODEL.RESNETS.NUM_GROUPS - width_per_group = cfg.MODEL.RESNETS.WIDTH_PER_GROUP - scale = 4 - bottleneck_channels = num_groups * width_per_group * scale - in_channels = cfg.MODEL.RESNETS.STEM_OUT_CHANNELS - out_channels = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS - stride_in_1x1 = cfg.MODEL.RESNETS.STRIDE_IN_1X1 - res5_dilation = cfg.MODEL.RESNETS.RES5_DILATION - deform_on_per_stage = cfg.MODEL.RESNETS.DEFORM_ON_PER_STAGE - deform_modulated = cfg.MODEL.RESNETS.DEFORM_MODULATED - deform_num_groups = cfg.MODEL.RESNETS.DEFORM_NUM_GROUPS - # fmt: on - assert res5_dilation in {1, 2}, f"res5_dilation cannot be {res5_dilation}." - - num_blocks_per_stage = { - 18: [2, 2, 2, 2], - 34: [3, 4, 6, 3], - 50: [3, 4, 6, 3], - 101: [3, 4, 23, 3], - 152: [3, 8, 36, 3], - }[depth] - - if depth in [18, 34]: - assert out_channels == 64, "Must set MODEL.RESNETS.RES2_OUT_CHANNELS = 64 for R18/R34" - assert not any(deform_on_per_stage), ( - "MODEL.RESNETS.DEFORM_ON_PER_STAGE unsupported for R18/R34" - ) - assert res5_dilation == 1, "Must set MODEL.RESNETS.RES5_DILATION = 1 for R18/R34" - assert num_groups == 1, "Must set MODEL.RESNETS.NUM_GROUPS = 1 for R18/R34" - - stages = [] - - # Avoid creating variables without gradients - # It consumes extra memory and may cause allreduce to fail - out_stage_idx = [{"res2": 2, "res3": 3, "res4": 4, "res5": 5}[f] for f in out_features] - max_stage_idx = max(out_stage_idx) - for idx, stage_idx in enumerate(range(2, max_stage_idx + 1)): - dilation = res5_dilation if stage_idx == 5 else 1 - first_stride = 1 if idx == 0 or (stage_idx == 5 and dilation == 2) else 2 - stage_kargs = { - "num_blocks": num_blocks_per_stage[idx], - "first_stride": first_stride, - "in_channels": in_channels, - "out_channels": out_channels, - "norm": norm, - } - # Use BasicBlock for R18 and R34. - if depth in [18, 34]: - stage_kargs["block_class"] = BasicBlock - else: - stage_kargs["bottleneck_channels"] = bottleneck_channels - stage_kargs["stride_in_1x1"] = stride_in_1x1 - stage_kargs["dilation"] = dilation - stage_kargs["num_groups"] = num_groups - stage_kargs["scale"] = scale - - if deform_on_per_stage[idx]: - stage_kargs["block_class"] = DeformBottleneckBlock - stage_kargs["deform_modulated"] = deform_modulated - stage_kargs["deform_num_groups"] = deform_num_groups - else: - stage_kargs["block_class"] = BottleneckBlock - blocks = make_stage(**stage_kargs) - in_channels = out_channels - out_channels *= 2 - bottleneck_channels *= 2 - stages.append(blocks) - return ResNet(stem, stages, out_features=out_features).freeze(freeze_at) - - -@BACKBONE_REGISTRY.register() -def build_p67_res2net_fpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = build_res2net_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - out_channels = cfg.MODEL.FPN.OUT_CHANNELS - backbone = FPN( - bottom_up=bottom_up, - in_features=in_features, - out_channels=out_channels, - norm=cfg.MODEL.FPN.NORM, - top_block=LastLevelP6P7_P5(out_channels, out_channels), - fuse_type=cfg.MODEL.FPN.FUSE_TYPE, - ) - return backbone - - -@BACKBONE_REGISTRY.register() -def build_res2net_bifpn_backbone(cfg, input_shape: ShapeSpec): - """ - Args: - cfg: a detectron2 CfgNode - - Returns: - backbone (Backbone): backbone module, must be a subclass of :class:`Backbone`. - """ - bottom_up = build_res2net_backbone(cfg, input_shape) - in_features = cfg.MODEL.FPN.IN_FEATURES - backbone = BiFPN( - cfg=cfg, - bottom_up=bottom_up, - in_features=in_features, - out_channels=cfg.MODEL.BIFPN.OUT_CHANNELS, - norm=cfg.MODEL.BIFPN.NORM, - num_levels=cfg.MODEL.BIFPN.NUM_LEVELS, - num_bifpn=cfg.MODEL.BIFPN.NUM_BIFPN, - separable_conv=cfg.MODEL.BIFPN.SEPARABLE_CONV, - ) - return backbone diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/debug.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/debug.py deleted file mode 100644 index 63186b05c5..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/debug.py +++ /dev/null @@ -1,341 +0,0 @@ -import cv2 -import numpy as np -import torch -import torch.nn.functional as F -from typing import Sequence - -COLORS = ((np.random.rand(1300, 3) * 0.4 + 0.6) * 255).astype(np.uint8).reshape(1300, 1, 1, 3) - - -def _get_color_image(heatmap): - heatmap = heatmap.reshape(heatmap.shape[0], heatmap.shape[1], heatmap.shape[2], 1) - if heatmap.shape[0] == 1: - color_map = ( - (heatmap * np.ones((1, 1, 1, 3), np.uint8) * 255).max(axis=0).astype(np.uint8) - ) # H, W, 3 - else: - color_map = (heatmap * COLORS[: heatmap.shape[0]]).max(axis=0).astype(np.uint8) # H, W, 3 - - return color_map - - -def _blend_image(image, color_map, a: float=0.7): - color_map = cv2.resize(color_map, (image.shape[1], image.shape[0])) - ret = np.clip(image * (1 - a) + color_map * a, 0, 255).astype(np.uint8) - return ret - - -def _blend_image_heatmaps(image, color_maps, a: float=0.7): - merges = np.zeros((image.shape[0], image.shape[1], 3), np.float32) - for color_map in color_maps: - color_map = cv2.resize(color_map, (image.shape[1], image.shape[0])) - merges = np.maximum(merges, color_map) - ret = np.clip(image * (1 - a) + merges * a, 0, 255).astype(np.uint8) - return ret - - -def _decompose_level(x, shapes_per_level, N): - """ - x: LNHiWi x C - """ - x = x.view(x.shape[0], -1) - ret = [] - st = 0 - for l in range(len(shapes_per_level)): - ret.append([]) - h = shapes_per_level[l][0].int().item() - w = shapes_per_level[l][1].int().item() - for i in range(N): - ret[l].append(x[st + h * w * i : st + h * w * (i + 1)].view(h, w, -1).permute(2, 0, 1)) - st += h * w * N - return ret - - -def _imagelist_to_tensor(images): - images = [x for x in images] - image_sizes = [x.shape[-2:] for x in images] - h = max([size[0] for size in image_sizes]) - w = max([size[1] for size in image_sizes]) - S = 32 - h, w = ((h - 1) // S + 1) * S, ((w - 1) // S + 1) * S - images = [F.pad(x, (0, w - x.shape[2], 0, h - x.shape[1], 0, 0)) for x in images] - images = torch.stack(images) - return images - - -def _ind2il(ind, shapes_per_level, N): - r = ind - l = 0 - S = 0 - while r - S >= N * shapes_per_level[l][0] * shapes_per_level[l][1]: - S += N * shapes_per_level[l][0] * shapes_per_level[l][1] - l += 1 - i = (r - S) // (shapes_per_level[l][0] * shapes_per_level[l][1]) - return i, l - - -def debug_train( - images, - gt_instances, - flattened_hms, - reg_targets, - labels: Sequence[str], - pos_inds, - shapes_per_level, - locations, - strides: Sequence[int], -) -> None: - """ - images: N x 3 x H x W - flattened_hms: LNHiWi x C - shapes_per_level: L x 2 [(H_i, W_i)] - locations: LNHiWi x 2 - """ - reg_inds = torch.nonzero(reg_targets.max(dim=1)[0] > 0).squeeze(1) - N = len(images) - images = _imagelist_to_tensor(images) - repeated_locations = [torch.cat([loc] * N, dim=0) for loc in locations] - locations = torch.cat(repeated_locations, dim=0) - gt_hms = _decompose_level(flattened_hms, shapes_per_level, N) - masks = flattened_hms.new_zeros((flattened_hms.shape[0], 1)) - masks[pos_inds] = 1 - masks = _decompose_level(masks, shapes_per_level, N) - for i in range(len(images)): - image = images[i].detach().cpu().numpy().transpose(1, 2, 0) - color_maps = [] - for l in range(len(gt_hms)): - color_map = _get_color_image(gt_hms[l][i].detach().cpu().numpy()) - color_maps.append(color_map) - cv2.imshow(f"gthm_{l}", color_map) - blend = _blend_image_heatmaps(image.copy(), color_maps) - if gt_instances is not None: - bboxes = gt_instances[i].gt_boxes.tensor - for j in range(len(bboxes)): - bbox = bboxes[j] - cv2.rectangle( - blend, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - (0, 0, 255), - 3, - cv2.LINE_AA, - ) - - for j in range(len(pos_inds)): - image_id, l = _ind2il(pos_inds[j], shapes_per_level, N) - if image_id != i: - continue - loc = locations[pos_inds[j]] - cv2.drawMarker( - blend, (int(loc[0]), int(loc[1])), (0, 255, 255), markerSize=(l + 1) * 16 - ) - - for j in range(len(reg_inds)): - image_id, l = _ind2il(reg_inds[j], shapes_per_level, N) - if image_id != i: - continue - ltrb = reg_targets[reg_inds[j]] - ltrb *= strides[l] - loc = locations[reg_inds[j]] - bbox = [(loc[0] - ltrb[0]), (loc[1] - ltrb[1]), (loc[0] + ltrb[2]), (loc[1] + ltrb[3])] - cv2.rectangle( - blend, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - (255, 0, 0), - 1, - cv2.LINE_AA, - ) - cv2.circle(blend, (int(loc[0]), int(loc[1])), 2, (255, 0, 0), -1) - - cv2.imshow("blend", blend) - cv2.waitKey() - - -def debug_test( - images, - logits_pred, - reg_pred, - agn_hm_pred=None, - preds=None, - vis_thresh: float=0.3, - debug_show_name: bool=False, - mult_agn: bool=False, -) -> None: - """ - images: N x 3 x H x W - class_target: LNHiWi x C - cat_agn_heatmap: LNHiWi - shapes_per_level: L x 2 [(H_i, W_i)] - """ - if preds is None: - preds = [] - if agn_hm_pred is None: - agn_hm_pred = [] - len(images) - for i in range(len(images)): - image = images[i].detach().cpu().numpy().transpose(1, 2, 0) - image.copy().astype(np.uint8) - pred_image = image.copy().astype(np.uint8) - color_maps = [] - L = len(logits_pred) - for l in range(L): - if logits_pred[0] is not None: - stride = min(image.shape[0], image.shape[1]) / min( - logits_pred[l][i].shape[1], logits_pred[l][i].shape[2] - ) - else: - stride = min(image.shape[0], image.shape[1]) / min( - agn_hm_pred[l][i].shape[1], agn_hm_pred[l][i].shape[2] - ) - stride = stride if stride < 60 else 64 if stride < 100 else 128 - if logits_pred[0] is not None: - if mult_agn: - logits_pred[l][i] = logits_pred[l][i] * agn_hm_pred[l][i] - color_map = _get_color_image(logits_pred[l][i].detach().cpu().numpy()) - color_maps.append(color_map) - cv2.imshow(f"predhm_{l}", color_map) - - if debug_show_name: - from detectron2.data.datasets.lvis_v1_categories import LVIS_CATEGORIES - - cat2name = [x["name"] for x in LVIS_CATEGORIES] - for j in range(len(preds[i].scores) if preds is not None else 0): - if preds[i].scores[j] > vis_thresh: - bbox = ( - preds[i].proposal_boxes[j] - if preds[i].has("proposal_boxes") - else preds[i].pred_boxes[j] - ) - bbox = bbox.tensor[0].detach().cpu().numpy().astype(np.int32) - cat = int(preds[i].pred_classes[j]) if preds[i].has("pred_classes") else 0 - cl = COLORS[cat, 0, 0] - cv2.rectangle( - pred_image, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - (int(cl[0]), int(cl[1]), int(cl[2])), - 2, - cv2.LINE_AA, - ) - if debug_show_name: - txt = "{}{:.1f}".format( - cat2name[cat] if cat > 0 else "", preds[i].scores[j] - ) - font = cv2.FONT_HERSHEY_SIMPLEX - cat_size = cv2.getTextSize(txt, font, 0.5, 2)[0] - cv2.rectangle( - pred_image, - (int(bbox[0]), int(bbox[1] - cat_size[1] - 2)), - (int(bbox[0] + cat_size[0]), int(bbox[1] - 2)), - (int(cl[0]), int(cl[1]), int(cl[2])), - -1, - ) - cv2.putText( - pred_image, - txt, - (int(bbox[0]), int(bbox[1] - 2)), - font, - 0.5, - (0, 0, 0), - thickness=1, - lineType=cv2.LINE_AA, - ) - - if agn_hm_pred[l] is not None: - agn_hm_ = agn_hm_pred[l][i, 0, :, :, None].detach().cpu().numpy() - agn_hm_ = (agn_hm_ * np.array([255, 255, 255]).reshape(1, 1, 3)).astype(np.uint8) - cv2.imshow(f"agn_hm_{l}", agn_hm_) - blend = _blend_image_heatmaps(image.copy(), color_maps) - cv2.imshow("blend", blend) - cv2.imshow("preds", pred_image) - cv2.waitKey() - - -global cnt -cnt = 0 - - -def debug_second_stage( - images, instances, proposals=None, vis_thresh: float=0.3, save_debug: bool=False, debug_show_name: bool=False -) -> None: - images = _imagelist_to_tensor(images) - if debug_show_name: - from detectron2.data.datasets.lvis_v1_categories import LVIS_CATEGORIES - - cat2name = [x["name"] for x in LVIS_CATEGORIES] - for i in range(len(images)): - image = images[i].detach().cpu().numpy().transpose(1, 2, 0).astype(np.uint8).copy() - if instances[i].has("gt_boxes"): - bboxes = instances[i].gt_boxes.tensor.cpu().numpy() - scores = np.ones(bboxes.shape[0]) - cats = instances[i].gt_classes.cpu().numpy() - else: - bboxes = instances[i].pred_boxes.tensor.cpu().numpy() - scores = instances[i].scores.cpu().numpy() - cats = instances[i].pred_classes.cpu().numpy() - for j in range(len(bboxes)): - if scores[j] > vis_thresh: - bbox = bboxes[j] - cl = COLORS[cats[j], 0, 0] - cl = (int(cl[0]), int(cl[1]), int(cl[2])) - cv2.rectangle( - image, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - cl, - 2, - cv2.LINE_AA, - ) - if debug_show_name: - cat = cats[j] - txt = "{}{:.1f}".format(cat2name[cat] if cat > 0 else "", scores[j]) - font = cv2.FONT_HERSHEY_SIMPLEX - cat_size = cv2.getTextSize(txt, font, 0.5, 2)[0] - cv2.rectangle( - image, - (int(bbox[0]), int(bbox[1] - cat_size[1] - 2)), - (int(bbox[0] + cat_size[0]), int(bbox[1] - 2)), - (int(cl[0]), int(cl[1]), int(cl[2])), - -1, - ) - cv2.putText( - image, - txt, - (int(bbox[0]), int(bbox[1] - 2)), - font, - 0.5, - (0, 0, 0), - thickness=1, - lineType=cv2.LINE_AA, - ) - if proposals is not None: - proposal_image = ( - images[i].detach().cpu().numpy().transpose(1, 2, 0).astype(np.uint8).copy() - ) - bboxes = proposals[i].proposal_boxes.tensor.cpu().numpy() - if proposals[i].has("scores"): - scores = proposals[i].scores.cpu().numpy() - else: - scores = proposals[i].objectness_logits.sigmoid().cpu().numpy() - for j in range(len(bboxes)): - if scores[j] > vis_thresh: - bbox = bboxes[j] - cl = (209, 159, 83) - cv2.rectangle( - proposal_image, - (int(bbox[0]), int(bbox[1])), - (int(bbox[2]), int(bbox[3])), - cl, - 2, - cv2.LINE_AA, - ) - - cv2.imshow("image", image) - if proposals is not None: - cv2.imshow("proposals", proposal_image) - if save_debug: - global cnt - cnt += 1 - cv2.imwrite(f"output/save_debug/{cnt}.jpg", proposal_image) - cv2.waitKey() diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/centernet.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/centernet.py deleted file mode 100644 index cd68ed3f40..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/centernet.py +++ /dev/null @@ -1,912 +0,0 @@ -from detectron2.config import configurable -from detectron2.layers import cat -from detectron2.modeling.proposal_generator.build import PROPOSAL_GENERATOR_REGISTRY -from detectron2.structures import Boxes, Instances -from detectron2.utils.comm import get_world_size -import torch -from torch import nn - -from ..debug import debug_test, debug_train -from ..layers.heatmap_focal_loss import binary_heatmap_focal_loss_jit, heatmap_focal_loss_jit -from ..layers.iou_loss import IOULoss -from ..layers.ml_nms import ml_nms -from .centernet_head import CenterNetHead -from .utils import _transpose, reduce_sum -from typing import Sequence - -__all__ = ["CenterNet"] - -INF = 100000000 - - -@PROPOSAL_GENERATOR_REGISTRY.register() -class CenterNet(nn.Module): - @configurable - def __init__( - self, - # input_shape: Dict[str, ShapeSpec], - in_channels: int=256, - *, - num_classes: int=80, - in_features=("p3", "p4", "p5", "p6", "p7"), - strides: Sequence[int]=(8, 16, 32, 64, 128), - score_thresh: float=0.05, - hm_min_overlap: float=0.8, - loc_loss_type: str="giou", - min_radius: int=4, - hm_focal_alpha: float=0.25, - hm_focal_beta: int=4, - loss_gamma: float=2.0, - reg_weight: float=2.0, - not_norm_reg: bool=True, - with_agn_hm: bool=False, - only_proposal: bool=False, - as_proposal: bool=False, - not_nms: bool=False, - pos_weight: float=1.0, - neg_weight: float=1.0, - sigmoid_clamp: float=1e-4, - ignore_high_fp=-1.0, - center_nms: bool=False, - sizes_of_interest=None, - more_pos: bool=False, - more_pos_thresh: float=0.2, - more_pos_topk: int=9, - pre_nms_topk_train: int=1000, - pre_nms_topk_test: int=1000, - post_nms_topk_train: int=100, - post_nms_topk_test: int=100, - nms_thresh_train: float=0.6, - nms_thresh_test: float=0.6, - no_reduce: bool=False, - not_clamp_box: bool=False, - debug: bool=False, - vis_thresh: float=0.5, - pixel_mean=None, - pixel_std=None, - device: str="cuda", - centernet_head=None, - ) -> None: - if pixel_std is None: - pixel_std = [1.0, 1.0, 1.0] - if pixel_mean is None: - pixel_mean = [103.53, 116.28, 123.675] - if sizes_of_interest is None: - sizes_of_interest = [[0, 80], [64, 160], [128, 320], [256, 640], [512, 10000000]] - super().__init__() - self.num_classes = num_classes - self.in_features = in_features - self.strides = strides - self.score_thresh = score_thresh - self.min_radius = min_radius - self.hm_focal_alpha = hm_focal_alpha - self.hm_focal_beta = hm_focal_beta - self.loss_gamma = loss_gamma - self.reg_weight = reg_weight - self.not_norm_reg = not_norm_reg - self.with_agn_hm = with_agn_hm - self.only_proposal = only_proposal - self.as_proposal = as_proposal - self.not_nms = not_nms - self.pos_weight = pos_weight - self.neg_weight = neg_weight - self.sigmoid_clamp = sigmoid_clamp - self.ignore_high_fp = ignore_high_fp - self.center_nms = center_nms - self.sizes_of_interest = sizes_of_interest - self.more_pos = more_pos - self.more_pos_thresh = more_pos_thresh - self.more_pos_topk = more_pos_topk - self.pre_nms_topk_train = pre_nms_topk_train - self.pre_nms_topk_test = pre_nms_topk_test - self.post_nms_topk_train = post_nms_topk_train - self.post_nms_topk_test = post_nms_topk_test - self.nms_thresh_train = nms_thresh_train - self.nms_thresh_test = nms_thresh_test - self.no_reduce = no_reduce - self.not_clamp_box = not_clamp_box - - self.debug = debug - self.vis_thresh = vis_thresh - if self.center_nms: - self.not_nms = True - self.iou_loss = IOULoss(loc_loss_type) - assert (not self.only_proposal) or self.with_agn_hm - # delta for rendering heatmap - self.delta = (1 - hm_min_overlap) / (1 + hm_min_overlap) - if centernet_head is None: - self.centernet_head = CenterNetHead( - in_channels=in_channels, - num_levels=len(in_features), - with_agn_hm=with_agn_hm, - only_proposal=only_proposal, - ) - else: - self.centernet_head = centernet_head - if self.debug: - pixel_mean = torch.Tensor(pixel_mean).to(torch.device(device)).view(3, 1, 1) - pixel_std = torch.Tensor(pixel_std).to(torch.device(device)).view(3, 1, 1) - self.denormalizer = lambda x: x * pixel_std + pixel_mean - - @classmethod - def from_config(cls, cfg, input_shape): - ret = { - # 'input_shape': input_shape, - "in_channels": input_shape[cfg.MODEL.CENTERNET.IN_FEATURES[0]].channels, - "num_classes": cfg.MODEL.CENTERNET.NUM_CLASSES, - "in_features": cfg.MODEL.CENTERNET.IN_FEATURES, - "strides": cfg.MODEL.CENTERNET.FPN_STRIDES, - "score_thresh": cfg.MODEL.CENTERNET.INFERENCE_TH, - "loc_loss_type": cfg.MODEL.CENTERNET.LOC_LOSS_TYPE, - "hm_min_overlap": cfg.MODEL.CENTERNET.HM_MIN_OVERLAP, - "min_radius": cfg.MODEL.CENTERNET.MIN_RADIUS, - "hm_focal_alpha": cfg.MODEL.CENTERNET.HM_FOCAL_ALPHA, - "hm_focal_beta": cfg.MODEL.CENTERNET.HM_FOCAL_BETA, - "loss_gamma": cfg.MODEL.CENTERNET.LOSS_GAMMA, - "reg_weight": cfg.MODEL.CENTERNET.REG_WEIGHT, - "not_norm_reg": cfg.MODEL.CENTERNET.NOT_NORM_REG, - "with_agn_hm": cfg.MODEL.CENTERNET.WITH_AGN_HM, - "only_proposal": cfg.MODEL.CENTERNET.ONLY_PROPOSAL, - "as_proposal": cfg.MODEL.CENTERNET.AS_PROPOSAL, - "not_nms": cfg.MODEL.CENTERNET.NOT_NMS, - "pos_weight": cfg.MODEL.CENTERNET.POS_WEIGHT, - "neg_weight": cfg.MODEL.CENTERNET.NEG_WEIGHT, - "sigmoid_clamp": cfg.MODEL.CENTERNET.SIGMOID_CLAMP, - "ignore_high_fp": cfg.MODEL.CENTERNET.IGNORE_HIGH_FP, - "center_nms": cfg.MODEL.CENTERNET.CENTER_NMS, - "sizes_of_interest": cfg.MODEL.CENTERNET.SOI, - "more_pos": cfg.MODEL.CENTERNET.MORE_POS, - "more_pos_thresh": cfg.MODEL.CENTERNET.MORE_POS_THRESH, - "more_pos_topk": cfg.MODEL.CENTERNET.MORE_POS_TOPK, - "pre_nms_topk_train": cfg.MODEL.CENTERNET.PRE_NMS_TOPK_TRAIN, - "pre_nms_topk_test": cfg.MODEL.CENTERNET.PRE_NMS_TOPK_TEST, - "post_nms_topk_train": cfg.MODEL.CENTERNET.POST_NMS_TOPK_TRAIN, - "post_nms_topk_test": cfg.MODEL.CENTERNET.POST_NMS_TOPK_TEST, - "nms_thresh_train": cfg.MODEL.CENTERNET.NMS_TH_TRAIN, - "nms_thresh_test": cfg.MODEL.CENTERNET.NMS_TH_TEST, - "no_reduce": cfg.MODEL.CENTERNET.NO_REDUCE, - "not_clamp_box": cfg.INPUT.NOT_CLAMP_BOX, - "debug": cfg.DEBUG, - "vis_thresh": cfg.VIS_THRESH, - "pixel_mean": cfg.MODEL.PIXEL_MEAN, - "pixel_std": cfg.MODEL.PIXEL_STD, - "device": cfg.MODEL.DEVICE, - "centernet_head": CenterNetHead( - cfg, [input_shape[f] for f in cfg.MODEL.CENTERNET.IN_FEATURES] - ), - } - return ret - - def forward(self, images, features_dict, gt_instances): - features = [features_dict[f] for f in self.in_features] - clss_per_level, reg_pred_per_level, agn_hm_pred_per_level = self.centernet_head(features) - grids = self.compute_grids(features) - shapes_per_level = grids[0].new_tensor( - [(x.shape[2], x.shape[3]) for x in reg_pred_per_level] - ) - - if not self.training: - return self.inference( - images, clss_per_level, reg_pred_per_level, agn_hm_pred_per_level, grids - ) - else: - pos_inds, labels, reg_targets, flattened_hms = self._get_ground_truth( - grids, shapes_per_level, gt_instances - ) - # logits_pred: M x F, reg_pred: M x 4, agn_hm_pred: M - logits_pred, reg_pred, agn_hm_pred = self._flatten_outputs( - clss_per_level, reg_pred_per_level, agn_hm_pred_per_level - ) - - if self.more_pos: - # add more pixels as positive if \ - # 1. they are within the center3x3 region of an object - # 2. their regression losses are small (= 0).squeeze(1) - reg_pred = reg_pred[reg_inds] - reg_targets_pos = reg_targets[reg_inds] - reg_weight_map = flattened_hms.max(dim=1)[0] - reg_weight_map = reg_weight_map[reg_inds] - reg_weight_map = reg_weight_map * 0 + 1 if self.not_norm_reg else reg_weight_map - if self.no_reduce: - reg_norm = max(reg_weight_map.sum(), 1) - else: - reg_norm = max(reduce_sum(reg_weight_map.sum()).item() / num_gpus, 1) - - reg_loss = ( - self.reg_weight - * self.iou_loss(reg_pred, reg_targets_pos, reg_weight_map, reduction="sum") - / reg_norm - ) - losses["loss_centernet_loc"] = reg_loss - - if self.with_agn_hm: - cat_agn_heatmap = flattened_hms.max(dim=1)[0] # M - agn_pos_loss, agn_neg_loss = binary_heatmap_focal_loss_jit( - agn_hm_pred.float(), - cat_agn_heatmap.float(), - pos_inds, - alpha=self.hm_focal_alpha, - beta=self.hm_focal_beta, - gamma=self.loss_gamma, - sigmoid_clamp=self.sigmoid_clamp, - ignore_high_fp=self.ignore_high_fp, - ) - agn_pos_loss = self.pos_weight * agn_pos_loss / num_pos_avg - agn_neg_loss = self.neg_weight * agn_neg_loss / num_pos_avg - losses["loss_centernet_agn_pos"] = agn_pos_loss - losses["loss_centernet_agn_neg"] = agn_neg_loss - - if self.debug: - print("losses", losses) - print("total_num_pos", total_num_pos) - return losses - - def compute_grids(self, features): - grids = [] - for level, feature in enumerate(features): - h, w = feature.size()[-2:] - shifts_x = torch.arange( - 0, - w * self.strides[level], - step=self.strides[level], - dtype=torch.float32, - device=feature.device, - ) - shifts_y = torch.arange( - 0, - h * self.strides[level], - step=self.strides[level], - dtype=torch.float32, - device=feature.device, - ) - shift_y, shift_x = torch.meshgrid(shifts_y, shifts_x) - shift_x = shift_x.reshape(-1) - shift_y = shift_y.reshape(-1) - grids_per_level = torch.stack((shift_x, shift_y), dim=1) + self.strides[level] // 2 - grids.append(grids_per_level) - return grids - - def _get_ground_truth(self, grids, shapes_per_level, gt_instances): - """ - Input: - grids: list of tensors [(hl x wl, 2)]_l - shapes_per_level: list of tuples L x 2: - gt_instances: gt instances - Retuen: - pos_inds: N - labels: N - reg_targets: M x 4 - flattened_hms: M x C or M x 1 - N: number of objects in all images - M: number of pixels from all FPN levels - """ - - # get positive pixel index - if not self.more_pos: - pos_inds, labels = self._get_label_inds(gt_instances, shapes_per_level) - else: - pos_inds, labels = None, None - heatmap_channels = self.num_classes - L = len(grids) - num_loc_list = [len(loc) for loc in grids] - strides = torch.cat( - [shapes_per_level.new_ones(num_loc_list[l]) * self.strides[l] for l in range(L)] - ).float() # M - reg_size_ranges = torch.cat( - [ - shapes_per_level.new_tensor(self.sizes_of_interest[l]) - .float() - .view(1, 2) - .expand(num_loc_list[l], 2) - for l in range(L) - ] - ) # M x 2 - grids = torch.cat(grids, dim=0) # M x 2 - M = grids.shape[0] - - reg_targets = [] - flattened_hms = [] - for i in range(len(gt_instances)): # images - boxes = gt_instances[i].gt_boxes.tensor # N x 4 - area = gt_instances[i].gt_boxes.area() # N - gt_classes = gt_instances[i].gt_classes # N in [0, self.num_classes] - - N = boxes.shape[0] - if N == 0: - reg_targets.append(grids.new_zeros((M, 4)) - INF) - flattened_hms.append( - grids.new_zeros((M, 1 if self.only_proposal else heatmap_channels)) - ) - continue - - l = grids[:, 0].view(M, 1) - boxes[:, 0].view(1, N) # M x N - t = grids[:, 1].view(M, 1) - boxes[:, 1].view(1, N) # M x N - r = boxes[:, 2].view(1, N) - grids[:, 0].view(M, 1) # M x N - b = boxes[:, 3].view(1, N) - grids[:, 1].view(M, 1) # M x N - reg_target = torch.stack([l, t, r, b], dim=2) # M x N x 4 - - centers = (boxes[:, [0, 1]] + boxes[:, [2, 3]]) / 2 # N x 2 - centers_expanded = centers.view(1, N, 2).expand(M, N, 2) # M x N x 2 - strides_expanded = strides.view(M, 1, 1).expand(M, N, 2) - centers_discret = ( - (centers_expanded / strides_expanded).int() * strides_expanded - ).float() + strides_expanded / 2 # M x N x 2 - - is_peak = ((grids.view(M, 1, 2).expand(M, N, 2) - centers_discret) ** 2).sum( - dim=2 - ) == 0 # M x N - is_in_boxes = reg_target.min(dim=2)[0] > 0 # M x N - is_center3x3 = self.get_center3x3(grids, centers, strides) & is_in_boxes # M x N - is_cared_in_the_level = self.assign_reg_fpn(reg_target, reg_size_ranges) # M x N - reg_mask = is_center3x3 & is_cared_in_the_level # M x N - - dist2 = ((grids.view(M, 1, 2).expand(M, N, 2) - centers_expanded) ** 2).sum( - dim=2 - ) # M x N - dist2[is_peak] = 0 - radius2 = self.delta**2 * 2 * area # N - radius2 = torch.clamp(radius2, min=self.min_radius**2) - weighted_dist2 = dist2 / radius2.view(1, N).expand(M, N) # M x N - reg_target = self._get_reg_targets( - reg_target, weighted_dist2.clone(), reg_mask, area - ) # M x 4 - - if self.only_proposal: - flattened_hm = self._create_agn_heatmaps_from_dist(weighted_dist2.clone()) # M x 1 - else: - flattened_hm = self._create_heatmaps_from_dist( - weighted_dist2.clone(), gt_classes, channels=heatmap_channels - ) # M x C - - reg_targets.append(reg_target) - flattened_hms.append(flattened_hm) - - # transpose im first training_targets to level first ones - reg_targets = _transpose(reg_targets, num_loc_list) - flattened_hms = _transpose(flattened_hms, num_loc_list) - for l in range(len(reg_targets)): - reg_targets[l] = reg_targets[l] / float(self.strides[l]) - reg_targets = cat([x for x in reg_targets], dim=0) # MB x 4 - flattened_hms = cat([x for x in flattened_hms], dim=0) # MB x C - - return pos_inds, labels, reg_targets, flattened_hms - - def _get_label_inds(self, gt_instances, shapes_per_level): - """ - Inputs: - gt_instances: [n_i], sum n_i = N - shapes_per_level: L x 2 [(h_l, w_l)]_L - Returns: - pos_inds: N' - labels: N' - """ - pos_inds = [] - labels = [] - L = len(self.strides) - B = len(gt_instances) - shapes_per_level = shapes_per_level.long() - loc_per_level = (shapes_per_level[:, 0] * shapes_per_level[:, 1]).long() # L - level_bases = [] - s = 0 - for l in range(L): - level_bases.append(s) - s = s + B * loc_per_level[l] - level_bases = shapes_per_level.new_tensor(level_bases).long() # L - strides_default = shapes_per_level.new_tensor(self.strides).float() # L - for im_i in range(B): - targets_per_im = gt_instances[im_i] - bboxes = targets_per_im.gt_boxes.tensor # n x 4 - n = bboxes.shape[0] - centers = (bboxes[:, [0, 1]] + bboxes[:, [2, 3]]) / 2 # n x 2 - centers = centers.view(n, 1, 2).expand(n, L, 2).contiguous() - if self.not_clamp_box: - h, w = gt_instances[im_i]._image_size - centers[:, :, 0].clamp_(min=0).clamp_(max=w - 1) - centers[:, :, 1].clamp_(min=0).clamp_(max=h - 1) - strides = strides_default.view(1, L, 1).expand(n, L, 2) - centers_inds = (centers / strides).long() # n x L x 2 - Ws = shapes_per_level[:, 1].view(1, L).expand(n, L) - pos_ind = ( - level_bases.view(1, L).expand(n, L) - + im_i * loc_per_level.view(1, L).expand(n, L) - + centers_inds[:, :, 1] * Ws - + centers_inds[:, :, 0] - ) # n x L - is_cared_in_the_level = self.assign_fpn_level(bboxes) - pos_ind = pos_ind[is_cared_in_the_level].view(-1) - label = ( - targets_per_im.gt_classes.view(n, 1).expand(n, L)[is_cared_in_the_level].view(-1) - ) - - pos_inds.append(pos_ind) # n' - labels.append(label) # n' - pos_inds = torch.cat(pos_inds, dim=0).long() - labels = torch.cat(labels, dim=0) - return pos_inds, labels # N, N - - def assign_fpn_level(self, boxes): - """ - Inputs: - boxes: n x 4 - size_ranges: L x 2 - Return: - is_cared_in_the_level: n x L - """ - size_ranges = boxes.new_tensor(self.sizes_of_interest).view( - len(self.sizes_of_interest), 2 - ) # L x 2 - crit = ((boxes[:, 2:] - boxes[:, :2]) ** 2).sum(dim=1) ** 0.5 / 2 # n - n, L = crit.shape[0], size_ranges.shape[0] - crit = crit.view(n, 1).expand(n, L) - size_ranges_expand = size_ranges.view(1, L, 2).expand(n, L, 2) - is_cared_in_the_level = (crit >= size_ranges_expand[:, :, 0]) & ( - crit <= size_ranges_expand[:, :, 1] - ) - return is_cared_in_the_level - - def assign_reg_fpn(self, reg_targets_per_im, size_ranges): - """ - TODO (Xingyi): merge it with assign_fpn_level - Inputs: - reg_targets_per_im: M x N x 4 - size_ranges: M x 2 - """ - crit = ((reg_targets_per_im[:, :, :2] + reg_targets_per_im[:, :, 2:]) ** 2).sum( - dim=2 - ) ** 0.5 / 2 # M x N - is_cared_in_the_level = (crit >= size_ranges[:, [0]]) & (crit <= size_ranges[:, [1]]) - return is_cared_in_the_level - - def _get_reg_targets(self, reg_targets, dist, mask, area): - """ - reg_targets (M x N x 4): long tensor - dist (M x N) - is_*: M x N - """ - dist[mask == 0] = INF * 1.0 - min_dist, min_inds = dist.min(dim=1) # M - reg_targets_per_im = reg_targets[range(len(reg_targets)), min_inds] # M x N x 4 --> M x 4 - reg_targets_per_im[min_dist == INF] = -INF - return reg_targets_per_im - - def _create_heatmaps_from_dist(self, dist, labels: Sequence[str], channels): - """ - dist: M x N - labels: N - return: - heatmaps: M x C - """ - heatmaps = dist.new_zeros((dist.shape[0], channels)) - for c in range(channels): - inds = labels == c # N - if inds.int().sum() == 0: - continue - heatmaps[:, c] = torch.exp(-dist[:, inds].min(dim=1)[0]) - zeros = heatmaps[:, c] < 1e-4 - heatmaps[zeros, c] = 0 - return heatmaps - - def _create_agn_heatmaps_from_dist(self, dist): - """ - TODO (Xingyi): merge it with _create_heatmaps_from_dist - dist: M x N - return: - heatmaps: M x 1 - """ - heatmaps = dist.new_zeros((dist.shape[0], 1)) - heatmaps[:, 0] = torch.exp(-dist.min(dim=1)[0]) - zeros = heatmaps < 1e-4 - heatmaps[zeros] = 0 - return heatmaps - - def _flatten_outputs(self, clss, reg_pred, agn_hm_pred): - # Reshape: (N, F, Hl, Wl) -> (N, Hl, Wl, F) -> (sum_l N*Hl*Wl, F) - clss = ( - cat([x.permute(0, 2, 3, 1).reshape(-1, x.shape[1]) for x in clss], dim=0) - if clss[0] is not None - else None - ) - reg_pred = cat([x.permute(0, 2, 3, 1).reshape(-1, 4) for x in reg_pred], dim=0) - agn_hm_pred = ( - cat([x.permute(0, 2, 3, 1).reshape(-1) for x in agn_hm_pred], dim=0) - if self.with_agn_hm - else None - ) - return clss, reg_pred, agn_hm_pred - - def get_center3x3(self, locations, centers, strides: Sequence[int]): - """ - Inputs: - locations: M x 2 - centers: N x 2 - strides: M - """ - M, N = locations.shape[0], centers.shape[0] - locations_expanded = locations.view(M, 1, 2).expand(M, N, 2) # M x N x 2 - centers_expanded = centers.view(1, N, 2).expand(M, N, 2) # M x N x 2 - strides_expanded = strides.view(M, 1, 1).expand(M, N, 2) # M x N - centers_discret = ( - (centers_expanded / strides_expanded).int() * strides_expanded - ).float() + strides_expanded / 2 # M x N x 2 - dist_x = (locations_expanded[:, :, 0] - centers_discret[:, :, 0]).abs() - dist_y = (locations_expanded[:, :, 1] - centers_discret[:, :, 1]).abs() - return (dist_x <= strides_expanded[:, :, 0]) & (dist_y <= strides_expanded[:, :, 0]) - - @torch.no_grad() - def inference(self, images, clss_per_level, reg_pred_per_level, agn_hm_pred_per_level, grids): - logits_pred = [x.sigmoid() if x is not None else None for x in clss_per_level] - agn_hm_pred_per_level = [ - x.sigmoid() if x is not None else None for x in agn_hm_pred_per_level - ] - - if self.only_proposal: - proposals = self.predict_instances( - grids, - agn_hm_pred_per_level, - reg_pred_per_level, - images.image_sizes, - [None for _ in agn_hm_pred_per_level], - ) - else: - proposals = self.predict_instances( - grids, logits_pred, reg_pred_per_level, images.image_sizes, agn_hm_pred_per_level - ) - if self.as_proposal or self.only_proposal: - for p in range(len(proposals)): - proposals[p].proposal_boxes = proposals[p].get("pred_boxes") - proposals[p].objectness_logits = proposals[p].get("scores") - proposals[p].remove("pred_boxes") - - if self.debug: - debug_test( - [self.denormalizer(x) for x in images], - logits_pred, - reg_pred_per_level, - agn_hm_pred_per_level, - preds=proposals, - vis_thresh=self.vis_thresh, - debug_show_name=False, - ) - return proposals, {} - - @torch.no_grad() - def predict_instances( - self, grids, logits_pred, reg_pred, image_sizes: Sequence[int], agn_hm_pred, is_proposal: bool=False - ): - sampled_boxes = [] - for l in range(len(grids)): - sampled_boxes.append( - self.predict_single_level( - grids[l], - logits_pred[l], - reg_pred[l] * self.strides[l], - image_sizes, - agn_hm_pred[l], - l, - is_proposal=is_proposal, - ) - ) - boxlists = list(zip(*sampled_boxes, strict=False)) - boxlists = [Instances.cat(boxlist) for boxlist in boxlists] - boxlists = self.nms_and_topK(boxlists, nms=not self.not_nms) - return boxlists - - @torch.no_grad() - def predict_single_level( - self, grids, heatmap, reg_pred, image_sizes: Sequence[int], agn_hm, level, is_proposal: bool=False - ): - N, C, H, W = heatmap.shape - # put in the same format as grids - if self.center_nms: - heatmap_nms = nn.functional.max_pool2d(heatmap, (3, 3), stride=1, padding=1) - heatmap = heatmap * (heatmap_nms == heatmap).float() - heatmap = heatmap.permute(0, 2, 3, 1) # N x H x W x C - heatmap = heatmap.reshape(N, -1, C) # N x HW x C - box_regression = reg_pred.view(N, 4, H, W).permute(0, 2, 3, 1) # N x H x W x 4 - box_regression = box_regression.reshape(N, -1, 4) - - candidate_inds = heatmap > self.score_thresh # 0.05 - pre_nms_top_n = candidate_inds.view(N, -1).sum(1) # N - pre_nms_topk = self.pre_nms_topk_train if self.training else self.pre_nms_topk_test - pre_nms_top_n = pre_nms_top_n.clamp(max=pre_nms_topk) # N - - if agn_hm is not None: - agn_hm = agn_hm.view(N, 1, H, W).permute(0, 2, 3, 1) - agn_hm = agn_hm.reshape(N, -1) - heatmap = heatmap * agn_hm[:, :, None] - - results = [] - for i in range(N): - per_box_cls = heatmap[i] # HW x C - per_candidate_inds = candidate_inds[i] # n - per_box_cls = per_box_cls[per_candidate_inds] # n - - per_candidate_nonzeros = per_candidate_inds.nonzero() # n - per_box_loc = per_candidate_nonzeros[:, 0] # n - per_class = per_candidate_nonzeros[:, 1] # n - - per_box_regression = box_regression[i] # HW x 4 - per_box_regression = per_box_regression[per_box_loc] # n x 4 - per_grids = grids[per_box_loc] # n x 2 - - per_pre_nms_top_n = pre_nms_top_n[i] # 1 - - if per_candidate_inds.sum().item() > per_pre_nms_top_n.item(): - per_box_cls, top_k_indices = per_box_cls.topk(per_pre_nms_top_n, sorted=False) - per_class = per_class[top_k_indices] - per_box_regression = per_box_regression[top_k_indices] - per_grids = per_grids[top_k_indices] - - detections = torch.stack( - [ - per_grids[:, 0] - per_box_regression[:, 0], - per_grids[:, 1] - per_box_regression[:, 1], - per_grids[:, 0] + per_box_regression[:, 2], - per_grids[:, 1] + per_box_regression[:, 3], - ], - dim=1, - ) # n x 4 - - # avoid invalid boxes in RoI heads - detections[:, 2] = torch.max(detections[:, 2], detections[:, 0] + 0.01) - detections[:, 3] = torch.max(detections[:, 3], detections[:, 1] + 0.01) - boxlist = Instances(image_sizes[i]) - boxlist.scores = torch.sqrt(per_box_cls) if self.with_agn_hm else per_box_cls # n - # import pdb; pdb.set_trace() - boxlist.pred_boxes = Boxes(detections) - boxlist.pred_classes = per_class - results.append(boxlist) - return results - - @torch.no_grad() - def nms_and_topK(self, boxlists, nms: bool=True): - num_images = len(boxlists) - results = [] - for i in range(num_images): - nms_thresh = self.nms_thresh_train if self.training else self.nms_thresh_test - result = ml_nms(boxlists[i], nms_thresh) if nms else boxlists[i] - if self.debug: - print("#proposals before nms", len(boxlists[i])) - print("#proposals after nms", len(result)) - num_dets = len(result) - post_nms_topk = self.post_nms_topk_train if self.training else self.post_nms_topk_test - if num_dets > post_nms_topk: - cls_scores = result.scores - image_thresh, _ = torch.kthvalue( - cls_scores.float().cpu(), num_dets - post_nms_topk + 1 - ) - keep = cls_scores >= image_thresh.item() - keep = torch.nonzero(keep).squeeze(1) - result = result[keep] - if self.debug: - print("#proposals after filter", len(result)) - results.append(result) - return results - - @torch.no_grad() - def _add_more_pos(self, reg_pred, gt_instances, shapes_per_level): - labels, level_masks, c33_inds, c33_masks, c33_regs = self._get_c33_inds( - gt_instances, shapes_per_level - ) - N, L, K = labels.shape[0], len(self.strides), 9 - c33_inds[c33_masks == 0] = 0 - reg_pred_c33 = reg_pred[c33_inds].detach() # N x L x K - invalid_reg = c33_masks == 0 - c33_regs_expand = c33_regs.view(N * L * K, 4).clamp(min=0) - if N > 0: - with torch.no_grad(): - c33_reg_loss = ( - self.iou_loss( - reg_pred_c33.view(N * L * K, 4), c33_regs_expand, None, reduction="none" - ) - .view(N, L, K) - .detach() - ) # N x L x K - else: - c33_reg_loss = reg_pred_c33.new_zeros((N, L, K)).detach() - c33_reg_loss[invalid_reg] = INF # N x L x K - c33_reg_loss.view(N * L, K)[level_masks.view(N * L), 4] = 0 # real center - c33_reg_loss = c33_reg_loss.view(N, L * K) - if N == 0: - loss_thresh = c33_reg_loss.new_ones(N).float() - else: - loss_thresh = torch.kthvalue(c33_reg_loss, self.more_pos_topk, dim=1)[0] # N - loss_thresh[loss_thresh > self.more_pos_thresh] = self.more_pos_thresh # N - new_pos = c33_reg_loss.view(N, L, K) < loss_thresh.view(N, 1, 1).expand(N, L, K) - pos_inds = c33_inds[new_pos].view(-1) # P - labels = labels.view(N, 1, 1).expand(N, L, K)[new_pos].view(-1) - return pos_inds, labels - - @torch.no_grad() - def _get_c33_inds(self, gt_instances, shapes_per_level): - """ - TODO (Xingyi): The current implementation is ugly. Refactor. - Get the center (and the 3x3 region near center) locations of each objects - Inputs: - gt_instances: [n_i], sum n_i = N - shapes_per_level: L x 2 [(h_l, w_l)]_L - """ - labels = [] - level_masks = [] - c33_inds = [] - c33_masks = [] - c33_regs = [] - L = len(self.strides) - B = len(gt_instances) - shapes_per_level = shapes_per_level.long() - loc_per_level = (shapes_per_level[:, 0] * shapes_per_level[:, 1]).long() # L - level_bases = [] - s = 0 - for l in range(L): - level_bases.append(s) - s = s + B * loc_per_level[l] - level_bases = shapes_per_level.new_tensor(level_bases).long() # L - strides_default = shapes_per_level.new_tensor(self.strides).float() # L - K = 9 - dx = shapes_per_level.new_tensor([-1, 0, 1, -1, 0, 1, -1, 0, 1]).long() - dy = shapes_per_level.new_tensor([-1, -1, -1, 0, 0, 0, 1, 1, 1]).long() - for im_i in range(B): - targets_per_im = gt_instances[im_i] - bboxes = targets_per_im.gt_boxes.tensor # n x 4 - n = bboxes.shape[0] - if n == 0: - continue - centers = (bboxes[:, [0, 1]] + bboxes[:, [2, 3]]) / 2 # n x 2 - centers = centers.view(n, 1, 2).expand(n, L, 2) - - strides = strides_default.view(1, L, 1).expand(n, L, 2) # - centers_inds = (centers / strides).long() # n x L x 2 - center_grids = centers_inds * strides + strides // 2 # n x L x 2 - l = center_grids[:, :, 0] - bboxes[:, 0].view(n, 1).expand(n, L) - t = center_grids[:, :, 1] - bboxes[:, 1].view(n, 1).expand(n, L) - r = bboxes[:, 2].view(n, 1).expand(n, L) - center_grids[:, :, 0] - b = bboxes[:, 3].view(n, 1).expand(n, L) - center_grids[:, :, 1] # n x L - reg = torch.stack([l, t, r, b], dim=2) # n x L x 4 - reg = reg / strides_default.view(1, L, 1).expand(n, L, 4).float() - - Ws = shapes_per_level[:, 1].view(1, L).expand(n, L) - Hs = shapes_per_level[:, 0].view(1, L).expand(n, L) - expand_Ws = Ws.view(n, L, 1).expand(n, L, K) - expand_Hs = Hs.view(n, L, 1).expand(n, L, K) - label = targets_per_im.gt_classes.view(n).clone() - mask = reg.min(dim=2)[0] >= 0 # n x L - mask = mask & self.assign_fpn_level(bboxes) - labels.append(label) # n - level_masks.append(mask) # n x L - - Dy = dy.view(1, 1, K).expand(n, L, K) - Dx = dx.view(1, 1, K).expand(n, L, K) - c33_ind = ( - level_bases.view(1, L, 1).expand(n, L, K) - + im_i * loc_per_level.view(1, L, 1).expand(n, L, K) - + (centers_inds[:, :, 1:2].expand(n, L, K) + Dy) * expand_Ws - + (centers_inds[:, :, 0:1].expand(n, L, K) + Dx) - ) # n x L x K - - c33_mask = ( - ((centers_inds[:, :, 1:2].expand(n, L, K) + dy) < expand_Hs) - & ((centers_inds[:, :, 1:2].expand(n, L, K) + dy) >= 0) - & ((centers_inds[:, :, 0:1].expand(n, L, K) + dx) < expand_Ws) - & ((centers_inds[:, :, 0:1].expand(n, L, K) + dx) >= 0) - ) - # TODO (Xingyi): think about better way to implement this - # Currently it hard codes the 3x3 region - c33_reg = reg.view(n, L, 1, 4).expand(n, L, K, 4).clone() - c33_reg[:, :, [0, 3, 6], 0] -= 1 - c33_reg[:, :, [0, 3, 6], 2] += 1 - c33_reg[:, :, [2, 5, 8], 0] += 1 - c33_reg[:, :, [2, 5, 8], 2] -= 1 - c33_reg[:, :, [0, 1, 2], 1] -= 1 - c33_reg[:, :, [0, 1, 2], 3] += 1 - c33_reg[:, :, [6, 7, 8], 1] += 1 - c33_reg[:, :, [6, 7, 8], 3] -= 1 - c33_mask = c33_mask & (c33_reg.min(dim=3)[0] >= 0) # n x L x K - c33_inds.append(c33_ind) - c33_masks.append(c33_mask) - c33_regs.append(c33_reg) - - if len(level_masks) > 0: - labels = torch.cat(labels, dim=0) - level_masks = torch.cat(level_masks, dim=0) - c33_inds = torch.cat(c33_inds, dim=0).long() - c33_regs = torch.cat(c33_regs, dim=0) - c33_masks = torch.cat(c33_masks, dim=0) - else: - labels = shapes_per_level.new_zeros(0).long() - level_masks = shapes_per_level.new_zeros((0, L)).bool() - c33_inds = shapes_per_level.new_zeros((0, L, K)).long() - c33_regs = shapes_per_level.new_zeros((0, L, K, 4)).float() - c33_masks = shapes_per_level.new_zeros((0, L, K)).bool() - return labels, level_masks, c33_inds, c33_masks, c33_regs # N x L, N x L x K diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/centernet_head.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/centernet_head.py deleted file mode 100644 index e2e1852e27..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/centernet_head.py +++ /dev/null @@ -1,168 +0,0 @@ -import math - -from detectron2.config import configurable -from detectron2.layers import get_norm -import torch -from torch import nn -from torch.nn import functional as F - -from ..layers.deform_conv import DFConv2d - -__all__ = ["CenterNetHead"] - - -class Scale(nn.Module): - def __init__(self, init_value: float=1.0) -> None: - super().__init__() - self.scale = nn.Parameter(torch.FloatTensor([init_value])) - - def forward(self, input): - return input * self.scale - - -class CenterNetHead(nn.Module): - @configurable - def __init__( - self, - # input_shape: List[ShapeSpec], - in_channels, - num_levels: int, - *, - num_classes: int=80, - with_agn_hm: bool=False, - only_proposal: bool=False, - norm: str="GN", - num_cls_convs: int=4, - num_box_convs: int=4, - num_share_convs: int=0, - use_deformable: bool=False, - prior_prob: float=0.01, - ) -> None: - super().__init__() - self.num_classes = num_classes - self.with_agn_hm = with_agn_hm - self.only_proposal = only_proposal - self.out_kernel = 3 - - head_configs = { - "cls": (num_cls_convs if not self.only_proposal else 0, use_deformable), - "bbox": (num_box_convs, use_deformable), - "share": (num_share_convs, use_deformable), - } - - # in_channels = [s.channels for s in input_shape] - # assert len(set(in_channels)) == 1, \ - # "Each level must have the same channel!" - # in_channels = in_channels[0] - channels = { - "cls": in_channels, - "bbox": in_channels, - "share": in_channels, - } - for head in head_configs: - tower = [] - num_convs, use_deformable = head_configs[head] - channel = channels[head] - for i in range(num_convs): - if use_deformable and i == num_convs - 1: - conv_func = DFConv2d - else: - conv_func = nn.Conv2d - tower.append( - conv_func( - in_channels if i == 0 else channel, - channel, - kernel_size=3, - stride=1, - padding=1, - bias=True, - ) - ) - if norm == "GN" and channel % 32 != 0: - tower.append(nn.GroupNorm(25, channel)) - elif norm != "": - tower.append(get_norm(norm, channel)) - tower.append(nn.ReLU()) - self.add_module(f"{head}_tower", nn.Sequential(*tower)) - - self.bbox_pred = nn.Conv2d( - in_channels, 4, kernel_size=self.out_kernel, stride=1, padding=self.out_kernel // 2 - ) - - self.scales = nn.ModuleList([Scale(init_value=1.0) for _ in range(num_levels)]) - - for modules in [ - self.cls_tower, - self.bbox_tower, - self.share_tower, - self.bbox_pred, - ]: - for l in modules.modules(): - if isinstance(l, nn.Conv2d): - torch.nn.init.normal_(l.weight, std=0.01) - torch.nn.init.constant_(l.bias, 0) - - torch.nn.init.constant_(self.bbox_pred.bias, 8.0) - prior_prob = prior_prob - bias_value = -math.log((1 - prior_prob) / prior_prob) - - if self.with_agn_hm: - self.agn_hm = nn.Conv2d( - in_channels, 1, kernel_size=self.out_kernel, stride=1, padding=self.out_kernel // 2 - ) - torch.nn.init.constant_(self.agn_hm.bias, bias_value) - torch.nn.init.normal_(self.agn_hm.weight, std=0.01) - - if not self.only_proposal: - cls_kernel_size = self.out_kernel - self.cls_logits = nn.Conv2d( - in_channels, - self.num_classes, - kernel_size=cls_kernel_size, - stride=1, - padding=cls_kernel_size // 2, - ) - - torch.nn.init.constant_(self.cls_logits.bias, bias_value) - torch.nn.init.normal_(self.cls_logits.weight, std=0.01) - - @classmethod - def from_config(cls, cfg, input_shape): - ret = { - # 'input_shape': input_shape, - "in_channels": next(s.channels for s in input_shape), - "num_levels": len(input_shape), - "num_classes": cfg.MODEL.CENTERNET.NUM_CLASSES, - "with_agn_hm": cfg.MODEL.CENTERNET.WITH_AGN_HM, - "only_proposal": cfg.MODEL.CENTERNET.ONLY_PROPOSAL, - "norm": cfg.MODEL.CENTERNET.NORM, - "num_cls_convs": cfg.MODEL.CENTERNET.NUM_CLS_CONVS, - "num_box_convs": cfg.MODEL.CENTERNET.NUM_BOX_CONVS, - "num_share_convs": cfg.MODEL.CENTERNET.NUM_SHARE_CONVS, - "use_deformable": cfg.MODEL.CENTERNET.USE_DEFORMABLE, - "prior_prob": cfg.MODEL.CENTERNET.PRIOR_PROB, - } - return ret - - def forward(self, x): - clss = [] - bbox_reg = [] - agn_hms = [] - for l, feature in enumerate(x): - feature = self.share_tower(feature) - cls_tower = self.cls_tower(feature) - bbox_tower = self.bbox_tower(feature) - if not self.only_proposal: - clss.append(self.cls_logits(cls_tower)) - else: - clss.append(None) - - if self.with_agn_hm: - agn_hms.append(self.agn_hm(bbox_tower)) - else: - agn_hms.append(None) - reg = self.bbox_pred(bbox_tower) - reg = self.scales[l](reg) - bbox_reg.append(F.relu(reg)) - - return clss, bbox_reg, agn_hms diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/utils.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/utils.py deleted file mode 100644 index ea962943ca..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/dense_heads/utils.py +++ /dev/null @@ -1,32 +0,0 @@ -from detectron2.utils.comm import get_world_size -import torch - -# from .data import CenterNetCrop - -__all__ = ["_transpose", "reduce_sum"] - -INF = 1000000000 - - -def _transpose(training_targets, num_loc_list): - """ - This function is used to transpose image first training targets to - level first ones - :return: level first training targets - """ - for im_i in range(len(training_targets)): - training_targets[im_i] = torch.split(training_targets[im_i], num_loc_list, dim=0) - - targets_level_first = [] - for targets_per_level in zip(*training_targets, strict=False): - targets_level_first.append(torch.cat(targets_per_level, dim=0)) - return targets_level_first - - -def reduce_sum(tensor): - world_size = get_world_size() - if world_size < 2: - return tensor - tensor = tensor.clone() - torch.distributed.all_reduce(tensor, op=torch.distributed.ReduceOp.SUM) - return tensor diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/deform_conv.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/deform_conv.py deleted file mode 100644 index 643660c6bc..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/deform_conv.py +++ /dev/null @@ -1,114 +0,0 @@ -from detectron2.layers import Conv2d -import torch -from torch import nn - - -class _NewEmptyTensorOp(torch.autograd.Function): - @staticmethod - def forward(ctx, x, new_shape): - ctx.shape = x.shape - return x.new_empty(new_shape) - - @staticmethod - def backward(ctx, grad): - shape = ctx.shape - return _NewEmptyTensorOp.apply(grad, shape), None - - -class DFConv2d(nn.Module): - """Deformable convolutional layer""" - - def __init__( - self, - in_channels, - out_channels, - with_modulated_dcn: bool=True, - kernel_size: int=3, - stride: int=1, - groups: int=1, - dilation: int=1, - deformable_groups: int=1, - bias: bool=False, - padding=None, - ) -> None: - super().__init__() - if isinstance(kernel_size, list | tuple): - assert isinstance(stride, list | tuple) - assert isinstance(dilation, list | tuple) - assert len(kernel_size) == 2 - assert len(stride) == 2 - assert len(dilation) == 2 - padding = ( - dilation[0] * (kernel_size[0] - 1) // 2, - dilation[1] * (kernel_size[1] - 1) // 2, - ) - offset_base_channels = kernel_size[0] * kernel_size[1] - else: - padding = dilation * (kernel_size - 1) // 2 - offset_base_channels = kernel_size * kernel_size - if with_modulated_dcn: - from detectron2.layers.deform_conv import ModulatedDeformConv - - offset_channels = offset_base_channels * 3 # default: 27 - conv_block = ModulatedDeformConv - else: - from detectron2.layers.deform_conv import DeformConv - - offset_channels = offset_base_channels * 2 # default: 18 - conv_block = DeformConv - self.offset = Conv2d( - in_channels, - deformable_groups * offset_channels, - kernel_size=kernel_size, - stride=stride, - padding=padding, - groups=1, - dilation=dilation, - ) - nn.init.constant_(self.offset.weight, 0) - nn.init.constant_(self.offset.bias, 0) - """ - for l in [self.offset, ]: - nn.init.kaiming_uniform_(l.weight, a=1) - torch.nn.init.constant_(l.bias, 0.) - """ - self.conv = conv_block( - in_channels, - out_channels, - kernel_size=kernel_size, - stride=stride, - padding=padding, - dilation=dilation, - groups=groups, - deformable_groups=deformable_groups, - bias=bias, - ) - self.with_modulated_dcn = with_modulated_dcn - self.kernel_size = kernel_size - self.stride = stride - self.padding = padding - self.dilation = dilation - self.offset_split = offset_base_channels * deformable_groups * 2 - - def forward(self, x, return_offset: bool=False): - if x.numel() > 0: - if not self.with_modulated_dcn: - offset_mask = self.offset(x) - x = self.conv(x, offset_mask) - else: - offset_mask = self.offset(x) - offset = offset_mask[:, : self.offset_split, :, :] - mask = offset_mask[:, self.offset_split :, :, :].sigmoid() - x = self.conv(x, offset, mask) - if return_offset: - return x, offset_mask - return x - # get output shape - output_shape = [ - (i + 2 * p - (di * (k - 1) + 1)) // d + 1 - for i, p, di, k, d in zip( - x.shape[-2:], self.padding, self.dilation, self.kernel_size, self.stride, strict=False - ) - ] - output_shape = [x.shape[0], self.conv.weight.shape[0], *output_shape] - return _NewEmptyTensorOp.apply(x, output_shape) diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/heatmap_focal_loss.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/heatmap_focal_loss.py deleted file mode 100644 index 50ccf371c9..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/heatmap_focal_loss.py +++ /dev/null @@ -1,91 +0,0 @@ -import torch -from typing import Sequence - - -# TODO: merge these two function -def heatmap_focal_loss( - inputs, - targets, - pos_inds, - labels: Sequence[str], - alpha: float = -1, - beta: float = 4, - gamma: float = 2, - reduction: str = "sum", - sigmoid_clamp: float = 1e-4, - ignore_high_fp: float = -1.0, -): - """ - Loss used in RetinaNet for dense detection: https://arxiv.org/abs/1708.02002. - Args: - inputs: (sum_l N*Hl*Wl, C) - targets: (sum_l N*Hl*Wl, C) - pos_inds: N - labels: N - Returns: - Loss tensor with the reduction option applied. - """ - pred = torch.clamp(inputs.sigmoid_(), min=sigmoid_clamp, max=1 - sigmoid_clamp) - neg_weights = torch.pow(1 - targets, beta) - pos_pred_pix = pred[pos_inds] # N x C - pos_pred = pos_pred_pix.gather(1, labels.unsqueeze(1)) - pos_loss = torch.log(pos_pred) * torch.pow(1 - pos_pred, gamma) - neg_loss = torch.log(1 - pred) * torch.pow(pred, gamma) * neg_weights - - if ignore_high_fp > 0: - not_high_fp = (pred < ignore_high_fp).float() - neg_loss = not_high_fp * neg_loss - - if reduction == "sum": - pos_loss = pos_loss.sum() - neg_loss = neg_loss.sum() - - if alpha >= 0: - pos_loss = alpha * pos_loss - neg_loss = (1 - alpha) * neg_loss - - return -pos_loss, -neg_loss - - -heatmap_focal_loss_jit = torch.jit.script(heatmap_focal_loss) -# heatmap_focal_loss_jit = heatmap_focal_loss - - -def binary_heatmap_focal_loss( - inputs, - targets, - pos_inds, - alpha: float = -1, - beta: float = 4, - gamma: float = 2, - sigmoid_clamp: float = 1e-4, - ignore_high_fp: float = -1.0, -): - """ - Args: - inputs: (sum_l N*Hl*Wl,) - targets: (sum_l N*Hl*Wl,) - pos_inds: N - Returns: - Loss tensor with the reduction option applied. - """ - pred = torch.clamp(inputs.sigmoid_(), min=sigmoid_clamp, max=1 - sigmoid_clamp) - neg_weights = torch.pow(1 - targets, beta) - pos_pred = pred[pos_inds] # N - pos_loss = torch.log(pos_pred) * torch.pow(1 - pos_pred, gamma) - neg_loss = torch.log(1 - pred) * torch.pow(pred, gamma) * neg_weights - if ignore_high_fp > 0: - not_high_fp = (pred < ignore_high_fp).float() - neg_loss = not_high_fp * neg_loss - - pos_loss = -pos_loss.sum() - neg_loss = -neg_loss.sum() - - if alpha >= 0: - pos_loss = alpha * pos_loss - neg_loss = (1 - alpha) * neg_loss - - return pos_loss, neg_loss - - -binary_heatmap_focal_loss_jit = torch.jit.script(binary_heatmap_focal_loss) diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/iou_loss.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/iou_loss.py deleted file mode 100644 index 55fa2a186d..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/iou_loss.py +++ /dev/null @@ -1,115 +0,0 @@ -import torch -from torch import nn - - -class IOULoss(nn.Module): - def __init__(self, loc_loss_type: str="iou") -> None: - super().__init__() - self.loc_loss_type = loc_loss_type - - def forward(self, pred, target, weight=None, reduction: str="sum"): - pred_left = pred[:, 0] - pred_top = pred[:, 1] - pred_right = pred[:, 2] - pred_bottom = pred[:, 3] - - target_left = target[:, 0] - target_top = target[:, 1] - target_right = target[:, 2] - target_bottom = target[:, 3] - - target_aera = (target_left + target_right) * (target_top + target_bottom) - pred_aera = (pred_left + pred_right) * (pred_top + pred_bottom) - - w_intersect = torch.min(pred_left, target_left) + torch.min(pred_right, target_right) - h_intersect = torch.min(pred_bottom, target_bottom) + torch.min(pred_top, target_top) - - g_w_intersect = torch.max(pred_left, target_left) + torch.max(pred_right, target_right) - g_h_intersect = torch.max(pred_bottom, target_bottom) + torch.max(pred_top, target_top) - ac_uion = g_w_intersect * g_h_intersect - - area_intersect = w_intersect * h_intersect - area_union = target_aera + pred_aera - area_intersect - - ious = (area_intersect + 1.0) / (area_union + 1.0) - gious = ious - (ac_uion - area_union) / ac_uion - if self.loc_loss_type == "iou": - losses = -torch.log(ious) - elif self.loc_loss_type == "linear_iou": - losses = 1 - ious - elif self.loc_loss_type == "giou": - losses = 1 - gious - else: - raise NotImplementedError - - if weight is not None: - losses = losses * weight - else: - losses = losses - - if reduction == "sum": - return losses.sum() - elif reduction == "batch": - return losses.sum(dim=[1]) - elif reduction == "none": - return losses - else: - raise NotImplementedError - - -def giou_loss( - boxes1: torch.Tensor, - boxes2: torch.Tensor, - reduction: str = "none", - eps: float = 1e-7, -) -> torch.Tensor: - """ - Generalized Intersection over Union Loss (Hamid Rezatofighi et. al) - https://arxiv.org/abs/1902.09630 - Gradient-friendly IoU loss with an additional penalty that is non-zero when the - boxes do not overlap and scales with the size of their smallest enclosing box. - This loss is symmetric, so the boxes1 and boxes2 arguments are interchangeable. - Args: - boxes1, boxes2 (Tensor): box locations in XYXY format, shape (N, 4) or (4,). - reduction: 'none' | 'mean' | 'sum' - 'none': No reduction will be applied to the output. - 'mean': The output will be averaged. - 'sum': The output will be summed. - eps (float): small number to prevent division by zero - """ - - x1, y1, x2, y2 = boxes1.unbind(dim=-1) - x1g, y1g, x2g, y2g = boxes2.unbind(dim=-1) - - assert (x2 >= x1).all(), "bad box: x1 larger than x2" - assert (y2 >= y1).all(), "bad box: y1 larger than y2" - - # Intersection keypoints - xkis1 = torch.max(x1, x1g) - ykis1 = torch.max(y1, y1g) - xkis2 = torch.min(x2, x2g) - ykis2 = torch.min(y2, y2g) - - intsctk = torch.zeros_like(x1) - mask = (ykis2 > ykis1) & (xkis2 > xkis1) - intsctk[mask] = (xkis2[mask] - xkis1[mask]) * (ykis2[mask] - ykis1[mask]) - unionk = (x2 - x1) * (y2 - y1) + (x2g - x1g) * (y2g - y1g) - intsctk - iouk = intsctk / (unionk + eps) - - # smallest enclosing box - xc1 = torch.min(x1, x1g) - yc1 = torch.min(y1, y1g) - xc2 = torch.max(x2, x2g) - yc2 = torch.max(y2, y2g) - - area_c = (xc2 - xc1) * (yc2 - yc1) - miouk = iouk - ((area_c - unionk) / (area_c + eps)) - - loss = 1 - miouk - - if reduction == "mean": - loss = loss.mean() - elif reduction == "sum": - loss = loss.sum() - - return loss diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/ml_nms.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/ml_nms.py deleted file mode 100644 index 429c986cfe..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/layers/ml_nms.py +++ /dev/null @@ -1,29 +0,0 @@ -from detectron2.layers import batched_nms - - -def ml_nms(boxlist, nms_thresh, max_proposals=-1, score_field: str="scores", label_field: str="labels"): - """ - Performs non-maximum suppression on a boxlist, with scores specified - in a boxlist field via score_field. - Arguments: - boxlist(BoxList) - nms_thresh (float) - max_proposals (int): if > 0, then only the top max_proposals are kept - after non-maximum suppression - score_field (str) - """ - if nms_thresh <= 0: - return boxlist - if boxlist.has("pred_boxes"): - boxes = boxlist.pred_boxes.tensor - labels = boxlist.pred_classes - else: - boxes = boxlist.proposal_boxes.tensor - labels = boxlist.proposal_boxes.tensor.new_zeros(len(boxlist.proposal_boxes.tensor)) - scores = boxlist.scores - - keep = batched_nms(boxes, scores, labels, nms_thresh) - if max_proposals > 0: - keep = keep[:max_proposals] - boxlist = boxlist[keep] - return boxlist diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/meta_arch/centernet_detector.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/meta_arch/centernet_detector.py deleted file mode 100644 index 02cd3da416..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/meta_arch/centernet_detector.py +++ /dev/null @@ -1,63 +0,0 @@ -from detectron2.modeling import build_backbone, build_proposal_generator, detector_postprocess -from detectron2.modeling.meta_arch.build import META_ARCH_REGISTRY -from detectron2.structures import ImageList -import torch -from torch import nn - - -@META_ARCH_REGISTRY.register() -class CenterNetDetector(nn.Module): - def __init__(self, cfg) -> None: - super().__init__() - self.mean, self.std = cfg.MODEL.PIXEL_MEAN, cfg.MODEL.PIXEL_STD - self.register_buffer("pixel_mean", torch.Tensor(cfg.MODEL.PIXEL_MEAN).view(-1, 1, 1)) - self.register_buffer("pixel_std", torch.Tensor(cfg.MODEL.PIXEL_STD).view(-1, 1, 1)) - - self.backbone = build_backbone(cfg) - self.proposal_generator = build_proposal_generator( - cfg, self.backbone.output_shape() - ) # TODO: change to a more precise name - - def forward(self, batched_inputs): - if not self.training: - return self.inference(batched_inputs) - images = self.preprocess_image(batched_inputs) - features = self.backbone(images.tensor) - gt_instances = [x["instances"].to(self.device) for x in batched_inputs] - - _, proposal_losses = self.proposal_generator(images, features, gt_instances) - return proposal_losses - - @property - def device(self): - return self.pixel_mean.device - - @torch.no_grad() - def inference(self, batched_inputs, do_postprocess: bool=True): - images = self.preprocess_image(batched_inputs) - inp = images.tensor - features = self.backbone(inp) - proposals, _ = self.proposal_generator(images, features, None) - - processed_results = [] - for results_per_image, input_per_image, image_size in zip( - proposals, batched_inputs, images.image_sizes, strict=False - ): - if do_postprocess: - height = input_per_image.get("height", image_size[0]) - width = input_per_image.get("width", image_size[1]) - r = detector_postprocess(results_per_image, height, width) - processed_results.append({"instances": r}) - else: - r = results_per_image - processed_results.append(r) - return processed_results - - def preprocess_image(self, batched_inputs): - """ - Normalize, pad and batch the input images. - """ - images = [x["image"].to(self.device) for x in batched_inputs] - images = [(x - self.pixel_mean) / self.pixel_std for x in images] - images = ImageList.from_tensors(images, self.backbone.size_divisibility) - return images diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/custom_fast_rcnn.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/custom_fast_rcnn.py deleted file mode 100644 index b48b5447ac..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/custom_fast_rcnn.py +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# Part of the code is from https://github.com/tztztztztz/eql.detectron2/blob/master/projects/EQL/eql/fast_rcnn.py -import math - -from detectron2.layers import ShapeSpec, cat -from detectron2.modeling.roi_heads.fast_rcnn import ( - FastRCNNOutputLayers, - _log_classification_stats, - fast_rcnn_inference, -) -import torch -from torch import nn -from torch.nn import functional as F - -from .fed_loss import get_fed_loss_inds, load_class_freq - -__all__ = ["CustomFastRCNNOutputLayers"] - - -class CustomFastRCNNOutputLayers(FastRCNNOutputLayers): - def __init__(self, cfg, input_shape: ShapeSpec, **kwargs) -> None: - super().__init__(cfg, input_shape, **kwargs) - self.use_sigmoid_ce = cfg.MODEL.ROI_BOX_HEAD.USE_SIGMOID_CE - if self.use_sigmoid_ce: - prior_prob = cfg.MODEL.ROI_BOX_HEAD.PRIOR_PROB - bias_value = -math.log((1 - prior_prob) / prior_prob) - nn.init.constant_(self.cls_score.bias, bias_value) - - self.cfg = cfg - self.use_fed_loss = cfg.MODEL.ROI_BOX_HEAD.USE_FED_LOSS - if self.use_fed_loss: - self.fed_loss_num_cat = cfg.MODEL.ROI_BOX_HEAD.FED_LOSS_NUM_CAT - self.register_buffer( - "freq_weight", - load_class_freq( - cfg.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH, - cfg.MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT, - ), - ) - - def losses(self, predictions, proposals): - """ - enable advanced loss - """ - scores, proposal_deltas = predictions - gt_classes = ( - cat([p.gt_classes for p in proposals], dim=0) if len(proposals) else torch.empty(0) - ) - _log_classification_stats(scores, gt_classes) - - if len(proposals): - proposal_boxes = cat([p.proposal_boxes.tensor for p in proposals], dim=0) # Nx4 - assert not proposal_boxes.requires_grad, "Proposals should not require gradients!" - gt_boxes = cat( - [(p.gt_boxes if p.has("gt_boxes") else p.proposal_boxes).tensor for p in proposals], - dim=0, - ) - else: - proposal_boxes = gt_boxes = torch.empty((0, 4), device=proposal_deltas.device) - - if self.use_sigmoid_ce: - loss_cls = self.sigmoid_cross_entropy_loss(scores, gt_classes) - else: - loss_cls = self.softmax_cross_entropy_loss(scores, gt_classes) - return { - "loss_cls": loss_cls, - "loss_box_reg": self.box_reg_loss( - proposal_boxes, gt_boxes, proposal_deltas, gt_classes - ), - } - - def sigmoid_cross_entropy_loss(self, pred_class_logits, gt_classes): - if pred_class_logits.numel() == 0: - return pred_class_logits.new_zeros([1])[0] # This is more robust than .sum() * 0. - - B = pred_class_logits.shape[0] - C = pred_class_logits.shape[1] - 1 - - target = pred_class_logits.new_zeros(B, C + 1) - target[range(len(gt_classes)), gt_classes] = 1 # B x (C + 1) - target = target[:, :C] # B x C - - weight = 1 - if self.use_fed_loss and (self.freq_weight is not None): # fedloss - appeared = get_fed_loss_inds( - gt_classes, num_sample_cats=self.fed_loss_num_cat, C=C, weight=self.freq_weight - ) - appeared_mask = appeared.new_zeros(C + 1) - appeared_mask[appeared] = 1 # C + 1 - appeared_mask = appeared_mask[:C] - fed_w = appeared_mask.view(1, C).expand(B, C) - weight = weight * fed_w.float() - - cls_loss = F.binary_cross_entropy_with_logits( - pred_class_logits[:, :-1], target, reduction="none" - ) # B x C - loss = torch.sum(cls_loss * weight) / B - return loss - - def softmax_cross_entropy_loss(self, pred_class_logits, gt_classes): - """ - change _no_instance handling - """ - if pred_class_logits.numel() == 0: - return pred_class_logits.new_zeros([1])[0] - - if self.use_fed_loss and (self.freq_weight is not None): - C = pred_class_logits.shape[1] - 1 - appeared = get_fed_loss_inds( - gt_classes, num_sample_cats=self.fed_loss_num_cat, C=C, weight=self.freq_weight - ) - appeared_mask = appeared.new_zeros(C + 1).float() - appeared_mask[appeared] = 1.0 # C + 1 - appeared_mask[C] = 1.0 - loss = F.cross_entropy( - pred_class_logits, gt_classes, weight=appeared_mask, reduction="mean" - ) - else: - loss = F.cross_entropy(pred_class_logits, gt_classes, reduction="mean") - return loss - - def inference(self, predictions, proposals): - """ - enable use proposal boxes - """ - boxes = self.predict_boxes(predictions, proposals) - scores = self.predict_probs(predictions, proposals) - if self.cfg.MODEL.ROI_BOX_HEAD.MULT_PROPOSAL_SCORE: - proposal_scores = [p.get("objectness_logits") for p in proposals] - scores = [(s * ps[:, None]) ** 0.5 for s, ps in zip(scores, proposal_scores, strict=False)] - image_shapes = [x.image_size for x in proposals] - return fast_rcnn_inference( - boxes, - scores, - image_shapes, - self.test_score_thresh, - self.test_nms_thresh, - self.test_topk_per_image, - ) - - def predict_probs(self, predictions, proposals): - """ - support sigmoid - """ - scores, _ = predictions - num_inst_per_image = [len(p) for p in proposals] - if self.use_sigmoid_ce: - probs = scores.sigmoid() - else: - probs = F.softmax(scores, dim=-1) - return probs.split(num_inst_per_image, dim=0) diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/custom_roi_heads.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/custom_roi_heads.py deleted file mode 100644 index d0478de2f3..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/custom_roi_heads.py +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -from detectron2.modeling.box_regression import Box2BoxTransform -from detectron2.modeling.roi_heads.cascade_rcnn import CascadeROIHeads -from detectron2.modeling.roi_heads.fast_rcnn import fast_rcnn_inference -from detectron2.modeling.roi_heads.roi_heads import ROI_HEADS_REGISTRY, StandardROIHeads -from detectron2.utils.events import get_event_storage -import torch - -from .custom_fast_rcnn import CustomFastRCNNOutputLayers - - -@ROI_HEADS_REGISTRY.register() -class CustomROIHeads(StandardROIHeads): - @classmethod - def _init_box_head(cls, cfg, input_shape): - ret = super()._init_box_head(cfg, input_shape) - del ret["box_predictor"] - ret["box_predictor"] = CustomFastRCNNOutputLayers(cfg, ret["box_head"].output_shape) - cls.debug = cfg.DEBUG - if cls.debug: - cls.debug_show_name = cfg.DEBUG_SHOW_NAME - cls.save_debug = cfg.SAVE_DEBUG - cls.vis_thresh = cfg.VIS_THRESH - cls.pixel_mean = ( - torch.Tensor(cfg.MODEL.PIXEL_MEAN).to(torch.device(cfg.MODEL.DEVICE)).view(3, 1, 1) - ) - cls.pixel_std = ( - torch.Tensor(cfg.MODEL.PIXEL_STD).to(torch.device(cfg.MODEL.DEVICE)).view(3, 1, 1) - ) - return ret - - def forward(self, images, features, proposals, targets=None): - """ - enable debug - """ - if not self.debug: - del images - if self.training: - assert targets - proposals = self.label_and_sample_proposals(proposals, targets) - del targets - - if self.training: - losses = self._forward_box(features, proposals) - losses.update(self._forward_mask(features, proposals)) - losses.update(self._forward_keypoint(features, proposals)) - return proposals, losses - else: - pred_instances = self._forward_box(features, proposals) - pred_instances = self.forward_with_given_boxes(features, pred_instances) - if self.debug: - from ..debug import debug_second_stage - - def denormalizer(x): - return x * self.pixel_std + self.pixel_mean - debug_second_stage( - [denormalizer(images[0].clone())], - pred_instances, - proposals=proposals, - debug_show_name=self.debug_show_name, - ) - return pred_instances, {} - - -@ROI_HEADS_REGISTRY.register() -class CustomCascadeROIHeads(CascadeROIHeads): - @classmethod - def _init_box_head(cls, cfg, input_shape): - cls.mult_proposal_score = cfg.MODEL.ROI_BOX_HEAD.MULT_PROPOSAL_SCORE - ret = super()._init_box_head(cfg, input_shape) - del ret["box_predictors"] - cascade_bbox_reg_weights = cfg.MODEL.ROI_BOX_CASCADE_HEAD.BBOX_REG_WEIGHTS - box_predictors = [] - for box_head, bbox_reg_weights in zip(ret["box_heads"], cascade_bbox_reg_weights, strict=False): - box_predictors.append( - CustomFastRCNNOutputLayers( - cfg, - box_head.output_shape, - box2box_transform=Box2BoxTransform(weights=bbox_reg_weights), - ) - ) - ret["box_predictors"] = box_predictors - cls.debug = cfg.DEBUG - if cls.debug: - cls.debug_show_name = cfg.DEBUG_SHOW_NAME - cls.save_debug = cfg.SAVE_DEBUG - cls.vis_thresh = cfg.VIS_THRESH - cls.pixel_mean = ( - torch.Tensor(cfg.MODEL.PIXEL_MEAN).to(torch.device(cfg.MODEL.DEVICE)).view(3, 1, 1) - ) - cls.pixel_std = ( - torch.Tensor(cfg.MODEL.PIXEL_STD).to(torch.device(cfg.MODEL.DEVICE)).view(3, 1, 1) - ) - return ret - - def _forward_box(self, features, proposals, targets=None): - """ - Add mult proposal scores at testing - """ - if (not self.training) and self.mult_proposal_score: - if len(proposals) > 0 and proposals[0].has("scores"): - proposal_scores = [p.get("scores") for p in proposals] - else: - proposal_scores = [p.get("objectness_logits") for p in proposals] - - features = [features[f] for f in self.box_in_features] - head_outputs = [] # (predictor, predictions, proposals) - prev_pred_boxes = None - image_sizes = [x.image_size for x in proposals] - for k in range(self.num_cascade_stages): - if k > 0: - proposals = self._create_proposals_from_boxes(prev_pred_boxes, image_sizes) - if self.training: - proposals = self._match_and_label_boxes(proposals, k, targets) - predictions = self._run_stage(features, proposals, k) - prev_pred_boxes = self.box_predictor[k].predict_boxes(predictions, proposals) - head_outputs.append((self.box_predictor[k], predictions, proposals)) - - if self.training: - losses = {} - storage = get_event_storage() - for stage, (predictor, predictions, proposals) in enumerate(head_outputs): - with storage.name_scope(f"stage{stage}"): - stage_losses = predictor.losses(predictions, proposals) - losses.update({k + f"_stage{stage}": v for k, v in stage_losses.items()}) - return losses - else: - # Each is a list[Tensor] of length #image. Each tensor is Ri x (K+1) - scores_per_stage = [h[0].predict_probs(h[1], h[2]) for h in head_outputs] - scores = [ - sum(list(scores_per_image)) * (1.0 / self.num_cascade_stages) - for scores_per_image in zip(*scores_per_stage, strict=False) - ] - - if self.mult_proposal_score: - scores = [(s * ps[:, None]) ** 0.5 for s, ps in zip(scores, proposal_scores, strict=False)] - - predictor, predictions, proposals = head_outputs[-1] - boxes = predictor.predict_boxes(predictions, proposals) - pred_instances, _ = fast_rcnn_inference( - boxes, - scores, - image_sizes, - predictor.test_score_thresh, - predictor.test_nms_thresh, - predictor.test_topk_per_image, - ) - - return pred_instances - - def forward(self, images, features, proposals, targets=None): - """ - enable debug - """ - if not self.debug: - del images - if self.training: - proposals = self.label_and_sample_proposals(proposals, targets) - - if self.training: - losses = self._forward_box(features, proposals, targets) - losses.update(self._forward_mask(features, proposals)) - losses.update(self._forward_keypoint(features, proposals)) - return proposals, losses - else: - # import pdb; pdb.set_trace() - pred_instances = self._forward_box(features, proposals) - pred_instances = self.forward_with_given_boxes(features, pred_instances) - if self.debug: - from ..debug import debug_second_stage - - def denormalizer(x): - return x * self.pixel_std + self.pixel_mean - debug_second_stage( - [denormalizer(x.clone()) for x in images], - pred_instances, - proposals=proposals, - save_debug=self.save_debug, - debug_show_name=self.debug_show_name, - vis_thresh=self.vis_thresh, - ) - return pred_instances, {} diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/fed_loss.py b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/fed_loss.py deleted file mode 100644 index 8a41607ea9..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/roi_heads/fed_loss.py +++ /dev/null @@ -1,25 +0,0 @@ -import json - -import torch - - -def load_class_freq(path: str="datasets/lvis/lvis_v1_train_cat_info.json", freq_weight: float=0.5): - cat_info = json.load(open(path)) - cat_info = torch.tensor([c["image_count"] for c in sorted(cat_info, key=lambda x: x["id"])]) - freq_weight = cat_info.float() ** freq_weight - return freq_weight - - -def get_fed_loss_inds(gt_classes, num_sample_cats: int=50, C: int=1203, weight=None, fed_cls_inds=-1): - appeared = torch.unique(gt_classes) # C' - prob = appeared.new_ones(C + 1).float() - prob[-1] = 0 - if len(appeared) < num_sample_cats: - if weight is not None: - prob[:C] = weight.float().clone() - prob[appeared] = 0 - if fed_cls_inds > 0: - prob[fed_cls_inds:] = 0 - more_appeared = torch.multinomial(prob, num_sample_cats - len(appeared), replacement=False) - appeared = torch.cat([appeared, more_appeared]) - return appeared diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/Base-CenterNet-FPN.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/Base-CenterNet-FPN.yaml deleted file mode 100644 index bef3dc10de..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/Base-CenterNet-FPN.yaml +++ /dev/null @@ -1,28 +0,0 @@ -MODEL: - META_ARCHITECTURE: "CenterNetDetector" - PROPOSAL_GENERATOR: - NAME: "CenterNet" - BACKBONE: - NAME: "build_p67_resnet_fpn_backbone" - WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" - RESNETS: - DEPTH: 50 - OUT_FEATURES: ["res3", "res4", "res5"] - FPN: - IN_FEATURES: ["res3", "res4", "res5"] -DATASETS: - TRAIN: ("coco_2017_train",) - TEST: ("coco_2017_val",) -SOLVER: - IMS_PER_BATCH: 16 - BASE_LR: 0.01 - STEPS: (60000, 80000) - MAX_ITER: 90000 - CHECKPOINT_PERIOD: 1000000000 - WARMUP_ITERS: 4000 - WARMUP_FACTOR: 0.00025 - CLIP_GRADIENTS: - ENABLED: True -INPUT: - MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) -OUTPUT_DIR: "./output/CenterNet2/auto" diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/Base-CenterNet2.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/Base-CenterNet2.yaml deleted file mode 100644 index 6893723101..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/Base-CenterNet2.yaml +++ /dev/null @@ -1,56 +0,0 @@ -MODEL: - META_ARCHITECTURE: "GeneralizedRCNN" - PROPOSAL_GENERATOR: - NAME: "CenterNet" - BACKBONE: - NAME: "build_p67_resnet_fpn_backbone" - WEIGHTS: "detectron2://ImageNetPretrained/MSRA/R-50.pkl" - RESNETS: - DEPTH: 50 - OUT_FEATURES: ["res3", "res4", "res5"] - FPN: - IN_FEATURES: ["res3", "res4", "res5"] - ROI_HEADS: - NAME: CustomCascadeROIHeads - IN_FEATURES: ["p3", "p4", "p5", "p6", "p7"] - IOU_THRESHOLDS: [0.6] - NMS_THRESH_TEST: 0.7 - ROI_BOX_CASCADE_HEAD: - IOUS: [0.6, 0.7, 0.8] - ROI_BOX_HEAD: - NAME: "FastRCNNConvFCHead" - NUM_FC: 2 - POOLER_RESOLUTION: 7 - CLS_AGNOSTIC_BBOX_REG: True - MULT_PROPOSAL_SCORE: True - CENTERNET: - REG_WEIGHT: 1. - NOT_NORM_REG: True - ONLY_PROPOSAL: True - WITH_AGN_HM: True - INFERENCE_TH: 0.0001 - PRE_NMS_TOPK_TRAIN: 4000 - POST_NMS_TOPK_TRAIN: 2000 - PRE_NMS_TOPK_TEST: 1000 - POST_NMS_TOPK_TEST: 256 - NMS_TH_TRAIN: 0.9 - NMS_TH_TEST: 0.9 - POS_WEIGHT: 0.5 - NEG_WEIGHT: 0.5 - IGNORE_HIGH_FP: 0.85 -DATASETS: - TRAIN: ("coco_2017_train",) - TEST: ("coco_2017_val",) -SOLVER: - IMS_PER_BATCH: 16 - BASE_LR: 0.02 - STEPS: (60000, 80000) - MAX_ITER: 90000 - CHECKPOINT_PERIOD: 1000000000 - WARMUP_ITERS: 4000 - WARMUP_FACTOR: 0.00025 - CLIP_GRADIENTS: - ENABLED: True -INPUT: - MIN_SIZE_TRAIN: (640, 672, 704, 736, 768, 800) -OUTPUT_DIR: "./output/CenterNet2/auto" diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/Base_S4_DLA.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/Base_S4_DLA.yaml deleted file mode 100644 index 7e01be7e55..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/Base_S4_DLA.yaml +++ /dev/null @@ -1,40 +0,0 @@ -MODEL: - META_ARCHITECTURE: "CenterNetDetector" - PROPOSAL_GENERATOR: - NAME: "CenterNet" - PIXEL_STD: [57.375, 57.120, 58.395] - BACKBONE: - NAME: "build_dla_backbone" - DLA: - NORM: "BN" - CENTERNET: - IN_FEATURES: ["dla2"] - FPN_STRIDES: [4] - SOI: [[0, 1000000]] - NUM_CLS_CONVS: 1 - NUM_BOX_CONVS: 1 - REG_WEIGHT: 1. - MORE_POS: True - HM_FOCAL_ALPHA: 0.25 -DATASETS: - TRAIN: ("coco_2017_train",) - TEST: ("coco_2017_val",) -SOLVER: - LR_SCHEDULER_NAME: "WarmupCosineLR" - MAX_ITER: 90000 - BASE_LR: 0.04 - IMS_PER_BATCH: 64 - WEIGHT_DECAY: 0.0001 - CHECKPOINT_PERIOD: 1000000 - CLIP_GRADIENTS: - ENABLED: True -INPUT: - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 640 - MIN_SIZE_TEST: 608 - MAX_SIZE_TEST: 900 -TEST: - EVAL_PERIOD: 7500 -DATALOADER: - NUM_WORKERS: 8 -OUTPUT_DIR: "output/CenterNet2/auto" diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet-FPN_R50_1x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet-FPN_R50_1x.yaml deleted file mode 100644 index 6ea7d9b703..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet-FPN_R50_1x.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_BASE_: "Base-CenterNet-FPN.yaml" -MODEL: - CENTERNET: - MORE_POS: True \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet-S4_DLA_8x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet-S4_DLA_8x.yaml deleted file mode 100644 index b3d88be9f5..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet-S4_DLA_8x.yaml +++ /dev/null @@ -1,5 +0,0 @@ -_BASE_: "Base_S4_DLA.yaml" -SOLVER: - MAX_ITER: 90000 - BASE_LR: 0.08 - IMS_PER_BATCH: 128 \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2-F_R50_1x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2-F_R50_1x.yaml deleted file mode 100644 index c40eecc13a..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2-F_R50_1x.yaml +++ /dev/null @@ -1,4 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - ROI_HEADS: - NAME: CustomROIHeads \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P3_24x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P3_24x.yaml deleted file mode 100644 index d7491447eb..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P3_24x.yaml +++ /dev/null @@ -1,36 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - BACKBONE: - NAME: "build_p35_fcos_dla_bifpn_backbone" - BIFPN: - OUT_CHANNELS: 160 - NUM_LEVELS: 3 - NUM_BIFPN: 4 - DLA: - NUM_LAYERS: 34 - NORM: "SyncBN" - FPN: - IN_FEATURES: ["dla3", "dla4", "dla5"] - ROI_HEADS: - IN_FEATURES: ["p3", "p4", "p5"] - CENTERNET: - POST_NMS_TOPK_TEST: 128 - FPN_STRIDES: [8, 16, 32] - IN_FEATURES: ['p3', 'p4', 'p5'] - SOI: [[0, 64], [48, 192], [128, 1000000]] -DATASETS: - TRAIN: ("coco_2017_train",) - TEST: ("coco_2017_val",) -SOLVER: - IMS_PER_BATCH: 16 - BASE_LR: 0.02 - STEPS: (300000, 340000) - MAX_ITER: 360000 - CHECKPOINT_PERIOD: 100000 - WARMUP_ITERS: 4000 - WARMUP_FACTOR: 0.00025 -INPUT: - MIN_SIZE_TRAIN: (256, 288, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608) - MAX_SIZE_TRAIN: 900 - MAX_SIZE_TEST: 736 - MIN_SIZE_TEST: 512 \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P3_4x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P3_4x.yaml deleted file mode 100644 index d7491447eb..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P3_4x.yaml +++ /dev/null @@ -1,36 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - BACKBONE: - NAME: "build_p35_fcos_dla_bifpn_backbone" - BIFPN: - OUT_CHANNELS: 160 - NUM_LEVELS: 3 - NUM_BIFPN: 4 - DLA: - NUM_LAYERS: 34 - NORM: "SyncBN" - FPN: - IN_FEATURES: ["dla3", "dla4", "dla5"] - ROI_HEADS: - IN_FEATURES: ["p3", "p4", "p5"] - CENTERNET: - POST_NMS_TOPK_TEST: 128 - FPN_STRIDES: [8, 16, 32] - IN_FEATURES: ['p3', 'p4', 'p5'] - SOI: [[0, 64], [48, 192], [128, 1000000]] -DATASETS: - TRAIN: ("coco_2017_train",) - TEST: ("coco_2017_val",) -SOLVER: - IMS_PER_BATCH: 16 - BASE_LR: 0.02 - STEPS: (300000, 340000) - MAX_ITER: 360000 - CHECKPOINT_PERIOD: 100000 - WARMUP_ITERS: 4000 - WARMUP_FACTOR: 0.00025 -INPUT: - MIN_SIZE_TRAIN: (256, 288, 320, 352, 384, 416, 448, 480, 512, 544, 576, 608) - MAX_SIZE_TRAIN: 900 - MAX_SIZE_TEST: 736 - MIN_SIZE_TEST: 512 \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P5_640_16x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P5_640_16x.yaml deleted file mode 100644 index 80413a62d6..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P5_640_16x.yaml +++ /dev/null @@ -1,29 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - BACKBONE: - NAME: "build_p37_dla_bifpn_backbone" - BIFPN: - OUT_CHANNELS: 160 - NUM_LEVELS: 5 - NUM_BIFPN: 3 - CENTERNET: - POST_NMS_TOPK_TEST: 128 - WEIGHTS: '' - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.12, 57.375] - FPN: - IN_FEATURES: ["dla3", "dla4", "dla5"] -SOLVER: - LR_SCHEDULER_NAME: "WarmupCosineLR" - MAX_ITER: 360000 - BASE_LR: 0.08 - IMS_PER_BATCH: 64 - CHECKPOINT_PERIOD: 90000 -TEST: - EVAL_PERIOD: 7500 -INPUT: - FORMAT: RGB - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 640 - MIN_SIZE_TEST: 608 - MAX_SIZE_TEST: 900 diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P5_640_16x_ST.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P5_640_16x_ST.yaml deleted file mode 100644 index 8813b39c1c..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-BiFPN-P5_640_16x_ST.yaml +++ /dev/null @@ -1,30 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - BACKBONE: - NAME: "build_p37_dla_bifpn_backbone" - BIFPN: - OUT_CHANNELS: 160 - NUM_LEVELS: 5 - NUM_BIFPN: 3 - CENTERNET: - POST_NMS_TOPK_TEST: 128 - WEIGHTS: '' - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.12, 57.375] - FPN: - IN_FEATURES: ["dla3", "dla4", "dla5"] -SOLVER: - LR_SCHEDULER_NAME: "WarmupCosineLR" - MAX_ITER: 360000 - BASE_LR: 0.08 - IMS_PER_BATCH: 64 -TEST: - EVAL_PERIOD: 7500 -INPUT: - FORMAT: RGB - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 640 - MIN_SIZE_TEST: 608 - MAX_SIZE_TEST: 900 -DATASETS: - TRAIN: ("coco_2017_train","coco_un_yolov4_55_0.5",) diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-fcosBiFPN-P5_640_16x_ST.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-fcosBiFPN-P5_640_16x_ST.yaml deleted file mode 100644 index f94f1358ce..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_DLA-fcosBiFPN-P5_640_16x_ST.yaml +++ /dev/null @@ -1,30 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - BACKBONE: - NAME: "build_p37_fcos_dla_bifpn_backbone" - BIFPN: - OUT_CHANNELS: 160 - NUM_LEVELS: 5 - NUM_BIFPN: 3 - CENTERNET: - POST_NMS_TOPK_TEST: 128 - WEIGHTS: '' - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.12, 57.375] - FPN: - IN_FEATURES: ["dla3", "dla4", "dla5"] -TEST: - EVAL_PERIOD: 7500 -SOLVER: - LR_SCHEDULER_NAME: "WarmupCosineLR" - MAX_ITER: 360000 - BASE_LR: 0.08 - IMS_PER_BATCH: 64 -INPUT: - FORMAT: RGB - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 640 - MIN_SIZE_TEST: 608 - MAX_SIZE_TEST: 900 -DATASETS: - TRAIN: ("coco_2017_train","coco_un_yolov4_55_0.5",) diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN-BiFPN_1280_4x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN-BiFPN_1280_4x.yaml deleted file mode 100644 index e07574b351..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN-BiFPN_1280_4x.yaml +++ /dev/null @@ -1,32 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - BACKBONE: - NAME: "build_res2net_bifpn_backbone" - BIFPN: - NUM_BIFPN: 7 - OUT_CHANNELS: 288 - WEIGHTS: "output/r2_101.pkl" - RESNETS: - DEPTH: 101 - WIDTH_PER_GROUP: 26 - DEFORM_ON_PER_STAGE: [False, False, True, True] # on Res4, Res5 - DEFORM_MODULATED: True - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.12, 57.375] - CENTERNET: - USE_DEFORMABLE: True - ROI_HEADS: - IN_FEATURES: ["p3", "p4"] -INPUT: - FORMAT: RGB -TEST: - EVAL_PERIOD: 7500 -SOLVER: - MAX_ITER: 180000 - CHECKPOINT_PERIOD: 60000 - LR_SCHEDULER_NAME: "WarmupCosineLR" - BASE_LR: 0.04 - IMS_PER_BATCH: 32 -INPUT: - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 1280 diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN-BiFPN_4x+4x_1560_ST.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN-BiFPN_4x+4x_1560_ST.yaml deleted file mode 100644 index 81fcab0972..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN-BiFPN_4x+4x_1560_ST.yaml +++ /dev/null @@ -1,36 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - BACKBONE: - NAME: "build_res2net_bifpn_backbone" - BIFPN: - NUM_BIFPN: 7 - OUT_CHANNELS: 288 - WEIGHTS: "output/r2_101.pkl" - RESNETS: - DEPTH: 101 - WIDTH_PER_GROUP: 26 - DEFORM_ON_PER_STAGE: [False, False, True, True] # on Res4, Res5 - DEFORM_MODULATED: True - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.12, 57.375] - CENTERNET: - USE_DEFORMABLE: True - ROI_HEADS: - IN_FEATURES: ["p3", "p4"] -TEST: - EVAL_PERIOD: 7500 -SOLVER: - MAX_ITER: 180000 - CHECKPOINT_PERIOD: 7500 - LR_SCHEDULER_NAME: "WarmupCosineLR" - BASE_LR: 0.04 - IMS_PER_BATCH: 32 -DATASETS: - TRAIN: "('coco_2017_train', 'coco_un_yolov4_55_0.5')" -INPUT: - FORMAT: RGB - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 1280 - TEST_SIZE: 1560 - TEST_INPUT_TYPE: 'square' - \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN_896_4x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN_896_4x.yaml deleted file mode 100644 index fd6c49ee40..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R2-101-DCN_896_4x.yaml +++ /dev/null @@ -1,29 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - BACKBONE: - NAME: "build_p67_res2net_fpn_backbone" - WEIGHTS: "output/r2_101.pkl" - RESNETS: - DEPTH: 101 - WIDTH_PER_GROUP: 26 - DEFORM_ON_PER_STAGE: [False, False, True, True] # on Res4, Res5 - DEFORM_MODULATED: True - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.12, 57.375] - CENTERNET: - USE_DEFORMABLE: True - ROI_HEADS: - IN_FEATURES: ["p3", "p4"] -INPUT: - FORMAT: RGB -TEST: - EVAL_PERIOD: 7500 -SOLVER: - MAX_ITER: 180000 - CHECKPOINT_PERIOD: 600000 - LR_SCHEDULER_NAME: "WarmupCosineLR" - BASE_LR: 0.04 - IMS_PER_BATCH: 32 -INPUT: - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 896 \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R50_1x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R50_1x.yaml deleted file mode 100644 index 9dcdf5b8b6..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_R50_1x.yaml +++ /dev/null @@ -1 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_X101-DCN_2x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_X101-DCN_2x.yaml deleted file mode 100644 index 009c68085b..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/CenterNet2_X101-DCN_2x.yaml +++ /dev/null @@ -1,22 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - CENTERNET: - USE_DEFORMABLE: True - WEIGHTS: "detectron2://ImageNetPretrained/FAIR/X-101-32x8d.pkl" - PIXEL_STD: [57.375, 57.120, 58.395] - RESNETS: - STRIDE_IN_1X1: False - NUM_GROUPS: 32 - WIDTH_PER_GROUP: 8 - DEPTH: 101 - DEFORM_ON_PER_STAGE: [False, False, True, True] # on Res4, Res5 - DEFORM_MODULATED: True - ROI_HEADS: - IN_FEATURES: ["p3", "p4"] -SOLVER: - STEPS: (120000, 160000) - MAX_ITER: 180000 - CHECKPOINT_PERIOD: 40000 -INPUT: - MIN_SIZE_TRAIN: (480, 960) - MIN_SIZE_TRAIN_SAMPLING: "range" diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/LVIS_CenterNet2_R50_1x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/LVIS_CenterNet2_R50_1x.yaml deleted file mode 100644 index 912e8925dc..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/LVIS_CenterNet2_R50_1x.yaml +++ /dev/null @@ -1,17 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - ROI_HEADS: - NUM_CLASSES: 1203 - SCORE_THRESH_TEST: 0.02 - NMS_THRESH_TEST: 0.5 - CENTERNET: - NUM_CLASSES: 1203 - -DATASETS: - TRAIN: ("lvis_v1_train",) - TEST: ("lvis_v1_val",) -DATALOADER: - SAMPLER_TRAIN: "RepeatFactorTrainingSampler" - REPEAT_THRESHOLD: 0.001 -TEST: - DETECTIONS_PER_IMAGE: 300 diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/LVIS_CenterNet2_R50_Fed_1x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/LVIS_CenterNet2_R50_Fed_1x.yaml deleted file mode 100644 index d6b6c823f2..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/LVIS_CenterNet2_R50_Fed_1x.yaml +++ /dev/null @@ -1,19 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - ROI_HEADS: - NUM_CLASSES: 1203 - SCORE_THRESH_TEST: 0.02 - NMS_THRESH_TEST: 0.5 - CENTERNET: - NUM_CLASSES: 1203 - ROI_BOX_HEAD: - USE_SIGMOID_CE: True - USE_FED_LOSS: True -DATASETS: - TRAIN: ("lvis_v1_train",) - TEST: ("lvis_v1_val",) -DATALOADER: - SAMPLER_TRAIN: "RepeatFactorTrainingSampler" - REPEAT_THRESHOLD: 0.001 -TEST: - DETECTIONS_PER_IMAGE: 300 diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/O365_CenterNet2_R50_1x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/O365_CenterNet2_R50_1x.yaml deleted file mode 100644 index 514e52cddc..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/O365_CenterNet2_R50_1x.yaml +++ /dev/null @@ -1,13 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - ROI_HEADS: - NUM_CLASSES: 365 - CENTERNET: - NUM_CLASSES: 365 -DATASETS: - TRAIN: ("objects365_train",) - TEST: ("objects365_val",) -DATALOADER: - SAMPLER_TRAIN: "ClassAwareSampler" -TEST: - DETECTIONS_PER_IMAGE: 300 \ No newline at end of file diff --git a/dimos/models/Detic/third_party/CenterNet2/configs/nuImages_CenterNet2_DLA_640_8x.yaml b/dimos/models/Detic/third_party/CenterNet2/configs/nuImages_CenterNet2_DLA_640_8x.yaml deleted file mode 100644 index c400e92ce7..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/configs/nuImages_CenterNet2_DLA_640_8x.yaml +++ /dev/null @@ -1,42 +0,0 @@ -_BASE_: "Base-CenterNet2.yaml" -MODEL: - MASK_ON: True - ROI_MASK_HEAD: - NAME: "MaskRCNNConvUpsampleHead" - NUM_CONV: 4 - POOLER_RESOLUTION: 14 - ROI_HEADS: - NUM_CLASSES: 10 - IN_FEATURES: ["dla2"] - BACKBONE: - NAME: "build_dla_backbone" - DLA: - NORM: "BN" - CENTERNET: - IN_FEATURES: ["dla2"] - FPN_STRIDES: [4] - SOI: [[0, 1000000]] - NUM_CLS_CONVS: 1 - NUM_BOX_CONVS: 1 - REG_WEIGHT: 1. - MORE_POS: True - HM_FOCAL_ALPHA: 0.25 - POST_NMS_TOPK_TEST: 128 - WEIGHTS: '' - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.12, 57.375] -SOLVER: - MAX_ITER: 180000 - STEPS: (120000, 160000) - BASE_LR: 0.08 - IMS_PER_BATCH: 64 -INPUT: - FORMAT: RGB - CUSTOM_AUG: EfficientDetResizeCrop - TRAIN_SIZE: 640 - MIN_SIZE_TEST: 608 - MAX_SIZE_TEST: 900 - MASK_FORMAT: bitmask -DATASETS: - TRAIN: ("nuimages_train",) - TEST: ("nuimages_val",) diff --git a/dimos/models/Detic/third_party/CenterNet2/datasets/README.md b/dimos/models/Detic/third_party/CenterNet2/datasets/README.md deleted file mode 100644 index 0eb44cc3b2..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/datasets/README.md +++ /dev/null @@ -1,140 +0,0 @@ -# Use Builtin Datasets - -A dataset can be used by accessing [DatasetCatalog](https://detectron2.readthedocs.io/modules/data.html#detectron2.data.DatasetCatalog) -for its data, or [MetadataCatalog](https://detectron2.readthedocs.io/modules/data.html#detectron2.data.MetadataCatalog) for its metadata (class names, etc). -This document explains how to setup the builtin datasets so they can be used by the above APIs. -[Use Custom Datasets](https://detectron2.readthedocs.io/tutorials/datasets.html) gives a deeper dive on how to use `DatasetCatalog` and `MetadataCatalog`, -and how to add new datasets to them. - -Detectron2 has builtin support for a few datasets. -The datasets are assumed to exist in a directory specified by the environment variable -`DETECTRON2_DATASETS`. -Under this directory, detectron2 will look for datasets in the structure described below, if needed. -``` -$DETECTRON2_DATASETS/ - coco/ - lvis/ - cityscapes/ - VOC20{07,12}/ -``` - -You can set the location for builtin datasets by `export DETECTRON2_DATASETS=/path/to/datasets`. -If left unset, the default is `./datasets` relative to your current working directory. - -The [model zoo](https://github.com/facebookresearch/detectron2/blob/master/MODEL_ZOO.md) -contains configs and models that use these builtin datasets. - -## Expected dataset structure for [COCO instance/keypoint detection](https://cocodataset.org/#download): - -``` -coco/ - annotations/ - instances_{train,val}2017.json - person_keypoints_{train,val}2017.json - {train,val}2017/ - # image files that are mentioned in the corresponding json -``` - -You can use the 2014 version of the dataset as well. - -Some of the builtin tests (`dev/run_*_tests.sh`) uses a tiny version of the COCO dataset, -which you can download with `./datasets/prepare_for_tests.sh`. - -## Expected dataset structure for PanopticFPN: - -Extract panoptic annotations from [COCO website](https://cocodataset.org/#download) -into the following structure: -``` -coco/ - annotations/ - panoptic_{train,val}2017.json - panoptic_{train,val}2017/ # png annotations - panoptic_stuff_{train,val}2017/ # generated by the script mentioned below -``` - -Install panopticapi by: -``` -pip install git+https://github.com/cocodataset/panopticapi.git -``` -Then, run `python datasets/prepare_panoptic_fpn.py`, to extract semantic annotations from panoptic annotations. - -## Expected dataset structure for [LVIS instance segmentation](https://www.lvisdataset.org/dataset): -``` -coco/ - {train,val,test}2017/ -lvis/ - lvis_v0.5_{train,val}.json - lvis_v0.5_image_info_test.json - lvis_v1_{train,val}.json - lvis_v1_image_info_test{,_challenge}.json -``` - -Install lvis-api by: -``` -pip install git+https://github.com/lvis-dataset/lvis-api.git -``` - -To evaluate models trained on the COCO dataset using LVIS annotations, -run `python datasets/prepare_cocofied_lvis.py` to prepare "cocofied" LVIS annotations. - -## Expected dataset structure for [cityscapes](https://www.cityscapes-dataset.com/downloads/): -``` -cityscapes/ - gtFine/ - train/ - aachen/ - color.png, instanceIds.png, labelIds.png, polygons.json, - labelTrainIds.png - ... - val/ - test/ - # below are generated Cityscapes panoptic annotation - cityscapes_panoptic_train.json - cityscapes_panoptic_train/ - cityscapes_panoptic_val.json - cityscapes_panoptic_val/ - cityscapes_panoptic_test.json - cityscapes_panoptic_test/ - leftImg8bit/ - train/ - val/ - test/ -``` -Install cityscapes scripts by: -``` -pip install git+https://github.com/mcordts/cityscapesScripts.git -``` - -Note: to create labelTrainIds.png, first prepare the above structure, then run cityscapesescript with: -``` -CITYSCAPES_DATASET=/path/to/abovementioned/cityscapes python cityscapesscripts/preparation/createTrainIdLabelImgs.py -``` -These files are not needed for instance segmentation. - -Note: to generate Cityscapes panoptic dataset, run cityscapesescript with: -``` -CITYSCAPES_DATASET=/path/to/abovementioned/cityscapes python cityscapesscripts/preparation/createPanopticImgs.py -``` -These files are not needed for semantic and instance segmentation. - -## Expected dataset structure for [Pascal VOC](http://host.robots.ox.ac.uk/pascal/VOC/index.html): -``` -VOC20{07,12}/ - Annotations/ - ImageSets/ - Main/ - trainval.txt - test.txt - # train.txt or val.txt, if you use these splits - JPEGImages/ -``` - -## Expected dataset structure for [ADE20k Scene Parsing](http://sceneparsing.csail.mit.edu/): -``` -ADEChallengeData2016/ - annotations/ - annotations_detectron2/ - images/ - objectInfo150.txt -``` -The directory `annotations_detectron2` is generated by running `python datasets/prepare_ade20k_sem_seg.py`. diff --git a/dimos/models/Detic/third_party/CenterNet2/demo.py b/dimos/models/Detic/third_party/CenterNet2/demo.py deleted file mode 100644 index 3177d838ac..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/demo.py +++ /dev/null @@ -1,183 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import argparse -import glob -import multiprocessing as mp -import os -import time - -from centernet.config import add_centernet_config -import cv2 -from detectron2.config import get_cfg -from detectron2.data.detection_utils import read_image -from detectron2.utils.logger import setup_logger -from predictor import VisualizationDemo -import tqdm - -# constants -WINDOW_NAME = "CenterNet2 detections" - -from detectron2.data import MetadataCatalog -from detectron2.utils.video_visualizer import VideoVisualizer -from detectron2.utils.visualizer import ColorMode - - -def setup_cfg(args): - # load config from file and command-line arguments - cfg = get_cfg() - add_centernet_config(cfg) - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - # Set score_threshold for builtin models - cfg.MODEL.RETINANET.SCORE_THRESH_TEST = args.confidence_threshold - cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = args.confidence_threshold - if cfg.MODEL.META_ARCHITECTURE in ["ProposalNetwork", "CenterNetDetector"]: - cfg.MODEL.CENTERNET.INFERENCE_TH = args.confidence_threshold - cfg.MODEL.CENTERNET.NMS_TH = cfg.MODEL.ROI_HEADS.NMS_THRESH_TEST - cfg.MODEL.PANOPTIC_FPN.COMBINE.INSTANCES_CONFIDENCE_THRESH = args.confidence_threshold - cfg.freeze() - return cfg - - -def get_parser(): - parser = argparse.ArgumentParser(description="Detectron2 demo for builtin models") - parser.add_argument( - "--config-file", - default="configs/quick_schedules/mask_rcnn_R_50_FPN_inference_acc_test.yaml", - metavar="FILE", - help="path to config file", - ) - parser.add_argument("--webcam", action="store_true", help="Take inputs from webcam.") - parser.add_argument("--video-input", help="Path to video file.") - parser.add_argument("--input", nargs="+", help="A list of space separated input images") - parser.add_argument( - "--output", - help="A file or directory to save output visualizations. If not given, will show output in an OpenCV window.", - ) - - parser.add_argument( - "--confidence-threshold", - type=float, - default=0.3, - help="Minimum score for instance predictions to be shown", - ) - parser.add_argument( - "--opts", - help="Modify config options using the command-line 'KEY VALUE' pairs", - default=[], - nargs=argparse.REMAINDER, - ) - return parser - - -if __name__ == "__main__": - mp.set_start_method("spawn", force=True) - args = get_parser().parse_args() - logger = setup_logger() - logger.info("Arguments: " + str(args)) - - cfg = setup_cfg(args) - - demo = VisualizationDemo(cfg) - output_file = None - if args.input: - if len(args.input) == 1: - args.input = glob.glob(os.path.expanduser(args.input[0])) - files = os.listdir(args.input[0]) - args.input = [args.input[0] + x for x in files] - assert args.input, "The input path(s) was not found" - visualizer = VideoVisualizer( - MetadataCatalog.get(cfg.DATASETS.TEST[0] if len(cfg.DATASETS.TEST) else "__unused"), - instance_mode=ColorMode.IMAGE, - ) - for path in tqdm.tqdm(args.input, disable=not args.output): - # use PIL, to be consistent with evaluation - img = read_image(path, format="BGR") - start_time = time.time() - predictions, visualized_output = demo.run_on_image(img, visualizer=visualizer) - if "instances" in predictions: - logger.info( - "{}: detected {} instances in {:.2f}s".format( - path, len(predictions["instances"]), time.time() - start_time - ) - ) - else: - logger.info( - "{}: detected {} instances in {:.2f}s".format( - path, len(predictions["proposals"]), time.time() - start_time - ) - ) - - if args.output: - if os.path.isdir(args.output): - assert os.path.isdir(args.output), args.output - out_filename = os.path.join(args.output, os.path.basename(path)) - visualized_output.save(out_filename) - else: - # assert len(args.input) == 1, "Please specify a directory with args.output" - # out_filename = args.output - if output_file is None: - width = visualized_output.get_image().shape[1] - height = visualized_output.get_image().shape[0] - frames_per_second = 15 - output_file = cv2.VideoWriter( - filename=args.output, - # some installation of opencv may not support x264 (due to its license), - # you can try other format (e.g. MPEG) - fourcc=cv2.VideoWriter_fourcc(*"x264"), - fps=float(frames_per_second), - frameSize=(width, height), - isColor=True, - ) - output_file.write(visualized_output.get_image()[:, :, ::-1]) - else: - # cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL) - cv2.imshow(WINDOW_NAME, visualized_output.get_image()[:, :, ::-1]) - if cv2.waitKey(1) == 27: - break # esc to quit - elif args.webcam: - assert args.input is None, "Cannot have both --input and --webcam!" - cam = cv2.VideoCapture(0) - for vis in tqdm.tqdm(demo.run_on_video(cam)): - cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL) - cv2.imshow(WINDOW_NAME, vis) - if cv2.waitKey(1) == 27: - break # esc to quit - cv2.destroyAllWindows() - elif args.video_input: - video = cv2.VideoCapture(args.video_input) - width = int(video.get(cv2.CAP_PROP_FRAME_WIDTH)) - height = int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)) - frames_per_second = 15 # video.get(cv2.CAP_PROP_FPS) - num_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) - basename = os.path.basename(args.video_input) - - if args.output: - if os.path.isdir(args.output): - output_fname = os.path.join(args.output, basename) - output_fname = os.path.splitext(output_fname)[0] + ".mkv" - else: - output_fname = args.output - # assert not os.path.isfile(output_fname), output_fname - output_file = cv2.VideoWriter( - filename=output_fname, - # some installation of opencv may not support x264 (due to its license), - # you can try other format (e.g. MPEG) - fourcc=cv2.VideoWriter_fourcc(*"x264"), - fps=float(frames_per_second), - frameSize=(width, height), - isColor=True, - ) - assert os.path.isfile(args.video_input) - for vis_frame in tqdm.tqdm(demo.run_on_video(video), total=num_frames): - if args.output: - output_file.write(vis_frame) - - cv2.namedWindow(basename, cv2.WINDOW_NORMAL) - cv2.imshow(basename, vis_frame) - if cv2.waitKey(1) == 27: - break # esc to quit - video.release() - if args.output: - output_file.release() - else: - cv2.destroyAllWindows() diff --git a/dimos/models/Detic/third_party/CenterNet2/docs/MODEL_ZOO.md b/dimos/models/Detic/third_party/CenterNet2/docs/MODEL_ZOO.md deleted file mode 100644 index 97063b95c8..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/docs/MODEL_ZOO.md +++ /dev/null @@ -1,73 +0,0 @@ -# MODEL_ZOO - -### Common settings and notes - -- Multiscale training is used by default in all models. The results are all reported using single-scale testing. -- We report runtime on our local workstation with a TitanXp GPU and a Titan RTX GPU. -- All models are trained on 8-GPU servers by default. The 1280 models are trained on 24G GPUs. Reducing the batchsize with the linear learning rate rule should be fine. -- All models can be downloaded directly from [Google drive](https://drive.google.com/drive/folders/1meZIsz8E3Ia9CRxLOAULDLeYrKMhhjJE). - - -## COCO - -### CenterNet - -| Model | val mAP | FPS (Titan Xp/ Titan RTX) | links | -|-------------------------------------------|---------|---------|-----------| -| CenterNet-S4_DLA_8x | 42.5 | 50 / 71 |[config](../configs/CenterNet-S4_DLA_8x.yaml)/[model](https://drive.google.com/file/d/1AVfs9OoLePk_sqTPvqdRi1cXmO2cD0W_)| -| CenterNet-FPN_R50_1x | 40.2 | 20 / 24 |[config](../configs/CenterNet-FPN_R50_1x.yaml)/[model](https://drive.google.com/file/d/1iYlmjsBt9YIcaI8NzEwiMoaDDMHRmcR9)| - -#### Note - -- `CenterNet-S4_DLA_8x` is a re-implemented version of the original CenterNet (stride 4), with several changes, including - - Using top-left-right-bottom box encoding and GIoU Loss; adding regression loss to the center 3x3 region. - - Adding more positive pixels for the heatmap loss whose regression loss is small and is within the center3x3 region. - - Using more heavy crop augmentation (EfficientDet-style crop ratio 0.1-2), and removing color augmentations. - - Using standard NMS instead of max pooling. - - Using RetinaNet-style optimizer (SGD), learning rate rule (0.01 for each batch size 16), and schedule (8x12 epochs). -- `CenterNet-FPN_R50_1x` is a (new) FPN version of CenterNet. It includes the changes above, and assigns objects to FPN levels based on a fixed size range. The model is trained with standard short edge 640-800 multi-scale training with 12 epochs (1x). - - -### CenterNet2 - -| Model | val mAP | FPS (Titan Xp/ Titan RTX) | links | -|-------------------------------------------|---------|---------|-----------| -| CenterNet2-F_R50_1x | 41.7 | 22 / 27 |[config](../configs/CenterNet2-F_R50_1x.yaml)/[model](X)| -| CenterNet2_R50_1x | 42.9 | 18 / 24 |[config](../configs/CenterNet2_R50_1x.yaml)/[model](https://drive.google.com/file/d/1Qn0E_F1cmXtKPEdyZ_lSt-bnM9NueQpq)| -| CenterNet2_X101-DCN_2x | 49.9 | 6 / 8 |[config](../configs/CenterNet2_X101-DCN_2x.yaml)/[model](https://drive.google.com/file/d/1yuJbIlUgMiXdaDWRWArcsRsSoHti9e1y)| -| CenterNet2_DLA-BiFPN-P3_4x | 43.8 | 40 / 50|[config](../configs/CenterNet2_DLA-BiFPN-P3_4x.yaml)/[model](https://drive.google.com/file/d/1UGrnOE0W8Tgu6ffcCOQEbeUgThtDkbuQ)| -| CenterNet2_DLA-BiFPN-P3_24x | 45.6 | 40 / 50 |[config](../configs/CenterNet2_DLA-BiFPN-P3_24x.yaml)/[model](https://drive.google.com/file/d/17osgvr_Zhp9SS2uMa_YLiKwkKJIDtwPZ)| -| CenterNet2_R2-101-DCN_896_4x | 51.2 | 9 / 13 |[config](../configs/CenterNet2_R2-101-DCN_896_4x.yaml)/[model](https://drive.google.com/file/d/1YiJm7UtMstl63E8I4qQ8owteYC5zRFuQ)| -| CenterNet2_R2-101-DCN-BiFPN_1280_4x | 52.9 | 6 / 8 |[config](../configs/CenterNet2_R2-101-DCN-BiFPN_1280_4x.yaml)/[model](https://drive.google.com/file/d/1BIfEH04Lm3EvW9ov76yEPntUOJxaVoKd)| -| CenterNet2_R2-101-DCN-BiFPN_4x+4x_1560_ST | 56.1 | 3 / 5 |[config](../configs/CenterNet2_R2-101-DCN-BiFPN_4x+4x_1560_ST.yaml)/[model](https://drive.google.com/file/d/1GZyzJLB3FTcs8C7MpZRQWw44liYPyOMD)| -| CenterNet2_DLA-BiFPN-P5_640_24x_ST | 49.2 | 33 / 38 |[config](../configs/CenterNet2_DLA-BiFPN-P5_640_24x_ST.yaml)/[model](https://drive.google.com/file/d/1pGXpnHhvi66my_p5dASTnTjvaaj0FEvE)| - -#### Note - -- `CenterNet2-F_R50_1x` uses Faster RCNN as the second stage. All other CenterNet2 models use Cascade RCNN as the second stage. -- `CenterNet2_DLA-BiFPN-P3_4x` follows the same training setting as [realtime-FCOS](https://github.com/aim-uofa/AdelaiDet/blob/master/configs/FCOS-Detection/README.md). -- `CenterNet2_DLA-BiFPN-P3_24x` is trained by repeating the `4x` schedule (starting from learning rate 0.01) 6 times. -- R2 means [Res2Net](https://github.com/Res2Net/Res2Net-detectron2) backbone. To train Res2Net models, you need to download the ImageNet pre-trained weight [here](https://github.com/Res2Net/Res2Net-detectron2) and place it in `output/r2_101.pkl`. -- The last 4 models in the table are trained with the EfficientDet-style resize-and-crop augmentation, instead of the default random resizing short edge in detectron2. We found this trains faster (per-iteration) and gives better performance under a long schedule. -- `_ST` means using [self-training](https://arxiv.org/abs/2006.06882) using pseudo-labels produced by [Scaled-YOLOv4](https://github.com/WongKinYiu/ScaledYOLOv4) on COCO unlabeled images, with a hard score threshold 0.5. Our processed pseudo-labels can be downloaded [here](https://drive.google.com/file/d/1R9tHlUaIrujmK6T08yJ0T77b2XzekisC). -- `CenterNet2_R2-101-DCN-BiFPN_4x+4x_1560_ST` finetunes from `CenterNet2_R2-101-DCN-BiFPN_1280_4x` for an additional `4x` schedule with the self-training data. It is trained under `1280x1280` but tested under `1560x1560`. - -## LVIS v1 - -| Model | val mAP box | links | -|-------------------------------------------|--------------|-----------| -| LVIS_CenterNet2_R50_1x | 26.5 |[config](../configs/LVIS_CenterNet2_R50_1x.yaml)/[model](https://drive.google.com/file/d/1oOOKEDQIWW19AHhfnTb7HYZ3Z9gkZn_K)| -| LVIS_CenterNet2_R50_Fed_1x | 28.3 |[config](../configs/LVIS_CenterNet2_R50_Fed_1x.yaml)/[model](https://drive.google.com/file/d/1ETurGA7KIC5XMkMBI8MOIMDD_iJyMTif)| - -- The models are trained with repeat-factor sampling. -- `LVIS_CenterNet2_R50_Fed_1x` is CenterNet2 with our federated loss. Check our Appendix D of our [paper](https://arxiv.org/abs/2103.07461) or our [technical report at LVIS challenge](https://www.lvisdataset.org/assets/challenge_reports/2020/CenterNet2.pdf) for references. - -## Objects365 - -| Model | val mAP| links | -|-------------------------------------------|---------|-----------| -| O365_CenterNet2_R50_1x | 22.6 |[config](../configs/O365_CenterNet2_R50_1x.yaml)/[model](https://drive.google.com/file/d/11d1Qx75otBAQQL2raxMTVJb17Qr56M3O)| - -#### Note -- Objects365 dataset can be downloaded [here](https://www.objects365.org/overview.html). -- The model is trained with class-aware sampling. diff --git a/dimos/models/Detic/third_party/CenterNet2/predictor.py b/dimos/models/Detic/third_party/CenterNet2/predictor.py deleted file mode 100644 index 0bdee56264..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/predictor.py +++ /dev/null @@ -1,241 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import atexit -import bisect -from collections import deque -import multiprocessing as mp - -import cv2 -from detectron2.data import MetadataCatalog -from detectron2.engine.defaults import DefaultPredictor -from detectron2.utils.video_visualizer import VideoVisualizer -from detectron2.utils.visualizer import ColorMode, Visualizer -import torch - - -class VisualizationDemo: - def __init__(self, cfg, instance_mode=ColorMode.IMAGE, parallel: bool=False) -> None: - """ - Args: - cfg (CfgNode): - instance_mode (ColorMode): - parallel (bool): whether to run the model in different processes from visualization. - Useful since the visualization logic can be slow. - """ - self.metadata = MetadataCatalog.get( - cfg.DATASETS.TRAIN[0] if len(cfg.DATASETS.TRAIN) else "__unused" - ) - self.cpu_device = torch.device("cpu") - self.instance_mode = instance_mode - - self.parallel = parallel - if parallel: - num_gpu = torch.cuda.device_count() - self.predictor = AsyncPredictor(cfg, num_gpus=num_gpu) - else: - self.predictor = DefaultPredictor(cfg) - - def run_on_image(self, image, visualizer=None): - """ - Args: - image (np.ndarray): an image of shape (H, W, C) (in BGR order). - This is the format used by OpenCV. - - Returns: - predictions (dict): the output of the model. - vis_output (VisImage): the visualized image output. - """ - vis_output = None - predictions = self.predictor(image) - # Convert image from OpenCV BGR format to Matplotlib RGB format. - image = image[:, :, ::-1] - use_video_vis = True - if visualizer is None: - use_video_vis = False - visualizer = Visualizer(image, self.metadata, instance_mode=self.instance_mode) - if "panoptic_seg" in predictions: - panoptic_seg, segments_info = predictions["panoptic_seg"] - vis_output = visualizer.draw_panoptic_seg_predictions( - panoptic_seg.to(self.cpu_device), segments_info - ) - else: - if "sem_seg" in predictions: - vis_output = visualizer.draw_sem_seg( - predictions["sem_seg"].argmax(dim=0).to(self.cpu_device) - ) - if "instances" in predictions: - instances = predictions["instances"].to(self.cpu_device) - if use_video_vis: - vis_output = visualizer.draw_instance_predictions(image, predictions=instances) - else: - vis_output = visualizer.draw_instance_predictions(predictions=instances) - elif "proposals" in predictions: - instances = predictions["proposals"].to(self.cpu_device) - instances.pred_boxes = instances.proposal_boxes - instances.scores = instances.objectness_logits - instances.pred_classes[:] = -1 - if use_video_vis: - vis_output = visualizer.draw_instance_predictions(image, predictions=instances) - else: - vis_output = visualizer.draw_instance_predictions(predictions=instances) - - return predictions, vis_output - - def _frame_from_video(self, video): - while video.isOpened(): - success, frame = video.read() - if success: - yield frame - else: - break - - def run_on_video(self, video): - """ - Visualizes predictions on frames of the input video. - - Args: - video (cv2.VideoCapture): a :class:`VideoCapture` object, whose source can be - either a webcam or a video file. - - Yields: - ndarray: BGR visualizations of each video frame. - """ - video_visualizer = VideoVisualizer(self.metadata, self.instance_mode) - - def process_predictions(frame, predictions): - frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) - if "panoptic_seg" in predictions: - panoptic_seg, segments_info = predictions["panoptic_seg"] - vis_frame = video_visualizer.draw_panoptic_seg_predictions( - frame, panoptic_seg.to(self.cpu_device), segments_info - ) - elif "instances" in predictions: - predictions = predictions["instances"].to(self.cpu_device) - vis_frame = video_visualizer.draw_instance_predictions(frame, predictions) - elif "sem_seg" in predictions: - vis_frame = video_visualizer.draw_sem_seg( - frame, predictions["sem_seg"].argmax(dim=0).to(self.cpu_device) - ) - elif "proposals" in predictions: - predictions = predictions["proposals"].to(self.cpu_device) - predictions.pred_boxes = predictions.proposal_boxes - predictions.scores = predictions.objectness_logits - predictions.pred_classes[:] = -1 - vis_frame = video_visualizer.draw_instance_predictions(frame, predictions) - - # Converts Matplotlib RGB format to OpenCV BGR format - vis_frame = cv2.cvtColor(vis_frame.get_image(), cv2.COLOR_RGB2BGR) - return vis_frame - - frame_gen = self._frame_from_video(video) - if self.parallel: - buffer_size = self.predictor.default_buffer_size - - frame_data = deque() - - for cnt, frame in enumerate(frame_gen): - frame_data.append(frame) - self.predictor.put(frame) - - if cnt >= buffer_size: - frame = frame_data.popleft() - predictions = self.predictor.get() - yield process_predictions(frame, predictions) - - while len(frame_data): - frame = frame_data.popleft() - predictions = self.predictor.get() - yield process_predictions(frame, predictions) - else: - for frame in frame_gen: - yield process_predictions(frame, self.predictor(frame)) - - -class AsyncPredictor: - """ - A predictor that runs the model asynchronously, possibly on >1 GPUs. - Because rendering the visualization takes considerably amount of time, - this helps improve throughput when rendering videos. - """ - - class _StopToken: - pass - - class _PredictWorker(mp.Process): - def __init__(self, cfg, task_queue, result_queue) -> None: - self.cfg = cfg - self.task_queue = task_queue - self.result_queue = result_queue - super().__init__() - - def run(self) -> None: - predictor = DefaultPredictor(self.cfg) - - while True: - task = self.task_queue.get() - if isinstance(task, AsyncPredictor._StopToken): - break - idx, data = task - result = predictor(data) - self.result_queue.put((idx, result)) - - def __init__(self, cfg, num_gpus: int = 1) -> None: - """ - Args: - cfg (CfgNode): - num_gpus (int): if 0, will run on CPU - """ - num_workers = max(num_gpus, 1) - self.task_queue = mp.Queue(maxsize=num_workers * 3) - self.result_queue = mp.Queue(maxsize=num_workers * 3) - self.procs = [] - for gpuid in range(max(num_gpus, 1)): - cfg = cfg.clone() - cfg.defrost() - cfg.MODEL.DEVICE = f"cuda:{gpuid}" if num_gpus > 0 else "cpu" - self.procs.append( - AsyncPredictor._PredictWorker(cfg, self.task_queue, self.result_queue) - ) - - self.put_idx = 0 - self.get_idx = 0 - self.result_rank = [] - self.result_data = [] - - for p in self.procs: - p.start() - atexit.register(self.shutdown) - - def put(self, image) -> None: - self.put_idx += 1 - self.task_queue.put((self.put_idx, image)) - - def get(self): - self.get_idx += 1 # the index needed for this request - if len(self.result_rank) and self.result_rank[0] == self.get_idx: - res = self.result_data[0] - del self.result_data[0], self.result_rank[0] - return res - - while True: - # make sure the results are returned in the correct order - idx, res = self.result_queue.get() - if idx == self.get_idx: - return res - insert = bisect.bisect(self.result_rank, idx) - self.result_rank.insert(insert, idx) - self.result_data.insert(insert, res) - - def __len__(self) -> int: - return self.put_idx - self.get_idx - - def __call__(self, image): - self.put(image) - return self.get() - - def shutdown(self) -> None: - for _ in self.procs: - self.task_queue.put(AsyncPredictor._StopToken()) - - @property - def default_buffer_size(self): - return len(self.procs) * 5 diff --git a/dimos/models/Detic/third_party/CenterNet2/requirements.txt b/dimos/models/Detic/third_party/CenterNet2/requirements.txt deleted file mode 100644 index 0dd006bbc3..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/requirements.txt +++ /dev/null @@ -1 +0,0 @@ -opencv-python diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/README.md b/dimos/models/Detic/third_party/CenterNet2/tools/README.md deleted file mode 100644 index 0b40d5319c..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/README.md +++ /dev/null @@ -1,49 +0,0 @@ - -This directory contains a few example scripts that demonstrate features of detectron2. - - -* `train_net.py` - -An example training script that's made to train builtin models of detectron2. - -For usage, see [GETTING_STARTED.md](../GETTING_STARTED.md). - -* `plain_train_net.py` - -Similar to `train_net.py`, but implements a training loop instead of using `Trainer`. -This script includes fewer features but it may be more friendly to hackers. - -* `benchmark.py` - -Benchmark the training speed, inference speed or data loading speed of a given config. - -Usage: -``` -python benchmark.py --config-file config.yaml --task train/eval/data [optional DDP flags] -``` - -* `analyze_model.py` - -Analyze FLOPs, parameters, activations of a detectron2 model. See its `--help` for usage. - -* `visualize_json_results.py` - -Visualize the json instance detection/segmentation results dumped by `COCOEvalutor` or `LVISEvaluator` - -Usage: -``` -python visualize_json_results.py --input x.json --output dir/ --dataset coco_2017_val -``` -If not using a builtin dataset, you'll need your own script or modify this script. - -* `visualize_data.py` - -Visualize ground truth raw annotations or training data (after preprocessing/augmentations). - -Usage: -``` -python visualize_data.py --config-file config.yaml --source annotation/dataloader --output-dir dir/ [--show] -``` - -NOTE: the script does not stop by itself when using `--source dataloader` because a training -dataloader is usually infinite. diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/__init__.py b/dimos/models/Detic/third_party/CenterNet2/tools/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/analyze_model.py b/dimos/models/Detic/third_party/CenterNet2/tools/analyze_model.py deleted file mode 100755 index 7b7b9e3432..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/analyze_model.py +++ /dev/null @@ -1,155 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. - -from collections import Counter -import logging - -from detectron2.checkpoint import DetectionCheckpointer -from detectron2.config import CfgNode, LazyConfig, get_cfg, instantiate -from detectron2.data import build_detection_test_loader -from detectron2.engine import default_argument_parser -from detectron2.modeling import build_model -from detectron2.utils.analysis import ( - FlopCountAnalysis, - activation_count_operators, - parameter_count_table, -) -from detectron2.utils.logger import setup_logger -from fvcore.nn import flop_count_table # can also try flop_count_str -import numpy as np -import tqdm - -logger = logging.getLogger("detectron2") - - -def setup(args): - if args.config_file.endswith(".yaml"): - cfg = get_cfg() - cfg.merge_from_file(args.config_file) - cfg.DATALOADER.NUM_WORKERS = 0 - cfg.merge_from_list(args.opts) - cfg.freeze() - else: - cfg = LazyConfig.load(args.config_file) - cfg = LazyConfig.apply_overrides(cfg, args.opts) - setup_logger(name="fvcore") - setup_logger() - return cfg - - -def do_flop(cfg) -> None: - if isinstance(cfg, CfgNode): - data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0]) - model = build_model(cfg) - DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS) - else: - data_loader = instantiate(cfg.dataloader.test) - model = instantiate(cfg.model) - model.to(cfg.train.device) - DetectionCheckpointer(model).load(cfg.train.init_checkpoint) - model.eval() - - counts = Counter() - total_flops = [] - for idx, data in zip(tqdm.trange(args.num_inputs), data_loader): # noqa - flops = FlopCountAnalysis(model, data) - if idx > 0: - flops.unsupported_ops_warnings(False).uncalled_modules_warnings(False) - counts += flops.by_operator() - total_flops.append(flops.total()) - - logger.info("Flops table computed from only one input sample:\n" + flop_count_table(flops)) - logger.info( - "Average GFlops for each type of operators:\n" - + str([(k, v / (idx + 1) / 1e9) for k, v in counts.items()]) - ) - logger.info( - f"Total GFlops: {np.mean(total_flops) / 1e9:.1f}±{np.std(total_flops) / 1e9:.1f}" - ) - - -def do_activation(cfg) -> None: - if isinstance(cfg, CfgNode): - data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0]) - model = build_model(cfg) - DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS) - else: - data_loader = instantiate(cfg.dataloader.test) - model = instantiate(cfg.model) - model.to(cfg.train.device) - DetectionCheckpointer(model).load(cfg.train.init_checkpoint) - model.eval() - - counts = Counter() - total_activations = [] - for idx, data in zip(tqdm.trange(args.num_inputs), data_loader): # noqa - count = activation_count_operators(model, data) - counts += count - total_activations.append(sum(count.values())) - logger.info( - "(Million) Activations for Each Type of Operators:\n" - + str([(k, v / idx) for k, v in counts.items()]) - ) - logger.info( - f"Total (Million) Activations: {np.mean(total_activations)}±{np.std(total_activations)}" - ) - - -def do_parameter(cfg) -> None: - if isinstance(cfg, CfgNode): - model = build_model(cfg) - else: - model = instantiate(cfg.model) - logger.info("Parameter Count:\n" + parameter_count_table(model, max_depth=5)) - - -def do_structure(cfg) -> None: - if isinstance(cfg, CfgNode): - model = build_model(cfg) - else: - model = instantiate(cfg.model) - logger.info("Model Structure:\n" + str(model)) - - -if __name__ == "__main__": - parser = default_argument_parser( - epilog=""" -Examples: - -To show parameters of a model: -$ ./analyze_model.py --tasks parameter \\ - --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml - -Flops and activations are data-dependent, therefore inputs and model weights -are needed to count them: - -$ ./analyze_model.py --num-inputs 100 --tasks flop \\ - --config-file ../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_1x.yaml \\ - MODEL.WEIGHTS /path/to/model.pkl -""" - ) - parser.add_argument( - "--tasks", - choices=["flop", "activation", "parameter", "structure"], - required=True, - nargs="+", - ) - parser.add_argument( - "-n", - "--num-inputs", - default=100, - type=int, - help="number of inputs used to compute statistics for flops/activations, both are data dependent.", - ) - args = parser.parse_args() - assert not args.eval_only - assert args.num_gpus == 1 - - cfg = setup(args) - - for task in args.tasks: - { - "flop": do_flop, - "activation": do_activation, - "parameter": do_parameter, - "structure": do_structure, - }[task](cfg) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/benchmark.py b/dimos/models/Detic/third_party/CenterNet2/tools/benchmark.py deleted file mode 100755 index 48f398d83d..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/benchmark.py +++ /dev/null @@ -1,195 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. -""" -A script to benchmark builtin models. - -Note: this script has an extra dependency of psutil. -""" - -import itertools -import logging - -from detectron2.checkpoint import DetectionCheckpointer -from detectron2.config import LazyConfig, get_cfg, instantiate -from detectron2.data import ( - DatasetFromList, - build_detection_test_loader, - build_detection_train_loader, -) -from detectron2.data.benchmark import DataLoaderBenchmark -from detectron2.engine import AMPTrainer, SimpleTrainer, default_argument_parser, hooks, launch -from detectron2.modeling import build_model -from detectron2.solver import build_optimizer -from detectron2.utils import comm -from detectron2.utils.collect_env import collect_env_info -from detectron2.utils.events import CommonMetricPrinter -from detectron2.utils.logger import setup_logger -from fvcore.common.timer import Timer -import psutil -import torch -from torch.nn.parallel import DistributedDataParallel -import tqdm - -logger = logging.getLogger("detectron2") - - -def setup(args): - if args.config_file.endswith(".yaml"): - cfg = get_cfg() - cfg.merge_from_file(args.config_file) - cfg.SOLVER.BASE_LR = 0.001 # Avoid NaNs. Not useful in this script anyway. - cfg.merge_from_list(args.opts) - cfg.freeze() - else: - cfg = LazyConfig.load(args.config_file) - cfg = LazyConfig.apply_overrides(cfg, args.opts) - setup_logger(distributed_rank=comm.get_rank()) - return cfg - - -def create_data_benchmark(cfg, args): - if args.config_file.endswith(".py"): - dl_cfg = cfg.dataloader.train - dl_cfg._target_ = DataLoaderBenchmark - return instantiate(dl_cfg) - else: - kwargs = build_detection_train_loader.from_config(cfg) - kwargs.pop("aspect_ratio_grouping", None) - kwargs["_target_"] = DataLoaderBenchmark - return instantiate(kwargs) - - -def RAM_msg() -> str: - vram = psutil.virtual_memory() - return f"RAM Usage: {(vram.total - vram.available) / 1024**3:.2f}/{vram.total / 1024**3:.2f} GB" - - -def benchmark_data(args) -> None: - cfg = setup(args) - logger.info("After spawning " + RAM_msg()) - - benchmark = create_data_benchmark(cfg, args) - benchmark.benchmark_distributed(250, 10) - # test for a few more rounds - for k in range(10): - logger.info(f"Iteration {k} " + RAM_msg()) - benchmark.benchmark_distributed(250, 1) - - -def benchmark_data_advanced(args) -> None: - # benchmark dataloader with more details to help analyze performance bottleneck - cfg = setup(args) - benchmark = create_data_benchmark(cfg, args) - - if comm.get_rank() == 0: - benchmark.benchmark_dataset(100) - benchmark.benchmark_mapper(100) - benchmark.benchmark_workers(100, warmup=10) - benchmark.benchmark_IPC(100, warmup=10) - if comm.get_world_size() > 1: - benchmark.benchmark_distributed(100) - logger.info("Rerun ...") - benchmark.benchmark_distributed(100) - - -def benchmark_train(args) -> None: - cfg = setup(args) - model = build_model(cfg) - logger.info(f"Model:\n{model}") - if comm.get_world_size() > 1: - model = DistributedDataParallel( - model, device_ids=[comm.get_local_rank()], broadcast_buffers=False - ) - optimizer = build_optimizer(cfg, model) - checkpointer = DetectionCheckpointer(model, optimizer=optimizer) - checkpointer.load(cfg.MODEL.WEIGHTS) - - cfg.defrost() - cfg.DATALOADER.NUM_WORKERS = 2 - data_loader = build_detection_train_loader(cfg) - dummy_data = list(itertools.islice(data_loader, 100)) - - def f(): - data = DatasetFromList(dummy_data, copy=False, serialize=False) - while True: - yield from data - - max_iter = 400 - trainer = (AMPTrainer if cfg.SOLVER.AMP.ENABLED else SimpleTrainer)(model, f(), optimizer) - trainer.register_hooks( - [ - hooks.IterationTimer(), - hooks.PeriodicWriter([CommonMetricPrinter(max_iter)]), - hooks.TorchProfiler( - lambda trainer: trainer.iter == max_iter - 1, cfg.OUTPUT_DIR, save_tensorboard=True - ), - ] - ) - trainer.train(1, max_iter) - - -@torch.no_grad() -def benchmark_eval(args) -> None: - cfg = setup(args) - if args.config_file.endswith(".yaml"): - model = build_model(cfg) - DetectionCheckpointer(model).load(cfg.MODEL.WEIGHTS) - - cfg.defrost() - cfg.DATALOADER.NUM_WORKERS = 0 - data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0]) - else: - model = instantiate(cfg.model) - model.to(cfg.train.device) - DetectionCheckpointer(model).load(cfg.train.init_checkpoint) - - cfg.dataloader.num_workers = 0 - data_loader = instantiate(cfg.dataloader.test) - - model.eval() - logger.info(f"Model:\n{model}") - dummy_data = DatasetFromList(list(itertools.islice(data_loader, 100)), copy=False) - - def f(): - while True: - yield from dummy_data - - for k in range(5): # warmup - model(dummy_data[k]) - - max_iter = 300 - timer = Timer() - with tqdm.tqdm(total=max_iter) as pbar: - for idx, d in enumerate(f()): - if idx == max_iter: - break - model(d) - pbar.update() - logger.info(f"{max_iter} iters in {timer.seconds()} seconds.") - - -if __name__ == "__main__": - parser = default_argument_parser() - parser.add_argument("--task", choices=["train", "eval", "data", "data_advanced"], required=True) - args = parser.parse_args() - assert not args.eval_only - - logger.info("Environment info:\n" + collect_env_info()) - if "data" in args.task: - print("Initial " + RAM_msg()) - if args.task == "data": - f = benchmark_data - if args.task == "data_advanced": - f = benchmark_data_advanced - elif args.task == "train": - """ - Note: training speed may not be representative. - The training cost of a R-CNN model varies with the content of the data - and the quality of the model. - """ - f = benchmark_train - elif args.task == "eval": - f = benchmark_eval - # only benchmark single-GPU inference. - assert args.num_gpus == 1 and args.num_machines == 1 - launch(f, args.num_gpus, args.num_machines, args.machine_rank, args.dist_url, args=(args,)) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/convert-torchvision-to-d2.py b/dimos/models/Detic/third_party/CenterNet2/tools/convert-torchvision-to-d2.py deleted file mode 100755 index 8bf0565d5e..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/convert-torchvision-to-d2.py +++ /dev/null @@ -1,57 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. - -import pickle as pkl -import sys - -import torch - -""" -Usage: - # download one of the ResNet{18,34,50,101,152} models from torchvision: - wget https://download.pytorch.org/models/resnet50-19c8e357.pth -O r50.pth - # run the conversion - ./convert-torchvision-to-d2.py r50.pth r50.pkl - - # Then, use r50.pkl with the following changes in config: - -MODEL: - WEIGHTS: "/path/to/r50.pkl" - PIXEL_MEAN: [123.675, 116.280, 103.530] - PIXEL_STD: [58.395, 57.120, 57.375] - RESNETS: - DEPTH: 50 - STRIDE_IN_1X1: False -INPUT: - FORMAT: "RGB" - - These models typically produce slightly worse results than the - pre-trained ResNets we use in official configs, which are the - original ResNet models released by MSRA. -""" - -if __name__ == "__main__": - input = sys.argv[1] - - obj = torch.load(input, map_location="cpu") - - newmodel = {} - for k in list(obj.keys()): - old_k = k - if "layer" not in k: - k = "stem." + k - for t in [1, 2, 3, 4]: - k = k.replace(f"layer{t}", f"res{t + 1}") - for t in [1, 2, 3]: - k = k.replace(f"bn{t}", f"conv{t}.norm") - k = k.replace("downsample.0", "shortcut") - k = k.replace("downsample.1", "shortcut.norm") - print(old_k, "->", k) - newmodel[k] = obj.pop(old_k).detach().numpy() - - res = {"model": newmodel, "__author__": "torchvision", "matching_heuristics": True} - - with open(sys.argv[2], "wb") as f: - pkl.dump(res, f) - if obj: - print("Unconverted keys:", obj.keys()) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/CMakeLists.txt b/dimos/models/Detic/third_party/CenterNet2/tools/deploy/CMakeLists.txt deleted file mode 100644 index 80dae12500..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -# See https://pytorch.org/tutorials/advanced/cpp_frontend.html -cmake_minimum_required(VERSION 3.12 FATAL_ERROR) -project(torchscript_mask_rcnn) - -find_package(Torch REQUIRED) -find_package(OpenCV REQUIRED) -find_package(TorchVision REQUIRED) # needed by export-method=tracing/scripting - -add_executable(torchscript_mask_rcnn torchscript_mask_rcnn.cpp) -target_link_libraries( - torchscript_mask_rcnn - -Wl,--no-as-needed TorchVision::TorchVision -Wl,--as-needed - "${TORCH_LIBRARIES}" ${OpenCV_LIBS}) -set_property(TARGET torchscript_mask_rcnn PROPERTY CXX_STANDARD 14) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/README.md b/dimos/models/Detic/third_party/CenterNet2/tools/deploy/README.md deleted file mode 100644 index e33cbeb54c..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/README.md +++ /dev/null @@ -1,66 +0,0 @@ -See [deployment tutorial](https://detectron2.readthedocs.io/tutorials/deployment.html) -for some high-level background about deployment. - -This directory contains the following examples: - -1. An example script `export_model.py` - that exports a detectron2 model for deployment using different methods and formats. - -2. A C++ example that runs inference with Mask R-CNN model in TorchScript format. - -## Build -Deployment depends on libtorch and OpenCV. Some require more dependencies: - -* Running TorchScript-format models produced by `--export-method=caffe2_tracing` requires libtorch - to be built with caffe2 enabled. -* Running TorchScript-format models produced by `--export-method=tracing/scripting` requires libtorchvision (C++ library of torchvision). - -All methods are supported in one C++ file that requires all the above dependencies. -Adjust it and remove code you don't need. -As a reference, we provide a [Dockerfile](../../docker/deploy.Dockerfile) that installs all the above dependencies and builds the C++ example. - -## Use - -We show a few example commands to export and execute a Mask R-CNN model in C++. - -* `export-method=tracing, format=torchscript`: -``` -./export_model.py --config-file ../../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ - --output ./output --export-method tracing --format torchscript \ - MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl \ - MODEL.DEVICE cuda - -./build/torchscript_mask_rcnn output/model.ts input.jpg tracing -``` - -* `export-method=scripting, format=torchscript`: -``` -./export_model.py --config-file ../../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ - --output ./output --export-method scripting --format torchscript \ - MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl \ - -./build/torchscript_mask_rcnn output/model.ts input.jpg scripting -``` - -* `export-method=caffe2_tracing, format=torchscript`: - -``` -./export_model.py --config-file ../../configs/COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x.yaml \ - --output ./output --export-method caffe2_tracing --format torchscript \ - MODEL.WEIGHTS detectron2://COCO-InstanceSegmentation/mask_rcnn_R_50_FPN_3x/137849600/model_final_f10217.pkl \ - -./build/torchscript_mask_rcnn output/model.ts input.jpg caffe2_tracing -``` - - -## Notes: - -1. Tracing/Caffe2-tracing requires valid weights & sample inputs. - Therefore the above commands require pre-trained models and [COCO dataset](https://detectron2.readthedocs.io/tutorials/builtin_datasets.html). - You can modify the script to obtain sample inputs in other ways instead of from COCO. - -2. `--run-eval` is implemented only for tracing mode - to evaluate the exported model using the dataset in the config. - It's recommended to always verify the accuracy in case the conversion is not successful. - Evaluation can be slow if model is exported to CPU or dataset is too large ("coco_2017_val_100" is a small subset of COCO useful for evaluation). - `caffe2_tracing` accuracy may be slightly different (within 0.1 AP) from original model due to numerical precisions between different runtime. diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/export_model.py b/dimos/models/Detic/third_party/CenterNet2/tools/deploy/export_model.py deleted file mode 100755 index 6b9d2d60be..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/export_model.py +++ /dev/null @@ -1,233 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import os -from typing import Dict, List, Tuple - -from detectron2.checkpoint import DetectionCheckpointer -from detectron2.config import get_cfg -from detectron2.data import build_detection_test_loader, detection_utils -import detectron2.data.transforms as T -from detectron2.evaluation import COCOEvaluator, inference_on_dataset, print_csv_format -from detectron2.export import TracingAdapter, dump_torchscript_IR, scripting_with_instances -from detectron2.modeling import GeneralizedRCNN, RetinaNet, build_model -from detectron2.modeling.postprocessing import detector_postprocess -from detectron2.projects.point_rend import add_pointrend_config -from detectron2.structures import Boxes -from detectron2.utils.env import TORCH_VERSION -from detectron2.utils.file_io import PathManager -from detectron2.utils.logger import setup_logger -import torch -from torch import Tensor, nn - - -def setup_cfg(args): - cfg = get_cfg() - # cuda context is initialized before creating dataloader, so we don't fork anymore - cfg.DATALOADER.NUM_WORKERS = 0 - add_pointrend_config(cfg) - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - cfg.freeze() - return cfg - - -def export_caffe2_tracing(cfg, torch_model, inputs): - from detectron2.export import Caffe2Tracer - - tracer = Caffe2Tracer(cfg, torch_model, inputs) - if args.format == "caffe2": - caffe2_model = tracer.export_caffe2() - caffe2_model.save_protobuf(args.output) - # draw the caffe2 graph - caffe2_model.save_graph(os.path.join(args.output, "model.svg"), inputs=inputs) - return caffe2_model - elif args.format == "onnx": - import onnx - - onnx_model = tracer.export_onnx() - onnx.save(onnx_model, os.path.join(args.output, "model.onnx")) - elif args.format == "torchscript": - ts_model = tracer.export_torchscript() - with PathManager.open(os.path.join(args.output, "model.ts"), "wb") as f: - torch.jit.save(ts_model, f) - dump_torchscript_IR(ts_model, args.output) - - -# experimental. API not yet final -def export_scripting(torch_model): - assert TORCH_VERSION >= (1, 8) - fields = { - "proposal_boxes": Boxes, - "objectness_logits": Tensor, - "pred_boxes": Boxes, - "scores": Tensor, - "pred_classes": Tensor, - "pred_masks": Tensor, - "pred_keypoints": torch.Tensor, - "pred_keypoint_heatmaps": torch.Tensor, - } - assert args.format == "torchscript", "Scripting only supports torchscript format." - - class ScriptableAdapterBase(nn.Module): - # Use this adapter to workaround https://github.com/pytorch/pytorch/issues/46944 - # by not retuning instances but dicts. Otherwise the exported model is not deployable - def __init__(self) -> None: - super().__init__() - self.model = torch_model - self.eval() - - if isinstance(torch_model, GeneralizedRCNN): - - class ScriptableAdapter(ScriptableAdapterBase): - def forward(self, inputs: tuple[dict[str, torch.Tensor]]) -> list[dict[str, Tensor]]: - instances = self.model.inference(inputs, do_postprocess=False) - return [i.get_fields() for i in instances] - - else: - - class ScriptableAdapter(ScriptableAdapterBase): - def forward(self, inputs: tuple[dict[str, torch.Tensor]]) -> list[dict[str, Tensor]]: - instances = self.model(inputs) - return [i.get_fields() for i in instances] - - ts_model = scripting_with_instances(ScriptableAdapter(), fields) - with PathManager.open(os.path.join(args.output, "model.ts"), "wb") as f: - torch.jit.save(ts_model, f) - dump_torchscript_IR(ts_model, args.output) - # TODO inference in Python now missing postprocessing glue code - return None - - -# experimental. API not yet final -def export_tracing(torch_model, inputs): - assert TORCH_VERSION >= (1, 8) - image = inputs[0]["image"] - inputs = [{"image": image}] # remove other unused keys - - if isinstance(torch_model, GeneralizedRCNN): - - def inference(model, inputs): - # use do_postprocess=False so it returns ROI mask - inst = model.inference(inputs, do_postprocess=False)[0] - return [{"instances": inst}] - - else: - inference = None # assume that we just call the model directly - - traceable_model = TracingAdapter(torch_model, inputs, inference) - - if args.format == "torchscript": - ts_model = torch.jit.trace(traceable_model, (image,)) - with PathManager.open(os.path.join(args.output, "model.ts"), "wb") as f: - torch.jit.save(ts_model, f) - dump_torchscript_IR(ts_model, args.output) - elif args.format == "onnx": - with PathManager.open(os.path.join(args.output, "model.onnx"), "wb") as f: - torch.onnx.export(traceable_model, (image,), f, opset_version=11) - logger.info("Inputs schema: " + str(traceable_model.inputs_schema)) - logger.info("Outputs schema: " + str(traceable_model.outputs_schema)) - - if args.format != "torchscript": - return None - if not isinstance(torch_model, GeneralizedRCNN | RetinaNet): - return None - - def eval_wrapper(inputs): - """ - The exported model does not contain the final resize step, which is typically - unused in deployment but needed for evaluation. We add it manually here. - """ - input = inputs[0] - instances = traceable_model.outputs_schema(ts_model(input["image"]))[0]["instances"] - postprocessed = detector_postprocess(instances, input["height"], input["width"]) - return [{"instances": postprocessed}] - - return eval_wrapper - - -def get_sample_inputs(args): - if args.sample_image is None: - # get a first batch from dataset - data_loader = build_detection_test_loader(cfg, cfg.DATASETS.TEST[0]) - first_batch = next(iter(data_loader)) - return first_batch - else: - # get a sample data - original_image = detection_utils.read_image(args.sample_image, format=cfg.INPUT.FORMAT) - # Do same preprocessing as DefaultPredictor - aug = T.ResizeShortestEdge( - [cfg.INPUT.MIN_SIZE_TEST, cfg.INPUT.MIN_SIZE_TEST], cfg.INPUT.MAX_SIZE_TEST - ) - height, width = original_image.shape[:2] - image = aug.get_transform(original_image).apply_image(original_image) - image = torch.as_tensor(image.astype("float32").transpose(2, 0, 1)) - - inputs = {"image": image, "height": height, "width": width} - - # Sample ready - sample_inputs = [inputs] - return sample_inputs - - -if __name__ == "__main__": - parser = argparse.ArgumentParser(description="Export a model for deployment.") - parser.add_argument( - "--format", - choices=["caffe2", "onnx", "torchscript"], - help="output format", - default="torchscript", - ) - parser.add_argument( - "--export-method", - choices=["caffe2_tracing", "tracing", "scripting"], - help="Method to export models", - default="tracing", - ) - parser.add_argument("--config-file", default="", metavar="FILE", help="path to config file") - parser.add_argument("--sample-image", default=None, type=str, help="sample image for input") - parser.add_argument("--run-eval", action="store_true") - parser.add_argument("--output", help="output directory for the converted model") - parser.add_argument( - "opts", - help="Modify config options using the command-line", - default=None, - nargs=argparse.REMAINDER, - ) - args = parser.parse_args() - logger = setup_logger() - logger.info("Command line arguments: " + str(args)) - PathManager.mkdirs(args.output) - # Disable respecialization on new shapes. Otherwise --run-eval will be slow - torch._C._jit_set_bailout_depth(1) - - cfg = setup_cfg(args) - - # create a torch model - torch_model = build_model(cfg) - DetectionCheckpointer(torch_model).resume_or_load(cfg.MODEL.WEIGHTS) - torch_model.eval() - - # get sample data - sample_inputs = get_sample_inputs(args) - - # convert and save model - if args.export_method == "caffe2_tracing": - exported_model = export_caffe2_tracing(cfg, torch_model, sample_inputs) - elif args.export_method == "scripting": - exported_model = export_scripting(torch_model) - elif args.export_method == "tracing": - exported_model = export_tracing(torch_model, sample_inputs) - - # run evaluation with the converted model - if args.run_eval: - assert exported_model is not None, ( - f"Python inference is not yet implemented for export_method={args.export_method}, format={args.format}." - ) - logger.info("Running evaluation ... this takes a long time if you export to CPU.") - dataset = cfg.DATASETS.TEST[0] - data_loader = build_detection_test_loader(cfg, dataset) - # NOTE: hard-coded evaluator. change to the evaluator for your dataset - evaluator = COCOEvaluator(dataset, output_dir=args.output) - metrics = inference_on_dataset(exported_model, data_loader, evaluator) - print_csv_format(metrics) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/torchscript_mask_rcnn.cpp b/dimos/models/Detic/third_party/CenterNet2/tools/deploy/torchscript_mask_rcnn.cpp deleted file mode 100644 index b40f13b81f..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/torchscript_mask_rcnn.cpp +++ /dev/null @@ -1,187 +0,0 @@ -// Copyright (c) Facebook, Inc. and its affiliates. -// @lint-ignore-every CLANGTIDY -// This is an example code that demonstrates how to run inference -// with a torchscript format Mask R-CNN model exported by ./export_model.py -// using export method=tracing, caffe2_tracing & scripting. - -#include -#include -#include - -#include -#include -#include -#include - -// only needed for export_method=tracing -#include // @oss-only -// @fb-only: #include - -using namespace std; - -c10::IValue get_caffe2_tracing_inputs(cv::Mat& img, c10::Device device) { - const int height = img.rows; - const int width = img.cols; - // FPN models require divisibility of 32. - // Tracing mode does padding inside the graph, but caffe2_tracing does not. - assert(height % 32 == 0 && width % 32 == 0); - const int channels = 3; - - auto input = - torch::from_blob(img.data, {1, height, width, channels}, torch::kUInt8); - // NHWC to NCHW - input = input.to(device, torch::kFloat).permute({0, 3, 1, 2}).contiguous(); - - std::array im_info_data{height * 1.0f, width * 1.0f, 1.0f}; - auto im_info = - torch::from_blob(im_info_data.data(), {1, 3}).clone().to(device); - return std::make_tuple(input, im_info); -} - -c10::IValue get_tracing_inputs(cv::Mat& img, c10::Device device) { - const int height = img.rows; - const int width = img.cols; - const int channels = 3; - - auto input = - torch::from_blob(img.data, {height, width, channels}, torch::kUInt8); - // HWC to CHW - input = input.to(device, torch::kFloat).permute({2, 0, 1}).contiguous(); - return input; -} - -// create a Tuple[Dict[str, Tensor]] which is the input type of scripted model -c10::IValue get_scripting_inputs(cv::Mat& img, c10::Device device) { - const int height = img.rows; - const int width = img.cols; - const int channels = 3; - - auto img_tensor = - torch::from_blob(img.data, {height, width, channels}, torch::kUInt8); - // HWC to CHW - img_tensor = - img_tensor.to(device, torch::kFloat).permute({2, 0, 1}).contiguous(); - auto dic = c10::Dict(); - dic.insert("image", img_tensor); - return std::make_tuple(dic); -} - -c10::IValue -get_inputs(std::string export_method, cv::Mat& img, c10::Device device) { - // Given an image, create inputs in the format required by the model. - if (export_method == "tracing") - return get_tracing_inputs(img, device); - if (export_method == "caffe2_tracing") - return get_caffe2_tracing_inputs(img, device); - if (export_method == "scripting") - return get_scripting_inputs(img, device); - abort(); -} - -struct MaskRCNNOutputs { - at::Tensor pred_boxes, pred_classes, pred_masks, scores; - int num_instances() const { - return pred_boxes.sizes()[0]; - } -}; - -MaskRCNNOutputs get_outputs(std::string export_method, c10::IValue outputs) { - // Given outputs of the model, extract tensors from it to turn into a - // common MaskRCNNOutputs format. - if (export_method == "tracing") { - auto out_tuple = outputs.toTuple()->elements(); - // They are ordered alphabetically by their field name in Instances - return MaskRCNNOutputs{ - out_tuple[0].toTensor(), - out_tuple[1].toTensor(), - out_tuple[2].toTensor(), - out_tuple[3].toTensor()}; - } - if (export_method == "caffe2_tracing") { - auto out_tuple = outputs.toTuple()->elements(); - // A legacy order used by caffe2 models - return MaskRCNNOutputs{ - out_tuple[0].toTensor(), - out_tuple[2].toTensor(), - out_tuple[3].toTensor(), - out_tuple[1].toTensor()}; - } - if (export_method == "scripting") { - // With the ScriptableAdapter defined in export_model.py, the output is - // List[Dict[str, Any]]. - auto out_dict = outputs.toList().get(0).toGenericDict(); - return MaskRCNNOutputs{ - out_dict.at("pred_boxes").toTensor(), - out_dict.at("pred_classes").toTensor(), - out_dict.at("pred_masks").toTensor(), - out_dict.at("scores").toTensor()}; - } - abort(); -} - -int main(int argc, const char* argv[]) { - if (argc != 4) { - cerr << R"xx( -Usage: - ./torchscript_mask_rcnn model.ts input.jpg EXPORT_METHOD - - EXPORT_METHOD can be "tracing", "caffe2_tracing" or "scripting". -)xx"; - return 1; - } - std::string image_file = argv[2]; - std::string export_method = argv[3]; - assert( - export_method == "caffe2_tracing" || export_method == "tracing" || - export_method == "scripting"); - - torch::jit::getBailoutDepth() = 1; - torch::autograd::AutoGradMode guard(false); - auto module = torch::jit::load(argv[1]); - - assert(module.buffers().size() > 0); - // Assume that the entire model is on the same device. - // We just put input to this device. - auto device = (*begin(module.buffers())).device(); - - cv::Mat input_img = cv::imread(image_file, cv::IMREAD_COLOR); - auto inputs = get_inputs(export_method, input_img, device); - - // Run the network - auto output = module.forward({inputs}); - if (device.is_cuda()) - c10::cuda::getCurrentCUDAStream().synchronize(); - - // run 3 more times to benchmark - int N_benchmark = 3, N_warmup = 1; - auto start_time = chrono::high_resolution_clock::now(); - for (int i = 0; i < N_benchmark + N_warmup; ++i) { - if (i == N_warmup) - start_time = chrono::high_resolution_clock::now(); - output = module.forward({inputs}); - if (device.is_cuda()) - c10::cuda::getCurrentCUDAStream().synchronize(); - } - auto end_time = chrono::high_resolution_clock::now(); - auto ms = chrono::duration_cast(end_time - start_time) - .count(); - cout << "Latency (should vary with different inputs): " - << ms * 1.0 / 1e6 / N_benchmark << " seconds" << endl; - - // Parse Mask R-CNN outputs - auto rcnn_outputs = get_outputs(export_method, output); - cout << "Number of detected objects: " << rcnn_outputs.num_instances() - << endl; - - cout << "pred_boxes: " << rcnn_outputs.pred_boxes.toString() << " " - << rcnn_outputs.pred_boxes.sizes() << endl; - cout << "scores: " << rcnn_outputs.scores.toString() << " " - << rcnn_outputs.scores.sizes() << endl; - cout << "pred_classes: " << rcnn_outputs.pred_classes.toString() << " " - << rcnn_outputs.pred_classes.sizes() << endl; - cout << "pred_masks: " << rcnn_outputs.pred_masks.toString() << " " - << rcnn_outputs.pred_masks.sizes() << endl; - - cout << rcnn_outputs.pred_boxes << endl; - return 0; -} diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/lazyconfig_train_net.py b/dimos/models/Detic/third_party/CenterNet2/tools/lazyconfig_train_net.py deleted file mode 100755 index 8f40a40c39..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/lazyconfig_train_net.py +++ /dev/null @@ -1,132 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. -""" -Training script using the new "LazyConfig" python config files. - -This scripts reads a given python config file and runs the training or evaluation. -It can be used to train any models or dataset as long as they can be -instantiated by the recursive construction defined in the given config file. - -Besides lazy construction of models, dataloader, etc., this scripts expects a -few common configuration parameters currently defined in "configs/common/train.py". -To add more complicated training logic, you can easily add other configs -in the config file and implement a new train_net.py to handle them. -""" - -import logging - -from detectron2.checkpoint import DetectionCheckpointer -from detectron2.config import LazyConfig, instantiate -from detectron2.engine import ( - AMPTrainer, - SimpleTrainer, - default_argument_parser, - default_setup, - default_writers, - hooks, - launch, -) -from detectron2.engine.defaults import create_ddp_model -from detectron2.evaluation import inference_on_dataset, print_csv_format -from detectron2.utils import comm - -logger = logging.getLogger("detectron2") - - -def do_test(cfg, model): - if "evaluator" in cfg.dataloader: - ret = inference_on_dataset( - model, instantiate(cfg.dataloader.test), instantiate(cfg.dataloader.evaluator) - ) - print_csv_format(ret) - return ret - - -def do_train(args, cfg) -> None: - """ - Args: - cfg: an object with the following attributes: - model: instantiate to a module - dataloader.{train,test}: instantiate to dataloaders - dataloader.evaluator: instantiate to evaluator for test set - optimizer: instantaite to an optimizer - lr_multiplier: instantiate to a fvcore scheduler - train: other misc config defined in `configs/common/train.py`, including: - output_dir (str) - init_checkpoint (str) - amp.enabled (bool) - max_iter (int) - eval_period, log_period (int) - device (str) - checkpointer (dict) - ddp (dict) - """ - model = instantiate(cfg.model) - logger = logging.getLogger("detectron2") - logger.info(f"Model:\n{model}") - model.to(cfg.train.device) - - cfg.optimizer.params.model = model - optim = instantiate(cfg.optimizer) - - train_loader = instantiate(cfg.dataloader.train) - - model = create_ddp_model(model, **cfg.train.ddp) - trainer = (AMPTrainer if cfg.train.amp.enabled else SimpleTrainer)(model, train_loader, optim) - checkpointer = DetectionCheckpointer( - model, - cfg.train.output_dir, - trainer=trainer, - ) - trainer.register_hooks( - [ - hooks.IterationTimer(), - hooks.LRScheduler(scheduler=instantiate(cfg.lr_multiplier)), - hooks.PeriodicCheckpointer(checkpointer, **cfg.train.checkpointer) - if comm.is_main_process() - else None, - hooks.EvalHook(cfg.train.eval_period, lambda: do_test(cfg, model)), - hooks.PeriodicWriter( - default_writers(cfg.train.output_dir, cfg.train.max_iter), - period=cfg.train.log_period, - ) - if comm.is_main_process() - else None, - ] - ) - - checkpointer.resume_or_load(cfg.train.init_checkpoint, resume=args.resume) - if args.resume and checkpointer.has_checkpoint(): - # The checkpoint stores the training iteration that just finished, thus we start - # at the next iteration - start_iter = trainer.iter + 1 - else: - start_iter = 0 - trainer.train(start_iter, cfg.train.max_iter) - - -def main(args) -> None: - cfg = LazyConfig.load(args.config_file) - cfg = LazyConfig.apply_overrides(cfg, args.opts) - default_setup(cfg, args) - - if args.eval_only: - model = instantiate(cfg.model) - model.to(cfg.train.device) - model = create_ddp_model(model) - DetectionCheckpointer(model).load(cfg.train.init_checkpoint) - print(do_test(cfg, model)) - else: - do_train(args, cfg) - - -if __name__ == "__main__": - args = default_argument_parser().parse_args() - launch( - main, - args.num_gpus, - num_machines=args.num_machines, - machine_rank=args.machine_rank, - dist_url=args.dist_url, - args=(args,), - ) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/lightning_train_net.py b/dimos/models/Detic/third_party/CenterNet2/tools/lightning_train_net.py deleted file mode 100644 index dbb6cb6e43..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/lightning_train_net.py +++ /dev/null @@ -1,237 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) Facebook, Inc. and its affiliates. -# Lightning Trainer should be considered beta at this point -# We have confirmed that training and validation run correctly and produce correct results -# Depending on how you launch the trainer, there are issues with processes terminating correctly -# This module is still dependent on D2 logging, but could be transferred to use Lightning logging - -from collections import OrderedDict -import logging -import os -import time -from typing import Any, Dict, List -import weakref - -from detectron2.checkpoint import DetectionCheckpointer -from detectron2.config import get_cfg -from detectron2.data import build_detection_test_loader, build_detection_train_loader -from detectron2.engine import ( - DefaultTrainer, - SimpleTrainer, - default_argument_parser, - default_setup, - default_writers, - hooks, -) -from detectron2.evaluation import print_csv_format -from detectron2.evaluation.testing import flatten_results_dict -from detectron2.modeling import build_model -from detectron2.solver import build_lr_scheduler, build_optimizer -import detectron2.utils.comm as comm -from detectron2.utils.events import EventStorage -from detectron2.utils.logger import setup_logger -import pytorch_lightning as pl # type: ignore -from pytorch_lightning import LightningDataModule, LightningModule -from train_net import build_evaluator - -logging.basicConfig(level=logging.INFO) -logger = logging.getLogger("detectron2") - - -class TrainingModule(LightningModule): - def __init__(self, cfg) -> None: - super().__init__() - if not logger.isEnabledFor(logging.INFO): # setup_logger is not called for d2 - setup_logger() - self.cfg = DefaultTrainer.auto_scale_workers(cfg, comm.get_world_size()) - self.storage: EventStorage = None - self.model = build_model(self.cfg) - - self.start_iter = 0 - self.max_iter = cfg.SOLVER.MAX_ITER - - def on_save_checkpoint(self, checkpoint: dict[str, Any]) -> None: - checkpoint["iteration"] = self.storage.iter - - def on_load_checkpoint(self, checkpointed_state: dict[str, Any]) -> None: - self.start_iter = checkpointed_state["iteration"] - self.storage.iter = self.start_iter - - def setup(self, stage: str) -> None: - if self.cfg.MODEL.WEIGHTS: - self.checkpointer = DetectionCheckpointer( - # Assume you want to save checkpoints together with logs/statistics - self.model, - self.cfg.OUTPUT_DIR, - ) - logger.info(f"Load model weights from checkpoint: {self.cfg.MODEL.WEIGHTS}.") - # Only load weights, use lightning checkpointing if you want to resume - self.checkpointer.load(self.cfg.MODEL.WEIGHTS) - - self.iteration_timer = hooks.IterationTimer() - self.iteration_timer.before_train() - self.data_start = time.perf_counter() - self.writers = None - - def training_step(self, batch, batch_idx): - data_time = time.perf_counter() - self.data_start - # Need to manually enter/exit since trainer may launch processes - # This ideally belongs in setup, but setup seems to run before processes are spawned - if self.storage is None: - self.storage = EventStorage(0) - self.storage.__enter__() - self.iteration_timer.trainer = weakref.proxy(self) - self.iteration_timer.before_step() - self.writers = ( - default_writers(self.cfg.OUTPUT_DIR, self.max_iter) - if comm.is_main_process() - else {} - ) - - loss_dict = self.model(batch) - SimpleTrainer.write_metrics(loss_dict, data_time) - - opt = self.optimizers() - self.storage.put_scalar( - "lr", opt.param_groups[self._best_param_group_id]["lr"], smoothing_hint=False - ) - self.iteration_timer.after_step() - self.storage.step() - # A little odd to put before step here, but it's the best way to get a proper timing - self.iteration_timer.before_step() - - if self.storage.iter % 20 == 0: - for writer in self.writers: - writer.write() - return sum(loss_dict.values()) - - def training_step_end(self, training_step_outpus): - self.data_start = time.perf_counter() - return training_step_outpus - - def training_epoch_end(self, training_step_outputs) -> None: - self.iteration_timer.after_train() - if comm.is_main_process(): - self.checkpointer.save("model_final") - for writer in self.writers: - writer.write() - writer.close() - self.storage.__exit__(None, None, None) - - def _process_dataset_evaluation_results(self) -> OrderedDict: - results = OrderedDict() - for idx, dataset_name in enumerate(self.cfg.DATASETS.TEST): - results[dataset_name] = self._evaluators[idx].evaluate() - if comm.is_main_process(): - print_csv_format(results[dataset_name]) - - if len(results) == 1: - results = next(iter(results.values())) - return results - - def _reset_dataset_evaluators(self) -> None: - self._evaluators = [] - for dataset_name in self.cfg.DATASETS.TEST: - evaluator = build_evaluator(self.cfg, dataset_name) - evaluator.reset() - self._evaluators.append(evaluator) - - def on_validation_epoch_start(self, _outputs) -> None: - self._reset_dataset_evaluators() - - def validation_epoch_end(self, _outputs): - results = self._process_dataset_evaluation_results(_outputs) - - flattened_results = flatten_results_dict(results) - for k, v in flattened_results.items(): - try: - v = float(v) - except Exception as e: - raise ValueError( - f"[EvalHook] eval_function should return a nested dict of float. Got '{k}: {v}' instead." - ) from e - self.storage.put_scalars(**flattened_results, smoothing_hint=False) - - def validation_step(self, batch, batch_idx: int, dataloader_idx: int = 0) -> None: - if not isinstance(batch, list): - batch = [batch] - outputs = self.model(batch) - self._evaluators[dataloader_idx].process(batch, outputs) - - def configure_optimizers(self): - optimizer = build_optimizer(self.cfg, self.model) - self._best_param_group_id = hooks.LRScheduler.get_best_param_group_id(optimizer) - scheduler = build_lr_scheduler(self.cfg, optimizer) - return [optimizer], [{"scheduler": scheduler, "interval": "step"}] - - -class DataModule(LightningDataModule): - def __init__(self, cfg) -> None: - super().__init__() - self.cfg = DefaultTrainer.auto_scale_workers(cfg, comm.get_world_size()) - - def train_dataloader(self): - return build_detection_train_loader(self.cfg) - - def val_dataloader(self): - dataloaders = [] - for dataset_name in self.cfg.DATASETS.TEST: - dataloaders.append(build_detection_test_loader(self.cfg, dataset_name)) - return dataloaders - - -def main(args) -> None: - cfg = setup(args) - train(cfg, args) - - -def train(cfg, args) -> None: - trainer_params = { - # training loop is bounded by max steps, use a large max_epochs to make - # sure max_steps is met first - "max_epochs": 10**8, - "max_steps": cfg.SOLVER.MAX_ITER, - "val_check_interval": cfg.TEST.EVAL_PERIOD if cfg.TEST.EVAL_PERIOD > 0 else 10**8, - "num_nodes": args.num_machines, - "gpus": args.num_gpus, - "num_sanity_val_steps": 0, - } - if cfg.SOLVER.AMP.ENABLED: - trainer_params["precision"] = 16 - - last_checkpoint = os.path.join(cfg.OUTPUT_DIR, "last.ckpt") - if args.resume: - # resume training from checkpoint - trainer_params["resume_from_checkpoint"] = last_checkpoint - logger.info(f"Resuming training from checkpoint: {last_checkpoint}.") - - trainer = pl.Trainer(**trainer_params) - logger.info(f"start to train with {args.num_machines} nodes and {args.num_gpus} GPUs") - - module = TrainingModule(cfg) - data_module = DataModule(cfg) - if args.eval_only: - logger.info("Running inference") - trainer.validate(module, data_module) - else: - logger.info("Running training") - trainer.fit(module, data_module) - - -def setup(args): - """ - Create configs and perform basic setups. - """ - cfg = get_cfg() - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - cfg.freeze() - default_setup(cfg, args) - return cfg - - -if __name__ == "__main__": - parser = default_argument_parser() - args = parser.parse_args() - logger.info("Command Line Args:", args) - main(args) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/plain_train_net.py b/dimos/models/Detic/third_party/CenterNet2/tools/plain_train_net.py deleted file mode 100755 index a06d19aff2..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/plain_train_net.py +++ /dev/null @@ -1,223 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. -""" -Detectron2 training script with a plain training loop. - -This script reads a given config file and runs the training or evaluation. -It is an entry point that is able to train standard models in detectron2. - -In order to let one script support training of many models, -this script contains logic that are specific to these built-in models and therefore -may not be suitable for your own project. -For example, your research project perhaps only needs a single "evaluator". - -Therefore, we recommend you to use detectron2 as a library and take -this file as an example of how to use the library. -You may want to write your own script with your datasets and other customizations. - -Compared to "train_net.py", this script supports fewer default features. -It also includes fewer abstraction, therefore is easier to add custom logic. -""" - -from collections import OrderedDict -import logging -import os - -from detectron2.checkpoint import DetectionCheckpointer, PeriodicCheckpointer -from detectron2.config import get_cfg -from detectron2.data import ( - MetadataCatalog, - build_detection_test_loader, - build_detection_train_loader, -) -from detectron2.engine import default_argument_parser, default_setup, default_writers, launch -from detectron2.evaluation import ( - CityscapesInstanceEvaluator, - CityscapesSemSegEvaluator, - COCOEvaluator, - COCOPanopticEvaluator, - DatasetEvaluators, - LVISEvaluator, - PascalVOCDetectionEvaluator, - SemSegEvaluator, - inference_on_dataset, - print_csv_format, -) -from detectron2.modeling import build_model -from detectron2.solver import build_lr_scheduler, build_optimizer -import detectron2.utils.comm as comm -from detectron2.utils.events import EventStorage -import torch -from torch.nn.parallel import DistributedDataParallel - -logger = logging.getLogger("detectron2") - - -def get_evaluator(cfg, dataset_name: str, output_folder=None): - """ - Create evaluator(s) for a given dataset. - This uses the special metadata "evaluator_type" associated with each builtin dataset. - For your own dataset, you can simply create an evaluator manually in your - script and do not have to worry about the hacky if-else logic here. - """ - if output_folder is None: - output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") - evaluator_list = [] - evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type - if evaluator_type in ["sem_seg", "coco_panoptic_seg"]: - evaluator_list.append( - SemSegEvaluator( - dataset_name, - distributed=True, - output_dir=output_folder, - ) - ) - if evaluator_type in ["coco", "coco_panoptic_seg"]: - evaluator_list.append(COCOEvaluator(dataset_name, output_dir=output_folder)) - if evaluator_type == "coco_panoptic_seg": - evaluator_list.append(COCOPanopticEvaluator(dataset_name, output_folder)) - if evaluator_type == "cityscapes_instance": - assert torch.cuda.device_count() > comm.get_rank(), ( - "CityscapesEvaluator currently do not work with multiple machines." - ) - return CityscapesInstanceEvaluator(dataset_name) - if evaluator_type == "cityscapes_sem_seg": - assert torch.cuda.device_count() > comm.get_rank(), ( - "CityscapesEvaluator currently do not work with multiple machines." - ) - return CityscapesSemSegEvaluator(dataset_name) - if evaluator_type == "pascal_voc": - return PascalVOCDetectionEvaluator(dataset_name) - if evaluator_type == "lvis": - return LVISEvaluator(dataset_name, cfg, True, output_folder) - if len(evaluator_list) == 0: - raise NotImplementedError( - f"no Evaluator for the dataset {dataset_name} with the type {evaluator_type}" - ) - if len(evaluator_list) == 1: - return evaluator_list[0] - return DatasetEvaluators(evaluator_list) - - -def do_test(cfg, model): - results = OrderedDict() - for dataset_name in cfg.DATASETS.TEST: - data_loader = build_detection_test_loader(cfg, dataset_name) - evaluator = get_evaluator( - cfg, dataset_name, os.path.join(cfg.OUTPUT_DIR, "inference", dataset_name) - ) - results_i = inference_on_dataset(model, data_loader, evaluator) - results[dataset_name] = results_i - if comm.is_main_process(): - logger.info(f"Evaluation results for {dataset_name} in csv format:") - print_csv_format(results_i) - if len(results) == 1: - results = next(iter(results.values())) - return results - - -def do_train(cfg, model, resume: bool=False) -> None: - model.train() - optimizer = build_optimizer(cfg, model) - scheduler = build_lr_scheduler(cfg, optimizer) - - checkpointer = DetectionCheckpointer( - model, cfg.OUTPUT_DIR, optimizer=optimizer, scheduler=scheduler - ) - start_iter = ( - checkpointer.resume_or_load(cfg.MODEL.WEIGHTS, resume=resume).get("iteration", -1) + 1 - ) - max_iter = cfg.SOLVER.MAX_ITER - - periodic_checkpointer = PeriodicCheckpointer( - checkpointer, cfg.SOLVER.CHECKPOINT_PERIOD, max_iter=max_iter - ) - - writers = default_writers(cfg.OUTPUT_DIR, max_iter) if comm.is_main_process() else [] - - # compared to "train_net.py", we do not support accurate timing and - # precise BN here, because they are not trivial to implement in a small training loop - data_loader = build_detection_train_loader(cfg) - logger.info(f"Starting training from iteration {start_iter}") - with EventStorage(start_iter) as storage: - for data, iteration in zip(data_loader, range(start_iter, max_iter), strict=False): - storage.iter = iteration - - loss_dict = model(data) - losses = sum(loss_dict.values()) - assert torch.isfinite(losses).all(), loss_dict - - loss_dict_reduced = {k: v.item() for k, v in comm.reduce_dict(loss_dict).items()} - losses_reduced = sum(loss for loss in loss_dict_reduced.values()) - if comm.is_main_process(): - storage.put_scalars(total_loss=losses_reduced, **loss_dict_reduced) - - optimizer.zero_grad() - losses.backward() - optimizer.step() - storage.put_scalar("lr", optimizer.param_groups[0]["lr"], smoothing_hint=False) - scheduler.step() - - if ( - cfg.TEST.EVAL_PERIOD > 0 - and (iteration + 1) % cfg.TEST.EVAL_PERIOD == 0 - and iteration != max_iter - 1 - ): - do_test(cfg, model) - # Compared to "train_net.py", the test results are not dumped to EventStorage - comm.synchronize() - - if iteration - start_iter > 5 and ( - (iteration + 1) % 20 == 0 or iteration == max_iter - 1 - ): - for writer in writers: - writer.write() - periodic_checkpointer.step(iteration) - - -def setup(args): - """ - Create configs and perform basic setups. - """ - cfg = get_cfg() - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - cfg.freeze() - default_setup( - cfg, args - ) # if you don't like any of the default setup, write your own setup code - return cfg - - -def main(args): - cfg = setup(args) - - model = build_model(cfg) - logger.info(f"Model:\n{model}") - if args.eval_only: - DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( - cfg.MODEL.WEIGHTS, resume=args.resume - ) - return do_test(cfg, model) - - distributed = comm.get_world_size() > 1 - if distributed: - model = DistributedDataParallel( - model, device_ids=[comm.get_local_rank()], broadcast_buffers=False - ) - - do_train(cfg, model, resume=args.resume) - return do_test(cfg, model) - - -if __name__ == "__main__": - args = default_argument_parser().parse_args() - print("Command Line Args:", args) - launch( - main, - args.num_gpus, - num_machines=args.num_machines, - machine_rank=args.machine_rank, - dist_url=args.dist_url, - args=(args,), - ) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/train_net.py b/dimos/models/Detic/third_party/CenterNet2/tools/train_net.py deleted file mode 100755 index deb2ca6db8..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/train_net.py +++ /dev/null @@ -1,170 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. -""" -A main training script. - -This scripts reads a given config file and runs the training or evaluation. -It is an entry point that is made to train standard models in detectron2. - -In order to let one script support training of many models, -this script contains logic that are specific to these built-in models and therefore -may not be suitable for your own project. -For example, your research project perhaps only needs a single "evaluator". - -Therefore, we recommend you to use detectron2 as an library and take -this file as an example of how to use the library. -You may want to write your own script with your datasets and other customizations. -""" - -from collections import OrderedDict -import logging -import os - -from detectron2.checkpoint import DetectionCheckpointer -from detectron2.config import get_cfg -from detectron2.data import MetadataCatalog -from detectron2.engine import DefaultTrainer, default_argument_parser, default_setup, hooks, launch -from detectron2.evaluation import ( - CityscapesInstanceEvaluator, - CityscapesSemSegEvaluator, - COCOEvaluator, - COCOPanopticEvaluator, - DatasetEvaluators, - LVISEvaluator, - PascalVOCDetectionEvaluator, - SemSegEvaluator, - verify_results, -) -from detectron2.modeling import GeneralizedRCNNWithTTA -import detectron2.utils.comm as comm -import torch - - -def build_evaluator(cfg, dataset_name: str, output_folder=None): - """ - Create evaluator(s) for a given dataset. - This uses the special metadata "evaluator_type" associated with each builtin dataset. - For your own dataset, you can simply create an evaluator manually in your - script and do not have to worry about the hacky if-else logic here. - """ - if output_folder is None: - output_folder = os.path.join(cfg.OUTPUT_DIR, "inference") - evaluator_list = [] - evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type - if evaluator_type in ["sem_seg", "coco_panoptic_seg"]: - evaluator_list.append( - SemSegEvaluator( - dataset_name, - distributed=True, - output_dir=output_folder, - ) - ) - if evaluator_type in ["coco", "coco_panoptic_seg"]: - evaluator_list.append(COCOEvaluator(dataset_name, output_dir=output_folder)) - if evaluator_type == "coco_panoptic_seg": - evaluator_list.append(COCOPanopticEvaluator(dataset_name, output_folder)) - if evaluator_type == "cityscapes_instance": - assert torch.cuda.device_count() > comm.get_rank(), ( - "CityscapesEvaluator currently do not work with multiple machines." - ) - return CityscapesInstanceEvaluator(dataset_name) - if evaluator_type == "cityscapes_sem_seg": - assert torch.cuda.device_count() > comm.get_rank(), ( - "CityscapesEvaluator currently do not work with multiple machines." - ) - return CityscapesSemSegEvaluator(dataset_name) - elif evaluator_type == "pascal_voc": - return PascalVOCDetectionEvaluator(dataset_name) - elif evaluator_type == "lvis": - return LVISEvaluator(dataset_name, output_dir=output_folder) - if len(evaluator_list) == 0: - raise NotImplementedError( - f"no Evaluator for the dataset {dataset_name} with the type {evaluator_type}" - ) - elif len(evaluator_list) == 1: - return evaluator_list[0] - return DatasetEvaluators(evaluator_list) - - -class Trainer(DefaultTrainer): - """ - We use the "DefaultTrainer" which contains pre-defined default logic for - standard training workflow. They may not work for you, especially if you - are working on a new research project. In that case you can write your - own training loop. You can use "tools/plain_train_net.py" as an example. - """ - - @classmethod - def build_evaluator(cls, cfg, dataset_name: str, output_folder=None): - return build_evaluator(cfg, dataset_name, output_folder) - - @classmethod - def test_with_TTA(cls, cfg, model): - logger = logging.getLogger("detectron2.trainer") - # In the end of training, run an evaluation with TTA - # Only support some R-CNN models. - logger.info("Running inference with test-time augmentation ...") - model = GeneralizedRCNNWithTTA(cfg, model) - evaluators = [ - cls.build_evaluator( - cfg, name, output_folder=os.path.join(cfg.OUTPUT_DIR, "inference_TTA") - ) - for name in cfg.DATASETS.TEST - ] - res = cls.test(cfg, model, evaluators) - res = OrderedDict({k + "_TTA": v for k, v in res.items()}) - return res - - -def setup(args): - """ - Create configs and perform basic setups. - """ - cfg = get_cfg() - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - cfg.freeze() - default_setup(cfg, args) - return cfg - - -def main(args): - cfg = setup(args) - - if args.eval_only: - model = Trainer.build_model(cfg) - DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( - cfg.MODEL.WEIGHTS, resume=args.resume - ) - res = Trainer.test(cfg, model) - if cfg.TEST.AUG.ENABLED: - res.update(Trainer.test_with_TTA(cfg, model)) - if comm.is_main_process(): - verify_results(cfg, res) - return res - - """ - If you'd like to do anything fancier than the standard training logic, - consider writing your own training loop (see plain_train_net.py) or - subclassing the trainer. - """ - trainer = Trainer(cfg) - trainer.resume_or_load(resume=args.resume) - if cfg.TEST.AUG.ENABLED: - trainer.register_hooks( - [hooks.EvalHook(0, lambda: trainer.test_with_TTA(cfg, trainer.model))] - ) - return trainer.train() - - -if __name__ == "__main__": - args = default_argument_parser().parse_args() - print("Command Line Args:", args) - launch( - main, - args.num_gpus, - num_machines=args.num_machines, - machine_rank=args.machine_rank, - dist_url=args.dist_url, - args=(args,), - ) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/visualize_data.py b/dimos/models/Detic/third_party/CenterNet2/tools/visualize_data.py deleted file mode 100755 index 99abfdff4e..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/visualize_data.py +++ /dev/null @@ -1,98 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -from itertools import chain -import os - -import cv2 -from detectron2.config import get_cfg -from detectron2.data import ( - DatasetCatalog, - MetadataCatalog, - build_detection_train_loader, - detection_utils as utils, -) -from detectron2.data.build import filter_images_with_few_keypoints -from detectron2.utils.logger import setup_logger -from detectron2.utils.visualizer import Visualizer -import tqdm - - -def setup(args): - cfg = get_cfg() - if args.config_file: - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - cfg.DATALOADER.NUM_WORKERS = 0 - cfg.freeze() - return cfg - - -def parse_args(in_args=None): - parser = argparse.ArgumentParser(description="Visualize ground-truth data") - parser.add_argument( - "--source", - choices=["annotation", "dataloader"], - required=True, - help="visualize the annotations or the data loader (with pre-processing)", - ) - parser.add_argument("--config-file", metavar="FILE", help="path to config file") - parser.add_argument("--output-dir", default="./", help="path to output directory") - parser.add_argument("--show", action="store_true", help="show output in a window") - parser.add_argument( - "opts", - help="Modify config options using the command-line", - default=None, - nargs=argparse.REMAINDER, - ) - return parser.parse_args(in_args) - - -if __name__ == "__main__": - args = parse_args() - logger = setup_logger() - logger.info("Arguments: " + str(args)) - cfg = setup(args) - - dirname = args.output_dir - os.makedirs(dirname, exist_ok=True) - metadata = MetadataCatalog.get(cfg.DATASETS.TRAIN[0]) - - def output(vis, fname) -> None: - if args.show: - print(fname) - cv2.imshow("window", vis.get_image()[:, :, ::-1]) - cv2.waitKey() - else: - filepath = os.path.join(dirname, fname) - print(f"Saving to {filepath} ...") - vis.save(filepath) - - scale = 1.0 - if args.source == "dataloader": - train_data_loader = build_detection_train_loader(cfg) - for batch in train_data_loader: - for per_image in batch: - # Pytorch tensor is in (C, H, W) format - img = per_image["image"].permute(1, 2, 0).cpu().detach().numpy() - img = utils.convert_image_to_rgb(img, cfg.INPUT.FORMAT) - - visualizer = Visualizer(img, metadata=metadata, scale=scale) - target_fields = per_image["instances"].get_fields() - labels = [metadata.thing_classes[i] for i in target_fields["gt_classes"]] - vis = visualizer.overlay_instances( - labels=labels, - boxes=target_fields.get("gt_boxes", None), - masks=target_fields.get("gt_masks", None), - keypoints=target_fields.get("gt_keypoints", None), - ) - output(vis, str(per_image["image_id"]) + ".jpg") - else: - dicts = list(chain.from_iterable([DatasetCatalog.get(k) for k in cfg.DATASETS.TRAIN])) - if cfg.MODEL.KEYPOINT_ON: - dicts = filter_images_with_few_keypoints(dicts, 1) - for dic in tqdm.tqdm(dicts): - img = utils.read_image(dic["file_name"], "RGB") - visualizer = Visualizer(img, metadata=metadata, scale=scale) - vis = visualizer.draw_dataset_dict(dic) - output(vis, os.path.basename(dic["file_name"])) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/visualize_json_results.py b/dimos/models/Detic/third_party/CenterNet2/tools/visualize_json_results.py deleted file mode 100755 index 04dea72446..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/tools/visualize_json_results.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. - -import argparse -from collections import defaultdict -import json -import os - -import cv2 -from detectron2.data import DatasetCatalog, MetadataCatalog -from detectron2.structures import Boxes, BoxMode, Instances -from detectron2.utils.file_io import PathManager -from detectron2.utils.logger import setup_logger -from detectron2.utils.visualizer import Visualizer -import numpy as np -import tqdm - - -def create_instances(predictions, image_size: int): - ret = Instances(image_size) - - score = np.asarray([x["score"] for x in predictions]) - chosen = (score > args.conf_threshold).nonzero()[0] - score = score[chosen] - bbox = np.asarray([predictions[i]["bbox"] for i in chosen]).reshape(-1, 4) - bbox = BoxMode.convert(bbox, BoxMode.XYWH_ABS, BoxMode.XYXY_ABS) - - labels = np.asarray([dataset_id_map(predictions[i]["category_id"]) for i in chosen]) - - ret.scores = score - ret.pred_boxes = Boxes(bbox) - ret.pred_classes = labels - - try: - ret.pred_masks = [predictions[i]["segmentation"] for i in chosen] - except KeyError: - pass - return ret - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - description="A script that visualizes the json predictions from COCO or LVIS dataset." - ) - parser.add_argument("--input", required=True, help="JSON file produced by the model") - parser.add_argument("--output", required=True, help="output directory") - parser.add_argument("--dataset", help="name of the dataset", default="coco_2017_val") - parser.add_argument("--conf-threshold", default=0.5, type=float, help="confidence threshold") - args = parser.parse_args() - - logger = setup_logger() - - with PathManager.open(args.input, "r") as f: - predictions = json.load(f) - - pred_by_image = defaultdict(list) - for p in predictions: - pred_by_image[p["image_id"]].append(p) - - dicts = list(DatasetCatalog.get(args.dataset)) - metadata = MetadataCatalog.get(args.dataset) - if hasattr(metadata, "thing_dataset_id_to_contiguous_id"): - - def dataset_id_map(ds_id): - return metadata.thing_dataset_id_to_contiguous_id[ds_id] - - elif "lvis" in args.dataset: - # LVIS results are in the same format as COCO results, but have a different - # mapping from dataset category id to contiguous category id in [0, #categories - 1] - def dataset_id_map(ds_id): - return ds_id - 1 - - else: - raise ValueError(f"Unsupported dataset: {args.dataset}") - - os.makedirs(args.output, exist_ok=True) - - for dic in tqdm.tqdm(dicts): - img = cv2.imread(dic["file_name"], cv2.IMREAD_COLOR)[:, :, ::-1] - basename = os.path.basename(dic["file_name"]) - - predictions = create_instances(pred_by_image[dic["image_id"]], img.shape[:2]) - vis = Visualizer(img, metadata) - vis_pred = vis.draw_instance_predictions(predictions).get_image() - - vis = Visualizer(img, metadata) - vis_gt = vis.draw_dataset_dict(dic).get_image() - - concat = np.concatenate((vis_pred, vis_gt), axis=1) - cv2.imwrite(os.path.join(args.output, basename), concat[:, :, ::-1]) diff --git a/dimos/models/Detic/third_party/CenterNet2/train_net.py b/dimos/models/Detic/third_party/CenterNet2/train_net.py deleted file mode 100644 index 92859d7586..0000000000 --- a/dimos/models/Detic/third_party/CenterNet2/train_net.py +++ /dev/null @@ -1,227 +0,0 @@ -from collections import OrderedDict -import datetime -import logging -import os -import time - -from centernet.config import add_centernet_config -from centernet.data.custom_build_augmentation import build_custom_augmentation -from detectron2.checkpoint import DetectionCheckpointer, PeriodicCheckpointer -from detectron2.config import get_cfg -from detectron2.data import ( - MetadataCatalog, - build_detection_test_loader, -) -from detectron2.data.build import build_detection_train_loader -from detectron2.data.dataset_mapper import DatasetMapper -from detectron2.engine import default_argument_parser, default_setup, launch -from detectron2.evaluation import ( - COCOEvaluator, - LVISEvaluator, - inference_on_dataset, - print_csv_format, -) -from detectron2.modeling import build_model -from detectron2.modeling.test_time_augmentation import GeneralizedRCNNWithTTA -from detectron2.solver import build_lr_scheduler, build_optimizer -import detectron2.utils.comm as comm -from detectron2.utils.events import ( - CommonMetricPrinter, - EventStorage, - JSONWriter, - TensorboardXWriter, -) -from fvcore.common.timer import Timer -import torch -from torch.nn.parallel import DistributedDataParallel - -logger = logging.getLogger("detectron2") - - -def do_test(cfg, model): - results = OrderedDict() - for dataset_name in cfg.DATASETS.TEST: - mapper = ( - None - if cfg.INPUT.TEST_INPUT_TYPE == "default" - else DatasetMapper(cfg, False, augmentations=build_custom_augmentation(cfg, False)) - ) - data_loader = build_detection_test_loader(cfg, dataset_name, mapper=mapper) - output_folder = os.path.join(cfg.OUTPUT_DIR, f"inference_{dataset_name}") - evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type - - if evaluator_type == "lvis": - evaluator = LVISEvaluator(dataset_name, cfg, True, output_folder) - elif evaluator_type == "coco": - evaluator = COCOEvaluator(dataset_name, cfg, True, output_folder) - else: - assert 0, evaluator_type - - results[dataset_name] = inference_on_dataset(model, data_loader, evaluator) - if comm.is_main_process(): - logger.info(f"Evaluation results for {dataset_name} in csv format:") - print_csv_format(results[dataset_name]) - if len(results) == 1: - results = next(iter(results.values())) - return results - - -def do_train(cfg, model, resume: bool=False) -> None: - model.train() - optimizer = build_optimizer(cfg, model) - scheduler = build_lr_scheduler(cfg, optimizer) - - checkpointer = DetectionCheckpointer( - model, cfg.OUTPUT_DIR, optimizer=optimizer, scheduler=scheduler - ) - - start_iter = ( - checkpointer.resume_or_load( - cfg.MODEL.WEIGHTS, - resume=resume, - ).get("iteration", -1) - + 1 - ) - if cfg.SOLVER.RESET_ITER: - logger.info("Reset loaded iteration. Start training from iteration 0.") - start_iter = 0 - max_iter = cfg.SOLVER.MAX_ITER if cfg.SOLVER.TRAIN_ITER < 0 else cfg.SOLVER.TRAIN_ITER - - periodic_checkpointer = PeriodicCheckpointer( - checkpointer, cfg.SOLVER.CHECKPOINT_PERIOD, max_iter=max_iter - ) - - writers = ( - [ - CommonMetricPrinter(max_iter), - JSONWriter(os.path.join(cfg.OUTPUT_DIR, "metrics.json")), - TensorboardXWriter(cfg.OUTPUT_DIR), - ] - if comm.is_main_process() - else [] - ) - - mapper = ( - DatasetMapper(cfg, True) - if cfg.INPUT.CUSTOM_AUG == "" - else DatasetMapper(cfg, True, augmentations=build_custom_augmentation(cfg, True)) - ) - if cfg.DATALOADER.SAMPLER_TRAIN in ["TrainingSampler", "RepeatFactorTrainingSampler"]: - data_loader = build_detection_train_loader(cfg, mapper=mapper) - else: - from centernet.data.custom_dataset_dataloader import build_custom_train_loader - - data_loader = build_custom_train_loader(cfg, mapper=mapper) - - logger.info(f"Starting training from iteration {start_iter}") - with EventStorage(start_iter) as storage: - step_timer = Timer() - data_timer = Timer() - start_time = time.perf_counter() - for data, iteration in zip(data_loader, range(start_iter, max_iter), strict=False): - data_time = data_timer.seconds() - storage.put_scalars(data_time=data_time) - step_timer.reset() - iteration = iteration + 1 - storage.step() - loss_dict = model(data) - - losses = sum(loss for k, loss in loss_dict.items()) - assert torch.isfinite(losses).all(), loss_dict - - loss_dict_reduced = {k: v.item() for k, v in comm.reduce_dict(loss_dict).items()} - losses_reduced = sum(loss for loss in loss_dict_reduced.values()) - if comm.is_main_process(): - storage.put_scalars(total_loss=losses_reduced, **loss_dict_reduced) - - optimizer.zero_grad() - losses.backward() - optimizer.step() - - storage.put_scalar("lr", optimizer.param_groups[0]["lr"], smoothing_hint=False) - - step_time = step_timer.seconds() - storage.put_scalars(time=step_time) - data_timer.reset() - scheduler.step() - - if ( - cfg.TEST.EVAL_PERIOD > 0 - and iteration % cfg.TEST.EVAL_PERIOD == 0 - and iteration != max_iter - ): - do_test(cfg, model) - comm.synchronize() - - if iteration - start_iter > 5 and (iteration % 20 == 0 or iteration == max_iter): - for writer in writers: - writer.write() - periodic_checkpointer.step(iteration) - - total_time = time.perf_counter() - start_time - logger.info( - f"Total training time: {datetime.timedelta(seconds=int(total_time))!s}" - ) - - -def setup(args): - """ - Create configs and perform basic setups. - """ - cfg = get_cfg() - add_centernet_config(cfg) - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - if "/auto" in cfg.OUTPUT_DIR: - file_name = os.path.basename(args.config_file)[:-5] - cfg.OUTPUT_DIR = cfg.OUTPUT_DIR.replace("/auto", f"/{file_name}") - logger.info(f"OUTPUT_DIR: {cfg.OUTPUT_DIR}") - cfg.freeze() - default_setup(cfg, args) - return cfg - - -def main(args): - cfg = setup(args) - - model = build_model(cfg) - logger.info(f"Model:\n{model}") - if args.eval_only: - DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( - cfg.MODEL.WEIGHTS, resume=args.resume - ) - if cfg.TEST.AUG.ENABLED: - logger.info("Running inference with test-time augmentation ...") - model = GeneralizedRCNNWithTTA(cfg, model, batch_size=1) - - return do_test(cfg, model) - - distributed = comm.get_world_size() > 1 - if distributed: - model = DistributedDataParallel( - model, - device_ids=[comm.get_local_rank()], - broadcast_buffers=False, - find_unused_parameters=True, - ) - - do_train(cfg, model, resume=args.resume) - return do_test(cfg, model) - - -if __name__ == "__main__": - args = default_argument_parser() - args.add_argument("--manual_device", default="") - args = args.parse_args() - if args.manual_device != "": - os.environ["CUDA_VISIBLE_DEVICES"] = args.manual_device - args.dist_url = f"tcp://127.0.0.1:{torch.randint(11111, 60000, (1,))[0].item()}" - print("Command Line Args:", args) - launch( - main, - args.num_gpus, - num_machines=args.num_machines, - machine_rank=args.machine_rank, - dist_url=args.dist_url, - args=(args,), - ) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/LICENSE b/dimos/models/Detic/third_party/Deformable-DETR/LICENSE deleted file mode 100644 index 522e5bd3b6..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/LICENSE +++ /dev/null @@ -1,220 +0,0 @@ -Copyright (c) 2020 SenseTime. All Rights Reserved. - - Apache License - Version 2.0, January 2004 - http://www.apache.org/licenses/ - - TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, - and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by - the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all - other entities that control, are controlled by, or are under common - control with that entity. For the purposes of this definition, - "control" means (i) the power, direct or indirect, to cause the - direction or management of such entity, whether by contract or - otherwise, or (ii) ownership of fifty percent (50%) or more of the - outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity - exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, - including but not limited to software source code, documentation - source, and configuration files. - - "Object" form shall mean any form resulting from mechanical - transformation or translation of a Source form, including but - not limited to compiled object code, generated documentation, - and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or - Object form, made available under the License, as indicated by a - copyright notice that is included in or attached to the work - (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object - form, that is based on (or derived from) the Work and for which the - editorial revisions, annotations, elaborations, or other modifications - represent, as a whole, an original work of authorship. For the purposes - of this License, Derivative Works shall not include works that remain - separable from, or merely link (or bind by name) to the interfaces of, - the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including - the original version of the Work and any modifications or additions - to that Work or Derivative Works thereof, that is intentionally - submitted to Licensor for inclusion in the Work by the copyright owner - or by an individual or Legal Entity authorized to submit on behalf of - the copyright owner. For the purposes of this definition, "submitted" - means any form of electronic, verbal, or written communication sent - to the Licensor or its representatives, including but not limited to - communication on electronic mailing lists, source code control systems, - and issue tracking systems that are managed by, or on behalf of, the - Licensor for the purpose of discussing and improving the Work, but - excluding communication that is conspicuously marked or otherwise - designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity - on behalf of whom a Contribution has been received by Licensor and - subsequently incorporated within the Work. - - 2. Grant of Copyright License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - copyright license to reproduce, prepare Derivative Works of, - publicly display, publicly perform, sublicense, and distribute the - Work and such Derivative Works in Source or Object form. - - 3. Grant of Patent License. Subject to the terms and conditions of - this License, each Contributor hereby grants to You a perpetual, - worldwide, non-exclusive, no-charge, royalty-free, irrevocable - (except as stated in this section) patent license to make, have made, - use, offer to sell, sell, import, and otherwise transfer the Work, - where such license applies only to those patent claims licensable - by such Contributor that are necessarily infringed by their - Contribution(s) alone or by combination of their Contribution(s) - with the Work to which such Contribution(s) was submitted. If You - institute patent litigation against any entity (including a - cross-claim or counterclaim in a lawsuit) alleging that the Work - or a Contribution incorporated within the Work constitutes direct - or contributory patent infringement, then any patent licenses - granted to You under this License for that Work shall terminate - as of the date such litigation is filed. - - 4. Redistribution. You may reproduce and distribute copies of the - Work or Derivative Works thereof in any medium, with or without - modifications, and in Source or Object form, provided that You - meet the following conditions: - - (a) You must give any other recipients of the Work or - Derivative Works a copy of this License; and - - (b) You must cause any modified files to carry prominent notices - stating that You changed the files; and - - (c) You must retain, in the Source form of any Derivative Works - that You distribute, all copyright, patent, trademark, and - attribution notices from the Source form of the Work, - excluding those notices that do not pertain to any part of - the Derivative Works; and - - (d) If the Work includes a "NOTICE" text file as part of its - distribution, then any Derivative Works that You distribute must - include a readable copy of the attribution notices contained - within such NOTICE file, excluding those notices that do not - pertain to any part of the Derivative Works, in at least one - of the following places: within a NOTICE text file distributed - as part of the Derivative Works; within the Source form or - documentation, if provided along with the Derivative Works; or, - within a display generated by the Derivative Works, if and - wherever such third-party notices normally appear. The contents - of the NOTICE file are for informational purposes only and - do not modify the License. You may add Your own attribution - notices within Derivative Works that You distribute, alongside - or as an addendum to the NOTICE text from the Work, provided - that such additional attribution notices cannot be construed - as modifying the License. - - You may add Your own copyright statement to Your modifications and - may provide additional or different license terms and conditions - for use, reproduction, or distribution of Your modifications, or - for any such Derivative Works as a whole, provided Your use, - reproduction, and distribution of the Work otherwise complies with - the conditions stated in this License. - - 5. Submission of Contributions. Unless You explicitly state otherwise, - any Contribution intentionally submitted for inclusion in the Work - by You to the Licensor shall be under the terms and conditions of - this License, without any additional terms or conditions. - Notwithstanding the above, nothing herein shall supersede or modify - the terms of any separate license agreement you may have executed - with Licensor regarding such Contributions. - - 6. Trademarks. This License does not grant permission to use the trade - names, trademarks, service marks, or product names of the Licensor, - except as required for reasonable and customary use in describing the - origin of the Work and reproducing the content of the NOTICE file. - - 7. Disclaimer of Warranty. Unless required by applicable law or - agreed to in writing, Licensor provides the Work (and each - Contributor provides its Contributions) on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or - implied, including, without limitation, any warranties or conditions - of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A - PARTICULAR PURPOSE. You are solely responsible for determining the - appropriateness of using or redistributing the Work and assume any - risks associated with Your exercise of permissions under this License. - - 8. Limitation of Liability. In no event and under no legal theory, - whether in tort (including negligence), contract, or otherwise, - unless required by applicable law (such as deliberate and grossly - negligent acts) or agreed to in writing, shall any Contributor be - liable to You for damages, including any direct, indirect, special, - incidental, or consequential damages of any character arising as a - result of this License or out of the use or inability to use the - Work (including but not limited to damages for loss of goodwill, - work stoppage, computer failure or malfunction, or any and all - other commercial damages or losses), even if such Contributor - has been advised of the possibility of such damages. - - 9. Accepting Warranty or Additional Liability. While redistributing - the Work or Derivative Works thereof, You may choose to offer, - and charge a fee for, acceptance of support, warranty, indemnity, - or other liability obligations and/or rights consistent with this - License. However, in accepting such obligations, You may act only - on Your own behalf and on Your sole responsibility, not on behalf - of any other Contributor, and only if You agree to indemnify, - defend, and hold each Contributor harmless for any liability - incurred by, or claims asserted against, such Contributor by reason - of your accepting any such warranty or additional liability. - - END OF TERMS AND CONDITIONS - - APPENDIX: How to apply the Apache License to your work. - - To apply the Apache License to your work, attach the following - boilerplate notice, with the fields enclosed by brackets "[]" - replaced with your own identifying information. (Don't include - the brackets!) The text should be enclosed in the appropriate - comment syntax for the file format. We also recommend that a - file or class name and description of purpose be included on the - same "printed page" as the copyright notice for easier - identification within third-party archives. - - Copyright 2020 SenseTime - - Licensed under the Apache License, Version 2.0 (the "License"); - you may not use this file except in compliance with the License. - You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - - Unless required by applicable law or agreed to in writing, software - distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the License for the specific language governing permissions and - limitations under the License. - - -DETR - -Copyright 2020 - present, Facebook, Inc - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. diff --git a/dimos/models/Detic/third_party/Deformable-DETR/README.md b/dimos/models/Detic/third_party/Deformable-DETR/README.md deleted file mode 100644 index c9db563511..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/README.md +++ /dev/null @@ -1,169 +0,0 @@ -# Deformable DETR - -By [Xizhou Zhu](https://scholar.google.com/citations?user=02RXI00AAAAJ), [Weijie Su](https://www.weijiesu.com/), [Lewei Lu](https://www.linkedin.com/in/lewei-lu-94015977/), [Bin Li](http://staff.ustc.edu.cn/~binli/), [Xiaogang Wang](http://www.ee.cuhk.edu.hk/~xgwang/), [Jifeng Dai](https://jifengdai.org/). - -This repository is an official implementation of the paper [Deformable DETR: Deformable Transformers for End-to-End Object Detection](https://arxiv.org/abs/2010.04159). - - -## Introduction - -**TL; DR.** Deformable DETR is an efficient and fast-converging end-to-end object detector. It mitigates the high complexity and slow convergence issues of DETR via a novel sampling-based efficient attention mechanism. - -![deformable_detr](./figs/illustration.png) - -![deformable_detr](./figs/convergence.png) - -**Abstract.** DETR has been recently proposed to eliminate the need for many hand-designed components in object detection while demonstrating good performance. However, it suffers from slow convergence and limited feature spatial resolution, due to the limitation of Transformer attention modules in processing image feature maps. To mitigate these issues, we proposed Deformable DETR, whose attention modules only attend to a small set of key sampling points around a reference. Deformable DETR can achieve better performance than DETR (especially on small objects) with 10Ɨ less training epochs. Extensive experiments on the COCO benchmark demonstrate the effectiveness of our approach. - -## License - -This project is released under the [Apache 2.0 license](./LICENSE). - -## Changelog - -See [changelog.md](./docs/changelog.md) for detailed logs of major changes. - - -## Citing Deformable DETR -If you find Deformable DETR useful in your research, please consider citing: -```bibtex -@article{zhu2020deformable, - title={Deformable DETR: Deformable Transformers for End-to-End Object Detection}, - author={Zhu, Xizhou and Su, Weijie and Lu, Lewei and Li, Bin and Wang, Xiaogang and Dai, Jifeng}, - journal={arXiv preprint arXiv:2010.04159}, - year={2020} -} -``` - -## Main Results - -| Method | Epochs | AP | APS | APM | APL | params
(M)
| FLOPs
(G)
| Total
Train
Time
(GPU
hours)
| Train
Speed
(GPU
hours
/epoch)
| Infer
Speed
(FPS)
| Batch
Infer
Speed
(FPS)
| URL | -| ----------------------------------- | :----: | :--: | :----: | :---: | :------------------------------: | :--------------------:| :----------------------------------------------------------: | :--: | :---: | :---: | ----- | ----- | -| Faster R-CNN + FPN | 109 | 42.0 | 26.6 | 45.4 | 53.4 | 42 | 180 | 380 | 3.5 | 25.6 | 28.0 | - | -| DETR | 500 | 42.0 | 20.5 | 45.8 | 61.1 | 41 | 86 | 2000 | 4.0 | 27.0 | 38.3 | - | -| DETR-DC5 | 500 | 43.3 | 22.5 | 47.3 | 61.1 | 41 |187|7000|14.0|11.4|12.4| - | -| DETR-DC5 | 50 | 35.3 | 15.2 | 37.5 | 53.6 | 41 |187|700|14.0|11.4|12.4| - | -| DETR-DC5+ | 50 | 36.2 | 16.3 | 39.2 | 53.9 | 41 |187|700|14.0|11.4|12.4| - | -| **Deformable DETR
(single scale)
** | 50 | 39.4 | 20.6 | 43.0 | 55.5 | 34 |78|160|3.2|27.0|42.4| [config](./configs/r50_deformable_detr_single_scale.sh)
[log](https://drive.google.com/file/d/1n3ZnZ-UAqmTUR4AZoM4qQntIDn6qCZx4/view?usp=sharing)
[model](https://drive.google.com/file/d/1WEjQ9_FgfI5sw5OZZ4ix-OKk-IJ_-SDU/view?usp=sharing)
| -| **Deformable DETR
(single scale, DC5)
** | 50 | 41.5 | 24.1 | 45.3 | 56.0 | 34 |128|215|4.3|22.1|29.4| [config](./configs/r50_deformable_detr_single_scale_dc5.sh)
[log](https://drive.google.com/file/d/1-UfTp2q4GIkJjsaMRIkQxa5k5vn8_n-B/view?usp=sharing)
[model](https://drive.google.com/file/d/1m_TgMjzH7D44fbA-c_jiBZ-xf-odxGdk/view?usp=sharing)
| -| **Deformable DETR** | 50 | 44.5 | 27.1 | 47.6 | 59.6 | 40 |173|325|6.5|15.0|19.4|[config](./configs/r50_deformable_detr.sh)
[log](https://drive.google.com/file/d/18YSLshFjc_erOLfFC-hHu4MX4iyz1Dqr/view?usp=sharing)
[model](https://drive.google.com/file/d/1nDWZWHuRwtwGden77NLM9JoWe-YisJnA/view?usp=sharing)
| -| **+ iterative bounding box refinement** | 50 | 46.2 | 28.3 | 49.2 | 61.5 | 41 |173|325|6.5|15.0|19.4|[config](./configs/r50_deformable_detr_plus_iterative_bbox_refinement.sh)
[log](https://drive.google.com/file/d/1DFNloITi1SFBWjYzvVEAI75ndwmGM1Uj/view?usp=sharing)
[model](https://drive.google.com/file/d/1JYKyRYzUH7uo9eVfDaVCiaIGZb5YTCuI/view?usp=sharing)
| -| **++ two-stage Deformable DETR** | 50 | 46.9 | 29.6 | 50.1 | 61.6 | 41 |173|340|6.8|14.5|18.8|[config](./configs/r50_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage.sh)
[log](https://drive.google.com/file/d/1ozi0wbv5-Sc5TbWt1jAuXco72vEfEtbY/view?usp=sharing)
[model](https://drive.google.com/file/d/15I03A7hNTpwuLNdfuEmW9_taZMNVssEp/view?usp=sharing)
| - -*Note:* - -1. All models of Deformable DETR are trained with total batch size of 32. -2. Training and inference speed are measured on NVIDIA Tesla V100 GPU. -3. "Deformable DETR (single scale)" means only using res5 feature map (of stride 32) as input feature maps for Deformable Transformer Encoder. -4. "DC5" means removing the stride in C5 stage of ResNet and add a dilation of 2 instead. -5. "DETR-DC5+" indicates DETR-DC5 with some modifications, including using Focal Loss for bounding box classification and increasing number of object queries to 300. -6. "Batch Infer Speed" refer to inference with batch size = 4 to maximize GPU utilization. -7. The original implementation is based on our internal codebase. There are slight differences in the final accuracy and running time due to the plenty details in platform switch. - - -## Installation - -### Requirements - -* Linux, CUDA>=9.2, GCC>=5.4 - -* Python>=3.7 - - We recommend you to use Anaconda to create a conda environment: - ```bash - conda create -n deformable_detr python=3.7 pip - ``` - Then, activate the environment: - ```bash - conda activate deformable_detr - ``` - -* PyTorch>=1.5.1, torchvision>=0.6.1 (following instructions [here](https://pytorch.org/)) - - For example, if your CUDA version is 9.2, you could install pytorch and torchvision as following: - ```bash - conda install pytorch=1.5.1 torchvision=0.6.1 cudatoolkit=9.2 -c pytorch - ``` - -* Other requirements - ```bash - pip install -r requirements.txt - ``` - -### Compiling CUDA operators -```bash -cd ./models/ops -sh ./make.sh -# unit test (should see all checking is True) -python test.py -``` - -## Usage - -### Dataset preparation - -Please download [COCO 2017 dataset](https://cocodataset.org/) and organize them as following: - -``` -code_root/ -└── data/ - └── coco/ - ā”œā”€ā”€ train2017/ - ā”œā”€ā”€ val2017/ - └── annotations/ - ā”œā”€ā”€ instances_train2017.json - └── instances_val2017.json -``` - -### Training - -#### Training on single node - -For example, the command for training Deformable DETR on 8 GPUs is as following: - -```bash -GPUS_PER_NODE=8 ./tools/run_dist_launch.sh 8 ./configs/r50_deformable_detr.sh -``` - -#### Training on multiple nodes - -For example, the command for training Deformable DETR on 2 nodes of each with 8 GPUs is as following: - -On node 1: - -```bash -MASTER_ADDR= NODE_RANK=0 GPUS_PER_NODE=8 ./tools/run_dist_launch.sh 16 ./configs/r50_deformable_detr.sh -``` - -On node 2: - -```bash -MASTER_ADDR= NODE_RANK=1 GPUS_PER_NODE=8 ./tools/run_dist_launch.sh 16 ./configs/r50_deformable_detr.sh -``` - -#### Training on slurm cluster - -If you are using slurm cluster, you can simply run the following command to train on 1 node with 8 GPUs: - -```bash -GPUS_PER_NODE=8 ./tools/run_dist_slurm.sh deformable_detr 8 configs/r50_deformable_detr.sh -``` - -Or 2 nodes of each with 8 GPUs: - -```bash -GPUS_PER_NODE=8 ./tools/run_dist_slurm.sh deformable_detr 16 configs/r50_deformable_detr.sh -``` -#### Some tips to speed-up training -* If your file system is slow to read images, you may consider enabling '--cache_mode' option to load whole dataset into memory at the beginning of training. -* You may increase the batch size to maximize the GPU utilization, according to GPU memory of yours, e.g., set '--batch_size 3' or '--batch_size 4'. - -### Evaluation - -You can get the config file and pretrained model of Deformable DETR (the link is in "Main Results" session), then run following command to evaluate it on COCO 2017 validation set: - -```bash - --resume --eval -``` - -You can also run distributed evaluation by using ```./tools/run_dist_launch.sh``` or ```./tools/run_dist_slurm.sh```. diff --git a/dimos/models/Detic/third_party/Deformable-DETR/benchmark.py b/dimos/models/Detic/third_party/Deformable-DETR/benchmark.py deleted file mode 100644 index 3a4fcbd4e6..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/benchmark.py +++ /dev/null @@ -1,70 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ - -""" -Benchmark inference speed of Deformable DETR. -""" - -import argparse -import os -import time - -from datasets import build_dataset -from main import get_args_parser as get_main_args_parser -from models import build_model -import torch -from util.misc import nested_tensor_from_tensor_list - - -def get_benckmark_arg_parser(): - parser = argparse.ArgumentParser("Benchmark inference speed of Deformable DETR.") - parser.add_argument("--num_iters", type=int, default=300, help="total iters to benchmark speed") - parser.add_argument( - "--warm_iters", type=int, default=5, help="ignore first several iters that are very slow" - ) - parser.add_argument("--batch_size", type=int, default=1, help="batch size in inference") - parser.add_argument("--resume", type=str, help="load the pre-trained checkpoint") - return parser - - -@torch.no_grad() -def measure_average_inference_time(model, inputs, num_iters: int=100, warm_iters: int=5): - ts = [] - for iter_ in range(num_iters): - torch.cuda.synchronize() - t_ = time.perf_counter() - model(inputs) - torch.cuda.synchronize() - t = time.perf_counter() - t_ - if iter_ >= warm_iters: - ts.append(t) - print(ts) - return sum(ts) / len(ts) - - -def benchmark(): - args, _ = get_benckmark_arg_parser().parse_known_args() - main_args = get_main_args_parser().parse_args(_) - assert args.warm_iters < args.num_iters and args.num_iters > 0 and args.warm_iters >= 0 - assert args.batch_size > 0 - assert args.resume is None or os.path.exists(args.resume) - dataset = build_dataset("val", main_args) - model, _, _ = build_model(main_args) - model.cuda() - model.eval() - if args.resume is not None: - ckpt = torch.load(args.resume, map_location=lambda storage, loc: storage) - model.load_state_dict(ckpt["model"]) - inputs = nested_tensor_from_tensor_list( - [dataset.__getitem__(0)[0].cuda() for _ in range(args.batch_size)] - ) - t = measure_average_inference_time(model, inputs, args.num_iters, args.warm_iters) - return 1.0 / t * args.batch_size - - -if __name__ == "__main__": - fps = benchmark() - print(f"Inference Speed: {fps:.1f} FPS") diff --git a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr.sh b/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr.sh deleted file mode 100755 index a42953f266..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash - -set -x - -EXP_DIR=exps/r50_deformable_detr -PY_ARGS=${@:1} - -python -u main.py \ - --output_dir ${EXP_DIR} \ - ${PY_ARGS} diff --git a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_plus_iterative_bbox_refinement.sh b/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_plus_iterative_bbox_refinement.sh deleted file mode 100755 index 8ea20006b1..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_plus_iterative_bbox_refinement.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -x - -EXP_DIR=exps/r50_deformable_detr_plus_iterative_bbox_refinement -PY_ARGS=${@:1} - -python -u main.py \ - --output_dir ${EXP_DIR} \ - --with_box_refine \ - ${PY_ARGS} diff --git a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage.sh b/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage.sh deleted file mode 100755 index 722c658e45..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -x - -EXP_DIR=exps/r50_deformable_detr_plus_iterative_bbox_refinement_plus_plus_two_stage -PY_ARGS=${@:1} - -python -u main.py \ - --output_dir ${EXP_DIR} \ - --with_box_refine \ - --two_stage \ - ${PY_ARGS} diff --git a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_single_scale.sh b/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_single_scale.sh deleted file mode 100755 index a24e54718d..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_single_scale.sh +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env bash - -set -x - -EXP_DIR=exps/r50_deformable_detr_single_scale -PY_ARGS=${@:1} - -python -u main.py \ - --num_feature_levels 1 \ - --output_dir ${EXP_DIR} \ - ${PY_ARGS} diff --git a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_single_scale_dc5.sh b/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_single_scale_dc5.sh deleted file mode 100755 index 26d35d6a49..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/configs/r50_deformable_detr_single_scale_dc5.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/usr/bin/env bash - -set -x - -EXP_DIR=exps/r50_deformable_detr_single_scale_dc5 -PY_ARGS=${@:1} - -python -u main.py \ - --num_feature_levels 1 \ - --dilation \ - --output_dir ${EXP_DIR} \ - ${PY_ARGS} diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/__init__.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/__init__.py deleted file mode 100644 index 870166e145..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/__init__.py +++ /dev/null @@ -1,34 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -import torch.utils.data - -from .coco import build as build_coco -from .torchvision_datasets import CocoDetection - - -def get_coco_api_from_dataset(dataset): - for _ in range(10): - # if isinstance(dataset, torchvision.datasets.CocoDetection): - # break - if isinstance(dataset, torch.utils.data.Subset): - dataset = dataset.dataset - if isinstance(dataset, CocoDetection): - return dataset.coco - - -def build_dataset(image_set, args): - if args.dataset_file == "coco": - return build_coco(image_set, args) - if args.dataset_file == "coco_panoptic": - # to avoid making panopticapi required for coco - from .coco_panoptic import build as build_coco_panoptic - - return build_coco_panoptic(image_set, args) - raise ValueError(f"dataset {args.dataset_file} not supported") diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco.py deleted file mode 100644 index aa00ce49e3..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco.py +++ /dev/null @@ -1,194 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -COCO dataset which returns image_id for evaluation. - -Mostly copy-paste from https://github.com/pytorch/vision/blob/13b35ff/references/detection/coco_utils.py -""" - -from pathlib import Path - -from pycocotools import mask as coco_mask -import torch -import torch.utils.data -from util.misc import get_local_rank, get_local_size - -import datasets.transforms as T - -from .torchvision_datasets import CocoDetection as TvCocoDetection - - -class CocoDetection(TvCocoDetection): - def __init__( - self, - img_folder, - ann_file, - transforms, - return_masks, - cache_mode: bool=False, - local_rank: int=0, - local_size: int=1, - ) -> None: - super().__init__( - img_folder, - ann_file, - cache_mode=cache_mode, - local_rank=local_rank, - local_size=local_size, - ) - self._transforms = transforms - self.prepare = ConvertCocoPolysToMask(return_masks) - - def __getitem__(self, idx: int): - img, target = super().__getitem__(idx) - image_id = self.ids[idx] - target = {"image_id": image_id, "annotations": target} - img, target = self.prepare(img, target) - if self._transforms is not None: - img, target = self._transforms(img, target) - return img, target - - -def convert_coco_poly_to_mask(segmentations, height, width: int): - masks = [] - for polygons in segmentations: - rles = coco_mask.frPyObjects(polygons, height, width) - mask = coco_mask.decode(rles) - if len(mask.shape) < 3: - mask = mask[..., None] - mask = torch.as_tensor(mask, dtype=torch.uint8) - mask = mask.any(dim=2) - masks.append(mask) - if masks: - masks = torch.stack(masks, dim=0) - else: - masks = torch.zeros((0, height, width), dtype=torch.uint8) - return masks - - -class ConvertCocoPolysToMask: - def __init__(self, return_masks: bool=False) -> None: - self.return_masks = return_masks - - def __call__(self, image, target): - w, h = image.size - - image_id = target["image_id"] - image_id = torch.tensor([image_id]) - - anno = target["annotations"] - - anno = [obj for obj in anno if "iscrowd" not in obj or obj["iscrowd"] == 0] - - boxes = [obj["bbox"] for obj in anno] - # guard against no boxes via resizing - boxes = torch.as_tensor(boxes, dtype=torch.float32).reshape(-1, 4) - boxes[:, 2:] += boxes[:, :2] - boxes[:, 0::2].clamp_(min=0, max=w) - boxes[:, 1::2].clamp_(min=0, max=h) - - classes = [obj["category_id"] for obj in anno] - classes = torch.tensor(classes, dtype=torch.int64) - - if self.return_masks: - segmentations = [obj["segmentation"] for obj in anno] - masks = convert_coco_poly_to_mask(segmentations, h, w) - - keypoints = None - if anno and "keypoints" in anno[0]: - keypoints = [obj["keypoints"] for obj in anno] - keypoints = torch.as_tensor(keypoints, dtype=torch.float32) - num_keypoints = keypoints.shape[0] - if num_keypoints: - keypoints = keypoints.view(num_keypoints, -1, 3) - - keep = (boxes[:, 3] > boxes[:, 1]) & (boxes[:, 2] > boxes[:, 0]) - boxes = boxes[keep] - classes = classes[keep] - if self.return_masks: - masks = masks[keep] - if keypoints is not None: - keypoints = keypoints[keep] - - target = {} - target["boxes"] = boxes - target["labels"] = classes - if self.return_masks: - target["masks"] = masks - target["image_id"] = image_id - if keypoints is not None: - target["keypoints"] = keypoints - - # for conversion to coco api - area = torch.tensor([obj["area"] for obj in anno]) - iscrowd = torch.tensor([obj["iscrowd"] if "iscrowd" in obj else 0 for obj in anno]) - target["area"] = area[keep] - target["iscrowd"] = iscrowd[keep] - - target["orig_size"] = torch.as_tensor([int(h), int(w)]) - target["size"] = torch.as_tensor([int(h), int(w)]) - - return image, target - - -def make_coco_transforms(image_set): - normalize = T.Compose([T.ToTensor(), T.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])]) - - scales = [480, 512, 544, 576, 608, 640, 672, 704, 736, 768, 800] - - if image_set == "train": - return T.Compose( - [ - T.RandomHorizontalFlip(), - T.RandomSelect( - T.RandomResize(scales, max_size=1333), - T.Compose( - [ - T.RandomResize([400, 500, 600]), - T.RandomSizeCrop(384, 600), - T.RandomResize(scales, max_size=1333), - ] - ), - ), - normalize, - ] - ) - - if image_set == "val": - return T.Compose( - [ - T.RandomResize([800], max_size=1333), - normalize, - ] - ) - - raise ValueError(f"unknown {image_set}") - - -def build(image_set, args): - root = Path(args.coco_path) - assert root.exists(), f"provided COCO path {root} does not exist" - mode = "instances" - PATHS = { - "train": (root / "train2017", root / "annotations" / f"{mode}_train2017.json"), - "val": (root / "val2017", root / "annotations" / f"{mode}_val2017.json"), - } - - img_folder, ann_file = PATHS[image_set] - dataset = CocoDetection( - img_folder, - ann_file, - transforms=make_coco_transforms(image_set), - return_masks=args.masks, - cache_mode=args.cache_mode, - local_rank=get_local_rank(), - local_size=get_local_size(), - ) - return dataset diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_eval.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_eval.py deleted file mode 100644 index 1a0e7962bd..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_eval.py +++ /dev/null @@ -1,265 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -COCO evaluator that works in distributed mode. - -Mostly copy-paste from https://github.com/pytorch/vision/blob/edfd5a7/references/detection/coco_eval.py -The difference is that there is less copy-pasting from pycocotools -in the end of the file, as python3 can suppress prints with contextlib -""" - -import contextlib -import copy -import os - -import numpy as np -from pycocotools.coco import COCO -from pycocotools.cocoeval import COCOeval -import pycocotools.mask as mask_util -import torch -from util.misc import all_gather - - -class CocoEvaluator: - def __init__(self, coco_gt, iou_types) -> None: - assert isinstance(iou_types, list | tuple) - coco_gt = copy.deepcopy(coco_gt) - self.coco_gt = coco_gt - - self.iou_types = iou_types - self.coco_eval = {} - for iou_type in iou_types: - self.coco_eval[iou_type] = COCOeval(coco_gt, iouType=iou_type) - - self.img_ids = [] - self.eval_imgs = {k: [] for k in iou_types} - - def update(self, predictions) -> None: - img_ids = list(np.unique(list(predictions.keys()))) - self.img_ids.extend(img_ids) - - for iou_type in self.iou_types: - results = self.prepare(predictions, iou_type) - - # suppress pycocotools prints - with open(os.devnull, "w") as devnull: - with contextlib.redirect_stdout(devnull): - coco_dt = COCO.loadRes(self.coco_gt, results) if results else COCO() - coco_eval = self.coco_eval[iou_type] - - coco_eval.cocoDt = coco_dt - coco_eval.params.imgIds = list(img_ids) - img_ids, eval_imgs = evaluate(coco_eval) - - self.eval_imgs[iou_type].append(eval_imgs) - - def synchronize_between_processes(self) -> None: - for iou_type in self.iou_types: - self.eval_imgs[iou_type] = np.concatenate(self.eval_imgs[iou_type], 2) - create_common_coco_eval( - self.coco_eval[iou_type], self.img_ids, self.eval_imgs[iou_type] - ) - - def accumulate(self) -> None: - for coco_eval in self.coco_eval.values(): - coco_eval.accumulate() - - def summarize(self) -> None: - for iou_type, coco_eval in self.coco_eval.items(): - print(f"IoU metric: {iou_type}") - coco_eval.summarize() - - def prepare(self, predictions, iou_type): - if iou_type == "bbox": - return self.prepare_for_coco_detection(predictions) - elif iou_type == "segm": - return self.prepare_for_coco_segmentation(predictions) - elif iou_type == "keypoints": - return self.prepare_for_coco_keypoint(predictions) - else: - raise ValueError(f"Unknown iou type {iou_type}") - - def prepare_for_coco_detection(self, predictions): - coco_results = [] - for original_id, prediction in predictions.items(): - if len(prediction) == 0: - continue - - boxes = prediction["boxes"] - boxes = convert_to_xywh(boxes).tolist() - scores = prediction["scores"].tolist() - labels = prediction["labels"].tolist() - - coco_results.extend( - [ - { - "image_id": original_id, - "category_id": labels[k], - "bbox": box, - "score": scores[k], - } - for k, box in enumerate(boxes) - ] - ) - return coco_results - - def prepare_for_coco_segmentation(self, predictions): - coco_results = [] - for original_id, prediction in predictions.items(): - if len(prediction) == 0: - continue - - scores = prediction["scores"] - labels = prediction["labels"] - masks = prediction["masks"] - - masks = masks > 0.5 - - scores = prediction["scores"].tolist() - labels = prediction["labels"].tolist() - - rles = [ - mask_util.encode(np.array(mask[0, :, :, np.newaxis], dtype=np.uint8, order="F"))[0] - for mask in masks - ] - for rle in rles: - rle["counts"] = rle["counts"].decode("utf-8") - - coco_results.extend( - [ - { - "image_id": original_id, - "category_id": labels[k], - "segmentation": rle, - "score": scores[k], - } - for k, rle in enumerate(rles) - ] - ) - return coco_results - - def prepare_for_coco_keypoint(self, predictions): - coco_results = [] - for original_id, prediction in predictions.items(): - if len(prediction) == 0: - continue - - boxes = prediction["boxes"] - boxes = convert_to_xywh(boxes).tolist() - scores = prediction["scores"].tolist() - labels = prediction["labels"].tolist() - keypoints = prediction["keypoints"] - keypoints = keypoints.flatten(start_dim=1).tolist() - - coco_results.extend( - [ - { - "image_id": original_id, - "category_id": labels[k], - "keypoints": keypoint, - "score": scores[k], - } - for k, keypoint in enumerate(keypoints) - ] - ) - return coco_results - - -def convert_to_xywh(boxes): - xmin, ymin, xmax, ymax = boxes.unbind(1) - return torch.stack((xmin, ymin, xmax - xmin, ymax - ymin), dim=1) - - -def merge(img_ids, eval_imgs): - all_img_ids = all_gather(img_ids) - all_eval_imgs = all_gather(eval_imgs) - - merged_img_ids = [] - for p in all_img_ids: - merged_img_ids.extend(p) - - merged_eval_imgs = [] - for p in all_eval_imgs: - merged_eval_imgs.append(p) - - merged_img_ids = np.array(merged_img_ids) - merged_eval_imgs = np.concatenate(merged_eval_imgs, 2) - - # keep only unique (and in sorted order) images - merged_img_ids, idx = np.unique(merged_img_ids, return_index=True) - merged_eval_imgs = merged_eval_imgs[..., idx] - - return merged_img_ids, merged_eval_imgs - - -def create_common_coco_eval(coco_eval, img_ids, eval_imgs) -> None: - img_ids, eval_imgs = merge(img_ids, eval_imgs) - img_ids = list(img_ids) - eval_imgs = list(eval_imgs.flatten()) - - coco_eval.evalImgs = eval_imgs - coco_eval.params.imgIds = img_ids - coco_eval._paramsEval = copy.deepcopy(coco_eval.params) - - -################################################################# -# From pycocotools, just removed the prints and fixed -# a Python3 bug about unicode not defined -################################################################# - - -def evaluate(self): - """ - Run per image evaluation on given images and store results (a list of dict) in self.evalImgs - :return: None - """ - # tic = time.time() - # print('Running per image evaluation...') - p = self.params - # add backward compatibility if useSegm is specified in params - if p.useSegm is not None: - p.iouType = "segm" if p.useSegm == 1 else "bbox" - print(f"useSegm (deprecated) is not None. Running {p.iouType} evaluation") - # print('Evaluate annotation type *{}*'.format(p.iouType)) - p.imgIds = list(np.unique(p.imgIds)) - if p.useCats: - p.catIds = list(np.unique(p.catIds)) - p.maxDets = sorted(p.maxDets) - self.params = p - - self._prepare() - # loop through images, area range, max detection number - catIds = p.catIds if p.useCats else [-1] - - if p.iouType == "segm" or p.iouType == "bbox": - computeIoU = self.computeIoU - elif p.iouType == "keypoints": - computeIoU = self.computeOks - self.ious = {(imgId, catId): computeIoU(imgId, catId) for imgId in p.imgIds for catId in catIds} - - evaluateImg = self.evaluateImg - maxDet = p.maxDets[-1] - evalImgs = [ - evaluateImg(imgId, catId, areaRng, maxDet) - for catId in catIds - for areaRng in p.areaRng - for imgId in p.imgIds - ] - # this is NOT in the pycocotools code, but could be done outside - evalImgs = np.asarray(evalImgs).reshape(len(catIds), len(p.areaRng), len(p.imgIds)) - self._paramsEval = copy.deepcopy(self.params) - # toc = time.time() - # print('DONE (t={:0.2f}s).'.format(toc-tic)) - return p.imgIds, evalImgs - - -################################################################# -# end of straight copy from pycocotools, just removing the prints -################################################################# diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_panoptic.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_panoptic.py deleted file mode 100644 index d1dd9bda59..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_panoptic.py +++ /dev/null @@ -1,119 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -import json -from pathlib import Path - -import numpy as np -from panopticapi.utils import rgb2id -from PIL import Image -import torch -from util.box_ops import masks_to_boxes - -from .coco import make_coco_transforms - - -class CocoPanoptic: - def __init__(self, img_folder, ann_folder, ann_file, transforms=None, return_masks: bool=True) -> None: - with open(ann_file) as f: - self.coco = json.load(f) - - # sort 'images' field so that they are aligned with 'annotations' - # i.e., in alphabetical order - self.coco["images"] = sorted(self.coco["images"], key=lambda x: x["id"]) - # sanity check - if "annotations" in self.coco: - for img, ann in zip(self.coco["images"], self.coco["annotations"], strict=False): - assert img["file_name"][:-4] == ann["file_name"][:-4] - - self.img_folder = img_folder - self.ann_folder = ann_folder - self.ann_file = ann_file - self.transforms = transforms - self.return_masks = return_masks - - def __getitem__(self, idx: int): - ann_info = ( - self.coco["annotations"][idx] - if "annotations" in self.coco - else self.coco["images"][idx] - ) - img_path = Path(self.img_folder) / ann_info["file_name"].replace(".png", ".jpg") - ann_path = Path(self.ann_folder) / ann_info["file_name"] - - img = Image.open(img_path).convert("RGB") - w, h = img.size - if "segments_info" in ann_info: - masks = np.asarray(Image.open(ann_path), dtype=np.uint32) - masks = rgb2id(masks) - - ids = np.array([ann["id"] for ann in ann_info["segments_info"]]) - masks = masks == ids[:, None, None] - - masks = torch.as_tensor(masks, dtype=torch.uint8) - labels = torch.tensor( - [ann["category_id"] for ann in ann_info["segments_info"]], dtype=torch.int64 - ) - - target = {} - target["image_id"] = torch.tensor( - [ann_info["image_id"] if "image_id" in ann_info else ann_info["id"]] - ) - if self.return_masks: - target["masks"] = masks - target["labels"] = labels - - target["boxes"] = masks_to_boxes(masks) - - target["size"] = torch.as_tensor([int(h), int(w)]) - target["orig_size"] = torch.as_tensor([int(h), int(w)]) - if "segments_info" in ann_info: - for name in ["iscrowd", "area"]: - target[name] = torch.tensor([ann[name] for ann in ann_info["segments_info"]]) - - if self.transforms is not None: - img, target = self.transforms(img, target) - - return img, target - - def __len__(self) -> int: - return len(self.coco["images"]) - - def get_height_and_width(self, idx: int): - img_info = self.coco["images"][idx] - height = img_info["height"] - width = img_info["width"] - return height, width - - -def build(image_set, args): - img_folder_root = Path(args.coco_path) - ann_folder_root = Path(args.coco_panoptic_path) - assert img_folder_root.exists(), f"provided COCO path {img_folder_root} does not exist" - assert ann_folder_root.exists(), f"provided COCO path {ann_folder_root} does not exist" - mode = "panoptic" - PATHS = { - "train": ("train2017", Path("annotations") / f"{mode}_train2017.json"), - "val": ("val2017", Path("annotations") / f"{mode}_val2017.json"), - } - - img_folder, ann_file = PATHS[image_set] - img_folder_path = img_folder_root / img_folder - ann_folder = ann_folder_root / f"{mode}_{img_folder}" - ann_file = ann_folder_root / ann_file - - dataset = CocoPanoptic( - img_folder_path, - ann_folder, - ann_file, - transforms=make_coco_transforms(image_set), - return_masks=args.masks, - ) - - return dataset diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/data_prefetcher.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/data_prefetcher.py deleted file mode 100644 index 4942500801..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/data_prefetcher.py +++ /dev/null @@ -1,74 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ - -import torch - - -def to_cuda(samples, targets, device): - samples = samples.to(device, non_blocking=True) - targets = [{k: v.to(device, non_blocking=True) for k, v in t.items()} for t in targets] - return samples, targets - - -class data_prefetcher: - def __init__(self, loader, device, prefetch: bool=True) -> None: - self.loader = iter(loader) - self.prefetch = prefetch - self.device = device - if prefetch: - self.stream = torch.cuda.Stream() - self.preload() - - def preload(self) -> None: - try: - self.next_samples, self.next_targets = next(self.loader) - except StopIteration: - self.next_samples = None - self.next_targets = None - return - # if record_stream() doesn't work, another option is to make sure device inputs are created - # on the main stream. - # self.next_input_gpu = torch.empty_like(self.next_input, device='cuda') - # self.next_target_gpu = torch.empty_like(self.next_target, device='cuda') - # Need to make sure the memory allocated for next_* is not still in use by the main stream - # at the time we start copying to next_*: - # self.stream.wait_stream(torch.cuda.current_stream()) - with torch.cuda.stream(self.stream): - self.next_samples, self.next_targets = to_cuda( - self.next_samples, self.next_targets, self.device - ) - # more code for the alternative if record_stream() doesn't work: - # copy_ will record the use of the pinned source tensor in this side stream. - # self.next_input_gpu.copy_(self.next_input, non_blocking=True) - # self.next_target_gpu.copy_(self.next_target, non_blocking=True) - # self.next_input = self.next_input_gpu - # self.next_target = self.next_target_gpu - - # With Amp, it isn't necessary to manually convert data to half. - # if args.fp16: - # self.next_input = self.next_input.half() - # else: - - def next(self): - if self.prefetch: - torch.cuda.current_stream().wait_stream(self.stream) - samples = self.next_samples - targets = self.next_targets - if samples is not None: - samples.record_stream(torch.cuda.current_stream()) - if targets is not None: - for t in targets: - for _k, v in t.items(): - v.record_stream(torch.cuda.current_stream()) - self.preload() - else: - try: - samples, targets = next(self.loader) - samples, targets = to_cuda(samples, targets, self.device) - except StopIteration: - samples = None - targets = None - return samples, targets diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/panoptic_eval.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/panoptic_eval.py deleted file mode 100644 index 1a8ed7a82f..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/panoptic_eval.py +++ /dev/null @@ -1,57 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -import json -import os - -import util.misc as utils - -try: - from panopticapi.evaluation import pq_compute -except ImportError: - pass - - -class PanopticEvaluator: - def __init__(self, ann_file, ann_folder, output_dir: str="panoptic_eval") -> None: - self.gt_json = ann_file - self.gt_folder = ann_folder - if utils.is_main_process(): - if not os.path.exists(output_dir): - os.mkdir(output_dir) - self.output_dir = output_dir - self.predictions = [] - - def update(self, predictions) -> None: - for p in predictions: - with open(os.path.join(self.output_dir, p["file_name"]), "wb") as f: - f.write(p.pop("png_string")) - - self.predictions += predictions - - def synchronize_between_processes(self) -> None: - all_predictions = utils.all_gather(self.predictions) - merged_predictions = [] - for p in all_predictions: - merged_predictions += p - self.predictions = merged_predictions - - def summarize(self): - if utils.is_main_process(): - json_data = {"annotations": self.predictions} - predictions_json = os.path.join(self.output_dir, "predictions.json") - with open(predictions_json, "w") as f: - f.write(json.dumps(json_data)) - return pq_compute( - self.gt_json, - predictions_json, - gt_folder=self.gt_folder, - pred_folder=self.output_dir, - ) - return None diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/samplers.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/samplers.py deleted file mode 100644 index 5c2fff2d46..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/samplers.py +++ /dev/null @@ -1,148 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from codes in torch.utils.data.distributed -# ------------------------------------------------------------------------ - -import math -import os - -import torch -import torch.distributed as dist -from torch.utils.data.sampler import Sampler -from typing import Iterator, Optional - - -class DistributedSampler(Sampler): - """Sampler that restricts data loading to a subset of the dataset. - It is especially useful in conjunction with - :class:`torch.nn.parallel.DistributedDataParallel`. In such case, each - process can pass a DistributedSampler instance as a DataLoader sampler, - and load a subset of the original dataset that is exclusive to it. - .. note:: - Dataset is assumed to be of constant size. - Arguments: - dataset: Dataset used for sampling. - num_replicas (optional): Number of processes participating in - distributed training. - rank (optional): Rank of the current process within num_replicas. - """ - - def __init__( - self, dataset, num_replicas: Optional[int]=None, rank=None, local_rank=None, local_size: Optional[int]=None, shuffle: bool=True - ) -> None: - if num_replicas is None: - if not dist.is_available(): - raise RuntimeError("Requires distributed package to be available") - num_replicas = dist.get_world_size() - if rank is None: - if not dist.is_available(): - raise RuntimeError("Requires distributed package to be available") - rank = dist.get_rank() - self.dataset = dataset - self.num_replicas = num_replicas - self.rank = rank - self.epoch = 0 - self.num_samples = math.ceil(len(self.dataset) * 1.0 / self.num_replicas) - self.total_size = self.num_samples * self.num_replicas - self.shuffle = shuffle - - def __iter__(self) -> Iterator: - if self.shuffle: - # deterministically shuffle based on epoch - g = torch.Generator() - g.manual_seed(self.epoch) - indices = torch.randperm(len(self.dataset), generator=g).tolist() - else: - indices = torch.arange(len(self.dataset)).tolist() - - # add extra samples to make it evenly divisible - indices += indices[: (self.total_size - len(indices))] - assert len(indices) == self.total_size - - # subsample - offset = self.num_samples * self.rank - indices = indices[offset : offset + self.num_samples] - assert len(indices) == self.num_samples - - return iter(indices) - - def __len__(self) -> int: - return self.num_samples - - def set_epoch(self, epoch: int) -> None: - self.epoch = epoch - - -class NodeDistributedSampler(Sampler): - """Sampler that restricts data loading to a subset of the dataset. - It is especially useful in conjunction with - :class:`torch.nn.parallel.DistributedDataParallel`. In such case, each - process can pass a DistributedSampler instance as a DataLoader sampler, - and load a subset of the original dataset that is exclusive to it. - .. note:: - Dataset is assumed to be of constant size. - Arguments: - dataset: Dataset used for sampling. - num_replicas (optional): Number of processes participating in - distributed training. - rank (optional): Rank of the current process within num_replicas. - """ - - def __init__( - self, dataset, num_replicas: Optional[int]=None, rank=None, local_rank=None, local_size: Optional[int]=None, shuffle: bool=True - ) -> None: - if num_replicas is None: - if not dist.is_available(): - raise RuntimeError("Requires distributed package to be available") - num_replicas = dist.get_world_size() - if rank is None: - if not dist.is_available(): - raise RuntimeError("Requires distributed package to be available") - rank = dist.get_rank() - if local_rank is None: - local_rank = int(os.environ.get("LOCAL_RANK", 0)) - if local_size is None: - local_size = int(os.environ.get("LOCAL_SIZE", 1)) - self.dataset = dataset - self.shuffle = shuffle - self.num_replicas = num_replicas - self.num_parts = local_size - self.rank = rank - self.local_rank = local_rank - self.epoch = 0 - self.num_samples = math.ceil(len(self.dataset) * 1.0 / self.num_replicas) - self.total_size = self.num_samples * self.num_replicas - - self.total_size_parts = self.num_samples * self.num_replicas // self.num_parts - - def __iter__(self) -> Iterator: - if self.shuffle: - # deterministically shuffle based on epoch - g = torch.Generator() - g.manual_seed(self.epoch) - indices = torch.randperm(len(self.dataset), generator=g).tolist() - else: - indices = torch.arange(len(self.dataset)).tolist() - indices = [i for i in indices if i % self.num_parts == self.local_rank] - - # add extra samples to make it evenly divisible - indices += indices[: (self.total_size_parts - len(indices))] - assert len(indices) == self.total_size_parts - - # subsample - indices = indices[ - self.rank // self.num_parts : self.total_size_parts : self.num_replicas - // self.num_parts - ] - assert len(indices) == self.num_samples - - return iter(indices) - - def __len__(self) -> int: - return self.num_samples - - def set_epoch(self, epoch: int) -> None: - self.epoch = epoch diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/torchvision_datasets/__init__.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/torchvision_datasets/__init__.py deleted file mode 100644 index 162303c4ce..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/torchvision_datasets/__init__.py +++ /dev/null @@ -1,7 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ - -from .coco import CocoDetection diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/torchvision_datasets/coco.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/torchvision_datasets/coco.py deleted file mode 100644 index 65eb674294..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/torchvision_datasets/coco.py +++ /dev/null @@ -1,96 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from torchvision -# ------------------------------------------------------------------------ - -""" -Copy-Paste from torchvision, but add utility of caching images on memory -""" - -from io import BytesIO -import os -import os.path - -from PIL import Image -from torchvision.datasets.vision import VisionDataset -import tqdm - - -class CocoDetection(VisionDataset): - """`MS Coco Detection `_ Dataset. - Args: - root (string): Root directory where images are downloaded to. - annFile (string): Path to json annotation file. - transform (callable, optional): A function/transform that takes in an PIL image - and returns a transformed version. E.g, ``transforms.ToTensor`` - target_transform (callable, optional): A function/transform that takes in the - target and transforms it. - transforms (callable, optional): A function/transform that takes input sample and its target as entry - and returns a transformed version. - """ - - def __init__( - self, - root, - annFile, - transform=None, - target_transform=None, - transforms=None, - cache_mode: bool=False, - local_rank: int=0, - local_size: int=1, - ) -> None: - super().__init__(root, transforms, transform, target_transform) - from pycocotools.coco import COCO - - self.coco = COCO(annFile) - self.ids = list(sorted(self.coco.imgs.keys())) - self.cache_mode = cache_mode - self.local_rank = local_rank - self.local_size = local_size - if cache_mode: - self.cache = {} - self.cache_images() - - def cache_images(self) -> None: - self.cache = {} - for index, img_id in zip(tqdm.trange(len(self.ids)), self.ids, strict=False): - if index % self.local_size != self.local_rank: - continue - path = self.coco.loadImgs(img_id)[0]["file_name"] - with open(os.path.join(self.root, path), "rb") as f: - self.cache[path] = f.read() - - def get_image(self, path): - if self.cache_mode: - if path not in self.cache.keys(): - with open(os.path.join(self.root, path), "rb") as f: - self.cache[path] = f.read() - return Image.open(BytesIO(self.cache[path])).convert("RGB") - return Image.open(os.path.join(self.root, path)).convert("RGB") - - def __getitem__(self, index): - """ - Args: - index (int): Index - Returns: - tuple: Tuple (image, target). target is the object returned by ``coco.loadAnns``. - """ - coco = self.coco - img_id = self.ids[index] - ann_ids = coco.getAnnIds(imgIds=img_id) - target = coco.loadAnns(ann_ids) - - path = coco.loadImgs(img_id)[0]["file_name"] - - img = self.get_image(path) - if self.transforms is not None: - img, target = self.transforms(img, target) - - return img, target - - def __len__(self) -> int: - return len(self.ids) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/transforms.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/transforms.py deleted file mode 100644 index 3c2947ee36..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/transforms.py +++ /dev/null @@ -1,290 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Transforms and data augmentation for both image + bbox. -""" - -import random - -import PIL -import torch -import torchvision.transforms as T -import torchvision.transforms.functional as F -from util.box_ops import box_xyxy_to_cxcywh -from util.misc import interpolate -from typing import Optional, Sequence - - -def crop(image, target, region): - cropped_image = F.crop(image, *region) - - target = target.copy() - i, j, h, w = region - - # should we do something wrt the original size? - target["size"] = torch.tensor([h, w]) - - fields = ["labels", "area", "iscrowd"] - - if "boxes" in target: - boxes = target["boxes"] - max_size = torch.as_tensor([w, h], dtype=torch.float32) - cropped_boxes = boxes - torch.as_tensor([j, i, j, i]) - cropped_boxes = torch.min(cropped_boxes.reshape(-1, 2, 2), max_size) - cropped_boxes = cropped_boxes.clamp(min=0) - area = (cropped_boxes[:, 1, :] - cropped_boxes[:, 0, :]).prod(dim=1) - target["boxes"] = cropped_boxes.reshape(-1, 4) - target["area"] = area - fields.append("boxes") - - if "masks" in target: - # FIXME should we update the area here if there are no boxes? - target["masks"] = target["masks"][:, i : i + h, j : j + w] - fields.append("masks") - - # remove elements for which the boxes or masks that have zero area - if "boxes" in target or "masks" in target: - # favor boxes selection when defining which elements to keep - # this is compatible with previous implementation - if "boxes" in target: - cropped_boxes = target["boxes"].reshape(-1, 2, 2) - keep = torch.all(cropped_boxes[:, 1, :] > cropped_boxes[:, 0, :], dim=1) - else: - keep = target["masks"].flatten(1).any(1) - - for field in fields: - target[field] = target[field][keep] - - return cropped_image, target - - -def hflip(image, target): - flipped_image = F.hflip(image) - - w, h = image.size - - target = target.copy() - if "boxes" in target: - boxes = target["boxes"] - boxes = boxes[:, [2, 1, 0, 3]] * torch.as_tensor([-1, 1, -1, 1]) + torch.as_tensor( - [w, 0, w, 0] - ) - target["boxes"] = boxes - - if "masks" in target: - target["masks"] = target["masks"].flip(-1) - - return flipped_image, target - - -def resize(image, target, size: int, max_size: Optional[int]=None): - # size can be min_size (scalar) or (w, h) tuple - - def get_size_with_aspect_ratio(image_size: int, size: int, max_size: Optional[int]=None): - w, h = image_size - if max_size is not None: - min_original_size = float(min((w, h))) - max_original_size = float(max((w, h))) - if max_original_size / min_original_size * size > max_size: - size = round(max_size * min_original_size / max_original_size) - - if (w <= h and w == size) or (h <= w and h == size): - return (h, w) - - if w < h: - ow = size - oh = int(size * h / w) - else: - oh = size - ow = int(size * w / h) - - return (oh, ow) - - def get_size(image_size: int, size: int, max_size: Optional[int]=None): - if isinstance(size, list | tuple): - return size[::-1] - else: - return get_size_with_aspect_ratio(image_size, size, max_size) - - size = get_size(image.size, size, max_size) - rescaled_image = F.resize(image, size) - - if target is None: - return rescaled_image, None - - ratios = tuple(float(s) / float(s_orig) for s, s_orig in zip(rescaled_image.size, image.size, strict=False)) - ratio_width, ratio_height = ratios - - target = target.copy() - if "boxes" in target: - boxes = target["boxes"] - scaled_boxes = boxes * torch.as_tensor( - [ratio_width, ratio_height, ratio_width, ratio_height] - ) - target["boxes"] = scaled_boxes - - if "area" in target: - area = target["area"] - scaled_area = area * (ratio_width * ratio_height) - target["area"] = scaled_area - - h, w = size - target["size"] = torch.tensor([h, w]) - - if "masks" in target: - target["masks"] = ( - interpolate(target["masks"][:, None].float(), size, mode="nearest")[:, 0] > 0.5 - ) - - return rescaled_image, target - - -def pad(image, target, padding): - # assumes that we only pad on the bottom right corners - padded_image = F.pad(image, (0, 0, padding[0], padding[1])) - if target is None: - return padded_image, None - target = target.copy() - # should we do something wrt the original size? - target["size"] = torch.tensor(padded_image[::-1]) - if "masks" in target: - target["masks"] = torch.nn.functional.pad(target["masks"], (0, padding[0], 0, padding[1])) - return padded_image, target - - -class RandomCrop: - def __init__(self, size: int) -> None: - self.size = size - - def __call__(self, img, target): - region = T.RandomCrop.get_params(img, self.size) - return crop(img, target, region) - - -class RandomSizeCrop: - def __init__(self, min_size: int, max_size: int) -> None: - self.min_size = min_size - self.max_size = max_size - - def __call__(self, img: PIL.Image.Image, target: dict): - w = random.randint(self.min_size, min(img.width, self.max_size)) - h = random.randint(self.min_size, min(img.height, self.max_size)) - region = T.RandomCrop.get_params(img, [h, w]) - return crop(img, target, region) - - -class CenterCrop: - def __init__(self, size: int) -> None: - self.size = size - - def __call__(self, img, target): - image_width, image_height = img.size - crop_height, crop_width = self.size - crop_top = round((image_height - crop_height) / 2.0) - crop_left = round((image_width - crop_width) / 2.0) - return crop(img, target, (crop_top, crop_left, crop_height, crop_width)) - - -class RandomHorizontalFlip: - def __init__(self, p: float=0.5) -> None: - self.p = p - - def __call__(self, img, target): - if random.random() < self.p: - return hflip(img, target) - return img, target - - -class RandomResize: - def __init__(self, sizes: Sequence[int], max_size: Optional[int]=None) -> None: - assert isinstance(sizes, list | tuple) - self.sizes = sizes - self.max_size = max_size - - def __call__(self, img, target=None): - size = random.choice(self.sizes) - return resize(img, target, size, self.max_size) - - -class RandomPad: - def __init__(self, max_pad) -> None: - self.max_pad = max_pad - - def __call__(self, img, target): - pad_x = random.randint(0, self.max_pad) - pad_y = random.randint(0, self.max_pad) - return pad(img, target, (pad_x, pad_y)) - - -class RandomSelect: - """ - Randomly selects between transforms1 and transforms2, - with probability p for transforms1 and (1 - p) for transforms2 - """ - - def __init__(self, transforms1, transforms2, p: float=0.5) -> None: - self.transforms1 = transforms1 - self.transforms2 = transforms2 - self.p = p - - def __call__(self, img, target): - if random.random() < self.p: - return self.transforms1(img, target) - return self.transforms2(img, target) - - -class ToTensor: - def __call__(self, img, target): - return F.to_tensor(img), target - - -class RandomErasing: - def __init__(self, *args, **kwargs) -> None: - self.eraser = T.RandomErasing(*args, **kwargs) - - def __call__(self, img, target): - return self.eraser(img), target - - -class Normalize: - def __init__(self, mean, std) -> None: - self.mean = mean - self.std = std - - def __call__(self, image, target=None): - image = F.normalize(image, mean=self.mean, std=self.std) - if target is None: - return image, None - target = target.copy() - h, w = image.shape[-2:] - if "boxes" in target: - boxes = target["boxes"] - boxes = box_xyxy_to_cxcywh(boxes) - boxes = boxes / torch.tensor([w, h, w, h], dtype=torch.float32) - target["boxes"] = boxes - return image, target - - -class Compose: - def __init__(self, transforms) -> None: - self.transforms = transforms - - def __call__(self, image, target): - for t in self.transforms: - image, target = t(image, target) - return image, target - - def __repr__(self) -> str: - format_string = self.__class__.__name__ + "(" - for t in self.transforms: - format_string += "\n" - format_string += f" {t}" - format_string += "\n)" - return format_string diff --git a/dimos/models/Detic/third_party/Deformable-DETR/docs/changelog.md b/dimos/models/Detic/third_party/Deformable-DETR/docs/changelog.md deleted file mode 100644 index 1ed5e79a4d..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/docs/changelog.md +++ /dev/null @@ -1,3 +0,0 @@ -## Changelog - -**[2020.12.07]** Fix a bug of sampling offset normalization (see [this issue](https://github.com/fundamentalvision/Deformable-DETR/issues/6)) in the MSDeformAttn module. The final accuracy on COCO is slightly improved. Code and pre-trained models have been updated. This bug only occurs in this released version but not in the original implementation used in our paper. \ No newline at end of file diff --git a/dimos/models/Detic/third_party/Deformable-DETR/engine.py b/dimos/models/Detic/third_party/Deformable-DETR/engine.py deleted file mode 100644 index 7e6e7c2c20..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/engine.py +++ /dev/null @@ -1,177 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Train and eval functions used in main.py -""" - -import math -import os -import sys -from typing import Iterable - -from datasets.coco_eval import CocoEvaluator -from datasets.data_prefetcher import data_prefetcher -from datasets.panoptic_eval import PanopticEvaluator -import torch -import util.misc as utils - - -def train_one_epoch( - model: torch.nn.Module, - criterion: torch.nn.Module, - data_loader: Iterable, - optimizer: torch.optim.Optimizer, - device: torch.device, - epoch: int, - max_norm: float = 0, -): - model.train() - criterion.train() - metric_logger = utils.MetricLogger(delimiter=" ") - metric_logger.add_meter("lr", utils.SmoothedValue(window_size=1, fmt="{value:.6f}")) - metric_logger.add_meter("class_error", utils.SmoothedValue(window_size=1, fmt="{value:.2f}")) - metric_logger.add_meter("grad_norm", utils.SmoothedValue(window_size=1, fmt="{value:.2f}")) - header = f"Epoch: [{epoch}]" - print_freq = 10 - - prefetcher = data_prefetcher(data_loader, device, prefetch=True) - samples, targets = prefetcher.next() - - # for samples, targets in metric_logger.log_every(data_loader, print_freq, header): - for _ in metric_logger.log_every(range(len(data_loader)), print_freq, header): - outputs = model(samples) - loss_dict = criterion(outputs, targets) - weight_dict = criterion.weight_dict - losses = sum(loss_dict[k] * weight_dict[k] for k in loss_dict.keys() if k in weight_dict) - - # reduce losses over all GPUs for logging purposes - loss_dict_reduced = utils.reduce_dict(loss_dict) - loss_dict_reduced_unscaled = {f"{k}_unscaled": v for k, v in loss_dict_reduced.items()} - loss_dict_reduced_scaled = { - k: v * weight_dict[k] for k, v in loss_dict_reduced.items() if k in weight_dict - } - losses_reduced_scaled = sum(loss_dict_reduced_scaled.values()) - - loss_value = losses_reduced_scaled.item() - - if not math.isfinite(loss_value): - print(f"Loss is {loss_value}, stopping training") - print(loss_dict_reduced) - sys.exit(1) - - optimizer.zero_grad() - losses.backward() - if max_norm > 0: - grad_total_norm = torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm) - else: - grad_total_norm = utils.get_total_grad_norm(model.parameters(), max_norm) - optimizer.step() - - metric_logger.update( - loss=loss_value, **loss_dict_reduced_scaled, **loss_dict_reduced_unscaled - ) - metric_logger.update(class_error=loss_dict_reduced["class_error"]) - metric_logger.update(lr=optimizer.param_groups[0]["lr"]) - metric_logger.update(grad_norm=grad_total_norm) - - samples, targets = prefetcher.next() - # gather the stats from all processes - metric_logger.synchronize_between_processes() - print("Averaged stats:", metric_logger) - return {k: meter.global_avg for k, meter in metric_logger.meters.items()} - - -@torch.no_grad() -def evaluate(model, criterion, postprocessors, data_loader, base_ds, device, output_dir): - model.eval() - criterion.eval() - - metric_logger = utils.MetricLogger(delimiter=" ") - metric_logger.add_meter("class_error", utils.SmoothedValue(window_size=1, fmt="{value:.2f}")) - header = "Test:" - - iou_types = tuple(k for k in ("segm", "bbox") if k in postprocessors.keys()) - coco_evaluator = CocoEvaluator(base_ds, iou_types) - # coco_evaluator.coco_eval[iou_types[0]].params.iouThrs = [0, 0.1, 0.5, 0.75] - - panoptic_evaluator = None - if "panoptic" in postprocessors.keys(): - panoptic_evaluator = PanopticEvaluator( - data_loader.dataset.ann_file, - data_loader.dataset.ann_folder, - output_dir=os.path.join(output_dir, "panoptic_eval"), - ) - - for samples, targets in metric_logger.log_every(data_loader, 10, header): - samples = samples.to(device) - targets = [{k: v.to(device) for k, v in t.items()} for t in targets] - - outputs = model(samples) - loss_dict = criterion(outputs, targets) - weight_dict = criterion.weight_dict - - # reduce losses over all GPUs for logging purposes - loss_dict_reduced = utils.reduce_dict(loss_dict) - loss_dict_reduced_scaled = { - k: v * weight_dict[k] for k, v in loss_dict_reduced.items() if k in weight_dict - } - loss_dict_reduced_unscaled = {f"{k}_unscaled": v for k, v in loss_dict_reduced.items()} - metric_logger.update( - loss=sum(loss_dict_reduced_scaled.values()), - **loss_dict_reduced_scaled, - **loss_dict_reduced_unscaled, - ) - metric_logger.update(class_error=loss_dict_reduced["class_error"]) - - orig_target_sizes = torch.stack([t["orig_size"] for t in targets], dim=0) - results = postprocessors["bbox"](outputs, orig_target_sizes) - if "segm" in postprocessors.keys(): - target_sizes = torch.stack([t["size"] for t in targets], dim=0) - results = postprocessors["segm"](results, outputs, orig_target_sizes, target_sizes) - res = {target["image_id"].item(): output for target, output in zip(targets, results, strict=False)} - if coco_evaluator is not None: - coco_evaluator.update(res) - - if panoptic_evaluator is not None: - res_pano = postprocessors["panoptic"](outputs, target_sizes, orig_target_sizes) - for i, target in enumerate(targets): - image_id = target["image_id"].item() - file_name = f"{image_id:012d}.png" - res_pano[i]["image_id"] = image_id - res_pano[i]["file_name"] = file_name - - panoptic_evaluator.update(res_pano) - - # gather the stats from all processes - metric_logger.synchronize_between_processes() - print("Averaged stats:", metric_logger) - if coco_evaluator is not None: - coco_evaluator.synchronize_between_processes() - if panoptic_evaluator is not None: - panoptic_evaluator.synchronize_between_processes() - - # accumulate predictions from all images - if coco_evaluator is not None: - coco_evaluator.accumulate() - coco_evaluator.summarize() - panoptic_res = None - if panoptic_evaluator is not None: - panoptic_res = panoptic_evaluator.summarize() - stats = {k: meter.global_avg for k, meter in metric_logger.meters.items()} - if coco_evaluator is not None: - if "bbox" in postprocessors.keys(): - stats["coco_eval_bbox"] = coco_evaluator.coco_eval["bbox"].stats.tolist() - if "segm" in postprocessors.keys(): - stats["coco_eval_masks"] = coco_evaluator.coco_eval["segm"].stats.tolist() - if panoptic_res is not None: - stats["PQ_all"] = panoptic_res["All"] - stats["PQ_th"] = panoptic_res["Things"] - stats["PQ_st"] = panoptic_res["Stuff"] - return stats, coco_evaluator diff --git a/dimos/models/Detic/third_party/Deformable-DETR/main.py b/dimos/models/Detic/third_party/Deformable-DETR/main.py deleted file mode 100644 index 187b93a868..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/main.py +++ /dev/null @@ -1,418 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - - -import argparse -import datetime -import json -from pathlib import Path -import random -import time - -import datasets -from datasets import build_dataset, get_coco_api_from_dataset -import datasets.samplers as samplers -from engine import evaluate, train_one_epoch -from models import build_model -import numpy as np -import torch -from torch.utils.data import DataLoader -import util.misc as utils - - -def get_args_parser(): - parser = argparse.ArgumentParser("Deformable DETR Detector", add_help=False) - parser.add_argument("--lr", default=2e-4, type=float) - parser.add_argument("--lr_backbone_names", default=["backbone.0"], type=str, nargs="+") - parser.add_argument("--lr_backbone", default=2e-5, type=float) - parser.add_argument( - "--lr_linear_proj_names", - default=["reference_points", "sampling_offsets"], - type=str, - nargs="+", - ) - parser.add_argument("--lr_linear_proj_mult", default=0.1, type=float) - parser.add_argument("--batch_size", default=2, type=int) - parser.add_argument("--weight_decay", default=1e-4, type=float) - parser.add_argument("--epochs", default=50, type=int) - parser.add_argument("--lr_drop", default=40, type=int) - parser.add_argument("--lr_drop_epochs", default=None, type=int, nargs="+") - parser.add_argument( - "--clip_max_norm", default=0.1, type=float, help="gradient clipping max norm" - ) - - parser.add_argument("--sgd", action="store_true") - - # Variants of Deformable DETR - parser.add_argument("--with_box_refine", default=False, action="store_true") - parser.add_argument("--two_stage", default=False, action="store_true") - - # Model parameters - parser.add_argument( - "--frozen_weights", - type=str, - default=None, - help="Path to the pretrained model. If set, only the mask head will be trained", - ) - - # * Backbone - parser.add_argument( - "--backbone", default="resnet50", type=str, help="Name of the convolutional backbone to use" - ) - parser.add_argument( - "--dilation", - action="store_true", - help="If true, we replace stride with dilation in the last convolutional block (DC5)", - ) - parser.add_argument( - "--position_embedding", - default="sine", - type=str, - choices=("sine", "learned"), - help="Type of positional embedding to use on top of the image features", - ) - parser.add_argument( - "--position_embedding_scale", default=2 * np.pi, type=float, help="position / size * scale" - ) - parser.add_argument( - "--num_feature_levels", default=4, type=int, help="number of feature levels" - ) - - # * Transformer - parser.add_argument( - "--enc_layers", default=6, type=int, help="Number of encoding layers in the transformer" - ) - parser.add_argument( - "--dec_layers", default=6, type=int, help="Number of decoding layers in the transformer" - ) - parser.add_argument( - "--dim_feedforward", - default=1024, - type=int, - help="Intermediate size of the feedforward layers in the transformer blocks", - ) - parser.add_argument( - "--hidden_dim", - default=256, - type=int, - help="Size of the embeddings (dimension of the transformer)", - ) - parser.add_argument( - "--dropout", default=0.1, type=float, help="Dropout applied in the transformer" - ) - parser.add_argument( - "--nheads", - default=8, - type=int, - help="Number of attention heads inside the transformer's attentions", - ) - parser.add_argument("--num_queries", default=300, type=int, help="Number of query slots") - parser.add_argument("--dec_n_points", default=4, type=int) - parser.add_argument("--enc_n_points", default=4, type=int) - - # * Segmentation - parser.add_argument( - "--masks", action="store_true", help="Train segmentation head if the flag is provided" - ) - - # Loss - parser.add_argument( - "--no_aux_loss", - dest="aux_loss", - action="store_false", - help="Disables auxiliary decoding losses (loss at each layer)", - ) - - # * Matcher - parser.add_argument( - "--set_cost_class", default=2, type=float, help="Class coefficient in the matching cost" - ) - parser.add_argument( - "--set_cost_bbox", default=5, type=float, help="L1 box coefficient in the matching cost" - ) - parser.add_argument( - "--set_cost_giou", default=2, type=float, help="giou box coefficient in the matching cost" - ) - - # * Loss coefficients - parser.add_argument("--mask_loss_coef", default=1, type=float) - parser.add_argument("--dice_loss_coef", default=1, type=float) - parser.add_argument("--cls_loss_coef", default=2, type=float) - parser.add_argument("--bbox_loss_coef", default=5, type=float) - parser.add_argument("--giou_loss_coef", default=2, type=float) - parser.add_argument("--focal_alpha", default=0.25, type=float) - - # dataset parameters - parser.add_argument("--dataset_file", default="coco") - parser.add_argument("--coco_path", default="./data/coco", type=str) - parser.add_argument("--coco_panoptic_path", type=str) - parser.add_argument("--remove_difficult", action="store_true") - - parser.add_argument("--output_dir", default="", help="path where to save, empty for no saving") - parser.add_argument("--device", default="cuda", help="device to use for training / testing") - parser.add_argument("--seed", default=42, type=int) - parser.add_argument("--resume", default="", help="resume from checkpoint") - parser.add_argument("--start_epoch", default=0, type=int, metavar="N", help="start epoch") - parser.add_argument("--eval", action="store_true") - parser.add_argument("--num_workers", default=2, type=int) - parser.add_argument( - "--cache_mode", default=False, action="store_true", help="whether to cache images on memory" - ) - - return parser - - -def main(args) -> None: - utils.init_distributed_mode(args) - print(f"git:\n {utils.get_sha()}\n") - - if args.frozen_weights is not None: - assert args.masks, "Frozen training is meant for segmentation only" - print(args) - - device = torch.device(args.device) - - # fix the seed for reproducibility - seed = args.seed + utils.get_rank() - torch.manual_seed(seed) - np.random.seed(seed) - random.seed(seed) - - model, criterion, postprocessors = build_model(args) - model.to(device) - - model_without_ddp = model - n_parameters = sum(p.numel() for p in model.parameters() if p.requires_grad) - print("number of params:", n_parameters) - - dataset_train = build_dataset(image_set="train", args=args) - dataset_val = build_dataset(image_set="val", args=args) - - if args.distributed: - if args.cache_mode: - sampler_train = samplers.NodeDistributedSampler(dataset_train) - sampler_val = samplers.NodeDistributedSampler(dataset_val, shuffle=False) - else: - sampler_train = samplers.DistributedSampler(dataset_train) - sampler_val = samplers.DistributedSampler(dataset_val, shuffle=False) - else: - sampler_train = torch.utils.data.RandomSampler(dataset_train) - sampler_val = torch.utils.data.SequentialSampler(dataset_val) - - batch_sampler_train = torch.utils.data.BatchSampler( - sampler_train, args.batch_size, drop_last=True - ) - - data_loader_train = DataLoader( - dataset_train, - batch_sampler=batch_sampler_train, - collate_fn=utils.collate_fn, - num_workers=args.num_workers, - pin_memory=True, - ) - data_loader_val = DataLoader( - dataset_val, - args.batch_size, - sampler=sampler_val, - drop_last=False, - collate_fn=utils.collate_fn, - num_workers=args.num_workers, - pin_memory=True, - ) - - # lr_backbone_names = ["backbone.0", "backbone.neck", "input_proj", "transformer.encoder"] - def match_name_keywords(n, name_keywords): - out = False - for b in name_keywords: - if b in n: - out = True - break - return out - - for n, _p in model_without_ddp.named_parameters(): - print(n) - - param_dicts = [ - { - "params": [ - p - for n, p in model_without_ddp.named_parameters() - if not match_name_keywords(n, args.lr_backbone_names) - and not match_name_keywords(n, args.lr_linear_proj_names) - and p.requires_grad - ], - "lr": args.lr, - }, - { - "params": [ - p - for n, p in model_without_ddp.named_parameters() - if match_name_keywords(n, args.lr_backbone_names) and p.requires_grad - ], - "lr": args.lr_backbone, - }, - { - "params": [ - p - for n, p in model_without_ddp.named_parameters() - if match_name_keywords(n, args.lr_linear_proj_names) and p.requires_grad - ], - "lr": args.lr * args.lr_linear_proj_mult, - }, - ] - if args.sgd: - optimizer = torch.optim.SGD( - param_dicts, lr=args.lr, momentum=0.9, weight_decay=args.weight_decay - ) - else: - optimizer = torch.optim.AdamW(param_dicts, lr=args.lr, weight_decay=args.weight_decay) - lr_scheduler = torch.optim.lr_scheduler.StepLR(optimizer, args.lr_drop) - - if args.distributed: - model = torch.nn.parallel.DistributedDataParallel(model, device_ids=[args.gpu]) - model_without_ddp = model.module - - if args.dataset_file == "coco_panoptic": - # We also evaluate AP during panoptic training, on original coco DS - coco_val = datasets.coco.build("val", args) - base_ds = get_coco_api_from_dataset(coco_val) - else: - base_ds = get_coco_api_from_dataset(dataset_val) - - if args.frozen_weights is not None: - checkpoint = torch.load(args.frozen_weights, map_location="cpu") - model_without_ddp.detr.load_state_dict(checkpoint["model"]) - - output_dir = Path(args.output_dir) - if args.resume: - if args.resume.startswith("https"): - checkpoint = torch.hub.load_state_dict_from_url( - args.resume, map_location="cpu", check_hash=True - ) - else: - checkpoint = torch.load(args.resume, map_location="cpu") - missing_keys, unexpected_keys = model_without_ddp.load_state_dict( - checkpoint["model"], strict=False - ) - unexpected_keys = [ - k - for k in unexpected_keys - if not (k.endswith("total_params") or k.endswith("total_ops")) - ] - if len(missing_keys) > 0: - print(f"Missing Keys: {missing_keys}") - if len(unexpected_keys) > 0: - print(f"Unexpected Keys: {unexpected_keys}") - if ( - not args.eval - and "optimizer" in checkpoint - and "lr_scheduler" in checkpoint - and "epoch" in checkpoint - ): - import copy - - p_groups = copy.deepcopy(optimizer.param_groups) - optimizer.load_state_dict(checkpoint["optimizer"]) - for pg, pg_old in zip(optimizer.param_groups, p_groups, strict=False): - pg["lr"] = pg_old["lr"] - pg["initial_lr"] = pg_old["initial_lr"] - print(optimizer.param_groups) - lr_scheduler.load_state_dict(checkpoint["lr_scheduler"]) - # todo: this is a hack for doing experiment that resume from checkpoint and also modify lr scheduler (e.g., decrease lr in advance). - args.override_resumed_lr_drop = True - if args.override_resumed_lr_drop: - print( - "Warning: (hack) args.override_resumed_lr_drop is set to True, so args.lr_drop would override lr_drop in resumed lr_scheduler." - ) - lr_scheduler.step_size = args.lr_drop - lr_scheduler.base_lrs = list( - map(lambda group: group["initial_lr"], optimizer.param_groups) - ) - lr_scheduler.step(lr_scheduler.last_epoch) - args.start_epoch = checkpoint["epoch"] + 1 - # check the resumed model - if not args.eval: - test_stats, coco_evaluator = evaluate( - model, criterion, postprocessors, data_loader_val, base_ds, device, args.output_dir - ) - - if args.eval: - test_stats, coco_evaluator = evaluate( - model, criterion, postprocessors, data_loader_val, base_ds, device, args.output_dir - ) - if args.output_dir: - utils.save_on_master(coco_evaluator.coco_eval["bbox"].eval, output_dir / "eval.pth") - return - - print("Start training") - start_time = time.time() - for epoch in range(args.start_epoch, args.epochs): - if args.distributed: - sampler_train.set_epoch(epoch) - train_stats = train_one_epoch( - model, criterion, data_loader_train, optimizer, device, epoch, args.clip_max_norm - ) - lr_scheduler.step() - if args.output_dir: - checkpoint_paths = [output_dir / "checkpoint.pth"] - # extra checkpoint before LR drop and every 5 epochs - if (epoch + 1) % args.lr_drop == 0 or (epoch + 1) % 5 == 0: - checkpoint_paths.append(output_dir / f"checkpoint{epoch:04}.pth") - for checkpoint_path in checkpoint_paths: - utils.save_on_master( - { - "model": model_without_ddp.state_dict(), - "optimizer": optimizer.state_dict(), - "lr_scheduler": lr_scheduler.state_dict(), - "epoch": epoch, - "args": args, - }, - checkpoint_path, - ) - - test_stats, coco_evaluator = evaluate( - model, criterion, postprocessors, data_loader_val, base_ds, device, args.output_dir - ) - - log_stats = { - **{f"train_{k}": v for k, v in train_stats.items()}, - **{f"test_{k}": v for k, v in test_stats.items()}, - "epoch": epoch, - "n_parameters": n_parameters, - } - - if args.output_dir and utils.is_main_process(): - with (output_dir / "log.txt").open("a") as f: - f.write(json.dumps(log_stats) + "\n") - - # for evaluation logs - if coco_evaluator is not None: - (output_dir / "eval").mkdir(exist_ok=True) - if "bbox" in coco_evaluator.coco_eval: - filenames = ["latest.pth"] - if epoch % 50 == 0: - filenames.append(f"{epoch:03}.pth") - for name in filenames: - torch.save( - coco_evaluator.coco_eval["bbox"].eval, output_dir / "eval" / name - ) - - total_time = time.time() - start_time - total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print(f"Training time {total_time_str}") - - -if __name__ == "__main__": - parser = argparse.ArgumentParser( - "Deformable DETR training and evaluation script", parents=[get_args_parser()] - ) - args = parser.parse_args() - if args.output_dir: - Path(args.output_dir).mkdir(parents=True, exist_ok=True) - main(args) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/__init__.py b/dimos/models/Detic/third_party/Deformable-DETR/models/__init__.py deleted file mode 100644 index 46b898b988..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/__init__.py +++ /dev/null @@ -1,14 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -from .deformable_detr import build - - -def build_model(args): - return build(args) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/backbone.py b/dimos/models/Detic/third_party/Deformable-DETR/models/backbone.py deleted file mode 100644 index cd973fa891..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/backbone.py +++ /dev/null @@ -1,142 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Backbone modules. -""" - -from typing import Dict, List - -import torch -from torch import nn -import torch.nn.functional as F -import torchvision -from torchvision.models._utils import IntermediateLayerGetter -from util.misc import NestedTensor, is_main_process - -from .position_encoding import build_position_encoding - - -class FrozenBatchNorm2d(torch.nn.Module): - """ - BatchNorm2d where the batch statistics and the affine parameters are fixed. - - Copy-paste from torchvision.misc.ops with added eps before rqsrt, - without which any other models than torchvision.models.resnet[18,34,50,101] - produce nans. - """ - - def __init__(self, n, eps: float=1e-5) -> None: - super().__init__() - self.register_buffer("weight", torch.ones(n)) - self.register_buffer("bias", torch.zeros(n)) - self.register_buffer("running_mean", torch.zeros(n)) - self.register_buffer("running_var", torch.ones(n)) - self.eps = eps - - def _load_from_state_dict( - self, state_dict, prefix: str, local_metadata, strict: bool, missing_keys, unexpected_keys, error_msgs - ) -> None: - num_batches_tracked_key = prefix + "num_batches_tracked" - if num_batches_tracked_key in state_dict: - del state_dict[num_batches_tracked_key] - - super()._load_from_state_dict( - state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs - ) - - def forward(self, x): - # move reshapes to the beginning - # to make it fuser-friendly - w = self.weight.reshape(1, -1, 1, 1) - b = self.bias.reshape(1, -1, 1, 1) - rv = self.running_var.reshape(1, -1, 1, 1) - rm = self.running_mean.reshape(1, -1, 1, 1) - eps = self.eps - scale = w * (rv + eps).rsqrt() - bias = b - rm * scale - return x * scale + bias - - -class BackboneBase(nn.Module): - def __init__(self, backbone: nn.Module, train_backbone: bool, return_interm_layers: bool) -> None: - super().__init__() - for name, parameter in backbone.named_parameters(): - if ( - not train_backbone - or ("layer2" not in name - and "layer3" not in name - and "layer4" not in name) - ): - parameter.requires_grad_(False) - if return_interm_layers: - # return_layers = {"layer1": "0", "layer2": "1", "layer3": "2", "layer4": "3"} - return_layers = {"layer2": "0", "layer3": "1", "layer4": "2"} - self.strides = [8, 16, 32] - self.num_channels = [512, 1024, 2048] - else: - return_layers = {"layer4": "0"} - self.strides = [32] - self.num_channels = [2048] - self.body = IntermediateLayerGetter(backbone, return_layers=return_layers) - - def forward(self, tensor_list: NestedTensor): - xs = self.body(tensor_list.tensors) - out: dict[str, NestedTensor] = {} - for name, x in xs.items(): - m = tensor_list.mask - assert m is not None - mask = F.interpolate(m[None].float(), size=x.shape[-2:]).to(torch.bool)[0] - out[name] = NestedTensor(x, mask) - return out - - -class Backbone(BackboneBase): - """ResNet backbone with frozen BatchNorm.""" - - def __init__(self, name: str, train_backbone: bool, return_interm_layers: bool, dilation: bool) -> None: - norm_layer = FrozenBatchNorm2d - backbone = getattr(torchvision.models, name)( - replace_stride_with_dilation=[False, False, dilation], - pretrained=is_main_process(), - norm_layer=norm_layer, - ) - assert name not in ("resnet18", "resnet34"), "number of channels are hard coded" - super().__init__(backbone, train_backbone, return_interm_layers) - if dilation: - self.strides[-1] = self.strides[-1] // 2 - - -class Joiner(nn.Sequential): - def __init__(self, backbone, position_embedding) -> None: - super().__init__(backbone, position_embedding) - self.strides = backbone.strides - self.num_channels = backbone.num_channels - - def forward(self, tensor_list: NestedTensor): - xs = self[0](tensor_list) - out: list[NestedTensor] = [] - pos = [] - for _name, x in sorted(xs.items()): - out.append(x) - - # position encoding - for x in out: - pos.append(self[1](x).to(x.tensors.dtype)) - - return out, pos - - -def build_backbone(args): - position_embedding = build_position_encoding(args) - train_backbone = args.lr_backbone > 0 - return_interm_layers = args.masks or (args.num_feature_levels > 1) - backbone = Backbone(args.backbone, train_backbone, return_interm_layers, args.dilation) - model = Joiner(backbone, position_embedding) - return model diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_detr.py b/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_detr.py deleted file mode 100644 index 661c6b3d98..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_detr.py +++ /dev/null @@ -1,552 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Deformable DETR model and criterion classes. -""" - -import copy -import math - -import torch -from torch import nn -import torch.nn.functional as F -from util import box_ops -from util.misc import ( - NestedTensor, - accuracy, - get_world_size, - interpolate, - inverse_sigmoid, - is_dist_avail_and_initialized, - nested_tensor_from_tensor_list, -) - -from .backbone import build_backbone -from .deformable_transformer import build_deforamble_transformer -from .matcher import build_matcher -from .segmentation import ( - DETRsegm, - PostProcessPanoptic, - PostProcessSegm, - dice_loss, - sigmoid_focal_loss, -) -from typing import Sequence - - -def _get_clones(module, N): - return nn.ModuleList([copy.deepcopy(module) for i in range(N)]) - - -class DeformableDETR(nn.Module): - """This is the Deformable DETR module that performs object detection""" - - def __init__( - self, - backbone, - transformer, - num_classes: int, - num_queries: int, - num_feature_levels: int, - aux_loss: bool=True, - with_box_refine: bool=False, - two_stage: bool=False, - ) -> None: - """Initializes the model. - Parameters: - backbone: torch module of the backbone to be used. See backbone.py - transformer: torch module of the transformer architecture. See transformer.py - num_classes: number of object classes - num_queries: number of object queries, ie detection slot. This is the maximal number of objects - DETR can detect in a single image. For COCO, we recommend 100 queries. - aux_loss: True if auxiliary decoding losses (loss at each decoder layer) are to be used. - with_box_refine: iterative bounding box refinement - two_stage: two-stage Deformable DETR - """ - super().__init__() - self.num_queries = num_queries - self.transformer = transformer - hidden_dim = transformer.d_model - self.class_embed = nn.Linear(hidden_dim, num_classes) - self.bbox_embed = MLP(hidden_dim, hidden_dim, 4, 3) - self.num_feature_levels = num_feature_levels - if not two_stage: - self.query_embed = nn.Embedding(num_queries, hidden_dim * 2) - if num_feature_levels > 1: - num_backbone_outs = len(backbone.strides) - input_proj_list = [] - for _ in range(num_backbone_outs): - in_channels = backbone.num_channels[_] - input_proj_list.append( - nn.Sequential( - nn.Conv2d(in_channels, hidden_dim, kernel_size=1), - nn.GroupNorm(32, hidden_dim), - ) - ) - for _ in range(num_feature_levels - num_backbone_outs): - input_proj_list.append( - nn.Sequential( - nn.Conv2d(in_channels, hidden_dim, kernel_size=3, stride=2, padding=1), - nn.GroupNorm(32, hidden_dim), - ) - ) - in_channels = hidden_dim - self.input_proj = nn.ModuleList(input_proj_list) - else: - self.input_proj = nn.ModuleList( - [ - nn.Sequential( - nn.Conv2d(backbone.num_channels[0], hidden_dim, kernel_size=1), - nn.GroupNorm(32, hidden_dim), - ) - ] - ) - self.backbone = backbone - self.aux_loss = aux_loss - self.with_box_refine = with_box_refine - self.two_stage = two_stage - - prior_prob = 0.01 - bias_value = -math.log((1 - prior_prob) / prior_prob) - self.class_embed.bias.data = torch.ones(num_classes) * bias_value - nn.init.constant_(self.bbox_embed.layers[-1].weight.data, 0) - nn.init.constant_(self.bbox_embed.layers[-1].bias.data, 0) - for proj in self.input_proj: - nn.init.xavier_uniform_(proj[0].weight, gain=1) - nn.init.constant_(proj[0].bias, 0) - - # if two-stage, the last class_embed and bbox_embed is for region proposal generation - num_pred = ( - (transformer.decoder.num_layers + 1) if two_stage else transformer.decoder.num_layers - ) - if with_box_refine: - self.class_embed = _get_clones(self.class_embed, num_pred) - self.bbox_embed = _get_clones(self.bbox_embed, num_pred) - nn.init.constant_(self.bbox_embed[0].layers[-1].bias.data[2:], -2.0) - # hack implementation for iterative bounding box refinement - self.transformer.decoder.bbox_embed = self.bbox_embed - else: - nn.init.constant_(self.bbox_embed.layers[-1].bias.data[2:], -2.0) - self.class_embed = nn.ModuleList([self.class_embed for _ in range(num_pred)]) - self.bbox_embed = nn.ModuleList([self.bbox_embed for _ in range(num_pred)]) - self.transformer.decoder.bbox_embed = None - if two_stage: - # hack implementation for two-stage - self.transformer.decoder.class_embed = self.class_embed - for box_embed in self.bbox_embed: - nn.init.constant_(box_embed.layers[-1].bias.data[2:], 0.0) - - def forward(self, samples: NestedTensor): - """The forward expects a NestedTensor, which consists of: - - samples.tensor: batched images, of shape [batch_size x 3 x H x W] - - samples.mask: a binary mask of shape [batch_size x H x W], containing 1 on padded pixels - - It returns a dict with the following elements: - - "pred_logits": the classification logits (including no-object) for all queries. - Shape= [batch_size x num_queries x (num_classes + 1)] - - "pred_boxes": The normalized boxes coordinates for all queries, represented as - (center_x, center_y, height, width). These values are normalized in [0, 1], - relative to the size of each individual image (disregarding possible padding). - See PostProcess for information on how to retrieve the unnormalized bounding box. - - "aux_outputs": Optional, only returned when auxilary losses are activated. It is a list of - dictionnaries containing the two above keys for each decoder layer. - """ - if not isinstance(samples, NestedTensor): - samples = nested_tensor_from_tensor_list(samples) - features, pos = self.backbone(samples) - - srcs = [] - masks = [] - for l, feat in enumerate(features): - src, mask = feat.decompose() - srcs.append(self.input_proj[l](src)) - masks.append(mask) - assert mask is not None - if self.num_feature_levels > len(srcs): - _len_srcs = len(srcs) - for l in range(_len_srcs, self.num_feature_levels): - if l == _len_srcs: - src = self.input_proj[l](features[-1].tensors) - else: - src = self.input_proj[l](srcs[-1]) - m = samples.mask - mask = F.interpolate(m[None].float(), size=src.shape[-2:]).to(torch.bool)[0] - pos_l = self.backbone[1](NestedTensor(src, mask)).to(src.dtype) - srcs.append(src) - masks.append(mask) - pos.append(pos_l) - - query_embeds = None - if not self.two_stage: - query_embeds = self.query_embed.weight - hs, init_reference, inter_references, enc_outputs_class, enc_outputs_coord_unact = ( - self.transformer(srcs, masks, pos, query_embeds) - ) - - outputs_classes = [] - outputs_coords = [] - for lvl in range(hs.shape[0]): - if lvl == 0: - reference = init_reference - else: - reference = inter_references[lvl - 1] - reference = inverse_sigmoid(reference) - outputs_class = self.class_embed[lvl](hs[lvl]) - tmp = self.bbox_embed[lvl](hs[lvl]) - if reference.shape[-1] == 4: - tmp += reference - else: - assert reference.shape[-1] == 2 - tmp[..., :2] += reference - outputs_coord = tmp.sigmoid() - outputs_classes.append(outputs_class) - outputs_coords.append(outputs_coord) - outputs_class = torch.stack(outputs_classes) - outputs_coord = torch.stack(outputs_coords) - - out = {"pred_logits": outputs_class[-1], "pred_boxes": outputs_coord[-1]} - if self.aux_loss: - out["aux_outputs"] = self._set_aux_loss(outputs_class, outputs_coord) - - if self.two_stage: - enc_outputs_coord = enc_outputs_coord_unact.sigmoid() - out["enc_outputs"] = {"pred_logits": enc_outputs_class, "pred_boxes": enc_outputs_coord} - return out - - @torch.jit.unused - def _set_aux_loss(self, outputs_class, outputs_coord): - # this is a workaround to make torchscript happy, as torchscript - # doesn't support dictionary with non-homogeneous values, such - # as a dict having both a Tensor and a list. - return [ - {"pred_logits": a, "pred_boxes": b} - for a, b in zip(outputs_class[:-1], outputs_coord[:-1], strict=False) - ] - - -class SetCriterion(nn.Module): - """This class computes the loss for DETR. - The process happens in two steps: - 1) we compute hungarian assignment between ground truth boxes and the outputs of the model - 2) we supervise each pair of matched ground-truth / prediction (supervise class and box) - """ - - def __init__(self, num_classes: int, matcher, weight_dict, losses, focal_alpha: float=0.25) -> None: - """Create the criterion. - Parameters: - num_classes: number of object categories, omitting the special no-object category - matcher: module able to compute a matching between targets and proposals - weight_dict: dict containing as key the names of the losses and as values their relative weight. - losses: list of all the losses to be applied. See get_loss for list of available losses. - focal_alpha: alpha in Focal Loss - """ - super().__init__() - self.num_classes = num_classes - self.matcher = matcher - self.weight_dict = weight_dict - self.losses = losses - self.focal_alpha = focal_alpha - - def loss_labels(self, outputs, targets, indices, num_boxes: int, log: bool=True): - """Classification loss (NLL) - targets dicts must contain the key "labels" containing a tensor of dim [nb_target_boxes] - """ - assert "pred_logits" in outputs - src_logits = outputs["pred_logits"] - - idx = self._get_src_permutation_idx(indices) - target_classes_o = torch.cat([t["labels"][J] for t, (_, J) in zip(targets, indices, strict=False)]) - target_classes = torch.full( - src_logits.shape[:2], self.num_classes, dtype=torch.int64, device=src_logits.device - ) - target_classes[idx] = target_classes_o - - target_classes_onehot = torch.zeros( - [src_logits.shape[0], src_logits.shape[1], src_logits.shape[2] + 1], - dtype=src_logits.dtype, - layout=src_logits.layout, - device=src_logits.device, - ) - target_classes_onehot.scatter_(2, target_classes.unsqueeze(-1), 1) - - target_classes_onehot = target_classes_onehot[:, :, :-1] - loss_ce = ( - sigmoid_focal_loss( - src_logits, target_classes_onehot, num_boxes, alpha=self.focal_alpha, gamma=2 - ) - * src_logits.shape[1] - ) - losses = {"loss_ce": loss_ce} - - if log: - # TODO this should probably be a separate loss, not hacked in this one here - losses["class_error"] = 100 - accuracy(src_logits[idx], target_classes_o)[0] - return losses - - @torch.no_grad() - def loss_cardinality(self, outputs, targets, indices, num_boxes: int): - """Compute the cardinality error, ie the absolute error in the number of predicted non-empty boxes - This is not really a loss, it is intended for logging purposes only. It doesn't propagate gradients - """ - pred_logits = outputs["pred_logits"] - device = pred_logits.device - tgt_lengths = torch.as_tensor([len(v["labels"]) for v in targets], device=device) - # Count the number of predictions that are NOT "no-object" (which is the last class) - card_pred = (pred_logits.argmax(-1) != pred_logits.shape[-1] - 1).sum(1) - card_err = F.l1_loss(card_pred.float(), tgt_lengths.float()) - losses = {"cardinality_error": card_err} - return losses - - def loss_boxes(self, outputs, targets, indices, num_boxes: int): - """Compute the losses related to the bounding boxes, the L1 regression loss and the GIoU loss - targets dicts must contain the key "boxes" containing a tensor of dim [nb_target_boxes, 4] - The target boxes are expected in format (center_x, center_y, h, w), normalized by the image size. - """ - assert "pred_boxes" in outputs - idx = self._get_src_permutation_idx(indices) - src_boxes = outputs["pred_boxes"][idx] - target_boxes = torch.cat([t["boxes"][i] for t, (_, i) in zip(targets, indices, strict=False)], dim=0) - - loss_bbox = F.l1_loss(src_boxes, target_boxes, reduction="none") - - losses = {} - losses["loss_bbox"] = loss_bbox.sum() / num_boxes - - loss_giou = 1 - torch.diag( - box_ops.generalized_box_iou( - box_ops.box_cxcywh_to_xyxy(src_boxes), box_ops.box_cxcywh_to_xyxy(target_boxes) - ) - ) - losses["loss_giou"] = loss_giou.sum() / num_boxes - return losses - - def loss_masks(self, outputs, targets, indices, num_boxes: int): - """Compute the losses related to the masks: the focal loss and the dice loss. - targets dicts must contain the key "masks" containing a tensor of dim [nb_target_boxes, h, w] - """ - assert "pred_masks" in outputs - - src_idx = self._get_src_permutation_idx(indices) - tgt_idx = self._get_tgt_permutation_idx(indices) - - src_masks = outputs["pred_masks"] - - # TODO use valid to mask invalid areas due to padding in loss - target_masks, valid = nested_tensor_from_tensor_list( - [t["masks"] for t in targets] - ).decompose() - target_masks = target_masks.to(src_masks) - - src_masks = src_masks[src_idx] - # upsample predictions to the target size - src_masks = interpolate( - src_masks[:, None], size=target_masks.shape[-2:], mode="bilinear", align_corners=False - ) - src_masks = src_masks[:, 0].flatten(1) - - target_masks = target_masks[tgt_idx].flatten(1) - - losses = { - "loss_mask": sigmoid_focal_loss(src_masks, target_masks, num_boxes), - "loss_dice": dice_loss(src_masks, target_masks, num_boxes), - } - return losses - - def _get_src_permutation_idx(self, indices): - # permute predictions following indices - batch_idx = torch.cat([torch.full_like(src, i) for i, (src, _) in enumerate(indices)]) - src_idx = torch.cat([src for (src, _) in indices]) - return batch_idx, src_idx - - def _get_tgt_permutation_idx(self, indices): - # permute targets following indices - batch_idx = torch.cat([torch.full_like(tgt, i) for i, (_, tgt) in enumerate(indices)]) - tgt_idx = torch.cat([tgt for (_, tgt) in indices]) - return batch_idx, tgt_idx - - def get_loss(self, loss, outputs, targets, indices, num_boxes: int, **kwargs): - loss_map = { - "labels": self.loss_labels, - "cardinality": self.loss_cardinality, - "boxes": self.loss_boxes, - "masks": self.loss_masks, - } - assert loss in loss_map, f"do you really want to compute {loss} loss?" - return loss_map[loss](outputs, targets, indices, num_boxes, **kwargs) - - def forward(self, outputs, targets): - """This performs the loss computation. - Parameters: - outputs: dict of tensors, see the output specification of the model for the format - targets: list of dicts, such that len(targets) == batch_size. - The expected keys in each dict depends on the losses applied, see each loss' doc - """ - outputs_without_aux = { - k: v for k, v in outputs.items() if k != "aux_outputs" and k != "enc_outputs" - } - - # Retrieve the matching between the outputs of the last layer and the targets - indices = self.matcher(outputs_without_aux, targets) - - # Compute the average number of target boxes accross all nodes, for normalization purposes - num_boxes = sum(len(t["labels"]) for t in targets) - num_boxes = torch.as_tensor( - [num_boxes], dtype=torch.float, device=next(iter(outputs.values())).device - ) - if is_dist_avail_and_initialized(): - torch.distributed.all_reduce(num_boxes) - num_boxes = torch.clamp(num_boxes / get_world_size(), min=1).item() - - # Compute all the requested losses - losses = {} - for loss in self.losses: - kwargs = {} - losses.update(self.get_loss(loss, outputs, targets, indices, num_boxes, **kwargs)) - - # In case of auxiliary losses, we repeat this process with the output of each intermediate layer. - if "aux_outputs" in outputs: - for i, aux_outputs in enumerate(outputs["aux_outputs"]): - indices = self.matcher(aux_outputs, targets) - for loss in self.losses: - if loss == "masks": - # Intermediate masks losses are too costly to compute, we ignore them. - continue - kwargs = {} - if loss == "labels": - # Logging is enabled only for the last layer - kwargs["log"] = False - l_dict = self.get_loss(loss, aux_outputs, targets, indices, num_boxes, **kwargs) - l_dict = {k + f"_{i}": v for k, v in l_dict.items()} - losses.update(l_dict) - - if "enc_outputs" in outputs: - enc_outputs = outputs["enc_outputs"] - bin_targets = copy.deepcopy(targets) - for bt in bin_targets: - bt["labels"] = torch.zeros_like(bt["labels"]) - indices = self.matcher(enc_outputs, bin_targets) - for loss in self.losses: - if loss == "masks": - # Intermediate masks losses are too costly to compute, we ignore them. - continue - kwargs = {} - if loss == "labels": - # Logging is enabled only for the last layer - kwargs["log"] = False - l_dict = self.get_loss(loss, enc_outputs, bin_targets, indices, num_boxes, **kwargs) - l_dict = {k + "_enc": v for k, v in l_dict.items()} - losses.update(l_dict) - - return losses - - -class PostProcess(nn.Module): - """This module converts the model's output into the format expected by the coco api""" - - @torch.no_grad() - def forward(self, outputs, target_sizes: Sequence[int]): - """Perform the computation - Parameters: - outputs: raw outputs of the model - target_sizes: tensor of dimension [batch_size x 2] containing the size of each images of the batch - For evaluation, this must be the original image size (before any data augmentation) - For visualization, this should be the image size after data augment, but before padding - """ - out_logits, out_bbox = outputs["pred_logits"], outputs["pred_boxes"] - - assert len(out_logits) == len(target_sizes) - assert target_sizes.shape[1] == 2 - - prob = out_logits.sigmoid() - topk_values, topk_indexes = torch.topk(prob.view(out_logits.shape[0], -1), 100, dim=1) - scores = topk_values - topk_boxes = topk_indexes // out_logits.shape[2] - labels = topk_indexes % out_logits.shape[2] - boxes = box_ops.box_cxcywh_to_xyxy(out_bbox) - boxes = torch.gather(boxes, 1, topk_boxes.unsqueeze(-1).repeat(1, 1, 4)) - - # and from relative [0, 1] to absolute [0, height] coordinates - img_h, img_w = target_sizes.unbind(1) - scale_fct = torch.stack([img_w, img_h, img_w, img_h], dim=1) - boxes = boxes * scale_fct[:, None, :] - - results = [{"scores": s, "labels": l, "boxes": b} for s, l, b in zip(scores, labels, boxes, strict=False)] - - return results - - -class MLP(nn.Module): - """Very simple multi-layer perceptron (also called FFN)""" - - def __init__(self, input_dim, hidden_dim, output_dim, num_layers: int) -> None: - super().__init__() - self.num_layers = num_layers - h = [hidden_dim] * (num_layers - 1) - self.layers = nn.ModuleList( - nn.Linear(n, k) for n, k in zip([input_dim, *h], [*h, output_dim], strict=False) - ) - - def forward(self, x): - for i, layer in enumerate(self.layers): - x = F.relu(layer(x)) if i < self.num_layers - 1 else layer(x) - return x - - -def build(args): - num_classes = 20 if args.dataset_file != "coco" else 91 - if args.dataset_file == "coco_panoptic": - num_classes = 250 - device = torch.device(args.device) - - backbone = build_backbone(args) - - transformer = build_deforamble_transformer(args) - model = DeformableDETR( - backbone, - transformer, - num_classes=num_classes, - num_queries=args.num_queries, - num_feature_levels=args.num_feature_levels, - aux_loss=args.aux_loss, - with_box_refine=args.with_box_refine, - two_stage=args.two_stage, - ) - if args.masks: - model = DETRsegm(model, freeze_detr=(args.frozen_weights is not None)) - matcher = build_matcher(args) - weight_dict = {"loss_ce": args.cls_loss_coef, "loss_bbox": args.bbox_loss_coef} - weight_dict["loss_giou"] = args.giou_loss_coef - if args.masks: - weight_dict["loss_mask"] = args.mask_loss_coef - weight_dict["loss_dice"] = args.dice_loss_coef - # TODO this is a hack - if args.aux_loss: - aux_weight_dict = {} - for i in range(args.dec_layers - 1): - aux_weight_dict.update({k + f"_{i}": v for k, v in weight_dict.items()}) - aux_weight_dict.update({k + "_enc": v for k, v in weight_dict.items()}) - weight_dict.update(aux_weight_dict) - - losses = ["labels", "boxes", "cardinality"] - if args.masks: - losses += ["masks"] - # num_classes, matcher, weight_dict, losses, focal_alpha=0.25 - criterion = SetCriterion( - num_classes, matcher, weight_dict, losses, focal_alpha=args.focal_alpha - ) - criterion.to(device) - postprocessors = {"bbox": PostProcess()} - if args.masks: - postprocessors["segm"] = PostProcessSegm() - if args.dataset_file == "coco_panoptic": - is_thing_map = {i: i <= 90 for i in range(201)} - postprocessors["panoptic"] = PostProcessPanoptic(is_thing_map, threshold=0.85) - - return model, criterion, postprocessors diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_transformer.py b/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_transformer.py deleted file mode 100644 index f3cde19e1b..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_transformer.py +++ /dev/null @@ -1,507 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -import copy -import math - -import torch -from torch import nn -import torch.nn.functional as F -from torch.nn.init import constant_, normal_, xavier_uniform_ -from util.misc import inverse_sigmoid - -from models.ops.modules import MSDeformAttn - - -class DeformableTransformer(nn.Module): - def __init__( - self, - d_model: int=256, - nhead: int=8, - num_encoder_layers: int=6, - num_decoder_layers: int=6, - dim_feedforward: int=1024, - dropout: float=0.1, - activation: str="relu", - return_intermediate_dec: bool=False, - num_feature_levels: int=4, - dec_n_points: int=4, - enc_n_points: int=4, - two_stage: bool=False, - two_stage_num_proposals: int=300, - ) -> None: - super().__init__() - - self.d_model = d_model - self.nhead = nhead - self.two_stage = two_stage - self.two_stage_num_proposals = two_stage_num_proposals - - encoder_layer = DeformableTransformerEncoderLayer( - d_model, dim_feedforward, dropout, activation, num_feature_levels, nhead, enc_n_points - ) - self.encoder = DeformableTransformerEncoder(encoder_layer, num_encoder_layers) - - decoder_layer = DeformableTransformerDecoderLayer( - d_model, dim_feedforward, dropout, activation, num_feature_levels, nhead, dec_n_points - ) - self.decoder = DeformableTransformerDecoder( - decoder_layer, num_decoder_layers, return_intermediate_dec - ) - - self.level_embed = nn.Parameter(torch.Tensor(num_feature_levels, d_model)) - - if two_stage: - self.enc_output = nn.Linear(d_model, d_model) - self.enc_output_norm = nn.LayerNorm(d_model) - self.pos_trans = nn.Linear(d_model * 2, d_model * 2) - self.pos_trans_norm = nn.LayerNorm(d_model * 2) - else: - self.reference_points = nn.Linear(d_model, 2) - - self._reset_parameters() - - def _reset_parameters(self) -> None: - for p in self.parameters(): - if p.dim() > 1: - nn.init.xavier_uniform_(p) - for m in self.modules(): - if isinstance(m, MSDeformAttn): - m._reset_parameters() - if not self.two_stage: - xavier_uniform_(self.reference_points.weight.data, gain=1.0) - constant_(self.reference_points.bias.data, 0.0) - normal_(self.level_embed) - - def get_proposal_pos_embed(self, proposals): - num_pos_feats = 128 - temperature = 10000 - scale = 2 * math.pi - - dim_t = torch.arange(num_pos_feats, dtype=torch.float32, device=proposals.device) - dim_t = temperature ** (2 * (dim_t // 2) / num_pos_feats) - # N, L, 4 - proposals = proposals.sigmoid() * scale - # N, L, 4, 128 - pos = proposals[:, :, :, None] / dim_t - # N, L, 4, 64, 2 - pos = torch.stack((pos[:, :, :, 0::2].sin(), pos[:, :, :, 1::2].cos()), dim=4).flatten(2) - return pos - - def gen_encoder_output_proposals(self, memory, memory_padding_mask, spatial_shapes): - N_, S_, C_ = memory.shape - proposals = [] - _cur = 0 - for lvl, (H_, W_) in enumerate(spatial_shapes): - mask_flatten_ = memory_padding_mask[:, _cur : (_cur + H_ * W_)].view(N_, H_, W_, 1) - valid_H = torch.sum(~mask_flatten_[:, :, 0, 0], 1) - valid_W = torch.sum(~mask_flatten_[:, 0, :, 0], 1) - - grid_y, grid_x = torch.meshgrid( - torch.linspace(0, H_ - 1, H_, dtype=torch.float32, device=memory.device), - torch.linspace(0, W_ - 1, W_, dtype=torch.float32, device=memory.device), - ) - grid = torch.cat([grid_x.unsqueeze(-1), grid_y.unsqueeze(-1)], -1) - - scale = torch.cat([valid_W.unsqueeze(-1), valid_H.unsqueeze(-1)], 1).view(N_, 1, 1, 2) - grid = (grid.unsqueeze(0).expand(N_, -1, -1, -1) + 0.5) / scale - wh = torch.ones_like(grid) * 0.05 * (2.0**lvl) - proposal = torch.cat((grid, wh), -1).view(N_, -1, 4) - proposals.append(proposal) - _cur += H_ * W_ - output_proposals = torch.cat(proposals, 1) - output_proposals_valid = ((output_proposals > 0.01) & (output_proposals < 0.99)).all( - -1, keepdim=True - ) - output_proposals = torch.log(output_proposals / (1 - output_proposals)) - output_proposals = output_proposals.masked_fill( - memory_padding_mask.unsqueeze(-1), float("inf") - ) - output_proposals = output_proposals.masked_fill(~output_proposals_valid, float("inf")) - - output_memory = memory - output_memory = output_memory.masked_fill(memory_padding_mask.unsqueeze(-1), float(0)) - output_memory = output_memory.masked_fill(~output_proposals_valid, float(0)) - output_memory = self.enc_output_norm(self.enc_output(output_memory)) - return output_memory, output_proposals - - def get_valid_ratio(self, mask): - _, H, W = mask.shape - valid_H = torch.sum(~mask[:, :, 0], 1) - valid_W = torch.sum(~mask[:, 0, :], 1) - valid_ratio_h = valid_H.float() / H - valid_ratio_w = valid_W.float() / W - valid_ratio = torch.stack([valid_ratio_w, valid_ratio_h], -1) - return valid_ratio - - def forward(self, srcs, masks, pos_embeds, query_embed=None): - assert self.two_stage or query_embed is not None - - # prepare input for encoder - src_flatten = [] - mask_flatten = [] - lvl_pos_embed_flatten = [] - spatial_shapes = [] - for lvl, (src, mask, pos_embed) in enumerate(zip(srcs, masks, pos_embeds, strict=False)): - bs, c, h, w = src.shape - spatial_shape = (h, w) - spatial_shapes.append(spatial_shape) - src = src.flatten(2).transpose(1, 2) - mask = mask.flatten(1) - pos_embed = pos_embed.flatten(2).transpose(1, 2) - lvl_pos_embed = pos_embed + self.level_embed[lvl].view(1, 1, -1) - lvl_pos_embed_flatten.append(lvl_pos_embed) - src_flatten.append(src) - mask_flatten.append(mask) - src_flatten = torch.cat(src_flatten, 1) - mask_flatten = torch.cat(mask_flatten, 1) - lvl_pos_embed_flatten = torch.cat(lvl_pos_embed_flatten, 1) - spatial_shapes = torch.as_tensor( - spatial_shapes, dtype=torch.long, device=src_flatten.device - ) - level_start_index = torch.cat( - (spatial_shapes.new_zeros((1,)), spatial_shapes.prod(1).cumsum(0)[:-1]) - ) - valid_ratios = torch.stack([self.get_valid_ratio(m) for m in masks], 1) - - # encoder - memory = self.encoder( - src_flatten, - spatial_shapes, - level_start_index, - valid_ratios, - lvl_pos_embed_flatten, - mask_flatten, - ) - - # prepare input for decoder - bs, _, c = memory.shape - if self.two_stage: - output_memory, output_proposals = self.gen_encoder_output_proposals( - memory, mask_flatten, spatial_shapes - ) - - # hack implementation for two-stage Deformable DETR - enc_outputs_class = self.decoder.class_embed[self.decoder.num_layers](output_memory) - enc_outputs_coord_unact = ( - self.decoder.bbox_embed[self.decoder.num_layers](output_memory) + output_proposals - ) - - topk = self.two_stage_num_proposals - topk_proposals = torch.topk(enc_outputs_class[..., 0], topk, dim=1)[1] - topk_coords_unact = torch.gather( - enc_outputs_coord_unact, 1, topk_proposals.unsqueeze(-1).repeat(1, 1, 4) - ) - topk_coords_unact = topk_coords_unact.detach() - reference_points = topk_coords_unact.sigmoid() - init_reference_out = reference_points - pos_trans_out = self.pos_trans_norm( - self.pos_trans(self.get_proposal_pos_embed(topk_coords_unact)) - ) - query_embed, tgt = torch.split(pos_trans_out, c, dim=2) - else: - query_embed, tgt = torch.split(query_embed, c, dim=1) - query_embed = query_embed.unsqueeze(0).expand(bs, -1, -1) - tgt = tgt.unsqueeze(0).expand(bs, -1, -1) - reference_points = self.reference_points(query_embed).sigmoid() - init_reference_out = reference_points - - # decoder - hs, inter_references = self.decoder( - tgt, - reference_points, - memory, - spatial_shapes, - level_start_index, - valid_ratios, - query_embed, - mask_flatten, - ) - - inter_references_out = inter_references - if self.two_stage: - return ( - hs, - init_reference_out, - inter_references_out, - enc_outputs_class, - enc_outputs_coord_unact, - ) - return hs, init_reference_out, inter_references_out, None, None - - -class DeformableTransformerEncoderLayer(nn.Module): - def __init__( - self, - d_model: int=256, - d_ffn: int=1024, - dropout: float=0.1, - activation: str="relu", - n_levels: int=4, - n_heads: int=8, - n_points: int=4, - ) -> None: - super().__init__() - - # self attention - self.self_attn = MSDeformAttn(d_model, n_levels, n_heads, n_points) - self.dropout1 = nn.Dropout(dropout) - self.norm1 = nn.LayerNorm(d_model) - - # ffn - self.linear1 = nn.Linear(d_model, d_ffn) - self.activation = _get_activation_fn(activation) - self.dropout2 = nn.Dropout(dropout) - self.linear2 = nn.Linear(d_ffn, d_model) - self.dropout3 = nn.Dropout(dropout) - self.norm2 = nn.LayerNorm(d_model) - - @staticmethod - def with_pos_embed(tensor, pos): - return tensor if pos is None else tensor + pos - - def forward_ffn(self, src): - src2 = self.linear2(self.dropout2(self.activation(self.linear1(src)))) - src = src + self.dropout3(src2) - src = self.norm2(src) - return src - - def forward( - self, src, pos, reference_points, spatial_shapes, level_start_index, padding_mask=None - ): - # self attention - src2 = self.self_attn( - self.with_pos_embed(src, pos), - reference_points, - src, - spatial_shapes, - level_start_index, - padding_mask, - ) - src = src + self.dropout1(src2) - src = self.norm1(src) - - # ffn - src = self.forward_ffn(src) - - return src - - -class DeformableTransformerEncoder(nn.Module): - def __init__(self, encoder_layer, num_layers: int) -> None: - super().__init__() - self.layers = _get_clones(encoder_layer, num_layers) - self.num_layers = num_layers - - @staticmethod - def get_reference_points(spatial_shapes, valid_ratios, device): - reference_points_list = [] - for lvl, (H_, W_) in enumerate(spatial_shapes): - ref_y, ref_x = torch.meshgrid( - torch.linspace(0.5, H_ - 0.5, H_, dtype=torch.float32, device=device), - torch.linspace(0.5, W_ - 0.5, W_, dtype=torch.float32, device=device), - ) - ref_y = ref_y.reshape(-1)[None] / (valid_ratios[:, None, lvl, 1] * H_) - ref_x = ref_x.reshape(-1)[None] / (valid_ratios[:, None, lvl, 0] * W_) - ref = torch.stack((ref_x, ref_y), -1) - reference_points_list.append(ref) - reference_points = torch.cat(reference_points_list, 1) - reference_points = reference_points[:, :, None] * valid_ratios[:, None] - return reference_points - - def forward( - self, src, spatial_shapes, level_start_index, valid_ratios, pos=None, padding_mask=None - ): - output = src - reference_points = self.get_reference_points( - spatial_shapes, valid_ratios, device=src.device - ) - for _, layer in enumerate(self.layers): - output = layer( - output, pos, reference_points, spatial_shapes, level_start_index, padding_mask - ) - - return output - - -class DeformableTransformerDecoderLayer(nn.Module): - def __init__( - self, - d_model: int=256, - d_ffn: int=1024, - dropout: float=0.1, - activation: str="relu", - n_levels: int=4, - n_heads: int=8, - n_points: int=4, - ) -> None: - super().__init__() - - # cross attention - self.cross_attn = MSDeformAttn(d_model, n_levels, n_heads, n_points) - self.dropout1 = nn.Dropout(dropout) - self.norm1 = nn.LayerNorm(d_model) - - # self attention - self.self_attn = nn.MultiheadAttention(d_model, n_heads, dropout=dropout) - self.dropout2 = nn.Dropout(dropout) - self.norm2 = nn.LayerNorm(d_model) - - # ffn - self.linear1 = nn.Linear(d_model, d_ffn) - self.activation = _get_activation_fn(activation) - self.dropout3 = nn.Dropout(dropout) - self.linear2 = nn.Linear(d_ffn, d_model) - self.dropout4 = nn.Dropout(dropout) - self.norm3 = nn.LayerNorm(d_model) - - @staticmethod - def with_pos_embed(tensor, pos): - return tensor if pos is None else tensor + pos - - def forward_ffn(self, tgt): - tgt2 = self.linear2(self.dropout3(self.activation(self.linear1(tgt)))) - tgt = tgt + self.dropout4(tgt2) - tgt = self.norm3(tgt) - return tgt - - def forward( - self, - tgt, - query_pos, - reference_points, - src, - src_spatial_shapes, - level_start_index, - src_padding_mask=None, - ): - # self attention - q = k = self.with_pos_embed(tgt, query_pos) - tgt2 = self.self_attn(q.transpose(0, 1), k.transpose(0, 1), tgt.transpose(0, 1))[ - 0 - ].transpose(0, 1) - tgt = tgt + self.dropout2(tgt2) - tgt = self.norm2(tgt) - - # cross attention - tgt2 = self.cross_attn( - self.with_pos_embed(tgt, query_pos), - reference_points, - src, - src_spatial_shapes, - level_start_index, - src_padding_mask, - ) - tgt = tgt + self.dropout1(tgt2) - tgt = self.norm1(tgt) - - # ffn - tgt = self.forward_ffn(tgt) - - return tgt - - -class DeformableTransformerDecoder(nn.Module): - def __init__(self, decoder_layer, num_layers: int, return_intermediate: bool=False) -> None: - super().__init__() - self.layers = _get_clones(decoder_layer, num_layers) - self.num_layers = num_layers - self.return_intermediate = return_intermediate - # hack implementation for iterative bounding box refinement and two-stage Deformable DETR - self.bbox_embed = None - self.class_embed = None - - def forward( - self, - tgt, - reference_points, - src, - src_spatial_shapes, - src_level_start_index, - src_valid_ratios, - query_pos=None, - src_padding_mask=None, - ): - output = tgt - - intermediate = [] - intermediate_reference_points = [] - for lid, layer in enumerate(self.layers): - if reference_points.shape[-1] == 4: - reference_points_input = ( - reference_points[:, :, None] - * torch.cat([src_valid_ratios, src_valid_ratios], -1)[:, None] - ) - else: - assert reference_points.shape[-1] == 2 - reference_points_input = reference_points[:, :, None] * src_valid_ratios[:, None] - output = layer( - output, - query_pos, - reference_points_input, - src, - src_spatial_shapes, - src_level_start_index, - src_padding_mask, - ) - - # hack implementation for iterative bounding box refinement - if self.bbox_embed is not None: - tmp = self.bbox_embed[lid](output) - if reference_points.shape[-1] == 4: - new_reference_points = tmp + inverse_sigmoid(reference_points) - new_reference_points = new_reference_points.sigmoid() - else: - assert reference_points.shape[-1] == 2 - new_reference_points = tmp - new_reference_points[..., :2] = tmp[..., :2] + inverse_sigmoid(reference_points) - new_reference_points = new_reference_points.sigmoid() - reference_points = new_reference_points.detach() - - if self.return_intermediate: - intermediate.append(output) - intermediate_reference_points.append(reference_points) - - if self.return_intermediate: - return torch.stack(intermediate), torch.stack(intermediate_reference_points) - - return output, reference_points - - -def _get_clones(module, N): - return nn.ModuleList([copy.deepcopy(module) for i in range(N)]) - - -def _get_activation_fn(activation): - """Return an activation function given a string""" - if activation == "relu": - return F.relu - if activation == "gelu": - return F.gelu - if activation == "glu": - return F.glu - raise RuntimeError(f"activation should be relu/gelu, not {activation}.") - - -def build_deforamble_transformer(args): - return DeformableTransformer( - d_model=args.hidden_dim, - nhead=args.nheads, - num_encoder_layers=args.enc_layers, - num_decoder_layers=args.dec_layers, - dim_feedforward=args.dim_feedforward, - dropout=args.dropout, - activation="relu", - return_intermediate_dec=True, - num_feature_levels=args.num_feature_levels, - dec_n_points=args.dec_n_points, - enc_n_points=args.enc_n_points, - two_stage=args.two_stage, - two_stage_num_proposals=args.num_queries, - ) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/matcher.py b/dimos/models/Detic/third_party/Deformable-DETR/models/matcher.py deleted file mode 100644 index 7cbcf4a82e..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/matcher.py +++ /dev/null @@ -1,107 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Modules to compute the matching cost and solve the corresponding LSAP. -""" - -from scipy.optimize import linear_sum_assignment -import torch -from torch import nn -from util.box_ops import box_cxcywh_to_xyxy, generalized_box_iou - - -class HungarianMatcher(nn.Module): - """This class computes an assignment between the targets and the predictions of the network - - For efficiency reasons, the targets don't include the no_object. Because of this, in general, - there are more predictions than targets. In this case, we do a 1-to-1 matching of the best predictions, - while the others are un-matched (and thus treated as non-objects). - """ - - def __init__(self, cost_class: float = 1, cost_bbox: float = 1, cost_giou: float = 1) -> None: - """Creates the matcher - - Params: - cost_class: This is the relative weight of the classification error in the matching cost - cost_bbox: This is the relative weight of the L1 error of the bounding box coordinates in the matching cost - cost_giou: This is the relative weight of the giou loss of the bounding box in the matching cost - """ - super().__init__() - self.cost_class = cost_class - self.cost_bbox = cost_bbox - self.cost_giou = cost_giou - assert cost_class != 0 or cost_bbox != 0 or cost_giou != 0, "all costs cant be 0" - - def forward(self, outputs, targets): - """Performs the matching - - Params: - outputs: This is a dict that contains at least these entries: - "pred_logits": Tensor of dim [batch_size, num_queries, num_classes] with the classification logits - "pred_boxes": Tensor of dim [batch_size, num_queries, 4] with the predicted box coordinates - - targets: This is a list of targets (len(targets) = batch_size), where each target is a dict containing: - "labels": Tensor of dim [num_target_boxes] (where num_target_boxes is the number of ground-truth - objects in the target) containing the class labels - "boxes": Tensor of dim [num_target_boxes, 4] containing the target box coordinates - - Returns: - A list of size batch_size, containing tuples of (index_i, index_j) where: - - index_i is the indices of the selected predictions (in order) - - index_j is the indices of the corresponding selected targets (in order) - For each batch element, it holds: - len(index_i) = len(index_j) = min(num_queries, num_target_boxes) - """ - with torch.no_grad(): - bs, num_queries = outputs["pred_logits"].shape[:2] - - # We flatten to compute the cost matrices in a batch - out_prob = outputs["pred_logits"].flatten(0, 1).sigmoid() - out_bbox = outputs["pred_boxes"].flatten(0, 1) # [batch_size * num_queries, 4] - - # Also concat the target labels and boxes - tgt_ids = torch.cat([v["labels"] for v in targets]) - tgt_bbox = torch.cat([v["boxes"] for v in targets]) - - # Compute the classification cost. - alpha = 0.25 - gamma = 2.0 - neg_cost_class = (1 - alpha) * (out_prob**gamma) * (-(1 - out_prob + 1e-8).log()) - pos_cost_class = alpha * ((1 - out_prob) ** gamma) * (-(out_prob + 1e-8).log()) - cost_class = pos_cost_class[:, tgt_ids] - neg_cost_class[:, tgt_ids] - - # Compute the L1 cost between boxes - cost_bbox = torch.cdist(out_bbox, tgt_bbox, p=1) - - # Compute the giou cost betwen boxes - cost_giou = -generalized_box_iou( - box_cxcywh_to_xyxy(out_bbox), box_cxcywh_to_xyxy(tgt_bbox) - ) - - # Final cost matrix - C = ( - self.cost_bbox * cost_bbox - + self.cost_class * cost_class - + self.cost_giou * cost_giou - ) - C = C.view(bs, num_queries, -1).cpu() - - sizes = [len(v["boxes"]) for v in targets] - indices = [linear_sum_assignment(c[i]) for i, c in enumerate(C.split(sizes, -1))] - return [ - (torch.as_tensor(i, dtype=torch.int64), torch.as_tensor(j, dtype=torch.int64)) - for i, j in indices - ] - - -def build_matcher(args): - return HungarianMatcher( - cost_class=args.set_cost_class, cost_bbox=args.set_cost_bbox, cost_giou=args.set_cost_giou - ) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/functions/__init__.py b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/functions/__init__.py deleted file mode 100644 index c528f3c6cf..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/functions/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# ------------------------------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------------------------------ -# Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -# ------------------------------------------------------------------------------------------------ - -from .ms_deform_attn_func import MSDeformAttnFunction diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/functions/ms_deform_attn_func.py b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/functions/ms_deform_attn_func.py deleted file mode 100644 index 965811ed7f..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/functions/ms_deform_attn_func.py +++ /dev/null @@ -1,94 +0,0 @@ -# ------------------------------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------------------------------ -# Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -# ------------------------------------------------------------------------------------------------ - - -import MultiScaleDeformableAttention as MSDA -import torch -from torch.autograd import Function -from torch.autograd.function import once_differentiable -import torch.nn.functional as F - - -class MSDeformAttnFunction(Function): - @staticmethod - def forward( - ctx, - value, - value_spatial_shapes, - value_level_start_index, - sampling_locations, - attention_weights, - im2col_step, - ): - ctx.im2col_step = im2col_step - output = MSDA.ms_deform_attn_forward( - value, - value_spatial_shapes, - value_level_start_index, - sampling_locations, - attention_weights, - ctx.im2col_step, - ) - ctx.save_for_backward( - value, - value_spatial_shapes, - value_level_start_index, - sampling_locations, - attention_weights, - ) - return output - - @staticmethod - @once_differentiable - def backward(ctx, grad_output): - ( - value, - value_spatial_shapes, - value_level_start_index, - sampling_locations, - attention_weights, - ) = ctx.saved_tensors - grad_value, grad_sampling_loc, grad_attn_weight = MSDA.ms_deform_attn_backward( - value, - value_spatial_shapes, - value_level_start_index, - sampling_locations, - attention_weights, - grad_output, - ctx.im2col_step, - ) - - return grad_value, None, None, grad_sampling_loc, grad_attn_weight, None - - -def ms_deform_attn_core_pytorch(value, value_spatial_shapes, sampling_locations, attention_weights): - # for debug and test only, - # need to use cuda version instead - N_, S_, M_, D_ = value.shape - _, Lq_, M_, L_, P_, _ = sampling_locations.shape - value_list = value.split([H_ * W_ for H_, W_ in value_spatial_shapes], dim=1) - sampling_grids = 2 * sampling_locations - 1 - sampling_value_list = [] - for lid_, (H_, W_) in enumerate(value_spatial_shapes): - # N_, H_*W_, M_, D_ -> N_, H_*W_, M_*D_ -> N_, M_*D_, H_*W_ -> N_*M_, D_, H_, W_ - value_l_ = value_list[lid_].flatten(2).transpose(1, 2).reshape(N_ * M_, D_, H_, W_) - # N_, Lq_, M_, P_, 2 -> N_, M_, Lq_, P_, 2 -> N_*M_, Lq_, P_, 2 - sampling_grid_l_ = sampling_grids[:, :, :, lid_].transpose(1, 2).flatten(0, 1) - # N_*M_, D_, Lq_, P_ - sampling_value_l_ = F.grid_sample( - value_l_, sampling_grid_l_, mode="bilinear", padding_mode="zeros", align_corners=False - ) - sampling_value_list.append(sampling_value_l_) - # (N_, Lq_, M_, L_, P_) -> (N_, M_, Lq_, L_, P_) -> (N_, M_, 1, Lq_, L_*P_) - attention_weights = attention_weights.transpose(1, 2).reshape(N_ * M_, 1, Lq_, L_ * P_) - output = ( - (torch.stack(sampling_value_list, dim=-2).flatten(-2) * attention_weights) - .sum(-1) - .view(N_, M_ * D_, Lq_) - ) - return output.transpose(1, 2).contiguous() diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/make.sh b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/make.sh deleted file mode 100755 index 106b685722..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/make.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/usr/bin/env bash -# ------------------------------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------------------------------ -# Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -# ------------------------------------------------------------------------------------------------ - -python setup.py build install diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/modules/__init__.py b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/modules/__init__.py deleted file mode 100644 index f82cb1ad9d..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/modules/__init__.py +++ /dev/null @@ -1,9 +0,0 @@ -# ------------------------------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------------------------------ -# Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -# ------------------------------------------------------------------------------------------------ - -from .ms_deform_attn import MSDeformAttn diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/modules/ms_deform_attn.py b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/modules/ms_deform_attn.py deleted file mode 100644 index 1d70af7cc4..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/modules/ms_deform_attn.py +++ /dev/null @@ -1,147 +0,0 @@ -# ------------------------------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------------------------------ -# Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -# ------------------------------------------------------------------------------------------------ - - -import math -import warnings - -import torch -from torch import nn -import torch.nn.functional as F -from torch.nn.init import constant_, xavier_uniform_ - -from ..functions import MSDeformAttnFunction - - -def _is_power_of_2(n): - if (not isinstance(n, int)) or (n < 0): - raise ValueError(f"invalid input for _is_power_of_2: {n} (type: {type(n)})") - return (n & (n - 1) == 0) and n != 0 - - -class MSDeformAttn(nn.Module): - def __init__(self, d_model: int=256, n_levels: int=4, n_heads: int=8, n_points: int=4) -> None: - """ - Multi-Scale Deformable Attention Module - :param d_model hidden dimension - :param n_levels number of feature levels - :param n_heads number of attention heads - :param n_points number of sampling points per attention head per feature level - """ - super().__init__() - if d_model % n_heads != 0: - raise ValueError( - f"d_model must be divisible by n_heads, but got {d_model} and {n_heads}" - ) - _d_per_head = d_model // n_heads - # you'd better set _d_per_head to a power of 2 which is more efficient in our CUDA implementation - if not _is_power_of_2(_d_per_head): - warnings.warn( - "You'd better set d_model in MSDeformAttn to make the dimension of each attention head a power of 2 " - "which is more efficient in our CUDA implementation.", stacklevel=2 - ) - - self.im2col_step = 64 - - self.d_model = d_model - self.n_levels = n_levels - self.n_heads = n_heads - self.n_points = n_points - - self.sampling_offsets = nn.Linear(d_model, n_heads * n_levels * n_points * 2) - self.attention_weights = nn.Linear(d_model, n_heads * n_levels * n_points) - self.value_proj = nn.Linear(d_model, d_model) - self.output_proj = nn.Linear(d_model, d_model) - - self._reset_parameters() - - def _reset_parameters(self) -> None: - constant_(self.sampling_offsets.weight.data, 0.0) - thetas = torch.arange(self.n_heads, dtype=torch.float32) * (2.0 * math.pi / self.n_heads) - grid_init = torch.stack([thetas.cos(), thetas.sin()], -1) - grid_init = ( - (grid_init / grid_init.abs().max(-1, keepdim=True)[0]) - .view(self.n_heads, 1, 1, 2) - .repeat(1, self.n_levels, self.n_points, 1) - ) - for i in range(self.n_points): - grid_init[:, :, i, :] *= i + 1 - with torch.no_grad(): - self.sampling_offsets.bias = nn.Parameter(grid_init.view(-1)) - constant_(self.attention_weights.weight.data, 0.0) - constant_(self.attention_weights.bias.data, 0.0) - xavier_uniform_(self.value_proj.weight.data) - constant_(self.value_proj.bias.data, 0.0) - xavier_uniform_(self.output_proj.weight.data) - constant_(self.output_proj.bias.data, 0.0) - - def forward( - self, - query, - reference_points, - input_flatten, - input_spatial_shapes, - input_level_start_index, - input_padding_mask=None, - ): - r""" - :param query (N, Length_{query}, C) - :param reference_points (N, Length_{query}, n_levels, 2), range in [0, 1], top-left (0,0), bottom-right (1, 1), including padding area - or (N, Length_{query}, n_levels, 4), add additional (w, h) to form reference boxes - :param input_flatten (N, \sum_{l=0}^{L-1} H_l \cdot W_l, C) - :param input_spatial_shapes (n_levels, 2), [(H_0, W_0), (H_1, W_1), ..., (H_{L-1}, W_{L-1})] - :param input_level_start_index (n_levels, ), [0, H_0*W_0, H_0*W_0+H_1*W_1, H_0*W_0+H_1*W_1+H_2*W_2, ..., H_0*W_0+H_1*W_1+...+H_{L-1}*W_{L-1}] - :param input_padding_mask (N, \sum_{l=0}^{L-1} H_l \cdot W_l), True for padding elements, False for non-padding elements - - :return output (N, Length_{query}, C) - """ - N, Len_q, _ = query.shape - N, Len_in, _ = input_flatten.shape - assert (input_spatial_shapes[:, 0] * input_spatial_shapes[:, 1]).sum() == Len_in - - value = self.value_proj(input_flatten) - if input_padding_mask is not None: - value = value.masked_fill(input_padding_mask[..., None], float(0)) - value = value.view(N, Len_in, self.n_heads, self.d_model // self.n_heads) - sampling_offsets = self.sampling_offsets(query).view( - N, Len_q, self.n_heads, self.n_levels, self.n_points, 2 - ) - attention_weights = self.attention_weights(query).view( - N, Len_q, self.n_heads, self.n_levels * self.n_points - ) - attention_weights = F.softmax(attention_weights, -1).view( - N, Len_q, self.n_heads, self.n_levels, self.n_points - ) - # N, Len_q, n_heads, n_levels, n_points, 2 - if reference_points.shape[-1] == 2: - offset_normalizer = torch.stack( - [input_spatial_shapes[..., 1], input_spatial_shapes[..., 0]], -1 - ) - sampling_locations = ( - reference_points[:, :, None, :, None, :] - + sampling_offsets / offset_normalizer[None, None, None, :, None, :] - ) - elif reference_points.shape[-1] == 4: - sampling_locations = ( - reference_points[:, :, None, :, None, :2] - + sampling_offsets / self.n_points * reference_points[:, :, None, :, None, 2:] * 0.5 - ) - else: - raise ValueError( - f"Last dim of reference_points must be 2 or 4, but get {reference_points.shape[-1]} instead." - ) - output = MSDeformAttnFunction.apply( - value, - input_spatial_shapes, - input_level_start_index, - sampling_locations, - attention_weights, - self.im2col_step, - ) - output = self.output_proj(output) - return output diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/setup.py b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/setup.py deleted file mode 100644 index 7a5560a83f..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/setup.py +++ /dev/null @@ -1,73 +0,0 @@ -# ------------------------------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------------------------------ -# Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -# ------------------------------------------------------------------------------------------------ - -import glob -import os - -from setuptools import find_packages, setup -import torch -from torch.utils.cpp_extension import CUDA_HOME, CppExtension, CUDAExtension - -requirements = ["torch", "torchvision"] - - -def get_extensions(): - this_dir = os.path.dirname(os.path.abspath(__file__)) - extensions_dir = os.path.join(this_dir, "src") - - main_file = glob.glob(os.path.join(extensions_dir, "*.cpp")) - source_cpu = glob.glob(os.path.join(extensions_dir, "cpu", "*.cpp")) - source_cuda = glob.glob(os.path.join(extensions_dir, "cuda", "*.cu")) - - sources = main_file + source_cpu - extension = CppExtension - extra_compile_args = {"cxx": []} - define_macros = [] - - if torch.cuda.is_available() and CUDA_HOME is not None: - extension = CUDAExtension - sources += source_cuda - define_macros += [("WITH_CUDA", None)] - extra_compile_args["nvcc"] = [ - "-DCUDA_HAS_FP16=1", - "-D__CUDA_NO_HALF_OPERATORS__", - "-D__CUDA_NO_HALF_CONVERSIONS__", - "-D__CUDA_NO_HALF2_OPERATORS__", - ] - else: - raise NotImplementedError("Cuda is not availabel") - - sources = [os.path.join(extensions_dir, s) for s in sources] - include_dirs = [extensions_dir] - ext_modules = [ - extension( - "MultiScaleDeformableAttention", - sources, - include_dirs=include_dirs, - define_macros=define_macros, - extra_compile_args=extra_compile_args, - ) - ] - return ext_modules - - -setup( - name="MultiScaleDeformableAttention", - version="1.0", - author="Weijie Su", - url="https://github.com/fundamentalvision/Deformable-DETR", - description="PyTorch Wrapper for CUDA Functions of Multi-Scale Deformable Attention", - packages=find_packages( - exclude=( - "configs", - "tests", - ) - ), - ext_modules=get_extensions(), - cmdclass={"build_ext": torch.utils.cpp_extension.BuildExtension}, -) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cpu/ms_deform_attn_cpu.cpp b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cpu/ms_deform_attn_cpu.cpp deleted file mode 100644 index e1bf854de1..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cpu/ms_deform_attn_cpu.cpp +++ /dev/null @@ -1,41 +0,0 @@ -/*! -************************************************************************************************** -* Deformable DETR -* Copyright (c) 2020 SenseTime. All Rights Reserved. -* Licensed under the Apache License, Version 2.0 [see LICENSE for details] -************************************************************************************************** -* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -************************************************************************************************** -*/ - -#include - -#include -#include - - -at::Tensor -ms_deform_attn_cpu_forward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const int im2col_step) -{ - AT_ERROR("Not implement on cpu"); -} - -std::vector -ms_deform_attn_cpu_backward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const at::Tensor &grad_output, - const int im2col_step) -{ - AT_ERROR("Not implement on cpu"); -} - diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cpu/ms_deform_attn_cpu.h b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cpu/ms_deform_attn_cpu.h deleted file mode 100644 index 81b7b58a3d..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cpu/ms_deform_attn_cpu.h +++ /dev/null @@ -1,33 +0,0 @@ -/*! -************************************************************************************************** -* Deformable DETR -* Copyright (c) 2020 SenseTime. All Rights Reserved. -* Licensed under the Apache License, Version 2.0 [see LICENSE for details] -************************************************************************************************** -* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -************************************************************************************************** -*/ - -#pragma once -#include - -at::Tensor -ms_deform_attn_cpu_forward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const int im2col_step); - -std::vector -ms_deform_attn_cpu_backward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const at::Tensor &grad_output, - const int im2col_step); - - diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_attn_cuda.cu b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_attn_cuda.cu deleted file mode 100644 index d6d583647c..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_attn_cuda.cu +++ /dev/null @@ -1,153 +0,0 @@ -/*! -************************************************************************************************** -* Deformable DETR -* Copyright (c) 2020 SenseTime. All Rights Reserved. -* Licensed under the Apache License, Version 2.0 [see LICENSE for details] -************************************************************************************************** -* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -************************************************************************************************** -*/ - -#include -#include "cuda/ms_deform_im2col_cuda.cuh" - -#include -#include -#include -#include - - -at::Tensor ms_deform_attn_cuda_forward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const int im2col_step) -{ - AT_ASSERTM(value.is_contiguous(), "value tensor has to be contiguous"); - AT_ASSERTM(spatial_shapes.is_contiguous(), "spatial_shapes tensor has to be contiguous"); - AT_ASSERTM(level_start_index.is_contiguous(), "level_start_index tensor has to be contiguous"); - AT_ASSERTM(sampling_loc.is_contiguous(), "sampling_loc tensor has to be contiguous"); - AT_ASSERTM(attn_weight.is_contiguous(), "attn_weight tensor has to be contiguous"); - - AT_ASSERTM(value.type().is_cuda(), "value must be a CUDA tensor"); - AT_ASSERTM(spatial_shapes.type().is_cuda(), "spatial_shapes must be a CUDA tensor"); - AT_ASSERTM(level_start_index.type().is_cuda(), "level_start_index must be a CUDA tensor"); - AT_ASSERTM(sampling_loc.type().is_cuda(), "sampling_loc must be a CUDA tensor"); - AT_ASSERTM(attn_weight.type().is_cuda(), "attn_weight must be a CUDA tensor"); - - const int batch = value.size(0); - const int spatial_size = value.size(1); - const int num_heads = value.size(2); - const int channels = value.size(3); - - const int num_levels = spatial_shapes.size(0); - - const int num_query = sampling_loc.size(1); - const int num_point = sampling_loc.size(4); - - const int im2col_step_ = std::min(batch, im2col_step); - - AT_ASSERTM(batch % im2col_step_ == 0, "batch(%d) must divide im2col_step(%d)", batch, im2col_step_); - - auto output = at::zeros({batch, num_query, num_heads, channels}, value.options()); - - const int batch_n = im2col_step_; - auto output_n = output.view({batch/im2col_step_, batch_n, num_query, num_heads, channels}); - auto per_value_size = spatial_size * num_heads * channels; - auto per_sample_loc_size = num_query * num_heads * num_levels * num_point * 2; - auto per_attn_weight_size = num_query * num_heads * num_levels * num_point; - for (int n = 0; n < batch/im2col_step_; ++n) - { - auto columns = output_n.select(0, n); - AT_DISPATCH_FLOATING_TYPES(value.type(), "ms_deform_attn_forward_cuda", ([&] { - ms_deformable_im2col_cuda(at::cuda::getCurrentCUDAStream(), - value.data() + n * im2col_step_ * per_value_size, - spatial_shapes.data(), - level_start_index.data(), - sampling_loc.data() + n * im2col_step_ * per_sample_loc_size, - attn_weight.data() + n * im2col_step_ * per_attn_weight_size, - batch_n, spatial_size, num_heads, channels, num_levels, num_query, num_point, - columns.data()); - - })); - } - - output = output.view({batch, num_query, num_heads*channels}); - - return output; -} - - -std::vector ms_deform_attn_cuda_backward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const at::Tensor &grad_output, - const int im2col_step) -{ - - AT_ASSERTM(value.is_contiguous(), "value tensor has to be contiguous"); - AT_ASSERTM(spatial_shapes.is_contiguous(), "spatial_shapes tensor has to be contiguous"); - AT_ASSERTM(level_start_index.is_contiguous(), "level_start_index tensor has to be contiguous"); - AT_ASSERTM(sampling_loc.is_contiguous(), "sampling_loc tensor has to be contiguous"); - AT_ASSERTM(attn_weight.is_contiguous(), "attn_weight tensor has to be contiguous"); - AT_ASSERTM(grad_output.is_contiguous(), "grad_output tensor has to be contiguous"); - - AT_ASSERTM(value.type().is_cuda(), "value must be a CUDA tensor"); - AT_ASSERTM(spatial_shapes.type().is_cuda(), "spatial_shapes must be a CUDA tensor"); - AT_ASSERTM(level_start_index.type().is_cuda(), "level_start_index must be a CUDA tensor"); - AT_ASSERTM(sampling_loc.type().is_cuda(), "sampling_loc must be a CUDA tensor"); - AT_ASSERTM(attn_weight.type().is_cuda(), "attn_weight must be a CUDA tensor"); - AT_ASSERTM(grad_output.type().is_cuda(), "grad_output must be a CUDA tensor"); - - const int batch = value.size(0); - const int spatial_size = value.size(1); - const int num_heads = value.size(2); - const int channels = value.size(3); - - const int num_levels = spatial_shapes.size(0); - - const int num_query = sampling_loc.size(1); - const int num_point = sampling_loc.size(4); - - const int im2col_step_ = std::min(batch, im2col_step); - - AT_ASSERTM(batch % im2col_step_ == 0, "batch(%d) must divide im2col_step(%d)", batch, im2col_step_); - - auto grad_value = at::zeros_like(value); - auto grad_sampling_loc = at::zeros_like(sampling_loc); - auto grad_attn_weight = at::zeros_like(attn_weight); - - const int batch_n = im2col_step_; - auto per_value_size = spatial_size * num_heads * channels; - auto per_sample_loc_size = num_query * num_heads * num_levels * num_point * 2; - auto per_attn_weight_size = num_query * num_heads * num_levels * num_point; - auto grad_output_n = grad_output.view({batch/im2col_step_, batch_n, num_query, num_heads, channels}); - - for (int n = 0; n < batch/im2col_step_; ++n) - { - auto grad_output_g = grad_output_n.select(0, n); - AT_DISPATCH_FLOATING_TYPES(value.type(), "ms_deform_attn_backward_cuda", ([&] { - ms_deformable_col2im_cuda(at::cuda::getCurrentCUDAStream(), - grad_output_g.data(), - value.data() + n * im2col_step_ * per_value_size, - spatial_shapes.data(), - level_start_index.data(), - sampling_loc.data() + n * im2col_step_ * per_sample_loc_size, - attn_weight.data() + n * im2col_step_ * per_attn_weight_size, - batch_n, spatial_size, num_heads, channels, num_levels, num_query, num_point, - grad_value.data() + n * im2col_step_ * per_value_size, - grad_sampling_loc.data() + n * im2col_step_ * per_sample_loc_size, - grad_attn_weight.data() + n * im2col_step_ * per_attn_weight_size); - - })); - } - - return { - grad_value, grad_sampling_loc, grad_attn_weight - }; -} \ No newline at end of file diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_attn_cuda.h b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_attn_cuda.h deleted file mode 100644 index c7ae53f99c..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_attn_cuda.h +++ /dev/null @@ -1,30 +0,0 @@ -/*! -************************************************************************************************** -* Deformable DETR -* Copyright (c) 2020 SenseTime. All Rights Reserved. -* Licensed under the Apache License, Version 2.0 [see LICENSE for details] -************************************************************************************************** -* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -************************************************************************************************** -*/ - -#pragma once -#include - -at::Tensor ms_deform_attn_cuda_forward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const int im2col_step); - -std::vector ms_deform_attn_cuda_backward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const at::Tensor &grad_output, - const int im2col_step); - diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_im2col_cuda.cuh b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_im2col_cuda.cuh deleted file mode 100644 index 6bc2acb7ae..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/cuda/ms_deform_im2col_cuda.cuh +++ /dev/null @@ -1,1327 +0,0 @@ -/*! -************************************************************************** -* Deformable DETR -* Copyright (c) 2020 SenseTime. All Rights Reserved. -* Licensed under the Apache License, Version 2.0 [see LICENSE for details] -************************************************************************** -* Modified from DCN (https://github.com/msracver/Deformable-ConvNets) -* Copyright (c) 2018 Microsoft -************************************************************************** -*/ - -#include -#include -#include - -#include -#include - -#include - -#define CUDA_KERNEL_LOOP(i, n) \ - for (int i = blockIdx.x * blockDim.x + threadIdx.x; \ - i < (n); \ - i += blockDim.x * gridDim.x) - -const int CUDA_NUM_THREADS = 1024; -inline int GET_BLOCKS(const int N, const int num_threads) -{ - return (N + num_threads - 1) / num_threads; -} - - -template -__device__ scalar_t ms_deform_attn_im2col_bilinear(const scalar_t* &bottom_data, - const int &height, const int &width, const int &nheads, const int &channels, - const scalar_t &h, const scalar_t &w, const int &m, const int &c) -{ - const int h_low = floor(h); - const int w_low = floor(w); - const int h_high = h_low + 1; - const int w_high = w_low + 1; - - const scalar_t lh = h - h_low; - const scalar_t lw = w - w_low; - const scalar_t hh = 1 - lh, hw = 1 - lw; - - const int w_stride = nheads * channels; - const int h_stride = width * w_stride; - const int h_low_ptr_offset = h_low * h_stride; - const int h_high_ptr_offset = h_low_ptr_offset + h_stride; - const int w_low_ptr_offset = w_low * w_stride; - const int w_high_ptr_offset = w_low_ptr_offset + w_stride; - const int base_ptr = m * channels + c; - - scalar_t v1 = 0; - if (h_low >= 0 && w_low >= 0) - { - const int ptr1 = h_low_ptr_offset + w_low_ptr_offset + base_ptr; - v1 = bottom_data[ptr1]; - } - scalar_t v2 = 0; - if (h_low >= 0 && w_high <= width - 1) - { - const int ptr2 = h_low_ptr_offset + w_high_ptr_offset + base_ptr; - v2 = bottom_data[ptr2]; - } - scalar_t v3 = 0; - if (h_high <= height - 1 && w_low >= 0) - { - const int ptr3 = h_high_ptr_offset + w_low_ptr_offset + base_ptr; - v3 = bottom_data[ptr3]; - } - scalar_t v4 = 0; - if (h_high <= height - 1 && w_high <= width - 1) - { - const int ptr4 = h_high_ptr_offset + w_high_ptr_offset + base_ptr; - v4 = bottom_data[ptr4]; - } - - const scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; - - const scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); - return val; -} - - -template -__device__ void ms_deform_attn_col2im_bilinear(const scalar_t* &bottom_data, - const int &height, const int &width, const int &nheads, const int &channels, - const scalar_t &h, const scalar_t &w, const int &m, const int &c, - const scalar_t &top_grad, - const scalar_t &attn_weight, - scalar_t* &grad_value, - scalar_t* grad_sampling_loc, - scalar_t* grad_attn_weight) -{ - const int h_low = floor(h); - const int w_low = floor(w); - const int h_high = h_low + 1; - const int w_high = w_low + 1; - - const scalar_t lh = h - h_low; - const scalar_t lw = w - w_low; - const scalar_t hh = 1 - lh, hw = 1 - lw; - - const int w_stride = nheads * channels; - const int h_stride = width * w_stride; - const int h_low_ptr_offset = h_low * h_stride; - const int h_high_ptr_offset = h_low_ptr_offset + h_stride; - const int w_low_ptr_offset = w_low * w_stride; - const int w_high_ptr_offset = w_low_ptr_offset + w_stride; - const int base_ptr = m * channels + c; - - const scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; - const scalar_t top_grad_value = top_grad * attn_weight; - scalar_t grad_h_weight = 0, grad_w_weight = 0; - - scalar_t v1 = 0; - if (h_low >= 0 && w_low >= 0) - { - const int ptr1 = h_low_ptr_offset + w_low_ptr_offset + base_ptr; - v1 = bottom_data[ptr1]; - grad_h_weight -= hw * v1; - grad_w_weight -= hh * v1; - atomicAdd(grad_value+ptr1, w1*top_grad_value); - } - scalar_t v2 = 0; - if (h_low >= 0 && w_high <= width - 1) - { - const int ptr2 = h_low_ptr_offset + w_high_ptr_offset + base_ptr; - v2 = bottom_data[ptr2]; - grad_h_weight -= lw * v2; - grad_w_weight += hh * v2; - atomicAdd(grad_value+ptr2, w2*top_grad_value); - } - scalar_t v3 = 0; - if (h_high <= height - 1 && w_low >= 0) - { - const int ptr3 = h_high_ptr_offset + w_low_ptr_offset + base_ptr; - v3 = bottom_data[ptr3]; - grad_h_weight += hw * v3; - grad_w_weight -= lh * v3; - atomicAdd(grad_value+ptr3, w3*top_grad_value); - } - scalar_t v4 = 0; - if (h_high <= height - 1 && w_high <= width - 1) - { - const int ptr4 = h_high_ptr_offset + w_high_ptr_offset + base_ptr; - v4 = bottom_data[ptr4]; - grad_h_weight += lw * v4; - grad_w_weight += lh * v4; - atomicAdd(grad_value+ptr4, w4*top_grad_value); - } - - const scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); - *grad_attn_weight = top_grad * val; - *grad_sampling_loc = width * grad_w_weight * top_grad_value; - *(grad_sampling_loc + 1) = height * grad_h_weight * top_grad_value; -} - - -template -__device__ void ms_deform_attn_col2im_bilinear_gm(const scalar_t* &bottom_data, - const int &height, const int &width, const int &nheads, const int &channels, - const scalar_t &h, const scalar_t &w, const int &m, const int &c, - const scalar_t &top_grad, - const scalar_t &attn_weight, - scalar_t* &grad_value, - scalar_t* grad_sampling_loc, - scalar_t* grad_attn_weight) -{ - const int h_low = floor(h); - const int w_low = floor(w); - const int h_high = h_low + 1; - const int w_high = w_low + 1; - - const scalar_t lh = h - h_low; - const scalar_t lw = w - w_low; - const scalar_t hh = 1 - lh, hw = 1 - lw; - - const int w_stride = nheads * channels; - const int h_stride = width * w_stride; - const int h_low_ptr_offset = h_low * h_stride; - const int h_high_ptr_offset = h_low_ptr_offset + h_stride; - const int w_low_ptr_offset = w_low * w_stride; - const int w_high_ptr_offset = w_low_ptr_offset + w_stride; - const int base_ptr = m * channels + c; - - const scalar_t w1 = hh * hw, w2 = hh * lw, w3 = lh * hw, w4 = lh * lw; - const scalar_t top_grad_value = top_grad * attn_weight; - scalar_t grad_h_weight = 0, grad_w_weight = 0; - - scalar_t v1 = 0; - if (h_low >= 0 && w_low >= 0) - { - const int ptr1 = h_low_ptr_offset + w_low_ptr_offset + base_ptr; - v1 = bottom_data[ptr1]; - grad_h_weight -= hw * v1; - grad_w_weight -= hh * v1; - atomicAdd(grad_value+ptr1, w1*top_grad_value); - } - scalar_t v2 = 0; - if (h_low >= 0 && w_high <= width - 1) - { - const int ptr2 = h_low_ptr_offset + w_high_ptr_offset + base_ptr; - v2 = bottom_data[ptr2]; - grad_h_weight -= lw * v2; - grad_w_weight += hh * v2; - atomicAdd(grad_value+ptr2, w2*top_grad_value); - } - scalar_t v3 = 0; - if (h_high <= height - 1 && w_low >= 0) - { - const int ptr3 = h_high_ptr_offset + w_low_ptr_offset + base_ptr; - v3 = bottom_data[ptr3]; - grad_h_weight += hw * v3; - grad_w_weight -= lh * v3; - atomicAdd(grad_value+ptr3, w3*top_grad_value); - } - scalar_t v4 = 0; - if (h_high <= height - 1 && w_high <= width - 1) - { - const int ptr4 = h_high_ptr_offset + w_high_ptr_offset + base_ptr; - v4 = bottom_data[ptr4]; - grad_h_weight += lw * v4; - grad_w_weight += lh * v4; - atomicAdd(grad_value+ptr4, w4*top_grad_value); - } - - const scalar_t val = (w1 * v1 + w2 * v2 + w3 * v3 + w4 * v4); - atomicAdd(grad_attn_weight, top_grad * val); - atomicAdd(grad_sampling_loc, width * grad_w_weight * top_grad_value); - atomicAdd(grad_sampling_loc + 1, height * grad_h_weight * top_grad_value); -} - - -template -__global__ void ms_deformable_im2col_gpu_kernel(const int n, - const scalar_t *data_value, - const int64_t *data_spatial_shapes, - const int64_t *data_level_start_index, - const scalar_t *data_sampling_loc, - const scalar_t *data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t *data_col) -{ - CUDA_KERNEL_LOOP(index, n) - { - int _temp = index; - const int c_col = _temp % channels; - _temp /= channels; - const int sampling_index = _temp; - const int m_col = _temp % num_heads; - _temp /= num_heads; - const int q_col = _temp % num_query; - _temp /= num_query; - const int b_col = _temp; - - scalar_t *data_col_ptr = data_col + index; - int data_weight_ptr = sampling_index * num_levels * num_point; - int data_loc_w_ptr = data_weight_ptr << 1; - const int qid_stride = num_heads * channels; - const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; - scalar_t col = 0; - - for (int l_col=0; l_col < num_levels; ++l_col) - { - const int level_start_id = data_level_start_index[l_col]; - const int spatial_h_ptr = l_col << 1; - const int spatial_h = data_spatial_shapes[spatial_h_ptr]; - const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; - const scalar_t *data_value_ptr = data_value + (data_value_ptr_init_offset + level_start_id * qid_stride); - for (int p_col=0; p_col < num_point; ++p_col) - { - const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; - const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; - const scalar_t weight = data_attn_weight[data_weight_ptr]; - - const scalar_t h_im = loc_h * spatial_h - 0.5; - const scalar_t w_im = loc_w * spatial_w - 0.5; - - if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) - { - col += ms_deform_attn_im2col_bilinear(data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, w_im, m_col, c_col) * weight; - } - - data_weight_ptr += 1; - data_loc_w_ptr += 2; - } - } - *data_col_ptr = col; - } -} - -template -__global__ void ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v1(const int n, - const scalar_t *grad_col, - const scalar_t *data_value, - const int64_t *data_spatial_shapes, - const int64_t *data_level_start_index, - const scalar_t *data_sampling_loc, - const scalar_t *data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t *grad_value, - scalar_t *grad_sampling_loc, - scalar_t *grad_attn_weight) -{ - CUDA_KERNEL_LOOP(index, n) - { - __shared__ scalar_t cache_grad_sampling_loc[blockSize * 2]; - __shared__ scalar_t cache_grad_attn_weight[blockSize]; - unsigned int tid = threadIdx.x; - int _temp = index; - const int c_col = _temp % channels; - _temp /= channels; - const int sampling_index = _temp; - const int m_col = _temp % num_heads; - _temp /= num_heads; - const int q_col = _temp % num_query; - _temp /= num_query; - const int b_col = _temp; - - const scalar_t top_grad = grad_col[index]; - - int data_weight_ptr = sampling_index * num_levels * num_point; - int data_loc_w_ptr = data_weight_ptr << 1; - const int grad_sampling_ptr = data_weight_ptr; - grad_sampling_loc += grad_sampling_ptr << 1; - grad_attn_weight += grad_sampling_ptr; - const int grad_weight_stride = 1; - const int grad_loc_stride = 2; - const int qid_stride = num_heads * channels; - const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; - - for (int l_col=0; l_col < num_levels; ++l_col) - { - const int level_start_id = data_level_start_index[l_col]; - const int spatial_h_ptr = l_col << 1; - const int spatial_h = data_spatial_shapes[spatial_h_ptr]; - const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; - const int value_ptr_offset = data_value_ptr_init_offset + level_start_id * qid_stride; - const scalar_t *data_value_ptr = data_value + value_ptr_offset; - scalar_t *grad_value_ptr = grad_value + value_ptr_offset; - - for (int p_col=0; p_col < num_point; ++p_col) - { - const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; - const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; - const scalar_t weight = data_attn_weight[data_weight_ptr]; - - const scalar_t h_im = loc_h * spatial_h - 0.5; - const scalar_t w_im = loc_w * spatial_w - 0.5; - *(cache_grad_sampling_loc+(threadIdx.x << 1)) = 0; - *(cache_grad_sampling_loc+((threadIdx.x << 1) + 1)) = 0; - *(cache_grad_attn_weight+threadIdx.x)=0; - if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) - { - ms_deform_attn_col2im_bilinear( - data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, w_im, m_col, c_col, - top_grad, weight, grad_value_ptr, - cache_grad_sampling_loc+(threadIdx.x << 1), cache_grad_attn_weight+threadIdx.x); - } - - __syncthreads(); - if (tid == 0) - { - scalar_t _grad_w=cache_grad_sampling_loc[0], _grad_h=cache_grad_sampling_loc[1], _grad_a=cache_grad_attn_weight[0]; - int sid=2; - for (unsigned int tid = 1; tid < blockSize; ++tid) - { - _grad_w += cache_grad_sampling_loc[sid]; - _grad_h += cache_grad_sampling_loc[sid + 1]; - _grad_a += cache_grad_attn_weight[tid]; - sid += 2; - } - - - *grad_sampling_loc = _grad_w; - *(grad_sampling_loc + 1) = _grad_h; - *grad_attn_weight = _grad_a; - } - __syncthreads(); - - data_weight_ptr += 1; - data_loc_w_ptr += 2; - grad_attn_weight += grad_weight_stride; - grad_sampling_loc += grad_loc_stride; - } - } - } -} - - -template -__global__ void ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v2(const int n, - const scalar_t *grad_col, - const scalar_t *data_value, - const int64_t *data_spatial_shapes, - const int64_t *data_level_start_index, - const scalar_t *data_sampling_loc, - const scalar_t *data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t *grad_value, - scalar_t *grad_sampling_loc, - scalar_t *grad_attn_weight) -{ - CUDA_KERNEL_LOOP(index, n) - { - __shared__ scalar_t cache_grad_sampling_loc[blockSize * 2]; - __shared__ scalar_t cache_grad_attn_weight[blockSize]; - unsigned int tid = threadIdx.x; - int _temp = index; - const int c_col = _temp % channels; - _temp /= channels; - const int sampling_index = _temp; - const int m_col = _temp % num_heads; - _temp /= num_heads; - const int q_col = _temp % num_query; - _temp /= num_query; - const int b_col = _temp; - - const scalar_t top_grad = grad_col[index]; - - int data_weight_ptr = sampling_index * num_levels * num_point; - int data_loc_w_ptr = data_weight_ptr << 1; - const int grad_sampling_ptr = data_weight_ptr; - grad_sampling_loc += grad_sampling_ptr << 1; - grad_attn_weight += grad_sampling_ptr; - const int grad_weight_stride = 1; - const int grad_loc_stride = 2; - const int qid_stride = num_heads * channels; - const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; - - for (int l_col=0; l_col < num_levels; ++l_col) - { - const int level_start_id = data_level_start_index[l_col]; - const int spatial_h_ptr = l_col << 1; - const int spatial_h = data_spatial_shapes[spatial_h_ptr]; - const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; - const int value_ptr_offset = data_value_ptr_init_offset + level_start_id * qid_stride; - const scalar_t *data_value_ptr = data_value + value_ptr_offset; - scalar_t *grad_value_ptr = grad_value + value_ptr_offset; - - for (int p_col=0; p_col < num_point; ++p_col) - { - const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; - const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; - const scalar_t weight = data_attn_weight[data_weight_ptr]; - - const scalar_t h_im = loc_h * spatial_h - 0.5; - const scalar_t w_im = loc_w * spatial_w - 0.5; - *(cache_grad_sampling_loc+(threadIdx.x << 1)) = 0; - *(cache_grad_sampling_loc+((threadIdx.x << 1) + 1)) = 0; - *(cache_grad_attn_weight+threadIdx.x)=0; - if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) - { - ms_deform_attn_col2im_bilinear( - data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, w_im, m_col, c_col, - top_grad, weight, grad_value_ptr, - cache_grad_sampling_loc+(threadIdx.x << 1), cache_grad_attn_weight+threadIdx.x); - } - - __syncthreads(); - - for (unsigned int s=blockSize/2; s>0; s>>=1) - { - if (tid < s) { - const unsigned int xid1 = tid << 1; - const unsigned int xid2 = (tid + s) << 1; - cache_grad_attn_weight[tid] += cache_grad_attn_weight[tid + s]; - cache_grad_sampling_loc[xid1] += cache_grad_sampling_loc[xid2]; - cache_grad_sampling_loc[xid1 + 1] += cache_grad_sampling_loc[xid2 + 1]; - } - __syncthreads(); - } - - if (tid == 0) - { - *grad_sampling_loc = cache_grad_sampling_loc[0]; - *(grad_sampling_loc + 1) = cache_grad_sampling_loc[1]; - *grad_attn_weight = cache_grad_attn_weight[0]; - } - __syncthreads(); - - data_weight_ptr += 1; - data_loc_w_ptr += 2; - grad_attn_weight += grad_weight_stride; - grad_sampling_loc += grad_loc_stride; - } - } - } -} - - -template -__global__ void ms_deformable_col2im_gpu_kernel_shm_reduce_v1(const int n, - const scalar_t *grad_col, - const scalar_t *data_value, - const int64_t *data_spatial_shapes, - const int64_t *data_level_start_index, - const scalar_t *data_sampling_loc, - const scalar_t *data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t *grad_value, - scalar_t *grad_sampling_loc, - scalar_t *grad_attn_weight) -{ - CUDA_KERNEL_LOOP(index, n) - { - extern __shared__ int _s[]; - scalar_t* cache_grad_sampling_loc = (scalar_t*)_s; - scalar_t* cache_grad_attn_weight = cache_grad_sampling_loc + 2 * blockDim.x; - unsigned int tid = threadIdx.x; - int _temp = index; - const int c_col = _temp % channels; - _temp /= channels; - const int sampling_index = _temp; - const int m_col = _temp % num_heads; - _temp /= num_heads; - const int q_col = _temp % num_query; - _temp /= num_query; - const int b_col = _temp; - - const scalar_t top_grad = grad_col[index]; - - int data_weight_ptr = sampling_index * num_levels * num_point; - int data_loc_w_ptr = data_weight_ptr << 1; - const int grad_sampling_ptr = data_weight_ptr; - grad_sampling_loc += grad_sampling_ptr << 1; - grad_attn_weight += grad_sampling_ptr; - const int grad_weight_stride = 1; - const int grad_loc_stride = 2; - const int qid_stride = num_heads * channels; - const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; - - for (int l_col=0; l_col < num_levels; ++l_col) - { - const int level_start_id = data_level_start_index[l_col]; - const int spatial_h_ptr = l_col << 1; - const int spatial_h = data_spatial_shapes[spatial_h_ptr]; - const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; - const int value_ptr_offset = data_value_ptr_init_offset + level_start_id * qid_stride; - const scalar_t *data_value_ptr = data_value + value_ptr_offset; - scalar_t *grad_value_ptr = grad_value + value_ptr_offset; - - for (int p_col=0; p_col < num_point; ++p_col) - { - const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; - const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; - const scalar_t weight = data_attn_weight[data_weight_ptr]; - - const scalar_t h_im = loc_h * spatial_h - 0.5; - const scalar_t w_im = loc_w * spatial_w - 0.5; - *(cache_grad_sampling_loc+(threadIdx.x << 1)) = 0; - *(cache_grad_sampling_loc+((threadIdx.x << 1) + 1)) = 0; - *(cache_grad_attn_weight+threadIdx.x)=0; - if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) - { - ms_deform_attn_col2im_bilinear( - data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, w_im, m_col, c_col, - top_grad, weight, grad_value_ptr, - cache_grad_sampling_loc+(threadIdx.x << 1), cache_grad_attn_weight+threadIdx.x); - } - - __syncthreads(); - if (tid == 0) - { - scalar_t _grad_w=cache_grad_sampling_loc[0], _grad_h=cache_grad_sampling_loc[1], _grad_a=cache_grad_attn_weight[0]; - int sid=2; - for (unsigned int tid = 1; tid < blockDim.x; ++tid) - { - _grad_w += cache_grad_sampling_loc[sid]; - _grad_h += cache_grad_sampling_loc[sid + 1]; - _grad_a += cache_grad_attn_weight[tid]; - sid += 2; - } - - - *grad_sampling_loc = _grad_w; - *(grad_sampling_loc + 1) = _grad_h; - *grad_attn_weight = _grad_a; - } - __syncthreads(); - - data_weight_ptr += 1; - data_loc_w_ptr += 2; - grad_attn_weight += grad_weight_stride; - grad_sampling_loc += grad_loc_stride; - } - } - } -} - -template -__global__ void ms_deformable_col2im_gpu_kernel_shm_reduce_v2(const int n, - const scalar_t *grad_col, - const scalar_t *data_value, - const int64_t *data_spatial_shapes, - const int64_t *data_level_start_index, - const scalar_t *data_sampling_loc, - const scalar_t *data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t *grad_value, - scalar_t *grad_sampling_loc, - scalar_t *grad_attn_weight) -{ - CUDA_KERNEL_LOOP(index, n) - { - extern __shared__ int _s[]; - scalar_t* cache_grad_sampling_loc = (scalar_t*)_s; - scalar_t* cache_grad_attn_weight = cache_grad_sampling_loc + 2 * blockDim.x; - unsigned int tid = threadIdx.x; - int _temp = index; - const int c_col = _temp % channels; - _temp /= channels; - const int sampling_index = _temp; - const int m_col = _temp % num_heads; - _temp /= num_heads; - const int q_col = _temp % num_query; - _temp /= num_query; - const int b_col = _temp; - - const scalar_t top_grad = grad_col[index]; - - int data_weight_ptr = sampling_index * num_levels * num_point; - int data_loc_w_ptr = data_weight_ptr << 1; - const int grad_sampling_ptr = data_weight_ptr; - grad_sampling_loc += grad_sampling_ptr << 1; - grad_attn_weight += grad_sampling_ptr; - const int grad_weight_stride = 1; - const int grad_loc_stride = 2; - const int qid_stride = num_heads * channels; - const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; - - for (int l_col=0; l_col < num_levels; ++l_col) - { - const int level_start_id = data_level_start_index[l_col]; - const int spatial_h_ptr = l_col << 1; - const int spatial_h = data_spatial_shapes[spatial_h_ptr]; - const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; - const int value_ptr_offset = data_value_ptr_init_offset + level_start_id * qid_stride; - const scalar_t *data_value_ptr = data_value + value_ptr_offset; - scalar_t *grad_value_ptr = grad_value + value_ptr_offset; - - for (int p_col=0; p_col < num_point; ++p_col) - { - const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; - const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; - const scalar_t weight = data_attn_weight[data_weight_ptr]; - - const scalar_t h_im = loc_h * spatial_h - 0.5; - const scalar_t w_im = loc_w * spatial_w - 0.5; - *(cache_grad_sampling_loc+(threadIdx.x << 1)) = 0; - *(cache_grad_sampling_loc+((threadIdx.x << 1) + 1)) = 0; - *(cache_grad_attn_weight+threadIdx.x)=0; - if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) - { - ms_deform_attn_col2im_bilinear( - data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, w_im, m_col, c_col, - top_grad, weight, grad_value_ptr, - cache_grad_sampling_loc+(threadIdx.x << 1), cache_grad_attn_weight+threadIdx.x); - } - - __syncthreads(); - - for (unsigned int s=blockDim.x/2, spre=blockDim.x; s>0; s>>=1, spre>>=1) - { - if (tid < s) { - const unsigned int xid1 = tid << 1; - const unsigned int xid2 = (tid + s) << 1; - cache_grad_attn_weight[tid] += cache_grad_attn_weight[tid + s]; - cache_grad_sampling_loc[xid1] += cache_grad_sampling_loc[xid2]; - cache_grad_sampling_loc[xid1 + 1] += cache_grad_sampling_loc[xid2 + 1]; - if (tid + (s << 1) < spre) - { - cache_grad_attn_weight[tid] += cache_grad_attn_weight[tid + (s << 1)]; - cache_grad_sampling_loc[xid1] += cache_grad_sampling_loc[xid2 + (s << 1)]; - cache_grad_sampling_loc[xid1 + 1] += cache_grad_sampling_loc[xid2 + 1 + (s << 1)]; - } - } - __syncthreads(); - } - - if (tid == 0) - { - *grad_sampling_loc = cache_grad_sampling_loc[0]; - *(grad_sampling_loc + 1) = cache_grad_sampling_loc[1]; - *grad_attn_weight = cache_grad_attn_weight[0]; - } - __syncthreads(); - - data_weight_ptr += 1; - data_loc_w_ptr += 2; - grad_attn_weight += grad_weight_stride; - grad_sampling_loc += grad_loc_stride; - } - } - } -} - -template -__global__ void ms_deformable_col2im_gpu_kernel_shm_reduce_v2_multi_blocks(const int n, - const scalar_t *grad_col, - const scalar_t *data_value, - const int64_t *data_spatial_shapes, - const int64_t *data_level_start_index, - const scalar_t *data_sampling_loc, - const scalar_t *data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t *grad_value, - scalar_t *grad_sampling_loc, - scalar_t *grad_attn_weight) -{ - CUDA_KERNEL_LOOP(index, n) - { - extern __shared__ int _s[]; - scalar_t* cache_grad_sampling_loc = (scalar_t*)_s; - scalar_t* cache_grad_attn_weight = cache_grad_sampling_loc + 2 * blockDim.x; - unsigned int tid = threadIdx.x; - int _temp = index; - const int c_col = _temp % channels; - _temp /= channels; - const int sampling_index = _temp; - const int m_col = _temp % num_heads; - _temp /= num_heads; - const int q_col = _temp % num_query; - _temp /= num_query; - const int b_col = _temp; - - const scalar_t top_grad = grad_col[index]; - - int data_weight_ptr = sampling_index * num_levels * num_point; - int data_loc_w_ptr = data_weight_ptr << 1; - const int grad_sampling_ptr = data_weight_ptr; - grad_sampling_loc += grad_sampling_ptr << 1; - grad_attn_weight += grad_sampling_ptr; - const int grad_weight_stride = 1; - const int grad_loc_stride = 2; - const int qid_stride = num_heads * channels; - const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; - - for (int l_col=0; l_col < num_levels; ++l_col) - { - const int level_start_id = data_level_start_index[l_col]; - const int spatial_h_ptr = l_col << 1; - const int spatial_h = data_spatial_shapes[spatial_h_ptr]; - const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; - const int value_ptr_offset = data_value_ptr_init_offset + level_start_id * qid_stride; - const scalar_t *data_value_ptr = data_value + value_ptr_offset; - scalar_t *grad_value_ptr = grad_value + value_ptr_offset; - - for (int p_col=0; p_col < num_point; ++p_col) - { - const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; - const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; - const scalar_t weight = data_attn_weight[data_weight_ptr]; - - const scalar_t h_im = loc_h * spatial_h - 0.5; - const scalar_t w_im = loc_w * spatial_w - 0.5; - *(cache_grad_sampling_loc+(threadIdx.x << 1)) = 0; - *(cache_grad_sampling_loc+((threadIdx.x << 1) + 1)) = 0; - *(cache_grad_attn_weight+threadIdx.x)=0; - if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) - { - ms_deform_attn_col2im_bilinear( - data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, w_im, m_col, c_col, - top_grad, weight, grad_value_ptr, - cache_grad_sampling_loc+(threadIdx.x << 1), cache_grad_attn_weight+threadIdx.x); - } - - __syncthreads(); - - for (unsigned int s=blockDim.x/2, spre=blockDim.x; s>0; s>>=1, spre>>=1) - { - if (tid < s) { - const unsigned int xid1 = tid << 1; - const unsigned int xid2 = (tid + s) << 1; - cache_grad_attn_weight[tid] += cache_grad_attn_weight[tid + s]; - cache_grad_sampling_loc[xid1] += cache_grad_sampling_loc[xid2]; - cache_grad_sampling_loc[xid1 + 1] += cache_grad_sampling_loc[xid2 + 1]; - if (tid + (s << 1) < spre) - { - cache_grad_attn_weight[tid] += cache_grad_attn_weight[tid + (s << 1)]; - cache_grad_sampling_loc[xid1] += cache_grad_sampling_loc[xid2 + (s << 1)]; - cache_grad_sampling_loc[xid1 + 1] += cache_grad_sampling_loc[xid2 + 1 + (s << 1)]; - } - } - __syncthreads(); - } - - if (tid == 0) - { - atomicAdd(grad_sampling_loc, cache_grad_sampling_loc[0]); - atomicAdd(grad_sampling_loc + 1, cache_grad_sampling_loc[1]); - atomicAdd(grad_attn_weight, cache_grad_attn_weight[0]); - } - __syncthreads(); - - data_weight_ptr += 1; - data_loc_w_ptr += 2; - grad_attn_weight += grad_weight_stride; - grad_sampling_loc += grad_loc_stride; - } - } - } -} - - -template -__global__ void ms_deformable_col2im_gpu_kernel_gm(const int n, - const scalar_t *grad_col, - const scalar_t *data_value, - const int64_t *data_spatial_shapes, - const int64_t *data_level_start_index, - const scalar_t *data_sampling_loc, - const scalar_t *data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t *grad_value, - scalar_t *grad_sampling_loc, - scalar_t *grad_attn_weight) -{ - CUDA_KERNEL_LOOP(index, n) - { - int _temp = index; - const int c_col = _temp % channels; - _temp /= channels; - const int sampling_index = _temp; - const int m_col = _temp % num_heads; - _temp /= num_heads; - const int q_col = _temp % num_query; - _temp /= num_query; - const int b_col = _temp; - - const scalar_t top_grad = grad_col[index]; - - int data_weight_ptr = sampling_index * num_levels * num_point; - int data_loc_w_ptr = data_weight_ptr << 1; - const int grad_sampling_ptr = data_weight_ptr; - grad_sampling_loc += grad_sampling_ptr << 1; - grad_attn_weight += grad_sampling_ptr; - const int grad_weight_stride = 1; - const int grad_loc_stride = 2; - const int qid_stride = num_heads * channels; - const int data_value_ptr_init_offset = b_col * spatial_size * qid_stride; - - for (int l_col=0; l_col < num_levels; ++l_col) - { - const int level_start_id = data_level_start_index[l_col]; - const int spatial_h_ptr = l_col << 1; - const int spatial_h = data_spatial_shapes[spatial_h_ptr]; - const int spatial_w = data_spatial_shapes[spatial_h_ptr + 1]; - const int value_ptr_offset = data_value_ptr_init_offset + level_start_id * qid_stride; - const scalar_t *data_value_ptr = data_value + value_ptr_offset; - scalar_t *grad_value_ptr = grad_value + value_ptr_offset; - - for (int p_col=0; p_col < num_point; ++p_col) - { - const scalar_t loc_w = data_sampling_loc[data_loc_w_ptr]; - const scalar_t loc_h = data_sampling_loc[data_loc_w_ptr + 1]; - const scalar_t weight = data_attn_weight[data_weight_ptr]; - - const scalar_t h_im = loc_h * spatial_h - 0.5; - const scalar_t w_im = loc_w * spatial_w - 0.5; - if (h_im > -1 && w_im > -1 && h_im < spatial_h && w_im < spatial_w) - { - ms_deform_attn_col2im_bilinear_gm( - data_value_ptr, spatial_h, spatial_w, num_heads, channels, h_im, w_im, m_col, c_col, - top_grad, weight, grad_value_ptr, - grad_sampling_loc, grad_attn_weight); - } - data_weight_ptr += 1; - data_loc_w_ptr += 2; - grad_attn_weight += grad_weight_stride; - grad_sampling_loc += grad_loc_stride; - } - } - } -} - - -template -void ms_deformable_im2col_cuda(cudaStream_t stream, - const scalar_t* data_value, - const int64_t* data_spatial_shapes, - const int64_t* data_level_start_index, - const scalar_t* data_sampling_loc, - const scalar_t* data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t* data_col) -{ - const int num_kernels = batch_size * num_query * num_heads * channels; - const int num_actual_kernels = batch_size * num_query * num_heads * channels; - const int num_threads = CUDA_NUM_THREADS; - ms_deformable_im2col_gpu_kernel - <<>>( - num_kernels, data_value, data_spatial_shapes, data_level_start_index, data_sampling_loc, data_attn_weight, - batch_size, spatial_size, num_heads, channels, num_levels, num_query, num_point, data_col); - - cudaError_t err = cudaGetLastError(); - if (err != cudaSuccess) - { - printf("error in ms_deformable_im2col_cuda: %s\n", cudaGetErrorString(err)); - } - -} - -template -void ms_deformable_col2im_cuda(cudaStream_t stream, - const scalar_t* grad_col, - const scalar_t* data_value, - const int64_t * data_spatial_shapes, - const int64_t * data_level_start_index, - const scalar_t * data_sampling_loc, - const scalar_t * data_attn_weight, - const int batch_size, - const int spatial_size, - const int num_heads, - const int channels, - const int num_levels, - const int num_query, - const int num_point, - scalar_t* grad_value, - scalar_t* grad_sampling_loc, - scalar_t* grad_attn_weight) -{ - const int num_threads = (channels > CUDA_NUM_THREADS)?CUDA_NUM_THREADS:channels; - const int num_kernels = batch_size * num_query * num_heads * channels; - const int num_actual_kernels = batch_size * num_query * num_heads * channels; - if (channels > 1024) - { - if ((channels & 1023) == 0) - { - ms_deformable_col2im_gpu_kernel_shm_reduce_v2_multi_blocks - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - } - else - { - ms_deformable_col2im_gpu_kernel_gm - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - } - } - else{ - switch(channels) - { - case 1: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v1 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 2: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v1 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 4: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v1 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 8: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v1 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 16: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v1 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 32: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v1 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 64: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v2 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 128: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v2 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 256: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v2 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 512: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v2 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - case 1024: - ms_deformable_col2im_gpu_kernel_shm_blocksize_aware_reduce_v2 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - break; - default: - if (channels < 64) - { - ms_deformable_col2im_gpu_kernel_shm_reduce_v1 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - } - else - { - ms_deformable_col2im_gpu_kernel_shm_reduce_v2 - <<>>( - num_kernels, - grad_col, - data_value, - data_spatial_shapes, - data_level_start_index, - data_sampling_loc, - data_attn_weight, - batch_size, - spatial_size, - num_heads, - channels, - num_levels, - num_query, - num_point, - grad_value, - grad_sampling_loc, - grad_attn_weight); - } - } - } - cudaError_t err = cudaGetLastError(); - if (err != cudaSuccess) - { - printf("error in ms_deformable_col2im_cuda: %s\n", cudaGetErrorString(err)); - } - -} \ No newline at end of file diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/ms_deform_attn.h b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/ms_deform_attn.h deleted file mode 100644 index ac0ef2ec25..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/ms_deform_attn.h +++ /dev/null @@ -1,62 +0,0 @@ -/*! -************************************************************************************************** -* Deformable DETR -* Copyright (c) 2020 SenseTime. All Rights Reserved. -* Licensed under the Apache License, Version 2.0 [see LICENSE for details] -************************************************************************************************** -* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -************************************************************************************************** -*/ - -#pragma once - -#include "cpu/ms_deform_attn_cpu.h" - -#ifdef WITH_CUDA -#include "cuda/ms_deform_attn_cuda.h" -#endif - - -at::Tensor -ms_deform_attn_forward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const int im2col_step) -{ - if (value.type().is_cuda()) - { -#ifdef WITH_CUDA - return ms_deform_attn_cuda_forward( - value, spatial_shapes, level_start_index, sampling_loc, attn_weight, im2col_step); -#else - AT_ERROR("Not compiled with GPU support"); -#endif - } - AT_ERROR("Not implemented on the CPU"); -} - -std::vector -ms_deform_attn_backward( - const at::Tensor &value, - const at::Tensor &spatial_shapes, - const at::Tensor &level_start_index, - const at::Tensor &sampling_loc, - const at::Tensor &attn_weight, - const at::Tensor &grad_output, - const int im2col_step) -{ - if (value.type().is_cuda()) - { -#ifdef WITH_CUDA - return ms_deform_attn_cuda_backward( - value, spatial_shapes, level_start_index, sampling_loc, attn_weight, grad_output, im2col_step); -#else - AT_ERROR("Not compiled with GPU support"); -#endif - } - AT_ERROR("Not implemented on the CPU"); -} - diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/vision.cpp b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/vision.cpp deleted file mode 100644 index 2201f63a51..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/src/vision.cpp +++ /dev/null @@ -1,16 +0,0 @@ -/*! -************************************************************************************************** -* Deformable DETR -* Copyright (c) 2020 SenseTime. All Rights Reserved. -* Licensed under the Apache License, Version 2.0 [see LICENSE for details] -************************************************************************************************** -* Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -************************************************************************************************** -*/ - -#include "ms_deform_attn.h" - -PYBIND11_MODULE(TORCH_EXTENSION_NAME, m) { - m.def("ms_deform_attn_forward", &ms_deform_attn_forward, "ms_deform_attn_forward"); - m.def("ms_deform_attn_backward", &ms_deform_attn_backward, "ms_deform_attn_backward"); -} diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/test.py b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/test.py deleted file mode 100644 index 720d6473b2..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/test.py +++ /dev/null @@ -1,121 +0,0 @@ -# ------------------------------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------------------------------ -# Modified from https://github.com/chengdazhi/Deformable-Convolution-V2-PyTorch/tree/pytorch_1.0.0 -# ------------------------------------------------------------------------------------------------ - - -from functions.ms_deform_attn_func import MSDeformAttnFunction, ms_deform_attn_core_pytorch -import torch -from torch.autograd import gradcheck - -N, M, D = 1, 2, 2 -Lq, L, P = 2, 2, 2 -shapes = torch.as_tensor([(6, 4), (3, 2)], dtype=torch.long).cuda() -level_start_index = torch.cat((shapes.new_zeros((1,)), shapes.prod(1).cumsum(0)[:-1])) -S = sum([(H * W).item() for H, W in shapes]) - - -torch.manual_seed(3) - - -@torch.no_grad() -def check_forward_equal_with_pytorch_double() -> None: - value = torch.rand(N, S, M, D).cuda() * 0.01 - sampling_locations = torch.rand(N, Lq, M, L, P, 2).cuda() - attention_weights = torch.rand(N, Lq, M, L, P).cuda() + 1e-5 - attention_weights /= attention_weights.sum(-1, keepdim=True).sum(-2, keepdim=True) - im2col_step = 2 - output_pytorch = ( - ms_deform_attn_core_pytorch( - value.double(), shapes, sampling_locations.double(), attention_weights.double() - ) - .detach() - .cpu() - ) - output_cuda = ( - MSDeformAttnFunction.apply( - value.double(), - shapes, - level_start_index, - sampling_locations.double(), - attention_weights.double(), - im2col_step, - ) - .detach() - .cpu() - ) - fwdok = torch.allclose(output_cuda, output_pytorch) - max_abs_err = (output_cuda - output_pytorch).abs().max() - max_rel_err = ((output_cuda - output_pytorch).abs() / output_pytorch.abs()).max() - - print( - f"* {fwdok} check_forward_equal_with_pytorch_double: max_abs_err {max_abs_err:.2e} max_rel_err {max_rel_err:.2e}" - ) - - -@torch.no_grad() -def check_forward_equal_with_pytorch_float() -> None: - value = torch.rand(N, S, M, D).cuda() * 0.01 - sampling_locations = torch.rand(N, Lq, M, L, P, 2).cuda() - attention_weights = torch.rand(N, Lq, M, L, P).cuda() + 1e-5 - attention_weights /= attention_weights.sum(-1, keepdim=True).sum(-2, keepdim=True) - im2col_step = 2 - output_pytorch = ( - ms_deform_attn_core_pytorch(value, shapes, sampling_locations, attention_weights) - .detach() - .cpu() - ) - output_cuda = ( - MSDeformAttnFunction.apply( - value, shapes, level_start_index, sampling_locations, attention_weights, im2col_step - ) - .detach() - .cpu() - ) - fwdok = torch.allclose(output_cuda, output_pytorch, rtol=1e-2, atol=1e-3) - max_abs_err = (output_cuda - output_pytorch).abs().max() - max_rel_err = ((output_cuda - output_pytorch).abs() / output_pytorch.abs()).max() - - print( - f"* {fwdok} check_forward_equal_with_pytorch_float: max_abs_err {max_abs_err:.2e} max_rel_err {max_rel_err:.2e}" - ) - - -def check_gradient_numerical( - channels: int=4, grad_value: bool=True, grad_sampling_loc: bool=True, grad_attn_weight: bool=True -) -> None: - value = torch.rand(N, S, M, channels).cuda() * 0.01 - sampling_locations = torch.rand(N, Lq, M, L, P, 2).cuda() - attention_weights = torch.rand(N, Lq, M, L, P).cuda() + 1e-5 - attention_weights /= attention_weights.sum(-1, keepdim=True).sum(-2, keepdim=True) - im2col_step = 2 - func = MSDeformAttnFunction.apply - - value.requires_grad = grad_value - sampling_locations.requires_grad = grad_sampling_loc - attention_weights.requires_grad = grad_attn_weight - - gradok = gradcheck( - func, - ( - value.double(), - shapes, - level_start_index, - sampling_locations.double(), - attention_weights.double(), - im2col_step, - ), - ) - - print(f"* {gradok} check_gradient_numerical(D={channels})") - - -if __name__ == "__main__": - check_forward_equal_with_pytorch_double() - check_forward_equal_with_pytorch_float() - - for channels in [30, 32, 64, 71, 1025, 2048, 3096]: - check_gradient_numerical(channels, True, True, True) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/position_encoding.py b/dimos/models/Detic/third_party/Deformable-DETR/models/position_encoding.py deleted file mode 100644 index 2ce5038e5e..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/position_encoding.py +++ /dev/null @@ -1,112 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Various positional encodings for the transformer. -""" - -import math - -import torch -from torch import nn -from util.misc import NestedTensor - - -class PositionEmbeddingSine(nn.Module): - """ - This is a more standard version of the position embedding, very similar to the one - used by the Attention is all you need paper, generalized to work on images. - """ - - def __init__(self, num_pos_feats: int=64, temperature: int=10000, normalize: bool=False, scale=None) -> None: - super().__init__() - self.num_pos_feats = num_pos_feats - self.temperature = temperature - self.normalize = normalize - if scale is not None and normalize is False: - raise ValueError("normalize should be True if scale is passed") - if scale is None: - scale = 2 * math.pi - self.scale = scale - - def forward(self, tensor_list: NestedTensor): - x = tensor_list.tensors - mask = tensor_list.mask - assert mask is not None - not_mask = ~mask - y_embed = not_mask.cumsum(1, dtype=torch.float32) - x_embed = not_mask.cumsum(2, dtype=torch.float32) - if self.normalize: - eps = 1e-6 - y_embed = (y_embed - 0.5) / (y_embed[:, -1:, :] + eps) * self.scale - x_embed = (x_embed - 0.5) / (x_embed[:, :, -1:] + eps) * self.scale - - dim_t = torch.arange(self.num_pos_feats, dtype=torch.float32, device=x.device) - dim_t = self.temperature ** (2 * (dim_t // 2) / self.num_pos_feats) - - pos_x = x_embed[:, :, :, None] / dim_t - pos_y = y_embed[:, :, :, None] / dim_t - pos_x = torch.stack( - (pos_x[:, :, :, 0::2].sin(), pos_x[:, :, :, 1::2].cos()), dim=4 - ).flatten(3) - pos_y = torch.stack( - (pos_y[:, :, :, 0::2].sin(), pos_y[:, :, :, 1::2].cos()), dim=4 - ).flatten(3) - pos = torch.cat((pos_y, pos_x), dim=3).permute(0, 3, 1, 2) - return pos - - -class PositionEmbeddingLearned(nn.Module): - """ - Absolute pos embedding, learned. - """ - - def __init__(self, num_pos_feats: int=256) -> None: - super().__init__() - self.row_embed = nn.Embedding(50, num_pos_feats) - self.col_embed = nn.Embedding(50, num_pos_feats) - self.reset_parameters() - - def reset_parameters(self) -> None: - nn.init.uniform_(self.row_embed.weight) - nn.init.uniform_(self.col_embed.weight) - - def forward(self, tensor_list: NestedTensor): - x = tensor_list.tensors - h, w = x.shape[-2:] - i = torch.arange(w, device=x.device) - j = torch.arange(h, device=x.device) - x_emb = self.col_embed(i) - y_emb = self.row_embed(j) - pos = ( - torch.cat( - [ - x_emb.unsqueeze(0).repeat(h, 1, 1), - y_emb.unsqueeze(1).repeat(1, w, 1), - ], - dim=-1, - ) - .permute(2, 0, 1) - .unsqueeze(0) - .repeat(x.shape[0], 1, 1, 1) - ) - return pos - - -def build_position_encoding(args): - N_steps = args.hidden_dim // 2 - if args.position_embedding in ("v2", "sine"): - # TODO find a better way of exposing other arguments - position_embedding = PositionEmbeddingSine(N_steps, normalize=True) - elif args.position_embedding in ("v3", "learned"): - position_embedding = PositionEmbeddingLearned(N_steps) - else: - raise ValueError(f"not supported {args.position_embedding}") - - return position_embedding diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/segmentation.py b/dimos/models/Detic/third_party/Deformable-DETR/models/segmentation.py deleted file mode 100644 index 2450a5c447..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/segmentation.py +++ /dev/null @@ -1,398 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -This file provides the definition of the convolutional heads used to predict masks, as well as the losses -""" - -from collections import defaultdict -import io - -from PIL import Image -import torch -import torch.nn as nn -import torch.nn.functional as F -import util.box_ops as box_ops -from util.misc import NestedTensor, interpolate, nested_tensor_from_tensor_list -from typing import Optional, Sequence - -try: - from panopticapi.utils import id2rgb, rgb2id -except ImportError: - pass - - -class DETRsegm(nn.Module): - def __init__(self, detr, freeze_detr: bool=False) -> None: - super().__init__() - self.detr = detr - - if freeze_detr: - for p in self.parameters(): - p.requires_grad_(False) - - hidden_dim, nheads = detr.transformer.d_model, detr.transformer.nhead - self.bbox_attention = MHAttentionMap(hidden_dim, hidden_dim, nheads, dropout=0) - self.mask_head = MaskHeadSmallConv(hidden_dim + nheads, [1024, 512, 256], hidden_dim) - - def forward(self, samples: NestedTensor): - if not isinstance(samples, NestedTensor): - samples = nested_tensor_from_tensor_list(samples) - features, pos = self.detr.backbone(samples) - - bs = features[-1].tensors.shape[0] - - src, mask = features[-1].decompose() - src_proj = self.detr.input_proj(src) - hs, memory = self.detr.transformer(src_proj, mask, self.detr.query_embed.weight, pos[-1]) - - outputs_class = self.detr.class_embed(hs) - outputs_coord = self.detr.bbox_embed(hs).sigmoid() - out = {"pred_logits": outputs_class[-1], "pred_boxes": outputs_coord[-1]} - if self.detr.aux_loss: - out["aux_outputs"] = [ - {"pred_logits": a, "pred_boxes": b} - for a, b in zip(outputs_class[:-1], outputs_coord[:-1], strict=False) - ] - - # FIXME h_boxes takes the last one computed, keep this in mind - bbox_mask = self.bbox_attention(hs[-1], memory, mask=mask) - - seg_masks = self.mask_head( - src_proj, bbox_mask, [features[2].tensors, features[1].tensors, features[0].tensors] - ) - outputs_seg_masks = seg_masks.view( - bs, self.detr.num_queries, seg_masks.shape[-2], seg_masks.shape[-1] - ) - - out["pred_masks"] = outputs_seg_masks - return out - - -class MaskHeadSmallConv(nn.Module): - """ - Simple convolutional head, using group norm. - Upsampling is done using a FPN approach - """ - - def __init__(self, dim: int, fpn_dims, context_dim) -> None: - super().__init__() - - inter_dims = [ - dim, - context_dim // 2, - context_dim // 4, - context_dim // 8, - context_dim // 16, - context_dim // 64, - ] - self.lay1 = torch.nn.Conv2d(dim, dim, 3, padding=1) - self.gn1 = torch.nn.GroupNorm(8, dim) - self.lay2 = torch.nn.Conv2d(dim, inter_dims[1], 3, padding=1) - self.gn2 = torch.nn.GroupNorm(8, inter_dims[1]) - self.lay3 = torch.nn.Conv2d(inter_dims[1], inter_dims[2], 3, padding=1) - self.gn3 = torch.nn.GroupNorm(8, inter_dims[2]) - self.lay4 = torch.nn.Conv2d(inter_dims[2], inter_dims[3], 3, padding=1) - self.gn4 = torch.nn.GroupNorm(8, inter_dims[3]) - self.lay5 = torch.nn.Conv2d(inter_dims[3], inter_dims[4], 3, padding=1) - self.gn5 = torch.nn.GroupNorm(8, inter_dims[4]) - self.out_lay = torch.nn.Conv2d(inter_dims[4], 1, 3, padding=1) - - self.dim = dim - - self.adapter1 = torch.nn.Conv2d(fpn_dims[0], inter_dims[1], 1) - self.adapter2 = torch.nn.Conv2d(fpn_dims[1], inter_dims[2], 1) - self.adapter3 = torch.nn.Conv2d(fpn_dims[2], inter_dims[3], 1) - - for m in self.modules(): - if isinstance(m, nn.Conv2d): - nn.init.kaiming_uniform_(m.weight, a=1) - nn.init.constant_(m.bias, 0) - - def forward(self, x, bbox_mask, fpns): - def expand(tensor, length: int): - return tensor.unsqueeze(1).repeat(1, int(length), 1, 1, 1).flatten(0, 1) - - x = torch.cat([expand(x, bbox_mask.shape[1]), bbox_mask.flatten(0, 1)], 1) - - x = self.lay1(x) - x = self.gn1(x) - x = F.relu(x) - x = self.lay2(x) - x = self.gn2(x) - x = F.relu(x) - - cur_fpn = self.adapter1(fpns[0]) - if cur_fpn.size(0) != x.size(0): - cur_fpn = expand(cur_fpn, x.size(0) / cur_fpn.size(0)) - x = cur_fpn + F.interpolate(x, size=cur_fpn.shape[-2:], mode="nearest") - x = self.lay3(x) - x = self.gn3(x) - x = F.relu(x) - - cur_fpn = self.adapter2(fpns[1]) - if cur_fpn.size(0) != x.size(0): - cur_fpn = expand(cur_fpn, x.size(0) / cur_fpn.size(0)) - x = cur_fpn + F.interpolate(x, size=cur_fpn.shape[-2:], mode="nearest") - x = self.lay4(x) - x = self.gn4(x) - x = F.relu(x) - - cur_fpn = self.adapter3(fpns[2]) - if cur_fpn.size(0) != x.size(0): - cur_fpn = expand(cur_fpn, x.size(0) / cur_fpn.size(0)) - x = cur_fpn + F.interpolate(x, size=cur_fpn.shape[-2:], mode="nearest") - x = self.lay5(x) - x = self.gn5(x) - x = F.relu(x) - - x = self.out_lay(x) - return x - - -class MHAttentionMap(nn.Module): - """This is a 2D attention module, which only returns the attention softmax (no multiplication by value)""" - - def __init__(self, query_dim, hidden_dim, num_heads: int, dropout: int=0, bias: bool=True) -> None: - super().__init__() - self.num_heads = num_heads - self.hidden_dim = hidden_dim - self.dropout = nn.Dropout(dropout) - - self.q_linear = nn.Linear(query_dim, hidden_dim, bias=bias) - self.k_linear = nn.Linear(query_dim, hidden_dim, bias=bias) - - nn.init.zeros_(self.k_linear.bias) - nn.init.zeros_(self.q_linear.bias) - nn.init.xavier_uniform_(self.k_linear.weight) - nn.init.xavier_uniform_(self.q_linear.weight) - self.normalize_fact = float(hidden_dim / self.num_heads) ** -0.5 - - def forward(self, q, k, mask=None): - q = self.q_linear(q) - k = F.conv2d(k, self.k_linear.weight.unsqueeze(-1).unsqueeze(-1), self.k_linear.bias) - qh = q.view(q.shape[0], q.shape[1], self.num_heads, self.hidden_dim // self.num_heads) - kh = k.view( - k.shape[0], self.num_heads, self.hidden_dim // self.num_heads, k.shape[-2], k.shape[-1] - ) - weights = torch.einsum("bqnc,bnchw->bqnhw", qh * self.normalize_fact, kh) - - if mask is not None: - weights.masked_fill_(mask.unsqueeze(1).unsqueeze(1), float("-inf")) - weights = F.softmax(weights.flatten(2), dim=-1).view_as(weights) - weights = self.dropout(weights) - return weights - - -def dice_loss(inputs, targets, num_boxes: int): - """ - Compute the DICE loss, similar to generalized IOU for masks - Args: - inputs: A float tensor of arbitrary shape. - The predictions for each example. - targets: A float tensor with the same shape as inputs. Stores the binary - classification label for each element in inputs - (0 for the negative class and 1 for the positive class). - """ - inputs = inputs.sigmoid() - inputs = inputs.flatten(1) - numerator = 2 * (inputs * targets).sum(1) - denominator = inputs.sum(-1) + targets.sum(-1) - loss = 1 - (numerator + 1) / (denominator + 1) - return loss.sum() / num_boxes - - -def sigmoid_focal_loss(inputs, targets, num_boxes: int, alpha: float = 0.25, gamma: float = 2): - """ - Loss used in RetinaNet for dense detection: https://arxiv.org/abs/1708.02002. - Args: - inputs: A float tensor of arbitrary shape. - The predictions for each example. - targets: A float tensor with the same shape as inputs. Stores the binary - classification label for each element in inputs - (0 for the negative class and 1 for the positive class). - alpha: (optional) Weighting factor in range (0,1) to balance - positive vs negative examples. Default = -1 (no weighting). - gamma: Exponent of the modulating factor (1 - p_t) to - balance easy vs hard examples. - Returns: - Loss tensor - """ - prob = inputs.sigmoid() - ce_loss = F.binary_cross_entropy_with_logits(inputs, targets, reduction="none") - p_t = prob * targets + (1 - prob) * (1 - targets) - loss = ce_loss * ((1 - p_t) ** gamma) - - if alpha >= 0: - alpha_t = alpha * targets + (1 - alpha) * (1 - targets) - loss = alpha_t * loss - - return loss.mean(1).sum() / num_boxes - - -class PostProcessSegm(nn.Module): - def __init__(self, threshold: float=0.5) -> None: - super().__init__() - self.threshold = threshold - - @torch.no_grad() - def forward(self, results, outputs, orig_target_sizes: Sequence[int], max_target_sizes: Sequence[int]): - assert len(orig_target_sizes) == len(max_target_sizes) - max_h, max_w = max_target_sizes.max(0)[0].tolist() - outputs_masks = outputs["pred_masks"].squeeze(2) - outputs_masks = F.interpolate( - outputs_masks, size=(max_h, max_w), mode="bilinear", align_corners=False - ) - outputs_masks = (outputs_masks.sigmoid() > self.threshold).cpu() - - for i, (cur_mask, t, tt) in enumerate( - zip(outputs_masks, max_target_sizes, orig_target_sizes, strict=False) - ): - img_h, img_w = t[0], t[1] - results[i]["masks"] = cur_mask[:, :img_h, :img_w].unsqueeze(1) - results[i]["masks"] = F.interpolate( - results[i]["masks"].float(), size=tuple(tt.tolist()), mode="nearest" - ).byte() - - return results - - -class PostProcessPanoptic(nn.Module): - """This class converts the output of the model to the final panoptic result, in the format expected by the - coco panoptic API""" - - def __init__(self, is_thing_map: bool, threshold: float=0.85) -> None: - """ - Parameters: - is_thing_map: This is a whose keys are the class ids, and the values a boolean indicating whether - the class is a thing (True) or a stuff (False) class - threshold: confidence threshold: segments with confidence lower than this will be deleted - """ - super().__init__() - self.threshold = threshold - self.is_thing_map = is_thing_map - - def forward(self, outputs, processed_sizes: Sequence[int], target_sizes: Optional[Sequence[int]]=None): - """This function computes the panoptic prediction from the model's predictions. - Parameters: - outputs: This is a dict coming directly from the model. See the model doc for the content. - processed_sizes: This is a list of tuples (or torch tensors) of sizes of the images that were passed to the - model, ie the size after data augmentation but before batching. - target_sizes: This is a list of tuples (or torch tensors) corresponding to the requested final size - of each prediction. If left to None, it will default to the processed_sizes - """ - if target_sizes is None: - target_sizes = processed_sizes - assert len(processed_sizes) == len(target_sizes) - out_logits, raw_masks, raw_boxes = ( - outputs["pred_logits"], - outputs["pred_masks"], - outputs["pred_boxes"], - ) - assert len(out_logits) == len(raw_masks) == len(target_sizes) - preds = [] - - def to_tuple(tup): - if isinstance(tup, tuple): - return tup - return tuple(tup.cpu().tolist()) - - for cur_logits, cur_masks, cur_boxes, size, target_size in zip( - out_logits, raw_masks, raw_boxes, processed_sizes, target_sizes, strict=False - ): - # we filter empty queries and detection below threshold - scores, labels = cur_logits.softmax(-1).max(-1) - keep = labels.ne(outputs["pred_logits"].shape[-1] - 1) & (scores > self.threshold) - cur_scores, cur_classes = cur_logits.softmax(-1).max(-1) - cur_scores = cur_scores[keep] - cur_classes = cur_classes[keep] - cur_masks = cur_masks[keep] - cur_masks = interpolate(cur_masks[None], to_tuple(size), mode="bilinear").squeeze(0) - cur_boxes = box_ops.box_cxcywh_to_xyxy(cur_boxes[keep]) - - h, w = cur_masks.shape[-2:] - assert len(cur_boxes) == len(cur_classes) - - # It may be that we have several predicted masks for the same stuff class. - # In the following, we track the list of masks ids for each stuff class (they are merged later on) - cur_masks = cur_masks.flatten(1) - stuff_equiv_classes = defaultdict(lambda: []) - for k, label in enumerate(cur_classes): - if not self.is_thing_map[label.item()]: - stuff_equiv_classes[label.item()].append(k) - - def get_ids_area(masks, scores, dedup: bool=False): - # This helper function creates the final panoptic segmentation image - # It also returns the area of the masks that appears on the image - - m_id = masks.transpose(0, 1).softmax(-1) - - if m_id.shape[-1] == 0: - # We didn't detect any mask :( - m_id = torch.zeros((h, w), dtype=torch.long, device=m_id.device) - else: - m_id = m_id.argmax(-1).view(h, w) - - if dedup: - # Merge the masks corresponding to the same stuff class - for equiv in stuff_equiv_classes.values(): - if len(equiv) > 1: - for eq_id in equiv: - m_id.masked_fill_(m_id.eq(eq_id), equiv[0]) - - final_h, final_w = to_tuple(target_size) - - seg_img = Image.fromarray(id2rgb(m_id.view(h, w).cpu().numpy())) - seg_img = seg_img.resize(size=(final_w, final_h), resample=Image.NEAREST) - - np_seg_img = ( - torch.ByteTensor(torch.ByteStorage.from_buffer(seg_img.tobytes())) - .view(final_h, final_w, 3) - .numpy() - ) - m_id = torch.from_numpy(rgb2id(np_seg_img)) - - area = [] - for i in range(len(scores)): - area.append(m_id.eq(i).sum().item()) - return area, seg_img - - area, seg_img = get_ids_area(cur_masks, cur_scores, dedup=True) - if cur_classes.numel() > 0: - # We know filter empty masks as long as we find some - while True: - filtered_small = torch.as_tensor( - [area[i] <= 4 for i, c in enumerate(cur_classes)], - dtype=torch.bool, - device=keep.device, - ) - if filtered_small.any().item(): - cur_scores = cur_scores[~filtered_small] - cur_classes = cur_classes[~filtered_small] - cur_masks = cur_masks[~filtered_small] - area, seg_img = get_ids_area(cur_masks, cur_scores) - else: - break - - else: - cur_classes = torch.ones(1, dtype=torch.long, device=cur_classes.device) - - segments_info = [] - for i, a in enumerate(area): - cat = cur_classes[i].item() - segments_info.append( - {"id": i, "isthing": self.is_thing_map[cat], "category_id": cat, "area": a} - ) - del cur_classes - - with io.BytesIO() as out: - seg_img.save(out, format="PNG") - predictions = {"png_string": out.getvalue(), "segments_info": segments_info} - preds.append(predictions) - return preds diff --git a/dimos/models/Detic/third_party/Deformable-DETR/requirements.txt b/dimos/models/Detic/third_party/Deformable-DETR/requirements.txt deleted file mode 100644 index fd846723be..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/requirements.txt +++ /dev/null @@ -1,4 +0,0 @@ -pycocotools -tqdm -cython -scipy diff --git a/dimos/models/Detic/third_party/Deformable-DETR/tools/launch.py b/dimos/models/Detic/third_party/Deformable-DETR/tools/launch.py deleted file mode 100644 index 1d60ae4994..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/tools/launch.py +++ /dev/null @@ -1,204 +0,0 @@ -# -------------------------------------------------------------------------------------------------------------------------- -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# -------------------------------------------------------------------------------------------------------------------------- -# Modified from https://github.com/pytorch/pytorch/blob/173f224570017b4b1a3a1a13d0bff280a54d9cd9/torch/distributed/launch.py -# -------------------------------------------------------------------------------------------------------------------------- - -r""" -`torch.distributed.launch` is a module that spawns up multiple distributed -training processes on each of the training nodes. -The utility can be used for single-node distributed training, in which one or -more processes per node will be spawned. The utility can be used for either -CPU training or GPU training. If the utility is used for GPU training, -each distributed process will be operating on a single GPU. This can achieve -well-improved single-node training performance. It can also be used in -multi-node distributed training, by spawning up multiple processes on each node -for well-improved multi-node distributed training performance as well. -This will especially be benefitial for systems with multiple Infiniband -interfaces that have direct-GPU support, since all of them can be utilized for -aggregated communication bandwidth. -In both cases of single-node distributed training or multi-node distributed -training, this utility will launch the given number of processes per node -(``--nproc_per_node``). If used for GPU training, this number needs to be less -or euqal to the number of GPUs on the current system (``nproc_per_node``), -and each process will be operating on a single GPU from *GPU 0 to -GPU (nproc_per_node - 1)*. -**How to use this module:** -1. Single-Node multi-process distributed training -:: - >>> python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE - YOUR_TRAINING_SCRIPT.py (--arg1 --arg2 --arg3 and all other - arguments of your training script) -2. Multi-Node multi-process distributed training: (e.g. two nodes) -Node 1: *(IP: 192.168.1.1, and has a free port: 1234)* -:: - >>> python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE - --nnodes=2 --node_rank=0 --master_addr="192.168.1.1" - --master_port=1234 YOUR_TRAINING_SCRIPT.py (--arg1 --arg2 --arg3 - and all other arguments of your training script) -Node 2: -:: - >>> python -m torch.distributed.launch --nproc_per_node=NUM_GPUS_YOU_HAVE - --nnodes=2 --node_rank=1 --master_addr="192.168.1.1" - --master_port=1234 YOUR_TRAINING_SCRIPT.py (--arg1 --arg2 --arg3 - and all other arguments of your training script) -3. To look up what optional arguments this module offers: -:: - >>> python -m torch.distributed.launch --help -**Important Notices:** -1. This utilty and multi-process distributed (single-node or -multi-node) GPU training currently only achieves the best performance using -the NCCL distributed backend. Thus NCCL backend is the recommended backend to -use for GPU training. -2. In your training program, you must parse the command-line argument: -``--local_rank=LOCAL_PROCESS_RANK``, which will be provided by this module. -If your training program uses GPUs, you should ensure that your code only -runs on the GPU device of LOCAL_PROCESS_RANK. This can be done by: -Parsing the local_rank argument -:: - >>> import argparse - >>> parser = argparse.ArgumentParser() - >>> parser.add_argument("--local_rank", type=int) - >>> args = parser.parse_args() -Set your device to local rank using either -:: - >>> torch.cuda.set_device(arg.local_rank) # before your code runs -or -:: - >>> with torch.cuda.device(arg.local_rank): - >>> # your code to run -3. In your training program, you are supposed to call the following function -at the beginning to start the distributed backend. You need to make sure that -the init_method uses ``env://``, which is the only supported ``init_method`` -by this module. -:: - torch.distributed.init_process_group(backend='YOUR BACKEND', - init_method='env://') -4. In your training program, you can either use regular distributed functions -or use :func:`torch.nn.parallel.DistributedDataParallel` module. If your -training program uses GPUs for training and you would like to use -:func:`torch.nn.parallel.DistributedDataParallel` module, -here is how to configure it. -:: - model = torch.nn.parallel.DistributedDataParallel(model, - device_ids=[arg.local_rank], - output_device=arg.local_rank) -Please ensure that ``device_ids`` argument is set to be the only GPU device id -that your code will be operating on. This is generally the local rank of the -process. In other words, the ``device_ids`` needs to be ``[args.local_rank]``, -and ``output_device`` needs to be ``args.local_rank`` in order to use this -utility -5. Another way to pass ``local_rank`` to the subprocesses via environment variable -``LOCAL_RANK``. This behavior is enabled when you launch the script with -``--use_env=True``. You must adjust the subprocess example above to replace -``args.local_rank`` with ``os.environ['LOCAL_RANK']``; the launcher -will not pass ``--local_rank`` when you specify this flag. -.. warning:: - ``local_rank`` is NOT globally unique: it is only unique per process - on a machine. Thus, don't use it to decide if you should, e.g., - write to a networked filesystem. See - https://github.com/pytorch/pytorch/issues/12042 for an example of - how things can go wrong if you don't do this correctly. -""" - -from argparse import REMAINDER, ArgumentParser -import os -import subprocess - - -def parse_args(): - """ - Helper function parsing the command line options - @retval ArgumentParser - """ - parser = ArgumentParser( - description="PyTorch distributed training launch " - "helper utilty that will spawn up " - "multiple distributed processes" - ) - - # Optional arguments for the launch helper - parser.add_argument( - "--nnodes", type=int, default=1, help="The number of nodes to use for distributed training" - ) - parser.add_argument( - "--node_rank", - type=int, - default=0, - help="The rank of the node for multi-node distributed training", - ) - parser.add_argument( - "--nproc_per_node", - type=int, - default=1, - help="The number of processes to launch on each node, " - "for GPU training, this is recommended to be set " - "to the number of GPUs in your system so that " - "each process can be bound to a single GPU.", - ) - parser.add_argument( - "--master_addr", - default="127.0.0.1", - type=str, - help="Master node (rank 0)'s address, should be either " - "the IP address or the hostname of node 0, for " - "single node multi-proc training, the " - "--master_addr can simply be 127.0.0.1", - ) - parser.add_argument( - "--master_port", - default=29500, - type=int, - help="Master node (rank 0)'s free port that needs to be used for communciation during distributed training", - ) - - # positional - parser.add_argument( - "training_script", - type=str, - help="The full path to the single GPU training " - "program/script to be launched in parallel, " - "followed by all the arguments for the " - "training script", - ) - - # rest from the training program - parser.add_argument("training_script_args", nargs=REMAINDER) - return parser.parse_args() - - -def main(): - args = parse_args() - - # world size in terms of number of processes - dist_world_size = args.nproc_per_node * args.nnodes - - # set PyTorch distributed related environmental variables - current_env = os.environ.copy() - current_env["MASTER_ADDR"] = args.master_addr - current_env["MASTER_PORT"] = str(args.master_port) - current_env["WORLD_SIZE"] = str(dist_world_size) - - processes = [] - - for local_rank in range(0, args.nproc_per_node): - # each process's rank - dist_rank = args.nproc_per_node * args.node_rank + local_rank - current_env["RANK"] = str(dist_rank) - current_env["LOCAL_RANK"] = str(local_rank) - - cmd = [args.training_script, *args.training_script_args] - - process = subprocess.Popen(cmd, env=current_env) - processes.append(process) - - for process in processes: - process.wait() - if process.returncode != 0: - raise subprocess.CalledProcessError(returncode=process.returncode, cmd=process.args) - - -if __name__ == "__main__": - main() diff --git a/dimos/models/Detic/third_party/Deformable-DETR/tools/run_dist_launch.sh b/dimos/models/Detic/third_party/Deformable-DETR/tools/run_dist_launch.sh deleted file mode 100755 index f6f6c4fb6f..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/tools/run_dist_launch.sh +++ /dev/null @@ -1,29 +0,0 @@ -#!/usr/bin/env bash -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ - -set -x - -GPUS=$1 -RUN_COMMAND=${@:2} -if [ $GPUS -lt 8 ]; then - GPUS_PER_NODE=${GPUS_PER_NODE:-$GPUS} -else - GPUS_PER_NODE=${GPUS_PER_NODE:-8} -fi -MASTER_ADDR=${MASTER_ADDR:-"127.0.0.1"} -MASTER_PORT=${MASTER_PORT:-"29500"} -NODE_RANK=${NODE_RANK:-0} - -let "NNODES=GPUS/GPUS_PER_NODE" - -python ./tools/launch.py \ - --nnodes ${NNODES} \ - --node_rank ${NODE_RANK} \ - --master_addr ${MASTER_ADDR} \ - --master_port ${MASTER_PORT} \ - --nproc_per_node ${GPUS_PER_NODE} \ - ${RUN_COMMAND} \ No newline at end of file diff --git a/dimos/models/Detic/third_party/Deformable-DETR/tools/run_dist_slurm.sh b/dimos/models/Detic/third_party/Deformable-DETR/tools/run_dist_slurm.sh deleted file mode 100755 index bd73d0bbb7..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/tools/run_dist_slurm.sh +++ /dev/null @@ -1,33 +0,0 @@ -#!/usr/bin/env bash -# -------------------------------------------------------------------------------------------------------------------------- -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# -------------------------------------------------------------------------------------------------------------------------- -# Modified from https://github.com/open-mmlab/mmdetection/blob/3b53fe15d87860c6941f3dda63c0f27422da6266/tools/slurm_train.sh -# -------------------------------------------------------------------------------------------------------------------------- - -set -x - -PARTITION=$1 -JOB_NAME=$2 -GPUS=$3 -RUN_COMMAND=${@:4} -if [ $GPUS -lt 8 ]; then - GPUS_PER_NODE=${GPUS_PER_NODE:-$GPUS} -else - GPUS_PER_NODE=${GPUS_PER_NODE:-8} -fi -CPUS_PER_TASK=${CPUS_PER_TASK:-4} -SRUN_ARGS=${SRUN_ARGS:-""} - -srun -p ${PARTITION} \ - --job-name=${JOB_NAME} \ - --gres=gpu:${GPUS_PER_NODE} \ - --ntasks=${GPUS} \ - --ntasks-per-node=${GPUS_PER_NODE} \ - --cpus-per-task=${CPUS_PER_TASK} \ - --kill-on-bad-exit=1 \ - ${SRUN_ARGS} \ - ${RUN_COMMAND} - diff --git a/dimos/models/Detic/third_party/Deformable-DETR/util/__init__.py b/dimos/models/Detic/third_party/Deformable-DETR/util/__init__.py deleted file mode 100644 index 4ebdc90b7f..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/util/__init__.py +++ /dev/null @@ -1,8 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ diff --git a/dimos/models/Detic/third_party/Deformable-DETR/util/box_ops.py b/dimos/models/Detic/third_party/Deformable-DETR/util/box_ops.py deleted file mode 100644 index 5864b68d3b..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/util/box_ops.py +++ /dev/null @@ -1,95 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Utilities for bounding box manipulation and GIoU. -""" - -import torch -from torchvision.ops.boxes import box_area - - -def box_cxcywh_to_xyxy(x): - x_c, y_c, w, h = x.unbind(-1) - b = [(x_c - 0.5 * w), (y_c - 0.5 * h), (x_c + 0.5 * w), (y_c + 0.5 * h)] - return torch.stack(b, dim=-1) - - -def box_xyxy_to_cxcywh(x): - x0, y0, x1, y1 = x.unbind(-1) - b = [(x0 + x1) / 2, (y0 + y1) / 2, (x1 - x0), (y1 - y0)] - return torch.stack(b, dim=-1) - - -# modified from torchvision to also return the union -def box_iou(boxes1, boxes2): - area1 = box_area(boxes1) - area2 = box_area(boxes2) - - lt = torch.max(boxes1[:, None, :2], boxes2[:, :2]) # [N,M,2] - rb = torch.min(boxes1[:, None, 2:], boxes2[:, 2:]) # [N,M,2] - - wh = (rb - lt).clamp(min=0) # [N,M,2] - inter = wh[:, :, 0] * wh[:, :, 1] # [N,M] - - union = area1[:, None] + area2 - inter - - iou = inter / union - return iou, union - - -def generalized_box_iou(boxes1, boxes2): - """ - Generalized IoU from https://giou.stanford.edu/ - - The boxes should be in [x0, y0, x1, y1] format - - Returns a [N, M] pairwise matrix, where N = len(boxes1) - and M = len(boxes2) - """ - # degenerate boxes gives inf / nan results - # so do an early check - assert (boxes1[:, 2:] >= boxes1[:, :2]).all() - assert (boxes2[:, 2:] >= boxes2[:, :2]).all() - iou, union = box_iou(boxes1, boxes2) - - lt = torch.min(boxes1[:, None, :2], boxes2[:, :2]) - rb = torch.max(boxes1[:, None, 2:], boxes2[:, 2:]) - - wh = (rb - lt).clamp(min=0) # [N,M,2] - area = wh[:, :, 0] * wh[:, :, 1] - - return iou - (area - union) / area - - -def masks_to_boxes(masks): - """Compute the bounding boxes around the provided masks - - The masks should be in format [N, H, W] where N is the number of masks, (H, W) are the spatial dimensions. - - Returns a [N, 4] tensors, with the boxes in xyxy format - """ - if masks.numel() == 0: - return torch.zeros((0, 4), device=masks.device) - - h, w = masks.shape[-2:] - - y = torch.arange(0, h, dtype=torch.float) - x = torch.arange(0, w, dtype=torch.float) - y, x = torch.meshgrid(y, x) - - x_mask = masks * x.unsqueeze(0) - x_max = x_mask.flatten(1).max(-1)[0] - x_min = x_mask.masked_fill(~(masks.bool()), 1e8).flatten(1).min(-1)[0] - - y_mask = masks * y.unsqueeze(0) - y_max = y_mask.flatten(1).max(-1)[0] - y_min = y_mask.masked_fill(~(masks.bool()), 1e8).flatten(1).min(-1)[0] - - return torch.stack([x_min, y_min, x_max, y_max], 1) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/util/misc.py b/dimos/models/Detic/third_party/Deformable-DETR/util/misc.py deleted file mode 100644 index 0615de5b5f..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/util/misc.py +++ /dev/null @@ -1,538 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Misc functions, including distributed helpers. - -Mostly copy-paste from torchvision references. -""" - -from collections import defaultdict, deque -import datetime -import os -import pickle -import subprocess -import time -from typing import List, Optional - -import torch -from torch import Tensor -import torch.distributed as dist - -# needed due to empty tensor bug in pytorch and torchvision 0.5 -import torchvision - -if float(torchvision.__version__[:3]) < 0.5: - import math - - from torchvision.ops.misc import _NewEmptyTensorOp - - def _check_size_scale_factor(dim: int, size: int, scale_factor): - # type: (int, Optional[List[int]], Optional[float]) -> None - if size is None and scale_factor is None: - raise ValueError("either size or scale_factor should be defined") - if size is not None and scale_factor is not None: - raise ValueError("only one of size or scale_factor should be defined") - if not (scale_factor is not None and len(scale_factor) != dim): - raise ValueError( - f"scale_factor shape must match input shape. Input is {dim}D, scale_factor size is {len(scale_factor)}" - ) - - def _output_size(dim: int, input, size: int, scale_factor): - # type: (int, Tensor, Optional[List[int]], Optional[float]) -> List[int] - assert dim == 2 - _check_size_scale_factor(dim, size, scale_factor) - if size is not None: - return size - # if dim is not 2 or scale_factor is iterable use _ntuple instead of concat - assert scale_factor is not None and isinstance(scale_factor, int | float) - scale_factors = [scale_factor, scale_factor] - # math.floor might return float in py2.7 - return [math.floor(input.size(i + 2) * scale_factors[i]) for i in range(dim)] -elif float(torchvision.__version__[:3]) < 0.7: - from torchvision.ops import _new_empty_tensor - from torchvision.ops.misc import _output_size - - -class SmoothedValue: - """Track a series of values and provide access to smoothed values over a - window or the global series average. - """ - - def __init__(self, window_size: int=20, fmt=None) -> None: - if fmt is None: - fmt = "{median:.4f} ({global_avg:.4f})" - self.deque = deque(maxlen=window_size) - self.total = 0.0 - self.count = 0 - self.fmt = fmt - - def update(self, value, n: int=1) -> None: - self.deque.append(value) - self.count += n - self.total += value * n - - def synchronize_between_processes(self) -> None: - """ - Warning: does not synchronize the deque! - """ - if not is_dist_avail_and_initialized(): - return - t = torch.tensor([self.count, self.total], dtype=torch.float64, device="cuda") - dist.barrier() - dist.all_reduce(t) - t = t.tolist() - self.count = int(t[0]) - self.total = t[1] - - @property - def median(self): - d = torch.tensor(list(self.deque)) - return d.median().item() - - @property - def avg(self): - d = torch.tensor(list(self.deque), dtype=torch.float32) - return d.mean().item() - - @property - def global_avg(self): - return self.total / self.count - - @property - def max(self): - return max(self.deque) - - @property - def value(self): - return self.deque[-1] - - def __str__(self) -> str: - return self.fmt.format( - median=self.median, - avg=self.avg, - global_avg=self.global_avg, - max=self.max, - value=self.value, - ) - - -def all_gather(data): - """ - Run all_gather on arbitrary picklable data (not necessarily tensors) - Args: - data: any picklable object - Returns: - list[data]: list of data gathered from each rank - """ - world_size = get_world_size() - if world_size == 1: - return [data] - - # serialized to a Tensor - buffer = pickle.dumps(data) - storage = torch.ByteStorage.from_buffer(buffer) - tensor = torch.ByteTensor(storage).to("cuda") - - # obtain Tensor size of each rank - local_size = torch.tensor([tensor.numel()], device="cuda") - size_list = [torch.tensor([0], device="cuda") for _ in range(world_size)] - dist.all_gather(size_list, local_size) - size_list = [int(size.item()) for size in size_list] - max_size = max(size_list) - - # receiving Tensor from all ranks - # we pad the tensor because torch all_gather does not support - # gathering tensors of different shapes - tensor_list = [] - for _ in size_list: - tensor_list.append(torch.empty((max_size,), dtype=torch.uint8, device="cuda")) - if local_size != max_size: - padding = torch.empty(size=(max_size - local_size,), dtype=torch.uint8, device="cuda") - tensor = torch.cat((tensor, padding), dim=0) - dist.all_gather(tensor_list, tensor) - - data_list = [] - for size, tensor in zip(size_list, tensor_list, strict=False): - buffer = tensor.cpu().numpy().tobytes()[:size] - data_list.append(pickle.loads(buffer)) - - return data_list - - -def reduce_dict(input_dict, average: bool=True): - """ - Args: - input_dict (dict): all the values will be reduced - average (bool): whether to do average or sum - Reduce the values in the dictionary from all processes so that all processes - have the averaged results. Returns a dict with the same fields as - input_dict, after reduction. - """ - world_size = get_world_size() - if world_size < 2: - return input_dict - with torch.no_grad(): - names = [] - values = [] - # sort the keys so that they are consistent across processes - for k in sorted(input_dict.keys()): - names.append(k) - values.append(input_dict[k]) - values = torch.stack(values, dim=0) - dist.all_reduce(values) - if average: - values /= world_size - reduced_dict = {k: v for k, v in zip(names, values, strict=False)} - return reduced_dict - - -class MetricLogger: - def __init__(self, delimiter: str="\t") -> None: - self.meters = defaultdict(SmoothedValue) - self.delimiter = delimiter - - def update(self, **kwargs) -> None: - for k, v in kwargs.items(): - if isinstance(v, torch.Tensor): - v = v.item() - assert isinstance(v, float | int) - self.meters[k].update(v) - - def __getattr__(self, attr): - if attr in self.meters: - return self.meters[attr] - if attr in self.__dict__: - return self.__dict__[attr] - raise AttributeError(f"'{type(self).__name__}' object has no attribute '{attr}'") - - def __str__(self) -> str: - loss_str = [] - for name, meter in self.meters.items(): - loss_str.append(f"{name}: {meter!s}") - return self.delimiter.join(loss_str) - - def synchronize_between_processes(self) -> None: - for meter in self.meters.values(): - meter.synchronize_between_processes() - - def add_meter(self, name: str, meter) -> None: - self.meters[name] = meter - - def log_every(self, iterable, print_freq, header=None): - i = 0 - if not header: - header = "" - start_time = time.time() - end = time.time() - iter_time = SmoothedValue(fmt="{avg:.4f}") - data_time = SmoothedValue(fmt="{avg:.4f}") - space_fmt = ":" + str(len(str(len(iterable)))) + "d" - if torch.cuda.is_available(): - log_msg = self.delimiter.join( - [ - header, - "[{0" + space_fmt + "}/{1}]", - "eta: {eta}", - "{meters}", - "time: {time}", - "data: {data}", - "max mem: {memory:.0f}", - ] - ) - else: - log_msg = self.delimiter.join( - [ - header, - "[{0" + space_fmt + "}/{1}]", - "eta: {eta}", - "{meters}", - "time: {time}", - "data: {data}", - ] - ) - MB = 1024.0 * 1024.0 - for obj in iterable: - data_time.update(time.time() - end) - yield obj - iter_time.update(time.time() - end) - if i % print_freq == 0 or i == len(iterable) - 1: - eta_seconds = iter_time.global_avg * (len(iterable) - i) - eta_string = str(datetime.timedelta(seconds=int(eta_seconds))) - if torch.cuda.is_available(): - print( - log_msg.format( - i, - len(iterable), - eta=eta_string, - meters=str(self), - time=str(iter_time), - data=str(data_time), - memory=torch.cuda.max_memory_allocated() / MB, - ) - ) - else: - print( - log_msg.format( - i, - len(iterable), - eta=eta_string, - meters=str(self), - time=str(iter_time), - data=str(data_time), - ) - ) - i += 1 - end = time.time() - total_time = time.time() - start_time - total_time_str = str(datetime.timedelta(seconds=int(total_time))) - print( - f"{header} Total time: {total_time_str} ({total_time / len(iterable):.4f} s / it)" - ) - - -def get_sha(): - cwd = os.path.dirname(os.path.abspath(__file__)) - - def _run(command): - return subprocess.check_output(command, cwd=cwd).decode("ascii").strip() - - sha = "N/A" - diff = "clean" - branch = "N/A" - try: - sha = _run(["git", "rev-parse", "HEAD"]) - subprocess.check_output(["git", "diff"], cwd=cwd) - diff = _run(["git", "diff-index", "HEAD"]) - diff = "has uncommited changes" if diff else "clean" - branch = _run(["git", "rev-parse", "--abbrev-ref", "HEAD"]) - except Exception: - pass - message = f"sha: {sha}, status: {diff}, branch: {branch}" - return message - - -def collate_fn(batch): - batch = list(zip(*batch, strict=False)) - batch[0] = nested_tensor_from_tensor_list(batch[0]) - return tuple(batch) - - -def _max_by_axis(the_list): - # type: (List[List[int]]) -> List[int] - maxes = the_list[0] - for sublist in the_list[1:]: - for index, item in enumerate(sublist): - maxes[index] = max(maxes[index], item) - return maxes - - -def nested_tensor_from_tensor_list(tensor_list: list[Tensor]): - # TODO make this more general - if tensor_list[0].ndim == 3: - # TODO make it support different-sized images - max_size = _max_by_axis([list(img.shape) for img in tensor_list]) - # min_size = tuple(min(s) for s in zip(*[img.shape for img in tensor_list])) - batch_shape = [len(tensor_list), *max_size] - b, c, h, w = batch_shape - dtype = tensor_list[0].dtype - device = tensor_list[0].device - tensor = torch.zeros(batch_shape, dtype=dtype, device=device) - mask = torch.ones((b, h, w), dtype=torch.bool, device=device) - for img, pad_img, m in zip(tensor_list, tensor, mask, strict=False): - pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img) - m[: img.shape[1], : img.shape[2]] = False - else: - raise ValueError("not supported") - return NestedTensor(tensor, mask) - - -class NestedTensor: - def __init__(self, tensors, mask: Tensor | None) -> None: - self.tensors = tensors - self.mask = mask - - def to(self, device, non_blocking: bool=False): - # type: (Device) -> NestedTensor - cast_tensor = self.tensors.to(device, non_blocking=non_blocking) - mask = self.mask - if mask is not None: - assert mask is not None - cast_mask = mask.to(device, non_blocking=non_blocking) - else: - cast_mask = None - return NestedTensor(cast_tensor, cast_mask) - - def record_stream(self, *args, **kwargs) -> None: - self.tensors.record_stream(*args, **kwargs) - if self.mask is not None: - self.mask.record_stream(*args, **kwargs) - - def decompose(self): - return self.tensors, self.mask - - def __repr__(self) -> str: - return str(self.tensors) - - -def setup_for_distributed(is_master: bool) -> None: - """ - This function disables printing when not in master process - """ - import builtins as __builtin__ - - builtin_print = __builtin__.print - - def print(*args, **kwargs) -> None: - force = kwargs.pop("force", False) - if is_master or force: - builtin_print(*args, **kwargs) - - __builtin__.print = print - - -def is_dist_avail_and_initialized() -> bool: - if not dist.is_available(): - return False - if not dist.is_initialized(): - return False - return True - - -def get_world_size(): - if not is_dist_avail_and_initialized(): - return 1 - return dist.get_world_size() - - -def get_rank(): - if not is_dist_avail_and_initialized(): - return 0 - return dist.get_rank() - - -def get_local_size(): - if not is_dist_avail_and_initialized(): - return 1 - return int(os.environ["LOCAL_SIZE"]) - - -def get_local_rank(): - if not is_dist_avail_and_initialized(): - return 0 - return int(os.environ["LOCAL_RANK"]) - - -def is_main_process(): - return get_rank() == 0 - - -def save_on_master(*args, **kwargs) -> None: - if is_main_process(): - torch.save(*args, **kwargs) - - -def init_distributed_mode(args) -> None: - if "RANK" in os.environ and "WORLD_SIZE" in os.environ: - args.rank = int(os.environ["RANK"]) - args.world_size = int(os.environ["WORLD_SIZE"]) - args.gpu = int(os.environ["LOCAL_RANK"]) - args.dist_url = "env://" - os.environ["LOCAL_SIZE"] = str(torch.cuda.device_count()) - elif "SLURM_PROCID" in os.environ: - proc_id = int(os.environ["SLURM_PROCID"]) - ntasks = int(os.environ["SLURM_NTASKS"]) - node_list = os.environ["SLURM_NODELIST"] - num_gpus = torch.cuda.device_count() - addr = subprocess.getoutput(f"scontrol show hostname {node_list} | head -n1") - os.environ["MASTER_PORT"] = os.environ.get("MASTER_PORT", "29500") - os.environ["MASTER_ADDR"] = addr - os.environ["WORLD_SIZE"] = str(ntasks) - os.environ["RANK"] = str(proc_id) - os.environ["LOCAL_RANK"] = str(proc_id % num_gpus) - os.environ["LOCAL_SIZE"] = str(num_gpus) - args.dist_url = "env://" - args.world_size = ntasks - args.rank = proc_id - args.gpu = proc_id % num_gpus - else: - print("Not using distributed mode") - args.distributed = False - return - - args.distributed = True - - torch.cuda.set_device(args.gpu) - args.dist_backend = "nccl" - print(f"| distributed init (rank {args.rank}): {args.dist_url}", flush=True) - torch.distributed.init_process_group( - backend=args.dist_backend, - init_method=args.dist_url, - world_size=args.world_size, - rank=args.rank, - ) - torch.distributed.barrier() - setup_for_distributed(args.rank == 0) - - -@torch.no_grad() -def accuracy(output, target, topk=(1,)): - """Computes the precision@k for the specified values of k""" - if target.numel() == 0: - return [torch.zeros([], device=output.device)] - maxk = max(topk) - batch_size = target.size(0) - - _, pred = output.topk(maxk, 1, True, True) - pred = pred.t() - correct = pred.eq(target.view(1, -1).expand_as(pred)) - - res = [] - for k in topk: - correct_k = correct[:k].view(-1).float().sum(0) - res.append(correct_k.mul_(100.0 / batch_size)) - return res - - -def interpolate(input, size: Optional[int]=None, scale_factor=None, mode: str="nearest", align_corners=None): - # type: (Tensor, Optional[List[int]], Optional[float], str, Optional[bool]) -> Tensor - """ - Equivalent to nn.functional.interpolate, but with support for empty batch sizes. - This will eventually be supported natively by PyTorch, and this - class can go away. - """ - if float(torchvision.__version__[:3]) < 0.7: - if input.numel() > 0: - return torch.nn.functional.interpolate(input, size, scale_factor, mode, align_corners) - - output_shape = _output_size(2, input, size, scale_factor) - output_shape = list(input.shape[:-2]) + list(output_shape) - if float(torchvision.__version__[:3]) < 0.5: - return _NewEmptyTensorOp.apply(input, output_shape) - return _new_empty_tensor(input, output_shape) - else: - return torchvision.ops.misc.interpolate(input, size, scale_factor, mode, align_corners) - - -def get_total_grad_norm(parameters, norm_type: int=2): - parameters = list(filter(lambda p: p.grad is not None, parameters)) - norm_type = float(norm_type) - device = parameters[0].grad.device - total_norm = torch.norm( - torch.stack([torch.norm(p.grad.detach(), norm_type).to(device) for p in parameters]), - norm_type, - ) - return total_norm - - -def inverse_sigmoid(x, eps: float=1e-5): - x = x.clamp(min=0, max=1) - x1 = x.clamp(min=eps) - x2 = (1 - x).clamp(min=eps) - return torch.log(x1 / x2) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/util/plot_utils.py b/dimos/models/Detic/third_party/Deformable-DETR/util/plot_utils.py deleted file mode 100644 index 0af3b9e5e6..0000000000 --- a/dimos/models/Detic/third_party/Deformable-DETR/util/plot_utils.py +++ /dev/null @@ -1,120 +0,0 @@ -# ------------------------------------------------------------------------ -# Deformable DETR -# Copyright (c) 2020 SenseTime. All Rights Reserved. -# Licensed under the Apache License, Version 2.0 [see LICENSE for details] -# ------------------------------------------------------------------------ -# Modified from DETR (https://github.com/facebookresearch/detr) -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -# ------------------------------------------------------------------------ - -""" -Plotting utilities to visualize training logs. -""" - -from pathlib import Path, PurePath - -import matplotlib.pyplot as plt -import pandas as pd -import seaborn as sns -import torch - - -def plot_logs( - logs, fields=("class_error", "loss_bbox_unscaled", "mAP"), ewm_col: int=0, log_name: str="log.txt" -): - """ - Function to plot specific fields from training log(s). Plots both training and test results. - - :: Inputs - logs = list containing Path objects, each pointing to individual dir with a log file - - fields = which results to plot from each log file - plots both training and test for each field. - - ewm_col = optional, which column to use as the exponential weighted smoothing of the plots - - log_name = optional, name of log file if different than default 'log.txt'. - - :: Outputs - matplotlib plots of results in fields, color coded for each log file. - - solid lines are training results, dashed lines are test results. - - """ - func_name = "plot_utils.py::plot_logs" - - # verify logs is a list of Paths (list[Paths]) or single Pathlib object Path, - # convert single Path to list to avoid 'not iterable' error - - if not isinstance(logs, list): - if isinstance(logs, PurePath): - logs = [logs] - print(f"{func_name} info: logs param expects a list argument, converted to list[Path].") - else: - raise ValueError( - f"{func_name} - invalid argument for logs parameter.\n \ - Expect list[Path] or single Path obj, received {type(logs)}" - ) - - # verify valid dir(s) and that every item in list is Path object - for _i, dir in enumerate(logs): - if not isinstance(dir, PurePath): - raise ValueError( - f"{func_name} - non-Path object in logs argument of {type(dir)}: \n{dir}" - ) - if dir.exists(): - continue - raise ValueError(f"{func_name} - invalid directory in logs argument:\n{dir}") - - # load log file(s) and plot - dfs = [pd.read_json(Path(p) / log_name, lines=True) for p in logs] - - fig, axs = plt.subplots(ncols=len(fields), figsize=(16, 5)) - - for df, color in zip(dfs, sns.color_palette(n_colors=len(logs)), strict=False): - for j, field in enumerate(fields): - if field == "mAP": - coco_eval = ( - pd.DataFrame(pd.np.stack(df.test_coco_eval.dropna().values)[:, 1]) - .ewm(com=ewm_col) - .mean() - ) - axs[j].plot(coco_eval, c=color) - else: - df.interpolate().ewm(com=ewm_col).mean().plot( - y=[f"train_{field}", f"test_{field}"], - ax=axs[j], - color=[color] * 2, - style=["-", "--"], - ) - for ax, field in zip(axs, fields, strict=False): - ax.legend([Path(p).name for p in logs]) - ax.set_title(field) - - -def plot_precision_recall(files, naming_scheme: str="iter"): - if naming_scheme == "exp_id": - # name becomes exp_id - names = [f.parts[-3] for f in files] - elif naming_scheme == "iter": - names = [f.stem for f in files] - else: - raise ValueError(f"not supported {naming_scheme}") - fig, axs = plt.subplots(ncols=2, figsize=(16, 5)) - for f, color, name in zip(files, sns.color_palette("Blues", n_colors=len(files)), names, strict=False): - data = torch.load(f) - # precision is n_iou, n_points, n_cat, n_area, max_det - precision = data["precision"] - recall = data["params"].recThrs - scores = data["scores"] - # take precision for all classes, all areas and 100 detections - precision = precision[0, :, :, 0, -1].mean(1) - scores = scores[0, :, :, 0, -1].mean(1) - prec = precision.mean() - rec = data["recall"][0, :, 0, -1].mean() - print( - f"{naming_scheme} {name}: mAP@50={prec * 100: 05.1f}, " - + f"score={scores.mean():0.3f}, " - + f"f1={2 * prec * rec / (prec + rec + 1e-8):0.3f}" - ) - axs[0].plot(recall, precision, c=color) - axs[1].plot(recall, scores, c=color) - - axs[0].set_title("Precision / Recall") - axs[0].legend(names) - axs[1].set_title("Scores / Recall") - axs[1].legend(names) - return fig, axs diff --git a/dimos/models/Detic/tools/convert-thirdparty-pretrained-model-to-d2.py b/dimos/models/Detic/tools/convert-thirdparty-pretrained-model-to-d2.py deleted file mode 100644 index 567e71f7c4..0000000000 --- a/dimos/models/Detic/tools/convert-thirdparty-pretrained-model-to-d2.py +++ /dev/null @@ -1,36 +0,0 @@ -#!/usr/bin/env python -# Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import argparse -import pickle - -import torch - -""" -Usage: - -cd DETIC_ROOT/models/ -wget https://miil-public-eu.oss-eu-central-1.aliyuncs.com/model-zoo/ImageNet_21K_P/models/resnet50_miil_21k.pth -python ../tools/convert-thirdparty-pretrained-model-to-d2.py --path resnet50_miil_21k.pth - -wget https://github.com/SwinTransformer/storage/releases/download/v1.0.0/swin_base_patch4_window7_224_22k.pth -python ../tools/convert-thirdparty-pretrained-model-to-d2.py --path swin_base_patch4_window7_224_22k.pth - -""" - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--path", default="") - args = parser.parse_args() - - print("Loading", args.path) - model = torch.load(args.path, map_location="cpu") - # import pdb; pdb.set_trace() - if "model" in model: - model = model["model"] - if "state_dict" in model: - model = model["state_dict"] - ret = {"model": model, "__author__": "third_party", "matching_heuristics": True} - out_path = args.path.replace(".pth", ".pkl") - print("Saving to", out_path) - pickle.dump(ret, open(out_path, "wb")) diff --git a/dimos/models/Detic/tools/create_imagenetlvis_json.py b/dimos/models/Detic/tools/create_imagenetlvis_json.py deleted file mode 100644 index 4f53874421..0000000000 --- a/dimos/models/Detic/tools/create_imagenetlvis_json.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import json -import os - -from detectron2.data.detection_utils import read_image -from nltk.corpus import wordnet - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--imagenet_path", default="datasets/imagenet/ImageNet-LVIS") - parser.add_argument("--lvis_meta_path", default="datasets/lvis/lvis_v1_val.json") - parser.add_argument( - "--out_path", default="datasets/imagenet/annotations/imagenet_lvis_image_info.json" - ) - args = parser.parse_args() - - print("Loading LVIS meta") - data = json.load(open(args.lvis_meta_path)) - print("Done") - synset2cat = {x["synset"]: x for x in data["categories"]} - count = 0 - images = [] - image_counts = {} - folders = sorted(os.listdir(args.imagenet_path)) - for i, folder in enumerate(folders): - class_path = args.imagenet_path + folder - files = sorted(os.listdir(class_path)) - synset = wordnet.synset_from_pos_and_offset("n", int(folder[1:])).name() - cat = synset2cat[synset] - cat_id = cat["id"] - cat_name = cat["name"] - cat_images = [] - for file in files: - count = count + 1 - file_name = f"{folder}/{file}" - # img = cv2.imread('{}/{}'.format(args.imagenet_path, file_name)) - img = read_image(f"{args.imagenet_path}/{file_name}") - h, w = img.shape[:2] - image = { - "id": count, - "file_name": file_name, - "pos_category_ids": [cat_id], - "width": w, - "height": h, - } - cat_images.append(image) - images.extend(cat_images) - image_counts[cat_id] = len(cat_images) - print(i, cat_name, len(cat_images)) - print("# Images", len(images)) - for x in data["categories"]: - x["image_count"] = image_counts[x["id"]] if x["id"] in image_counts else 0 - out = {"categories": data["categories"], "images": images, "annotations": []} - print("Writing to", args.out_path) - json.dump(out, open(args.out_path, "w")) diff --git a/dimos/models/Detic/tools/create_lvis_21k.py b/dimos/models/Detic/tools/create_lvis_21k.py deleted file mode 100644 index a1f24446ac..0000000000 --- a/dimos/models/Detic/tools/create_lvis_21k.py +++ /dev/null @@ -1,75 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import copy -import json - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--imagenet_path", default="datasets/imagenet/annotations/imagenet-21k_image_info.json" - ) - parser.add_argument("--lvis_path", default="datasets/lvis/lvis_v1_train.json") - parser.add_argument("--save_categories", default="") - parser.add_argument("--not_save_imagenet", action="store_true") - parser.add_argument("--not_save_lvis", action="store_true") - parser.add_argument("--mark", default="lvis-21k") - args = parser.parse_args() - - print("Loading", args.imagenet_path) - in_data = json.load(open(args.imagenet_path)) - print("Loading", args.lvis_path) - lvis_data = json.load(open(args.lvis_path)) - - categories = copy.deepcopy(lvis_data["categories"]) - cat_count = max(x["id"] for x in categories) - synset2id = {x["synset"]: x["id"] for x in categories} - name2id = {x["name"]: x["id"] for x in categories} - in_id_map = {} - for x in in_data["categories"]: - if x["synset"] in synset2id: - in_id_map[x["id"]] = synset2id[x["synset"]] - elif x["name"] in name2id: - in_id_map[x["id"]] = name2id[x["name"]] - x["id"] = name2id[x["name"]] - else: - cat_count = cat_count + 1 - name2id[x["name"]] = cat_count - in_id_map[x["id"]] = cat_count - x["id"] = cat_count - categories.append(x) - - print("lvis cats", len(lvis_data["categories"])) - print("imagenet cats", len(in_data["categories"])) - print("merge cats", len(categories)) - - filtered_images = [] - for x in in_data["images"]: - x["pos_category_ids"] = [in_id_map[xx] for xx in x["pos_category_ids"]] - x["pos_category_ids"] = [xx for xx in sorted(set(x["pos_category_ids"])) if xx >= 0] - if len(x["pos_category_ids"]) > 0: - filtered_images.append(x) - - in_data["categories"] = categories - lvis_data["categories"] = categories - - if not args.not_save_imagenet: - in_out_path = args.imagenet_path[:-5] + f"_{args.mark}.json" - for k, v in in_data.items(): - print("imagenet", k, len(v)) - print("Saving Imagenet to", in_out_path) - json.dump(in_data, open(in_out_path, "w")) - - if not args.not_save_lvis: - lvis_out_path = args.lvis_path[:-5] + f"_{args.mark}.json" - for k, v in lvis_data.items(): - print("lvis", k, len(v)) - print("Saving LVIS to", lvis_out_path) - json.dump(lvis_data, open(lvis_out_path, "w")) - - if args.save_categories != "": - for x in categories: - for k in ["image_count", "instance_count", "synonyms", "def"]: - if k in x: - del x[k] - CATEGORIES = repr(categories) + " # noqa" - open(args.save_categories, "w").write(f"CATEGORIES = {CATEGORIES}") diff --git a/dimos/models/Detic/tools/download_cc.py b/dimos/models/Detic/tools/download_cc.py deleted file mode 100644 index ef7b4b0f7d..0000000000 --- a/dimos/models/Detic/tools/download_cc.py +++ /dev/null @@ -1,45 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import json -import os - -import numpy as np -from PIL import Image - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--ann", default="datasets/cc3m/Train_GCC-training.tsv") - parser.add_argument("--save_image_path", default="datasets/cc3m/training/") - parser.add_argument("--cat_info", default="datasets/lvis/lvis_v1_val.json") - parser.add_argument("--out_path", default="datasets/cc3m/train_image_info.json") - parser.add_argument("--not_download_image", action="store_true") - args = parser.parse_args() - categories = json.load(open(args.cat_info))["categories"] - images = [] - if not os.path.exists(args.save_image_path): - os.makedirs(args.save_image_path) - f = open(args.ann) - for i, line in enumerate(f): - cap, path = line[:-1].split("\t") - print(i, cap, path) - if not args.not_download_image: - os.system(f"wget {path} -O {args.save_image_path}/{i + 1}.jpg") - try: - img = Image.open(open(f"{args.save_image_path}/{i + 1}.jpg", "rb")) - img = np.asarray(img.convert("RGB")) - h, w = img.shape[:2] - except: - continue - image_info = { - "id": i + 1, - "file_name": f"{i + 1}.jpg", - "height": h, - "width": w, - "captions": [cap], - } - images.append(image_info) - data = {"categories": categories, "images": images, "annotations": []} - for k, v in data.items(): - print(k, len(v)) - print("Saving to", args.out_path) - json.dump(data, open(args.out_path, "w")) diff --git a/dimos/models/Detic/tools/dump_clip_features.py b/dimos/models/Detic/tools/dump_clip_features.py deleted file mode 100644 index f994710057..0000000000 --- a/dimos/models/Detic/tools/dump_clip_features.py +++ /dev/null @@ -1,129 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import itertools -import json - -from nltk.corpus import wordnet -import numpy as np -import torch - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--ann", default="datasets/lvis/lvis_v1_val.json") - parser.add_argument("--out_path", default="") - parser.add_argument("--prompt", default="a") - parser.add_argument("--model", default="clip") - parser.add_argument("--clip_model", default="ViT-B/32") - parser.add_argument("--fix_space", action="store_true") - parser.add_argument("--use_underscore", action="store_true") - parser.add_argument("--avg_synonyms", action="store_true") - parser.add_argument("--use_wn_name", action="store_true") - args = parser.parse_args() - - print("Loading", args.ann) - data = json.load(open(args.ann)) - cat_names = [x["name"] for x in sorted(data["categories"], key=lambda x: x["id"])] - if "synonyms" in data["categories"][0]: - if args.use_wn_name: - synonyms = [ - [xx.name() for xx in wordnet.synset(x["synset"]).lemmas()] - if x["synset"] != "stop_sign.n.01" - else ["stop_sign"] - for x in sorted(data["categories"], key=lambda x: x["id"]) - ] - else: - synonyms = [x["synonyms"] for x in sorted(data["categories"], key=lambda x: x["id"])] - else: - synonyms = [] - if args.fix_space: - cat_names = [x.replace("_", " ") for x in cat_names] - if args.use_underscore: - cat_names = [x.strip().replace("/ ", "/").replace(" ", "_") for x in cat_names] - print("cat_names", cat_names) - # Use GPU if available, otherwise fall back to CPU - if torch.cuda.is_available(): - device = "cuda" - # MacOS Metal performance shaders - elif torch.backends.mps.is_available() and torch.backends.mps.is_built(): - device = "mps" - else: - device = "cpu" - - if args.prompt == "a": - sentences = ["a " + x for x in cat_names] - sentences_synonyms = [["a " + xx for xx in x] for x in synonyms] - if args.prompt == "none": - sentences = [x for x in cat_names] - sentences_synonyms = [[xx for xx in x] for x in synonyms] - elif args.prompt == "photo": - sentences = [f"a photo of a {x}" for x in cat_names] - sentences_synonyms = [[f"a photo of a {xx}" for xx in x] for x in synonyms] - elif args.prompt == "scene": - sentences = [f"a photo of a {x} in the scene" for x in cat_names] - sentences_synonyms = [ - [f"a photo of a {xx} in the scene" for xx in x] for x in synonyms - ] - - print("sentences_synonyms", len(sentences_synonyms), sum(len(x) for x in sentences_synonyms)) - if args.model == "clip": - import clip - - print("Loading CLIP") - model, preprocess = clip.load(args.clip_model, device=device) - if args.avg_synonyms: - sentences = list(itertools.chain.from_iterable(sentences_synonyms)) - print("flattened_sentences", len(sentences)) - text = clip.tokenize(sentences).to(device) - with torch.no_grad(): - if len(text) > 10000: - text_features = torch.cat( - [ - model.encode_text(text[: len(text) // 2]), - model.encode_text(text[len(text) // 2 :]), - ], - dim=0, - ) - else: - text_features = model.encode_text(text) - print("text_features.shape", text_features.shape) - if args.avg_synonyms: - synonyms_per_cat = [len(x) for x in sentences_synonyms] - text_features = text_features.split(synonyms_per_cat, dim=0) - text_features = [x.mean(dim=0) for x in text_features] - text_features = torch.stack(text_features, dim=0) - print("after stack", text_features.shape) - text_features = text_features.cpu().numpy() - elif args.model in ["bert", "roberta"]: - from transformers import AutoModel, AutoTokenizer - - if args.model == "bert": - model_name = "bert-large-uncased" - if args.model == "roberta": - model_name = "roberta-large" - tokenizer = AutoTokenizer.from_pretrained(model_name) - model = AutoModel.from_pretrained(model_name) - model.eval() - if args.avg_synonyms: - sentences = list(itertools.chain.from_iterable(sentences_synonyms)) - print("flattened_sentences", len(sentences)) - inputs = tokenizer(sentences, padding=True, return_tensors="pt") - with torch.no_grad(): - model_outputs = model(**inputs) - outputs = model_outputs.pooler_output - text_features = outputs.detach().cpu() - if args.avg_synonyms: - synonyms_per_cat = [len(x) for x in sentences_synonyms] - text_features = text_features.split(synonyms_per_cat, dim=0) - text_features = [x.mean(dim=0) for x in text_features] - text_features = torch.stack(text_features, dim=0) - print("after stack", text_features.shape) - text_features = text_features.numpy() - print("text_features.shape", text_features.shape) - else: - assert 0, args.model - if args.out_path != "": - print("saveing to", args.out_path) - np.save(open(args.out_path, "wb"), text_features) - import pdb - - pdb.set_trace() diff --git a/dimos/models/Detic/tools/fix_o365_names.py b/dimos/models/Detic/tools/fix_o365_names.py deleted file mode 100644 index 5aee27a14f..0000000000 --- a/dimos/models/Detic/tools/fix_o365_names.py +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import copy -import json - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--ann", default="datasets/objects365/annotations/zhiyuan_objv2_val.json") - parser.add_argument("--fix_name_map", default="datasets/metadata/Objects365_names_fix.csv") - args = parser.parse_args() - - new_names = {} - old_names = {} - with open(args.fix_name_map) as f: - for line in f: - tmp = line.strip().split(",") - old_names[int(tmp[0])] = tmp[1] - new_names[int(tmp[0])] = tmp[2] - data = json.load(open(args.ann)) - - cat_info = copy.deepcopy(data["categories"]) - - for x in cat_info: - if old_names[x["id"]].strip() != x["name"].strip(): - print("{} {} {}".format(x, old_names[x["id"]], new_names[x["id"]])) - import pdb - - pdb.set_trace() - if old_names[x["id"]] != new_names[x["id"]]: - print("Renaming", x["id"], x["name"], new_names[x["id"]]) - x["name"] = new_names[x["id"]] - - data["categories"] = cat_info - out_name = args.ann[:-5] + "_fixname.json" - print("Saving to", out_name) - json.dump(data, open(out_name, "w")) diff --git a/dimos/models/Detic/tools/fix_o365_path.py b/dimos/models/Detic/tools/fix_o365_path.py deleted file mode 100644 index c43358fff0..0000000000 --- a/dimos/models/Detic/tools/fix_o365_path.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import json -import os - -import path - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--ann", default="datasets/objects365/annotations/zhiyuan_objv2_train_fixname.json" - ) - parser.add_argument("--img_dir", default="datasets/objects365/train/") - args = parser.parse_args() - - print("Loading", args.ann) - data = json.load(open(args.ann)) - images = [] - count = 0 - for x in data["images"]: - path = "{}/{}".format(args.img_dir, x["file_name"]) - if os.path.exists(path): - images.append(x) - else: - print(path) - count = count + 1 - print("Missing", count, "images") - data["images"] = images - out_name = args.ann[:-5] + "_fixmiss.json" - print("Saving to", out_name) - json.dump(data, open(out_name, "w")) diff --git a/dimos/models/Detic/tools/get_cc_tags.py b/dimos/models/Detic/tools/get_cc_tags.py deleted file mode 100644 index 0a5cdab8ec..0000000000 --- a/dimos/models/Detic/tools/get_cc_tags.py +++ /dev/null @@ -1,198 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -from collections import defaultdict -import json - -from detectron2.data.datasets.lvis_v1_categories import LVIS_CATEGORIES - -# This mapping is extracted from the official LVIS mapping: -# https://github.com/lvis-dataset/lvis-api/blob/master/data/coco_to_synset.json -COCO_SYNSET_CATEGORIES = [ - {"synset": "person.n.01", "coco_cat_id": 1}, - {"synset": "bicycle.n.01", "coco_cat_id": 2}, - {"synset": "car.n.01", "coco_cat_id": 3}, - {"synset": "motorcycle.n.01", "coco_cat_id": 4}, - {"synset": "airplane.n.01", "coco_cat_id": 5}, - {"synset": "bus.n.01", "coco_cat_id": 6}, - {"synset": "train.n.01", "coco_cat_id": 7}, - {"synset": "truck.n.01", "coco_cat_id": 8}, - {"synset": "boat.n.01", "coco_cat_id": 9}, - {"synset": "traffic_light.n.01", "coco_cat_id": 10}, - {"synset": "fireplug.n.01", "coco_cat_id": 11}, - {"synset": "stop_sign.n.01", "coco_cat_id": 13}, - {"synset": "parking_meter.n.01", "coco_cat_id": 14}, - {"synset": "bench.n.01", "coco_cat_id": 15}, - {"synset": "bird.n.01", "coco_cat_id": 16}, - {"synset": "cat.n.01", "coco_cat_id": 17}, - {"synset": "dog.n.01", "coco_cat_id": 18}, - {"synset": "horse.n.01", "coco_cat_id": 19}, - {"synset": "sheep.n.01", "coco_cat_id": 20}, - {"synset": "beef.n.01", "coco_cat_id": 21}, - {"synset": "elephant.n.01", "coco_cat_id": 22}, - {"synset": "bear.n.01", "coco_cat_id": 23}, - {"synset": "zebra.n.01", "coco_cat_id": 24}, - {"synset": "giraffe.n.01", "coco_cat_id": 25}, - {"synset": "backpack.n.01", "coco_cat_id": 27}, - {"synset": "umbrella.n.01", "coco_cat_id": 28}, - {"synset": "bag.n.04", "coco_cat_id": 31}, - {"synset": "necktie.n.01", "coco_cat_id": 32}, - {"synset": "bag.n.06", "coco_cat_id": 33}, - {"synset": "frisbee.n.01", "coco_cat_id": 34}, - {"synset": "ski.n.01", "coco_cat_id": 35}, - {"synset": "snowboard.n.01", "coco_cat_id": 36}, - {"synset": "ball.n.06", "coco_cat_id": 37}, - {"synset": "kite.n.03", "coco_cat_id": 38}, - {"synset": "baseball_bat.n.01", "coco_cat_id": 39}, - {"synset": "baseball_glove.n.01", "coco_cat_id": 40}, - {"synset": "skateboard.n.01", "coco_cat_id": 41}, - {"synset": "surfboard.n.01", "coco_cat_id": 42}, - {"synset": "tennis_racket.n.01", "coco_cat_id": 43}, - {"synset": "bottle.n.01", "coco_cat_id": 44}, - {"synset": "wineglass.n.01", "coco_cat_id": 46}, - {"synset": "cup.n.01", "coco_cat_id": 47}, - {"synset": "fork.n.01", "coco_cat_id": 48}, - {"synset": "knife.n.01", "coco_cat_id": 49}, - {"synset": "spoon.n.01", "coco_cat_id": 50}, - {"synset": "bowl.n.03", "coco_cat_id": 51}, - {"synset": "banana.n.02", "coco_cat_id": 52}, - {"synset": "apple.n.01", "coco_cat_id": 53}, - {"synset": "sandwich.n.01", "coco_cat_id": 54}, - {"synset": "orange.n.01", "coco_cat_id": 55}, - {"synset": "broccoli.n.01", "coco_cat_id": 56}, - {"synset": "carrot.n.01", "coco_cat_id": 57}, - # {"synset": "frank.n.02", "coco_cat_id": 58}, - {"synset": "sausage.n.01", "coco_cat_id": 58}, - {"synset": "pizza.n.01", "coco_cat_id": 59}, - {"synset": "doughnut.n.02", "coco_cat_id": 60}, - {"synset": "cake.n.03", "coco_cat_id": 61}, - {"synset": "chair.n.01", "coco_cat_id": 62}, - {"synset": "sofa.n.01", "coco_cat_id": 63}, - {"synset": "pot.n.04", "coco_cat_id": 64}, - {"synset": "bed.n.01", "coco_cat_id": 65}, - {"synset": "dining_table.n.01", "coco_cat_id": 67}, - {"synset": "toilet.n.02", "coco_cat_id": 70}, - {"synset": "television_receiver.n.01", "coco_cat_id": 72}, - {"synset": "laptop.n.01", "coco_cat_id": 73}, - {"synset": "mouse.n.04", "coco_cat_id": 74}, - {"synset": "remote_control.n.01", "coco_cat_id": 75}, - {"synset": "computer_keyboard.n.01", "coco_cat_id": 76}, - {"synset": "cellular_telephone.n.01", "coco_cat_id": 77}, - {"synset": "microwave.n.02", "coco_cat_id": 78}, - {"synset": "oven.n.01", "coco_cat_id": 79}, - {"synset": "toaster.n.02", "coco_cat_id": 80}, - {"synset": "sink.n.01", "coco_cat_id": 81}, - {"synset": "electric_refrigerator.n.01", "coco_cat_id": 82}, - {"synset": "book.n.01", "coco_cat_id": 84}, - {"synset": "clock.n.01", "coco_cat_id": 85}, - {"synset": "vase.n.01", "coco_cat_id": 86}, - {"synset": "scissors.n.01", "coco_cat_id": 87}, - {"synset": "teddy.n.01", "coco_cat_id": 88}, - {"synset": "hand_blower.n.01", "coco_cat_id": 89}, - {"synset": "toothbrush.n.01", "coco_cat_id": 90}, -] - - -def map_name(x): - x = x.replace("_", " ") - if "(" in x: - x = x[: x.find("(")] - return x.lower().strip() - - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--cc_ann", default="datasets/cc3m/train_image_info.json") - parser.add_argument("--out_path", default="datasets/cc3m/train_image_info_tags.json") - parser.add_argument("--keep_images", action="store_true") - parser.add_argument("--allcaps", action="store_true") - parser.add_argument("--cat_path", default="") - parser.add_argument("--convert_caption", action="store_true") - # parser.add_argument('--lvis_ann', default='datasets/lvis/lvis_v1_val.json') - args = parser.parse_args() - - # lvis_data = json.load(open(args.lvis_ann, 'r')) - cc_data = json.load(open(args.cc_ann)) - if args.convert_caption: - num_caps = 0 - caps = defaultdict(list) - for x in cc_data["annotations"]: - caps[x["image_id"]].append(x["caption"]) - for x in cc_data["images"]: - x["captions"] = caps[x["id"]] - num_caps += len(x["captions"]) - print("# captions", num_caps) - - if args.cat_path != "": - print("Loading", args.cat_path) - cats = json.load(open(args.cat_path))["categories"] - if "synonyms" not in cats[0]: - cocoid2synset = {x["coco_cat_id"]: x["synset"] for x in COCO_SYNSET_CATEGORIES} - synset2synonyms = {x["synset"]: x["synonyms"] for x in LVIS_CATEGORIES} - for x in cats: - synonyms = synset2synonyms[cocoid2synset[x["id"]]] - x["synonyms"] = synonyms - x["frequency"] = "f" - cc_data["categories"] = cats - - id2cat = {x["id"]: x for x in cc_data["categories"]} - class_count = {x["id"]: 0 for x in cc_data["categories"]} - class_data = { - x["id"]: [" " + map_name(xx) + " " for xx in x["synonyms"]] for x in cc_data["categories"] - } - num_examples = 5 - examples = {x["id"]: [] for x in cc_data["categories"]} - - print("class_data", class_data) - - images = [] - for i, x in enumerate(cc_data["images"]): - if i % 10000 == 0: - print(i, len(cc_data["images"])) - if args.allcaps: - caption = (" ".join(x["captions"])).lower() - else: - caption = x["captions"][0].lower() - x["pos_category_ids"] = [] - for cat_id, cat_names in class_data.items(): - find = False - for c in cat_names: - if c in caption or caption.startswith(c[1:]) or caption.endswith(c[:-1]): - find = True - break - if find: - x["pos_category_ids"].append(cat_id) - class_count[cat_id] += 1 - if len(examples[cat_id]) < num_examples: - examples[cat_id].append(caption) - if len(x["pos_category_ids"]) > 0 or args.keep_images: - images.append(x) - - zero_class = [] - for cat_id, count in class_count.items(): - print(id2cat[cat_id]["name"], count, end=", ") - if count == 0: - zero_class.append(id2cat[cat_id]) - print("==") - print("zero class", zero_class) - - # for freq in ['r', 'c', 'f']: - # print('#cats', freq, len([x for x in cc_data['categories'] \ - # if x['frequency'] == freq] and class_count[x['id']] > 0)) - - for freq in ["r", "c", "f"]: - print( - "#Images", - freq, - sum([v for k, v in class_count.items() if id2cat[k]["frequency"] == freq]), - ) - - try: - out_data = {"images": images, "categories": cc_data["categories"], "annotations": []} - for k, v in out_data.items(): - print(k, len(v)) - if args.keep_images and not args.out_path.endswith("_full.json"): - args.out_path = args.out_path[:-5] + "_full.json" - print("Writing to", args.out_path) - json.dump(out_data, open(args.out_path, "w")) - except: - pass diff --git a/dimos/models/Detic/tools/get_coco_zeroshot_oriorder.py b/dimos/models/Detic/tools/get_coco_zeroshot_oriorder.py deleted file mode 100644 index 688b0a92e5..0000000000 --- a/dimos/models/Detic/tools/get_coco_zeroshot_oriorder.py +++ /dev/null @@ -1,20 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import json - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument( - "--data_path", default="datasets/coco/annotations/instances_val2017_unseen_2.json" - ) - parser.add_argument("--cat_path", default="datasets/coco/annotations/instances_val2017.json") - args = parser.parse_args() - print("Loading", args.cat_path) - cat = json.load(open(args.cat_path))["categories"] - - print("Loading", args.data_path) - data = json.load(open(args.data_path)) - data["categories"] = cat - out_path = args.data_path[:-5] + "_oriorder.json" - print("Saving to", out_path) - json.dump(data, open(out_path, "w")) diff --git a/dimos/models/Detic/tools/get_imagenet_21k_full_tar_json.py b/dimos/models/Detic/tools/get_imagenet_21k_full_tar_json.py deleted file mode 100644 index 00502db11f..0000000000 --- a/dimos/models/Detic/tools/get_imagenet_21k_full_tar_json.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import json -import operator -import sys -import time - -from nltk.corpus import wordnet -import numpy as np -import torch -from tqdm import tqdm - -sys.path.insert(0, "third_party/CenterNet2/") -sys.path.insert(0, "third_party/Deformable-DETR") -from detic.data.tar_dataset import DiskTarDataset - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--imagenet_dir", default="datasets/imagenet/ImageNet-21k/") - parser.add_argument("--tarfile_path", default="datasets/imagenet/metadata-22k/tar_files.npy") - parser.add_argument("--tar_index_dir", default="datasets/imagenet/metadata-22k/tarindex_npy") - parser.add_argument( - "--out_path", default="datasets/imagenet/annotations/imagenet-22k_image_info.json" - ) - parser.add_argument("--workers", default=16, type=int) - args = parser.parse_args() - - start_time = time.time() - print("Building dataset") - dataset = DiskTarDataset(args.tarfile_path, args.tar_index_dir) - end_time = time.time() - print(f"Took {end_time - start_time} seconds to make the dataset.") - print(f"Have {len(dataset)} samples.") - print("dataset", dataset) - - tar_files = np.load(args.tarfile_path) - categories = [] - for i, tar_file in enumerate(tar_files): - wnid = tar_file[-13:-4] - synset = wordnet.synset_from_pos_and_offset("n", int(wnid[1:])) - synonyms = [x.name() for x in synset.lemmas()] - category = { - "id": i + 1, - "synset": synset.name(), - "name": synonyms[0], - "def": synset.definition(), - "synonyms": synonyms, - } - categories.append(category) - print("categories", len(categories)) - - data_loader = torch.utils.data.DataLoader( - dataset, - batch_size=1, - shuffle=False, - num_workers=args.workers, - collate_fn=operator.itemgetter(0), - ) - images = [] - for img, label, index in tqdm(data_loader): - if label == -1: - continue - image = { - "id": int(index) + 1, - "pos_category_ids": [int(label) + 1], - "height": int(img.height), - "width": int(img.width), - "tar_index": int(index), - } - images.append(image) - - data = {"categories": categories, "images": images, "annotations": []} - try: - for k, v in data.items(): - print(k, len(v)) - print("Saving to ", args.out_path) - json.dump(data, open(args.out_path, "w")) - except: - pass - import pdb - - pdb.set_trace() diff --git a/dimos/models/Detic/tools/get_lvis_cat_info.py b/dimos/models/Detic/tools/get_lvis_cat_info.py deleted file mode 100644 index 414a615b8a..0000000000 --- a/dimos/models/Detic/tools/get_lvis_cat_info.py +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import json - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--ann", default="datasets/lvis/lvis_v1_train.json") - parser.add_argument("--add_freq", action="store_true") - parser.add_argument("--r_thresh", type=int, default=10) - parser.add_argument("--c_thresh", type=int, default=100) - args = parser.parse_args() - - print("Loading", args.ann) - data = json.load(open(args.ann)) - cats = data["categories"] - image_count = {x["id"]: set() for x in cats} - ann_count = {x["id"]: 0 for x in cats} - for x in data["annotations"]: - image_count[x["category_id"]].add(x["image_id"]) - ann_count[x["category_id"]] += 1 - num_freqs = {x: 0 for x in ["r", "f", "c"]} - for x in cats: - x["image_count"] = len(image_count[x["id"]]) - x["instance_count"] = ann_count[x["id"]] - if args.add_freq: - freq = "f" - if x["image_count"] < args.c_thresh: - freq = "c" - if x["image_count"] < args.r_thresh: - freq = "r" - x["frequency"] = freq - num_freqs[freq] += 1 - print(cats) - image_counts = sorted([x["image_count"] for x in cats]) - # print('image count', image_counts) - # import pdb; pdb.set_trace() - if args.add_freq: - for x in ["r", "c", "f"]: - print(x, num_freqs[x]) - out = cats # {'categories': cats} - out_path = args.ann[:-5] + "_cat_info.json" - print("Saving to", out_path) - json.dump(out, open(out_path, "w")) diff --git a/dimos/models/Detic/tools/merge_lvis_coco.py b/dimos/models/Detic/tools/merge_lvis_coco.py deleted file mode 100644 index 1a76a02f0b..0000000000 --- a/dimos/models/Detic/tools/merge_lvis_coco.py +++ /dev/null @@ -1,206 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from collections import defaultdict -import json - -from detectron2.structures import Boxes, pairwise_iou -import torch - -COCO_PATH = "datasets/coco/annotations/instances_train2017.json" -IMG_PATH = "datasets/coco/train2017/" -LVIS_PATH = "datasets/lvis/lvis_v1_train.json" -NO_SEG = False -if NO_SEG: - SAVE_PATH = "datasets/lvis/lvis_v1_train+coco_box.json" -else: - SAVE_PATH = "datasets/lvis/lvis_v1_train+coco_mask.json" -THRESH = 0.7 -DEBUG = False - -# This mapping is extracted from the official LVIS mapping: -# https://github.com/lvis-dataset/lvis-api/blob/master/data/coco_to_synset.json -COCO_SYNSET_CATEGORIES = [ - {"synset": "person.n.01", "coco_cat_id": 1}, - {"synset": "bicycle.n.01", "coco_cat_id": 2}, - {"synset": "car.n.01", "coco_cat_id": 3}, - {"synset": "motorcycle.n.01", "coco_cat_id": 4}, - {"synset": "airplane.n.01", "coco_cat_id": 5}, - {"synset": "bus.n.01", "coco_cat_id": 6}, - {"synset": "train.n.01", "coco_cat_id": 7}, - {"synset": "truck.n.01", "coco_cat_id": 8}, - {"synset": "boat.n.01", "coco_cat_id": 9}, - {"synset": "traffic_light.n.01", "coco_cat_id": 10}, - {"synset": "fireplug.n.01", "coco_cat_id": 11}, - {"synset": "stop_sign.n.01", "coco_cat_id": 13}, - {"synset": "parking_meter.n.01", "coco_cat_id": 14}, - {"synset": "bench.n.01", "coco_cat_id": 15}, - {"synset": "bird.n.01", "coco_cat_id": 16}, - {"synset": "cat.n.01", "coco_cat_id": 17}, - {"synset": "dog.n.01", "coco_cat_id": 18}, - {"synset": "horse.n.01", "coco_cat_id": 19}, - {"synset": "sheep.n.01", "coco_cat_id": 20}, - {"synset": "beef.n.01", "coco_cat_id": 21}, - {"synset": "elephant.n.01", "coco_cat_id": 22}, - {"synset": "bear.n.01", "coco_cat_id": 23}, - {"synset": "zebra.n.01", "coco_cat_id": 24}, - {"synset": "giraffe.n.01", "coco_cat_id": 25}, - {"synset": "backpack.n.01", "coco_cat_id": 27}, - {"synset": "umbrella.n.01", "coco_cat_id": 28}, - {"synset": "bag.n.04", "coco_cat_id": 31}, - {"synset": "necktie.n.01", "coco_cat_id": 32}, - {"synset": "bag.n.06", "coco_cat_id": 33}, - {"synset": "frisbee.n.01", "coco_cat_id": 34}, - {"synset": "ski.n.01", "coco_cat_id": 35}, - {"synset": "snowboard.n.01", "coco_cat_id": 36}, - {"synset": "ball.n.06", "coco_cat_id": 37}, - {"synset": "kite.n.03", "coco_cat_id": 38}, - {"synset": "baseball_bat.n.01", "coco_cat_id": 39}, - {"synset": "baseball_glove.n.01", "coco_cat_id": 40}, - {"synset": "skateboard.n.01", "coco_cat_id": 41}, - {"synset": "surfboard.n.01", "coco_cat_id": 42}, - {"synset": "tennis_racket.n.01", "coco_cat_id": 43}, - {"synset": "bottle.n.01", "coco_cat_id": 44}, - {"synset": "wineglass.n.01", "coco_cat_id": 46}, - {"synset": "cup.n.01", "coco_cat_id": 47}, - {"synset": "fork.n.01", "coco_cat_id": 48}, - {"synset": "knife.n.01", "coco_cat_id": 49}, - {"synset": "spoon.n.01", "coco_cat_id": 50}, - {"synset": "bowl.n.03", "coco_cat_id": 51}, - {"synset": "banana.n.02", "coco_cat_id": 52}, - {"synset": "apple.n.01", "coco_cat_id": 53}, - {"synset": "sandwich.n.01", "coco_cat_id": 54}, - {"synset": "orange.n.01", "coco_cat_id": 55}, - {"synset": "broccoli.n.01", "coco_cat_id": 56}, - {"synset": "carrot.n.01", "coco_cat_id": 57}, - # {"synset": "frank.n.02", "coco_cat_id": 58}, - {"synset": "sausage.n.01", "coco_cat_id": 58}, - {"synset": "pizza.n.01", "coco_cat_id": 59}, - {"synset": "doughnut.n.02", "coco_cat_id": 60}, - {"synset": "cake.n.03", "coco_cat_id": 61}, - {"synset": "chair.n.01", "coco_cat_id": 62}, - {"synset": "sofa.n.01", "coco_cat_id": 63}, - {"synset": "pot.n.04", "coco_cat_id": 64}, - {"synset": "bed.n.01", "coco_cat_id": 65}, - {"synset": "dining_table.n.01", "coco_cat_id": 67}, - {"synset": "toilet.n.02", "coco_cat_id": 70}, - {"synset": "television_receiver.n.01", "coco_cat_id": 72}, - {"synset": "laptop.n.01", "coco_cat_id": 73}, - {"synset": "mouse.n.04", "coco_cat_id": 74}, - {"synset": "remote_control.n.01", "coco_cat_id": 75}, - {"synset": "computer_keyboard.n.01", "coco_cat_id": 76}, - {"synset": "cellular_telephone.n.01", "coco_cat_id": 77}, - {"synset": "microwave.n.02", "coco_cat_id": 78}, - {"synset": "oven.n.01", "coco_cat_id": 79}, - {"synset": "toaster.n.02", "coco_cat_id": 80}, - {"synset": "sink.n.01", "coco_cat_id": 81}, - {"synset": "electric_refrigerator.n.01", "coco_cat_id": 82}, - {"synset": "book.n.01", "coco_cat_id": 84}, - {"synset": "clock.n.01", "coco_cat_id": 85}, - {"synset": "vase.n.01", "coco_cat_id": 86}, - {"synset": "scissors.n.01", "coco_cat_id": 87}, - {"synset": "teddy.n.01", "coco_cat_id": 88}, - {"synset": "hand_blower.n.01", "coco_cat_id": 89}, - {"synset": "toothbrush.n.01", "coco_cat_id": 90}, -] - - -def get_bbox(ann): - bbox = ann["bbox"] - return [bbox[0], bbox[1], bbox[0] + bbox[2], bbox[1] + bbox[3]] - - -if __name__ == "__main__": - file_name_key = "file_name" if "v0.5" in LVIS_PATH else "coco_url" - coco_data = json.load(open(COCO_PATH)) - lvis_data = json.load(open(LVIS_PATH)) - - coco_cats = coco_data["categories"] - lvis_cats = lvis_data["categories"] - - num_find = 0 - num_not_find = 0 - num_twice = 0 - coco2lviscats = {} - synset2lvisid = {x["synset"]: x["id"] for x in lvis_cats} - # cocoid2synset = {x['coco_cat_id']: x['synset'] for x in COCO_SYNSET_CATEGORIES} - coco2lviscats = { - x["coco_cat_id"]: synset2lvisid[x["synset"]] - for x in COCO_SYNSET_CATEGORIES - if x["synset"] in synset2lvisid - } - print(len(coco2lviscats)) - - lvis_file2id = {x[file_name_key][-16:]: x["id"] for x in lvis_data["images"]} - lvis_id2img = {x["id"]: x for x in lvis_data["images"]} - lvis_catid2name = {x["id"]: x["name"] for x in lvis_data["categories"]} - - coco_file2anns = {} - coco_id2img = {x["id"]: x for x in coco_data["images"]} - coco_img2anns = defaultdict(list) - for ann in coco_data["annotations"]: - coco_img = coco_id2img[ann["image_id"]] - file_name = coco_img["file_name"][-16:] - if ann["category_id"] in coco2lviscats and file_name in lvis_file2id: - lvis_image_id = lvis_file2id[file_name] - lvis_image = lvis_id2img[lvis_image_id] - lvis_cat_id = coco2lviscats[ann["category_id"]] - if lvis_cat_id in lvis_image["neg_category_ids"]: - continue - if DEBUG: - import cv2 - - img_path = IMG_PATH + file_name - img = cv2.imread(img_path) - print(lvis_catid2name[lvis_cat_id]) - print("neg", [lvis_catid2name[x] for x in lvis_image["neg_category_ids"]]) - cv2.imshow("img", img) - cv2.waitKey() - ann["category_id"] = lvis_cat_id - ann["image_id"] = lvis_image_id - coco_img2anns[file_name].append(ann) - - lvis_img2anns = defaultdict(list) - for ann in lvis_data["annotations"]: - lvis_img = lvis_id2img[ann["image_id"]] - file_name = lvis_img[file_name_key][-16:] - lvis_img2anns[file_name].append(ann) - - ann_id_count = 0 - anns = [] - for file_name in lvis_img2anns: - coco_anns = coco_img2anns[file_name] - lvis_anns = lvis_img2anns[file_name] - ious = pairwise_iou( - Boxes(torch.tensor([get_bbox(x) for x in coco_anns])), - Boxes(torch.tensor([get_bbox(x) for x in lvis_anns])), - ) - - for ann in lvis_anns: - ann_id_count = ann_id_count + 1 - ann["id"] = ann_id_count - anns.append(ann) - - for i, ann in enumerate(coco_anns): - if len(ious[i]) == 0 or ious[i].max() < THRESH: - ann_id_count = ann_id_count + 1 - ann["id"] = ann_id_count - anns.append(ann) - else: - duplicated = False - for j in range(len(ious[i])): - if ( - ious[i, j] >= THRESH - and coco_anns[i]["category_id"] == lvis_anns[j]["category_id"] - ): - duplicated = True - if not duplicated: - ann_id_count = ann_id_count + 1 - ann["id"] = ann_id_count - anns.append(ann) - if NO_SEG: - for ann in anns: - del ann["segmentation"] - lvis_data["annotations"] = anns - - print("# Images", len(lvis_data["images"])) - print("# Anns", len(lvis_data["annotations"])) - json.dump(lvis_data, open(SAVE_PATH, "w")) diff --git a/dimos/models/Detic/tools/preprocess_imagenet22k.py b/dimos/models/Detic/tools/preprocess_imagenet22k.py deleted file mode 100644 index edf2d2bbf7..0000000000 --- a/dimos/models/Detic/tools/preprocess_imagenet22k.py +++ /dev/null @@ -1,147 +0,0 @@ -#!/usr/bin/env python3 -# Copyright (c) Facebook, Inc. and its affiliates. - -import os -import sys - -import numpy as np - -sys.path.insert(0, "third_party/CenterNet2/") -sys.path.insert(0, "third_party/Deformable-DETR") -import gzip -import io -import time - -from detic.data.tar_dataset import _TarDataset - - -class _RawTarDataset: - def __init__(self, filename, indexname: str, preload: bool=False) -> None: - self.filename = filename - self.names = [] - self.offsets = [] - - for l in open(indexname): - ll = l.split() - a, b, c = ll[:3] - offset = int(b[:-1]) - if l.endswith("** Block of NULs **\n"): - self.offsets.append(offset) - break - else: - if c.endswith("JPEG"): - self.names.append(c) - self.offsets.append(offset) - else: - # ignore directories - pass - if preload: - self.data = np.memmap(filename, mode="r", dtype="uint8") - else: - self.data = None - - def __len__(self) -> int: - return len(self.names) - - def __getitem__(self, idx: int): - if self.data is None: - self.data = np.memmap(self.filename, mode="r", dtype="uint8") - ofs = self.offsets[idx] * 512 - fsize = 512 * (self.offsets[idx + 1] - self.offsets[idx]) - data = self.data[ofs : ofs + fsize] - - if data[:13].tostring() == "././@LongLink": - data = data[3 * 512 :] - else: - data = data[512:] - - # just to make it more fun a few JPEGs are GZIP compressed... - # catch this case - if tuple(data[:2]) == (0x1F, 0x8B): - s = io.StringIO(data.tostring()) - g = gzip.GzipFile(None, "r", 0, s) - sdata = g.read() - else: - sdata = data.tostring() - return sdata - - -def preprocess() -> None: - # Follow https://github.com/Alibaba-MIIL/ImageNet21K/blob/main/dataset_preprocessing/processing_script.sh - # Expect 12358684 samples with 11221 classes - # ImageNet folder has 21841 classes (synsets) - - i22kdir = "/datasets01/imagenet-22k/062717/" - i22ktarlogs = "/checkpoint/imisra/datasets/imagenet-22k/tarindex" - class_names_file = "/checkpoint/imisra/datasets/imagenet-22k/words.txt" - - output_dir = "/checkpoint/zhouxy/Datasets/ImageNet/metadata-22k/" - i22knpytarlogs = "/checkpoint/zhouxy/Datasets/ImageNet/metadata-22k/tarindex_npy" - print("Listing dir") - log_files = os.listdir(i22ktarlogs) - log_files = [x for x in log_files if x.endswith(".tarlog")] - log_files.sort() - dataset_lens = [] - min_count = 0 - create_npy_tarlogs = True - print("Creating folders") - if create_npy_tarlogs: - os.makedirs(i22knpytarlogs, exist_ok=True) - for log_file in log_files: - syn = log_file.replace(".tarlog", "") - dataset = _RawTarDataset( - os.path.join(i22kdir, syn + ".tar"), - os.path.join(i22ktarlogs, syn + ".tarlog"), - preload=False, - ) - names = np.array(dataset.names) - offsets = np.array(dataset.offsets, dtype=np.int64) - np.save(os.path.join(i22knpytarlogs, f"{syn}_names.npy"), names) - np.save(os.path.join(i22knpytarlogs, f"{syn}_offsets.npy"), offsets) - - os.makedirs(output_dir, exist_ok=True) - - start_time = time.time() - for log_file in log_files: - syn = log_file.replace(".tarlog", "") - dataset = _TarDataset(os.path.join(i22kdir, syn + ".tar"), i22knpytarlogs) - # dataset = _RawTarDataset(os.path.join(i22kdir, syn + ".tar"), - # os.path.join(i22ktarlogs, syn + ".tarlog"), - # preload=False) - dataset_lens.append(len(dataset)) - end_time = time.time() - print(f"Time {end_time - start_time}") - - dataset_lens = np.array(dataset_lens) - dataset_valid = dataset_lens > min_count - - syn2class = {} - with open(class_names_file) as fh: - for line in fh: - line = line.strip().split("\t") - syn2class[line[0]] = line[1] - - tarlog_files = [] - class_names = [] - tar_files = [] - for k in range(len(dataset_valid)): - if not dataset_valid[k]: - continue - syn = log_files[k].replace(".tarlog", "") - tarlog_files.append(os.path.join(i22ktarlogs, syn + ".tarlog")) - tar_files.append(os.path.join(i22kdir, syn + ".tar")) - class_names.append(syn2class[syn]) - - tarlog_files = np.array(tarlog_files) - tar_files = np.array(tar_files) - class_names = np.array(class_names) - print(f"Have {len(class_names)} classes and {dataset_lens[dataset_valid].sum()} samples") - - np.save(os.path.join(output_dir, "tarlog_files.npy"), tarlog_files) - np.save(os.path.join(output_dir, "tar_files.npy"), tar_files) - np.save(os.path.join(output_dir, "class_names.npy"), class_names) - np.save(os.path.join(output_dir, "tar_files.npy"), tar_files) - - -if __name__ == "__main__": - preprocess() diff --git a/dimos/models/Detic/tools/remove_lvis_rare.py b/dimos/models/Detic/tools/remove_lvis_rare.py deleted file mode 100644 index 423dd6e6e2..0000000000 --- a/dimos/models/Detic/tools/remove_lvis_rare.py +++ /dev/null @@ -1,21 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import json - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--ann", default="datasets/lvis/lvis_v1_train.json") - args = parser.parse_args() - - print("Loading", args.ann) - data = json.load(open(args.ann)) - catid2freq = {x["id"]: x["frequency"] for x in data["categories"]} - print("ori #anns", len(data["annotations"])) - exclude = ["r"] - data["annotations"] = [ - x for x in data["annotations"] if catid2freq[x["category_id"]] not in exclude - ] - print("filtered #anns", len(data["annotations"])) - out_path = args.ann[:-5] + "_norare.json" - print("Saving to", out_path) - json.dump(data, open(out_path, "w")) diff --git a/dimos/models/Detic/tools/unzip_imagenet_lvis.py b/dimos/models/Detic/tools/unzip_imagenet_lvis.py deleted file mode 100644 index fd969c28bb..0000000000 --- a/dimos/models/Detic/tools/unzip_imagenet_lvis.py +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -import argparse -import os - -if __name__ == "__main__": - parser = argparse.ArgumentParser() - parser.add_argument("--src_path", default="datasets/imagenet/ImageNet-21K/") - parser.add_argument("--dst_path", default="datasets/imagenet/ImageNet-LVIS/") - parser.add_argument("--data_path", default="datasets/imagenet_lvis_wnid.txt") - args = parser.parse_args() - - f = open(args.data_path) - for i, line in enumerate(f): - cmd = "mkdir {x} && tar -xf {src}/{l}.tar -C {x}".format( - src=args.src_path, l=line.strip(), x=args.dst_path + "/" + line.strip() - ) - print(i, cmd) - os.system(cmd) diff --git a/dimos/models/Detic/train_net.py b/dimos/models/Detic/train_net.py deleted file mode 100644 index 54ab6136f4..0000000000 --- a/dimos/models/Detic/train_net.py +++ /dev/null @@ -1,266 +0,0 @@ -# Copyright (c) Facebook, Inc. and its affiliates. -from collections import OrderedDict -import datetime -import logging -import os -import sys -import time - -from detectron2.checkpoint import DetectionCheckpointer, PeriodicCheckpointer -from detectron2.config import get_cfg -from detectron2.data import ( - MetadataCatalog, - build_detection_test_loader, -) -from detectron2.data.build import build_detection_train_loader -from detectron2.data.dataset_mapper import DatasetMapper -from detectron2.engine import default_argument_parser, default_setup, launch -from detectron2.evaluation import ( - COCOEvaluator, - LVISEvaluator, - inference_on_dataset, - print_csv_format, -) -from detectron2.modeling import build_model -from detectron2.solver import build_lr_scheduler, build_optimizer -import detectron2.utils.comm as comm -from detectron2.utils.events import ( - CommonMetricPrinter, - EventStorage, - JSONWriter, - TensorboardXWriter, -) -from detectron2.utils.logger import setup_logger -from fvcore.common.timer import Timer -import torch -from torch.cuda.amp import GradScaler -from torch.nn.parallel import DistributedDataParallel - -sys.path.insert(0, "third_party/CenterNet2/") -from centernet.config import add_centernet_config - -sys.path.insert(0, "third_party/Deformable-DETR") -from detic.config import add_detic_config -from detic.custom_solver import build_custom_optimizer -from detic.data.custom_build_augmentation import build_custom_augmentation -from detic.data.custom_dataset_dataloader import build_custom_train_loader -from detic.data.custom_dataset_mapper import CustomDatasetMapper, DetrDatasetMapper -from detic.evaluation.custom_coco_eval import CustomCOCOEvaluator -from detic.evaluation.oideval import OIDEvaluator -from detic.modeling.utils import reset_cls_test - -logger = logging.getLogger("detectron2") - - -def do_test(cfg, model): - results = OrderedDict() - for d, dataset_name in enumerate(cfg.DATASETS.TEST): - if cfg.MODEL.RESET_CLS_TESTS: - reset_cls_test(model, cfg.MODEL.TEST_CLASSIFIERS[d], cfg.MODEL.TEST_NUM_CLASSES[d]) - mapper = ( - None - if cfg.INPUT.TEST_INPUT_TYPE == "default" - else DatasetMapper(cfg, False, augmentations=build_custom_augmentation(cfg, False)) - ) - data_loader = build_detection_test_loader(cfg, dataset_name, mapper=mapper) - output_folder = os.path.join(cfg.OUTPUT_DIR, f"inference_{dataset_name}") - evaluator_type = MetadataCatalog.get(dataset_name).evaluator_type - - if evaluator_type == "lvis" or cfg.GEN_PSEDO_LABELS: - evaluator = LVISEvaluator(dataset_name, cfg, True, output_folder) - elif evaluator_type == "coco": - if dataset_name == "coco_generalized_zeroshot_val": - # Additionally plot mAP for 'seen classes' and 'unseen classes' - evaluator = CustomCOCOEvaluator(dataset_name, cfg, True, output_folder) - else: - evaluator = COCOEvaluator(dataset_name, cfg, True, output_folder) - elif evaluator_type == "oid": - evaluator = OIDEvaluator(dataset_name, cfg, True, output_folder) - else: - assert 0, evaluator_type - - results[dataset_name] = inference_on_dataset(model, data_loader, evaluator) - if comm.is_main_process(): - logger.info(f"Evaluation results for {dataset_name} in csv format:") - print_csv_format(results[dataset_name]) - if len(results) == 1: - results = next(iter(results.values())) - return results - - -def do_train(cfg, model, resume: bool=False) -> None: - model.train() - if cfg.SOLVER.USE_CUSTOM_SOLVER: - optimizer = build_custom_optimizer(cfg, model) - else: - assert cfg.SOLVER.OPTIMIZER == "SGD" - assert cfg.SOLVER.CLIP_GRADIENTS.CLIP_TYPE != "full_model" - assert cfg.SOLVER.BACKBONE_MULTIPLIER == 1.0 - optimizer = build_optimizer(cfg, model) - scheduler = build_lr_scheduler(cfg, optimizer) - - checkpointer = DetectionCheckpointer( - model, cfg.OUTPUT_DIR, optimizer=optimizer, scheduler=scheduler - ) - - start_iter = ( - checkpointer.resume_or_load(cfg.MODEL.WEIGHTS, resume=resume).get("iteration", -1) + 1 - ) - if not resume: - start_iter = 0 - max_iter = cfg.SOLVER.MAX_ITER if cfg.SOLVER.TRAIN_ITER < 0 else cfg.SOLVER.TRAIN_ITER - - periodic_checkpointer = PeriodicCheckpointer( - checkpointer, cfg.SOLVER.CHECKPOINT_PERIOD, max_iter=max_iter - ) - - writers = ( - [ - CommonMetricPrinter(max_iter), - JSONWriter(os.path.join(cfg.OUTPUT_DIR, "metrics.json")), - TensorboardXWriter(cfg.OUTPUT_DIR), - ] - if comm.is_main_process() - else [] - ) - - use_custom_mapper = cfg.WITH_IMAGE_LABELS - MapperClass = CustomDatasetMapper if use_custom_mapper else DatasetMapper - mapper = ( - MapperClass(cfg, True) - if cfg.INPUT.CUSTOM_AUG == "" - else DetrDatasetMapper(cfg, True) - if cfg.INPUT.CUSTOM_AUG == "DETR" - else MapperClass(cfg, True, augmentations=build_custom_augmentation(cfg, True)) - ) - if cfg.DATALOADER.SAMPLER_TRAIN in ["TrainingSampler", "RepeatFactorTrainingSampler"]: - data_loader = build_detection_train_loader(cfg, mapper=mapper) - else: - data_loader = build_custom_train_loader(cfg, mapper=mapper) - - if cfg.FP16: - scaler = GradScaler() - - logger.info(f"Starting training from iteration {start_iter}") - with EventStorage(start_iter) as storage: - step_timer = Timer() - data_timer = Timer() - start_time = time.perf_counter() - for data, iteration in zip(data_loader, range(start_iter, max_iter), strict=False): - data_time = data_timer.seconds() - storage.put_scalars(data_time=data_time) - step_timer.reset() - iteration = iteration + 1 - storage.step() - loss_dict = model(data) - - losses = sum(loss for k, loss in loss_dict.items()) - assert torch.isfinite(losses).all(), loss_dict - - loss_dict_reduced = {k: v.item() for k, v in comm.reduce_dict(loss_dict).items()} - losses_reduced = sum(loss for loss in loss_dict_reduced.values()) - if comm.is_main_process(): - storage.put_scalars(total_loss=losses_reduced, **loss_dict_reduced) - - optimizer.zero_grad() - if cfg.FP16: - scaler.scale(losses).backward() - scaler.step(optimizer) - scaler.update() - else: - losses.backward() - optimizer.step() - - storage.put_scalar("lr", optimizer.param_groups[0]["lr"], smoothing_hint=False) - - step_time = step_timer.seconds() - storage.put_scalars(time=step_time) - data_timer.reset() - scheduler.step() - - if ( - cfg.TEST.EVAL_PERIOD > 0 - and iteration % cfg.TEST.EVAL_PERIOD == 0 - and iteration != max_iter - ): - do_test(cfg, model) - comm.synchronize() - - if iteration - start_iter > 5 and (iteration % 20 == 0 or iteration == max_iter): - for writer in writers: - writer.write() - periodic_checkpointer.step(iteration) - - total_time = time.perf_counter() - start_time - logger.info( - f"Total training time: {datetime.timedelta(seconds=int(total_time))!s}" - ) - - -def setup(args): - """ - Create configs and perform basic setups. - """ - cfg = get_cfg() - add_centernet_config(cfg) - add_detic_config(cfg) - cfg.merge_from_file(args.config_file) - cfg.merge_from_list(args.opts) - if "/auto" in cfg.OUTPUT_DIR: - file_name = os.path.basename(args.config_file)[:-5] - cfg.OUTPUT_DIR = cfg.OUTPUT_DIR.replace("/auto", f"/{file_name}") - logger.info(f"OUTPUT_DIR: {cfg.OUTPUT_DIR}") - cfg.freeze() - default_setup(cfg, args) - setup_logger(output=cfg.OUTPUT_DIR, distributed_rank=comm.get_rank(), name="detic") - return cfg - - -def main(args): - cfg = setup(args) - - model = build_model(cfg) - logger.info(f"Model:\n{model}") - if args.eval_only: - DetectionCheckpointer(model, save_dir=cfg.OUTPUT_DIR).resume_or_load( - cfg.MODEL.WEIGHTS, resume=args.resume - ) - - return do_test(cfg, model) - - distributed = comm.get_world_size() > 1 - if distributed: - model = DistributedDataParallel( - model, - device_ids=[comm.get_local_rank()], - broadcast_buffers=False, - find_unused_parameters=cfg.FIND_UNUSED_PARAM, - ) - - do_train(cfg, model, resume=args.resume) - return do_test(cfg, model) - - -if __name__ == "__main__": - args = default_argument_parser() - args = args.parse_args() - if args.num_machines == 1: - args.dist_url = f"tcp://127.0.0.1:{torch.randint(11111, 60000, (1,))[0].item()}" - else: - if args.dist_url == "host": - args.dist_url = "tcp://{}:12345".format(os.environ["SLURM_JOB_NODELIST"]) - elif not args.dist_url.startswith("tcp"): - tmp = os.popen( - f"echo $(scontrol show job {args.dist_url} | grep BatchHost)" - ).read() - tmp = tmp[tmp.find("=") + 1 : -1] - args.dist_url = f"tcp://{tmp}:12345" - print("Command Line Args:", args) - launch( - main, - args.num_gpus, - num_machines=args.num_machines, - machine_rank=args.machine_rank, - dist_url=args.dist_url, - args=(args,), - ) diff --git a/dimos/models/vl/test_moondream_hosted.py b/dimos/models/vl/test_moondream_hosted.py deleted file mode 100644 index a705583eb6..0000000000 --- a/dimos/models/vl/test_moondream_hosted.py +++ /dev/null @@ -1,98 +0,0 @@ -import os -import time - -import pytest - -from dimos.models.vl.moondream_hosted import MoondreamHostedVlModel -from dimos.msgs.sensor_msgs import Image -from dimos.perception.detection.type import ImageDetections2D - -# Skip all tests in this module if API key is missing -pytestmark = pytest.mark.skipif( - not os.getenv("MOONDREAM_API_KEY"), - reason="MOONDREAM_API_KEY not set" -) - -@pytest.fixture -def model() -> MoondreamHostedVlModel: - return MoondreamHostedVlModel() - -@pytest.fixture -def test_image() -> Image: - image_path = os.path.join(os.getcwd(), "assets/test.png") - if not os.path.exists(image_path): - pytest.skip(f"Test image not found at {image_path}") - return Image.from_file(image_path) - -def test_caption(model: MoondreamHostedVlModel, test_image: Image) -> None: - """Test generating a caption.""" - print("\n--- Testing Caption ---") - caption = model.caption(test_image) - print(f"Caption: {caption}") - assert isinstance(caption, str) - assert len(caption) > 0 - -def test_query(model: MoondreamHostedVlModel, test_image: Image) -> None: - """Test querying the image.""" - print("\n--- Testing Query ---") - question = "Is there an xbox controller in the image?" - answer = model.query(test_image, question) - print(f"Question: {question}") - print(f"Answer: {answer}") - assert isinstance(answer, str) - assert len(answer) > 0 - # The answer should likely be positive given the user's prompt - assert "yes" in answer.lower() or "controller" in answer.lower() - -def test_query_latency(model: MoondreamHostedVlModel, test_image: Image) -> None: - """Test that a simple query returns in under 1 second.""" - print("\n--- Testing Query Latency ---") - question = "What is this?" - - # Warmup (optional, but good practice if first call establishes connection) - # model.query(test_image, "warmup") - - start_time = time.perf_counter() - model.query(test_image, question) - end_time = time.perf_counter() - - duration = end_time - start_time - print(f"Query took {duration:.4f} seconds") - - assert duration < 1.0, f"Query took too long: {duration:.4f}s > 1.0s" - -@pytest.mark.parametrize("subject", ["xbox controller", "lip balm"]) -def test_detect(model: MoondreamHostedVlModel, test_image: Image, subject: str) -> None: - """Test detecting objects.""" - print(f"\n--- Testing Detect: {subject} ---") - detections = model.query_detections(test_image, subject) - - assert isinstance(detections, ImageDetections2D) - print(f"Found {len(detections.detections)} detections for {subject}") - - # We expect to find at least one of each in the provided test image - assert len(detections.detections) > 0 - - for det in detections.detections: - assert det.is_valid() - assert det.name == subject - # Check if bbox coordinates are within image dimensions - x1, y1, x2, y2 = det.bbox - assert 0 <= x1 < x2 <= test_image.width - assert 0 <= y1 < y2 <= test_image.height - -@pytest.mark.parametrize("subject", ["xbox controller", "lip balm"]) -def test_point(model: MoondreamHostedVlModel, test_image: Image, subject: str) -> None: - """Test pointing at objects.""" - print(f"\n--- Testing Point: {subject} ---") - points = model.point(test_image, subject) - - print(f"Found {len(points)} points for {subject}: {points}") - assert isinstance(points, list) - assert len(points) > 0 - - for x, y in points: - assert isinstance(x, (int, float)) - assert isinstance(y, (int, float)) - assert 0 <= x <= test_image.width - assert 0 <= y <= test_image.height diff --git a/dimos/web/dimos_interface/public/fonts/CascadiaCode.ttf b/dimos/web/dimos_interface/public/fonts/CascadiaCode.ttf deleted file mode 100644 index 22785c2431..0000000000 Binary files a/dimos/web/dimos_interface/public/fonts/CascadiaCode.ttf and /dev/null differ diff --git a/dimos/web/dimos_interface/src/app.css b/dimos/web/dimos_interface/src/app.css index e85299c54f..0a6e38b76b 100644 --- a/dimos/web/dimos_interface/src/app.css +++ b/dimos/web/dimos_interface/src/app.css @@ -18,13 +18,8 @@ @tailwind components; @tailwind utilities; -@font-face { - font-family: 'Cascadia Code'; - src: url('/fonts/CascadiaCode.ttf') -} - * { - font-family: 'Cascadia Code', monospace; + font-family: monospace; } * { diff --git a/tests/__init__.py b/tests/__init__.py deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/tests/agent_manip_flow_fastapi_test.py b/tests/agent_manip_flow_fastapi_test.py deleted file mode 100644 index f8b6df4244..0000000000 --- a/tests/agent_manip_flow_fastapi_test.py +++ /dev/null @@ -1,149 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -This module initializes and manages the video processing pipeline integrated with a web server. -It handles video capture, frame processing, and exposes the processed video streams via HTTP endpoints. -""" - -# ----- -# Standard library imports -import multiprocessing -import os - -from dotenv import load_dotenv - -# Third-party imports -from reactivex import operators as ops -from reactivex.disposable import CompositeDisposable -from reactivex.scheduler import ThreadPoolScheduler - -# Local application imports -from dimos.stream.frame_processor import FrameProcessor -from dimos.stream.video_operators import VideoOperators as vops -from dimos.stream.video_provider import VideoProvider -from dimos.web.fastapi_server import FastAPIServer - -# Load environment variables -load_dotenv() - - -def main(): - """ - Initializes and runs the video processing pipeline with web server output. - - This function orchestrates a video processing system that handles capture, processing, - and visualization of video streams. It demonstrates parallel processing capabilities - and various video manipulation techniques across multiple stages including capture - and processing at different frame rates, edge detection, and optical flow analysis. - - Raises: - RuntimeError: If video sources are unavailable or processing fails. - """ - CompositeDisposable() - - processor = FrameProcessor( - output_dir=f"{os.getcwd()}/assets/output/frames", delete_on_init=True - ) - - optimal_thread_count = multiprocessing.cpu_count() # Gets number of CPU cores - thread_pool_scheduler = ThreadPoolScheduler(optimal_thread_count) - - VIDEO_SOURCES = [ - f"{os.getcwd()}/assets/ldru.mp4", - f"{os.getcwd()}/assets/ldru_480p.mp4", - f"{os.getcwd()}/assets/trimmed_video_480p.mov", - f"{os.getcwd()}/assets/video-f30-480p.mp4", - "rtsp://192.168.50.207:8080/h264.sdp", - "rtsp://10.0.0.106:8080/h264.sdp", - ] - - VIDEO_SOURCE_INDEX = 3 - VIDEO_SOURCE_INDEX_2 = 2 - - my_video_provider = VideoProvider("Video File", video_source=VIDEO_SOURCES[VIDEO_SOURCE_INDEX]) - my_video_provider_2 = VideoProvider( - "Video File 2", video_source=VIDEO_SOURCES[VIDEO_SOURCE_INDEX_2] - ) - - video_stream_obs = my_video_provider.capture_video_as_observable(fps=120).pipe( - ops.subscribe_on(thread_pool_scheduler), - # Move downstream operations to thread pool for parallel processing - # Disabled: Evaluating performance impact - # ops.observe_on(thread_pool_scheduler), - vops.with_jpeg_export(processor, suffix="raw"), - vops.with_fps_sampling(fps=30), - vops.with_jpeg_export(processor, suffix="raw_slowed"), - ) - - video_stream_obs_2 = my_video_provider_2.capture_video_as_observable(fps=120).pipe( - ops.subscribe_on(thread_pool_scheduler), - # Move downstream operations to thread pool for parallel processing - # Disabled: Evaluating performance impact - # ops.observe_on(thread_pool_scheduler), - vops.with_jpeg_export(processor, suffix="raw_2"), - vops.with_fps_sampling(fps=30), - vops.with_jpeg_export(processor, suffix="raw_2_slowed"), - ) - - edge_detection_stream_obs = processor.process_stream_edge_detection(video_stream_obs).pipe( - vops.with_jpeg_export(processor, suffix="edge"), - ) - - optical_flow_relevancy_stream_obs = processor.process_stream_optical_flow_with_relevancy( - video_stream_obs - ) - - optical_flow_stream_obs = optical_flow_relevancy_stream_obs.pipe( - ops.do_action(lambda result: print(f"Optical Flow Relevancy Score: {result[1]}")), - vops.with_optical_flow_filtering(threshold=2.0), - ops.do_action(lambda _: print("Optical Flow Passed Threshold.")), - vops.with_jpeg_export(processor, suffix="optical"), - ) - - # - # ====== Agent Orchastrator (Qu.s Awareness, Temporality, Routing) ====== - # - - # Agent 1 - # my_agent = OpenAIAgent( - # "Agent 1", - # query="You are a robot. What do you see? Put a JSON with objects of what you see in the format {object, description}.") - # my_agent.subscribe_to_image_processing(slowed_video_stream_obs) - # disposables.add(my_agent.disposables) - - # # Agent 2 - # my_agent_two = OpenAIAgent( - # "Agent 2", - # query="This is a visualization of dense optical flow. What movement(s) have occured? Put a JSON with mapped directions you see in the format {direction, probability, english_description}.") - # my_agent_two.subscribe_to_image_processing(optical_flow_stream_obs) - # disposables.add(my_agent_two.disposables) - - # - # ====== Create and start the FastAPI server ====== - # - - # Will be visible at http://[host]:[port]/video_feed/[key] - streams = { - "video_one": video_stream_obs, - "video_two": video_stream_obs_2, - "edge_detection": edge_detection_stream_obs, - "optical_flow": optical_flow_stream_obs, - } - fast_api_server = FastAPIServer(port=5555, **streams) - fast_api_server.run() - - -if __name__ == "__main__": - main() diff --git a/tests/agent_manip_flow_flask_test.py b/tests/agent_manip_flow_flask_test.py deleted file mode 100644 index 7a7504e628..0000000000 --- a/tests/agent_manip_flow_flask_test.py +++ /dev/null @@ -1,192 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -This module initializes and manages the video processing pipeline integrated with a web server. -It handles video capture, frame processing, and exposes the processed video streams via HTTP endpoints. -""" - -# ----- -# Standard library imports -import multiprocessing -import os - -from dotenv import load_dotenv - -# Third-party imports -from flask import Flask -from reactivex import interval, operators as ops, zip as rx_zip -from reactivex.disposable import CompositeDisposable -from reactivex.scheduler import ThreadPoolScheduler - -# Local application imports -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.stream.frame_processor import FrameProcessor -from dimos.stream.video_operators import VideoOperators as vops -from dimos.stream.video_provider import VideoProvider -from dimos.web.flask_server import FlaskServer - -# Load environment variables -load_dotenv() - -app = Flask(__name__) - - -def main(): - """ - Initializes and runs the video processing pipeline with web server output. - - This function orchestrates a video processing system that handles capture, processing, - and visualization of video streams. It demonstrates parallel processing capabilities - and various video manipulation techniques across multiple stages including capture - and processing at different frame rates, edge detection, and optical flow analysis. - - Raises: - RuntimeError: If video sources are unavailable or processing fails. - """ - disposables = CompositeDisposable() - - processor = FrameProcessor( - output_dir=f"{os.getcwd()}/assets/output/frames", delete_on_init=True - ) - - optimal_thread_count = multiprocessing.cpu_count() # Gets number of CPU cores - thread_pool_scheduler = ThreadPoolScheduler(optimal_thread_count) - - VIDEO_SOURCES = [ - f"{os.getcwd()}/assets/ldru.mp4", - f"{os.getcwd()}/assets/ldru_480p.mp4", - f"{os.getcwd()}/assets/trimmed_video_480p.mov", - f"{os.getcwd()}/assets/video-f30-480p.mp4", - f"{os.getcwd()}/assets/video.mov", - "rtsp://192.168.50.207:8080/h264.sdp", - "rtsp://10.0.0.106:8080/h264.sdp", - f"{os.getcwd()}/assets/people_1080p_24fps.mp4", - ] - - VIDEO_SOURCE_INDEX = 4 - - my_video_provider = VideoProvider("Video File", video_source=VIDEO_SOURCES[VIDEO_SOURCE_INDEX]) - - video_stream_obs = my_video_provider.capture_video_as_observable(fps=120).pipe( - ops.subscribe_on(thread_pool_scheduler), - # Move downstream operations to thread pool for parallel processing - # Disabled: Evaluating performance impact - # ops.observe_on(thread_pool_scheduler), - # vops.with_jpeg_export(processor, suffix="raw"), - vops.with_fps_sampling(fps=30), - # vops.with_jpeg_export(processor, suffix="raw_slowed"), - ) - - processor.process_stream_edge_detection(video_stream_obs).pipe( - # vops.with_jpeg_export(processor, suffix="edge"), - ) - - optical_flow_relevancy_stream_obs = processor.process_stream_optical_flow(video_stream_obs) - - optical_flow_stream_obs = optical_flow_relevancy_stream_obs.pipe( - # ops.do_action(lambda result: print(f"Optical Flow Relevancy Score: {result[1]}")), - # vops.with_optical_flow_filtering(threshold=2.0), - # ops.do_action(lambda _: print(f"Optical Flow Passed Threshold.")), - # vops.with_jpeg_export(processor, suffix="optical") - ) - - # - # ====== Agent Orchastrator (Qu.s Awareness, Temporality, Routing) ====== - # - - # Observable that emits every 2 seconds - secondly_emission = interval(2, scheduler=thread_pool_scheduler).pipe( - ops.map(lambda x: f"Second {x + 1}"), - # ops.take(30) - ) - - # Agent 1 - my_agent = OpenAIAgent( - "Agent 1", - query="You are a robot. What do you see? Put a JSON with objects of what you see in the format {object, description}.", - json_mode=False, - ) - - # Create an agent for each subset of questions that it would be theroized to handle. - # Set std. template/blueprints, and devs will add to that likely. - - ai_1_obs = video_stream_obs.pipe( - # vops.with_fps_sampling(fps=30), - # ops.throttle_first(1), - vops.with_jpeg_export(processor, suffix="open_ai_agent_1"), - ops.take(30), - ops.replay(buffer_size=30, scheduler=thread_pool_scheduler), - ) - ai_1_obs.connect() - - ai_1_repeat_obs = ai_1_obs.pipe(ops.repeat()) - - my_agent.subscribe_to_image_processing(ai_1_obs) - disposables.add(my_agent.disposables) - - # Agent 2 - my_agent_two = OpenAIAgent( - "Agent 2", - query="This is a visualization of dense optical flow. What movement(s) have occured? Put a JSON with mapped directions you see in the format {direction, probability, english_description}.", - max_input_tokens_per_request=1000, - max_output_tokens_per_request=300, - json_mode=False, - model_name="gpt-4o-2024-08-06", - ) - - ai_2_obs = optical_flow_stream_obs.pipe( - # vops.with_fps_sampling(fps=30), - # ops.throttle_first(1), - vops.with_jpeg_export(processor, suffix="open_ai_agent_2"), - ops.take(30), - ops.replay(buffer_size=30, scheduler=thread_pool_scheduler), - ) - ai_2_obs.connect() - - ai_2_repeat_obs = ai_2_obs.pipe(ops.repeat()) - - # Combine emissions using rx_zip - ai_1_secondly_repeating_obs = rx_zip(secondly_emission, ai_1_repeat_obs).pipe( - # ops.do_action(lambda s: print(f"AI 1 - Emission Count: {s[0]}")), - ops.map(lambda r: r[1]), - ) - - # Combine emissions using rx_zip - ai_2_secondly_repeating_obs = rx_zip(secondly_emission, ai_2_repeat_obs).pipe( - # ops.do_action(lambda s: print(f"AI 2 - Emission Count: {s[0]}")), - ops.map(lambda r: r[1]), - ) - - my_agent_two.subscribe_to_image_processing(ai_2_obs) - disposables.add(my_agent_two.disposables) - - # - # ====== Create and start the Flask server ====== - # - - # Will be visible at http://[host]:[port]/video_feed/[key] - flask_server = FlaskServer( - # video_one=video_stream_obs, - # edge_detection=edge_detection_stream_obs, - # optical_flow=optical_flow_stream_obs, - OpenAIAgent_1=ai_1_secondly_repeating_obs, - OpenAIAgent_2=ai_2_secondly_repeating_obs, - ) - - flask_server.run(threaded=True) - - -if __name__ == "__main__": - main() diff --git a/tests/agent_memory_test.py b/tests/agent_memory_test.py deleted file mode 100644 index 44f1a38397..0000000000 --- a/tests/agent_memory_test.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# ----- -from dotenv import load_dotenv - -load_dotenv() - -from dimos.agents_deprecated.memory.chroma_impl import OpenAISemanticMemory - -agent_memory = OpenAISemanticMemory() -print("Initialization done.") - -agent_memory.add_vector("id0", "Food") -agent_memory.add_vector("id1", "Cat") -agent_memory.add_vector("id2", "Mouse") -agent_memory.add_vector("id3", "Bike") -agent_memory.add_vector("id4", "Dog") -agent_memory.add_vector("id5", "Tricycle") -agent_memory.add_vector("id6", "Car") -agent_memory.add_vector("id7", "Horse") -agent_memory.add_vector("id8", "Vehicle") -agent_memory.add_vector("id6", "Red") -agent_memory.add_vector("id7", "Orange") -agent_memory.add_vector("id8", "Yellow") -print("Adding vectors done.") - -print(agent_memory.get_vector("id1")) -print("Done retrieving sample vector.") - -results = agent_memory.query("Colors") -print(results) -print("Done querying agent memory (basic).") - -results = agent_memory.query("Colors", similarity_threshold=0.2) -print(results) -print("Done querying agent memory (similarity_threshold=0.2).") - -results = agent_memory.query("Colors", n_results=2) -print(results) -print("Done querying agent memory (n_results=2).") - -results = agent_memory.query("Colors", n_results=19, similarity_threshold=0.45) -print(results) -print("Done querying agent memory (n_results=19, similarity_threshold=0.45).") diff --git a/tests/genesissim/stream_camera.py b/tests/genesissim/stream_camera.py deleted file mode 100644 index 9346f58595..0000000000 --- a/tests/genesissim/stream_camera.py +++ /dev/null @@ -1,56 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -from dimos.simulation.genesis import GenesisSimulator, GenesisStream - - -def main(): - # Add multiple entities at once - entities = [ - {"type": "primitive", "params": {"shape": "plane"}}, - {"type": "mjcf", "path": "xml/franka_emika_panda/panda.xml"}, - ] - # Initialize simulator - sim = GenesisSimulator(headless=True, entities=entities) - - # You can also add entity individually - sim.add_entity("primitive", shape="box", size=[0.5, 0.5, 0.5], pos=[0, 1, 0.5]) - - # Create stream with custom settings - stream = GenesisStream( - simulator=sim, - width=1280, # Genesis default resolution - height=960, - fps=60, - camera_path="/camera", # Genesis uses simpler camera paths - annotator_type="rgb", # Can be 'rgb' or 'normals' - transport="tcp", - rtsp_url="rtsp://mediamtx:8554/stream", - ) - - # Start streaming - try: - stream.stream() - except KeyboardInterrupt: - print("\n[Stream] Received keyboard interrupt, stopping stream...") - finally: - try: - stream.cleanup() - finally: - sim.close() - - -if __name__ == "__main__": - main() diff --git a/tests/isaacsim/run-isaacsim-docker.sh b/tests/isaacsim/run-isaacsim-docker.sh deleted file mode 100644 index 2019695960..0000000000 --- a/tests/isaacsim/run-isaacsim-docker.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -# Run Isaac Sim container with display and GPU support -sudo docker run --network rtsp_net --name isaac-sim --entrypoint bash -it --runtime=nvidia --gpus all -e "ACCEPT_EULA=Y" --rm \ - -e "PRIVACY_CONSENT=Y" \ - -v ~/docker/isaac-sim/cache/kit:/isaac-sim/kit/cache:rw \ - -v ~/docker/isaac-sim/cache/ov:/root/.cache/ov:rw \ - -v ~/docker/isaac-sim/cache/pip:/root/.cache/pip:rw \ - -v ~/docker/isaac-sim/cache/glcache:/root/.cache/nvidia/GLCache:rw \ - -v ~/docker/isaac-sim/cache/computecache:/root/.nv/ComputeCache:rw \ - -v ~/docker/isaac-sim/logs:/root/.nvidia-omniverse/logs:rw \ - -v ~/docker/isaac-sim/data:/root/.local/share/ov/data:rw \ - -v ~/docker/isaac-sim/documents:/root/Documents:rw \ - -v ~/dimos:/dimos:rw \ - nvcr.io/nvidia/isaac-sim:4.2.0 - -/isaac-sim/python.sh -m pip install -r /dimos/tests/isaacsim/requirements.txt -apt-get update -apt-get install -y ffmpeg -/isaac-sim/python.sh /dimos/tests/isaacsim/stream_camera.py diff --git a/tests/isaacsim/setup_ec2.sh b/tests/isaacsim/setup_ec2.sh deleted file mode 100644 index f9d33bb3cc..0000000000 --- a/tests/isaacsim/setup_ec2.sh +++ /dev/null @@ -1,42 +0,0 @@ -#!/bin/bash - -sudo apt-get update -sudo apt install build-essential -y -sudo apt-get install -y nvidia-driver-535 -sudo reboot -sudo apt install -y nvidia-cuda-toolkit -nvidia-smi - - -# Docker installation using the convenience script -curl -fsSL https://get.docker.com -o get-docker.sh -sudo sh get-docker.sh - -# Post-install steps for Docker -sudo groupadd docker -sudo usermod -aG docker $USER -newgrp docker - -#Verify Docker - -# Configure the repository -curl -fsSL https://nvidia.github.io/libnvidia-container/gpgkey | sudo gpg --dearmor -o /usr/share/keyrings/nvidia-container-toolkit-keyring.gpg \ - && curl -s -L https://nvidia.github.io/libnvidia-container/stable/deb/nvidia-container-toolkit.list | \ - sed 's#deb https://#deb [signed-by=/usr/share/keyrings/nvidia-container-toolkit-keyring.gpg] https://#g' | \ - sudo tee /etc/apt/sources.list.d/nvidia-container-toolkit.list \ - && \ - sudo apt-get update - -# Install the NVIDIA Container Toolkit packages -sudo apt-get install -y nvidia-container-toolkit -sudo systemctl restart docker - -# Configure the container runtime -sudo nvidia-ctk runtime configure --runtime=docker -sudo systemctl restart docker - -# Verify NVIDIA Container Toolkit -sudo docker run --rm --runtime=nvidia --gpus all ubuntu nvidia-smi - -# Full isaac sim container -sudo docker pull nvcr.io/nvidia/isaac-sim:4.2.0 diff --git a/tests/isaacsim/setup_isaacsim_python.sh b/tests/isaacsim/setup_isaacsim_python.sh deleted file mode 100644 index 27744482e4..0000000000 --- a/tests/isaacsim/setup_isaacsim_python.sh +++ /dev/null @@ -1,13 +0,0 @@ -#!/bin/bash - -sudo apt install python3.10-venv -python3.10 -m venv env_isaacsim -source env_isaacsim/bin/activate - -# Install pip packages -pip install isaacsim==4.2.0.2 --extra-index-url https://pypi.nvidia.com -pip install isaacsim-extscache-physics==4.2.0.2 -pip install isaacsim-extscache-kit==4.2.0.2 -pip install isaacsim-extscache-kit-sdk==4.2.0.2 --extra-index-url https://pypi.nvidia.com - -export OMNI_KIT_ACCEPT_EULA=YES diff --git a/tests/isaacsim/setup_ros.sh b/tests/isaacsim/setup_ros.sh deleted file mode 100644 index 976487f299..0000000000 --- a/tests/isaacsim/setup_ros.sh +++ /dev/null @@ -1,47 +0,0 @@ -#!/bin/bash - -# Add ROS 2 repository -sudo apt update && sudo apt install -y software-properties-common -sudo add-apt-repository universe -y -sudo apt update && sudo apt install curl -y -sudo curl -sSL https://raw.githubusercontent.com/ros/rosdistro/master/ros.key -o /usr/share/keyrings/ros-archive-keyring.gpg -echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/ros-archive-keyring.gpg] http://packages.ros.org/ros2/ubuntu $(. /etc/os-release && echo $UBUNTU_CODENAME) main" | sudo tee /etc/apt/sources.list.d/ros2.list > /dev/null - -# Update package lists -sudo apt update -sudo apt upgrade -y - -# Install ROS 2 Humble (latest LTS for Ubuntu 22.04) -sudo apt install -y ros-humble-desktop -sudo apt install -y ros-humble-ros-base -sudo apt install -y ros-dev-tools - -# Install additional ROS 2 packages -sudo apt install -y python3-rosdep -sudo apt install -y python3-colcon-common-extensions - -# Initialize rosdep -sudo rosdep init -rosdep update - -# Setup environment variables -echo "source /opt/ros/humble/setup.bash" >> ~/.bashrc -source ~/.bashrc - -# Install additional dependencies that might be useful -sudo apt install -y python3-pip -pip3 install --upgrade pip -pip3 install transforms3d numpy scipy -sudo apt install -y python3.10-venv - -# Create ROS 2 workspace -mkdir -p ~/ros2_ws/src -cd ~/ros2_ws -colcon build - -# Source the workspace -echo "source ~/ros2_ws/install/setup.bash" >> ~/.bashrc -source ~/.bashrc - -# Print success message -echo "ROS 2 Humble installation completed successfully!" diff --git a/tests/isaacsim/stream_camera.py b/tests/isaacsim/stream_camera.py deleted file mode 100644 index 7aa25e7e38..0000000000 --- a/tests/isaacsim/stream_camera.py +++ /dev/null @@ -1,42 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -from dimos.simulation.isaac import IsaacSimulator, IsaacStream - - -def main(): - # Initialize simulator - sim = IsaacSimulator(headless=True) - - # Create stream with custom settings - stream = IsaacStream( - simulator=sim, - width=1920, - height=1080, - fps=60, - camera_path="/World/alfred_parent_prim/alfred_base_descr/chest_cam_rgb_camera_frame/chest_cam", - annotator_type="rgb", - transport="tcp", - rtsp_url="rtsp://mediamtx:8554/stream", - usd_path=f"{os.getcwd()}/assets/TestSim3.usda", - ) - - # Start streaming - stream.stream() - - -if __name__ == "__main__": - main() diff --git a/tests/mockdata/costmap.pickle b/tests/mockdata/costmap.pickle deleted file mode 100644 index a29199e841..0000000000 Binary files a/tests/mockdata/costmap.pickle and /dev/null differ diff --git a/tests/mockdata/vegas.pickle b/tests/mockdata/vegas.pickle deleted file mode 100644 index a7da5309c0..0000000000 Binary files a/tests/mockdata/vegas.pickle and /dev/null differ diff --git a/tests/run_go2_ros.py b/tests/run_go2_ros.py deleted file mode 100644 index bc083a3a57..0000000000 --- a/tests/run_go2_ros.py +++ /dev/null @@ -1,176 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import time - -from dimos.robot.unitree.unitree_go2 import UnitreeGo2, WebRTCConnectionMethod -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl - - -def get_env_var(var_name, default=None, required=False): - """Get environment variable with validation.""" - value = os.getenv(var_name, default) - if value == "": - value = default - if required and not value: - raise ValueError(f"{var_name} environment variable is required") - return value - - -if __name__ == "__main__": - # Get configuration from environment variables - robot_ip = get_env_var("ROBOT_IP") - connection_method = get_env_var("CONNECTION_METHOD", "LocalSTA") - serial_number = get_env_var("SERIAL_NUMBER", None) - output_dir = get_env_var("ROS_OUTPUT_DIR", os.path.join(os.getcwd(), "assets/output/ros")) - - # Ensure output directory exists - os.makedirs(output_dir, exist_ok=True) - print(f"Ensuring output directory exists: {output_dir}") - - use_ros = True - use_webrtc = False - # Convert connection method string to enum - connection_method = getattr(WebRTCConnectionMethod, connection_method) - - print("Initializing UnitreeGo2...") - print("Configuration:") - print(f" IP: {robot_ip}") - print(f" Connection Method: {connection_method}") - print(f" Serial Number: {serial_number if serial_number else 'Not provided'}") - print(f" Output Directory: {output_dir}") - - if use_ros: - ros_control = UnitreeROSControl(node_name="unitree_go2", use_raw=True) - else: - ros_control = None - - robot = UnitreeGo2( - ip=robot_ip, - connection_method=connection_method, - serial_number=serial_number, - output_dir=output_dir, - ros_control=ros_control, - use_ros=use_ros, - use_webrtc=use_webrtc, - ) - time.sleep(5) - try: - # Start perception - print("\nStarting perception system...") - - # Get the processed stream - processed_stream = robot.get_ros_video_stream(fps=30) - - # Create frame counter for unique filenames - frame_count = 0 - - # Create a subscriber to handle the frames - def handle_frame(frame): - global frame_count - frame_count += 1 - - try: - # Save frame to output directory if desired for debugging frame streaming - # MAKE SURE TO CHANGE OUTPUT DIR depending on if running in ROS or local - # frame_path = os.path.join(output_dir, f"frame_{frame_count:04d}.jpg") - # success = cv2.imwrite(frame_path, frame) - # print(f"Frame #{frame_count} {'saved successfully' if success else 'failed to save'} to {frame_path}") - pass - - except Exception as e: - print(f"Error in handle_frame: {e}") - import traceback - - print(traceback.format_exc()) - - def handle_error(error): - print(f"Error in stream: {error}") - - def handle_completion(): - print("Stream completed") - - # Subscribe to the stream - print("Creating subscription...") - try: - subscription = processed_stream.subscribe( - on_next=handle_frame, - on_error=lambda e: print(f"Subscription error: {e}"), - on_completed=lambda: print("Subscription completed"), - ) - print("Subscription created successfully") - except Exception as e: - print(f"Error creating subscription: {e}") - - time.sleep(5) - - # First put the robot in a good starting state - print("Running recovery stand...") - robot.webrtc_req(api_id=1006) # RecoveryStand - - # Queue 20 WebRTC requests back-to-back - print("\nšŸ¤– QUEUEING WEBRTC COMMANDS BACK-TO-BACK FOR TESTING UnitreeGo2šŸ¤–\n") - - # Dance 1 - robot.webrtc_req(api_id=1033) - print("Queued: WiggleHips (1033)") - - robot.reverse(distance=0.2, speed=0.5) - print("Queued: Reverse 0.5m at 0.5m/s") - - # Wiggle Hips - robot.webrtc_req(api_id=1033) - print("Queued: WiggleHips (1033)") - - robot.move(distance=0.2, speed=0.5) - print("Queued: Move forward 1.0m at 0.5m/s") - - robot.webrtc_req(api_id=1017) - print("Queued: Stretch (1017)") - - robot.move(distance=0.2, speed=0.5) - print("Queued: Move forward 1.0m at 0.5m/s") - - robot.webrtc_req(api_id=1017) - print("Queued: Stretch (1017)") - - robot.reverse(distance=0.2, speed=0.5) - print("Queued: Reverse 0.5m at 0.5m/s") - - robot.webrtc_req(api_id=1017) - print("Queued: Stretch (1017)") - robot.spin(degrees=-90.0, speed=45.0) - print("Queued: Spin right 90 degrees at 45 degrees/s") - - robot.spin(degrees=90.0, speed=45.0) - print("Queued: Spin left 90 degrees at 45 degrees/s") - - # To prevent termination - while True: - time.sleep(0.1) - - except KeyboardInterrupt: - print("\nStopping perception...") - if "subscription" in locals(): - subscription.dispose() - except Exception as e: - print(f"Error in main loop: {e}") - finally: - # Cleanup - print("Cleaning up resources...") - if "subscription" in locals(): - subscription.dispose() - del robot - print("Cleanup complete.") diff --git a/tests/simple_agent_test.py b/tests/simple_agent_test.py deleted file mode 100644 index 482f131f4e..0000000000 --- a/tests/simple_agent_test.py +++ /dev/null @@ -1,38 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills - -# Initialize robot -robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), ros_control=UnitreeROSControl(), skills=MyUnitreeSkills() -) - -# Initialize agent -agent = OpenAIAgent( - dev_name="UnitreeExecutionAgent", - input_video_stream=robot.get_ros_video_stream(), - skills=robot.get_skills(), - system_query="Wiggle when you see a person! Jump when you see a person waving!", -) - -try: - input("Press ESC to exit...") -except KeyboardInterrupt: - print("\nExiting...") diff --git a/tests/test_agent.py b/tests/test_agent.py deleted file mode 100644 index e91345ff6a..0000000000 --- a/tests/test_agent.py +++ /dev/null @@ -1,57 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -# ----- -from dotenv import load_dotenv - - -# Sanity check for dotenv -def test_dotenv(): - print("test_dotenv:") - load_dotenv() - openai_api_key = os.getenv("OPENAI_API_KEY") - print("\t\tOPENAI_API_KEY: ", openai_api_key) - - -# Sanity check for openai connection -def test_openai_connection(): - from openai import OpenAI - - client = OpenAI() - print("test_openai_connection:") - response = client.chat.completions.create( - model="gpt-4o-mini", - messages=[ - { - "role": "user", - "content": [ - {"type": "text", "text": "What's in this image?"}, - { - "type": "image_url", - "image_url": { - "url": "https://upload.wikimedia.org/wikipedia/commons/thumb/d/dd/Gfp-wisconsin-madison-the-nature-boardwalk.jpg/2560px-Gfp-wisconsin-madison-the-nature-boardwalk.jpg", - }, - }, - ], - } - ], - max_tokens=300, - ) - print("\t\tOpenAI Response: ", response.choices[0]) - - -test_dotenv() -test_openai_connection() diff --git a/tests/test_agent_alibaba.py b/tests/test_agent_alibaba.py deleted file mode 100644 index 1b26a7f009..0000000000 --- a/tests/test_agent_alibaba.py +++ /dev/null @@ -1,59 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -from openai import OpenAI - -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.agents_deprecated.tokenizer.huggingface_tokenizer import HuggingFaceTokenizer -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.stream.video_provider import VideoProvider -from dimos.utils.threadpool import get_scheduler - -# Initialize video stream -video_stream = VideoProvider( - dev_name="VideoProvider", - # video_source=f"{os.getcwd()}/assets/framecount.mp4", - video_source=f"{os.getcwd()}/assets/trimmed_video_office.mov", - pool_scheduler=get_scheduler(), -).capture_video_as_observable(realtime=False, fps=1) - -# Specify the OpenAI client for Alibaba -qwen_client = OpenAI( - base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1", - api_key=os.getenv("ALIBABA_API_KEY"), -) - -# Initialize Unitree skills -myUnitreeSkills = MyUnitreeSkills() -myUnitreeSkills.initialize_skills() - -# Initialize agent -agent = OpenAIAgent( - dev_name="AlibabaExecutionAgent", - openai_client=qwen_client, - model_name="qwen2.5-vl-72b-instruct", - tokenizer=HuggingFaceTokenizer(model_name="Qwen/Qwen2.5-VL-72B-Instruct"), - max_output_tokens_per_request=8192, - input_video_stream=video_stream, - # system_query="Tell me the number in the video. Find me the center of the number spotted, and print the coordinates to the console using an appropriate function call. Then provide me a deep history of the number in question and its significance in history. Additionally, tell me what model and version of language model you are.", - system_query="Tell me about any objects seen. Print the coordinates for center of the objects seen to the console using an appropriate function call. Then provide me a deep history of the number in question and its significance in history. Additionally, tell me what model and version of language model you are.", - skills=myUnitreeSkills, -) - -try: - input("Press ESC to exit...") -except KeyboardInterrupt: - print("\nExiting...") diff --git a/tests/test_audio_agent.py b/tests/test_audio_agent.py deleted file mode 100644 index be1322be10..0000000000 --- a/tests/test_audio_agent.py +++ /dev/null @@ -1,39 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.stream.audio.pipelines import stt, tts -from dimos.stream.audio.utils import keepalive -from dimos.utils.threadpool import get_scheduler - - -def main(): - stt_node = stt() - - agent = OpenAIAgent( - dev_name="UnitreeExecutionAgent", - input_query_stream=stt_node.emit_text(), - system_query="You are a helpful robot named daneel that does my bidding", - pool_scheduler=get_scheduler(), - ) - - tts_node = tts() - tts_node.consume_text(agent.get_response_observable()) - - # Keep the main thread alive - keepalive() - - -if __name__ == "__main__": - main() diff --git a/tests/test_audio_robot_agent.py b/tests/test_audio_robot_agent.py deleted file mode 100644 index 68c523d0f9..0000000000 --- a/tests/test_audio_robot_agent.py +++ /dev/null @@ -1,52 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.stream.audio.pipelines import stt, tts -from dimos.stream.audio.utils import keepalive -from dimos.utils.threadpool import get_scheduler - - -def main(): - stt_node = stt() - tts_node = tts() - - robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - ) - - # Initialize agent with main thread pool scheduler - agent = OpenAIAgent( - dev_name="UnitreeExecutionAgent", - input_query_stream=stt_node.emit_text(), - system_query="You are a helpful robot named daneel that does my bidding", - pool_scheduler=get_scheduler(), - skills=robot.get_skills(), - ) - - tts_node.consume_text(agent.get_response_observable()) - - # Keep the main thread alive - keepalive() - - -if __name__ == "__main__": - main() diff --git a/tests/test_claude_agent_query.py b/tests/test_claude_agent_query.py deleted file mode 100644 index 548ed4351d..0000000000 --- a/tests/test_claude_agent_query.py +++ /dev/null @@ -1,28 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from dotenv import load_dotenv - -from dimos.agents_deprecated.claude_agent import ClaudeAgent - -# Load API key from environment -load_dotenv() - -# Create a ClaudeAgent instance -agent = ClaudeAgent(dev_name="test_agent", query="What is the capital of France?") - -# Use the stream_query method to get a response -response = agent.run_observable_query("What is the capital of France?").run() - -print(f"Response from Claude Agent: {response}") diff --git a/tests/test_claude_agent_skills_query.py b/tests/test_claude_agent_skills_query.py deleted file mode 100644 index c02e895bd7..0000000000 --- a/tests/test_claude_agent_skills_query.py +++ /dev/null @@ -1,134 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import threading - -from dotenv import load_dotenv -import reactivex as rx -import reactivex.operators as ops - -from dimos.agents_deprecated.claude_agent import ClaudeAgent -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.skills.kill_skill import KillSkill -from dimos.skills.navigation import BuildSemanticMap, GetPose, Navigate, NavigateToGoal -from dimos.skills.observe_stream import ObserveStream -from dimos.skills.speak import Speak -from dimos.skills.visual_navigation_skills import FollowHuman, NavigateToObject -from dimos.stream.audio.pipelines import stt, tts -from dimos.types.vector import Vector -from dimos.web.robot_web_interface import RobotWebInterface -from dimos.web.websocket_vis.server import WebsocketVis - -# Load API key from environment -load_dotenv() - -robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - mock_connection=False, -) - -# Create a subject for agent responses -agent_response_subject = rx.subject.Subject() -agent_response_stream = agent_response_subject.pipe(ops.share()) -local_planner_viz_stream = robot.local_planner_viz_stream.pipe(ops.share()) - -streams = { - "unitree_video": robot.get_ros_video_stream(), - "local_planner_viz": local_planner_viz_stream, -} -text_streams = { - "agent_responses": agent_response_stream, -} - -web_interface = RobotWebInterface(port=5555, text_streams=text_streams, **streams) - -stt_node = stt() - -# Create a ClaudeAgent instance -agent = ClaudeAgent( - dev_name="test_agent", - input_query_stream=stt_node.emit_text(), - # input_query_stream=web_interface.query_stream, - skills=robot.get_skills(), - system_query="""You are an agent controlling a virtual robot. When given a query, respond by using the appropriate tool calls if needed to execute commands on the robot. - -IMPORTANT INSTRUCTIONS: -1. Each tool call must include the exact function name and appropriate parameters -2. If a function needs parameters like 'distance' or 'angle', be sure to include them -3. If you're unsure which tool to use, choose the most appropriate one based on the user's query -4. Parse the user's instructions carefully to determine correct parameter values - -Example: If the user asks to move forward 1 meter, call the Move function with distance=1""", - model_name="claude-3-7-sonnet-latest", - thinking_budget_tokens=2000, -) - -tts_node = tts() -# tts_node.consume_text(agent.get_response_observable()) - -robot_skills = robot.get_skills() -robot_skills.add(ObserveStream) -robot_skills.add(KillSkill) -robot_skills.add(Navigate) -robot_skills.add(BuildSemanticMap) -robot_skills.add(NavigateToObject) -robot_skills.add(FollowHuman) -robot_skills.add(GetPose) -robot_skills.add(Speak) -robot_skills.add(NavigateToGoal) -robot_skills.create_instance("ObserveStream", robot=robot, agent=agent) -robot_skills.create_instance("KillSkill", robot=robot, skill_library=robot_skills) -robot_skills.create_instance("Navigate", robot=robot) -robot_skills.create_instance("BuildSemanticMap", robot=robot) -robot_skills.create_instance("NavigateToObject", robot=robot) -robot_skills.create_instance("FollowHuman", robot=robot) -robot_skills.create_instance("GetPose", robot=robot) -robot_skills.create_instance("NavigateToGoal", robot=robot) -robot_skills.create_instance("Speak", tts_node=tts_node) - -# Subscribe to agent responses and send them to the subject -agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) - -print("ObserveStream and Kill skills registered and ready for use") -print("Created memory.txt file") - -websocket_vis = WebsocketVis() -websocket_vis.start() -websocket_vis.connect(robot.global_planner.vis_stream()) - - -def msg_handler(msgtype, data): - if msgtype == "click": - target = Vector(data["position"]) - try: - robot.global_planner.set_goal(target) - except Exception as e: - print(f"Error setting goal: {e}") - return - - -def threaded_msg_handler(msgtype, data): - thread = threading.Thread(target=msg_handler, args=(msgtype, data)) - thread.daemon = True - thread.start() - - -websocket_vis.msg_handler = threaded_msg_handler - -web_interface.run() diff --git a/tests/test_command_pose_unitree.py b/tests/test_command_pose_unitree.py deleted file mode 100644 index f67b8c969f..0000000000 --- a/tests/test_command_pose_unitree.py +++ /dev/null @@ -1,82 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import sys - -# Add the parent directory to the Python path -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -import os -import time - -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills - -# Initialize robot -robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), ros_control=UnitreeROSControl(), skills=MyUnitreeSkills() -) - - -# Helper function to send pose commands continuously for a duration -def send_pose_for_duration(roll, pitch, yaw, duration, hz=10): - """Send the same pose command repeatedly at specified frequency for the given duration""" - start_time = time.time() - while time.time() - start_time < duration: - robot.pose_command(roll=roll, pitch=pitch, yaw=yaw) - time.sleep(1.0 / hz) # Sleep to achieve the desired frequency - - -# Test pose commands - -# First, make sure the robot is in a stable position -print("Setting default pose...") -send_pose_for_duration(0.0, 0.0, 0.0, 1) - -# Test roll angle (lean left/right) -print("Testing roll angle - lean right...") -send_pose_for_duration(0.5, 0.0, 0.0, 1.5) # Lean right - -print("Testing roll angle - lean left...") -send_pose_for_duration(-0.5, 0.0, 0.0, 1.5) # Lean left - -# Test pitch angle (lean forward/backward) -print("Testing pitch angle - lean forward...") -send_pose_for_duration(0.0, 0.5, 0.0, 1.5) # Lean forward - -print("Testing pitch angle - lean backward...") -send_pose_for_duration(0.0, -0.5, 0.0, 1.5) # Lean backward - -# Test yaw angle (rotate body without moving feet) -print("Testing yaw angle - rotate clockwise...") -send_pose_for_duration(0.0, 0.0, 0.5, 1.5) # Rotate body clockwise - -print("Testing yaw angle - rotate counterclockwise...") -send_pose_for_duration(0.0, 0.0, -0.5, 1.5) # Rotate body counterclockwise - -# Reset to default pose -print("Resetting to default pose...") -send_pose_for_duration(0.0, 0.0, 0.0, 2) - -print("Pose command test completed") - -# Keep the program running (optional) -print("Press Ctrl+C to exit") -try: - while True: - time.sleep(1) -except KeyboardInterrupt: - print("Test terminated by user") diff --git a/tests/test_header.py b/tests/test_header.py deleted file mode 100644 index 05e6c3e21c..0000000000 --- a/tests/test_header.py +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Test utilities for identifying caller information and path setup. - -This module provides functionality to determine which file called the current -script and sets up the Python path to include the parent directory, allowing -tests to import from the main application. -""" - -import inspect -import os -import sys - -# Add the parent directory of 'tests' to the Python path -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - - -def get_caller_info(): - """Identify the filename of the caller in the stack. - - Examines the call stack to find the first non-internal file that called - this module. Skips the current file and Python internal files. - - Returns: - str: The basename of the caller's filename, or "unknown" if not found. - """ - current_file = os.path.abspath(__file__) - - # Look through the call stack to find the first file that's not this one - for frame in inspect.stack()[1:]: - filename = os.path.abspath(frame.filename) - # Skip this file and Python internals - if filename != current_file and " 0: - best_score = max(grasp.get("score", 0.0) for grasp in grasps) - print(f" Best grasp score: {best_score:.3f}") - last_grasp_count = current_count - last_update_time = current_time - else: - # Show periodic "still waiting" message - if current_time - last_update_time > 10.0: - print(f" Still waiting for grasps... ({time.strftime('%H:%M:%S')})") - last_update_time = current_time - - time.sleep(1.0) # Check every second - - except Exception as e: - print(f" Error in grasp monitor: {e}") - time.sleep(2.0) - - -def main(): - """Test point cloud filtering with grasp generation using ManipulationPipeline.""" - print(" Testing point cloud filtering + grasp generation with ManipulationPipeline...") - - # Configuration - min_confidence = 0.6 - web_port = 5555 - grasp_server_url = "ws://18.224.39.74:8000/ws/grasp" - - try: - # Initialize ZED camera stream - zed_stream = ZEDCameraStream(resolution=sl.RESOLUTION.HD1080, fps=10) - - # Get camera intrinsics - camera_intrinsics_dict = zed_stream.get_camera_info() - camera_intrinsics = [ - camera_intrinsics_dict["fx"], - camera_intrinsics_dict["fy"], - camera_intrinsics_dict["cx"], - camera_intrinsics_dict["cy"], - ] - - # Create the concurrent manipulation pipeline WITH grasp generation - pipeline = ManipulationPipeline( - camera_intrinsics=camera_intrinsics, - min_confidence=min_confidence, - max_objects=10, - grasp_server_url=grasp_server_url, - enable_grasp_generation=True, # Enable grasp generation - ) - - # Create ZED stream - zed_frame_stream = zed_stream.create_stream().pipe(ops.share()) - - # Create concurrent processing streams - streams = pipeline.create_streams(zed_frame_stream) - detection_viz_stream = streams["detection_viz"] - pointcloud_viz_stream = streams["pointcloud_viz"] - grasps_stream = streams.get("grasps") # Get grasp stream if available - grasp_overlay_stream = streams.get("grasp_overlay") # Get grasp overlay stream if available - - except ImportError: - print("Error: ZED SDK not installed. Please install pyzed package.") - sys.exit(1) - except RuntimeError as e: - print(f"Error: Failed to open ZED camera: {e}") - sys.exit(1) - - try: - # Set up web interface with concurrent visualization streams - print("Initializing web interface...") - web_interface = RobotWebInterface( - port=web_port, - object_detection=detection_viz_stream, - pointcloud_stream=pointcloud_viz_stream, - grasp_overlay_stream=grasp_overlay_stream, - ) - - # Start grasp monitoring in background thread - grasp_monitor_thread = threading.Thread( - target=monitor_grasps, args=(pipeline,), daemon=True - ) - grasp_monitor_thread.start() - - print("\n Point Cloud + Grasp Generation Test Running:") - print(f" Web Interface: http://localhost:{web_port}") - print(" Object Detection View: RGB with bounding boxes") - print(" Point Cloud View: Depth with colored point clouds and 3D bounding boxes") - print(f" Confidence threshold: {min_confidence}") - print(f" Grasp server: {grasp_server_url}") - print(f" Available streams: {list(streams.keys())}") - print("\nPress Ctrl+C to stop the test\n") - - # Start web server (blocking call) - web_interface.run() - - except KeyboardInterrupt: - print("\nTest interrupted by user") - except Exception as e: - print(f"Error during test: {e}") - finally: - print("Cleaning up resources...") - if "zed_stream" in locals(): - zed_stream.cleanup() - if "pipeline" in locals(): - pipeline.cleanup() - print("Test completed") - - -if __name__ == "__main__": - main() diff --git a/tests/test_manipulation_perception_pipeline.py.py b/tests/test_manipulation_perception_pipeline.py.py deleted file mode 100644 index 6f8755d3da..0000000000 --- a/tests/test_manipulation_perception_pipeline.py.py +++ /dev/null @@ -1,165 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys -import threading -import time - -from pyzed import sl -from reactivex import operators as ops - -from dimos.manipulation.manip_aio_pipeline import ManipulationPipeline -from dimos.stream.stereo_camera_streams.zed import ZEDCameraStream -from dimos.web.robot_web_interface import RobotWebInterface - - -def monitor_grasps(pipeline): - """Monitor and print grasp updates in a separate thread.""" - print(" Grasp monitor started...") - - last_grasp_count = 0 - last_update_time = time.time() - - while True: - try: - # Get latest grasps using the getter function - grasps = pipeline.get_latest_grasps(timeout=0.5) - current_time = time.time() - - if grasps is not None: - current_count = len(grasps) - if current_count != last_grasp_count: - print(f" Grasps received: {current_count} (at {time.strftime('%H:%M:%S')})") - if current_count > 0: - best_score = max(grasp.get("score", 0.0) for grasp in grasps) - print(f" Best grasp score: {best_score:.3f}") - last_grasp_count = current_count - last_update_time = current_time - else: - # Show periodic "still waiting" message - if current_time - last_update_time > 10.0: - print(f" Still waiting for grasps... ({time.strftime('%H:%M:%S')})") - last_update_time = current_time - - time.sleep(1.0) # Check every second - - except Exception as e: - print(f" Error in grasp monitor: {e}") - time.sleep(2.0) - - -def main(): - """Test point cloud filtering with grasp generation using ManipulationPipeline.""" - print(" Testing point cloud filtering + grasp generation with ManipulationPipeline...") - - # Configuration - min_confidence = 0.6 - web_port = 5555 - grasp_server_url = "ws://18.224.39.74:8000/ws/grasp" - - try: - # Initialize ZED camera stream - zed_stream = ZEDCameraStream(resolution=sl.RESOLUTION.HD1080, fps=10) - - # Get camera intrinsics - camera_intrinsics_dict = zed_stream.get_camera_info() - camera_intrinsics = [ - camera_intrinsics_dict["fx"], - camera_intrinsics_dict["fy"], - camera_intrinsics_dict["cx"], - camera_intrinsics_dict["cy"], - ] - - # Create the concurrent manipulation pipeline WITH grasp generation - pipeline = ManipulationPipeline( - camera_intrinsics=camera_intrinsics, - min_confidence=min_confidence, - max_objects=10, - grasp_server_url=grasp_server_url, - enable_grasp_generation=True, # Enable grasp generation - ) - - # Create ZED stream - zed_frame_stream = zed_stream.create_stream().pipe(ops.share()) - - # Create concurrent processing streams - streams = pipeline.create_streams(zed_frame_stream) - detection_viz_stream = streams["detection_viz"] - pointcloud_viz_stream = streams["pointcloud_viz"] - grasps_stream = streams.get("grasps") # Get grasp stream if available - grasp_overlay_stream = streams.get("grasp_overlay") # Get grasp overlay stream if available - - except ImportError: - print("Error: ZED SDK not installed. Please install pyzed package.") - sys.exit(1) - except RuntimeError as e: - print(f"Error: Failed to open ZED camera: {e}") - sys.exit(1) - - try: - # Set up web interface with concurrent visualization streams - print("Initializing web interface...") - web_interface = RobotWebInterface( - port=web_port, - object_detection=detection_viz_stream, - pointcloud_stream=pointcloud_viz_stream, - grasp_overlay_stream=grasp_overlay_stream, - ) - - # Start grasp monitoring in background thread - grasp_monitor_thread = threading.Thread( - target=monitor_grasps, args=(pipeline,), daemon=True - ) - grasp_monitor_thread.start() - - print("\n Point Cloud + Grasp Generation Test Running:") - print(f" Web Interface: http://localhost:{web_port}") - print(" Object Detection View: RGB with bounding boxes") - print(" Point Cloud View: Depth with colored point clouds and 3D bounding boxes") - print(f" Confidence threshold: {min_confidence}") - print(f" Grasp server: {grasp_server_url}") - print(f" Available streams: {list(streams.keys())}") - print("\nPress Ctrl+C to stop the test\n") - - # Start web server (blocking call) - web_interface.run() - - except KeyboardInterrupt: - print("\nTest interrupted by user") - except Exception as e: - print(f"Error during test: {e}") - finally: - print("Cleaning up resources...") - if "zed_stream" in locals(): - zed_stream.cleanup() - if "pipeline" in locals(): - pipeline.cleanup() - print("Test completed") - - -if __name__ == "__main__": - main() diff --git a/tests/test_manipulation_pipeline_single_frame.py b/tests/test_manipulation_pipeline_single_frame.py deleted file mode 100644 index bbf2d5220f..0000000000 --- a/tests/test_manipulation_pipeline_single_frame.py +++ /dev/null @@ -1,246 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Test manipulation processor with direct visualization and grasp data output.""" - -import argparse -import os - -import cv2 -import matplotlib -import numpy as np - -from dimos.utils.data import get_data - -# Try to use TkAgg backend for live display, fallback to Agg if not available -try: - matplotlib.use("TkAgg") -except: - try: - matplotlib.use("Qt5Agg") - except: - matplotlib.use("Agg") # Fallback to non-interactive -import matplotlib.pyplot as plt -import open3d as o3d - -from dimos.manipulation.manip_aio_processer import ManipulationProcessor -from dimos.perception.grasp_generation.utils import create_grasp_overlay, visualize_grasps_3d -from dimos.perception.pointcloud.utils import ( - combine_object_pointclouds, - load_camera_matrix_from_yaml, - visualize_clustered_point_clouds, - visualize_pcd, - visualize_voxel_grid, -) -from dimos.utils.logging_config import setup_logger - -logger = setup_logger() - - -def load_first_frame(data_dir: str): - """Load first RGB-D frame and camera intrinsics.""" - # Load images - color_img = cv2.imread(os.path.join(data_dir, "color", "00000.png")) - color_img = cv2.cvtColor(color_img, cv2.COLOR_BGR2RGB) - - depth_img = cv2.imread(os.path.join(data_dir, "depth", "00000.png"), cv2.IMREAD_ANYDEPTH) - if depth_img.dtype == np.uint16: - depth_img = depth_img.astype(np.float32) / 1000.0 - # Load intrinsics - camera_matrix = load_camera_matrix_from_yaml(os.path.join(data_dir, "color_camera_info.yaml")) - intrinsics = [ - camera_matrix[0, 0], - camera_matrix[1, 1], - camera_matrix[0, 2], - camera_matrix[1, 2], - ] - - return color_img, depth_img, intrinsics - - -def create_point_cloud(color_img, depth_img, intrinsics): - """Create Open3D point cloud.""" - fx, fy, cx, cy = intrinsics - height, width = depth_img.shape - - o3d_intrinsics = o3d.camera.PinholeCameraIntrinsic(width, height, fx, fy, cx, cy) - color_o3d = o3d.geometry.Image(color_img) - depth_o3d = o3d.geometry.Image((depth_img * 1000).astype(np.uint16)) - - rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth( - color_o3d, depth_o3d, depth_scale=1000.0, convert_rgb_to_intensity=False - ) - - return o3d.geometry.PointCloud.create_from_rgbd_image(rgbd, o3d_intrinsics) - - -def run_processor(color_img, depth_img, intrinsics, grasp_server_url=None): - """Run processor and collect results.""" - processor_kwargs = { - "camera_intrinsics": intrinsics, - "enable_grasp_generation": True, - "enable_segmentation": True, - } - - if grasp_server_url: - processor_kwargs["grasp_server_url"] = grasp_server_url - - processor = ManipulationProcessor(**processor_kwargs) - - # Process frame without grasp generation - results = processor.process_frame(color_img, depth_img, generate_grasps=False) - - # Run grasp generation separately - grasps = processor.run_grasp_generation(results["all_objects"], results["full_pointcloud"]) - results["grasps"] = grasps - results["grasp_overlay"] = create_grasp_overlay(color_img, grasps, intrinsics) - - processor.cleanup() - return results - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument("--data-dir", default=get_data("rgbd_frames")) - parser.add_argument("--wait-time", type=float, default=5.0) - parser.add_argument( - "--grasp-server-url", - default="ws://18.224.39.74:8000/ws/grasp", - help="WebSocket URL for Dimensional Grasp server", - ) - args = parser.parse_args() - - # Load data - color_img, depth_img, intrinsics = load_first_frame(args.data_dir) - logger.info(f"Loaded images: color {color_img.shape}, depth {depth_img.shape}") - - # Run processor - results = run_processor(color_img, depth_img, intrinsics, args.grasp_server_url) - - # Print results summary - print(f"Processing time: {results.get('processing_time', 0):.3f}s") - print(f"Detection objects: {len(results.get('detected_objects', []))}") - print(f"All objects processed: {len(results.get('all_objects', []))}") - - # Print grasp summary - grasp_data = results["grasps"] - total_grasps = len(grasp_data) if isinstance(grasp_data, list) else 0 - best_score = max(grasp["score"] for grasp in grasp_data) if grasp_data else 0 - - print(f"Grasps: {total_grasps} total (best score: {best_score:.3f})") - - # Create visualizations - plot_configs = [] - if results["detection_viz"] is not None: - plot_configs.append(("detection_viz", "Object Detection")) - if results["segmentation_viz"] is not None: - plot_configs.append(("segmentation_viz", "Semantic Segmentation")) - if results["pointcloud_viz"] is not None: - plot_configs.append(("pointcloud_viz", "All Objects Point Cloud")) - if results["detected_pointcloud_viz"] is not None: - plot_configs.append(("detected_pointcloud_viz", "Detection Objects Point Cloud")) - if results["misc_pointcloud_viz"] is not None: - plot_configs.append(("misc_pointcloud_viz", "Misc/Background Points")) - if results["grasp_overlay"] is not None: - plot_configs.append(("grasp_overlay", "Grasp Overlay")) - - # Create subplot layout - num_plots = len(plot_configs) - if num_plots <= 3: - fig, axes = plt.subplots(1, num_plots, figsize=(6 * num_plots, 5)) - else: - rows = 2 - cols = (num_plots + 1) // 2 - _fig, axes = plt.subplots(rows, cols, figsize=(6 * cols, 5 * rows)) - - if num_plots == 1: - axes = [axes] - elif num_plots > 2: - axes = axes.flatten() - - # Plot each result - for i, (key, title) in enumerate(plot_configs): - axes[i].imshow(results[key]) - axes[i].set_title(title) - axes[i].axis("off") - - # Hide unused subplots - if num_plots > 3: - for i in range(num_plots, len(axes)): - axes[i].axis("off") - - plt.tight_layout() - plt.savefig("manipulation_results.png", dpi=150, bbox_inches="tight") - plt.show(block=True) - plt.close() - - point_clouds = [obj["point_cloud"] for obj in results["all_objects"]] - colors = [obj["color"] for obj in results["all_objects"]] - combined_pcd = combine_object_pointclouds(point_clouds, colors) - - # 3D Grasp visualization - if grasp_data: - # Convert grasp format to visualization format for 3D display - viz_grasps = [] - for grasp in grasp_data: - translation = grasp.get("translation", [0, 0, 0]) - rotation_matrix = np.array(grasp.get("rotation_matrix", np.eye(3).tolist())) - score = grasp.get("score", 0.0) - width = grasp.get("width", 0.08) - - viz_grasp = { - "translation": translation, - "rotation_matrix": rotation_matrix, - "width": width, - "score": score, - } - viz_grasps.append(viz_grasp) - - # Use unified 3D visualization - visualize_grasps_3d(combined_pcd, viz_grasps) - - # Visualize full point cloud - visualize_pcd( - results["full_pointcloud"], - window_name="Full Scene Point Cloud", - point_size=2.0, - show_coordinate_frame=True, - ) - - # Visualize all objects point cloud - visualize_pcd( - combined_pcd, - window_name="All Objects Point Cloud", - point_size=3.0, - show_coordinate_frame=True, - ) - - # Visualize misc clusters - visualize_clustered_point_clouds( - results["misc_clusters"], - window_name="Misc/Background Clusters (DBSCAN)", - point_size=3.0, - show_coordinate_frame=True, - ) - - # Visualize voxel grid - visualize_voxel_grid( - results["misc_voxel_grid"], - window_name="Misc/Background Voxel Grid", - show_coordinate_frame=True, - ) - - -if __name__ == "__main__": - main() diff --git a/tests/test_manipulation_pipeline_single_frame_lcm.py b/tests/test_manipulation_pipeline_single_frame_lcm.py deleted file mode 100644 index 1d2dc1ded7..0000000000 --- a/tests/test_manipulation_pipeline_single_frame_lcm.py +++ /dev/null @@ -1,419 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Test manipulation processor with LCM topic subscription.""" - -import argparse -import pickle -import threading - -import cv2 -import matplotlib -import numpy as np - -# Try to use TkAgg backend for live display, fallback to Agg if not available -try: - matplotlib.use("TkAgg") -except: - try: - matplotlib.use("Qt5Agg") - except: - matplotlib.use("Agg") # Fallback to non-interactive - -# LCM imports -import lcm -from lcm_msgs.sensor_msgs import CameraInfo as LCMCameraInfo, Image as LCMImage -import open3d as o3d - -from dimos.manipulation.manip_aio_processer import ManipulationProcessor -from dimos.utils.logging_config import setup_logger - -logger = setup_logger() - - -class LCMDataCollector: - """Collects one message from each required LCM topic.""" - - def __init__(self, lcm_url: str = "udpm://239.255.76.67:7667?ttl=1"): - self.lcm = lcm.LCM(lcm_url) - - # Data storage - self.rgb_data: np.ndarray | None = None - self.depth_data: np.ndarray | None = None - self.camera_intrinsics: list[float] | None = None - - # Synchronization - self.data_lock = threading.Lock() - self.data_ready_event = threading.Event() - - # Flags to track received messages - self.rgb_received = False - self.depth_received = False - self.camera_info_received = False - - # Subscribe to topics - self.lcm.subscribe("head_cam_rgb#sensor_msgs.Image", self._handle_rgb_message) - self.lcm.subscribe("head_cam_depth#sensor_msgs.Image", self._handle_depth_message) - self.lcm.subscribe("head_cam_info#sensor_msgs.CameraInfo", self._handle_camera_info_message) - - logger.info("LCM Data Collector initialized") - logger.info("Subscribed to topics:") - logger.info(" - head_cam_rgb#sensor_msgs.Image") - logger.info(" - head_cam_depth#sensor_msgs.Image") - logger.info(" - head_cam_info#sensor_msgs.CameraInfo") - - def _handle_rgb_message(self, channel: str, data: bytes): - """Handle RGB image message.""" - if self.rgb_received: - return # Already got one, ignore subsequent messages - - try: - msg = LCMImage.decode(data) - - # Convert message data to numpy array - if msg.encoding == "rgb8": - # RGB8 format: 3 bytes per pixel - rgb_array = np.frombuffer(msg.data[: msg.data_length], dtype=np.uint8) - rgb_image = rgb_array.reshape((msg.height, msg.width, 3)) - - with self.data_lock: - self.rgb_data = rgb_image - self.rgb_received = True - logger.info( - f"RGB message received: {msg.width}x{msg.height}, encoding: {msg.encoding}" - ) - self._check_all_data_received() - - else: - logger.warning(f"Unsupported RGB encoding: {msg.encoding}") - - except Exception as e: - logger.error(f"Error processing RGB message: {e}") - - def _handle_depth_message(self, channel: str, data: bytes): - """Handle depth image message.""" - if self.depth_received: - return # Already got one, ignore subsequent messages - - try: - msg = LCMImage.decode(data) - - # Convert message data to numpy array - if msg.encoding == "32FC1": - # 32FC1 format: 4 bytes (float32) per pixel - depth_array = np.frombuffer(msg.data[: msg.data_length], dtype=np.float32) - depth_image = depth_array.reshape((msg.height, msg.width)) - - with self.data_lock: - self.depth_data = depth_image - self.depth_received = True - logger.info( - f"Depth message received: {msg.width}x{msg.height}, encoding: {msg.encoding}" - ) - logger.info( - f"Depth range: {depth_image.min():.3f} - {depth_image.max():.3f} meters" - ) - self._check_all_data_received() - - else: - logger.warning(f"Unsupported depth encoding: {msg.encoding}") - - except Exception as e: - logger.error(f"Error processing depth message: {e}") - - def _handle_camera_info_message(self, channel: str, data: bytes): - """Handle camera info message.""" - if self.camera_info_received: - return # Already got one, ignore subsequent messages - - try: - msg = LCMCameraInfo.decode(data) - - # Extract intrinsics from K matrix: [fx, 0, cx, 0, fy, cy, 0, 0, 1] - K = msg.K - fx = K[0] # K[0,0] - fy = K[4] # K[1,1] - cx = K[2] # K[0,2] - cy = K[5] # K[1,2] - - intrinsics = [fx, fy, cx, cy] - - with self.data_lock: - self.camera_intrinsics = intrinsics - self.camera_info_received = True - logger.info(f"Camera info received: {msg.width}x{msg.height}") - logger.info(f"Intrinsics: fx={fx:.1f}, fy={fy:.1f}, cx={cx:.1f}, cy={cy:.1f}") - self._check_all_data_received() - - except Exception as e: - logger.error(f"Error processing camera info message: {e}") - - def _check_all_data_received(self): - """Check if all required data has been received.""" - if self.rgb_received and self.depth_received and self.camera_info_received: - logger.info("āœ… All required data received!") - self.data_ready_event.set() - - def wait_for_data(self, timeout: float = 30.0) -> bool: - """Wait for all data to be received.""" - logger.info("Waiting for RGB, depth, and camera info messages...") - - # Start LCM handling in a separate thread - lcm_thread = threading.Thread(target=self._lcm_handle_loop, daemon=True) - lcm_thread.start() - - # Wait for data with timeout - return self.data_ready_event.wait(timeout) - - def _lcm_handle_loop(self): - """LCM message handling loop.""" - try: - while not self.data_ready_event.is_set(): - self.lcm.handle_timeout(100) # 100ms timeout - except Exception as e: - logger.error(f"Error in LCM handling loop: {e}") - - def get_data(self): - """Get the collected data.""" - with self.data_lock: - return self.rgb_data, self.depth_data, self.camera_intrinsics - - -def create_point_cloud(color_img, depth_img, intrinsics): - """Create Open3D point cloud.""" - fx, fy, cx, cy = intrinsics - height, width = depth_img.shape - - o3d_intrinsics = o3d.camera.PinholeCameraIntrinsic(width, height, fx, fy, cx, cy) - color_o3d = o3d.geometry.Image(color_img) - depth_o3d = o3d.geometry.Image((depth_img * 1000).astype(np.uint16)) - - rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth( - color_o3d, depth_o3d, depth_scale=1000.0, convert_rgb_to_intensity=False - ) - - return o3d.geometry.PointCloud.create_from_rgbd_image(rgbd, o3d_intrinsics) - - -def run_processor(color_img, depth_img, intrinsics): - """Run processor and collect results.""" - # Create processor - processor = ManipulationProcessor( - camera_intrinsics=intrinsics, - grasp_server_url="ws://18.224.39.74:8000/ws/grasp", - enable_grasp_generation=False, - enable_segmentation=True, - ) - - # Process single frame directly - results = processor.process_frame(color_img, depth_img) - - # Debug: print available results - print(f"Available results: {list(results.keys())}") - - processor.cleanup() - - return results - - -def main(): - parser = argparse.ArgumentParser() - parser.add_argument( - "--lcm-url", default="udpm://239.255.76.67:7667?ttl=1", help="LCM URL for subscription" - ) - parser.add_argument( - "--timeout", type=float, default=30.0, help="Timeout in seconds to wait for messages" - ) - parser.add_argument( - "--save-images", action="store_true", help="Save received RGB and depth images to files" - ) - args = parser.parse_args() - - # Create data collector - collector = LCMDataCollector(args.lcm_url) - - # Wait for data - if not collector.wait_for_data(args.timeout): - logger.error(f"Timeout waiting for data after {args.timeout} seconds") - logger.error("Make sure Unity is running and publishing to the LCM topics") - return - - # Get the collected data - color_img, depth_img, intrinsics = collector.get_data() - - logger.info(f"Loaded images: color {color_img.shape}, depth {depth_img.shape}") - logger.info(f"Intrinsics: {intrinsics}") - - # Save images if requested - if args.save_images: - try: - cv2.imwrite("received_rgb.png", cv2.cvtColor(color_img, cv2.COLOR_RGB2BGR)) - # Save depth as 16-bit for visualization - depth_viz = (np.clip(depth_img * 1000, 0, 65535)).astype(np.uint16) - cv2.imwrite("received_depth.png", depth_viz) - logger.info("Saved received_rgb.png and received_depth.png") - except Exception as e: - logger.warning(f"Failed to save images: {e}") - - # Run processor - results = run_processor(color_img, depth_img, intrinsics) - - # Debug: Print what we received - print("\nāœ… Processor Results:") - print(f" Available results: {list(results.keys())}") - print(f" Processing time: {results.get('processing_time', 0):.3f}s") - - # Show timing breakdown if available - if "timing_breakdown" in results: - breakdown = results["timing_breakdown"] - print(" Timing breakdown:") - print(f" - Detection: {breakdown.get('detection', 0):.3f}s") - print(f" - Segmentation: {breakdown.get('segmentation', 0):.3f}s") - print(f" - Point cloud: {breakdown.get('pointcloud', 0):.3f}s") - print(f" - Misc extraction: {breakdown.get('misc_extraction', 0):.3f}s") - - # Print object information - detected_count = len(results.get("detected_objects", [])) - all_count = len(results.get("all_objects", [])) - - print(f" Detection objects: {detected_count}") - print(f" All objects processed: {all_count}") - - # Print misc clusters information - if results.get("misc_clusters"): - cluster_count = len(results["misc_clusters"]) - total_misc_points = sum( - len(np.asarray(cluster.points)) for cluster in results["misc_clusters"] - ) - print(f" Misc clusters: {cluster_count} clusters with {total_misc_points} total points") - else: - print(" Misc clusters: None") - - # Print grasp summary - if results.get("grasps"): - total_grasps = 0 - best_score = 0 - for grasp in results["grasps"]: - score = grasp.get("score", 0) - if score > best_score: - best_score = score - total_grasps += 1 - print(f" Grasps generated: {total_grasps} (best score: {best_score:.3f})") - else: - print(" Grasps: None generated") - - # Save results to pickle file - pickle_path = "manipulation_results.pkl" - print(f"\nSaving results to pickle file: {pickle_path}") - - def serialize_point_cloud(pcd): - """Convert Open3D PointCloud to serializable format.""" - if pcd is None: - return None - data = { - "points": np.asarray(pcd.points).tolist() if hasattr(pcd, "points") else [], - "colors": np.asarray(pcd.colors).tolist() - if hasattr(pcd, "colors") and pcd.colors - else [], - } - return data - - def serialize_voxel_grid(voxel_grid): - """Convert Open3D VoxelGrid to serializable format.""" - if voxel_grid is None: - return None - - # Extract voxel data - voxels = voxel_grid.get_voxels() - data = { - "voxel_size": voxel_grid.voxel_size, - "origin": np.asarray(voxel_grid.origin).tolist(), - "voxels": [ - ( - v.grid_index[0], - v.grid_index[1], - v.grid_index[2], - v.color[0], - v.color[1], - v.color[2], - ) - for v in voxels - ], - } - return data - - # Create a copy of results with non-picklable objects converted - pickle_data = { - "color_img": color_img, - "depth_img": depth_img, - "intrinsics": intrinsics, - "results": {}, - } - - # Convert and store all results, properly handling Open3D objects - for key, value in results.items(): - if key.endswith("_viz") or key in [ - "processing_time", - "timing_breakdown", - "detection2d_objects", - "segmentation2d_objects", - ]: - # These are already serializable - pickle_data["results"][key] = value - elif key == "full_pointcloud": - # Serialize PointCloud object - pickle_data["results"][key] = serialize_point_cloud(value) - print(f"Serialized {key}") - elif key == "misc_voxel_grid": - # Serialize VoxelGrid object - pickle_data["results"][key] = serialize_voxel_grid(value) - print(f"Serialized {key}") - elif key == "misc_clusters": - # List of PointCloud objects - if value: - serialized_clusters = [serialize_point_cloud(cluster) for cluster in value] - pickle_data["results"][key] = serialized_clusters - print(f"Serialized {key} ({len(serialized_clusters)} clusters)") - elif key == "detected_objects" or key == "all_objects": - # Objects with PointCloud attributes - serialized_objects = [] - for obj in value: - obj_dict = {k: v for k, v in obj.items() if k != "point_cloud"} - if "point_cloud" in obj: - obj_dict["point_cloud"] = serialize_point_cloud(obj.get("point_cloud")) - serialized_objects.append(obj_dict) - pickle_data["results"][key] = serialized_objects - print(f"Serialized {key} ({len(serialized_objects)} objects)") - else: - try: - # Try to pickle as is - pickle_data["results"][key] = value - print(f"Preserved {key} as is") - except (TypeError, ValueError): - print(f"Warning: Could not serialize {key}, skipping") - - with open(pickle_path, "wb") as f: - pickle.dump(pickle_data, f) - - print("Results saved successfully with all 3D data serialized!") - print(f"Pickled data keys: {list(pickle_data['results'].keys())}") - - # Visualization code has been moved to visualization_script.py - # The results have been pickled and can be loaded from there - print("\nVisualization code has been moved to visualization_script.py") - print("Run 'python visualization_script.py' to visualize the results") - - -if __name__ == "__main__": - main() diff --git a/tests/test_move_vel_unitree.py b/tests/test_move_vel_unitree.py deleted file mode 100644 index 4700c056aa..0000000000 --- a/tests/test_move_vel_unitree.py +++ /dev/null @@ -1,31 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import time - -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills - -# Initialize robot -robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), ros_control=UnitreeROSControl(), skills=MyUnitreeSkills() -) - -# Move the robot forward -robot.move_vel(x=0.5, y=0, yaw=0, duration=5) - -while True: - time.sleep(1) diff --git a/tests/test_navigate_to_object_robot.py b/tests/test_navigate_to_object_robot.py deleted file mode 100644 index 44c57011cc..0000000000 --- a/tests/test_navigate_to_object_robot.py +++ /dev/null @@ -1,138 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import os -import threading -import time - -from reactivex import operators as RxOps - -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.skills.navigation import Navigate -from dimos.utils.logging_config import setup_logger -from dimos.web.robot_web_interface import RobotWebInterface - -logger = setup_logger() - - -def parse_args(): - parser = argparse.ArgumentParser(description="Navigate to an object using Qwen vision.") - parser.add_argument( - "--object", - type=str, - default="chair", - help="Name of the object to navigate to (default: chair)", - ) - parser.add_argument( - "--distance", - type=float, - default=1.0, - help="Desired distance to maintain from object in meters (default: 0.8)", - ) - parser.add_argument( - "--timeout", - type=float, - default=60.0, - help="Maximum navigation time in seconds (default: 30.0)", - ) - return parser.parse_args() - - -def main(): - # Get command line arguments - args = parse_args() - object_name = args.object # Object to navigate to - distance = args.distance # Desired distance to object - timeout = args.timeout # Maximum navigation time - - print(f"Initializing Unitree Go2 robot for navigating to a {object_name}...") - - # Initialize the robot with ROS control and skills - robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - ) - - # Add and create instance of NavigateToObject skill - robot_skills = robot.get_skills() - robot_skills.add(Navigate) - robot_skills.create_instance("Navigate", robot=robot) - - # Set up tracking and visualization streams - object_tracking_stream = robot.object_tracking_stream - viz_stream = object_tracking_stream.pipe( - RxOps.share(), - RxOps.map(lambda x: x["viz_frame"] if x is not None else None), - RxOps.filter(lambda x: x is not None), - ) - - # The local planner visualization stream is created during robot initialization - local_planner_stream = robot.local_planner_viz_stream - - local_planner_stream = local_planner_stream.pipe( - RxOps.share(), - RxOps.map(lambda x: x if x is not None else None), - RxOps.filter(lambda x: x is not None), - ) - - try: - # Set up web interface - logger.info("Initializing web interface") - streams = { - # "robot_video": video_stream, - "object_tracking": viz_stream, - "local_planner": local_planner_stream, - } - - web_interface = RobotWebInterface(port=5555, **streams) - - # Wait for camera and tracking to initialize - print("Waiting for camera and tracking to initialize...") - time.sleep(3) - - def navigate_to_object(): - try: - result = robot_skills.call( - "Navigate", robot=robot, query=object_name, timeout=timeout - ) - print(f"Navigation result: {result}") - except Exception as e: - print(f"Error during navigation: {e}") - - navigate_thread = threading.Thread(target=navigate_to_object, daemon=True) - navigate_thread.start() - - print( - f"Navigating to {object_name} with desired distance {distance}m and timeout {timeout}s..." - ) - print("Web interface available at http://localhost:5555") - - # Start web server (blocking call) - web_interface.run() - - except KeyboardInterrupt: - print("\nInterrupted by user") - except Exception as e: - print(f"Error during navigation test: {e}") - finally: - print("Test completed") - robot.cleanup() - - -if __name__ == "__main__": - main() diff --git a/tests/test_navigation_skills.py b/tests/test_navigation_skills.py deleted file mode 100644 index b659715e98..0000000000 --- a/tests/test_navigation_skills.py +++ /dev/null @@ -1,265 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Simple test script for semantic / spatial memory skills. - -This script is a simplified version that focuses only on making the workflow work. - -Usage: - # Build and query in one run: - python simple_navigation_test.py --query "kitchen" - - # Skip build and just query: - python simple_navigation_test.py --skip-build --query "kitchen" -""" - -import argparse -import os -import threading -import time - -from reactivex import operators as RxOps - -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.skills.navigation import BuildSemanticMap, Navigate -from dimos.utils.logging_config import setup_logger -from dimos.web.robot_web_interface import RobotWebInterface - -# Setup logging -logger = setup_logger() - - -def parse_args(): - spatial_memory_dir = os.path.abspath( - os.path.join(os.path.dirname(__file__), "../assets/spatial_memory_vegas") - ) - - parser = argparse.ArgumentParser(description="Simple test for semantic map skills.") - parser.add_argument( - "--skip-build", - action="store_true", - help="Skip building the map and run navigation with existing semantic and visual memory", - ) - parser.add_argument( - "--query", type=str, default="kitchen", help="Text query for navigation (default: kitchen)" - ) - parser.add_argument( - "--db-path", - type=str, - default=os.path.join(spatial_memory_dir, "chromadb_data"), - help="Path to ChromaDB database", - ) - parser.add_argument("--justgo", type=str, help="Globally navigate to location") - parser.add_argument( - "--visual-memory-dir", - type=str, - default=spatial_memory_dir, - help="Directory for visual memory", - ) - parser.add_argument( - "--visual-memory-file", - type=str, - default="visual_memory.pkl", - help="Filename for visual memory", - ) - parser.add_argument( - "--port", type=int, default=5555, help="Port for web visualization interface" - ) - return parser.parse_args() - - -def build_map(robot, args): - logger.info("Starting to build spatial memory...") - - # Create the BuildSemanticMap skill - build_skill = BuildSemanticMap( - robot=robot, - db_path=args.db_path, - visual_memory_dir=args.visual_memory_dir, - visual_memory_file=args.visual_memory_file, - ) - - # Start the skill - build_skill() - - # Wait for user to press Ctrl+C - logger.info("Press Ctrl+C to stop mapping and proceed to navigation...") - - try: - while True: - time.sleep(0.5) - except KeyboardInterrupt: - logger.info("Stopping map building...") - - # Stop the skill - build_skill.stop() - logger.info("Map building complete.") - - -def query_map(robot, args): - logger.info(f"Querying spatial memory for: '{args.query}'") - - # Create the Navigate skill - nav_skill = Navigate( - robot=robot, - query=args.query, - db_path=args.db_path, - visual_memory_path=os.path.join(args.visual_memory_dir, args.visual_memory_file), - ) - - # Query the map - result = nav_skill() - - # Display the result - if isinstance(result, dict) and result.get("success", False): - position = result.get("position", (0, 0, 0)) - similarity = result.get("similarity", 0) - logger.info(f"Found '{args.query}' at position: {position}") - logger.info(f"Similarity score: {similarity:.4f}") - return position - - else: - logger.error(f"Navigation query failed: {result}") - return False - - -def setup_visualization(robot, port=5555): - """Set up visualization streams for the web interface""" - logger.info(f"Setting up visualization streams on port {port}") - - # Get video stream from robot - video_stream = robot.video_stream_ros.pipe( - RxOps.share(), - RxOps.map(lambda frame: frame), - RxOps.filter(lambda frame: frame is not None), - ) - - # Get local planner visualization stream - local_planner_stream = robot.local_planner_viz_stream.pipe( - RxOps.share(), - RxOps.map(lambda frame: frame), - RxOps.filter(lambda frame: frame is not None), - ) - - # Create web interface with streams - streams = {"robot_video": video_stream, "local_planner": local_planner_stream} - - web_interface = RobotWebInterface(port=port, **streams) - - return web_interface - - -def run_navigation(robot, target): - """Run navigation in a separate thread""" - logger.info(f"Starting navigation to target: {target}") - return robot.global_planner.set_goal(target) - - -def main(): - args = parse_args() - - # Ensure directories exist - if not args.justgo: - os.makedirs(args.db_path, exist_ok=True) - os.makedirs(args.visual_memory_dir, exist_ok=True) - - # Initialize robot - logger.info("Initializing robot...") - ros_control = UnitreeROSControl(node_name="simple_nav_test", mock_connection=False) - robot = UnitreeGo2(ros_control=ros_control, ip=os.getenv("ROBOT_IP"), skills=MyUnitreeSkills()) - - # Set up visualization - web_interface = None - try: - # Set up visualization first if the robot has video capabilities - if hasattr(robot, "video_stream_ros") and robot.video_stream_ros is not None: - web_interface = setup_visualization(robot, port=args.port) - # Start web interface in a separate thread - viz_thread = threading.Thread(target=web_interface.run, daemon=True) - viz_thread.start() - logger.info(f"Web visualization available at http://localhost:{args.port}") - # Wait a moment for the web interface to initialize - time.sleep(2) - - if args.justgo: - # Just go to the specified location - coords = list(map(float, args.justgo.split(","))) - logger.info(f"Navigating to coordinates: {coords}") - - # Run navigation - navigate_thread = threading.Thread( - target=lambda: run_navigation(robot, coords), daemon=True - ) - navigate_thread.start() - - # Wait for navigation to complete or user to interrupt - try: - while navigate_thread.is_alive(): - time.sleep(0.5) - logger.info("Navigation completed") - except KeyboardInterrupt: - logger.info("Navigation interrupted by user") - else: - # Build map if not skipped - if not args.skip_build: - build_map(robot, args) - - # Query the map - target = query_map(robot, args) - - if not target: - logger.error("No target found for navigation.") - return - - # Run navigation - navigate_thread = threading.Thread( - target=lambda: run_navigation(robot, target), daemon=True - ) - navigate_thread.start() - - # Wait for navigation to complete or user to interrupt - try: - while navigate_thread.is_alive(): - time.sleep(0.5) - logger.info("Navigation completed") - except KeyboardInterrupt: - logger.info("Navigation interrupted by user") - - # If web interface is running, keep the main thread alive - if web_interface: - logger.info( - "Navigation completed. Visualization still available. Press Ctrl+C to exit." - ) - try: - while True: - time.sleep(0.5) - except KeyboardInterrupt: - logger.info("Exiting...") - - finally: - # Clean up - logger.info("Cleaning up resources...") - try: - robot.cleanup() - except Exception as e: - logger.error(f"Error during cleanup: {e}") - - logger.info("Test completed successfully") - - -if __name__ == "__main__": - main() diff --git a/tests/test_object_detection_agent_data_query_stream.py b/tests/test_object_detection_agent_data_query_stream.py deleted file mode 100644 index e788e92c13..0000000000 --- a/tests/test_object_detection_agent_data_query_stream.py +++ /dev/null @@ -1,187 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import os -import sys -import threading - -from dotenv import load_dotenv -from reactivex import operators as ops - -from dimos.agents_deprecated.claude_agent import ClaudeAgent -from dimos.perception.detection2d.detic_2d_det import Detic2DDetector -from dimos.perception.object_detection_stream import ObjectDetectionStream -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.stream.video_provider import VideoProvider -from dimos.utils.reactive import backpressure -from dimos.web.robot_web_interface import RobotWebInterface - - -def parse_args(): - parser = argparse.ArgumentParser( - description="Test ObjectDetectionStream for object detection and position estimation" - ) - parser.add_argument( - "--mode", - type=str, - default="webcam", - choices=["robot", "webcam"], - help='Mode to run: "robot" or "webcam" (default: webcam)', - ) - return parser.parse_args() - - -load_dotenv() - - -def main(): - # Get command line arguments - args = parse_args() - - # Set default parameters - min_confidence = 0.6 - class_filter = None # No class filtering - web_port = 5555 - - # Initialize detector - detector = Detic2DDetector(vocabulary=None, threshold=min_confidence) - - # Initialize based on mode - if args.mode == "robot": - print("Initializing in robot mode...") - - # Get robot IP from environment - robot_ip = os.getenv("ROBOT_IP") - if not robot_ip: - print("Error: ROBOT_IP environment variable not set.") - sys.exit(1) - - # Initialize robot - robot = UnitreeGo2( - ip=robot_ip, - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - ) - # Create video stream from robot's camera - video_stream = robot.video_stream_ros - - # Initialize ObjectDetectionStream with robot and transform function - object_detector = ObjectDetectionStream( - camera_intrinsics=robot.camera_intrinsics, - min_confidence=min_confidence, - class_filter=class_filter, - transform_to_map=robot.ros_control.transform_pose, - detector=detector, - video_stream=video_stream, - ) - - else: # webcam mode - print("Initializing in webcam mode...") - - # Define camera intrinsics for the webcam - # These are approximate values for a typical 640x480 webcam - width, height = 640, 480 - focal_length_mm = 3.67 # mm (typical webcam) - sensor_width_mm = 4.8 # mm (1/4" sensor) - - # Calculate focal length in pixels - focal_length_x_px = width * focal_length_mm / sensor_width_mm - focal_length_y_px = height * focal_length_mm / sensor_width_mm - - # Principal point (center of image) - cx, cy = width / 2, height / 2 - - # Camera intrinsics in [fx, fy, cx, cy] format - camera_intrinsics = [focal_length_x_px, focal_length_y_px, cx, cy] - - # Initialize video provider and ObjectDetectionStream - video_provider = VideoProvider("test_camera", video_source=0) # Default camera - # Create video stream - video_stream = backpressure( - video_provider.capture_video_as_observable(realtime=True, fps=30) - ) - - object_detector = ObjectDetectionStream( - camera_intrinsics=camera_intrinsics, - min_confidence=min_confidence, - class_filter=class_filter, - detector=detector, - video_stream=video_stream, - ) - - # Set placeholder robot for cleanup - robot = None - - # Create visualization stream for web interface - viz_stream = object_detector.get_stream().pipe( - ops.share(), - ops.map(lambda x: x["viz_frame"] if x is not None else None), - ops.filter(lambda x: x is not None), - ) - - # Create object data observable for Agent using the formatted stream - object_data_stream = object_detector.get_formatted_stream().pipe( - ops.share(), ops.filter(lambda x: x is not None) - ) - - # Create stop event for clean shutdown - stop_event = threading.Event() - - try: - # Set up web interface - print("Initializing web interface...") - web_interface = RobotWebInterface(port=web_port, object_detection=viz_stream) - - agent = ClaudeAgent( - dev_name="test_agent", - # input_query_stream=stt_node.emit_text(), - input_query_stream=web_interface.query_stream, - input_data_stream=object_data_stream, - system_query="Tell me what you see", - model_name="claude-3-7-sonnet-latest", - thinking_budget_tokens=0, - ) - - # Print configuration information - print("\nObjectDetectionStream Test Running:") - print(f"Mode: {args.mode}") - print(f"Web Interface: http://localhost:{web_port}") - print("\nPress Ctrl+C to stop the test\n") - - # Start web server (blocking call) - web_interface.run() - - except KeyboardInterrupt: - print("\nTest interrupted by user") - except Exception as e: - print(f"Error during test: {e}") - finally: - # Clean up resources - print("Cleaning up resources...") - stop_event.set() - - if args.mode == "robot" and robot: - robot.cleanup() - elif args.mode == "webcam": - if "video_provider" in locals(): - video_provider.dispose_all() - - print("Test completed") - - -if __name__ == "__main__": - main() diff --git a/tests/test_object_detection_stream.py b/tests/test_object_detection_stream.py deleted file mode 100644 index 2d45c261d5..0000000000 --- a/tests/test_object_detection_stream.py +++ /dev/null @@ -1,239 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import os -import sys -import threading -import time -from typing import Any - -from dotenv import load_dotenv -from reactivex import operators as ops - -from dimos.perception.object_detection_stream import ObjectDetectionStream -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.stream.video_provider import VideoProvider -from dimos.utils.reactive import backpressure -from dimos.web.robot_web_interface import RobotWebInterface - - -def parse_args(): - parser = argparse.ArgumentParser( - description="Test ObjectDetectionStream for object detection and position estimation" - ) - parser.add_argument( - "--mode", - type=str, - default="webcam", - choices=["robot", "webcam"], - help='Mode to run: "robot" or "webcam" (default: webcam)', - ) - return parser.parse_args() - - -load_dotenv() - - -class ResultPrinter: - def __init__(self, print_interval: float = 1.0): - """ - Initialize a result printer that limits console output frequency. - - Args: - print_interval: Minimum time between console prints in seconds - """ - self.print_interval = print_interval - self.last_print_time = 0 - - def print_results(self, objects: list[dict[str, Any]]): - """Print object detection results to console with rate limiting.""" - current_time = time.time() - - # Only print results at the specified interval - if current_time - self.last_print_time >= self.print_interval: - self.last_print_time = current_time - - if not objects: - print("\n[No objects detected]") - return - - print("\n" + "=" * 50) - print(f"Detected {len(objects)} objects at {time.strftime('%H:%M:%S')}:") - print("=" * 50) - - for i, obj in enumerate(objects): - pos = obj["position"] - rot = obj["rotation"] - size = obj["size"] - - print( - f"{i + 1}. {obj['label']} (ID: {obj['object_id']}, Conf: {obj['confidence']:.2f})" - ) - print(f" Position: x={pos.x:.2f}, y={pos.y:.2f}, z={pos.z:.2f} m") - print(f" Rotation: yaw={rot.z:.2f} rad") - print(f" Size: width={size['width']:.2f}, height={size['height']:.2f} m") - print(f" Depth: {obj['depth']:.2f} m") - print("-" * 30) - - -def main(): - # Get command line arguments - args = parse_args() - - # Set up the result printer for console output - result_printer = ResultPrinter(print_interval=1.0) - - # Set default parameters - min_confidence = 0.6 - class_filter = None # No class filtering - web_port = 5555 - - # Initialize based on mode - if args.mode == "robot": - print("Initializing in robot mode...") - - # Get robot IP from environment - robot_ip = os.getenv("ROBOT_IP") - if not robot_ip: - print("Error: ROBOT_IP environment variable not set.") - sys.exit(1) - - # Initialize robot - robot = UnitreeGo2( - ip=robot_ip, - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - ) - # Create video stream from robot's camera - video_stream = robot.video_stream_ros - - # Initialize ObjectDetectionStream with robot and transform function - object_detector = ObjectDetectionStream( - camera_intrinsics=robot.camera_intrinsics, - min_confidence=min_confidence, - class_filter=class_filter, - transform_to_map=robot.ros_control.transform_pose, - detector=detector, - video_stream=video_stream, - disable_depth=False, - ) - - else: # webcam mode - print("Initializing in webcam mode...") - - # Define camera intrinsics for the webcam - # These are approximate values for a typical 640x480 webcam - width, height = 640, 480 - focal_length_mm = 3.67 # mm (typical webcam) - sensor_width_mm = 4.8 # mm (1/4" sensor) - - # Calculate focal length in pixels - focal_length_x_px = width * focal_length_mm / sensor_width_mm - focal_length_y_px = height * focal_length_mm / sensor_width_mm - - # Principal point (center of image) - cx, cy = width / 2, height / 2 - - # Camera intrinsics in [fx, fy, cx, cy] format - camera_intrinsics = [focal_length_x_px, focal_length_y_px, cx, cy] - - # Initialize video provider and ObjectDetectionStream - video_provider = VideoProvider("test_camera", video_source=0) # Default camera - # Create video stream - video_stream = backpressure( - video_provider.capture_video_as_observable(realtime=True, fps=30) - ) - - object_detector = ObjectDetectionStream( - camera_intrinsics=camera_intrinsics, - min_confidence=min_confidence, - class_filter=class_filter, - video_stream=video_stream, - disable_depth=False, - draw_masks=True, - ) - - # Set placeholder robot for cleanup - robot = None - - # Create visualization stream for web interface - viz_stream = object_detector.get_stream().pipe( - ops.share(), - ops.map(lambda x: x["viz_frame"] if x is not None else None), - ops.filter(lambda x: x is not None), - ) - - # Create stop event for clean shutdown - stop_event = threading.Event() - - # Define subscription callback to print results - def on_next(result): - if stop_event.is_set(): - return - - # Print detected objects to console - if "objects" in result: - result_printer.print_results(result["objects"]) - - def on_error(error): - print(f"Error in detection stream: {error}") - stop_event.set() - - def on_completed(): - print("Detection stream completed") - stop_event.set() - - try: - # Subscribe to the detection stream - subscription = object_detector.get_stream().subscribe( - on_next=on_next, on_error=on_error, on_completed=on_completed - ) - - # Set up web interface - print("Initializing web interface...") - web_interface = RobotWebInterface(port=web_port, object_detection=viz_stream) - - # Print configuration information - print("\nObjectDetectionStream Test Running:") - print(f"Mode: {args.mode}") - print(f"Web Interface: http://localhost:{web_port}") - print("\nPress Ctrl+C to stop the test\n") - - # Start web server (blocking call) - web_interface.run() - - except KeyboardInterrupt: - print("\nTest interrupted by user") - except Exception as e: - print(f"Error during test: {e}") - finally: - # Clean up resources - print("Cleaning up resources...") - stop_event.set() - - if subscription: - subscription.dispose() - - if args.mode == "robot" and robot: - robot.cleanup() - elif args.mode == "webcam": - if "video_provider" in locals(): - video_provider.dispose_all() - - print("Test completed") - - -if __name__ == "__main__": - main() diff --git a/tests/test_object_tracking_module.py b/tests/test_object_tracking_module.py deleted file mode 100755 index 24f0b7b675..0000000000 --- a/tests/test_object_tracking_module.py +++ /dev/null @@ -1,291 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Test script for Object Tracking module with ZED camera.""" - -import asyncio - -import cv2 -from dimos_lcm.sensor_msgs import CameraInfo - -from dimos import core -from dimos.hardware.zed_camera import ZEDModule -from dimos.msgs.geometry_msgs import PoseStamped - -# Import message types -from dimos.msgs.sensor_msgs import Image -from dimos.perception.object_tracker import ObjectTracking -from dimos.protocol import pubsub -from dimos.protocol.pubsub.lcmpubsub import LCM, Topic -from dimos.robot.foxglove_bridge import FoxgloveBridge -from dimos.utils.logging_config import setup_logger - -logger = setup_logger() - -# Suppress verbose Foxglove bridge warnings -import logging - -logging.getLogger("lcm_foxglove_bridge").setLevel(logging.ERROR) -logging.getLogger("FoxgloveServer").setLevel(logging.ERROR) - - -class TrackingVisualization: - """Handles visualization and user interaction for object tracking.""" - - def __init__(self): - self.lcm = LCM() - self.latest_color = None - - # Mouse interaction state - self.selecting_bbox = False - self.bbox_start = None - self.current_bbox = None - self.tracking_active = False - - # Subscribe to color image topic only - self.color_topic = Topic("/zed/color_image", Image) - - def start(self): - """Start the visualization node.""" - self.lcm.start() - - # Subscribe to color image only - self.lcm.subscribe(self.color_topic, self._on_color_image) - - logger.info("Visualization started, subscribed to color image topic") - - def _on_color_image(self, msg: Image, _: str): - """Handle color image messages.""" - try: - # Convert dimos Image to OpenCV format (BGR) for display - self.latest_color = msg.to_opencv() - logger.debug(f"Received color image: {msg.width}x{msg.height}, format: {msg.format}") - except Exception as e: - logger.error(f"Error processing color image: {e}") - - def mouse_callback(self, event, x, y, _, param): - """Handle mouse events for bbox selection.""" - tracker_module = param.get("tracker") - - if event == cv2.EVENT_LBUTTONDOWN: - self.selecting_bbox = True - self.bbox_start = (x, y) - self.current_bbox = None - - elif event == cv2.EVENT_MOUSEMOVE and self.selecting_bbox: - # Update current selection for visualization - x1, y1 = self.bbox_start - self.current_bbox = [min(x1, x), min(y1, y), max(x1, x), max(y1, y)] - - elif event == cv2.EVENT_LBUTTONUP and self.selecting_bbox: - self.selecting_bbox = False - if self.bbox_start: - x1, y1 = self.bbox_start - x2, y2 = x, y - # Ensure valid bbox - bbox = [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] - - # Check if bbox is valid (has area) - if bbox[2] > bbox[0] and bbox[3] > bbox[1]: - # Call track RPC on the tracker module - if tracker_module: - result = tracker_module.track(bbox) - logger.info(f"Tracking initialized: {result}") - self.tracking_active = True - self.current_bbox = None - - def draw_interface(self, frame): - """Draw UI elements on the frame.""" - # Draw bbox selection if in progress - if self.selecting_bbox and self.current_bbox: - x1, y1, x2, y2 = self.current_bbox - cv2.rectangle(frame, (x1, y1), (x2, y2), (0, 255, 255), 2) - - # Draw instructions - cv2.putText( - frame, - "Click and drag to select object", - (10, 30), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - (255, 255, 255), - 2, - ) - cv2.putText( - frame, - "Press 's' to stop tracking, 'q' to quit", - (10, 60), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - (255, 255, 255), - 2, - ) - - # Show tracking status - if self.tracking_active: - status = "Tracking Active" - color = (0, 255, 0) - else: - status = "No Target" - color = (0, 0, 255) - cv2.putText(frame, f"Status: {status}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) - - return frame - - -async def test_object_tracking_module(): - """Test object tracking with ZED camera module.""" - logger.info("Starting Object Tracking Module test") - - # Start Dimos - dimos = core.start(2) - - # Enable LCM auto-configuration - pubsub.lcm.autoconf() - - viz = None - tracker = None - zed = None - foxglove_bridge = None - - try: - # Deploy ZED module - logger.info("Deploying ZED module...") - zed = dimos.deploy( - ZEDModule, - camera_id=0, - resolution="HD720", - depth_mode="NEURAL", - fps=30, - enable_tracking=True, - publish_rate=15.0, - frame_id="zed_camera_link", - ) - - # Configure ZED LCM transports - zed.color_image.transport = core.LCMTransport("/zed/color_image", Image) - zed.depth_image.transport = core.LCMTransport("/zed/depth_image", Image) - zed.camera_info.transport = core.LCMTransport("/zed/camera_info", CameraInfo) - zed.pose.transport = core.LCMTransport("/zed/pose", PoseStamped) - - # Start ZED to begin publishing - zed.start() - await asyncio.sleep(2) # Wait for camera to initialize - - # Deploy Object Tracking module - logger.info("Deploying Object Tracking module...") - tracker = dimos.deploy( - ObjectTracking, - camera_intrinsics=None, # Will get from camera_info topic - reid_threshold=5, - reid_fail_tolerance=10, - frame_id="zed_camera_link", - ) - - # Configure tracking LCM transports - tracker.color_image.transport = core.LCMTransport("/zed/color_image", Image) - tracker.depth.transport = core.LCMTransport("/zed/depth_image", Image) - tracker.camera_info.transport = core.LCMTransport("/zed/camera_info", CameraInfo) - - # Configure output transports - from dimos_lcm.vision_msgs import Detection2DArray, Detection3DArray - - tracker.detection2darray.transport = core.LCMTransport( - "/detection2darray", Detection2DArray - ) - tracker.detection3darray.transport = core.LCMTransport( - "/detection3darray", Detection3DArray - ) - tracker.tracked_overlay.transport = core.LCMTransport("/tracked_overlay", Image) - - # Connect inputs - tracker.color_image.connect(zed.color_image) - tracker.depth.connect(zed.depth_image) - tracker.camera_info.connect(zed.camera_info) - - # Start tracker - tracker.start() - - # Create visualization - viz = TrackingVisualization() - viz.start() - - # Start Foxglove bridge for visualization - foxglove_bridge = FoxgloveBridge() - foxglove_bridge.acquire() - - # Give modules time to initialize - await asyncio.sleep(1) - - # Create OpenCV window and set mouse callback - cv2.namedWindow("Object Tracking") - cv2.setMouseCallback("Object Tracking", viz.mouse_callback, {"tracker": tracker}) - - logger.info("System ready. Click and drag to select an object to track.") - logger.info("Foxglove visualization available at http://localhost:8765") - - # Main visualization loop - while True: - # Get the color frame to display - if viz.latest_color is not None: - display_frame = viz.latest_color.copy() - else: - # Wait for frames - await asyncio.sleep(0.03) - continue - - # Draw UI elements - display_frame = viz.draw_interface(display_frame) - - # Show frame - cv2.imshow("Object Tracking", display_frame) - - # Handle keyboard input - key = cv2.waitKey(1) & 0xFF - if key == ord("q"): - logger.info("Quit requested") - break - elif key == ord("s"): - # Stop tracking - if tracker: - tracker.stop_track() - viz.tracking_active = False - logger.info("Tracking stopped") - - await asyncio.sleep(0.03) # ~30 FPS - - except Exception as e: - logger.error(f"Error in test: {e}") - import traceback - - traceback.print_exc() - - finally: - # Clean up - cv2.destroyAllWindows() - - if tracker: - tracker.stop() - if zed: - zed.stop() - if foxglove_bridge: - foxglove_bridge.release() - - dimos.close() - logger.info("Test completed") - - -if __name__ == "__main__": - asyncio.run(test_object_tracking_module()) diff --git a/tests/test_object_tracking_webcam.py b/tests/test_object_tracking_webcam.py deleted file mode 100644 index 8fcfe7bacd..0000000000 --- a/tests/test_object_tracking_webcam.py +++ /dev/null @@ -1,219 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import queue -import threading - -import cv2 - -from dimos.perception.object_tracker import ObjectTrackingStream -from dimos.stream.video_provider import VideoProvider - -# Global variables for bounding box selection -selecting_bbox = False -bbox_points = [] -current_bbox = None -tracker_initialized = False -object_size = 0.30 # Hardcoded object size in meters (adjust based on your tracking target) - - -def mouse_callback(event, x, y, flags, param): - global selecting_bbox, bbox_points, current_bbox, tracker_initialized, tracker_stream - - if event == cv2.EVENT_LBUTTONDOWN: - # Start bbox selection - selecting_bbox = True - bbox_points = [(x, y)] - current_bbox = None - tracker_initialized = False - - elif event == cv2.EVENT_MOUSEMOVE and selecting_bbox: - # Update current selection for visualization - current_bbox = [bbox_points[0][0], bbox_points[0][1], x, y] - - elif event == cv2.EVENT_LBUTTONUP: - # End bbox selection - selecting_bbox = False - if bbox_points: - bbox_points.append((x, y)) - x1, y1 = bbox_points[0] - x2, y2 = bbox_points[1] - # Ensure x1,y1 is top-left and x2,y2 is bottom-right - current_bbox = [min(x1, x2), min(y1, y2), max(x1, x2), max(y1, y2)] - # Add the bbox to the tracking queue - if param.get("bbox_queue") and not tracker_initialized: - param["bbox_queue"].put((current_bbox, object_size)) - tracker_initialized = True - - -def main(): - global tracker_initialized - - # Create queues for thread communication - frame_queue = queue.Queue(maxsize=5) - bbox_queue = queue.Queue() - stop_event = threading.Event() - - # Logitech C920e camera parameters at 480p - # Convert physical parameters to pixel-based intrinsics - width, height = 640, 480 - focal_length_mm = 3.67 # mm - sensor_width_mm = 4.8 # mm (1/4" sensor) - sensor_height_mm = 3.6 # mm - - # Calculate focal length in pixels - focal_length_x_px = width * focal_length_mm / sensor_width_mm - focal_length_y_px = height * focal_length_mm / sensor_height_mm - - # Principal point (assuming center of image) - cx = width / 2 - cy = height / 2 - - # Final camera intrinsics in [fx, fy, cx, cy] format - camera_intrinsics = [focal_length_x_px, focal_length_y_px, cx, cy] - - # Initialize video provider and object tracking stream - video_provider = VideoProvider("test_camera", video_source=0) - tracker_stream = ObjectTrackingStream( - camera_intrinsics=camera_intrinsics, - camera_pitch=0.0, # Adjust if your camera is tilted - camera_height=0.5, # Height of camera from ground in meters (adjust as needed) - ) - - # Create video stream - video_stream = video_provider.capture_video_as_observable(realtime=True, fps=30) - tracking_stream = tracker_stream.create_stream(video_stream) - - # Define callbacks for the tracking stream - def on_next(result): - if stop_event.is_set(): - return - - # Get the visualization frame - viz_frame = result["viz_frame"] - - # If we're selecting a bbox, draw the current selection - if selecting_bbox and current_bbox is not None: - x1, y1, x2, y2 = current_bbox - cv2.rectangle(viz_frame, (x1, y1), (x2, y2), (0, 255, 255), 2) - - # Add instructions - cv2.putText( - viz_frame, - "Click and drag to select object", - (10, 30), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - (255, 255, 255), - 2, - ) - cv2.putText( - viz_frame, - f"Object size: {object_size:.2f}m", - (10, 60), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - (255, 255, 255), - 2, - ) - - # Show tracking status - status = "Tracking" if tracker_initialized else "Not tracking" - cv2.putText( - viz_frame, - f"Status: {status}", - (10, 90), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - (0, 255, 0) if tracker_initialized else (0, 0, 255), - 2, - ) - - # Put frame in queue for main thread to display - try: - frame_queue.put_nowait(viz_frame) - except queue.Full: - # Skip frame if queue is full - pass - - def on_error(error): - print(f"Error: {error}") - stop_event.set() - - def on_completed(): - print("Stream completed") - stop_event.set() - - # Start the subscription - subscription = None - - try: - # Subscribe to start processing in background thread - subscription = tracking_stream.subscribe( - on_next=on_next, on_error=on_error, on_completed=on_completed - ) - - print("Object tracking started. Click and drag to select an object. Press 'q' to exit.") - - # Create window and set mouse callback - cv2.namedWindow("Object Tracker") - cv2.setMouseCallback("Object Tracker", mouse_callback, {"bbox_queue": bbox_queue}) - - # Main thread loop for displaying frames and handling bbox selection - while not stop_event.is_set(): - # Check if there's a new bbox to track - try: - new_bbox, size = bbox_queue.get_nowait() - print(f"New object selected: {new_bbox}, size: {size}m") - # Initialize tracker with the new bbox and size - tracker_stream.track(new_bbox, size=size) - except queue.Empty: - pass - - try: - # Get frame with timeout - viz_frame = frame_queue.get(timeout=1.0) - - # Display the frame - cv2.imshow("Object Tracker", viz_frame) - # Check for exit key - if cv2.waitKey(1) & 0xFF == ord("q"): - print("Exit key pressed") - break - - except queue.Empty: - # No frame available, check if we should continue - if cv2.waitKey(1) & 0xFF == ord("q"): - print("Exit key pressed") - break - continue - - except KeyboardInterrupt: - print("\nKeyboard interrupt received. Stopping...") - finally: - # Signal threads to stop - stop_event.set() - - # Clean up resources - if subscription: - subscription.dispose() - - video_provider.dispose_all() - tracker_stream.cleanup() - cv2.destroyAllWindows() - print("Cleanup complete") - - -if __name__ == "__main__": - main() diff --git a/tests/test_object_tracking_with_qwen.py b/tests/test_object_tracking_with_qwen.py deleted file mode 100644 index e8fcd86a2b..0000000000 --- a/tests/test_object_tracking_with_qwen.py +++ /dev/null @@ -1,209 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import queue -import threading - -import cv2 - -from dimos.models.qwen.video_query import get_bbox_from_qwen -from dimos.perception.object_tracker import ObjectTrackingStream -from dimos.stream.video_provider import VideoProvider - -# Global variables for tracking control -object_size = 0.30 # Hardcoded object size in meters (adjust based on your tracking target) -tracking_object_name = "object" # Will be updated by Qwen -object_name = "hairbrush" # Example object name for Qwen - -global tracker_initialized, detection_in_progress - -# Create queues for thread communication -frame_queue = queue.Queue(maxsize=5) -stop_event = threading.Event() - -# Logitech C920e camera parameters at 480p -width, height = 640, 480 -focal_length_mm = 3.67 # mm -sensor_width_mm = 4.8 # mm (1/4" sensor) -sensor_height_mm = 3.6 # mm - -# Calculate focal length in pixels -focal_length_x_px = width * focal_length_mm / sensor_width_mm -focal_length_y_px = height * focal_length_mm / sensor_height_mm -cx, cy = width / 2, height / 2 - -# Final camera intrinsics in [fx, fy, cx, cy] format -camera_intrinsics = [focal_length_x_px, focal_length_y_px, cx, cy] - -# Initialize video provider and object tracking stream -video_provider = VideoProvider("webcam", video_source=0) -tracker_stream = ObjectTrackingStream( - camera_intrinsics=camera_intrinsics, camera_pitch=0.0, camera_height=0.5 -) - -# Create video streams -video_stream = video_provider.capture_video_as_observable(realtime=True, fps=10) -tracking_stream = tracker_stream.create_stream(video_stream) - -# Check if display is available -if "DISPLAY" not in os.environ: - raise RuntimeError( - "No display available. Please set DISPLAY environment variable or run in headless mode." - ) - - -# Define callbacks for the tracking stream -def on_next(result): - global tracker_initialized, detection_in_progress - if stop_event.is_set(): - return - - # Get the visualization frame - viz_frame = result["viz_frame"] - - # Add information to the visualization - cv2.putText( - viz_frame, - f"Tracking {tracking_object_name}", - (10, 30), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - (255, 255, 255), - 2, - ) - cv2.putText( - viz_frame, - f"Object size: {object_size:.2f}m", - (10, 60), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - (255, 255, 255), - 2, - ) - - # Show tracking status - status = "Tracking" if tracker_initialized else "Waiting for detection" - color = (0, 255, 0) if tracker_initialized else (0, 0, 255) - cv2.putText(viz_frame, f"Status: {status}", (10, 90), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2) - - # If detection is in progress, show a message - if detection_in_progress: - cv2.putText( - viz_frame, "Querying Qwen...", (10, 120), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 0, 255), 2 - ) - - # Put frame in queue for main thread to display - try: - frame_queue.put_nowait(viz_frame) - except queue.Full: - pass - - -def on_error(error): - print(f"Error: {error}") - stop_event.set() - - -def on_completed(): - print("Stream completed") - stop_event.set() - - -# Start the subscription -subscription = None - -try: - # Initialize global flags - tracker_initialized = False - detection_in_progress = False - # Subscribe to start processing in background thread - subscription = tracking_stream.subscribe( - on_next=on_next, on_error=on_error, on_completed=on_completed - ) - - print("Object tracking with Qwen started. Press 'q' to exit.") - print("Waiting for initial object detection...") - - # Main thread loop for displaying frames and updating tracking - while not stop_event.is_set(): - # Check if we need to update tracking - - if not detection_in_progress: - detection_in_progress = True - print("Requesting object detection from Qwen...") - - print("detection_in_progress: ", detection_in_progress) - print("tracker_initialized: ", tracker_initialized) - - def detection_task(): - global detection_in_progress, tracker_initialized, tracking_object_name, object_size - try: - result = get_bbox_from_qwen(video_stream, object_name=object_name) - print(f"Got result from Qwen: {result}") - - if result: - bbox, size = result - print(f"Detected object at {bbox} with size {size}") - tracker_stream.track(bbox, size=size) - tracker_initialized = True - return - - print("No object detected by Qwen") - tracker_initialized = False - tracker_stream.stop_track() - - except Exception as e: - print(f"Error in update_tracking: {e}") - tracker_initialized = False - tracker_stream.stop_track() - finally: - detection_in_progress = False - - # Run detection task in a separate thread - threading.Thread(target=detection_task, daemon=True).start() - - try: - # Get frame with timeout - viz_frame = frame_queue.get(timeout=0.1) - - # Display the frame - cv2.imshow("Object Tracking with Qwen", viz_frame) - - # Check for exit key - if cv2.waitKey(1) & 0xFF == ord("q"): - print("Exit key pressed") - break - - except queue.Empty: - # No frame available, check if we should continue - if cv2.waitKey(1) & 0xFF == ord("q"): - print("Exit key pressed") - break - continue - -except KeyboardInterrupt: - print("\nKeyboard interrupt received. Stopping...") -finally: - # Signal threads to stop - stop_event.set() - - # Clean up resources - if subscription: - subscription.dispose() - - video_provider.dispose_all() - tracker_stream.cleanup() - cv2.destroyAllWindows() - print("Cleanup complete") diff --git a/tests/test_person_following_robot.py b/tests/test_person_following_robot.py deleted file mode 100644 index a9faa663ce..0000000000 --- a/tests/test_person_following_robot.py +++ /dev/null @@ -1,114 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import time - -from reactivex import operators as RxOps - -from dimos.models.qwen.video_query import query_single_frame_observable -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.utils.logging_config import setup_logger -from dimos.web.robot_web_interface import RobotWebInterface - -logger = setup_logger() - - -def main(): - # Hardcoded parameters - timeout = 60.0 # Maximum time to follow a person (seconds) - distance = 0.5 # Desired distance to maintain from target (meters) - - print("Initializing Unitree Go2 robot...") - - # Initialize the robot with ROS control and skills - robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - ) - - tracking_stream = robot.person_tracking_stream - viz_stream = tracking_stream.pipe( - RxOps.share(), - RxOps.map(lambda x: x["viz_frame"] if x is not None else None), - RxOps.filter(lambda x: x is not None), - ) - video_stream = robot.get_ros_video_stream() - - try: - # Set up web interface - logger.info("Initializing web interface") - streams = {"unitree_video": video_stream, "person_tracking": viz_stream} - - web_interface = RobotWebInterface(port=5555, **streams) - - # Wait for camera and tracking to initialize - print("Waiting for camera and tracking to initialize...") - time.sleep(5) - # Get initial point from Qwen - - max_retries = 5 - delay = 3 - - for attempt in range(max_retries): - try: - qwen_point = eval( - query_single_frame_observable( - video_stream, - "Look at this frame and point to the person shirt. Return ONLY their center coordinates as a tuple (x,y).", - ) - .pipe(RxOps.take(1)) - .run() - ) # Get first response and convert string tuple to actual tuple - logger.info(f"Found person at coordinates {qwen_point}") - break # If successful, break out of retry loop - except Exception as e: - if attempt < max_retries - 1: - logger.error( - f"Person not found. Attempt {attempt + 1}/{max_retries} failed. Retrying in {delay}s... Error: {e}" - ) - time.sleep(delay) - else: - logger.error(f"Person not found after {max_retries} attempts. Last error: {e}") - return - - # Start following human in a separate thread - import threading - - follow_thread = threading.Thread( - target=lambda: robot.follow_human(timeout=timeout, distance=distance, point=qwen_point), - daemon=True, - ) - follow_thread.start() - - print(f"Following human at point {qwen_point} for {timeout} seconds...") - print("Web interface available at http://localhost:5555") - - # Start web server (blocking call) - web_interface.run() - - except KeyboardInterrupt: - print("\nInterrupted by user") - except Exception as e: - print(f"Error during test: {e}") - finally: - print("Test completed") - robot.cleanup() - - -if __name__ == "__main__": - main() diff --git a/tests/test_person_following_webcam.py b/tests/test_person_following_webcam.py deleted file mode 100644 index 20a6a7ca4d..0000000000 --- a/tests/test_person_following_webcam.py +++ /dev/null @@ -1,227 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import queue -import threading - -import cv2 -import numpy as np - -from dimos.perception.person_tracker import PersonTrackingStream -from dimos.perception.visual_servoing import VisualServoing -from dimos.stream.video_provider import VideoProvider - - -def main(): - # Create a queue for thread communication (limit to prevent memory issues) - frame_queue = queue.Queue(maxsize=5) - result_queue = queue.Queue(maxsize=5) # For tracking results - stop_event = threading.Event() - - # Logitech C920e camera parameters at 480p - # Convert physical parameters to intrinsics [fx, fy, cx, cy] - resolution = (640, 480) # 480p resolution - focal_length_mm = 3.67 # mm - sensor_size_mm = (4.8, 3.6) # mm (1/4" sensor) - - # Calculate focal length in pixels - fx = (resolution[0] * focal_length_mm) / sensor_size_mm[0] - fy = (resolution[1] * focal_length_mm) / sensor_size_mm[1] - - # Principal point (typically at image center) - cx = resolution[0] / 2 - cy = resolution[1] / 2 - - # Camera intrinsics in [fx, fy, cx, cy] format - camera_intrinsics = [fx, fy, cx, cy] - - # Camera mounted parameters - camera_pitch = np.deg2rad(-5) # negative for downward pitch - camera_height = 1.4 # meters - - # Initialize video provider and person tracking stream - video_provider = VideoProvider("test_camera", video_source=0) - person_tracker = PersonTrackingStream( - camera_intrinsics=camera_intrinsics, camera_pitch=camera_pitch, camera_height=camera_height - ) - - # Create streams - video_stream = video_provider.capture_video_as_observable(realtime=False, fps=20) - person_tracking_stream = person_tracker.create_stream(video_stream) - - # Create visual servoing object - visual_servoing = VisualServoing( - tracking_stream=person_tracking_stream, - max_linear_speed=0.5, - max_angular_speed=0.75, - desired_distance=2.5, - ) - - # Track if we have selected a person to follow - selected_point = None - tracking_active = False - - # Define callbacks for the tracking stream - def on_next(result): - if stop_event.is_set(): - return - - # Get the visualization frame which already includes person detections - # with bounding boxes, tracking IDs, and distance/angle information - viz_frame = result["viz_frame"] - - # Store the result for the main thread to use with visual servoing - try: - result_queue.put_nowait(result) - except queue.Full: - # Skip if queue is full - pass - - # Put frame in queue for main thread to display (non-blocking) - try: - frame_queue.put_nowait(viz_frame) - except queue.Full: - # Skip frame if queue is full - pass - - def on_error(error): - print(f"Error: {error}") - stop_event.set() - - def on_completed(): - print("Stream completed") - stop_event.set() - - # Mouse callback for selecting a person to track - def mouse_callback(event, x, y, flags, param): - nonlocal selected_point, tracking_active - - if event == cv2.EVENT_LBUTTONDOWN: - # Store the clicked point - selected_point = (x, y) - tracking_active = False # Will be set to True if start_tracking succeeds - print(f"Selected point: {selected_point}") - - # Start the subscription - subscription = None - - try: - # Subscribe to start processing in background thread - subscription = person_tracking_stream.subscribe( - on_next=on_next, on_error=on_error, on_completed=on_completed - ) - - print("Person tracking visualization started.") - print("Click on a person to start visual servoing. Press 'q' to exit.") - - # Set up mouse callback - cv2.namedWindow("Person Tracking") - cv2.setMouseCallback("Person Tracking", mouse_callback) - - # Main thread loop for displaying frames - while not stop_event.is_set(): - try: - # Get frame with timeout (allows checking stop_event periodically) - frame = frame_queue.get(timeout=1.0) - - # Call the visual servoing if we have a selected point - if selected_point is not None: - # If not actively tracking, try to start tracking - if not tracking_active: - tracking_active = visual_servoing.start_tracking(point=selected_point) - if not tracking_active: - print("Failed to start tracking") - selected_point = None - - # If tracking is active, update tracking - if tracking_active: - servoing_result = visual_servoing.updateTracking() - - # Display visual servoing output on the frame - linear_vel = servoing_result.get("linear_vel", 0.0) - angular_vel = servoing_result.get("angular_vel", 0.0) - running = visual_servoing.running - - status_color = ( - (0, 255, 0) if running else (0, 0, 255) - ) # Green if running, red if not - - # Add velocity text to frame - cv2.putText( - frame, - f"Linear: {linear_vel:.2f} m/s", - (10, 30), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - status_color, - 2, - ) - cv2.putText( - frame, - f"Angular: {angular_vel:.2f} rad/s", - (10, 60), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - status_color, - 2, - ) - cv2.putText( - frame, - f"Tracking: {'ON' if running else 'OFF'}", - (10, 90), - cv2.FONT_HERSHEY_SIMPLEX, - 0.7, - status_color, - 2, - ) - - # If tracking is lost, reset selected_point and tracking_active - if not running: - selected_point = None - tracking_active = False - - # Display the frame in main thread - cv2.imshow("Person Tracking", frame) - - # Check for exit key - if cv2.waitKey(1) & 0xFF == ord("q"): - print("Exit key pressed") - break - - except queue.Empty: - # No frame available, check if we should continue - if cv2.waitKey(1) & 0xFF == ord("q"): - print("Exit key pressed") - break - continue - - except KeyboardInterrupt: - print("\nKeyboard interrupt received. Stopping...") - finally: - # Signal threads to stop - stop_event.set() - - # Clean up resources - if subscription: - subscription.dispose() - - visual_servoing.cleanup() - video_provider.dispose_all() - person_tracker.cleanup() - cv2.destroyAllWindows() - print("Cleanup complete") - - -if __name__ == "__main__": - main() diff --git a/tests/test_pick_and_place_module.py b/tests/test_pick_and_place_module.py deleted file mode 100644 index ef1858c6b6..0000000000 --- a/tests/test_pick_and_place_module.py +++ /dev/null @@ -1,355 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Run script for Piper Arm robot with pick and place functionality. -Subscribes to visualization images and handles mouse/keyboard input. -""" - -import asyncio -import sys -import threading -import time - -import cv2 -import numpy as np - -try: - import pyzed.sl as sl -except ImportError: - print("Error: ZED SDK not installed.") - sys.exit(1) - -# Import LCM message types -from dimos_lcm.sensor_msgs import Image - -from dimos.protocol.pubsub.lcmpubsub import LCM, Topic -from dimos.robot.agilex.piper_arm import PiperArmRobot -from dimos.utils.logging_config import setup_logger - -logger = setup_logger() - -# Global for mouse events -mouse_click = None -camera_mouse_click = None -current_window = None -pick_location = None # Store pick location -place_location = None # Store place location -place_mode = False # Track if we're in place selection mode - - -def mouse_callback(event, x, y, _flags, param): - global mouse_click, camera_mouse_click - window_name = param - if event == cv2.EVENT_LBUTTONDOWN: - if window_name == "Camera Feed": - camera_mouse_click = (x, y) - else: - mouse_click = (x, y) - - -class VisualizationNode: - """Node that subscribes to visualization images and handles user input.""" - - def __init__(self, robot: PiperArmRobot): - self.lcm = LCM() - self.latest_viz = None - self.latest_camera = None - self._running = False - self.robot = robot - - # Subscribe to visualization topic - self.viz_topic = Topic("/manipulation/viz", Image) - self.camera_topic = Topic("/zed/color_image", Image) - - def start(self): - """Start the visualization node.""" - self._running = True - self.lcm.start() - - # Subscribe to visualization topic - self.lcm.subscribe(self.viz_topic, self._on_viz_image) - # Subscribe to camera topic for point selection - self.lcm.subscribe(self.camera_topic, self._on_camera_image) - - logger.info("Visualization node started") - - def stop(self): - """Stop the visualization node.""" - self._running = False - cv2.destroyAllWindows() - - def _on_viz_image(self, msg: Image, topic: str): - """Handle visualization image messages.""" - try: - # Convert LCM message to numpy array - data = np.frombuffer(msg.data, dtype=np.uint8) - if msg.encoding == "rgb8": - image = data.reshape((msg.height, msg.width, 3)) - # Convert RGB to BGR for OpenCV - image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) - self.latest_viz = image - except Exception as e: - logger.error(f"Error processing viz image: {e}") - - def _on_camera_image(self, msg: Image, topic: str): - """Handle camera image messages.""" - try: - # Convert LCM message to numpy array - data = np.frombuffer(msg.data, dtype=np.uint8) - if msg.encoding == "rgb8": - image = data.reshape((msg.height, msg.width, 3)) - # Convert RGB to BGR for OpenCV - image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) - self.latest_camera = image - except Exception as e: - logger.error(f"Error processing camera image: {e}") - - def run_visualization(self): - """Run the visualization loop with user interaction.""" - global mouse_click, camera_mouse_click, pick_location, place_location, place_mode - - # Setup windows - cv2.namedWindow("Pick and Place") - cv2.setMouseCallback("Pick and Place", mouse_callback, "Pick and Place") - - cv2.namedWindow("Camera Feed") - cv2.setMouseCallback("Camera Feed", mouse_callback, "Camera Feed") - - print("=== Piper Arm Robot - Pick and Place ===") - print("Control mode: Module-based with LCM communication") - print("\nPICK AND PLACE WORKFLOW:") - print("1. Click on an object to select PICK location") - print("2. Click again to select PLACE location (auto pick & place)") - print("3. OR press 'p' after first click for pick-only task") - print("\nCONTROLS:") - print(" 'p' - Execute pick-only task (after selecting pick location)") - print(" 'r' - Reset everything") - print(" 'q' - Quit") - print(" 's' - SOFT STOP (emergency stop)") - print(" 'g' - RELEASE GRIPPER (open gripper)") - print(" 'SPACE' - EXECUTE target pose (manual override)") - print("\nNOTE: Click on objects in the Camera Feed window!") - - while self._running: - # Show camera feed with status overlay - if self.latest_camera is not None: - display_image = self.latest_camera.copy() - - # Add status text - status_text = "" - if pick_location is None: - status_text = "Click to select PICK location" - color = (0, 255, 0) - elif place_location is None: - status_text = "Click to select PLACE location (or press 'p' for pick-only)" - color = (0, 255, 255) - else: - status_text = "Executing pick and place..." - color = (255, 0, 255) - - cv2.putText( - display_image, status_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, color, 2 - ) - - # Draw pick location marker if set - if pick_location is not None: - # Simple circle marker - cv2.circle(display_image, pick_location, 10, (0, 255, 0), 2) - cv2.circle(display_image, pick_location, 2, (0, 255, 0), -1) - - # Simple label - cv2.putText( - display_image, - "PICK", - (pick_location[0] + 15, pick_location[1] + 5), - cv2.FONT_HERSHEY_SIMPLEX, - 0.6, - (0, 255, 0), - 2, - ) - - # Draw place location marker if set - if place_location is not None: - # Simple circle marker - cv2.circle(display_image, place_location, 10, (0, 255, 255), 2) - cv2.circle(display_image, place_location, 2, (0, 255, 255), -1) - - # Simple label - cv2.putText( - display_image, - "PLACE", - (place_location[0] + 15, place_location[1] + 5), - cv2.FONT_HERSHEY_SIMPLEX, - 0.6, - (0, 255, 255), - 2, - ) - - # Draw simple arrow between pick and place - if pick_location is not None: - cv2.arrowedLine( - display_image, - pick_location, - place_location, - (255, 255, 0), - 2, - tipLength=0.05, - ) - - cv2.imshow("Camera Feed", display_image) - - # Show visualization if available - if self.latest_viz is not None: - cv2.imshow("Pick and Place", self.latest_viz) - - # Handle keyboard input - key = cv2.waitKey(1) & 0xFF - if key != 255: # Key was pressed - if key == ord("q"): - logger.info("Quit requested") - self._running = False - break - elif key == ord("r"): - # Reset everything - pick_location = None - place_location = None - place_mode = False - logger.info("Reset pick and place selections") - # Also send reset to robot - action = self.robot.handle_keyboard_command("r") - if action: - logger.info(f"Action: {action}") - elif key == ord("p"): - # Execute pick-only task if pick location is set - if pick_location is not None: - logger.info(f"Executing pick-only task at {pick_location}") - result = self.robot.pick_and_place( - pick_location[0], - pick_location[1], - None, # No place location - None, - ) - logger.info(f"Pick task started: {result}") - # Clear selection after sending - pick_location = None - place_location = None - else: - logger.warning("Please select a pick location first!") - else: - # Send keyboard command to robot - if key in [82, 84]: # Arrow keys - action = self.robot.handle_keyboard_command(str(key)) - else: - action = self.robot.handle_keyboard_command(chr(key)) - if action: - logger.info(f"Action: {action}") - - # Handle mouse clicks - if camera_mouse_click: - x, y = camera_mouse_click - - if pick_location is None: - # First click - set pick location - pick_location = (x, y) - logger.info(f"Pick location set at ({x}, {y})") - elif place_location is None: - # Second click - set place location and execute - place_location = (x, y) - logger.info(f"Place location set at ({x}, {y})") - logger.info(f"Executing pick at {pick_location} and place at ({x}, {y})") - - # Start pick and place task with both locations - result = self.robot.pick_and_place(pick_location[0], pick_location[1], x, y) - logger.info(f"Pick and place task started: {result}") - - # Clear all points after sending mission - pick_location = None - place_location = None - - camera_mouse_click = None - - # Handle mouse click from Pick and Place window (if viz is running) - elif mouse_click and self.latest_viz is not None: - # Similar logic for viz window clicks - x, y = mouse_click - - if pick_location is None: - # First click - set pick location - pick_location = (x, y) - logger.info(f"Pick location set at ({x}, {y}) from viz window") - elif place_location is None: - # Second click - set place location and execute - place_location = (x, y) - logger.info(f"Place location set at ({x}, {y}) from viz window") - logger.info(f"Executing pick at {pick_location} and place at ({x}, {y})") - - # Start pick and place task with both locations - result = self.robot.pick_and_place(pick_location[0], pick_location[1], x, y) - logger.info(f"Pick and place task started: {result}") - - # Clear all points after sending mission - pick_location = None - place_location = None - - mouse_click = None - - time.sleep(0.03) # ~30 FPS - - -async def run_piper_arm_with_viz(): - """Run the Piper Arm robot with visualization.""" - logger.info("Starting Piper Arm Robot") - - # Create robot instance - robot = PiperArmRobot() - - try: - # Start the robot - await robot.start() - - # Give modules time to fully initialize - await asyncio.sleep(2) - - # Create and start visualization node - viz_node = VisualizationNode(robot) - viz_node.start() - - # Run visualization in separate thread - viz_thread = threading.Thread(target=viz_node.run_visualization, daemon=True) - viz_thread.start() - - # Keep running until visualization stops - while viz_node._running: - await asyncio.sleep(0.1) - - # Stop visualization - viz_node.stop() - - except Exception as e: - logger.error(f"Error running robot: {e}") - import traceback - - traceback.print_exc() - - finally: - # Clean up - robot.stop() - logger.info("Robot stopped") - - -if __name__ == "__main__": - # Run the robot - asyncio.run(run_piper_arm_with_viz()) diff --git a/tests/test_pick_and_place_skill.py b/tests/test_pick_and_place_skill.py deleted file mode 100644 index 95576a40d3..0000000000 --- a/tests/test_pick_and_place_skill.py +++ /dev/null @@ -1,154 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Run script for Piper Arm robot with pick and place functionality. -Uses hardcoded points and the PickAndPlace skill. -""" - -import asyncio -import sys - -try: - import pyzed.sl as sl # Required for ZED camera -except ImportError: - print("Error: ZED SDK not installed.") - sys.exit(1) - -from dimos.robot.agilex.piper_arm import PiperArmRobot -from dimos.skills.manipulation.pick_and_place import PickAndPlace -from dimos.utils.logging_config import setup_logger - -logger = setup_logger() - - -async def run_piper_arm(): - """Run the Piper Arm robot with pick and place skill.""" - logger.info("Starting Piper Arm Robot") - - # Create robot instance - robot = PiperArmRobot() - - try: - # Start the robot - await robot.start() - - # Give modules time to fully initialize - await asyncio.sleep(3) - - # Add the PickAndPlace skill to the robot's skill library - robot.skill_library.add(PickAndPlace) - - logger.info("Robot initialized successfully") - print("\n=== Piper Arm Robot - Pick and Place Demo ===") - print("This demo uses hardcoded pick and place points.") - print("\nCommands:") - print(" 1. Run pick and place with hardcoded points") - print(" 2. Run pick-only with hardcoded point") - print(" r. Reset robot to idle") - print(" q. Quit") - print("") - - running = True - while running: - try: - # Get user input - command = input("\nEnter command: ").strip().lower() - - if command == "q": - logger.info("Quit requested") - running = False - break - - elif command == "r" or command == "s": - logger.info("Resetting robot") - robot.handle_keyboard_command(command) - - elif command == "1": - # Hardcoded pick and place points - # These should be adjusted based on your camera view - print("\nExecuting pick and place with hardcoded points...") - - # Create and execute the skill - skill = PickAndPlace( - robot=robot, - object_query="labubu doll", # Will use visual detection - target_query="on the keyboard", # Will use visual detection - ) - - result = skill() - - if result["success"]: - print(f"āœ“ {result['message']}") - else: - print(f"āœ— Failed: {result.get('error', 'Unknown error')}") - - elif command == "2": - # Pick-only with hardcoded point - print("\nExecuting pick-only with hardcoded point...") - - # Create and execute the skill for pick-only - skill = PickAndPlace( - robot=robot, - object_query="labubu doll", # Will use visual detection - target_query=None, # No place target - pick only - ) - - result = skill() - - if result["success"]: - print(f"āœ“ {result['message']}") - else: - print(f"āœ— Failed: {result.get('error', 'Unknown error')}") - - else: - print("Invalid command. Please try again.") - - # Small delay to prevent CPU spinning - await asyncio.sleep(0.1) - - except KeyboardInterrupt: - logger.info("Keyboard interrupt received") - running = False - break - except Exception as e: - logger.error(f"Error in command loop: {e}") - print(f"Error: {e}") - - except Exception as e: - logger.error(f"Error running robot: {e}") - import traceback - - traceback.print_exc() - - finally: - # Clean up - logger.info("Shutting down robot...") - await robot.stop() - logger.info("Robot stopped") - - -def main(): - """Main entry point.""" - print("Starting Piper Arm Robot...") - print("Note: The robot will use Qwen VLM to identify objects and locations") - print("based on the queries specified in the code.") - - # Run the robot - asyncio.run(run_piper_arm()) - - -if __name__ == "__main__": - main() diff --git a/tests/test_pointcloud_filtering.py b/tests/test_pointcloud_filtering.py deleted file mode 100644 index 8a9eb8665f..0000000000 --- a/tests/test_pointcloud_filtering.py +++ /dev/null @@ -1,101 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import sys - -from pyzed import sl -from reactivex import operators as ops - -from dimos.manipulation.manip_aio_pipeline import ManipulationPipeline -from dimos.stream.stereo_camera_streams.zed import ZEDCameraStream -from dimos.web.robot_web_interface import RobotWebInterface - - -def main(): - """Test point cloud filtering using the concurrent stream-based ManipulationPipeline.""" - print("Testing point cloud filtering with ManipulationPipeline...") - - # Configuration - min_confidence = 0.6 - web_port = 5555 - - try: - # Initialize ZED camera stream - zed_stream = ZEDCameraStream(resolution=sl.RESOLUTION.HD1080, fps=10) - - # Get camera intrinsics - camera_intrinsics_dict = zed_stream.get_camera_info() - camera_intrinsics = [ - camera_intrinsics_dict["fx"], - camera_intrinsics_dict["fy"], - camera_intrinsics_dict["cx"], - camera_intrinsics_dict["cy"], - ] - - # Create the concurrent manipulation pipeline - pipeline = ManipulationPipeline( - camera_intrinsics=camera_intrinsics, - min_confidence=min_confidence, - max_objects=10, - ) - - # Create ZED stream - zed_frame_stream = zed_stream.create_stream().pipe(ops.share()) - - # Create concurrent processing streams - streams = pipeline.create_streams(zed_frame_stream) - detection_viz_stream = streams["detection_viz"] - pointcloud_viz_stream = streams["pointcloud_viz"] - - except ImportError: - print("Error: ZED SDK not installed. Please install pyzed package.") - sys.exit(1) - except RuntimeError as e: - print(f"Error: Failed to open ZED camera: {e}") - sys.exit(1) - - try: - # Set up web interface with concurrent visualization streams - print("Initializing web interface...") - web_interface = RobotWebInterface( - port=web_port, - object_detection=detection_viz_stream, - pointcloud_stream=pointcloud_viz_stream, - ) - - print("\nPoint Cloud Filtering Test Running:") - print(f"Web Interface: http://localhost:{web_port}") - print("Object Detection View: RGB with bounding boxes") - print("Point Cloud View: Depth with colored point clouds and 3D bounding boxes") - print(f"Confidence threshold: {min_confidence}") - print("\nPress Ctrl+C to stop the test\n") - - # Start web server (blocking call) - web_interface.run() - - except KeyboardInterrupt: - print("\nTest interrupted by user") - except Exception as e: - print(f"Error during test: {e}") - finally: - print("Cleaning up resources...") - if "zed_stream" in locals(): - zed_stream.cleanup() - if "pipeline" in locals(): - pipeline.cleanup() - print("Test completed") - - -if __name__ == "__main__": - main() diff --git a/tests/test_qwen_image_query.py b/tests/test_qwen_image_query.py deleted file mode 100644 index 6a3aa9d8c6..0000000000 --- a/tests/test_qwen_image_query.py +++ /dev/null @@ -1,62 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Test the Qwen image query functionality.""" - -import os - -import cv2 -import numpy as np -from PIL import Image - -from dimos.models.qwen.video_query import query_single_frame - - -def test_qwen_image_query(): - """Test querying Qwen with a single image.""" - # Skip if no API key - if not os.getenv("ALIBABA_API_KEY"): - print("ALIBABA_API_KEY not set") - return - - # Load test image - image_path = os.path.join(os.getcwd(), "assets", "test_spatial_memory", "frame_038.jpg") - pil_image = Image.open(image_path) - - # Convert PIL image to numpy array in RGB format - image_array = np.array(pil_image) - if image_array.shape[-1] == 3: - # Ensure it's in RGB format (PIL loads as RGB by default) - image = image_array - else: - # Handle grayscale images - image = cv2.cvtColor(image_array, cv2.COLOR_GRAY2RGB) - - # Test basic object detection query - response = query_single_frame( - image=image, - query="What objects do you see in this image? Return as a comma-separated list.", - ) - print(response) - - # Test coordinate query - response = query_single_frame( - image=image, - query="Return the center coordinates of any person in the image as a tuple (x,y)", - ) - print(response) - - -if __name__ == "__main__": - test_qwen_image_query() diff --git a/tests/test_rtsp_video_provider.py b/tests/test_rtsp_video_provider.py deleted file mode 100644 index a834075619..0000000000 --- a/tests/test_rtsp_video_provider.py +++ /dev/null @@ -1,142 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import time - -import numpy as np -import reactivex as rx -from reactivex import operators as ops - -from dimos.stream.frame_processor import FrameProcessor -from dimos.stream.rtsp_video_provider import RtspVideoProvider -from dimos.stream.video_operators import VideoOperators as vops -from dimos.stream.video_provider import get_scheduler -from dimos.utils.logging_config import setup_logger -from dimos.web.robot_web_interface import RobotWebInterface - -logger = setup_logger() - -import os -import sys - -# Load environment variables from .env file -from dotenv import load_dotenv - -load_dotenv() - -# RTSP URL must be provided as a command-line argument or environment variable -RTSP_URL = os.environ.get("TEST_RTSP_URL", "") -if len(sys.argv) > 1: - RTSP_URL = sys.argv[1] # Allow overriding with command-line argument -elif RTSP_URL == "": - print("Please provide an RTSP URL for testing.") - print( - "You can set the TEST_RTSP_URL environment variable or pass it as a command-line argument." - ) - print("Example: python -m dimos.stream.rtsp_video_provider rtsp://...") - sys.exit(1) - -logger.info("Attempting to connect to provided RTSP URL.") -provider = RtspVideoProvider(dev_name="TestRtspCam", rtsp_url=RTSP_URL) - -logger.info("Creating observable...") -video_stream_observable = provider.capture_video_as_observable() - -logger.info("Subscribing to observable...") -frame_counter = 0 -start_time = time.monotonic() # Re-initialize start_time -last_log_time = start_time # Keep this for interval timing - -# Create a subject for ffmpeg responses -ffmpeg_response_subject = rx.subject.Subject() -ffmpeg_response_stream = ffmpeg_response_subject.pipe(ops.observe_on(get_scheduler()), ops.share()) - - -def process_frame(frame: np.ndarray): - """Callback function executed for each received frame.""" - global frame_counter, last_log_time, start_time # Add start_time to global - frame_counter += 1 - current_time = time.monotonic() - # Log stats periodically (e.g., every 5 seconds) - if current_time - last_log_time >= 5.0: - total_elapsed_time = current_time - start_time # Calculate total elapsed time - avg_fps = frame_counter / total_elapsed_time if total_elapsed_time > 0 else 0 - logger.info(f"Received frame {frame_counter}. Shape: {frame.shape}. Avg FPS: {avg_fps:.2f}") - ffmpeg_response_subject.on_next( - f"Received frame {frame_counter}. Shape: {frame.shape}. Avg FPS: {avg_fps:.2f}" - ) - last_log_time = current_time # Update log time for the next interval - - -def handle_error(error: Exception): - """Callback function executed if the observable stream errors.""" - logger.error(f"Stream error: {error}", exc_info=True) # Log with traceback - - -def handle_completion(): - """Callback function executed when the observable stream completes.""" - logger.info("Stream completed.") - - -# Subscribe to the observable stream -processor = FrameProcessor() -subscription = video_stream_observable.pipe( - # ops.subscribe_on(get_scheduler()), - ops.observe_on(get_scheduler()), - ops.share(), - vops.with_jpeg_export(processor, suffix="reolink_", save_limit=30, loop=True), -).subscribe(on_next=process_frame, on_error=handle_error, on_completed=handle_completion) - -streams = {"reolink_video": video_stream_observable} -text_streams = { - "ffmpeg_responses": ffmpeg_response_stream, -} - -web_interface = RobotWebInterface(port=5555, text_streams=text_streams, **streams) - -web_interface.run() # This may block the main thread - -# TODO: Redo disposal / keep-alive loop - -# Keep the main thread alive to receive frames (e.g., for 60 seconds) -print("Stream running. Press Ctrl+C to stop...") -try: - # Keep running indefinitely until interrupted - while True: - time.sleep(1) - # Optional: Check if subscription is still active - # if not subscription.is_disposed: - # # logger.debug("Subscription active...") - # pass - # else: - # logger.warning("Subscription was disposed externally.") - # break - -except KeyboardInterrupt: - print("KeyboardInterrupt received. Shutting down...") -finally: - # Ensure resources are cleaned up regardless of how the loop exits - print("Disposing subscription...") - # subscription.dispose() - print("Disposing provider resources...") - provider.dispose_all() - print("Cleanup finished.") - -# Final check (optional, for debugging) -time.sleep(1) # Give background threads a moment -final_process = provider._ffmpeg_process -if final_process and final_process.poll() is None: - print(f"WARNING: ffmpeg process (PID: {final_process.pid}) may still be running after cleanup!") -else: - print("ffmpeg process appears terminated.") diff --git a/tests/test_semantic_seg_robot.py b/tests/test_semantic_seg_robot.py deleted file mode 100644 index 0a78bc371b..0000000000 --- a/tests/test_semantic_seg_robot.py +++ /dev/null @@ -1,151 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import queue -import sys -import threading - -import cv2 -import numpy as np - -# Add the parent directory to the Python path -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -from reactivex import operators as RxOps - -from dimos.perception.semantic_seg import SemanticSegmentationStream -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.stream.frame_processor import FrameProcessor -from dimos.stream.video_operators import Operators as MyOps -from dimos.web.robot_web_interface import RobotWebInterface - - -def main(): - # Create a queue for thread communication (limit to prevent memory issues) - frame_queue = queue.Queue(maxsize=5) - stop_event = threading.Event() - - # Unitree Go2 camera parameters at 1080p - camera_params = { - "resolution": (1920, 1080), # 1080p resolution - "focal_length": 3.2, # mm - "sensor_size": (4.8, 3.6), # mm (1/4" sensor) - } - - # Initialize video provider and segmentation stream - # video_provider = VideoProvider("test_camera", video_source=0) - robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), - ros_control=UnitreeROSControl(), - ) - - seg_stream = SemanticSegmentationStream( - enable_mono_depth=False, camera_params=camera_params, gt_depth_scale=512.0 - ) - - # Create streams - video_stream = robot.get_ros_video_stream(fps=5) - segmentation_stream = seg_stream.create_stream(video_stream) - - # Define callbacks for the segmentation stream - def on_next(segmentation): - if stop_event.is_set(): - return - # Get the frame and visualize - vis_frame = segmentation.metadata["viz_frame"] - depth_viz = segmentation.metadata["depth_viz"] - # Get the image dimensions - height, width = vis_frame.shape[:2] - depth_height, depth_width = depth_viz.shape[:2] - - # Resize depth visualization to match segmentation height - # (maintaining aspect ratio if needed) - depth_resized = cv2.resize(depth_viz, (int(depth_width * height / depth_height), height)) - - # Create a combined frame for side-by-side display - combined_viz = np.hstack((vis_frame, depth_resized)) - - # Add labels - font = cv2.FONT_HERSHEY_SIMPLEX - cv2.putText(combined_viz, "Semantic Segmentation", (10, 30), font, 0.8, (255, 255, 255), 2) - cv2.putText( - combined_viz, "Depth Estimation", (width + 10, 30), font, 0.8, (255, 255, 255), 2 - ) - - # Put frame in queue for main thread to display (non-blocking) - try: - frame_queue.put_nowait(combined_viz) - except queue.Full: - # Skip frame if queue is full - pass - - def on_error(error): - print(f"Error: {error}") - stop_event.set() - - def on_completed(): - print("Stream completed") - stop_event.set() - - # Start the subscription - subscription = None - - try: - # Subscribe to start processing in background thread - print_emission_args = { - "enabled": True, - "dev_name": "SemanticSegmentation", - "counts": {}, - } - - FrameProcessor(delete_on_init=True) - subscription = segmentation_stream.pipe( - MyOps.print_emission(id="A", **print_emission_args), - RxOps.share(), - MyOps.print_emission(id="B", **print_emission_args), - RxOps.map(lambda x: x.metadata["viz_frame"] if x is not None else None), - MyOps.print_emission(id="C", **print_emission_args), - RxOps.filter(lambda x: x is not None), - MyOps.print_emission(id="D", **print_emission_args), - # MyVideoOps.with_jpeg_export(frame_processor=frame_processor, suffix="_frame_"), - MyOps.print_emission(id="E", **print_emission_args), - ) - - print("Semantic segmentation visualization started. Press 'q' to exit.") - - streams = { - "segmentation_stream": subscription, - } - fast_api_server = RobotWebInterface(port=5555, **streams) - fast_api_server.run() - - except KeyboardInterrupt: - print("\nKeyboard interrupt received. Stopping...") - finally: - # Signal threads to stop - stop_event.set() - - # Clean up resources - if subscription: - subscription.dispose() - - seg_stream.cleanup() - cv2.destroyAllWindows() - print("Cleanup complete") - - -if __name__ == "__main__": - main() diff --git a/tests/test_semantic_seg_robot_agent.py b/tests/test_semantic_seg_robot_agent.py deleted file mode 100644 index 2791f23211..0000000000 --- a/tests/test_semantic_seg_robot_agent.py +++ /dev/null @@ -1,139 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -import cv2 -from reactivex import Subject, operators as RxOps - -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.perception.semantic_seg import SemanticSegmentationStream -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.stream.frame_processor import FrameProcessor -from dimos.stream.video_operators import VideoOperators as MyVideoOps -from dimos.utils.threadpool import get_scheduler -from dimos.web.robot_web_interface import RobotWebInterface - - -def main(): - # Unitree Go2 camera parameters at 1080p - camera_params = { - "resolution": (1920, 1080), # 1080p resolution - "focal_length": 3.2, # mm - "sensor_size": (4.8, 3.6), # mm (1/4" sensor) - } - - robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), ros_control=UnitreeROSControl(), skills=MyUnitreeSkills() - ) - - seg_stream = SemanticSegmentationStream( - enable_mono_depth=True, camera_params=camera_params, gt_depth_scale=512.0 - ) - - # Create streams - video_stream = robot.get_ros_video_stream(fps=5) - segmentation_stream = seg_stream.create_stream( - video_stream.pipe(MyVideoOps.with_fps_sampling(fps=0.5)) - ) - # Throttling to slowdown SegmentationAgent calls - # TODO: add Agent parameter to handle this called api_call_interval - - FrameProcessor(delete_on_init=True) - seg_stream = segmentation_stream.pipe( - RxOps.share(), - RxOps.map(lambda x: x.metadata["viz_frame"] if x is not None else None), - RxOps.filter(lambda x: x is not None), - # MyVideoOps.with_jpeg_export(frame_processor=frame_processor, suffix="_frame_"), # debugging - ) - - depth_stream = segmentation_stream.pipe( - RxOps.share(), - RxOps.map(lambda x: x.metadata["depth_viz"] if x is not None else None), - RxOps.filter(lambda x: x is not None), - ) - - object_stream = segmentation_stream.pipe( - RxOps.share(), - RxOps.map(lambda x: x.metadata["objects"] if x is not None else None), - RxOps.filter(lambda x: x is not None), - RxOps.map( - lambda objects: "\n".join( - f"Object {obj['object_id']}: {obj['label']} (confidence: {obj['prob']:.2f})" - + (f", depth: {obj['depth']:.2f}m" if "depth" in obj else "") - for obj in objects - ) - if objects - else "No objects detected." - ), - ) - - text_query_stream = Subject() - - # Combine text query with latest object data when a new text query arrives - enriched_query_stream = text_query_stream.pipe( - RxOps.with_latest_from(object_stream), - RxOps.map( - lambda combined: { - "query": combined[0], - "objects": combined[1] if len(combined) > 1 else "No object data available", - } - ), - RxOps.map(lambda data: f"{data['query']}\n\nCurrent objects detected:\n{data['objects']}"), - RxOps.do_action( - lambda x: print(f"\033[34mEnriched query: {x.split(chr(10))[0]}\033[0m") - or [print(f"\033[34m{line}\033[0m") for line in x.split(chr(10))[1:]] - ), - ) - - segmentation_agent = OpenAIAgent( - dev_name="SemanticSegmentationAgent", - model_name="gpt-4o", - system_query="You are a helpful assistant that can control a virtual robot with semantic segmentation / distnace data as a guide. Only output skill calls, no other text", - input_query_stream=enriched_query_stream, - process_all_inputs=False, - pool_scheduler=get_scheduler(), - skills=robot.get_skills(), - ) - agent_response_stream = segmentation_agent.get_response_observable() - - print("Semantic segmentation visualization started. Press 'q' to exit.") - - streams = { - "raw_stream": video_stream, - "depth_stream": depth_stream, - "seg_stream": seg_stream, - } - text_streams = { - "object_stream": object_stream, - "enriched_query_stream": enriched_query_stream, - "agent_response_stream": agent_response_stream, - } - - try: - fast_api_server = RobotWebInterface(port=5555, text_streams=text_streams, **streams) - fast_api_server.query_stream.subscribe(lambda x: text_query_stream.on_next(x)) - fast_api_server.run() - except KeyboardInterrupt: - print("\nKeyboard interrupt received. Stopping...") - finally: - seg_stream.cleanup() - cv2.destroyAllWindows() - print("Cleanup complete") - - -if __name__ == "__main__": - main() diff --git a/tests/test_semantic_seg_webcam.py b/tests/test_semantic_seg_webcam.py deleted file mode 100644 index b7fc57073b..0000000000 --- a/tests/test_semantic_seg_webcam.py +++ /dev/null @@ -1,141 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import queue -import sys -import threading - -import cv2 -import numpy as np - -# Add the parent directory to the Python path -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -from dimos.perception.semantic_seg import SemanticSegmentationStream -from dimos.stream.video_provider import VideoProvider - - -def main(): - # Create a queue for thread communication (limit to prevent memory issues) - frame_queue = queue.Queue(maxsize=5) - stop_event = threading.Event() - - # Logitech C920e camera parameters at 480p - camera_params = { - "resolution": (640, 480), # 480p resolution - "focal_length": 3.67, # mm - "sensor_size": (4.8, 3.6), # mm (1/4" sensor) - } - - # Initialize video provider and segmentation stream - video_provider = VideoProvider("test_camera", video_source=0) - seg_stream = SemanticSegmentationStream( - enable_mono_depth=True, camera_params=camera_params, gt_depth_scale=512.0 - ) - - # Create streams - video_stream = video_provider.capture_video_as_observable(realtime=False, fps=5) - segmentation_stream = seg_stream.create_stream(video_stream) - - # Define callbacks for the segmentation stream - def on_next(segmentation): - if stop_event.is_set(): - return - - # Get the frame and visualize - vis_frame = segmentation.metadata["viz_frame"] - depth_viz = segmentation.metadata["depth_viz"] - # Get the image dimensions - height, width = vis_frame.shape[:2] - depth_height, depth_width = depth_viz.shape[:2] - - # Resize depth visualization to match segmentation height - # (maintaining aspect ratio if needed) - depth_resized = cv2.resize(depth_viz, (int(depth_width * height / depth_height), height)) - - # Create a combined frame for side-by-side display - combined_viz = np.hstack((vis_frame, depth_resized)) - - # Add labels - font = cv2.FONT_HERSHEY_SIMPLEX - cv2.putText(combined_viz, "Semantic Segmentation", (10, 30), font, 0.8, (255, 255, 255), 2) - cv2.putText( - combined_viz, "Depth Estimation", (width + 10, 30), font, 0.8, (255, 255, 255), 2 - ) - - # Put frame in queue for main thread to display (non-blocking) - try: - frame_queue.put_nowait(combined_viz) - except queue.Full: - # Skip frame if queue is full - pass - - def on_error(error): - print(f"Error: {error}") - stop_event.set() - - def on_completed(): - print("Stream completed") - stop_event.set() - - # Start the subscription - subscription = None - - try: - # Subscribe to start processing in background thread - subscription = segmentation_stream.subscribe( - on_next=on_next, on_error=on_error, on_completed=on_completed - ) - - print("Semantic segmentation visualization started. Press 'q' to exit.") - - # Main thread loop for displaying frames - while not stop_event.is_set(): - try: - # Get frame with timeout (allows checking stop_event periodically) - combined_viz = frame_queue.get(timeout=1.0) - - # Display the frame in main thread - cv2.imshow("Semantic Segmentation", combined_viz) - # Check for exit key - if cv2.waitKey(1) & 0xFF == ord("q"): - print("Exit key pressed") - break - - except queue.Empty: - # No frame available, check if we should continue - if cv2.waitKey(1) & 0xFF == ord("q"): - print("Exit key pressed") - break - continue - - except KeyboardInterrupt: - print("\nKeyboard interrupt received. Stopping...") - finally: - # Signal threads to stop - stop_event.set() - - # Clean up resources - if subscription: - subscription.dispose() - - video_provider.dispose_all() - seg_stream.cleanup() - cv2.destroyAllWindows() - print("Cleanup complete") - - -if __name__ == "__main__": - main() diff --git a/tests/test_skills.py b/tests/test_skills.py deleted file mode 100644 index a4bdd5942e..0000000000 --- a/tests/test_skills.py +++ /dev/null @@ -1,182 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Tests for the skills module in the dimos package.""" - -import unittest -from unittest import mock - -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.robot.robot import MockRobot -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.skills.skills import AbstractSkill - - -class TestSkill(AbstractSkill): - """A test skill that tracks its execution for testing purposes.""" - - _called: bool = False - - def __init__(self, *args, **kwargs): - super().__init__(*args, **kwargs) - self._called = False - - def __call__(self): - self._called = True - return "TestSkill executed successfully" - - -class SkillLibraryTest(unittest.TestCase): - """Tests for the SkillLibrary functionality.""" - - def setUp(self): - """Set up test fixtures before each test method.""" - self.robot = MockRobot() - self.skill_library = MyUnitreeSkills(robot=self.robot) - self.skill_library.initialize_skills() - - def test_skill_iteration(self): - """Test that skills can be properly iterated in the skill library.""" - skills_count = 0 - for skill in self.skill_library: - skills_count += 1 - self.assertTrue(hasattr(skill, "__name__")) - self.assertTrue(issubclass(skill, AbstractSkill)) - - self.assertGreater(skills_count, 0, "Skill library should contain at least one skill") - - def test_skill_registration(self): - """Test that skills can be properly registered in the skill library.""" - # Clear existing skills for isolated test - self.skill_library = MyUnitreeSkills(robot=self.robot) - original_count = len(list(self.skill_library)) - - # Add a custom test skill - test_skill = TestSkill - self.skill_library.add(test_skill) - - # Verify the skill was added - new_count = len(list(self.skill_library)) - self.assertEqual(new_count, original_count + 1) - - # Check if the skill can be found by name - found = False - for skill in self.skill_library: - if skill.__name__ == "TestSkill": - found = True - break - self.assertTrue(found, "Added skill should be found in skill library") - - def test_skill_direct_execution(self): - """Test that a skill can be executed directly.""" - test_skill = TestSkill() - self.assertFalse(test_skill._called) - result = test_skill() - self.assertTrue(test_skill._called) - self.assertEqual(result, "TestSkill executed successfully") - - def test_skill_library_execution(self): - """Test that a skill can be executed through the skill library.""" - # Add our test skill to the library - test_skill = TestSkill - self.skill_library.add(test_skill) - - # Create an instance to confirm it was executed - with mock.patch.object(TestSkill, "__call__", return_value="Success") as mock_call: - result = self.skill_library.call("TestSkill") - mock_call.assert_called_once() - self.assertEqual(result, "Success") - - def test_skill_not_found(self): - """Test that calling a non-existent skill raises an appropriate error.""" - with self.assertRaises(ValueError): - self.skill_library.call("NonExistentSkill") - - -class SkillWithAgentTest(unittest.TestCase): - """Tests for skills used with an agent.""" - - def setUp(self): - """Set up test fixtures before each test method.""" - self.robot = MockRobot() - self.skill_library = MyUnitreeSkills(robot=self.robot) - self.skill_library.initialize_skills() - - # Add a test skill - self.skill_library.add(TestSkill) - - # Create the agent - self.agent = OpenAIAgent( - dev_name="SkillTestAgent", - system_query="You are a skill testing agent. When prompted to perform an action, use the appropriate skill.", - skills=self.skill_library, - ) - - @mock.patch("dimos.agents_deprecated.agent.OpenAIAgent.run_observable_query") - def test_agent_skill_identification(self, mock_query): - """Test that the agent can identify skills based on natural language.""" - # Mock the agent response - mock_response = mock.MagicMock() - mock_response.run.return_value = "I found the TestSkill and executed it." - mock_query.return_value = mock_response - - # Run the test - response = self.agent.run_observable_query("Please run the test skill").run() - - # Assertions - mock_query.assert_called_once_with("Please run the test skill") - self.assertEqual(response, "I found the TestSkill and executed it.") - - @mock.patch.object(TestSkill, "__call__") - @mock.patch("dimos.agents_deprecated.agent.OpenAIAgent.run_observable_query") - def test_agent_skill_execution(self, mock_query, mock_skill_call): - """Test that the agent can execute skills properly.""" - # Mock the agent and skill call - mock_skill_call.return_value = "TestSkill executed successfully" - mock_response = mock.MagicMock() - mock_response.run.return_value = "Executed TestSkill successfully." - mock_query.return_value = mock_response - - # Run the test - response = self.agent.run_observable_query("Execute the TestSkill skill").run() - - # We can't directly verify the skill was called since our mocking setup - # doesn't capture the internal skill execution of the agent, but we can - # verify the agent was properly called - mock_query.assert_called_once_with("Execute the TestSkill skill") - self.assertEqual(response, "Executed TestSkill successfully.") - - def test_agent_multi_skill_registration(self): - """Test that multiple skills can be registered with an agent.""" - - # Create a new skill - class AnotherTestSkill(AbstractSkill): - def __call__(self): - return "Another test skill executed" - - # Register the new skill - initial_count = len(list(self.skill_library)) - self.skill_library.add(AnotherTestSkill) - - # Verify two distinct skills now exist - self.assertEqual(len(list(self.skill_library)), initial_count + 1) - - # Verify both skills are found by name - skill_names = [skill.__name__ for skill in self.skill_library] - self.assertIn("TestSkill", skill_names) - self.assertIn("AnotherTestSkill", skill_names) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_skills_rest.py b/tests/test_skills_rest.py deleted file mode 100644 index 6d3afc522c..0000000000 --- a/tests/test_skills_rest.py +++ /dev/null @@ -1,72 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -from textwrap import dedent - -from dotenv import load_dotenv -import reactivex as rx -import reactivex.operators as ops - -from dimos.agents_deprecated.claude_agent import ClaudeAgent -from dimos.skills.rest.rest import GenericRestSkill -from dimos.skills.skills import SkillLibrary -from dimos.web.robot_web_interface import RobotWebInterface - -# Load API key from environment -load_dotenv() - -# Create a skill library and add the GenericRestSkill -skills = SkillLibrary() -skills.add(GenericRestSkill) - -# Create a subject for agent responses -agent_response_subject = rx.subject.Subject() -agent_response_stream = agent_response_subject.pipe(ops.share()) - -# Create a text stream for agent responses in the web interface -text_streams = { - "agent_responses": agent_response_stream, -} -web_interface = RobotWebInterface(port=5555, text_streams=text_streams) - -# Create a ClaudeAgent instance -agent = ClaudeAgent( - dev_name="test_agent", - input_query_stream=web_interface.query_stream, - skills=skills, - system_query=dedent( - """ - You are a virtual agent. When given a query, respond by using - the appropriate tool calls if needed to execute commands on the robot. - - IMPORTANT: - Only return the response directly asked of the user. E.G. if the user asks for the time, - only return the time. If the user asks for the weather, only return the weather. - """ - ), - model_name="claude-3-7-sonnet-latest", - thinking_budget_tokens=2000, -) - -# Subscribe to agent responses and send them to the subject -agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) - -# Start the web interface -web_interface.run() - -# Run this query in the web interface: -# -# Make a web request to nist to get the current time. -# You should use http://worldclockapi.com/api/json/utc/now -# diff --git a/tests/test_spatial_memory.py b/tests/test_spatial_memory.py deleted file mode 100644 index 5cd587f28c..0000000000 --- a/tests/test_spatial_memory.py +++ /dev/null @@ -1,306 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import time - -import chromadb -import cv2 -from matplotlib.patches import Circle -import matplotlib.pyplot as plt -import reactivex -from reactivex import operators as ops - -from dimos.agents_deprecated.memory.visual_memory import VisualMemory -from dimos.msgs.geometry_msgs import Quaternion, Vector3 - -# from dimos.robot.unitree_webrtc.unitree_go2 import UnitreeGo2 # Uncomment when properly configured -from dimos.perception.spatial_perception import SpatialMemory - - -def extract_pose_data(transform): - """Extract position and rotation from a transform message""" - if transform is None: - return None, None - - pos = transform.transform.translation - rot = transform.transform.rotation - - # Convert to Vector3 objects expected by SpatialMemory - position = Vector3(x=pos.x, y=pos.y, z=pos.z) - - # Convert quaternion to euler angles for rotation vector - quat = Quaternion(x=rot.x, y=rot.y, z=rot.z, w=rot.w) - euler = quat.to_euler() - rotation = Vector3(x=euler.x, y=euler.y, z=euler.z) - - return position, rotation - - -def setup_persistent_chroma_db(db_path="chromadb_data"): - """ - Set up a persistent ChromaDB database at the specified path. - - Args: - db_path: Path to store the ChromaDB database - - Returns: - The ChromaDB client instance - """ - # Create a persistent ChromaDB client - full_db_path = os.path.join("/home/stash/dimensional/dimos/assets/test_spatial_memory", db_path) - print(f"Setting up persistent ChromaDB at: {full_db_path}") - - # Ensure the directory exists - os.makedirs(full_db_path, exist_ok=True) - - return chromadb.PersistentClient(path=full_db_path) - - -def main(): - print("Starting spatial memory test...") - - # Create counters for tracking - frame_count = 0 - transform_count = 0 - stored_count = 0 - - print("Note: This test requires proper robot connection setup.") - print("Please ensure video_stream and transform_stream are properly configured.") - - # These need to be set up based on your specific robot configuration - video_stream = None # TODO: Set up video stream from robot - transform_stream = None # TODO: Set up transform stream from robot - - if video_stream is None or transform_stream is None: - print("\nWARNING: Video or transform streams not configured.") - print("Exiting test. Please configure streams properly.") - return - - # Setup output directory for visual memory - visual_memory_dir = "/home/stash/dimensional/dimos/assets/test_spatial_memory" - os.makedirs(visual_memory_dir, exist_ok=True) - - # Setup persistent storage path for visual memory - visual_memory_path = os.path.join(visual_memory_dir, "visual_memory.pkl") - - # Try to load existing visual memory if it exists - if os.path.exists(visual_memory_path): - try: - print(f"Loading existing visual memory from {visual_memory_path}...") - visual_memory = VisualMemory.load(visual_memory_path, output_dir=visual_memory_dir) - print(f"Loaded {visual_memory.count()} images from previous runs") - except Exception as e: - print(f"Error loading visual memory: {e}") - visual_memory = VisualMemory(output_dir=visual_memory_dir) - else: - print("No existing visual memory found. Starting with empty visual memory.") - visual_memory = VisualMemory(output_dir=visual_memory_dir) - - # Setup a persistent database for ChromaDB - db_client = setup_persistent_chroma_db() - - # Create spatial perception instance with persistent storage - print("Creating SpatialMemory with persistent vector database...") - spatial_memory = SpatialMemory( - collection_name="test_spatial_memory", - min_distance_threshold=1, # Store frames every 1 meter - min_time_threshold=1, # Store frames at least every 1 second - chroma_client=db_client, # Use the persistent client - visual_memory=visual_memory, # Use the visual memory we loaded or created - ) - - # Combine streams using combine_latest - # This will pair up items properly without buffering - combined_stream = reactivex.combine_latest(video_stream, transform_stream).pipe( - ops.map( - lambda pair: { - "frame": pair[0], # First element is the frame - "position": extract_pose_data(pair[1])[0], # Position as Vector3 - "rotation": extract_pose_data(pair[1])[1], # Rotation as Vector3 - } - ), - ops.filter(lambda data: data["position"] is not None and data["rotation"] is not None), - ) - - # Process with spatial memory - result_stream = spatial_memory.process_stream(combined_stream) - - # Simple callback to track stored frames and save them to the assets directory - def on_stored_frame(result): - nonlocal stored_count - # Only count actually stored frames (not debug frames) - if not not result.get("stored", True): - stored_count += 1 - pos = result["position"] - if isinstance(pos, tuple): - print( - f"\nStored frame #{stored_count} at ({pos[0]:.2f}, {pos[1]:.2f}, {pos[2]:.2f})" - ) - else: - print(f"\nStored frame #{stored_count} at position {pos}") - - # Save the frame to the assets directory - if "frame" in result: - frame_filename = f"/home/stash/dimensional/dimos/assets/test_spatial_memory/frame_{stored_count:03d}.jpg" - cv2.imwrite(frame_filename, result["frame"]) - print(f"Saved frame to {frame_filename}") - - # Subscribe to results - print("Subscribing to spatial perception results...") - result_subscription = result_stream.subscribe(on_stored_frame) - - print("\nRunning until interrupted...") - try: - while True: - time.sleep(1.0) - print(f"Running: {stored_count} frames stored so far", end="\r") - except KeyboardInterrupt: - print("\nTest interrupted by user") - finally: - # Clean up resources - print("\nCleaning up...") - if "result_subscription" in locals(): - result_subscription.dispose() - - # Visualize spatial memory with multiple object queries - visualize_spatial_memory_with_objects( - spatial_memory, - objects=[ - "kitchen", - "conference room", - "vacuum", - "office", - "bathroom", - "boxes", - "telephone booth", - ], - output_filename="spatial_memory_map.png", - ) - - # Save visual memory to disk for later use - saved_path = spatial_memory.vector_db.visual_memory.save("visual_memory.pkl") - print(f"Saved {spatial_memory.vector_db.visual_memory.count()} images to disk at {saved_path}") - - spatial_memory.stop() - - print("Test completed successfully") - - -def visualize_spatial_memory_with_objects( - spatial_memory, objects, output_filename="spatial_memory_map.png" -): - """ - Visualize a spatial memory map with multiple labeled objects. - - Args: - spatial_memory: SpatialMemory instance - objects: List of object names to query and visualize (e.g. ["kitchen", "office"]) - output_filename: Filename to save the visualization - """ - # Define colors for different objects - will cycle through these - colors = ["red", "green", "orange", "purple", "brown", "cyan", "magenta", "yellow"] - - # Get all stored locations for background - locations = spatial_memory.vector_db.get_all_locations() - if not locations: - print("No locations stored in spatial memory.") - return - - # Extract coordinates from all stored locations - x_coords = [] - y_coords = [] - for loc in locations: - if isinstance(loc, dict): - x_coords.append(loc.get("pos_x", 0)) - y_coords.append(loc.get("pos_y", 0)) - elif isinstance(loc, tuple | list) and len(loc) >= 2: - x_coords.append(loc[0]) - y_coords.append(loc[1]) - else: - print(f"Unknown location format: {loc}") - - # Create figure - plt.figure(figsize=(12, 10)) - - # Plot all points in blue - plt.scatter(x_coords, y_coords, c="blue", s=50, alpha=0.5, label="All Frames") - - # Container for all object coordinates - object_coords = {} - - # Query for each object and store the result - for i, obj in enumerate(objects): - color = colors[i % len(colors)] # Cycle through colors - print(f"\nProcessing {obj} query for visualization...") - - # Get best match for this object - results = spatial_memory.query_by_text(obj, limit=1) - if not results: - print(f"No results found for '{obj}'") - continue - - # Get the first (best) result - result = results[0] - metadata = result["metadata"] - - # Extract coordinates from the first metadata item - if isinstance(metadata, list) and metadata: - metadata = metadata[0] - - if isinstance(metadata, dict): - # New metadata format uses pos_x, pos_y - x = metadata.get("pos_x", metadata.get("x", 0)) - y = metadata.get("pos_y", metadata.get("y", 0)) - - # Store coordinates for this object - object_coords[obj] = (x, y) - - # Plot this object's position - plt.scatter([x], [y], c=color, s=100, alpha=0.8, label=obj.title()) - - # Add annotation - obj_abbrev = obj[0].upper() if len(obj) > 0 else "X" - plt.annotate( - f"{obj_abbrev}", (x, y), textcoords="offset points", xytext=(0, 10), ha="center" - ) - - # Save the image to a file using the object name - if "image" in result and result["image"] is not None: - # Clean the object name to make it suitable for a filename - clean_name = obj.replace(" ", "_").lower() - output_img_filename = f"{clean_name}_result.jpg" - cv2.imwrite(output_img_filename, result["image"]) - print(f"Saved {obj} image to {output_img_filename}") - - # Finalize the plot - plt.title("Spatial Memory Map with Query Results") - plt.xlabel("X Position (m)") - plt.ylabel("Y Position (m)") - plt.grid(True) - plt.axis("equal") - plt.legend() - - # Add origin circle - plt.gca().add_patch(Circle((0, 0), 1.0, fill=False, color="blue", linestyle="--")) - - # Save the visualization - plt.savefig(output_filename, dpi=300) - print(f"Saved enhanced map visualization to {output_filename}") - - return object_coords - - -if __name__ == "__main__": - main() diff --git a/tests/test_spatial_memory_query.py b/tests/test_spatial_memory_query.py deleted file mode 100644 index d6935a2116..0000000000 --- a/tests/test_spatial_memory_query.py +++ /dev/null @@ -1,295 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Test script for querying an existing spatial memory database - -Usage: - python test_spatial_memory_query.py --query "kitchen table" --limit 5 --threshold 0.7 --save-all - python test_spatial_memory_query.py --query "robot" --limit 3 --save-one -""" - -import argparse -from datetime import datetime -import os - -import chromadb -import cv2 -import matplotlib.pyplot as plt - -from dimos.agents_deprecated.memory.visual_memory import VisualMemory -from dimos.perception.spatial_perception import SpatialMemory - - -def setup_persistent_chroma_db(db_path): - """Set up a persistent ChromaDB client at the specified path.""" - print(f"Setting up persistent ChromaDB at: {db_path}") - os.makedirs(db_path, exist_ok=True) - return chromadb.PersistentClient(path=db_path) - - -def parse_args(): - """Parse command-line arguments.""" - parser = argparse.ArgumentParser(description="Query spatial memory database.") - parser.add_argument( - "--query", type=str, default=None, help="Text query to search for (e.g., 'kitchen table')" - ) - parser.add_argument("--limit", type=int, default=3, help="Maximum number of results to return") - parser.add_argument( - "--threshold", - type=float, - default=None, - help="Similarity threshold (0.0-1.0). Only return results above this threshold.", - ) - parser.add_argument("--save-all", action="store_true", help="Save all result images") - parser.add_argument("--save-one", action="store_true", help="Save only the best matching image") - parser.add_argument( - "--visualize", - action="store_true", - help="Create a visualization of all stored memory locations", - ) - parser.add_argument( - "--db-path", - type=str, - default="/home/stash/dimensional/dimos/assets/test_spatial_memory/chromadb_data", - help="Path to ChromaDB database", - ) - parser.add_argument( - "--visual-memory-path", - type=str, - default="/home/stash/dimensional/dimos/assets/test_spatial_memory/visual_memory.pkl", - help="Path to visual memory file", - ) - return parser.parse_args() - - -def main(): - args = parse_args() - print("Loading existing spatial memory database for querying...") - - # Setup the persistent ChromaDB client - db_client = setup_persistent_chroma_db(args.db_path) - - # Setup output directory for any saved results - output_dir = os.path.dirname(args.visual_memory_path) - - # Load the visual memory - print(f"Loading visual memory from {args.visual_memory_path}...") - if os.path.exists(args.visual_memory_path): - visual_memory = VisualMemory.load(args.visual_memory_path, output_dir=output_dir) - print(f"Loaded {visual_memory.count()} images from visual memory") - else: - visual_memory = VisualMemory(output_dir=output_dir) - print("No existing visual memory found. Query results won't include images.") - - # Create SpatialMemory with the existing database and visual memory - spatial_memory = SpatialMemory( - collection_name="test_spatial_memory", chroma_client=db_client, visual_memory=visual_memory - ) - - # Create a visualization if requested - if args.visualize: - print("\nCreating visualization of spatial memory...") - common_objects = [ - "kitchen", - "conference room", - "vacuum", - "office", - "bathroom", - "boxes", - "telephone booth", - ] - visualize_spatial_memory_with_objects( - spatial_memory, objects=common_objects, output_filename="spatial_memory_map.png" - ) - - # Handle query if provided - if args.query: - query = args.query - limit = args.limit - print(f"\nQuerying for: '{query}' (limit: {limit})...") - - # Run the query - results = spatial_memory.query_by_text(query, limit=limit) - - if not results: - print(f"No results found for query: '{query}'") - return - - # Filter by threshold if specified - if args.threshold is not None: - print(f"Filtering results with similarity threshold: {args.threshold}") - filtered_results = [] - for result in results: - # Distance is inverse of similarity (0 is perfect match) - # Convert to similarity score (1.0 is perfect match) - similarity = 1.0 - ( - result.get("distance", 0) if result.get("distance") is not None else 0 - ) - if similarity >= args.threshold: - filtered_results.append((result, similarity)) - - # Sort by similarity (highest first) - filtered_results.sort(key=lambda x: x[1], reverse=True) - - if not filtered_results: - print(f"No results met the similarity threshold of {args.threshold}") - return - - print(f"Found {len(filtered_results)} results above threshold") - results_with_scores = filtered_results - else: - # Add similarity scores for all results - results_with_scores = [] - for result in results: - similarity = 1.0 - ( - result.get("distance", 0) if result.get("distance") is not None else 0 - ) - results_with_scores.append((result, similarity)) - - # Process and display results - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - - for i, (result, similarity) in enumerate(results_with_scores): - metadata = result.get("metadata", {}) - if isinstance(metadata, list) and metadata: - metadata = metadata[0] - - # Display result information - print(f"\nResult {i + 1} for '{query}':") - print(f"Similarity: {similarity:.4f} (distance: {1.0 - similarity:.4f})") - - # Extract and display position information - if isinstance(metadata, dict): - x = metadata.get("x", 0) - y = metadata.get("y", 0) - z = metadata.get("z", 0) - print(f"Position: ({x:.2f}, {y:.2f}, {z:.2f})") - if "timestamp" in metadata: - print(f"Timestamp: {metadata['timestamp']}") - if "frame_id" in metadata: - print(f"Frame ID: {metadata['frame_id']}") - - # Save image if requested and available - if "image" in result and result["image"] is not None: - # Only save first image, or all images based on flags - if args.save_one and i > 0: - continue - if not (args.save_all or args.save_one): - continue - - # Create a descriptive filename - clean_query = query.replace(" ", "_").replace("/", "_").lower() - output_filename = f"{clean_query}_result_{i + 1}_{timestamp}.jpg" - - # Save the image - cv2.imwrite(output_filename, result["image"]) - print(f"Saved image to {output_filename}") - elif "image" in result and result["image"] is None: - print("Image data not available for this result") - else: - print('No query specified. Use --query "text to search for" to run a query.') - print("Use --help to see all available options.") - - print("\nQuery completed successfully!") - - -def visualize_spatial_memory_with_objects( - spatial_memory, objects, output_filename="spatial_memory_map.png" -): - """Visualize spatial memory with labeled objects.""" - # Define colors for different objects - colors = ["red", "green", "orange", "purple", "brown", "cyan", "magenta", "yellow"] - - # Get all stored locations for background - locations = spatial_memory.vector_db.get_all_locations() - if not locations: - print("No locations stored in spatial memory.") - return - - # Extract coordinates - if len(locations[0]) >= 3: - x_coords = [loc[0] for loc in locations] - y_coords = [loc[1] for loc in locations] - else: - x_coords, y_coords = zip(*locations, strict=False) - - # Create figure - plt.figure(figsize=(12, 10)) - plt.scatter(x_coords, y_coords, c="blue", s=50, alpha=0.5, label="All Frames") - - # Container for object coordinates - object_coords = {} - - # Query for each object - for i, obj in enumerate(objects): - color = colors[i % len(colors)] - print(f"Processing {obj} query for visualization...") - - # Get best match - results = spatial_memory.query_by_text(obj, limit=1) - if not results: - print(f"No results found for '{obj}'") - continue - - # Process result - result = results[0] - metadata = result["metadata"] - - if isinstance(metadata, list) and metadata: - metadata = metadata[0] - - if isinstance(metadata, dict) and "x" in metadata and "y" in metadata: - x = metadata.get("x", 0) - y = metadata.get("y", 0) - - # Store coordinates - object_coords[obj] = (x, y) - - # Plot position - plt.scatter([x], [y], c=color, s=100, alpha=0.8, label=obj.title()) - - # Add annotation - obj_abbrev = obj[0].upper() if len(obj) > 0 else "X" - plt.annotate( - f"{obj_abbrev}", (x, y), textcoords="offset points", xytext=(0, 10), ha="center" - ) - - # Save image if available - if "image" in result and result["image"] is not None: - clean_name = obj.replace(" ", "_").lower() - output_img_filename = f"{clean_name}_result.jpg" - cv2.imwrite(output_img_filename, result["image"]) - print(f"Saved {obj} image to {output_img_filename}") - - # Finalize plot - plt.title("Spatial Memory Map with Query Results") - plt.xlabel("X Position (m)") - plt.ylabel("Y Position (m)") - plt.grid(True) - plt.axis("equal") - plt.legend() - - # Add origin marker - plt.gca().add_patch(plt.Circle((0, 0), 1.0, fill=False, color="blue", linestyle="--")) - - # Save visualization - plt.savefig(output_filename, dpi=300) - print(f"Saved visualization to {output_filename}") - - return object_coords - - -if __name__ == "__main__": - main() diff --git a/tests/test_standalone_chromadb.py b/tests/test_standalone_chromadb.py deleted file mode 100644 index d6e59e5237..0000000000 --- a/tests/test_standalone_chromadb.py +++ /dev/null @@ -1,84 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -# ----- -from langchain_chroma import Chroma -from langchain_openai import OpenAIEmbeddings - -OPENAI_API_KEY = os.getenv("OPENAI_API_KEY") -if not OPENAI_API_KEY: - raise Exception("OpenAI key not specified.") - -collection_name = "my_collection" - -embeddings = OpenAIEmbeddings( - model="text-embedding-3-large", - dimensions=1024, - api_key=OPENAI_API_KEY, -) - -db_connection = Chroma( - collection_name=collection_name, - embedding_function=embeddings, -) - - -def add_vector(vector_id, vector_data): - """Add a vector to the ChromaDB collection.""" - if not db_connection: - raise Exception("Collection not initialized. Call connect() first.") - db_connection.add_texts( - ids=[vector_id], - texts=[vector_data], - metadatas=[{"name": vector_id}], - ) - - -add_vector("id0", "Food") -add_vector("id1", "Cat") -add_vector("id2", "Mouse") -add_vector("id3", "Bike") -add_vector("id4", "Dog") -add_vector("id5", "Tricycle") -add_vector("id6", "Car") -add_vector("id7", "Horse") -add_vector("id8", "Vehicle") -add_vector("id6", "Red") -add_vector("id7", "Orange") -add_vector("id8", "Yellow") - - -def get_vector(vector_id): - """Retrieve a vector from the ChromaDB by its identifier.""" - result = db_connection.get(include=["embeddings"], ids=[vector_id]) - return result - - -print(get_vector("id1")) -# print(get_vector("id3")) -# print(get_vector("id0")) -# print(get_vector("id2")) - - -def query(query_texts, n_results=2): - """Query the collection with a specific text and return up to n results.""" - if not db_connection: - raise Exception("Collection not initialized. Call connect() first.") - return db_connection.similarity_search(query=query_texts, k=n_results) - - -results = query("Colors") -print(results) diff --git a/tests/test_standalone_fastapi.py b/tests/test_standalone_fastapi.py deleted file mode 100644 index eb7a9a060a..0000000000 --- a/tests/test_standalone_fastapi.py +++ /dev/null @@ -1,79 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import logging -import os - -logging.basicConfig(level=logging.DEBUG) - -import cv2 -from fastapi import FastAPI -from starlette.responses import StreamingResponse -import uvicorn - -app = FastAPI() - -# Note: Chrome does not allow for loading more than 6 simultaneous -# video streams. Use Safari or another browser for utilizing -# multiple simultaneous streams. Possibly build out functionality -# that will stop live streams. - - -@app.get("/") -async def root(): - pid = os.getpid() # Get the current process ID - return {"message": f"Video Streaming Server, PID: {pid}"} - - -def video_stream_generator(): - pid = os.getpid() - print(f"Stream initiated by worker with PID: {pid}") # Log the PID when the generator is called - - # Use the correct path for your video source - cap = cv2.VideoCapture( - f"{os.getcwd()}/assets/trimmed_video_480p.mov" - ) # Change 0 to a filepath for video files - - if not cap.isOpened(): - yield (b"--frame\r\nContent-Type: text/plain\r\n\r\n" + b"Could not open video source\r\n") - return - - try: - while True: - ret, frame = cap.read() - # If frame is read correctly ret is True - if not ret: - print(f"Reached the end of the video, restarting... PID: {pid}") - cap.set( - cv2.CAP_PROP_POS_FRAMES, 0 - ) # Set the position of the next video frame to 0 (the beginning) - continue - _, buffer = cv2.imencode(".jpg", frame) - yield (b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + buffer.tobytes() + b"\r\n") - finally: - cap.release() - - -@app.get("/video") -async def video_endpoint(): - logging.debug("Attempting to open video stream.") - response = StreamingResponse( - video_stream_generator(), media_type="multipart/x-mixed-replace; boundary=frame" - ) - logging.debug("Streaming response set up.") - return response - - -if __name__ == "__main__": - uvicorn.run("__main__:app", host="0.0.0.0", port=5555, workers=20) diff --git a/tests/test_standalone_hugging_face.py b/tests/test_standalone_hugging_face.py deleted file mode 100644 index ad5f02d510..0000000000 --- a/tests/test_standalone_hugging_face.py +++ /dev/null @@ -1,121 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# from transformers import AutoModelForCausalLM, AutoTokenizer -# model_name = "Qwen/QwQ-32B" -# model = AutoModelForCausalLM.from_pretrained( -# model_name, -# torch_dtype="auto", -# device_map="auto" -# ) -# tokenizer = AutoTokenizer.from_pretrained(model_name) -# prompt = "How many r's are in the word \"strawberry\"" -# messages = [ -# {"role": "user", "content": prompt} -# ] -# text = tokenizer.apply_chat_template( -# messages, -# tokenize=False, -# add_generation_prompt=True -# ) -# model_inputs = tokenizer([text], return_tensors="pt").to(model.device) -# generated_ids = model.generate( -# **model_inputs, -# max_new_tokens=32768 -# ) -# generated_ids = [ -# output_ids[len(input_ids):] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids) -# ] -# response = tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0] -# print(response) -# ----------------------------------------------------------------------------- -# import requests -# import json -# API_URL = "https://api-inference.huggingface.co/models/Qwen/QwQ-32B" -# api_key = os.getenv('HUGGINGFACE_ACCESS_TOKEN') -# HEADERS = {"Authorization": f"Bearer {api_key}"} -# prompt = "How many r's are in the word \"strawberry\"" -# messages = [ -# {"role": "user", "content": prompt} -# ] -# # Format the prompt in the desired chat format -# chat_template = ( -# f"{messages[0]['content']}\n" -# "Assistant:" -# ) -# payload = { -# "inputs": chat_template, -# "parameters": { -# "max_new_tokens": 32768, -# "temperature": 0.7 -# } -# } -# # API request -# response = requests.post(API_URL, headers=HEADERS, json=payload) -# # Handle response -# if response.status_code == 200: -# output = response.json()[0]['generated_text'] -# print(output.strip()) -# else: -# print(f"Error {response.status_code}: {response.text}") -# ----------------------------------------------------------------------------- -# import os -# import requests -# import time -# API_URL = "https://api-inference.huggingface.co/models/Qwen/QwQ-32B" -# api_key = os.getenv('HUGGINGFACE_ACCESS_TOKEN') -# HEADERS = {"Authorization": f"Bearer {api_key}"} -# def query_with_retries(payload, max_retries=5, delay=15): -# for attempt in range(max_retries): -# response = requests.post(API_URL, headers=HEADERS, json=payload) -# if response.status_code == 200: -# return response.json()[0]['generated_text'] -# elif response.status_code == 500: # Service unavailable -# print(f"Attempt {attempt + 1}/{max_retries}: Model busy. Retrying in {delay} seconds...") -# time.sleep(delay) -# else: -# print(f"Error {response.status_code}: {response.text}") -# break -# return "Failed after multiple retries." -# prompt = "How many r's are in the word \"strawberry\"" -# messages = [{"role": "user", "content": prompt}] -# chat_template = f"{messages[0]['content']}\nAssistant:" -# payload = { -# "inputs": chat_template, -# "parameters": {"max_new_tokens": 32768, "temperature": 0.7} -# } -# output = query_with_retries(payload) -# print(output.strip()) -# ----------------------------------------------------------------------------- -import os - -from huggingface_hub import InferenceClient - -# Use environment variable for API key -api_key = os.getenv("HUGGINGFACE_ACCESS_TOKEN") - -client = InferenceClient( - provider="hf-inference", - api_key=api_key, -) - -messages = [{"role": "user", "content": 'How many r\'s are in the word "strawberry"'}] - -completion = client.chat.completions.create( - model="Qwen/QwQ-32B", - messages=messages, - max_tokens=150, -) - -print(completion.choices[0].message) diff --git a/tests/test_standalone_openai_json.py b/tests/test_standalone_openai_json.py deleted file mode 100644 index fe1a67ad78..0000000000 --- a/tests/test_standalone_openai_json.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# ----- -import dotenv - -dotenv.load_dotenv() - -import json -from textwrap import dedent - -from openai import OpenAI -from pydantic import BaseModel - -MODEL = "gpt-4o-2024-08-06" - -math_tutor_prompt = """ - You are a helpful math tutor. You will be provided with a math problem, - and your goal will be to output a step by step solution, along with a final answer. - For each step, just provide the output as an equation use the explanation field to detail the reasoning. -""" - -bad_prompt = """ - Follow the instructions. -""" - -client = OpenAI() - - -class MathReasoning(BaseModel): - class Step(BaseModel): - explanation: str - output: str - - steps: list[Step] - final_answer: str - - -def get_math_solution(question: str): - completion = client.beta.chat.completions.parse( - model=MODEL, - messages=[ - {"role": "system", "content": dedent(bad_prompt)}, - {"role": "user", "content": question}, - ], - response_format=MathReasoning, - ) - return completion.choices[0].message - - -# Web Server -import http.server -import socketserver -import urllib.parse - -PORT = 5555 - - -class CustomHandler(http.server.SimpleHTTPRequestHandler): - def do_GET(self): - # Parse query parameters from the URL - parsed_path = urllib.parse.urlparse(self.path) - query_params = urllib.parse.parse_qs(parsed_path.query) - - # Check for a specific query parameter, e.g., 'problem' - problem = query_params.get("problem", [""])[ - 0 - ] # Default to an empty string if 'problem' isn't provided - - if problem: - print(f"Problem: {problem}") - solution = get_math_solution(problem) - - if solution.refusal: - print(f"Refusal: {solution.refusal}") - - print(f"Solution: {solution}") - self.send_response(200) - else: - solution = json.dumps( - {"error": "Please provide a math problem using the 'problem' query parameter."} - ) - self.send_response(400) - - self.send_header("Content-type", "application/json; charset=utf-8") - self.end_headers() - - # Write the message content - self.wfile.write(str(solution).encode()) - - -with socketserver.TCPServer(("", PORT), CustomHandler) as httpd: - print(f"Serving at port {PORT}") - httpd.serve_forever() diff --git a/tests/test_standalone_openai_json_struct.py b/tests/test_standalone_openai_json_struct.py deleted file mode 100644 index b22f064e35..0000000000 --- a/tests/test_standalone_openai_json_struct.py +++ /dev/null @@ -1,89 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# ----- - -import dotenv - -dotenv.load_dotenv() - -from textwrap import dedent - -from openai import OpenAI -from pydantic import BaseModel - -MODEL = "gpt-4o-2024-08-06" - -math_tutor_prompt = """ - You are a helpful math tutor. You will be provided with a math problem, - and your goal will be to output a step by step solution, along with a final answer. - For each step, just provide the output as an equation use the explanation field to detail the reasoning. -""" - -general_prompt = """ - Follow the instructions. Output a step by step solution, along with a final answer. Use the explanation field to detail the reasoning. -""" - -client = OpenAI() - - -class MathReasoning(BaseModel): - class Step(BaseModel): - explanation: str - output: str - - steps: list[Step] - final_answer: str - - -def get_math_solution(question: str): - prompt = general_prompt - completion = client.beta.chat.completions.parse( - model=MODEL, - messages=[ - {"role": "system", "content": dedent(prompt)}, - {"role": "user", "content": question}, - ], - response_format=MathReasoning, - ) - return completion.choices[0].message - - -# Define Problem -problem = "What is the derivative of 3x^2" -print(f"Problem: {problem}") - -# Query for result -solution = get_math_solution(problem) - -# If the query was refused -if solution.refusal: - print(f"Refusal: {solution.refusal}") - exit() - -# If we were able to successfully parse the response back -parsed_solution = solution.parsed -if not parsed_solution: - print("Unable to Parse Solution") - exit() - -# Print solution from class definitions -print(f"Parsed: {parsed_solution}") - -steps = parsed_solution.steps -print(f"Steps: {steps}") - -final_answer = parsed_solution.final_answer -print(f"Final Answer: {final_answer}") diff --git a/tests/test_standalone_openai_json_struct_func.py b/tests/test_standalone_openai_json_struct_func.py deleted file mode 100644 index 36f158cd20..0000000000 --- a/tests/test_standalone_openai_json_struct_func.py +++ /dev/null @@ -1,174 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - - -# ----- - -import dotenv - -dotenv.load_dotenv() - -import json -from textwrap import dedent - -from openai import OpenAI, pydantic_function_tool -from pydantic import BaseModel, Field -import requests - -MODEL = "gpt-4o-2024-08-06" - -math_tutor_prompt = """ - You are a helpful math tutor. You will be provided with a math problem, - and your goal will be to output a step by step solution, along with a final answer. - For each step, just provide the output as an equation use the explanation field to detail the reasoning. -""" - -general_prompt = """ - Follow the instructions. Output a step by step solution, along with a final answer. Use the explanation field to detail the reasoning. -""" - -client = OpenAI() - - -class MathReasoning(BaseModel): - class Step(BaseModel): - explanation: str - output: str - - steps: list[Step] - final_answer: str - - -# region Function Calling -class GetWeather(BaseModel): - latitude: str = Field(..., description="latitude e.g. BogotĆ”, Colombia") - longitude: str = Field(..., description="longitude e.g. BogotĆ”, Colombia") - - -def get_weather(latitude, longitude): - response = requests.get( - f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}¤t=temperature_2m,wind_speed_10m&hourly=temperature_2m,relative_humidity_2m,wind_speed_10m&temperature_unit=fahrenheit" - ) - data = response.json() - return data["current"]["temperature_2m"] - - -def get_tools(): - return [pydantic_function_tool(GetWeather)] - - -tools = get_tools() - - -def call_function(name, args): - if name == "get_weather": - print(f"Running function: {name}") - print(f"Arguments are: {args}") - return get_weather(**args) - elif name == "GetWeather": - print(f"Running function: {name}") - print(f"Arguments are: {args}") - return get_weather(**args) - else: - return f"Local function not found: {name}" - - -def callback(message, messages, response_message, tool_calls): - if message is None or message.tool_calls is None: - print("No message or tools were called.") - return - - has_called_tools = False - for tool_call in message.tool_calls: - messages.append(response_message) - - has_called_tools = True - name = tool_call.function.name - args = json.loads(tool_call.function.arguments) - - result = call_function(name, args) - print(f"Function Call Results: {result}") - - messages.append( - {"role": "tool", "tool_call_id": tool_call.id, "content": str(result), "name": name} - ) - - # Complete the second call, after the functions have completed. - if has_called_tools: - print("Sending Second Query.") - completion_2 = client.beta.chat.completions.parse( - model=MODEL, - messages=messages, - response_format=MathReasoning, - tools=tools, - ) - print(f"Message: {completion_2.choices[0].message}") - return completion_2.choices[0].message - else: - print("No Need for Second Query.") - return None - - -# endregion Function Calling - - -def get_math_solution(question: str): - prompt = general_prompt - messages = [ - {"role": "system", "content": dedent(prompt)}, - {"role": "user", "content": question}, - ] - response = client.beta.chat.completions.parse( - model=MODEL, messages=messages, response_format=MathReasoning, tools=tools - ) - - response_message = response.choices[0].message - tool_calls = response_message.tool_calls - - new_response = callback(response.choices[0].message, messages, response_message, tool_calls) - - return new_response or response.choices[0].message - - -# Define Problem -problems = ["What is the derivative of 3x^2", "What's the weather like in San Fran today?"] -problem = problems[0] - -for problem in problems: - print("================") - print(f"Problem: {problem}") - - # Query for result - solution = get_math_solution(problem) - - # If the query was refused - if solution.refusal: - print(f"Refusal: {solution.refusal}") - break - - # If we were able to successfully parse the response back - parsed_solution = solution.parsed - if not parsed_solution: - print("Unable to Parse Solution") - print(f"Solution: {solution}") - break - - # Print solution from class definitions - print(f"Parsed: {parsed_solution}") - - steps = parsed_solution.steps - print(f"Steps: {steps}") - - final_answer = parsed_solution.final_answer - print(f"Final Answer: {final_answer}") diff --git a/tests/test_standalone_openai_json_struct_func_playground.py b/tests/test_standalone_openai_json_struct_func_playground.py deleted file mode 100644 index 8dd687148d..0000000000 --- a/tests/test_standalone_openai_json_struct_func_playground.py +++ /dev/null @@ -1,197 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# ----- -# # Milestone 1 -# from typing import List, Dict, Optional -# import requests -# import json -# from pydantic import BaseModel, Field -# from openai import OpenAI, pydantic_function_tool -# # Environment setup -# import dotenv -# dotenv.load_dotenv() -# # Constants and prompts -# MODEL = "gpt-4o-2024-08-06" -# GENERAL_PROMPT = ''' -# Follow the instructions. Output a step by step solution, along with a final answer. -# Use the explanation field to detail the reasoning. -# ''' -# # Initialize OpenAI client -# client = OpenAI() -# # Models and functions -# class Step(BaseModel): -# explanation: str -# output: str -# class MathReasoning(BaseModel): -# steps: List[Step] -# final_answer: str -# class GetWeather(BaseModel): -# latitude: str = Field(..., description="Latitude e.g., BogotĆ”, Colombia") -# longitude: str = Field(..., description="Longitude e.g., BogotĆ”, Colombia") -# def fetch_weather(latitude: str, longitude: str) -> Dict: -# url = f"https://api.open-meteo.com/v1/forecast?latitude={latitude}&longitude={longitude}¤t=temperature_2m,wind_speed_10m&hourly=temperature_2m,relative_humidity_2m,wind_speed_10m&temperature_unit=fahrenheit" -# response = requests.get(url) -# return response.json().get('current', {}) -# # Tool management -# def get_tools() -> List[BaseModel]: -# return [pydantic_function_tool(GetWeather)] -# def handle_function_call(tool_call: Dict) -> Optional[str]: -# if tool_call['name'] == "get_weather": -# result = fetch_weather(**tool_call['args']) -# return f"Temperature is {result['temperature_2m']}°F" -# return None -# # Communication and processing with OpenAI -# def process_message_with_openai(question: str) -> MathReasoning: -# messages = [ -# {"role": "system", "content": GENERAL_PROMPT.strip()}, -# {"role": "user", "content": question} -# ] -# response = client.beta.chat.completions.parse( -# model=MODEL, -# messages=messages, -# response_format=MathReasoning, -# tools=get_tools() -# ) -# return response.choices[0].message -# def get_math_solution(question: str) -> MathReasoning: -# solution = process_message_with_openai(question) -# return solution -# # Example usage -# def main(): -# problems = [ -# "What is the derivative of 3x^2", -# "What's the weather like in San Francisco today?" -# ] -# problem = problems[1] -# print(f"Problem: {problem}") -# solution = get_math_solution(problem) -# if not solution: -# print("Failed to get a solution.") -# return -# if not solution.parsed: -# print("Failed to get a parsed solution.") -# print(f"Solution: {solution}") -# return -# print(f"Steps: {solution.parsed.steps}") -# print(f"Final Answer: {solution.parsed.final_answer}") -# if __name__ == "__main__": -# main() -# # Milestone 1 -# Milestone 2 -import json - -from dotenv import load_dotenv -import requests - -load_dotenv() - -from openai import OpenAI - -client = OpenAI() - - -def get_current_weather(latitude, longitude): - """Get the current weather in a given latitude and longitude using the 7Timer API""" - base = "http://www.7timer.info/bin/api.pl" - request_url = f"{base}?lon={longitude}&lat={latitude}&product=civillight&output=json" - response = requests.get(request_url) - - # Parse response to extract the main weather data - weather_data = response.json() - current_data = weather_data.get("dataseries", [{}])[0] - - result = { - "latitude": latitude, - "longitude": longitude, - "temp": current_data.get("temp2m", {"max": "Unknown", "min": "Unknown"}), - "humidity": "Unknown", - } - - # Convert the dictionary to JSON string to match the given structure - return json.dumps(result) - - -def run_conversation(content): - messages = [{"role": "user", "content": content}] - tools = [ - { - "type": "function", - "function": { - "name": "get_current_weather", - "description": "Get the current weather in a given latitude and longitude", - "parameters": { - "type": "object", - "properties": { - "latitude": { - "type": "string", - "description": "The latitude of a place", - }, - "longitude": { - "type": "string", - "description": "The longitude of a place", - }, - }, - "required": ["latitude", "longitude"], - }, - }, - } - ] - response = client.chat.completions.create( - model="gpt-3.5-turbo-0125", - messages=messages, - tools=tools, - tool_choice="auto", - ) - response_message = response.choices[0].message - tool_calls = response_message.tool_calls - - if tool_calls: - messages.append(response_message) - - available_functions = { - "get_current_weather": get_current_weather, - } - for tool_call in tool_calls: - print(f"Function: {tool_call.function.name}") - print(f"Params:{tool_call.function.arguments}") - function_name = tool_call.function.name - function_to_call = available_functions[function_name] - function_args = json.loads(tool_call.function.arguments) - function_response = function_to_call( - latitude=function_args.get("latitude"), - longitude=function_args.get("longitude"), - ) - print(f"API: {function_response}") - messages.append( - { - "tool_call_id": tool_call.id, - "role": "tool", - "name": function_name, - "content": function_response, - } - ) - - second_response = client.chat.completions.create( - model="gpt-3.5-turbo-0125", messages=messages, stream=True - ) - return second_response - - -if __name__ == "__main__": - question = "What's the weather like in Paris and San Francisco?" - response = run_conversation(question) - for chunk in response: - print(chunk.choices[0].delta.content or "", end="", flush=True) -# Milestone 2 diff --git a/tests/test_standalone_project_out.py b/tests/test_standalone_project_out.py deleted file mode 100644 index 13211d8032..0000000000 --- a/tests/test_standalone_project_out.py +++ /dev/null @@ -1,135 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -# ----- -import ast -import inspect -import sys - - -def extract_function_info(filename): - with open(filename) as f: - source = f.read() - tree = ast.parse(source, filename=filename) - - function_info = [] - - # Use a dictionary to track functions - module_globals = {} - - # Add the source to the locals (useful if you use local functions) - exec(source, module_globals) - - for node in ast.walk(tree): - if isinstance(node, ast.FunctionDef | ast.AsyncFunctionDef): - docstring = ast.get_docstring(node) or "" - - # Attempt to get the callable object from the globals - try: - if node.name in module_globals: - func_obj = module_globals[node.name] - signature = inspect.signature(func_obj) - function_info.append( - {"name": node.name, "signature": str(signature), "docstring": docstring} - ) - else: - function_info.append( - { - "name": node.name, - "signature": "Could not get signature", - "docstring": docstring, - } - ) - except TypeError as e: - print( - f"Could not get function signature for {node.name} in {filename}: {e}", - file=sys.stderr, - ) - function_info.append( - { - "name": node.name, - "signature": "Could not get signature", - "docstring": docstring, - } - ) - - class_info = [] - for node in ast.walk(tree): - if isinstance(node, ast.ClassDef): - docstring = ast.get_docstring(node) or "" - methods = [] - for method in node.body: - if isinstance(method, ast.FunctionDef | ast.AsyncFunctionDef): - method_docstring = ast.get_docstring(method) or "" - try: - if node.name in module_globals: - class_obj = module_globals[node.name] - method_obj = getattr(class_obj, method.name) - signature = inspect.signature(method_obj) - methods.append( - { - "name": method.name, - "signature": str(signature), - "docstring": method_docstring, - } - ) - else: - methods.append( - { - "name": method.name, - "signature": "Could not get signature", - "docstring": method_docstring, - } - ) - except AttributeError as e: - print( - f"Could not get method signature for {node.name}.{method.name} in {filename}: {e}", - file=sys.stderr, - ) - methods.append( - { - "name": method.name, - "signature": "Could not get signature", - "docstring": method_docstring, - } - ) - except TypeError as e: - print( - f"Could not get method signature for {node.name}.{method.name} in {filename}: {e}", - file=sys.stderr, - ) - methods.append( - { - "name": method.name, - "signature": "Could not get signature", - "docstring": method_docstring, - } - ) - class_info.append({"name": node.name, "docstring": docstring, "methods": methods}) - - return {"function_info": function_info, "class_info": class_info} - - -# Usage: -file_path = "./dimos/agents_deprecated/memory/base.py" -extracted_info = extract_function_info(file_path) -print(extracted_info) - -file_path = "./dimos/agents_deprecated/memory/chroma_impl.py" -extracted_info = extract_function_info(file_path) -print(extracted_info) - -file_path = "./dimos/agents_deprecated/agent.py" -extracted_info = extract_function_info(file_path) -print(extracted_info) diff --git a/tests/test_standalone_rxpy_01.py b/tests/test_standalone_rxpy_01.py deleted file mode 100644 index 9be48f3eab..0000000000 --- a/tests/test_standalone_rxpy_01.py +++ /dev/null @@ -1,130 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import multiprocessing -from threading import Event - -# ----- -import reactivex -from reactivex import operators as ops -from reactivex.scheduler import ThreadPoolScheduler - -which_test = 2 -if which_test == 1: - """ - Test 1: Periodic Emission Test - - This test creates a ThreadPoolScheduler that leverages as many threads as there are CPU - cores available, optimizing the execution across multiple threads. The core functionality - revolves around an observable, secondly_emission, which emits a value every second. - Each emission is an incrementing integer, which is then mapped to a message indicating - the number of seconds since the test began. The sequence is limited to 30 emissions, - each logged as it occurs, and accompanied by an additional message via the - emission_process function to indicate the value's emission. The test subscribes to the - observable to print each emitted value, handle any potential errors, and confirm - completion of the emissions after 30 seconds. - - Key Components: - • ThreadPoolScheduler: Manages concurrency with multiple threads. - • Observable Sequence: Emits every second, indicating progression with a specific - message format. - • Subscription: Monitors and logs emissions, errors, and the completion event. - """ - - # Create a scheduler that uses as many threads as there are CPUs available - optimal_thread_count = multiprocessing.cpu_count() - pool_scheduler = ThreadPoolScheduler(optimal_thread_count) - - def emission_process(value): - print(f"Emitting: {value}") - - # Create an observable that emits every second - secondly_emission = reactivex.interval(1.0, scheduler=pool_scheduler).pipe( - ops.map(lambda x: f"Value {x} emitted after {x + 1} second(s)"), - ops.do_action(emission_process), - ops.take(30), # Limit the emission to 30 times - ) - - # Subscribe to the observable to start emitting - secondly_emission.subscribe( - on_next=lambda x: print(x), - on_error=lambda e: print(e), - on_completed=lambda: print("Emission completed."), - scheduler=pool_scheduler, - ) - -elif which_test == 2: - """ - Test 2: Combined Emission Test - - In this test, a similar ThreadPoolScheduler setup is used to handle tasks across multiple - CPU cores efficiently. This setup includes two observables. The first, secondly_emission, - emits an incrementing integer every second, indicating the passage of time. The second - observable, immediate_emission, emits a predefined sequence of characters (['a', 'b', - 'c', 'd', 'e']) repeatedly and immediately. These two streams are combined using the zip - operator, which synchronizes their emissions into pairs. Each combined pair is formatted - and logged, indicating both the time elapsed and the immediate value emitted at that - second. - - A synchronization mechanism via an Event (completed_event) ensures that the main program - thread waits until all planned emissions are completed before exiting. This test not only - checks the functionality of zipping different rhythmic emissions but also demonstrates - handling of asynchronous task completion in Python using event-driven programming. - - Key Components: - • Combined Observable Emissions: Synchronizes periodic and immediate emissions into - a single stream. - • Event Synchronization: Uses a threading event to manage program lifecycle and - ensure that all emissions are processed before shutdown. - • Complex Subscription Management: Handles errors and completion, including - setting an event to signal the end of task processing. - """ - - # Create a scheduler with optimal threads - optimal_thread_count = multiprocessing.cpu_count() - pool_scheduler = ThreadPoolScheduler(optimal_thread_count) - - # Define an event to wait for the observable to complete - completed_event = Event() - - def emission_process(value): - print(f"Emitting: {value}") - - # Observable that emits every second - secondly_emission = reactivex.interval(1.0, scheduler=pool_scheduler).pipe( - ops.map(lambda x: f"Second {x + 1}"), ops.take(30) - ) - - # Observable that emits values immediately and repeatedly - immediate_emission = reactivex.from_(["a", "b", "c", "d", "e"]).pipe(ops.repeat()) - - # Combine emissions using zip - combined_emissions = reactivex.zip(secondly_emission, immediate_emission).pipe( - ops.map(lambda combined: f"{combined[0]} - Value: {combined[1]}"), - ops.do_action(lambda s: print(f"Combined emission: {s}")), - ) - - # Subscribe to the combined emissions - combined_emissions.subscribe( - on_next=lambda x: print(x), - on_error=lambda e: print(f"Error: {e}"), - on_completed=lambda: { - print("Combined emission completed."), - completed_event.set(), # Set the event to signal completion - }, - scheduler=pool_scheduler, - ) - - # Wait for the observable to complete - completed_event.wait() diff --git a/tests/test_unitree_agent.py b/tests/test_unitree_agent.py deleted file mode 100644 index c9999b6f20..0000000000 --- a/tests/test_unitree_agent.py +++ /dev/null @@ -1,317 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import time - -from dimos.web.fastapi_server import FastAPIServer - -print(f"Current working directory: {os.getcwd()}") - -# ----- - -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.stream.data_provider import QueryDataProvider - -MOCK_CONNECTION = True - - -class UnitreeAgentDemo: - def __init__(self): - self.robot_ip = None - self.connection_method = None - self.serial_number = None - self.output_dir = None - self._fetch_env_vars() - - def _fetch_env_vars(self): - print("Fetching environment variables") - - def get_env_var(var_name, default=None, required=False): - """Get environment variable with validation.""" - value = os.getenv(var_name, default) - if required and not value: - raise ValueError(f"{var_name} environment variable is required") - return value - - self.robot_ip = get_env_var("ROBOT_IP", required=True) - self.connection_method = get_env_var("CONN_TYPE") - self.serial_number = get_env_var("SERIAL_NUMBER") - self.output_dir = get_env_var( - "ROS_OUTPUT_DIR", os.path.join(os.getcwd(), "assets/output/ros") - ) - - def _initialize_robot(self, with_video_stream=True): - print( - f"Initializing Unitree Robot {'with' if with_video_stream else 'without'} Video Stream" - ) - self.robot = UnitreeGo2( - ip=self.robot_ip, - connection_method=self.connection_method, - serial_number=self.serial_number, - output_dir=self.output_dir, - disable_video_stream=(not with_video_stream), - mock_connection=MOCK_CONNECTION, - ) - print(f"Robot initialized: {self.robot}") - - # ----- - - def run_with_queries(self): - # Initialize robot - self._initialize_robot(with_video_stream=False) - - # Initialize query stream - query_provider = QueryDataProvider() - - # Create the skills available to the agent. - # By default, this will create all skills in this class and make them available. - skills_instance = MyUnitreeSkills(robot=self.robot) - - print("Starting Unitree Perception Agent") - self.UnitreePerceptionAgent = OpenAIAgent( - dev_name="UnitreePerceptionAgent", - agent_type="Perception", - input_query_stream=query_provider.data_stream, - output_dir=self.output_dir, - skills=skills_instance, - # frame_processor=frame_processor, - ) - - # Start the query stream. - # Queries will be pushed every 1 second, in a count from 100 to 5000. - # This will cause listening agents to consume the queries and respond - # to them via skill execution and provide 1-shot responses. - query_provider.start_query_stream( - query_template="{query}; Denote the number at the beginning of this query before the semicolon as the 'reference number'. Provide the reference number, without any other text in your response. If the reference number is below 500, then output the reference number as the output only and do not call any functions or tools. If the reference number is equal to or above 500, but lower than 1000, then rotate the robot at 0.5 rad/s for 1 second. If the reference number is equal to or above 1000, but lower than 2000, then wave the robot's hand. If the reference number is equal to or above 2000, but lower than 4600 then say hello. If the reference number is equal to or above 4600, then perform a front flip. IF YOU DO NOT FOLLOW THESE INSTRUCTIONS EXACTLY, YOU WILL DIE!!!", - frequency=0.01, - start_count=1, - end_count=10000, - step=1, - ) - - def run_with_test_video(self): - # Initialize robot - self._initialize_robot(with_video_stream=False) - - # Initialize test video stream - from dimos.stream.video_provider import VideoProvider - - self.video_stream = VideoProvider( - dev_name="UnitreeGo2", video_source=f"{os.getcwd()}/assets/framecount.mp4" - ).capture_video_as_observable(realtime=False, fps=1) - - # Get Skills - # By default, this will create all skills in this class and make them available to the agent. - skills_instance = MyUnitreeSkills(robot=self.robot) - - print("Starting Unitree Perception Agent (Test Video)") - self.UnitreePerceptionAgent = OpenAIAgent( - dev_name="UnitreePerceptionAgent", - agent_type="Perception", - input_video_stream=self.video_stream, - output_dir=self.output_dir, - query="Denote the number you see in the image as the 'reference number'. Only provide the reference number, without any other text in your response. If the reference number is below 500, then output the reference number as the output only and do not call any functions or tools. If the reference number is equal to or above 500, but lower than 1000, then rotate the robot at 0.5 rad/s for 1 second. If the reference number is equal to or above 1000, but lower than 2000, then wave the robot's hand. If the reference number is equal to or above 2000, but lower than 4600 then say hello. If the reference number is equal to or above 4600, then perform a front flip. IF YOU DO NOT FOLLOW THESE INSTRUCTIONS EXACTLY, YOU WILL DIE!!!", - image_detail="high", - skills=skills_instance, - # frame_processor=frame_processor, - ) - - def run_with_ros_video(self): - # Initialize robot - self._initialize_robot() - - # Initialize ROS video stream - print("Starting Unitree Perception Stream") - self.video_stream = self.robot.get_ros_video_stream() - - # Get Skills - # By default, this will create all skills in this class and make them available to the agent. - skills_instance = MyUnitreeSkills(robot=self.robot) - - # Run recovery stand - print("Running recovery stand") - self.robot.webrtc_req(api_id=1006) - - # Wait for 1 second - time.sleep(1) - - # Switch to sport mode - print("Switching to sport mode") - self.robot.webrtc_req(api_id=1011, parameter='{"gait_type": "sport"}') - - # Wait for 1 second - time.sleep(1) - - print("Starting Unitree Perception Agent (ROS Video)") - self.UnitreePerceptionAgent = OpenAIAgent( - dev_name="UnitreePerceptionAgent", - agent_type="Perception", - input_video_stream=self.video_stream, - output_dir=self.output_dir, - query="Based on the image, execute the command seen in the image AND ONLY THE COMMAND IN THE IMAGE. IF YOU DO NOT FOLLOW THESE INSTRUCTIONS EXACTLY, YOU WILL DIE!!!", - # WORKING MOVEMENT DEMO VVV - # query="Move() 5 meters foward. Then spin 360 degrees to the right, and then Reverse() 5 meters, and then Move forward 3 meters", - image_detail="high", - skills=skills_instance, - # frame_processor=frame_processor, - ) - - def run_with_multiple_query_and_test_video_agents(self): - # Initialize robot - self._initialize_robot(with_video_stream=False) - - # Initialize query stream - query_provider = QueryDataProvider() - - # Initialize test video stream - from dimos.stream.video_provider import VideoProvider - - self.video_stream = VideoProvider( - dev_name="UnitreeGo2", video_source=f"{os.getcwd()}/assets/framecount.mp4" - ).capture_video_as_observable(realtime=False, fps=1) - - # Create the skills available to the agent. - # By default, this will create all skills in this class and make them available. - skills_instance = MyUnitreeSkills(robot=self.robot) - - print("Starting Unitree Perception Agent") - self.UnitreeQueryPerceptionAgent = OpenAIAgent( - dev_name="UnitreeQueryPerceptionAgent", - agent_type="Perception", - input_query_stream=query_provider.data_stream, - output_dir=self.output_dir, - skills=skills_instance, - # frame_processor=frame_processor, - ) - - print("Starting Unitree Perception Agent Two") - self.UnitreeQueryPerceptionAgentTwo = OpenAIAgent( - dev_name="UnitreeQueryPerceptionAgentTwo", - agent_type="Perception", - input_query_stream=query_provider.data_stream, - output_dir=self.output_dir, - skills=skills_instance, - # frame_processor=frame_processor, - ) - - print("Starting Unitree Perception Agent (Test Video)") - self.UnitreeVideoPerceptionAgent = OpenAIAgent( - dev_name="UnitreeVideoPerceptionAgent", - agent_type="Perception", - input_video_stream=self.video_stream, - output_dir=self.output_dir, - query="Denote the number you see in the image as the 'reference number'. Only provide the reference number, without any other text in your response. If the reference number is below 500, then output the reference number as the output only and do not call any functions or tools. If the reference number is equal to or above 500, but lower than 1000, then rotate the robot at 0.5 rad/s for 1 second. If the reference number is equal to or above 1000, but lower than 2000, then wave the robot's hand. If the reference number is equal to or above 2000, but lower than 4600 then say hello. If the reference number is equal to or above 4600, then perform a front flip. IF YOU DO NOT FOLLOW THESE INSTRUCTIONS EXACTLY, YOU WILL DIE!!!", - image_detail="high", - skills=skills_instance, - # frame_processor=frame_processor, - ) - - print("Starting Unitree Perception Agent Two (Test Video)") - self.UnitreeVideoPerceptionAgentTwo = OpenAIAgent( - dev_name="UnitreeVideoPerceptionAgentTwo", - agent_type="Perception", - input_video_stream=self.video_stream, - output_dir=self.output_dir, - query="Denote the number you see in the image as the 'reference number'. Only provide the reference number, without any other text in your response. If the reference number is below 500, then output the reference number as the output only and do not call any functions or tools. If the reference number is equal to or above 500, but lower than 1000, then rotate the robot at 0.5 rad/s for 1 second. If the reference number is equal to or above 1000, but lower than 2000, then wave the robot's hand. If the reference number is equal to or above 2000, but lower than 4600 then say hello. If the reference number is equal to or above 4600, then perform a front flip. IF YOU DO NOT FOLLOW THESE INSTRUCTIONS EXACTLY, YOU WILL DIE!!!", - image_detail="high", - skills=skills_instance, - # frame_processor=frame_processor, - ) - - # Start the query stream. - # Queries will be pushed every 1 second, in a count from 100 to 5000. - # This will cause listening agents to consume the queries and respond - # to them via skill execution and provide 1-shot responses. - query_provider.start_query_stream( - query_template="{query}; Denote the number at the beginning of this query before the semicolon as the 'reference number'. Provide the reference number, without any other text in your response. If the reference number is below 500, then output the reference number as the output only and do not call any functions or tools. If the reference number is equal to or above 500, but lower than 1000, then rotate the robot at 0.5 rad/s for 1 second. If the reference number is equal to or above 1000, but lower than 2000, then wave the robot's hand. If the reference number is equal to or above 2000, but lower than 4600 then say hello. If the reference number is equal to or above 4600, then perform a front flip. IF YOU DO NOT FOLLOW THESE INSTRUCTIONS EXACTLY, YOU WILL DIE!!!", - frequency=0.01, - start_count=1, - end_count=10000000, - step=1, - ) - - def run_with_queries_and_fast_api(self): - # Initialize robot - self._initialize_robot(with_video_stream=True) - - # Initialize ROS video stream - print("Starting Unitree Perception Stream") - self.video_stream = self.robot.get_ros_video_stream() - - # Initialize test video stream - # from dimos.stream.video_provider import VideoProvider - # self.video_stream = VideoProvider( - # dev_name="UnitreeGo2", - # video_source=f"{os.getcwd()}/assets/framecount.mp4" - # ).capture_video_as_observable(realtime=False, fps=1) - - # Will be visible at http://[host]:[port]/video_feed/[key] - streams = { - "unitree_video": self.video_stream, - } - fast_api_server = FastAPIServer(port=5555, **streams) - - # Create the skills available to the agent. - skills_instance = MyUnitreeSkills(robot=self.robot) - - print("Starting Unitree Perception Agent") - self.UnitreeQueryPerceptionAgent = OpenAIAgent( - dev_name="UnitreeQueryPerceptionAgent", - agent_type="Perception", - input_query_stream=fast_api_server.query_stream, - output_dir=self.output_dir, - skills=skills_instance, - ) - - # Run the FastAPI server (this will block) - fast_api_server.run() - - # ----- - - def stop(self): - print("Stopping Unitree Agent") - self.robot.cleanup() - - -if __name__ == "__main__": - myUnitreeAgentDemo = UnitreeAgentDemo() - - test_to_run = 4 - - if test_to_run == 0: - myUnitreeAgentDemo.run_with_queries() - elif test_to_run == 1: - myUnitreeAgentDemo.run_with_test_video() - elif test_to_run == 2: - myUnitreeAgentDemo.run_with_ros_video() - elif test_to_run == 3: - myUnitreeAgentDemo.run_with_multiple_query_and_test_video_agents() - elif test_to_run == 4: - myUnitreeAgentDemo.run_with_queries_and_fast_api() - elif test_to_run < 0 or test_to_run >= 5: - raise AssertionError(f"Invalid test number: {test_to_run}") - - # Keep the program running to allow the Unitree Agent Demo to operate continuously - try: - print("\nRunning Unitree Agent Demo (Press Ctrl+C to stop)...") - while True: - time.sleep(0.1) - except KeyboardInterrupt: - print("\nStopping Unitree Agent Demo") - myUnitreeAgentDemo.stop() - except Exception as e: - print(f"Error in main loop: {e}") diff --git a/tests/test_unitree_agent_queries_fastapi.py b/tests/test_unitree_agent_queries_fastapi.py deleted file mode 100644 index 77c36c14ef..0000000000 --- a/tests/test_unitree_agent_queries_fastapi.py +++ /dev/null @@ -1,106 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Unitree Go2 robot agent demo with FastAPI server integration. - -Connects a Unitree Go2 robot to an OpenAI agent with a web interface. - -Environment Variables: - OPENAI_API_KEY: Required. OpenAI API key. - ROBOT_IP: Required. IP address of the Unitree robot. - CONN_TYPE: Required. Connection method to the robot. - ROS_OUTPUT_DIR: Optional. Directory for ROS output files. -""" - -import os -import sys - -import reactivex as rx -import reactivex.operators as ops - -# Local application imports -from dimos.agents_deprecated.agent import OpenAIAgent -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.utils.logging_config import setup_logger -from dimos.web.fastapi_server import FastAPIServer - -logger = setup_logger() - - -def main(): - # Get environment variables - robot_ip = os.getenv("ROBOT_IP") - if not robot_ip: - raise ValueError("ROBOT_IP environment variable is required") - connection_method = os.getenv("CONN_TYPE") or "webrtc" - output_dir = os.getenv("ROS_OUTPUT_DIR", os.path.join(os.getcwd(), "assets/output/ros")) - - try: - # Initialize robot - logger.info("Initializing Unitree Robot") - robot = UnitreeGo2( - ip=robot_ip, - connection_method=connection_method, - output_dir=output_dir, - skills=MyUnitreeSkills(), - ) - - # Set up video stream - logger.info("Starting video stream") - video_stream = robot.get_ros_video_stream() - - # Create FastAPI server with video stream and text streams - logger.info("Initializing FastAPI server") - streams = {"unitree_video": video_stream} - - # Create a subject for agent responses - agent_response_subject = rx.subject.Subject() - agent_response_stream = agent_response_subject.pipe(ops.share()) - - text_streams = { - "agent_responses": agent_response_stream, - } - - web_interface = FastAPIServer(port=5555, text_streams=text_streams, **streams) - - logger.info("Starting action primitive execution agent") - agent = OpenAIAgent( - dev_name="UnitreeQueryExecutionAgent", - input_query_stream=web_interface.query_stream, - output_dir=output_dir, - skills=robot.get_skills(), - ) - - # Subscribe to agent responses and send them to the subject - agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) - - # Start server (blocking call) - logger.info("Starting FastAPI server") - web_interface.run() - - except KeyboardInterrupt: - print("Stopping demo...") - except Exception as e: - logger.error(f"Error: {e}") - return 1 - finally: - if robot: - robot.cleanup() - - return 0 - - -if __name__ == "__main__": - sys.exit(main()) diff --git a/tests/test_unitree_ros_v0.0.4.py b/tests/test_unitree_ros_v0.0.4.py deleted file mode 100644 index bee088b85a..0000000000 --- a/tests/test_unitree_ros_v0.0.4.py +++ /dev/null @@ -1,193 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os - -from dotenv import load_dotenv -import reactivex as rx -import reactivex.operators as ops - -from dimos.agents_deprecated.claude_agent import ClaudeAgent -from dimos.perception.detection2d.detic_2d_det import Detic2DDetector -from dimos.perception.object_detection_stream import ObjectDetectionStream -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.skills.kill_skill import KillSkill -from dimos.skills.navigation import GetPose, NavigateWithText -from dimos.skills.observe_stream import ObserveStream -from dimos.skills.speak import Speak -from dimos.skills.visual_navigation_skills import FollowHuman -from dimos.stream.audio.pipelines import stt, tts -from dimos.utils.reactive import backpressure -from dimos.web.robot_web_interface import RobotWebInterface - -# Load API key from environment -load_dotenv() - -# Allow command line arguments to control spatial memory parameters -import argparse - - -def parse_arguments(): - parser = argparse.ArgumentParser( - description="Run the robot with optional spatial memory parameters" - ) - parser.add_argument( - "--voice", - action="store_true", - help="Use voice input from microphone instead of web interface", - ) - return parser.parse_args() - - -args = parse_arguments() - -# Initialize robot with spatial memory parameters -robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), - skills=MyUnitreeSkills(), - mock_connection=False, - new_memory=True, -) - -# Create a subject for agent responses -agent_response_subject = rx.subject.Subject() -agent_response_stream = agent_response_subject.pipe(ops.share()) -local_planner_viz_stream = robot.local_planner_viz_stream.pipe(ops.share()) - -# Initialize object detection stream -min_confidence = 0.6 -class_filter = None # No class filtering -detector = Detic2DDetector(vocabulary=None, threshold=min_confidence) - -# Create video stream from robot's camera -video_stream = backpressure(robot.get_ros_video_stream()) - -# Initialize ObjectDetectionStream with robot -object_detector = ObjectDetectionStream( - camera_intrinsics=robot.camera_intrinsics, - min_confidence=min_confidence, - class_filter=class_filter, - transform_to_map=robot.ros_control.transform_pose, - detector=detector, - video_stream=video_stream, -) - -# Create visualization stream for web interface -viz_stream = backpressure(object_detector.get_stream()).pipe( - ops.share(), - ops.map(lambda x: x["viz_frame"] if x is not None else None), - ops.filter(lambda x: x is not None), -) - -# Get the formatted detection stream -formatted_detection_stream = object_detector.get_formatted_stream().pipe( - ops.filter(lambda x: x is not None) -) - - -# Create a direct mapping that combines detection data with locations -def combine_with_locations(object_detections): - # Get locations from spatial memory - try: - locations = robot.get_spatial_memory().get_robot_locations() - - # Format the locations section - locations_text = "\n\nSaved Robot Locations:\n" - if locations: - for loc in locations: - locations_text += f"- {loc.name}: Position ({loc.position[0]:.2f}, {loc.position[1]:.2f}, {loc.position[2]:.2f}), " - locations_text += f"Rotation ({loc.rotation[0]:.2f}, {loc.rotation[1]:.2f}, {loc.rotation[2]:.2f})\n" - else: - locations_text += "None\n" - - # Simply concatenate the strings - return object_detections + locations_text - except Exception as e: - print(f"Error adding locations: {e}") - return object_detections - - -# Create the combined stream with a simple pipe operation -enhanced_data_stream = formatted_detection_stream.pipe(ops.map(combine_with_locations), ops.share()) - -streams = { - "unitree_video": robot.get_ros_video_stream(), - "local_planner_viz": local_planner_viz_stream, - "object_detection": viz_stream, -} -text_streams = { - "agent_responses": agent_response_stream, -} - -web_interface = RobotWebInterface(port=5555, text_streams=text_streams, **streams) - -stt_node = stt() - -# Read system query from prompt.txt file -with open( - os.path.join(os.path.dirname(os.path.dirname(__file__)), "assets", "agent", "prompt.txt") -) as f: - system_query = f.read() - -# Create a ClaudeAgent instance with either voice input or web interface input based on flag -input_stream = stt_node.emit_text() if args.voice else web_interface.query_stream -print(f"Using {'voice input' if args.voice else 'web interface input'} for queries") - -agent = ClaudeAgent( - dev_name="test_agent", - input_query_stream=input_stream, - input_data_stream=enhanced_data_stream, # Add the enhanced data stream - skills=robot.get_skills(), - system_query=system_query, - model_name="claude-3-7-sonnet-latest", - thinking_budget_tokens=0, -) - -# Initialize TTS node only if voice flag is set -tts_node = None -if args.voice: - print("Voice mode: Enabling TTS for speech output") - tts_node = tts() - tts_node.consume_text(agent.get_response_observable()) -else: - print("Web interface mode: Disabling TTS to avoid audio issues") - -robot_skills = robot.get_skills() -robot_skills.add(ObserveStream) -robot_skills.add(KillSkill) -robot_skills.add(NavigateWithText) -robot_skills.add(FollowHuman) -robot_skills.add(GetPose) -# Add Speak skill only if voice flag is set -if args.voice: - robot_skills.add(Speak) -# robot_skills.add(NavigateToGoal) -robot_skills.create_instance("ObserveStream", robot=robot, agent=agent) -robot_skills.create_instance("KillSkill", robot=robot, skill_library=robot_skills) -robot_skills.create_instance("NavigateWithText", robot=robot) -robot_skills.create_instance("FollowHuman", robot=robot) -robot_skills.create_instance("GetPose", robot=robot) -# robot_skills.create_instance("NavigateToGoal", robot=robot) -# Create Speak skill instance only if voice flag is set -if args.voice: - robot_skills.create_instance("Speak", tts_node=tts_node) - -# Subscribe to agent responses and send them to the subject -agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) - -print("ObserveStream and Kill skills registered and ready for use") -print("Created memory.txt file") - -web_interface.run() diff --git a/tests/test_webrtc_queue.py b/tests/test_webrtc_queue.py deleted file mode 100644 index 5e09ec1f9d..0000000000 --- a/tests/test_webrtc_queue.py +++ /dev/null @@ -1,155 +0,0 @@ -#!/usr/bin/env python3 - -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import os -import time - -from dimos.robot.unitree.unitree_go2 import UnitreeGo2, WebRTCConnectionMethod -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl - - -def main(): - """Test WebRTC request queue with a sequence of 20 back-to-back commands""" - - print("Initializing UnitreeGo2...") - - # Get configuration from environment variables - - robot_ip = os.getenv("ROBOT_IP") - connection_method = getattr(WebRTCConnectionMethod, os.getenv("CONNECTION_METHOD", "LocalSTA")) - - # Initialize ROS control - ros_control = UnitreeROSControl(node_name="unitree_go2_test", use_raw=True) - - # Initialize robot - robot = UnitreeGo2( - ip=robot_ip, - connection_method=connection_method, - ros_control=ros_control, - use_ros=True, - use_webrtc=False, # Using queue instead of direct WebRTC - ) - - # Wait for initialization - print("Waiting for robot to initialize...") - time.sleep(5) - - # First put the robot in a good starting state - print("Running recovery stand...") - robot.webrtc_req(api_id=1006) # RecoveryStand - - # Queue 20 WebRTC requests back-to-back - print("\nšŸ¤– QUEUEING 20 COMMANDS BACK-TO-BACK šŸ¤–\n") - - # Dance 1 - robot.webrtc_req(api_id=1022) # Dance1 - print("Queued: Dance1 (1022)") - - # Wiggle Hips - robot.webrtc_req(api_id=1033) # WiggleHips - print("Queued: WiggleHips (1033)") - - # Stretch - robot.webrtc_req(api_id=1017) # Stretch - print("Queued: Stretch (1017)") - - # Hello - robot.webrtc_req(api_id=1016) # Hello - print("Queued: Hello (1016)") - - # Dance 2 - robot.webrtc_req(api_id=1023) # Dance2 - print("Queued: Dance2 (1023)") - - # Wallow - robot.webrtc_req(api_id=1021) # Wallow - print("Queued: Wallow (1021)") - - # Scrape - robot.webrtc_req(api_id=1029) # Scrape - print("Queued: Scrape (1029)") - - # Finger Heart - robot.webrtc_req(api_id=1036) # FingerHeart - print("Queued: FingerHeart (1036)") - - # Recovery Stand (base position) - robot.webrtc_req(api_id=1006) # RecoveryStand - print("Queued: RecoveryStand (1006)") - - # Hello again - robot.webrtc_req(api_id=1016) # Hello - print("Queued: Hello (1016)") - - # Wiggle Hips again - robot.webrtc_req(api_id=1033) # WiggleHips - print("Queued: WiggleHips (1033)") - - # Front Pounce - robot.webrtc_req(api_id=1032) # FrontPounce - print("Queued: FrontPounce (1032)") - - # Dance 1 again - robot.webrtc_req(api_id=1022) # Dance1 - print("Queued: Dance1 (1022)") - - # Stretch again - robot.webrtc_req(api_id=1017) # Stretch - print("Queued: Stretch (1017)") - - # Front Jump - robot.webrtc_req(api_id=1031) # FrontJump - print("Queued: FrontJump (1031)") - - # Finger Heart again - robot.webrtc_req(api_id=1036) # FingerHeart - print("Queued: FingerHeart (1036)") - - # Scrape again - robot.webrtc_req(api_id=1029) # Scrape - print("Queued: Scrape (1029)") - - # Hello one more time - robot.webrtc_req(api_id=1016) # Hello - print("Queued: Hello (1016)") - - # Dance 2 again - robot.webrtc_req(api_id=1023) # Dance2 - print("Queued: Dance2 (1023)") - - # Finish with recovery stand - robot.webrtc_req(api_id=1006) # RecoveryStand - print("Queued: RecoveryStand (1006)") - - print("\nAll 20 commands queued successfully! Watch the robot perform them in sequence.") - print("The WebRTC queue manager will process them one by one when the robot is ready.") - print("Press Ctrl+C to stop the program when you've seen enough.\n") - - try: - # Keep the program running so the queue can be processed - while True: - time.sleep(1) - except KeyboardInterrupt: - print("\nStopping the test...") - finally: - # Cleanup - print("Cleaning up resources...") - robot.cleanup() - print("Test completed.") - - -if __name__ == "__main__": - main() diff --git a/tests/test_websocketvis.py b/tests/test_websocketvis.py deleted file mode 100644 index 262555ce50..0000000000 --- a/tests/test_websocketvis.py +++ /dev/null @@ -1,153 +0,0 @@ -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -import argparse -import math -import os -import pickle -import threading -import time - -from reactivex import operators as ops - -from dimos.robot.global_planner.planner import AstarPlanner -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.types.costmap import Costmap -from dimos.types.vector import Vector -from dimos.web.robot_web_interface import RobotWebInterface -from dimos.web.websocket_vis.helpers import vector_stream -from dimos.web.websocket_vis.server import WebsocketVis - - -def parse_args(): - parser = argparse.ArgumentParser(description="Simple test for vis.") - parser.add_argument( - "--live", - action="store_true", - ) - parser.add_argument( - "--port", type=int, default=5555, help="Port for web visualization interface" - ) - return parser.parse_args() - - -def setup_web_interface(robot, port=5555): - """Set up web interface with robot video and local planner visualization""" - print(f"Setting up web interface on port {port}") - - # Get video stream from robot - video_stream = robot.video_stream_ros.pipe( - ops.share(), - ops.map(lambda frame: frame), - ops.filter(lambda frame: frame is not None), - ) - - # Get local planner visualization stream - local_planner_stream = robot.local_planner_viz_stream.pipe( - ops.share(), - ops.map(lambda frame: frame), - ops.filter(lambda frame: frame is not None), - ) - - # Create web interface with streams - web_interface = RobotWebInterface( - port=port, robot_video=video_stream, local_planner=local_planner_stream - ) - - return web_interface - - -def main(): - args = parse_args() - - websocket_vis = WebsocketVis() - websocket_vis.start() - - web_interface = None - - if args.live: - ros_control = UnitreeROSControl(node_name="web_nav_test", mock_connection=False) - robot = UnitreeGo2(ros_control=ros_control, ip=os.getenv("ROBOT_IP")) - planner = robot.global_planner - - websocket_vis.connect( - vector_stream("robot", lambda: robot.ros_control.transform_euler_pos("base_link")) - ) - websocket_vis.connect( - robot.ros_control.topic("map", Costmap).pipe(ops.map(lambda x: ["costmap", x])) - ) - - # Also set up the web interface with both streams - if hasattr(robot, "video_stream_ros") and hasattr(robot, "local_planner_viz_stream"): - web_interface = setup_web_interface(robot, port=args.port) - - # Start web interface in a separate thread - viz_thread = threading.Thread(target=web_interface.run, daemon=True) - viz_thread.start() - print(f"Web interface available at http://localhost:{args.port}") - - else: - pickle_path = f"{__file__.rsplit('/', 1)[0]}/mockdata/vegas.pickle" - print(f"Loading costmap from {pickle_path}") - planner = AstarPlanner( - get_costmap=lambda: pickle.load(open(pickle_path, "rb")), - get_robot_pos=lambda: Vector(5.0, 5.0), - set_local_nav=lambda x: time.sleep(1) and True, - ) - - def msg_handler(msgtype, data): - if msgtype == "click": - target = Vector(data["position"]) - try: - planner.set_goal(target) - except Exception as e: - print(f"Error setting goal: {e}") - return - - def threaded_msg_handler(msgtype, data): - thread = threading.Thread(target=msg_handler, args=(msgtype, data)) - thread.daemon = True - thread.start() - - websocket_vis.connect(planner.vis_stream()) - websocket_vis.msg_handler = threaded_msg_handler - - print(f"WebSocket server started on port {websocket_vis.port}") - print(planner.get_costmap()) - - planner.plan(Vector(-4.8, -1.0)) # plan a path to the origin - - def fakepos(): - # Simulate a fake vector position change (to test realtime rendering) - vec = Vector(math.sin(time.time()) * 2, math.cos(time.time()) * 2, 0) - print(vec) - return vec - - # if not args.live: - # websocket_vis.connect(rx.interval(0.05).pipe(ops.map(lambda _: ["fakepos", fakepos()]))) - - try: - # Keep the server running - while True: - time.sleep(0.1) - pass - except KeyboardInterrupt: - print("Stopping WebSocket server...") - websocket_vis.stop() - print("WebSocket server stopped") - - -if __name__ == "__main__": - main() diff --git a/tests/test_zed_module.py b/tests/test_zed_module.py deleted file mode 100644 index 40c9addce6..0000000000 --- a/tests/test_zed_module.py +++ /dev/null @@ -1,274 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Test script for ZED Module with LCM visualization.""" - -import asyncio -import threading -import time - -import cv2 -from dimos_lcm.geometry_msgs import PoseStamped - -# Import LCM message types -from dimos_lcm.sensor_msgs import CameraInfo, Image as LCMImage -import numpy as np - -from dimos import core -from dimos.hardware.zed_camera import ZEDModule -from dimos.perception.common.utils import colorize_depth -from dimos.protocol import pubsub -from dimos.protocol.pubsub.lcmpubsub import LCM, Topic -from dimos.utils.logging_config import setup_logger - -logger = setup_logger() - - -class ZEDVisualizationNode: - """Node that subscribes to ZED topics and visualizes the data.""" - - def __init__(self): - self.lcm = LCM() - self.latest_color = None - self.latest_depth = None - self.latest_pose = None - self.camera_info = None - self._running = False - - # Subscribe to topics - self.color_topic = Topic("/zed/color_image", LCMImage) - self.depth_topic = Topic("/zed/depth_image", LCMImage) - self.camera_info_topic = Topic("/zed/camera_info", CameraInfo) - self.pose_topic = Topic("/zed/pose", PoseStamped) - - def start(self): - """Start the visualization node.""" - self._running = True - self.lcm.start() - - # Subscribe to topics - self.lcm.subscribe(self.color_topic, self._on_color_image) - self.lcm.subscribe(self.depth_topic, self._on_depth_image) - self.lcm.subscribe(self.camera_info_topic, self._on_camera_info) - self.lcm.subscribe(self.pose_topic, self._on_pose) - - logger.info("Visualization node started, subscribed to ZED topics") - - def stop(self): - """Stop the visualization node.""" - self._running = False - cv2.destroyAllWindows() - - def _on_color_image(self, msg: LCMImage, topic: str): - """Handle color image messages.""" - try: - # Convert LCM message to numpy array - data = np.frombuffer(msg.data, dtype=np.uint8) - - if msg.encoding == "rgb8": - image = data.reshape((msg.height, msg.width, 3)) - # Convert RGB to BGR for OpenCV - image = cv2.cvtColor(image, cv2.COLOR_RGB2BGR) - elif msg.encoding == "mono8": - image = data.reshape((msg.height, msg.width)) - else: - logger.warning(f"Unsupported encoding: {msg.encoding}") - return - - self.latest_color = image - logger.debug(f"Received color image: {msg.width}x{msg.height}") - - except Exception as e: - logger.error(f"Error processing color image: {e}") - - def _on_depth_image(self, msg: LCMImage, topic: str): - """Handle depth image messages.""" - try: - # Convert LCM message to numpy array - if msg.encoding == "32FC1": - data = np.frombuffer(msg.data, dtype=np.float32) - depth = data.reshape((msg.height, msg.width)) - else: - logger.warning(f"Unsupported depth encoding: {msg.encoding}") - return - - self.latest_depth = depth - logger.debug(f"Received depth image: {msg.width}x{msg.height}") - - except Exception as e: - logger.error(f"Error processing depth image: {e}") - - def _on_camera_info(self, msg: CameraInfo, topic: str): - """Handle camera info messages.""" - self.camera_info = msg - logger.info( - f"Received camera info: {msg.width}x{msg.height}, distortion model: {msg.distortion_model}" - ) - - def _on_pose(self, msg: PoseStamped, topic: str): - """Handle pose messages.""" - self.latest_pose = msg - pos = msg.pose.position - ori = msg.pose.orientation - logger.debug( - f"Pose: pos=({pos.x:.2f}, {pos.y:.2f}, {pos.z:.2f}), " - + f"ori=({ori.x:.2f}, {ori.y:.2f}, {ori.z:.2f}, {ori.w:.2f})" - ) - - def visualize(self): - """Run visualization loop.""" - while self._running: - # Create visualization - vis_images = [] - - # Color image - if self.latest_color is not None: - color_vis = self.latest_color.copy() - - # Add pose text if available - if self.latest_pose is not None: - pos = self.latest_pose.pose.position - text = f"Pose: ({pos.x:.2f}, {pos.y:.2f}, {pos.z:.2f})" - cv2.putText( - color_vis, text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.6, (0, 255, 0), 2 - ) - - vis_images.append(("ZED Color", color_vis)) - - # Depth image - if self.latest_depth is not None: - depth_colorized = colorize_depth(self.latest_depth, max_depth=5.0) - if depth_colorized is not None: - # Convert RGB to BGR for OpenCV - depth_colorized = cv2.cvtColor(depth_colorized, cv2.COLOR_RGB2BGR) - - # Add depth stats - valid_mask = np.isfinite(self.latest_depth) & (self.latest_depth > 0) - if np.any(valid_mask): - min_depth = np.min(self.latest_depth[valid_mask]) - max_depth = np.max(self.latest_depth[valid_mask]) - mean_depth = np.mean(self.latest_depth[valid_mask]) - - text = f"Depth: min={min_depth:.2f}m, max={max_depth:.2f}m, mean={mean_depth:.2f}m" - cv2.putText( - depth_colorized, - text, - (10, 30), - cv2.FONT_HERSHEY_SIMPLEX, - 0.5, - (255, 255, 255), - 1, - ) - - vis_images.append(("ZED Depth", depth_colorized)) - - # Show windows - for name, image in vis_images: - cv2.imshow(name, image) - - # Handle key press - key = cv2.waitKey(1) & 0xFF - if key == ord("q"): - logger.info("Quit requested") - self._running = False - break - elif key == ord("s"): - # Save images - if self.latest_color is not None: - cv2.imwrite("zed_color.png", self.latest_color) - logger.info("Saved color image to zed_color.png") - if self.latest_depth is not None: - np.save("zed_depth.npy", self.latest_depth) - logger.info("Saved depth data to zed_depth.npy") - - time.sleep(0.03) # ~30 FPS - - -async def test_zed_module(): - """Test the ZED Module with visualization.""" - logger.info("Starting ZED Module test") - - # Start Dask - dimos = core.start(1) - - # Enable LCM auto-configuration - pubsub.lcm.autoconf() - - try: - # Deploy ZED module - logger.info("Deploying ZED module...") - zed = dimos.deploy( - ZEDModule, - camera_id=0, - resolution="HD720", - depth_mode="NEURAL", - fps=30, - enable_tracking=True, - publish_rate=10.0, # 10 Hz for testing - frame_id="zed_camera", - ) - - # Configure LCM transports - zed.color_image.transport = core.LCMTransport("/zed/color_image", LCMImage) - zed.depth_image.transport = core.LCMTransport("/zed/depth_image", LCMImage) - zed.camera_info.transport = core.LCMTransport("/zed/camera_info", CameraInfo) - zed.pose.transport = core.LCMTransport("/zed/pose", PoseStamped) - - # Print module info - logger.info("ZED Module configured:") - - # Start ZED module - logger.info("Starting ZED module...") - zed.start() - - # Give module time to initialize - await asyncio.sleep(2) - - # Create and start visualization node - viz_node = ZEDVisualizationNode() - viz_node.start() - - # Run visualization in separate thread - viz_thread = threading.Thread(target=viz_node.visualize, daemon=True) - viz_thread.start() - - logger.info("ZED Module running. Press 'q' in image window to quit, 's' to save images.") - - # Keep running until visualization stops - while viz_node._running: - await asyncio.sleep(0.1) - - # Stop ZED module - logger.info("Stopping ZED module...") - zed.stop() - - # Stop visualization - viz_node.stop() - - except Exception as e: - logger.error(f"Error in test: {e}") - import traceback - - traceback.print_exc() - - finally: - # Clean up - dimos.close() - logger.info("Test completed") - - -if __name__ == "__main__": - # Run the test - asyncio.run(test_zed_module()) diff --git a/tests/test_zed_setup.py b/tests/test_zed_setup.py deleted file mode 100755 index 33aefb65eb..0000000000 --- a/tests/test_zed_setup.py +++ /dev/null @@ -1,183 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -Simple test script to verify ZED camera setup and basic functionality. -""" - -from pathlib import Path -import sys - - -def test_imports(): - """Test that all required modules can be imported.""" - print("Testing imports...") - - try: - import numpy as np - - print("āœ“ NumPy imported successfully") - except ImportError as e: - print(f"āœ— NumPy import failed: {e}") - return False - - try: - import cv2 - - print("āœ“ OpenCV imported successfully") - except ImportError as e: - print(f"āœ— OpenCV import failed: {e}") - return False - - try: - from PIL import Image, ImageDraw, ImageFont - - print("āœ“ PIL imported successfully") - except ImportError as e: - print(f"āœ— PIL import failed: {e}") - return False - - try: - import pyzed.sl as sl - - print("āœ“ ZED SDK (pyzed) imported successfully") - # Note: SDK version method varies between versions - except ImportError as e: - print(f"āœ— ZED SDK import failed: {e}") - print(" Please install ZED SDK and pyzed package") - return False - - try: - from dimos.hardware.zed_camera import ZEDCamera - - print("āœ“ ZEDCamera class imported successfully") - except ImportError as e: - print(f"āœ— ZEDCamera import failed: {e}") - return False - - try: - from dimos.perception.zed_visualizer import ZEDVisualizer - - print("āœ“ ZEDVisualizer class imported successfully") - except ImportError as e: - print(f"āœ— ZEDVisualizer import failed: {e}") - return False - - return True - - -def test_camera_detection(): - """Test if ZED cameras are detected.""" - print("\nTesting camera detection...") - - try: - import pyzed.sl as sl - - # List available cameras - cameras = sl.Camera.get_device_list() - print(f"Found {len(cameras)} ZED camera(s):") - - for i, camera_info in enumerate(cameras): - print(f" Camera {i}:") - print(f" Model: {camera_info.camera_model}") - print(f" Serial: {camera_info.serial_number}") - print(f" State: {camera_info.camera_state}") - - return len(cameras) > 0 - - except Exception as e: - print(f"Error detecting cameras: {e}") - return False - - -def test_basic_functionality(): - """Test basic ZED camera functionality without actually opening the camera.""" - print("\nTesting basic functionality...") - - try: - import pyzed.sl as sl - - from dimos.hardware.zed_camera import ZEDCamera - from dimos.perception.zed_visualizer import ZEDVisualizer - - # Test camera initialization (without opening) - ZEDCamera( - camera_id=0, - resolution=sl.RESOLUTION.HD720, - depth_mode=sl.DEPTH_MODE.NEURAL, - ) - print("āœ“ ZEDCamera instance created successfully") - - # Test visualizer initialization - visualizer = ZEDVisualizer(max_depth=10.0) - print("āœ“ ZEDVisualizer instance created successfully") - - # Test creating a dummy visualization - dummy_rgb = np.zeros((480, 640, 3), dtype=np.uint8) - dummy_depth = np.ones((480, 640), dtype=np.float32) * 2.0 - - visualizer.create_side_by_side_image(dummy_rgb, dummy_depth) - print("āœ“ Dummy visualization created successfully") - - return True - - except Exception as e: - print(f"āœ— Basic functionality test failed: {e}") - return False - - -def main(): - """Run all tests.""" - print("ZED Camera Setup Test") - print("=" * 50) - - # Test imports - if not test_imports(): - print("\nāŒ Import tests failed. Please install missing dependencies.") - return False - - # Test camera detection - cameras_found = test_camera_detection() - if not cameras_found: - print( - "\nāš ļø No ZED cameras detected. Please connect a ZED camera to test capture functionality." - ) - - # Test basic functionality - if not test_basic_functionality(): - print("\nāŒ Basic functionality tests failed.") - return False - - print("\n" + "=" * 50) - if cameras_found: - print("āœ… All tests passed! You can now run the ZED demo:") - print(" python examples/zed_neural_depth_demo.py --display-time 10") - else: - print("āœ… Setup is ready, but no camera detected.") - print(" Connect a ZED camera and run:") - print(" python examples/zed_neural_depth_demo.py --display-time 10") - - return True - - -if __name__ == "__main__": - # Add the project root to Python path - sys.path.append(str(Path(__file__).parent)) - - # Import numpy after path setup - import numpy as np - - success = main() - sys.exit(0 if success else 1) diff --git a/tests/visualization_script.py b/tests/visualization_script.py deleted file mode 100644 index 18ddd60eb9..0000000000 --- a/tests/visualization_script.py +++ /dev/null @@ -1,1006 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -"""Visualize pickled manipulation pipeline results.""" - -import os -import pickle -import sys - -import matplotlib -import numpy as np - -# Try to use TkAgg backend for live display, fallback to Agg if not available -try: - matplotlib.use("TkAgg") -except: - try: - matplotlib.use("Qt5Agg") - except: - matplotlib.use("Agg") # Fallback to non-interactive -import matplotlib.pyplot as plt -import open3d as o3d - -sys.path.append(os.path.dirname(os.path.dirname(os.path.abspath(__file__)))) - -import atexit -from contextlib import contextmanager -from datetime import datetime -import time - -import lcm_msgs -from pydrake.all import ( - AddMultibodyPlantSceneGraph, - DiagramBuilder, - JointIndex, - MeshcatVisualizer, - MeshcatVisualizerParams, - Parser, - RigidTransform, - RollPitchYaw, - RotationMatrix, - StartMeshcat, -) -from pydrake.common import MemoryFile -from pydrake.geometry import ( - Box, - CollisionFilterDeclaration, - InMemoryMesh, - Mesh, - ProximityProperties, -) -from pydrake.math import RigidTransform as DrakeRigidTransform -import tf_lcm_py -import trimesh - -from dimos.perception.pointcloud.utils import ( - visualize_clustered_point_clouds, - visualize_pcd, - visualize_voxel_grid, -) -from dimos.utils.logging_config import setup_logger - -logger = setup_logger() - - -def create_point_cloud(color_img, depth_img, intrinsics): - """Create Open3D point cloud from RGB and depth images.""" - fx, fy, cx, cy = intrinsics - height, width = depth_img.shape - - o3d_intrinsics = o3d.camera.PinholeCameraIntrinsic(width, height, fx, fy, cx, cy) - color_o3d = o3d.geometry.Image(color_img) - depth_o3d = o3d.geometry.Image((depth_img * 1000).astype(np.uint16)) - - rgbd = o3d.geometry.RGBDImage.create_from_color_and_depth( - color_o3d, depth_o3d, depth_scale=1000.0, convert_rgb_to_intensity=False - ) - - return o3d.geometry.PointCloud.create_from_rgbd_image(rgbd, o3d_intrinsics) - - -def deserialize_point_cloud(data): - """Reconstruct Open3D PointCloud from serialized data.""" - if data is None: - return None - - pcd = o3d.geometry.PointCloud() - if data.get("points"): - pcd.points = o3d.utility.Vector3dVector(np.array(data["points"])) - if data.get("colors"): - pcd.colors = o3d.utility.Vector3dVector(np.array(data["colors"])) - return pcd - - -def deserialize_voxel_grid(data): - """Reconstruct Open3D VoxelGrid from serialized data.""" - if data is None: - return None - - # Create a point cloud to convert to voxel grid - pcd = o3d.geometry.PointCloud() - voxel_size = data["voxel_size"] - origin = np.array(data["origin"]) - - # Create points from voxel indices - points = [] - colors = [] - for voxel in data["voxels"]: - # Each voxel is (i, j, k, r, g, b) - i, j, k, r, g, b = voxel - # Convert voxel grid index to 3D point - point = origin + np.array([i, j, k]) * voxel_size - points.append(point) - colors.append([r, g, b]) - - if points: - pcd.points = o3d.utility.Vector3dVector(np.array(points)) - pcd.colors = o3d.utility.Vector3dVector(np.array(colors)) - - # Convert to voxel grid - voxel_grid = o3d.geometry.VoxelGrid.create_from_point_cloud(pcd, voxel_size) - return voxel_grid - - -def visualize_results(pickle_path="manipulation_results.pkl"): - """Load pickled results and visualize them.""" - print(f"Loading results from {pickle_path}...") - try: - with open(pickle_path, "rb") as f: - data = pickle.load(f) - - results = data["results"] - data["color_img"] - data["depth_img"] - data["intrinsics"] - - print(f"Loaded results with keys: {list(results.keys())}") - - except FileNotFoundError: - print(f"Error: Pickle file {pickle_path} not found.") - print("Make sure to run test_manipulation_pipeline_single_frame_lcm.py first.") - return - except Exception as e: - print(f"Error loading pickle file: {e}") - return - - # Determine number of subplots based on what results we have - num_plots = 0 - plot_configs = [] - - if "detection_viz" in results and results["detection_viz"] is not None: - plot_configs.append(("detection_viz", "Object Detection")) - num_plots += 1 - - if "segmentation_viz" in results and results["segmentation_viz"] is not None: - plot_configs.append(("segmentation_viz", "Semantic Segmentation")) - num_plots += 1 - - if "pointcloud_viz" in results and results["pointcloud_viz"] is not None: - plot_configs.append(("pointcloud_viz", "All Objects Point Cloud")) - num_plots += 1 - - if "detected_pointcloud_viz" in results and results["detected_pointcloud_viz"] is not None: - plot_configs.append(("detected_pointcloud_viz", "Detection Objects Point Cloud")) - num_plots += 1 - - if "misc_pointcloud_viz" in results and results["misc_pointcloud_viz"] is not None: - plot_configs.append(("misc_pointcloud_viz", "Misc/Background Points")) - num_plots += 1 - - if "grasp_overlay" in results and results["grasp_overlay"] is not None: - plot_configs.append(("grasp_overlay", "Grasp Overlay")) - num_plots += 1 - - if num_plots == 0: - print("No visualization results to display") - return - - # Create subplot layout - if num_plots <= 3: - fig, axes = plt.subplots(1, num_plots, figsize=(6 * num_plots, 5)) - else: - rows = 2 - cols = (num_plots + 1) // 2 - _fig, axes = plt.subplots(rows, cols, figsize=(6 * cols, 5 * rows)) - - # Ensure axes is always a list for consistent indexing - if num_plots == 1: - axes = [axes] - elif num_plots > 2: - axes = axes.flatten() - - # Plot each result - for i, (key, title) in enumerate(plot_configs): - axes[i].imshow(results[key]) - axes[i].set_title(title) - axes[i].axis("off") - - # Hide unused subplots if any - if num_plots > 3: - for i in range(num_plots, len(axes)): - axes[i].axis("off") - - plt.tight_layout() - - # Save and show the plot - output_path = "visualization_results.png" - plt.savefig(output_path, dpi=150, bbox_inches="tight") - print(f"Results visualization saved to: {output_path}") - - # Show plot live as well - plt.show(block=True) - plt.close() - - # Deserialize and reconstruct 3D objects from the pickle file - print("\nReconstructing 3D visualization objects from serialized data...") - - # Reconstruct full point cloud if available - full_pcd = None - if "full_pointcloud" in results and results["full_pointcloud"] is not None: - full_pcd = deserialize_point_cloud(results["full_pointcloud"]) - print(f"Reconstructed full point cloud with {len(np.asarray(full_pcd.points))} points") - - # Visualize reconstructed full point cloud - try: - visualize_pcd( - full_pcd, - window_name="Reconstructed Full Scene Point Cloud", - point_size=2.0, - show_coordinate_frame=True, - ) - except (KeyboardInterrupt, EOFError): - print("\nSkipping full point cloud visualization") - except Exception as e: - print(f"Error in point cloud visualization: {e}") - else: - print("No full point cloud available for visualization") - - # Reconstruct misc clusters if available - if results.get("misc_clusters"): - misc_clusters = [deserialize_point_cloud(cluster) for cluster in results["misc_clusters"]] - cluster_count = len(misc_clusters) - total_misc_points = sum(len(np.asarray(cluster.points)) for cluster in misc_clusters) - print(f"Reconstructed {cluster_count} misc clusters with {total_misc_points} total points") - - # Visualize reconstructed misc clusters - try: - visualize_clustered_point_clouds( - misc_clusters, - window_name="Reconstructed Misc/Background Clusters (DBSCAN)", - point_size=3.0, - show_coordinate_frame=True, - ) - except (KeyboardInterrupt, EOFError): - print("\nSkipping misc clusters visualization") - except Exception as e: - print(f"Error in misc clusters visualization: {e}") - else: - print("No misc clusters available for visualization") - - # Reconstruct voxel grid if available - if "misc_voxel_grid" in results and results["misc_voxel_grid"] is not None: - misc_voxel_grid = deserialize_voxel_grid(results["misc_voxel_grid"]) - if misc_voxel_grid: - voxel_count = len(misc_voxel_grid.get_voxels()) - print(f"Reconstructed voxel grid with {voxel_count} voxels") - - # Visualize reconstructed voxel grid - try: - visualize_voxel_grid( - misc_voxel_grid, - window_name="Reconstructed Misc/Background Voxel Grid", - show_coordinate_frame=True, - ) - except (KeyboardInterrupt, EOFError): - print("\nSkipping voxel grid visualization") - except Exception as e: - print(f"Error in voxel grid visualization: {e}") - else: - print("Failed to reconstruct voxel grid") - else: - print("No voxel grid available for visualization") - - -class DrakeKinematicsEnv: - def __init__( - self, - urdf_path: str, - kinematic_chain_joints: list[str], - links_to_ignore: list[str] | None = None, - ): - self._resources_to_cleanup = [] - - # Register cleanup at exit - atexit.register(self.cleanup_resources) - - # Initialize tf resources once and reuse them - self.buffer = tf_lcm_py.Buffer(30.0) - self._resources_to_cleanup.append(self.buffer) - with self.safe_lcm_instance() as lcm_instance: - self.tf_lcm_instance = lcm_instance - self._resources_to_cleanup.append(self.tf_lcm_instance) - # Create TransformListener with our LCM instance and buffer - self.listener = tf_lcm_py.TransformListener(self.tf_lcm_instance, self.buffer) - self._resources_to_cleanup.append(self.listener) - - # Check if URDF file exists - if not os.path.exists(urdf_path): - raise FileNotFoundError(f"URDF file not found: {urdf_path}") - - # Drake utils initialization - self.meshcat = StartMeshcat() - print(f"Meshcat started at: {self.meshcat.web_url()}") - - self.urdf_path = urdf_path - self.builder = DiagramBuilder() - - self.plant, self.scene_graph = AddMultibodyPlantSceneGraph(self.builder, time_step=0.01) - self.parser = Parser(self.plant) - - # Load the robot URDF - print(f"Loading URDF from: {self.urdf_path}") - self.model_instances = self.parser.AddModelsFromUrl(f"file://{self.urdf_path}") - self.kinematic_chain_joints = kinematic_chain_joints - self.model_instance = self.model_instances[0] if self.model_instances else None - - if not self.model_instances: - raise RuntimeError("Failed to load any model instances from URDF") - - print(f"Loaded {len(self.model_instances)} model instances") - - # Set up collision filtering - if links_to_ignore: - bodies = [] - for link_name in links_to_ignore: - try: - body = self.plant.GetBodyByName(link_name) - if body is not None: - bodies.extend(self.plant.GetBodiesWeldedTo(body)) - except RuntimeError: - print(f"Warning: Link '{link_name}' not found in URDF") - - if bodies: - arm_geoms = self.plant.CollectRegisteredGeometries(bodies) - decl = CollisionFilterDeclaration().ExcludeWithin(arm_geoms) - manager = self.scene_graph.collision_filter_manager() - manager.Apply(decl) - - # Load and process point cloud data - self._load_and_process_point_clouds() - - # Finalize the plant before adding visualizer - self.plant.Finalize() - - # Print some debug info about the plant - print(f"Plant has {self.plant.num_bodies()} bodies") - print(f"Plant has {self.plant.num_joints()} joints") - for i in range(self.plant.num_joints()): - joint = self.plant.get_joint(JointIndex(i)) - print(f" Joint {i}: {joint.name()} (type: {joint.type_name()})") - - # Add visualizer - self.visualizer = MeshcatVisualizer.AddToBuilder( - self.builder, self.scene_graph, self.meshcat, params=MeshcatVisualizerParams() - ) - - # Build the diagram - self.diagram = self.builder.Build() - self.diagram_context = self.diagram.CreateDefaultContext() - self.plant_context = self.plant.GetMyContextFromRoot(self.diagram_context) - - # Set up joint indices - self.joint_indices = [] - for joint_name in self.kinematic_chain_joints: - try: - joint = self.plant.GetJointByName(joint_name) - if joint.num_positions() > 0: - start_index = joint.position_start() - for i in range(joint.num_positions()): - self.joint_indices.append(start_index + i) - print( - f"Added joint '{joint_name}' at indices {start_index} to {start_index + joint.num_positions() - 1}" - ) - except RuntimeError: - print(f"Warning: Joint '{joint_name}' not found in URDF.") - - # Get important frames/bodies - try: - self.end_effector_link = self.plant.GetBodyByName("link6") - self.end_effector_frame = self.plant.GetFrameByName("link6") - print("Found end effector link6") - except RuntimeError: - print("Warning: link6 not found") - self.end_effector_link = None - self.end_effector_frame = None - - try: - self.camera_link = self.plant.GetBodyByName("camera_center_link") - print("Found camera_center_link") - except RuntimeError: - print("Warning: camera_center_link not found") - self.camera_link = None - - # Set robot to a reasonable initial configuration - self._set_initial_configuration() - - # Force initial visualization update - self._update_visualization() - - print("Drake environment initialization complete!") - print(f"Visit {self.meshcat.web_url()} to see the visualization") - - def _load_and_process_point_clouds(self): - """Load point cloud data from pickle file and add to scene""" - pickle_path = "manipulation_results.pkl" - try: - with open(pickle_path, "rb") as f: - data = pickle.load(f) - - results = data["results"] - print(f"Loaded results with keys: {list(results.keys())}") - - except FileNotFoundError: - print(f"Warning: Pickle file {pickle_path} not found.") - print("Skipping point cloud loading.") - return - except Exception as e: - print(f"Warning: Error loading pickle file: {e}") - return - - full_detected_pcd = o3d.geometry.PointCloud() - for obj in results["detected_objects"]: - pcd = o3d.geometry.PointCloud() - pcd.points = o3d.utility.Vector3dVector(obj["point_cloud_numpy"]) - full_detected_pcd += pcd - - self.process_and_add_object_class("all_objects", results) - self.process_and_add_object_class("misc_clusters", results) - misc_clusters = results["misc_clusters"] - print(type(misc_clusters[0]["points"])) - print(np.asarray(misc_clusters[0]["points"]).shape) - - def process_and_add_object_class(self, object_key: str, results: dict): - # Process detected objects - if object_key in results: - detected_objects = results[object_key] - if detected_objects: - print(f"Processing {len(detected_objects)} {object_key}") - all_decomposed_meshes = [] - - transform = self.get_transform("world", "camera_center_link") - for i in range(len(detected_objects)): - try: - if object_key == "misc_clusters": - points = np.asarray(detected_objects[i]["points"]) - elif "point_cloud_numpy" in detected_objects[i]: - points = detected_objects[i]["point_cloud_numpy"] - elif ( - "point_cloud" in detected_objects[i] - and detected_objects[i]["point_cloud"] - ): - # Handle serialized point cloud - points = np.array(detected_objects[i]["point_cloud"]["points"]) - else: - print(f"Warning: No point cloud data found for object {i}") - continue - - if len(points) < 10: # Need more points for mesh reconstruction - print( - f"Warning: Object {i} has too few points ({len(points)}) for mesh reconstruction" - ) - continue - - # Swap y-z axes since this is a common problem - points = np.column_stack((points[:, 0], points[:, 2], -points[:, 1])) - # Transform points to world frame - points = self.transform_point_cloud_with_open3d(points, transform) - - # Use fast DBSCAN clustering + convex hulls approach - clustered_hulls = self._create_clustered_convex_hulls(points, i) - all_decomposed_meshes.extend(clustered_hulls) - - print( - f"Created {len(clustered_hulls)} clustered convex hulls for object {i}" - ) - - except Exception as e: - print(f"Warning: Failed to process object {i}: {e}") - - if all_decomposed_meshes: - self.register_convex_hulls_as_collision(all_decomposed_meshes, object_key) - print(f"Registered {len(all_decomposed_meshes)} total clustered convex hulls") - else: - print("Warning: No valid clustered convex hulls created from detected objects") - else: - print("No detected objects found") - - def _create_clustered_convex_hulls( - self, points: np.ndarray, object_id: int - ) -> list[o3d.geometry.TriangleMesh]: - """ - Create convex hulls from DBSCAN clusters of point cloud data. - Fast approach: cluster points, then convex hull each cluster. - - Args: - points: Nx3 numpy array of 3D points - object_id: ID for debugging/logging - - Returns: - List of Open3D triangle meshes (convex hulls of clusters) - """ - try: - # Create Open3D point cloud - pcd = o3d.geometry.PointCloud() - pcd.points = o3d.utility.Vector3dVector(points) - - # Quick outlier removal (optional, can skip for speed) - if len(points) > 50: # Only for larger point clouds - pcd, _ = pcd.remove_statistical_outlier(nb_neighbors=10, std_ratio=2.0) - points = np.asarray(pcd.points) - - if len(points) < 4: - print(f"Warning: Too few points after filtering for object {object_id}") - return [] - - # Try multiple DBSCAN parameter combinations to find clusters - clusters = [] - labels = None - - # Calculate some basic statistics for parameter estimation - if len(points) > 10: - # Compute nearest neighbor distances for better eps estimation - distances = pcd.compute_nearest_neighbor_distance() - avg_nn_distance = np.mean(distances) - np.std(distances) - - print( - f"Object {object_id}: {len(points)} points, avg_nn_dist={avg_nn_distance:.4f}" - ) - - for i in range(20): - try: - eps = avg_nn_distance * (2.0 + (i * 0.1)) - min_samples = 20 - labels = np.array(pcd.cluster_dbscan(eps=eps, min_points=min_samples)) - unique_labels = np.unique(labels) - clusters = unique_labels[unique_labels >= 0] # Remove noise label (-1) - - noise_points = np.sum(labels == -1) - clustered_points = len(points) - noise_points - - print( - f" Try {i + 1}: eps={eps:.4f}, min_samples={min_samples} → {len(clusters)} clusters, {clustered_points}/{len(points)} points clustered" - ) - - # Accept if we found clusters and most points are clustered - if ( - len(clusters) > 0 and clustered_points >= len(points) * 0.95 - ): # At least 30% of points clustered - print(f" āœ“ Accepted parameter set {i + 1}") - break - - except Exception as e: - print( - f" Try {i + 1}: Failed with eps={eps:.4f}, min_samples={min_samples}: {e}" - ) - continue - - if len(clusters) == 0 or labels is None: - print( - f"No clusters found for object {object_id} after all attempts, using entire point cloud" - ) - # Fallback: use entire point cloud as single convex hull - hull_mesh, _ = pcd.compute_convex_hull() - hull_mesh.compute_vertex_normals() - return [hull_mesh] - - print( - f"Found {len(clusters)} clusters for object {object_id} (eps={eps:.3f}, min_samples={min_samples})" - ) - - # Create convex hull for each cluster - convex_hulls = [] - for cluster_id in clusters: - try: - # Get points for this cluster - cluster_mask = labels == cluster_id - cluster_points = points[cluster_mask] - - if len(cluster_points) < 4: - print( - f"Skipping cluster {cluster_id} with only {len(cluster_points)} points" - ) - continue - - # Create point cloud for this cluster - cluster_pcd = o3d.geometry.PointCloud() - cluster_pcd.points = o3d.utility.Vector3dVector(cluster_points) - - # Compute convex hull - hull_mesh, _ = cluster_pcd.compute_convex_hull() - hull_mesh.compute_vertex_normals() - - # Validate hull - if ( - len(np.asarray(hull_mesh.vertices)) >= 4 - and len(np.asarray(hull_mesh.triangles)) >= 4 - ): - convex_hulls.append(hull_mesh) - print( - f" Cluster {cluster_id}: {len(cluster_points)} points → convex hull with {len(np.asarray(hull_mesh.vertices))} vertices" - ) - else: - print(f" Skipping degenerate hull for cluster {cluster_id}") - - except Exception as e: - print(f"Error processing cluster {cluster_id} for object {object_id}: {e}") - - if not convex_hulls: - print( - f"No valid convex hulls created for object {object_id}, using entire point cloud" - ) - # Fallback: use entire point cloud as single convex hull - hull_mesh, _ = pcd.compute_convex_hull() - hull_mesh.compute_vertex_normals() - return [hull_mesh] - - return convex_hulls - - except Exception as e: - print(f"Error in DBSCAN clustering for object {object_id}: {e}") - # Final fallback: single convex hull - try: - pcd = o3d.geometry.PointCloud() - pcd.points = o3d.utility.Vector3dVector(points) - hull_mesh, _ = pcd.compute_convex_hull() - hull_mesh.compute_vertex_normals() - return [hull_mesh] - except: - return [] - - def _set_initial_configuration(self): - """Set the robot to a reasonable initial joint configuration""" - # Set all joints to zero initially - if self.joint_indices: - q = np.zeros(len(self.joint_indices)) - - # You can customize these values for a better initial pose - # For example, if you know good default joint angles: - if len(q) >= 6: # Assuming at least 6 DOF arm - q[1] = 0.0 # joint1 - q[2] = 0.0 # joint2 - q[3] = 0.0 # joint3 - q[4] = 0.0 # joint4 - q[5] = 0.0 # joint5 - q[6] = 0.0 # joint6 - - # Set the joint positions in the plant context - positions = self.plant.GetPositions(self.plant_context) - for i, joint_idx in enumerate(self.joint_indices): - if joint_idx < len(positions): - positions[joint_idx] = q[i] - - self.plant.SetPositions(self.plant_context, positions) - print(f"Set initial joint configuration: {q}") - else: - print("Warning: No joint indices found, using default configuration") - - def _update_visualization(self): - """Force update the visualization""" - try: - # Get the visualizer's context from the diagram context - visualizer_context = self.visualizer.GetMyContextFromRoot(self.diagram_context) - self.visualizer.ForcedPublish(visualizer_context) - print("Visualization updated successfully") - except Exception as e: - print(f"Error updating visualization: {e}") - - def set_joint_positions(self, joint_positions): - """Set specific joint positions and update visualization""" - if len(joint_positions) != len(self.joint_indices): - raise ValueError( - f"Expected {len(self.joint_indices)} joint positions, got {len(joint_positions)}" - ) - - positions = self.plant.GetPositions(self.plant_context) - for i, joint_idx in enumerate(self.joint_indices): - if joint_idx < len(positions): - positions[joint_idx] = joint_positions[i] - - self.plant.SetPositions(self.plant_context, positions) - self._update_visualization() - print(f"Updated joint positions: {joint_positions}") - - def register_convex_hulls_as_collision( - self, meshes: list[o3d.geometry.TriangleMesh], hull_type: str - ): - """Register convex hulls as collision and visual geometry""" - if not meshes: - print("No meshes to register") - return - - world = self.plant.world_body() - proximity = ProximityProperties() - - for i, mesh in enumerate(meshes): - try: - # Convert Open3D → numpy arrays → trimesh.Trimesh - vertices = np.asarray(mesh.vertices) - faces = np.asarray(mesh.triangles) - - if len(vertices) == 0 or len(faces) == 0: - print(f"Warning: Mesh {i} is empty, skipping") - continue - - tmesh = trimesh.Trimesh(vertices=vertices, faces=faces) - - # Export to OBJ in memory - tmesh_obj_blob = tmesh.export(file_type="obj") - mem_file = MemoryFile( - contents=tmesh_obj_blob, extension=".obj", filename_hint=f"convex_hull_{i}.obj" - ) - in_memory_mesh = InMemoryMesh() - in_memory_mesh.mesh_file = mem_file - drake_mesh = Mesh(in_memory_mesh, scale=1.0) - - pos = np.array([0.0, 0.0, 0.0]) - rpy = RollPitchYaw(0.0, 0.0, 0.0) - X_WG = DrakeRigidTransform(RotationMatrix(rpy), pos) - - # Register collision and visual geometry - self.plant.RegisterCollisionGeometry( - body=world, - X_BG=X_WG, - shape=drake_mesh, - name=f"convex_hull_collision_{i}_{hull_type}", - properties=proximity, - ) - self.plant.RegisterVisualGeometry( - body=world, - X_BG=X_WG, - shape=drake_mesh, - name=f"convex_hull_visual_{i}_{hull_type}", - diffuse_color=np.array([0.7, 0.5, 0.3, 0.8]), # Orange-ish color - ) - - print( - f"Registered convex hull {i} with {len(vertices)} vertices and {len(faces)} faces" - ) - - except Exception as e: - print(f"Warning: Failed to register mesh {i}: {e}") - - # Add a simple table for reference - try: - table_shape = Box(1.0, 1.0, 0.1) # Thinner table - table_pose = RigidTransform(p=[0.5, 0.0, -0.05]) # In front of robot - self.plant.RegisterCollisionGeometry( - world, table_pose, table_shape, "table_collision", proximity - ) - self.plant.RegisterVisualGeometry( - world, table_pose, table_shape, "table_visual", [0.8, 0.6, 0.4, 1.0] - ) - print("Added reference table") - except Exception as e: - print(f"Warning: Failed to add table: {e}") - - def get_seeded_random_rgba(self, id: int): - np.random.seed(id) - return np.random.rand(4) - - @contextmanager - def safe_lcm_instance(self): - """Context manager for safely managing LCM instance lifecycle""" - lcm_instance = tf_lcm_py.LCM() - try: - yield lcm_instance - finally: - pass - - def cleanup_resources(self): - """Clean up resources before exiting""" - # Only clean up once when exiting - print("Cleaning up resources...") - # Force cleanup of resources in reverse order (last created first) - for resource in reversed(self._resources_to_cleanup): - try: - # For objects like TransformListener that might have a close or shutdown method - if hasattr(resource, "close"): - resource.close() - elif hasattr(resource, "shutdown"): - resource.shutdown() - - # Explicitly delete the resource - del resource - except Exception as e: - print(f"Error during cleanup: {e}") - - # Clear the resources list - self._resources_to_cleanup = [] - - def get_transform(self, target_frame, source_frame): - print("Getting transform from", source_frame, "to", target_frame) - attempts = 0 - max_attempts = 20 # Reduced from 120 to avoid long blocking - - while attempts < max_attempts: - try: - # Process LCM messages with error handling - if not self.tf_lcm_instance.handle_timeout(100): # 100ms timeout - # If handle_timeout returns false, we might need to re-check if LCM is still good - if not self.tf_lcm_instance.good(): - print("WARNING: LCM instance is no longer in a good state") - - # Get the most recent timestamp from the buffer instead of using current time - try: - timestamp = self.buffer.get_most_recent_timestamp() - if attempts % 10 == 0: - print(f"Using timestamp from buffer: {timestamp}") - except Exception: - # Fall back to current time if get_most_recent_timestamp fails - timestamp = datetime.now() - if not hasattr(timestamp, "timestamp"): - timestamp.timestamp = ( - lambda: time.mktime(timestamp.timetuple()) + timestamp.microsecond / 1e6 - ) - if attempts % 10 == 0: - print(f"Falling back to current time: {timestamp}") - - # Check if we can find the transform - if self.buffer.can_transform(target_frame, source_frame, timestamp): - # print(f"Found transform between '{target_frame}' and '{source_frame}'!") - - # Look up the transform with the timestamp from the buffer - transform = self.buffer.lookup_transform( - target_frame, - source_frame, - timestamp, - timeout=10.0, - time_tolerance=0.1, - lcm_module=lcm_msgs, - ) - - return transform - - # Increment counter and report status every 10 attempts - attempts += 1 - if attempts % 10 == 0: - print(f"Still waiting... (attempt {attempts}/{max_attempts})") - frames = self.buffer.get_all_frame_names() - if frames: - print(f"Frames received so far ({len(frames)} total):") - for frame in sorted(frames): - print(f" {frame}") - else: - print("No frames received yet") - - # Brief pause - time.sleep(0.5) - - except Exception as e: - print(f"Error during transform lookup: {e}") - attempts += 1 - time.sleep(1) # Longer pause after an error - - print(f"\nERROR: No transform found after {max_attempts} attempts") - return None - - def transform_point_cloud_with_open3d(self, points_np: np.ndarray, transform) -> np.ndarray: - """ - Transforms a point cloud using Open3D given a transform. - - Args: - points_np (np.ndarray): Nx3 array of 3D points. - transform: Transform from tf_lcm_py. - - Returns: - np.ndarray: Nx3 array of transformed 3D points. - """ - if points_np.shape[1] != 3: - print("Input point cloud must have shape Nx3.") - return points_np - - # Convert transform to 4x4 numpy matrix - tf_matrix = np.eye(4) - - # Extract rotation quaternion components - qw = transform.transform.rotation.w - qx = transform.transform.rotation.x - qy = transform.transform.rotation.y - qz = transform.transform.rotation.z - - # Convert quaternion to rotation matrix - # Formula from: https://en.wikipedia.org/wiki/Quaternions_and_spatial_rotation#Quaternion-derived_rotation_matrix - tf_matrix[0, 0] = 1 - 2 * qy * qy - 2 * qz * qz - tf_matrix[0, 1] = 2 * qx * qy - 2 * qz * qw - tf_matrix[0, 2] = 2 * qx * qz + 2 * qy * qw - - tf_matrix[1, 0] = 2 * qx * qy + 2 * qz * qw - tf_matrix[1, 1] = 1 - 2 * qx * qx - 2 * qz * qz - tf_matrix[1, 2] = 2 * qy * qz - 2 * qx * qw - - tf_matrix[2, 0] = 2 * qx * qz - 2 * qy * qw - tf_matrix[2, 1] = 2 * qy * qz + 2 * qx * qw - tf_matrix[2, 2] = 1 - 2 * qx * qx - 2 * qy * qy - - # Set translation - tf_matrix[0, 3] = transform.transform.translation.x - tf_matrix[1, 3] = transform.transform.translation.y - tf_matrix[2, 3] = transform.transform.translation.z - - # Create Open3D point cloud - pcd = o3d.geometry.PointCloud() - pcd.points = o3d.utility.Vector3dVector(points_np) - - # Apply transformation - pcd.transform(tf_matrix) - - # Return as NumPy array - return np.asarray(pcd.points) - - -# Updated main function -if __name__ == "__main__": - import argparse - - parser = argparse.ArgumentParser(description="Visualize manipulation results") - parser.add_argument("--visualize-only", action="store_true", help="Only visualize results") - args = parser.parse_args() - - if args.visualize_only: - visualize_results() - exit(0) - - try: - # Then set up Drake environment - kinematic_chain_joints = [ - "pillar_platform_joint", - "joint1", - "joint2", - "joint3", - "joint4", - "joint5", - "joint6", - ] - - links_to_ignore = [ - "devkit_base_link", - "pillar_platform", - "piper_angled_mount", - "pan_tilt_base", - "pan_tilt_head", - "pan_tilt_pan", - "base_link", - "link1", - "link2", - "link3", - "link4", - "link5", - "link6", - ] - - urdf_path = "./assets/devkit_base_descr.urdf" - urdf_path = os.path.abspath(urdf_path) - - print(f"Attempting to load URDF from: {urdf_path}") - - env = DrakeKinematicsEnv(urdf_path, kinematic_chain_joints, links_to_ignore) - env.set_joint_positions([0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0]) - transform = env.get_transform("world", "camera_center_link") - print( - transform.transform.translation.x, - transform.transform.translation.y, - transform.transform.translation.z, - ) - print( - transform.transform.rotation.w, - transform.transform.rotation.x, - transform.transform.rotation.y, - transform.transform.rotation.z, - ) - - # Keep the visualization alive - print("\nVisualization is running. Press Ctrl+C to exit.") - while True: - time.sleep(1) - - except KeyboardInterrupt: - print("\nExiting...") - except Exception as e: - print(f"Error: {e}") - import traceback - - traceback.print_exc() diff --git a/tests/zed_neural_depth_demo.py b/tests/zed_neural_depth_demo.py deleted file mode 100755 index 86daf4107d..0000000000 --- a/tests/zed_neural_depth_demo.py +++ /dev/null @@ -1,450 +0,0 @@ -#!/usr/bin/env python3 -# Copyright 2025 Dimensional Inc. -# -# Licensed under the Apache License, Version 2.0 (the "License"); -# you may not use this file except in compliance with the License. -# You may obtain a copy of the License at -# -# http://www.apache.org/licenses/LICENSE-2.0 -# -# Unless required by applicable law or agreed to in writing, software -# distributed under the License is distributed on an "AS IS" BASIS, -# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -# See the License for the specific language governing permissions and -# limitations under the License. - -""" -ZED Camera Neural Depth Demo - OpenCV Live Visualization with Data Saving - -This script demonstrates live visualization of ZED camera RGB and depth data using OpenCV. -Press SPACE to save RGB and depth images to rgbd_data2 folder. -Press ESC or 'q' to quit. -""" - -import argparse -from datetime import datetime -import logging -from pathlib import Path -import sys -import time - -import cv2 -import numpy as np -import open3d as o3d -import yaml - -# Add the project root to Python path -sys.path.append(str(Path(__file__).parent.parent)) - -try: - import pyzed.sl as sl -except ImportError: - print("ERROR: ZED SDK not found. Please install the ZED SDK and pyzed Python package.") - print("Download from: https://www.stereolabs.com/developers/release/") - sys.exit(1) - -from dimos.hardware.zed_camera import ZEDCamera -from dimos.perception.pointcloud.utils import visualize_pcd - -# Configure logging -logging.basicConfig( - level=logging.INFO, format="%(asctime)s - %(name)s - %(levelname)s - %(message)s" -) -logger = logging.getLogger(__name__) - - -class ZEDLiveVisualizer: - """Live OpenCV visualization for ZED camera data with saving functionality.""" - - def __init__(self, camera, max_depth=10.0, output_dir="assets/rgbd_data2"): - self.camera = camera - self.max_depth = max_depth - self.output_dir = Path(output_dir) - self.save_counter = 0 - - # Store captured pointclouds for later visualization - self.captured_pointclouds = [] - - # Display settings for 480p - self.display_width = 640 - self.display_height = 480 - - # Create output directory structure - self.setup_output_directory() - - # Get camera info for saving - self.camera_info = camera.get_camera_info() - - # Save camera info files once - self.save_camera_info() - - # OpenCV window name (single window) - self.window_name = "ZED Camera - RGB + Depth" - - # Create window - cv2.namedWindow(self.window_name, cv2.WINDOW_AUTOSIZE) - - def setup_output_directory(self): - """Create the output directory structure.""" - self.output_dir.mkdir(exist_ok=True) - (self.output_dir / "color").mkdir(exist_ok=True) - (self.output_dir / "depth").mkdir(exist_ok=True) - (self.output_dir / "pointclouds").mkdir(exist_ok=True) - logger.info(f"Created output directory: {self.output_dir}") - - def save_camera_info(self): - """Save camera info YAML files with ZED camera parameters.""" - # Get current timestamp - now = datetime.now() - timestamp_sec = int(now.timestamp()) - timestamp_nanosec = int((now.timestamp() % 1) * 1e9) - - # Get camera resolution - resolution = self.camera_info.get("resolution", {}) - width = int(resolution.get("width", 1280)) - height = int(resolution.get("height", 720)) - - # Extract left camera parameters (for RGB) from already available camera_info - left_cam = self.camera_info.get("left_cam", {}) - # Convert numpy values to Python floats - fx = float(left_cam.get("fx", 749.341552734375)) - fy = float(left_cam.get("fy", 748.5587768554688)) - cx = float(left_cam.get("cx", 639.4312744140625)) - cy = float(left_cam.get("cy", 357.2478942871094)) - - # Build distortion coefficients from ZED format - # ZED provides k1, k2, p1, p2, k3 - convert to rational_polynomial format - k1 = float(left_cam.get("k1", 0.0)) - k2 = float(left_cam.get("k2", 0.0)) - p1 = float(left_cam.get("p1", 0.0)) - p2 = float(left_cam.get("p2", 0.0)) - k3 = float(left_cam.get("k3", 0.0)) - distortion = [k1, k2, p1, p2, k3, 0.0, 0.0, 0.0] - - # Create camera info structure with plain Python types - camera_info = { - "D": distortion, - "K": [fx, 0.0, cx, 0.0, fy, cy, 0.0, 0.0, 1.0], - "P": [fx, 0.0, cx, 0.0, 0.0, fy, cy, 0.0, 0.0, 0.0, 1.0, 0.0], - "R": [1.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 1.0], - "binning_x": 0, - "binning_y": 0, - "distortion_model": "rational_polynomial", - "header": { - "frame_id": "camera_color_optical_frame", - "stamp": {"nanosec": timestamp_nanosec, "sec": timestamp_sec}, - }, - "height": height, - "roi": {"do_rectify": False, "height": 0, "width": 0, "x_offset": 0, "y_offset": 0}, - "width": width, - } - - # Save color camera info - color_info_path = self.output_dir / "color_camera_info.yaml" - with open(color_info_path, "w") as f: - yaml.dump(camera_info, f, default_flow_style=False) - - # Save depth camera info (same as color for ZED) - depth_info_path = self.output_dir / "depth_camera_info.yaml" - with open(depth_info_path, "w") as f: - yaml.dump(camera_info, f, default_flow_style=False) - - logger.info(f"Saved camera info files to {self.output_dir}") - - def normalize_depth_for_display(self, depth_map): - """Normalize depth map for OpenCV visualization.""" - # Handle invalid values - valid_mask = (depth_map > 0) & np.isfinite(depth_map) - - if not np.any(valid_mask): - return np.zeros_like(depth_map, dtype=np.uint8) - - # Normalize to 0-255 for display - depth_norm = np.zeros_like(depth_map, dtype=np.float32) - depth_clipped = np.clip(depth_map[valid_mask], 0, self.max_depth) - depth_norm[valid_mask] = depth_clipped / self.max_depth - - # Convert to 8-bit and apply colormap - depth_8bit = (depth_norm * 255).astype(np.uint8) - depth_colored = cv2.applyColorMap(depth_8bit, cv2.COLORMAP_JET) - - return depth_colored - - def save_frame(self, rgb_img, depth_map): - """Save RGB, depth images, and pointcloud with proper naming convention.""" - # Generate filename with 5-digit zero-padding - filename = f"{self.save_counter:05d}.png" - pcd_filename = f"{self.save_counter:05d}.ply" - - # Save RGB image - rgb_path = self.output_dir / "color" / filename - cv2.imwrite(str(rgb_path), rgb_img) - - # Save depth image (convert to 16-bit for proper depth storage) - depth_path = self.output_dir / "depth" / filename - # Convert meters to millimeters and save as 16-bit - depth_mm = (depth_map * 1000).astype(np.uint16) - cv2.imwrite(str(depth_path), depth_mm) - - # Capture and save pointcloud - pcd = self.camera.capture_pointcloud() - if pcd is not None and len(np.asarray(pcd.points)) > 0: - pcd_path = self.output_dir / "pointclouds" / pcd_filename - o3d.io.write_point_cloud(str(pcd_path), pcd) - - # Store pointcloud for later visualization - self.captured_pointclouds.append(pcd) - - logger.info( - f"Saved frame {self.save_counter}: {rgb_path}, {depth_path}, and {pcd_path}" - ) - else: - logger.warning(f"Failed to capture pointcloud for frame {self.save_counter}") - logger.info(f"Saved frame {self.save_counter}: {rgb_path} and {depth_path}") - - self.save_counter += 1 - - def visualize_captured_pointclouds(self): - """Visualize all captured pointclouds using Open3D, one by one.""" - if not self.captured_pointclouds: - logger.info("No pointclouds captured to visualize") - return - - logger.info( - f"Visualizing {len(self.captured_pointclouds)} captured pointclouds one by one..." - ) - logger.info("Close each pointcloud window to proceed to the next one") - - for i, pcd in enumerate(self.captured_pointclouds): - if len(np.asarray(pcd.points)) > 0: - logger.info(f"Displaying pointcloud {i + 1}/{len(self.captured_pointclouds)}") - visualize_pcd(pcd, window_name=f"ZED Pointcloud {i + 1:05d}", point_size=2.0) - else: - logger.warning(f"Pointcloud {i + 1} is empty, skipping...") - - logger.info("Finished displaying all pointclouds") - - def update_display(self): - """Update the live display with new frames.""" - # Capture frame - left_img, _right_img, depth_map = self.camera.capture_frame() - - if left_img is None or depth_map is None: - return False, None, None - - # Resize RGB to 480p - rgb_resized = cv2.resize(left_img, (self.display_width, self.display_height)) - - # Create depth visualization - depth_colored = self.normalize_depth_for_display(depth_map) - - # Resize depth to 480p - depth_resized = cv2.resize(depth_colored, (self.display_width, self.display_height)) - - # Add text overlays - text_color = (255, 255, 255) - font = cv2.FONT_HERSHEY_SIMPLEX - font_scale = 0.6 - thickness = 2 - - # Add title and instructions to RGB - cv2.putText( - rgb_resized, "RGB Camera Feed", (10, 25), font, font_scale, text_color, thickness - ) - cv2.putText( - rgb_resized, - "SPACE: Save | ESC/Q: Quit", - (10, 50), - font, - font_scale - 0.1, - text_color, - thickness, - ) - - # Add title and stats to depth - cv2.putText( - depth_resized, - f"Depth Map (0-{self.max_depth}m)", - (10, 25), - font, - font_scale, - text_color, - thickness, - ) - cv2.putText( - depth_resized, - f"Saved: {self.save_counter} frames", - (10, 50), - font, - font_scale - 0.1, - text_color, - thickness, - ) - - # Stack images horizontally - combined_display = np.hstack((rgb_resized, depth_resized)) - - # Display combined image - cv2.imshow(self.window_name, combined_display) - - return True, left_img, depth_map - - def handle_key_events(self, rgb_img, depth_map): - """Handle keyboard input.""" - key = cv2.waitKey(1) & 0xFF - - if key == ord(" "): # Space key - save frame - if rgb_img is not None and depth_map is not None: - self.save_frame(rgb_img, depth_map) - return "save" - elif key == 27 or key == ord("q"): # ESC or 'q' - quit - return "quit" - - return "continue" - - def cleanup(self): - """Clean up OpenCV windows.""" - cv2.destroyAllWindows() - - -def main(): - parser = argparse.ArgumentParser( - description="ZED Camera Neural Depth Demo - OpenCV with Data Saving" - ) - parser.add_argument("--camera-id", type=int, default=0, help="ZED camera ID (default: 0)") - parser.add_argument( - "--resolution", - type=str, - default="HD1080", - choices=["HD2K", "HD1080", "HD720", "VGA"], - help="Camera resolution (default: HD1080)", - ) - parser.add_argument( - "--max-depth", - type=float, - default=10.0, - help="Maximum depth for visualization in meters (default: 10.0)", - ) - parser.add_argument( - "--camera-fps", type=int, default=15, help="Camera capture FPS (default: 30)" - ) - parser.add_argument( - "--depth-mode", - type=str, - default="NEURAL", - choices=["NEURAL", "NEURAL_PLUS"], - help="Depth mode (NEURAL=faster, NEURAL_PLUS=more accurate)", - ) - parser.add_argument( - "--output-dir", - type=str, - default="assets/rgbd_data2", - help="Output directory for saved data (default: rgbd_data2)", - ) - - args = parser.parse_args() - - # Map resolution string to ZED enum - resolution_map = { - "HD2K": sl.RESOLUTION.HD2K, - "HD1080": sl.RESOLUTION.HD1080, - "HD720": sl.RESOLUTION.HD720, - "VGA": sl.RESOLUTION.VGA, - } - - depth_mode_map = {"NEURAL": sl.DEPTH_MODE.NEURAL, "NEURAL_PLUS": sl.DEPTH_MODE.NEURAL_PLUS} - - try: - # Initialize ZED camera with neural depth - logger.info( - f"Initializing ZED camera with {args.depth_mode} depth processing at {args.camera_fps} FPS..." - ) - camera = ZEDCamera( - camera_id=args.camera_id, - resolution=resolution_map[args.resolution], - depth_mode=depth_mode_map[args.depth_mode], - fps=args.camera_fps, - ) - - # Open camera - with camera: - # Get camera information - info = camera.get_camera_info() - logger.info(f"Camera Model: {info.get('model', 'Unknown')}") - logger.info(f"Serial Number: {info.get('serial_number', 'Unknown')}") - logger.info(f"Firmware: {info.get('firmware', 'Unknown')}") - logger.info(f"Resolution: {info.get('resolution', {})}") - logger.info(f"Baseline: {info.get('baseline', 0):.3f}m") - - # Initialize visualizer - visualizer = ZEDLiveVisualizer( - camera, max_depth=args.max_depth, output_dir=args.output_dir - ) - - logger.info("Starting live visualization...") - logger.info("Controls:") - logger.info(" SPACE - Save current RGB and depth frame") - logger.info(" ESC/Q - Quit") - - frame_count = 0 - start_time = time.time() - - try: - while True: - loop_start = time.time() - - # Update display - success, rgb_img, depth_map = visualizer.update_display() - - if success: - frame_count += 1 - - # Handle keyboard events - action = visualizer.handle_key_events(rgb_img, depth_map) - - if action == "quit": - break - elif action == "save": - # Frame was saved, no additional action needed - pass - - # Print performance stats every 60 frames - if frame_count % 60 == 0: - elapsed = time.time() - start_time - fps = frame_count / elapsed - logger.info( - f"Frame {frame_count} | FPS: {fps:.1f} | Saved: {visualizer.save_counter}" - ) - - # Small delay to prevent CPU overload - elapsed = time.time() - loop_start - min_frame_time = 1.0 / 60.0 # Cap at 60 FPS - if elapsed < min_frame_time: - time.sleep(min_frame_time - elapsed) - - except KeyboardInterrupt: - logger.info("Stopped by user") - - # Final stats - total_time = time.time() - start_time - if total_time > 0: - avg_fps = frame_count / total_time - logger.info( - f"Final stats: {frame_count} frames in {total_time:.1f}s (avg {avg_fps:.1f} FPS)" - ) - logger.info(f"Total saved frames: {visualizer.save_counter}") - - # Visualize captured pointclouds - visualizer.visualize_captured_pointclouds() - - except Exception as e: - logger.error(f"Error during execution: {e}") - raise - finally: - if "visualizer" in locals(): - visualizer.cleanup() - logger.info("Demo completed") - - -if __name__ == "__main__": - main()