From b3897d04401057f41ed3c24d3bd0477dd4d098c1 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Wed, 28 May 2025 18:07:00 -0700 Subject: [PATCH 01/46] remove validation --- dimos/agents/cerebras_agent.py | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 330e9c8c40..08a3920a26 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -263,25 +263,6 @@ def _send_query(self, messages: list) -> Any: api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - # Add response format for structured output if specified - if self.response_model is not None: - # Convert Pydantic model to JSON schema for Cerebras - from pydantic import TypeAdapter - schema = TypeAdapter(self.response_model).json_schema() - - # Ensure additionalProperties is set to False for strict mode - if "additionalProperties" not in schema: - schema["additionalProperties"] = False - - api_params["response_format"] = { - "type": "json_schema", - "json_schema": { - "name": self.response_model.__name__ if hasattr(self.response_model, '__name__') else "response", - "strict": True, - "schema": schema - } - } - # Make the API call response = self.client.chat.completions.create(**api_params) From 2005afe5248e199bd9ab5d8b5e627579722f843e Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Wed, 28 May 2025 18:07:35 -0700 Subject: [PATCH 02/46] add tests --- tests/test_cerebras_agent_query.py | 32 +++++++ tests/test_cerebras_agent_skills.py | 130 ++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 tests/test_cerebras_agent_query.py create mode 100644 tests/test_cerebras_agent_skills.py diff --git a/tests/test_cerebras_agent_query.py b/tests/test_cerebras_agent_query.py new file mode 100644 index 0000000000..665135cb69 --- /dev/null +++ b/tests/test_cerebras_agent_query.py @@ -0,0 +1,32 @@ +# 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 test_header + +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent + +# Load API key from environment +load_dotenv() + +# Create a CerebrasAgent instance +agent = CerebrasAgent( + 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 Cerebras Agent: {response}") \ No newline at end of file diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py new file mode 100644 index 0000000000..16b00c6c57 --- /dev/null +++ b/tests/test_cerebras_agent_skills.py @@ -0,0 +1,130 @@ +# 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 +import os +import tests.test_header + +import time +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent +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.web.robot_web_interface import RobotWebInterface +from dimos.skills.observe_stream import ObserveStream +from dimos.skills.kill_skill import KillSkill +from dimos.skills.navigation import Navigate, BuildSemanticMap, GetPose, NavigateToGoal +from dimos.skills.visual_navigation_skills import NavigateToObject, FollowHuman +import reactivex as rx +import reactivex.operators as ops +from dimos.stream.audio.pipelines import tts, stt +from dimos.web.websocket_vis.server import WebsocketVis +import threading +from dimos.types.vector import Vector +from dimos.skills.speak import Speak + +# 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=5556, text_streams=text_streams, **streams) + +stt_node = stt() + +# Create a CerebrasAgent instance +agent = CerebrasAgent( + dev_name="test_cerebras_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="llama-4-scout-17b-16e-instruct" +) + +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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") +print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") + +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() \ No newline at end of file From 0fdc93275b7791da843f5129c6455c6c3430bb5a Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Wed, 28 May 2025 19:34:20 -0700 Subject: [PATCH 03/46] update deprecated docker files --- docker/deprecated/unitree/agents/Dockerfile | 4 ++-- docker/deprecated/unitree/agents/docker-compose.yml | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docker/deprecated/unitree/agents/Dockerfile b/docker/deprecated/unitree/agents/Dockerfile index c46fdd66e6..ea8cf63bd8 100644 --- a/docker/deprecated/unitree/agents/Dockerfile +++ b/docker/deprecated/unitree/agents/Dockerfile @@ -122,10 +122,10 @@ RUN echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /root/.bashrc && \ COPY docker /app/docker/ # Setup supervisor configuration -COPY docker/unitree/agents/supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY docker/deprecated/unitree/agents/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # Copy entrypoint script -COPY docker/unitree/agents/entrypoint.sh /entrypoint.sh +COPY docker/deprecated/unitree/agents/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # Copy dimos and tests diff --git a/docker/deprecated/unitree/agents/docker-compose.yml b/docker/deprecated/unitree/agents/docker-compose.yml index 6cde23e98e..6c86ee5ff0 100644 --- a/docker/deprecated/unitree/agents/docker-compose.yml +++ b/docker/deprecated/unitree/agents/docker-compose.yml @@ -3,10 +3,10 @@ services: dimos-unitree-agents: image: dimos-unitree-agents:latest build: - context: ../../../ - dockerfile: docker/unitree/agents/Dockerfile + context: ../../../../ + dockerfile: docker/deprecated/unitree/agents/Dockerfile env_file: - - ../../../.env + - ../../../../.env environment: PYTHONUNBUFFERED: 1 ROBOT_IP: ${ROBOT_IP} @@ -15,10 +15,11 @@ services: WEBRTC_SERVER_PORT: ${WEBRTC_SERVER_PORT:-9991} DISPLAY: ${DISPLAY:-} # For GUI applications like rviz2 ROS_OUTPUT_DIR: /app/assets/output/ros # Change output directory + CUDA_VISIBLE_DEVICES: "" # Force CPU-only mode # DIMOS_MAX_WORKERS: ${DIMOS_MAX_WORKERS} # TODO: ipc: host volumes: - - ../../../assets:/app/assets + - ../../../../assets:/app/assets ports: - "5555:5555" mem_limit: 8048m From 54eecb5ebd1239aed3334df1501c2d5af2aae03d Mon Sep 17 00:00:00 2001 From: stash Date: Wed, 28 May 2025 20:06:09 -0700 Subject: [PATCH 04/46] Fix deprecated skills --- tests/test_cerebras_agent_skills.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index 16b00c6c57..b389f885ea 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -25,8 +25,8 @@ from dimos.web.robot_web_interface import RobotWebInterface from dimos.skills.observe_stream import ObserveStream from dimos.skills.kill_skill import KillSkill -from dimos.skills.navigation import Navigate, BuildSemanticMap, GetPose, NavigateToGoal -from dimos.skills.visual_navigation_skills import NavigateToObject, FollowHuman +from dimos.skills.navigation import NavigateWithText, GetPose, NavigateToGoal +from dimos.skills.visual_navigation_skills import FollowHuman import reactivex as rx import reactivex.operators as ops from dimos.stream.audio.pipelines import tts, stt @@ -82,18 +82,14 @@ 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(NavigateWithText) 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("NavigateWithText", robot=robot) robot_skills.create_instance("FollowHuman", robot=robot) robot_skills.create_instance("GetPose", robot=robot) robot_skills.create_instance("NavigateToGoal", robot=robot) From 6a924f4948c77c59b1c7957c51796b893eb93200 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 03:41:24 +0000 Subject: [PATCH 05/46] initial commit --- .devcontainer/devcontainer.json | 20 +- .gitattributes | 3 + .github/workflows/cleanup.yml | 33 + .github/workflows/docker.yml | 34 +- .github/workflows/{pytest.yml => tests.yml} | 4 +- .gitignore | 9 + .gitmodules | 9 - .../untitled-checkpoint.md | 0 .pre-commit-config.yaml | 33 + bin/dev | 139 +- bin/lfs_check | 42 + bin/lfs_push | 98 + .../cerebras_agent-checkpoint.py | 422 + dimos/agents/agent.py | 494 +- dimos/agents/agent_config.py | 1 + dimos/agents/agent_ctransformers_gguf.py | 73 +- dimos/agents/agent_huggingface_local.py | 131 +- dimos/agents/agent_huggingface_remote.py | 66 +- dimos/agents/cerebras_agent.py | 220 +- dimos/agents/claude_agent.py | 491 +- dimos/agents/memory/base.py | 39 +- dimos/agents/memory/chroma_impl.py | 54 +- dimos/agents/memory/image_embedding.py | 88 +- dimos/agents/memory/spatial_vector_db.py | 200 +- dimos/agents/memory/visual_memory.py | 77 +- dimos/agents/planning_agent.py | 113 +- dimos/agents/prompt_builder/impl.py | 43 +- dimos/agents/tokenizer/base.py | 3 - .../agents/tokenizer/huggingface_tokenizer.py | 11 +- dimos/agents/tokenizer/openai_tokenizer.py | 13 +- dimos/data/data_pipeline.py | 41 +- dimos/data/depth.py | 24 +- dimos/data/labels.py | 12 +- dimos/data/pointcloud.py | 53 +- dimos/data/segment.py | 16 +- dimos/environment/agent_environment.py | 14 +- dimos/environment/colmap_environment.py | 1 + dimos/environment/environment.py | 16 +- dimos/exceptions/agent_memory_exceptions.py | 20 +- dimos/hardware/camera.py | 11 +- dimos/hardware/end_effector.py | 1 + dimos/hardware/interface.py | 22 +- dimos/hardware/sensor.py | 1 + dimos/hardware/stereo_camera.py | 3 +- dimos/hardware/ufactory.py | 2 + .../models/Detic/configs/BoxSup_ViLD_200e.py | 36 +- dimos/models/Detic/configs/Detic_ViLD_200e.py | 53 +- dimos/models/Detic/demo.py | 25 +- dimos/models/Detic/detic/__init__.py | 2 +- dimos/models/Detic/detic/config.py | 96 +- dimos/models/Detic/detic/custom_solver.py | 24 +- .../detic/data/custom_build_augmentation.py | 16 +- .../detic/data/custom_dataset_dataloader.py | 151 +- .../Detic/detic/data/custom_dataset_mapper.py | 139 +- dimos/models/Detic/detic/data/datasets/cc.py | 6 +- .../detic/data/datasets/coco_zeroshot.py | 190 +- .../Detic/detic/data/datasets/imagenet.py | 27 +- .../data/datasets/lvis_22k_categories.py | 22384 +++++++++++++++- .../Detic/detic/data/datasets/lvis_v1.py | 91 +- .../Detic/detic/data/datasets/objects365.py | 760 +- dimos/models/Detic/detic/data/datasets/oid.py | 1020 +- .../Detic/detic/data/datasets/register_oid.py | 29 +- dimos/models/Detic/detic/data/tar_dataset.py | 44 +- .../transforms/custom_augmentation_impl.py | 22 +- .../detic/data/transforms/custom_transform.py | 31 +- .../detic/evaluation/custom_coco_eval.py | 38 +- .../models/Detic/detic/evaluation/oideval.py | 283 +- .../modeling/backbone/swintransformer.py | 421 +- .../Detic/detic/modeling/backbone/timm.py | 121 +- dimos/models/Detic/detic/modeling/debug.py | 288 +- .../detic/modeling/meta_arch/custom_rcnn.py | 199 +- .../modeling/meta_arch/d2_deformable_detr.py | 161 +- .../modeling/roi_heads/detic_fast_rcnn.py | 396 +- .../modeling/roi_heads/detic_roi_heads.py | 197 +- .../modeling/roi_heads/res5_roi_heads.py | 128 +- .../roi_heads/zero_shot_classifier.py | 55 +- .../Detic/detic/modeling/text/text_encoder.py | 95 +- dimos/models/Detic/detic/modeling/utils.py | 30 +- dimos/models/Detic/detic/predictor.py | 31 +- dimos/models/Detic/lazy_train_net.py | 9 +- dimos/models/Detic/predict.py | 40 +- .../CenterNet2/centernet/config.py | 32 +- .../data/custom_build_augmentation.py | 25 +- .../data/custom_dataset_dataloader.py | 79 +- .../centernet/data/datasets/coco.py | 16 +- .../centernet/data/datasets/nuimages.py | 27 +- .../centernet/data/datasets/objects365.py | 741 +- .../transforms/custom_augmentation_impl.py | 17 +- .../data/transforms/custom_transform.py | 17 +- .../centernet/modeling/backbone/bifpn.py | 310 +- .../centernet/modeling/backbone/bifpn_fcos.py | 138 +- .../centernet/modeling/backbone/dla.py | 354 +- .../centernet/modeling/backbone/dlafpn.py | 326 +- .../centernet/modeling/backbone/fpn_p5.py | 9 +- .../centernet/modeling/backbone/res2net.py | 144 +- .../CenterNet2/centernet/modeling/debug.py | 243 +- .../modeling/dense_heads/centernet.py | 777 +- .../modeling/dense_heads/centernet_head.py | 93 +- .../centernet/modeling/dense_heads/utils.py | 24 +- .../centernet/modeling/layers/deform_conv.py | 47 +- .../modeling/layers/heatmap_focal_loss.py | 27 +- .../centernet/modeling/layers/iou_loss.py | 36 +- .../centernet/modeling/layers/ml_nms.py | 12 +- .../modeling/meta_arch/centernet_detector.py | 20 +- .../modeling/roi_heads/custom_fast_rcnn.py | 81 +- .../modeling/roi_heads/custom_roi_heads.py | 86 +- .../centernet/modeling/roi_heads/fed_loss.py | 25 +- .../Detic/third_party/CenterNet2/demo.py | 25 +- .../Detic/third_party/CenterNet2/predictor.py | 6 +- .../CenterNet2/tools/analyze_model.py | 3 +- .../third_party/CenterNet2/tools/benchmark.py | 2 +- .../CenterNet2/tools/deploy/export_model.py | 4 +- .../CenterNet2/tools/lazyconfig_train_net.py | 1 + .../CenterNet2/tools/lightning_train_net.py | 9 +- .../CenterNet2/tools/plain_train_net.py | 12 +- .../third_party/CenterNet2/tools/train_net.py | 12 +- .../Detic/third_party/CenterNet2/train_net.py | 87 +- .../third_party/Deformable-DETR/benchmark.py | 28 +- .../Deformable-DETR/datasets/__init__.py | 7 +- .../Deformable-DETR/datasets/coco.py | 96 +- .../Deformable-DETR/datasets/coco_eval.py | 27 +- .../Deformable-DETR/datasets/coco_panoptic.py | 73 +- .../datasets/data_prefetcher.py | 8 +- .../Deformable-DETR/datasets/panoptic_eval.py | 7 +- .../Deformable-DETR/datasets/samplers.py | 19 +- .../datasets/torchvision_datasets/coco.py | 27 +- .../Deformable-DETR/datasets/transforms.py | 30 +- .../third_party/Deformable-DETR/engine.py | 83 +- .../Detic/third_party/Deformable-DETR/main.py | 372 +- .../Deformable-DETR/models/__init__.py | 1 - .../Deformable-DETR/models/backbone.py | 34 +- .../Deformable-DETR/models/deformable_detr.py | 281 +- .../models/deformable_transformer.py | 240 +- .../Deformable-DETR/models/matcher.py | 32 +- .../models/ops/functions/__init__.py | 1 - .../ops/functions/ms_deform_attn_func.py | 61 +- .../models/ops/modules/ms_deform_attn.py | 81 +- .../Deformable-DETR/models/ops/setup.py | 11 +- .../Deformable-DETR/models/ops/test.py | 73 +- .../models/position_encoding.py | 31 +- .../Deformable-DETR/models/segmentation.py | 57 +- .../Deformable-DETR/tools/launch.py | 86 +- .../Deformable-DETR/util/box_ops.py | 11 +- .../third_party/Deformable-DETR/util/misc.py | 199 +- .../Deformable-DETR/util/plot_utils.py | 63 +- ...nvert-thirdparty-pretrained-model-to-d2.py | 24 +- .../Detic/tools/create_imagenetlvis_json.py | 51 +- dimos/models/Detic/tools/create_lvis_21k.py | 95 +- dimos/models/Detic/tools/download_cc.py | 39 +- .../models/Detic/tools/dump_clip_features.py | 125 +- dimos/models/Detic/tools/fix_o365_names.py | 40 +- dimos/models/Detic/tools/fix_o365_path.py | 26 +- dimos/models/Detic/tools/get_cc_tags.py | 114 +- .../Detic/tools/get_coco_zeroshot_oriorder.py | 24 +- .../tools/get_imagenet_21k_full_tar_json.py | 70 +- dimos/models/Detic/tools/get_lvis_cat_info.py | 53 +- dimos/models/Detic/tools/merge_lvis_coco.py | 102 +- .../Detic/tools/preprocess_imagenet22k.py | 50 +- dimos/models/Detic/tools/remove_lvis_rare.py | 27 +- .../models/Detic/tools/unzip_imagenet_lvis.py | 19 +- dimos/models/Detic/train_net.py | 121 +- dimos/models/depth/metric3d.py | 74 +- dimos/models/labels/llava-34b.py | 64 +- dimos/models/pointcloud/pointcloud_utils.py | 44 +- dimos/models/qwen/video_query.py | 114 +- dimos/models/segmentation/clipseg.py | 12 +- dimos/models/segmentation/sam.py | 12 +- dimos/models/segmentation/segment_utils.py | 10 +- dimos/perception/common/__init__.py | 2 +- dimos/perception/common/cuboid_fit.py | 244 +- .../perception/common/detection2d_tracker.py | 157 +- dimos/perception/common/export_tensorrt.py | 39 +- dimos/perception/common/ibvs.py | 139 +- dimos/perception/detection2d/__init__.py | 2 +- dimos/perception/detection2d/detic_2d_det.py | 238 +- dimos/perception/detection2d/utils.py | 160 +- dimos/perception/detection2d/yolo_2d_det.py | 48 +- dimos/perception/object_detection_stream.py | 166 +- dimos/perception/object_tracker.py | 241 +- dimos/perception/person_tracker.py | 112 +- .../perception/segmentation/image_analyzer.py | 39 +- dimos/perception/segmentation/sam_2d_seg.py | 165 +- dimos/perception/segmentation/utils.py | 110 +- dimos/perception/semantic_seg.py | 166 +- dimos/perception/spatial_perception.py | 231 +- dimos/perception/visual_servoing.py | 223 +- dimos/robot/abstract_robot.py | 28 +- dimos/robot/global_planner/algo.py | 77 +- dimos/robot/global_planner/planner.py | 5 +- dimos/robot/local_planner/__init__.py | 2 +- dimos/robot/local_planner/local_planner.py | 660 +- .../robot/local_planner/vfh_local_planner.py | 221 +- dimos/robot/position_stream.py | 78 +- dimos/robot/recorder.py | 10 +- dimos/robot/robot.py | 171 +- dimos/robot/ros_command_queue.py | 259 +- dimos/robot/ros_control.py | 150 +- dimos/robot/ros_observable_topic.py | 17 +- dimos/robot/ros_transform.py | 88 +- dimos/robot/test_ros_observable_topic.py | 5 +- dimos/robot/unitree/external/go2_ros2_sdk | 1 - dimos/robot/unitree/unitree_go2.py | 16 +- dimos/robot/unitree/unitree_ros_control.py | 106 +- dimos/robot/unitree/unitree_skills.py | 395 +- dimos/robot/unitree_webrtc/connection.py | 6 +- dimos/robot/unitree_webrtc/test_tooling.py | 2 + dimos/robot/unitree_webrtc/testing/helpers.py | 7 +- .../robot/unitree_webrtc/testing/test_mock.py | 1 + .../unitree_webrtc/testing/test_multimock.py | 13 +- dimos/robot/unitree_webrtc/type/costmap.py | 8 +- dimos/robot/unitree_webrtc/type/lidar.py | 4 +- dimos/robot/unitree_webrtc/type/map.py | 8 +- dimos/robot/unitree_webrtc/type/test_lidar.py | 5 +- .../unitree_webrtc/type/test_timeseries.py | 1 - dimos/robot/unitree_webrtc/type/vector.py | 20 +- dimos/robot/unitree_webrtc/unitree_go2.py | 7 +- dimos/simulation/__init__.py | 7 +- dimos/simulation/base/simulator_base.py | 16 +- dimos/simulation/base/stream_base.py | 67 +- dimos/simulation/genesis/__init__.py | 5 +- dimos/simulation/genesis/simulator.py | 86 +- dimos/simulation/genesis/stream.py | 60 +- dimos/simulation/isaac/__init__.py | 5 +- dimos/simulation/isaac/simulator.py | 25 +- dimos/simulation/isaac/stream.py | 62 +- dimos/skills/kill_skill.py | 20 +- dimos/skills/navigation.py | 348 +- dimos/skills/observe_stream.py | 116 +- dimos/skills/rest/rest.py | 27 +- dimos/skills/skills.py | 113 +- dimos/skills/speak.py | 49 +- dimos/skills/visual_navigation_skills.py | 77 +- dimos/stream/audio/base.py | 4 +- dimos/stream/audio/node_key_recorder.py | 25 +- dimos/stream/audio/node_normalizer.py | 7 +- dimos/stream/audio/node_simulated.py | 28 +- dimos/stream/audio/pipelines.py | 4 +- dimos/stream/audio/stt/node_whisper.py | 4 +- dimos/stream/audio/volume.py | 2 +- dimos/stream/data_provider.py | 81 +- dimos/stream/frame_processor.py | 58 +- dimos/stream/ros_video_provider.py | 27 +- dimos/stream/rtsp_video_provider.py | 224 +- dimos/stream/stream_merger.py | 16 +- dimos/stream/video_operators.py | 160 +- dimos/stream/video_provider.py | 49 +- dimos/stream/video_providers/unitree.py | 43 +- dimos/stream/videostream.py | 3 +- dimos/types/constants.py | 1 - dimos/types/costmap.py | 12 +- dimos/types/depth_map.py | 3 +- dimos/types/label.py | 10 +- dimos/types/path.py | 4 +- dimos/types/pointcloud.py | 5 +- dimos/types/position.py | 126 +- dimos/types/robot_location.py | 50 +- dimos/types/sample.py | 28 +- dimos/types/segmentation.py | 6 +- dimos/types/test_position.py | 317 + dimos/types/test_vector.py | 353 + dimos/types/vector.py | 204 +- dimos/utils/extract_frames.py | 14 +- dimos/utils/generic_subscriber.py | 10 +- dimos/utils/logging_config.py | 4 +- dimos/utils/reactive.py | 4 +- dimos/utils/ros_utils.py | 5 +- dimos/utils/s3_utils.py | 25 +- dimos/utils/simple_controller.py | 55 +- dimos/utils/test_reactive.py | 41 +- dimos/utils/test_testing.py | 110 + dimos/utils/testing.py | 142 + dimos/utils/threadpool.py | 3 +- dimos/web/dimos_interface/__init__.py | 2 +- dimos/web/dimos_interface/api/server.py | 132 +- dimos/web/dimos_interface/tsconfig.json | 22 +- dimos/web/dimos_interface/tsconfig.node.json | 4 +- dimos/web/edge_io.py | 5 +- dimos/web/fastapi_server.py | 104 +- dimos/web/flask_server.py | 31 +- dimos/web/robot_web_interface.py | 10 +- dimos/web/websocket_vis/deno.json | 42 +- dimos/web/websocket_vis/helpers.py | 5 +- docker/dev/Dockerfile | 7 + docker/dev/dev-requirements.txt | 3 + pyproject.toml | 21 +- requirements.txt | 1 + .../test_audio_robot_agent-checkpoint.py | 37 + .../test_cerebras_agent_query-checkpoint.py | 32 + .../test_cerebras_agent_skills-checkpoint.py | 110 + ...st_object_tracking_with_qwen-checkpoint.py | 186 + tests/agent_manip_flow_fastapi_test.py | 31 +- tests/agent_manip_flow_flask_test.py | 39 +- tests/agent_memory_test.py | 2 +- tests/data/.lfs/ab_lidar_frames.tar.gz | 3 + tests/data/.lfs/cafe.jpg.tar.gz | 3 + tests/data/.lfs/office_lidar.tar.gz | 3 + tests/genesissim/stream_camera.py | 31 +- tests/isaacsim/stream_camera.py | 12 +- tests/run.py | 57 +- tests/run_go2_ros.py | 52 +- tests/simple_agent_test.py | 18 +- tests/test_agent.py | 4 + tests/test_agent_alibaba.py | 28 +- tests/test_agent_ctransformers_gguf.py | 4 +- tests/test_agent_huggingface_local.py | 10 +- tests/test_agent_huggingface_local_jetson.py | 8 +- tests/test_agent_huggingface_remote.py | 24 +- tests/test_audio_agent.py | 1 - tests/test_cerebras_agent_skills.py | 58 +- tests/test_claude_agent_query.py | 7 +- tests/test_claude_agent_skills_query.py | 25 +- tests/test_command_pose_unitree.py | 13 +- tests/test_header.py | 12 +- tests/test_huggingface_llm_agent.py | 14 +- tests/test_move_vel_unitree.py | 9 +- tests/test_navigate_to_object_robot.py | 79 +- tests/test_navigation_skills.py | 64 +- ...bject_detection_agent_data_query_stream.py | 78 +- tests/test_object_detection_stream.py | 115 +- tests/test_object_tracking_webcam.py | 110 +- tests/test_object_tracking_with_qwen.py | 86 +- tests/test_observe_stream_skill.py | 71 +- tests/test_person_following_robot.py | 53 +- tests/test_person_following_webcam.py | 117 +- tests/test_planning_agent_web_interface.py | 54 +- tests/test_planning_robot_agent.py | 32 +- tests/test_qwen_image_query.py | 18 +- tests/test_robot.py | 36 +- tests/test_rtsp_video_provider.py | 53 +- tests/test_semantic_seg_robot.py | 53 +- tests/test_semantic_seg_robot_agent.py | 68 +- tests/test_semantic_seg_webcam.py | 57 +- tests/test_skills.py | 61 +- tests/test_skills_rest.py | 15 +- tests/test_spatial_memory.py | 180 +- tests/test_spatial_memory_query.py | 207 +- tests/test_standalone_chromadb.py | 12 +- tests/test_standalone_fastapi.py | 28 +- tests/test_standalone_hugging_face.py | 16 +- tests/test_standalone_openai_json.py | 26 +- tests/test_standalone_openai_json_struct.py | 14 +- ...test_standalone_openai_json_struct_func.py | 69 +- ...lone_openai_json_struct_func_playground.py | 24 +- tests/test_standalone_project_out.py | 138 +- tests/test_standalone_rxpy_01.py | 19 +- tests/test_unitree_agent.py | 38 +- tests/test_unitree_agent_queries_fastapi.py | 27 +- tests/test_unitree_ros_v0.0.4.py | 202 + tests/test_webrtc_queue.py | 72 +- tests/test_websocketvis.py | 28 +- untitled.md | 0 351 files changed, 38131 insertions(+), 11668 deletions(-) create mode 100644 .github/workflows/cleanup.yml rename .github/workflows/{pytest.yml => tests.yml} (86%) delete mode 100644 .gitmodules rename dimos/robot/unitree/external/__init__.py => .ipynb_checkpoints/untitled-checkpoint.md (100%) create mode 100644 .pre-commit-config.yaml create mode 100755 bin/lfs_check create mode 100755 bin/lfs_push create mode 100644 dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py delete mode 160000 dimos/robot/unitree/external/go2_ros2_sdk create mode 100644 dimos/types/test_position.py create mode 100644 dimos/types/test_vector.py create mode 100644 dimos/utils/test_testing.py create mode 100644 dimos/utils/testing.py create mode 100644 docker/dev/dev-requirements.txt create mode 100644 tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py create mode 100644 tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py create mode 100644 tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py create mode 100644 tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py create mode 100644 tests/data/.lfs/ab_lidar_frames.tar.gz create mode 100644 tests/data/.lfs/cafe.jpg.tar.gz create mode 100644 tests/data/.lfs/office_lidar.tar.gz create mode 100644 tests/test_unitree_ros_v0.0.4.py create mode 100644 untitled.md diff --git a/.devcontainer/devcontainer.json b/.devcontainer/devcontainer.json index 91e5303fd0..860fcd87f2 100644 --- a/.devcontainer/devcontainer.json +++ b/.devcontainer/devcontainer.json @@ -1,7 +1,6 @@ { "name": "dimos-dev", - "image": "ghcr.io/dimensionalos/dimos-dev:latest", - "postCreateCommand": "pre-commit install", + "image": "ghcr.io/dimensionalos/dev:dev", "customizations": { "vscode": { "extensions": [ @@ -9,5 +8,22 @@ "ms-python.vscode-pylance" ] } + }, + "containerEnv": { + "PYTHONPATH": "${localEnv:PYTHONPATH}:/workspaces/dimos" + }, + "postCreateCommand": "git config --global --add safe.directory /workspaces/dimos && cd /workspaces/dimos && pre-commit install", + "settings": { + "notebook.formatOnSave.enabled": true, + "notebook.codeActionsOnSave": { + "notebook.source.fixAll": "explicit", + "notebook.source.organizeImports": "explicit" + }, + "editor.codeActionsOnSave": { + "source.fixAll": "explicit", + "source.organizeImports": "explicit" + }, + "editor.defaultFormatter": "charliermarsh.ruff", + "editor.formatOnSave": true } } diff --git a/.gitattributes b/.gitattributes index fe75a92f79..feb56d98ed 100644 --- a/.gitattributes +++ b/.gitattributes @@ -12,3 +12,6 @@ *.ico binary *.pdf binary *.mp4 binary + +# Explicit LFS tracking for test files +tests/data/.lfs/*.tar.gz filter=lfs diff=lfs merge=lfs -text diff --git a/.github/workflows/cleanup.yml b/.github/workflows/cleanup.yml new file mode 100644 index 0000000000..ee1ec788e2 --- /dev/null +++ b/.github/workflows/cleanup.yml @@ -0,0 +1,33 @@ +name: cleanup +on: push + +permissions: + contents: write + packages: write + pull-requests: read + +jobs: + pre-commit: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v3 + - uses: actions/setup-python@v3 + - name: Run pre-commit + id: pre-commit-first + uses: pre-commit/action@v3.0.1 + continue-on-error: true + + - name: Re-run pre-commit if failed initially + id: pre-commit-retry + if: steps.pre-commit-first.outcome == 'failure' + uses: pre-commit/action@v3.0.1 + continue-on-error: false + + - name: Commit code changes + uses: stefanzweifel/git-auto-commit-action@v5 + with: + commit_message: "CI code cleanup" + + docker: + needs: [pre-commit] + uses: ./.github/workflows/docker.yml diff --git a/.github/workflows/docker.yml b/.github/workflows/docker.yml index d2861ad731..a5500530e3 100644 --- a/.github/workflows/docker.yml +++ b/.github/workflows/docker.yml @@ -1,5 +1,5 @@ -name: docker-tree -on: push +name: docker +on: workflow_call permissions: contents: read @@ -56,7 +56,7 @@ jobs: echo "branch tag determined: ${branch_tag}" echo branch_tag="${branch_tag}" >> "$GITHUB_OUTPUT" - build-ros: + ros: needs: [check-changes] if: needs.check-changes.outputs.ros == 'true' uses: ./.github/workflows/_docker-build-template.yml @@ -66,21 +66,21 @@ jobs: # just a debugger inspect-needs: - needs: [check-changes, build-ros] + needs: [check-changes, ros] runs-on: dimos-runner-ubuntu-2204 if: always() steps: - run: | echo '${{ toJSON(needs) }}' - build-python: - needs: [check-changes, build-ros] + python: + needs: [check-changes, ros] if: | ${{ always() && !cancelled() && needs.check-changes.result == 'success' && - ((needs.build-ros.result == 'success') || - (needs.build-ros.result == 'skipped' && + ((needs.ros.result == 'success') || + (needs.ros.result == 'skipped' && needs.check-changes.outputs.python == 'true')) }} uses: ./.github/workflows/_docker-build-template.yml @@ -89,14 +89,14 @@ jobs: target: base-ros-python freespace: true - build-dev: - needs: [check-changes, build-python] + dev: + needs: [check-changes, python] if: | ${{ always() && !cancelled() && needs.check-changes.result == 'success' && - ((needs.build-python.result == 'success') || - (needs.build-python.result == 'skipped' && + ((needs.python.result == 'success') || + (needs.python.result == 'skipped' && needs.check-changes.outputs.dev == 'true')) }} uses: ./.github/workflows/_docker-build-template.yml @@ -105,15 +105,15 @@ jobs: target: dev run-tests: - needs: [check-changes, build-dev] + needs: [check-changes, dev] if: | ${{ always() && !cancelled() && needs.check-changes.result == 'success' && - ((needs.build-dev.result == 'success') || - (needs.build-dev.result == 'skipped' && + ((needs.dev.result == 'success') || + (needs.dev.result == 'skipped' && needs.check-changes.outputs.tests == 'true')) }} - uses: ./.github/workflows/pytest.yml + uses: ./.github/workflows/tests.yml with: - branch-tag: ${{ needs.build-dev.result != 'success' && 'dev' || needs.check-changes.outputs.branch-tag }} + branch-tag: ${{ needs.dev.result != 'success' && 'dev' || needs.check-changes.outputs.branch-tag }} diff --git a/.github/workflows/pytest.yml b/.github/workflows/tests.yml similarity index 86% rename from .github/workflows/pytest.yml rename to .github/workflows/tests.yml index 0fd43aac66..7efc7bad01 100644 --- a/.github/workflows/pytest.yml +++ b/.github/workflows/tests.yml @@ -1,4 +1,4 @@ -name: testing +name: tests on: workflow_call: @@ -21,6 +21,8 @@ jobs: steps: - uses: actions/checkout@v4 + - name: Run tests run: | + git config --global --add safe.directory '*' /entrypoint.sh bash -c "pytest" diff --git a/.gitignore b/.gitignore index 20db783b19..2439af14ed 100644 --- a/.gitignore +++ b/.gitignore @@ -17,3 +17,12 @@ venv* assets/agent/memory.txt .bash_history + +# Ignore all test data directories but allow compressed files +tests/data/* +!tests/data/.lfs/ + +# node env (used by devcontainers cli) +node_modules +package.json +package-lock.json diff --git a/.gitmodules b/.gitmodules deleted file mode 100644 index 8c04b02d59..0000000000 --- a/.gitmodules +++ /dev/null @@ -1,9 +0,0 @@ -[submodule "dimos/external/openMVS"] - path = dimos/external/openMVS - url = https://github.com/cdcseacave/openMVS.git -[submodule "dimos/external/vcpkg"] - path = dimos/external/vcpkg - url = https://github.com/microsoft/vcpkg.git -[submodule "dimos/robot/unitree/external/go2_ros2_sdk"] - path = dimos/robot/unitree/external/go2_ros2_sdk - url = https://github.com/dimensionalOS/go2_ros2_sdk.git diff --git a/dimos/robot/unitree/external/__init__.py b/.ipynb_checkpoints/untitled-checkpoint.md similarity index 100% rename from dimos/robot/unitree/external/__init__.py rename to .ipynb_checkpoints/untitled-checkpoint.md diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 0000000000..46161bb5e6 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,33 @@ +default_stages: [pre-commit] +exclude: (dimos/models/.*)|(deprecated) +repos: + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.11.11 + hooks: + #- id: ruff-check + # args: [--fix] + - id: ruff-format + stages: [pre-commit] + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v4.6.0 + hooks: + - id: check-case-conflict + - id: trailing-whitespace + language: python + types: [text] + stages: [pre-push] + - id: check-json + - id: check-toml + - id: check-yaml + - id: pretty-format-json + name: format json + args: [ --autofix, --no-sort-keys ] + + - repo: local + hooks: + - id: lfs_check + name: LFS data + always_run: true + pass_filenames: false + entry: bin/lfs_check + language: script diff --git a/bin/dev b/bin/dev index 2a2bb86021..65243af917 100755 --- a/bin/dev +++ b/bin/dev @@ -1,4 +1,40 @@ #!/usr/bin/env bash +REPO_ROOT=$(git rev-parse --show-toplevel) +REL_PATH=$(realpath --relative-to="$REPO_ROOT" "$(pwd)") +IMAGE="ghcr.io/dimensionalos/dev" +IMAGE_NAME="$IMAGE:dev" + +image_exists() { + docker image inspect "${IMAGE_NAME}" &>/dev/null +} + +image_pull() { + docker pull "$IMAGE_NAME" +} + +ensure_image_downloaded() { + if ! image_exists "$1"; then + echo "Image ${IMAGE_NAME} not found. Pulling..." + image_pull "$1" + fi +} + +check_image_running() { + if docker ps -q --filter "ancestor=${IMAGE_NAME}" | grep -q .; then + return 0 + else + return 1 + fi +} + +stop_image() { + if check_image_running ${IMAGE_NAME}; then + echo "Stopping containers from image ${IMAGE_NAME}..." + docker stop $(docker ps -q --filter "ancestor=${IMAGE_NAME}") + else + echo "No containers from image ${IMAGE_NAME} are running." + fi +} get_tag() { @@ -16,9 +52,6 @@ get_tag() { | sed -E 's#^-+|-+$##g') ;; esac -# echo "image tag determined: '${image_tag}'" - - # Return the image tag value echo "${image_tag}" } @@ -38,47 +71,81 @@ remove_image() { docker rm -f "dimos-dev-${tag}" 2>/dev/null || true } -COMPOSE_FILE="docker/dev/docker-compose.yaml" +devcontainer_install() { + # prompt user if we should install devcontainer + read -p "devcontainer CLI (https://github.com/devcontainers/cli) not found. Install into repo root? (y/n): " install_choice + if [[ "$install_choice" != "y" && "$install_choice" != "Y" ]]; then + echo "Devcontainer CLI installation aborted. Please install manually" + exit 1 + fi + + if [[ ! -d "$REPO_ROOT/node_modules" ]]; then + npm init -y 1>/dev/null + fi + npm install @devcontainers/cli 1>&2 + if [[ $? -ne 0 ]]; then + echo "Failed to install devcontainer CLI. Please install it manually." + exit 1 + fi + echo $REPO_ROOT/node_modules/.bin/devcontainer +} + + + +find_devcontainer_bin() { + local bin_path + bin_path=$(command -v devcontainer) + + if [[ -z "$bin_path" ]]; then + bin_path="$REPO_ROOT/node_modules/.bin/devcontainer" + fi + + if [[ -x "$bin_path" ]]; then + echo "$bin_path" + else + devcontainer_install + fi +} + +# Passes all arguments to devcontainer command, ensuring: +# - devcontainer CLI is installed +# - docker image is running +# - the workspace folder is set to the repository root +run_devcontainer() { + local devcontainer_bin + devcontainer_bin=$(find_devcontainer_bin) + + if ! check_image_running; then + ensure_image_downloaded + $devcontainer_bin up --workspace-folder="$REPO_ROOT" --gpu-availability="detect" + fi + + exec $devcontainer_bin $1 --workspace-folder="$REPO_ROOT" "${@:2}" +} -# Parse flags and commands -while [[ $# -gt 0 ]]; do +if [[ $# -eq 0 ]]; then + run_devcontainer exec bash +else case "$1" in - -c|--cuda) - COMPOSE_FILE="docker/dev/docker-compose-cuda.yaml" + build) + build_image shift ;; - remove) - remove_image - exit 0 + stop) + stop_image + shift ;; - build) - remove_image - build_image + down) + stop_image shift ;; - *) - # Skip unrecognized args + pull) + docker pull ghcr.io/dimensionalos/dev:dev shift ;; + *) + run_devcontainer exec "$@" + shift + ;; esac -done - -image_tag=$(get_tag) -image_name="ghcr.io/dimensionalos/dev:${image_tag}" - -if ! docker image inspect "${image_name}" &>/dev/null; then - echo "Image ${image_name} not found. Building..." - build_image fi - -# Get current directory relative to repo root -REPO_ROOT=$(git rev-parse --show-toplevel) -REL_PATH=$(realpath --relative-to="$REPO_ROOT" "$(pwd)") - -export DEV_IMAGE_TAG="${image_tag}" -echo "Starting container with image: ghcr.io/dimensionalos/dev:${image_tag}" -docker compose -f "$REPO_ROOT/$COMPOSE_FILE" up -d - -container_name="dimos-dev-${image_tag}" -echo "Entering container $container_name" -docker exec -it "$container_name" bash -c "cd $REL_PATH; exec bash" diff --git a/bin/lfs_check b/bin/lfs_check new file mode 100755 index 0000000000..09d09bd219 --- /dev/null +++ b/bin/lfs_check @@ -0,0 +1,42 @@ +#!/bin/bash + +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' + +ROOT=$(git rev-parse --show-toplevel) +cd $ROOT + +new_data=() + +# Enable nullglob to make globs expand to nothing when not matching +shopt -s nullglob + +# Iterate through all directories in tests/data +for dir_path in tests/data/*; do + + # Extract directory name + dir_name=$(basename "$dir_path") + + # Skip .lfs directory if it exists + [ "$dir_name" = ".lfs" ] && continue + + # Define compressed file path + compressed_file="tests/data/.lfs/${dir_name}.tar.gz" + + # Check if compressed file already exists + if [ -f "$compressed_file" ]; then + continue + fi + + new_data+=("$dir_name") +done + +if [ ${#new_data[@]} -gt 0 ]; then + echo -e "${RED}✗${NC} New test data detected at /tests/data:" + echo -e " ${GREEN}${new_data[@]}${NC}" + echo -e "\nEither delete or run ${GREEN}./bin/lfs_push${NC}" + echo -e "(lfs_push will compress the files into /tests/data/.lfs/, upload to LFS, and add them to your commit)" + exit 1 +fi diff --git a/bin/lfs_push b/bin/lfs_push new file mode 100755 index 0000000000..47f50b1354 --- /dev/null +++ b/bin/lfs_push @@ -0,0 +1,98 @@ +#!/bin/bash +# Compresses directories in tests/data/* into tests/data/.lfs/dirname.tar.gz +# Pushes to LFS + +set -e + +# Colors for output +RED='\033[0;31m' +GREEN='\033[0;32m' +YELLOW='\033[1;33m' +NC='\033[0m' # No Color + +#echo -e "${GREEN}Running test data compression check...${NC}" + +ROOT=$(git rev-parse --show-toplevel) +cd $ROOT + +# Check if tests/data exists +if [ ! -d "tests/data" ]; then + echo -e "${YELLOW}No tests/data directory found, skipping compression.${NC}" + exit 0 +fi + +# Track if any compression was performed +compressed_dirs=() + +# Iterate through all directories in tests/data +for dir_path in tests/data/*; do + # Skip if no directories found (glob didn't match) + [ ! "$dir_path" ] && continue + + # Extract directory name + dir_name=$(basename "$dir_path") + + # Skip .lfs directory if it exists + [ "$dir_name" = ".lfs" ] && continue + + # Define compressed file path + compressed_file="tests/data/.lfs/${dir_name}.tar.gz" + + # Check if compressed file already exists + if [ -f "$compressed_file" ]; then + continue + fi + + echo -e " ${YELLOW}Compressing${NC} $dir_path -> $compressed_file" + + # Show directory size before compression + dir_size=$(du -sh "$dir_path" | cut -f1) + echo -e " Data size: ${YELLOW}$dir_size${NC}" + + # Create compressed archive with progress bar + # Use tar with gzip compression, excluding hidden files and common temp files + tar -czf "$compressed_file" \ + --exclude='*.tmp' \ + --exclude='*.temp' \ + --exclude='.DS_Store' \ + --exclude='Thumbs.db' \ + --checkpoint=1000 \ + --checkpoint-action=dot \ + -C "tests/data" \ + "$dir_name" + + if [ $? -eq 0 ]; then + # Show compressed file size + compressed_size=$(du -sh "$compressed_file" | cut -f1) + echo -e " ${GREEN}✓${NC} Successfully compressed $dir_name (${GREEN}$dir_size${NC} → ${GREEN}$compressed_size${NC})" + compressed_dirs+=("$dir_name") + + # Add the compressed file to git LFS tracking + git add "$compressed_file" + + echo -e " ${GREEN}✓${NC} git-add $compressed_file" + + else + echo -e " ${RED}✗${NC} Failed to compress $dir_name" + exit 1 + fi +done + +if [ ${#compressed_dirs[@]} -gt 0 ]; then + # Create commit message with compressed directory names + if [ ${#compressed_dirs[@]} -eq 1 ]; then + commit_msg="Auto-compress test data: ${compressed_dirs[0]}" + else + # Join array elements with commas + dirs_list=$(IFS=', '; echo "${compressed_dirs[*]}") + commit_msg="Auto-compress test data: ${dirs_list}" + fi + + #git commit -m "$commit_msg" + echo -e "${GREEN}✓${NC} Compressed file references added. Uploading..." + git lfs push origin $(git branch --show-current) + echo -e "${GREEN}✓${NC} Uploaded to LFS" +else + echo -e "${GREEN}✓${NC} No test data to compress" +fi + diff --git a/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py new file mode 100644 index 0000000000..2c32453ed6 --- /dev/null +++ b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py @@ -0,0 +1,422 @@ +# 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. + +"""Cerebras agent implementation for the DIMOS agent framework. + +This module provides a CerebrasAgent class that implements the LLMAgent interface +for Cerebras inference API using the official Cerebras Python SDK. +""" + +from __future__ import annotations + +import os +import threading +import copy +from typing import Any, Dict, List, Optional, Union, Tuple +import logging +import json + +from cerebras.cloud.sdk import Cerebras +from dotenv import load_dotenv +from pydantic import BaseModel +from reactivex import Observable +from reactivex.observer import Observer +from reactivex.scheduler import ThreadPoolScheduler +from openai._types import NOT_GIVEN + +# Local imports +from dimos.agents.agent import LLMAgent +from dimos.agents.memory.base import AbstractAgentSemanticMemory +from dimos.skills.skills import AbstractSkill, SkillLibrary +from dimos.stream.frame_processor import FrameProcessor +from dimos.utils.logging_config import setup_logger + +# Initialize environment variables +load_dotenv() + +# Initialize logger for the Cerebras agent +logger = setup_logger("dimos.agents.cerebras") + + +class CerebrasAgent(LLMAgent): + """Cerebras agent implementation using the official Cerebras Python SDK. + + This class implements the _send_query method to interact with Cerebras API + using their official SDK, allowing most of the LLMAgent logic to be reused. + """ + + def __init__( + self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "llama-4-scout-17b-16e-instruct", + skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + ): + """ + Initializes a new instance of the CerebrasAgent. + + Args: + dev_name (str): The device name of the agent. + agent_type (str): The type of the agent. + query (str): The default query text. + input_query_stream (Observable): An observable for query input. + input_video_stream (Observable): An observable for video frames. + input_data_stream (Observable): An observable for data input. + output_dir (str): Directory for output files. + agent_memory (AbstractAgentSemanticMemory): The memory system. + system_query (str): The system prompt to use with RAG context. + max_input_tokens_per_request (int): Maximum tokens for input. + max_output_tokens_per_request (int): Maximum tokens for output. + model_name (str): The Cerebras model name to use. Available options: + - llama-4-scout-17b-16e-instruct (default, fastest) + - llama3.1-8b + - llama-3.3-70b + - qwen-3-32b + - deepseek-r1-distill-llama-70b (private preview) + skills (Union[AbstractSkill, List[AbstractSkill], SkillLibrary]): Skills available to the agent. + response_model (BaseModel): Optional Pydantic model for structured responses. + frame_processor (FrameProcessor): Custom frame processor. + image_detail (str): Detail level for images ("low", "high", "auto"). + pool_scheduler (ThreadPoolScheduler): The scheduler to use for thread pool operations. + process_all_inputs (bool): Whether to process all inputs or skip when busy. + """ + # Determine appropriate default for process_all_inputs if not provided + if process_all_inputs is None: + # Default to True for text queries, False for video streams + if input_query_stream is not None and input_video_stream is None: + process_all_inputs = True + else: + process_all_inputs = False + + super().__init__( + dev_name=dev_name, + agent_type=agent_type, + agent_memory=agent_memory, + pool_scheduler=pool_scheduler, + process_all_inputs=process_all_inputs, + system_query=system_query, + input_query_stream=input_query_stream, + input_video_stream=input_video_stream, + input_data_stream=input_data_stream, + ) + + # Initialize Cerebras client + self.client = Cerebras() + + self.query = query + self.output_dir = output_dir + os.makedirs(self.output_dir, exist_ok=True) + + # Initialize conversation history for multi-turn conversations + self.conversation_history = [] + self._history_lock = threading.Lock() + + # Configure skills + self.skills = skills + self.skill_library = None + if isinstance(self.skills, SkillLibrary): + self.skill_library = self.skills + elif isinstance(self.skills, list): + self.skill_library = SkillLibrary() + for skill in self.skills: + self.skill_library.add(skill) + elif isinstance(self.skills, AbstractSkill): + self.skill_library = SkillLibrary() + self.skill_library.add(self.skills) + + self.response_model = response_model + self.model_name = model_name + self.image_detail = image_detail + self.max_output_tokens_per_request = max_output_tokens_per_request + self.max_input_tokens_per_request = max_input_tokens_per_request + + # Add static context to memory. + self._add_context_to_memory() + + logger.info("Cerebras Agent Initialized.") + + def _add_context_to_memory(self): + """Adds initial context to the agent's memory.""" + context_data = [ + ( + "id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence.", + ), + ( + "id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image.", + ), + ("id2", "Video is a sequence of frames captured at regular intervals."), + ( + "id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", + ), + ( + "id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", + ), + ] + for doc_id, text in context_data: + self.agent_memory.add_vector(doc_id, text) + + def _build_prompt( + self, + messages: list, + base64_image: Optional[Union[str, List[str]]] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + condensed_results: str = "", + ) -> list: + """Builds a prompt message specifically for Cerebras API. + + Args: + messages (list): Existing messages list to build upon. + base64_image (Union[str, List[str]]): Optional Base64-encoded image(s). + dimensions (Tuple[int, int]): Optional image dimensions. + override_token_limit (bool): Whether to override token limits. + condensed_results (str): The condensed RAG context. + + Returns: + list: Messages formatted for Cerebras API. + """ + + # Add system message if provided and not already in history + if self.system_query and (not messages or messages[0].get("role") != "system"): + messages.insert(0, {"role": "system", "content": self.system_query}) + logger.info("Added system message to conversation") + + # Append user query while handling RAG + if condensed_results: + user_message = {"role": "user", "content": f"{condensed_results}\n\n{self.query}"} + logger.info("Created user message with RAG context") + else: + user_message = {"role": "user", "content": self.query} + + messages.append(user_message) + + if base64_image is not None: + # Handle both single image (str) and multiple images (List[str]) + images = [base64_image] if isinstance(base64_image, str) else base64_image + + # For Cerebras, we'll add images inline with text (OpenAI-style format) + for img in images: + img_content = [ + {"type": "text", "text": "Here is an image to analyze:"}, + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{img}", + "detail": self.image_detail, + }, + }, + ] + messages.append({"role": "user", "content": img_content}) + + logger.info(f"Added {len(images)} image(s) to conversation") + + return messages + + def _send_query(self, messages: list) -> Any: + """Sends the query to Cerebras API using the official Cerebras SDK. + + Args: + messages (list): The prompt messages to send. + + Returns: + The response message from Cerebras. + + Raises: + Exception: If no response message is returned. + ConnectionError: If there's an issue connecting to the API. + ValueError: If the messages or other parameters are invalid. + """ + try: + # Prepare API call parameters + api_params = { + "model": self.model_name, + "messages": messages, + "max_tokens": self.max_output_tokens_per_request, + } + + # Add tools if available + if self.skill_library and self.skill_library.get_tools(): + tools = self.skill_library.get_tools() + api_params["tools"] = tools # No conversion needed + api_params["tool_choice"] = "auto" + + # Make the API call + response = self.client.chat.completions.create(**api_params) + + response_message = response.choices[0].message + if response_message is None: + logger.error("Response message does not exist.") + raise Exception("Response message does not exist.") + + return response_message + + except ConnectionError as ce: + logger.error(f"Connection error with Cerebras API: {ce}") + raise + except ValueError as ve: + logger.error(f"Invalid parameters for Cerebras API: {ve}") + raise + except Exception as e: + logger.error(f"Unexpected error in Cerebras API call: {e}") + raise + + def _observable_query( + self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + reset_conversation: bool = False, + ): + """Main query handler that manages conversation history and Cerebras interactions. + + This method follows ClaudeAgent's pattern for efficient conversation history management. + + Args: + observer (Observer): The observer to emit responses to. + base64_image (str): Optional Base64-encoded image. + dimensions (Tuple[int, int]): Optional image dimensions. + override_token_limit (bool): Whether to override token limits. + incoming_query (str): Optional query to update the agent's query. + reset_conversation (bool): Whether to reset the conversation history. + """ + try: + # Reset conversation history if requested + if reset_conversation: + self.conversation_history = [] + logger.info("Conversation history reset") + + # Create a local copy of conversation history and record its length + messages = copy.deepcopy(self.conversation_history) + base_len = len(messages) + + # Update query and get context + self._update_query(incoming_query) + _, condensed_results = self._get_rag_context() + + # Build prompt + messages = self._build_prompt( + messages, base64_image, dimensions, override_token_limit, condensed_results + ) + + # Send query and get response + logger.info("Sending Query.") + response_message = self._send_query(messages) + logger.info(f"Received Response: {response_message}") + + if response_message is None: + logger.error("Received None response from Cerebras API") + observer.on_next("") + observer.on_completed() + return + + # Add assistant response to local messages (always) + assistant_message = {"role": "assistant"} + + if response_message.content: + assistant_message["content"] = response_message.content + else: + assistant_message["content"] = "" # Ensure content is never None + + if hasattr(response_message, "tool_calls") and response_message.tool_calls: + assistant_message["tool_calls"] = [] + for tool_call in response_message.tool_calls: + assistant_message["tool_calls"].append( + { + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments, + }, + } + ) + logger.info( + f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" + ) + + messages.append(assistant_message) + + # Handle tool calls if present (add tool messages to conversation) + self._handle_tooling(response_message, messages) + + # At the end, append only new messages to the global conversation history under a lock + if not hasattr(self, "_history_lock"): + self._history_lock = threading.Lock() + with self._history_lock: + for msg in messages[base_len:]: + self.conversation_history.append(msg) + logger.info( + f"Updated conversation history (total: {len(self.conversation_history)} messages)" + ) + + # Send response to observers + result = response_message.content or "" + observer.on_next(result) + self.response_subject.on_next(result) + observer.on_completed() + + except Exception as e: + logger.error(f"Query failed in {self.dev_name}: {e}") + observer.on_error(e) + self.response_subject.on_error(e) + + def _handle_tooling(self, response_message, messages): + """Executes tools and appends tool-use/result blocks to messages.""" + if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: + logger.info("No tool calls found in response message") + return None + + if len(response_message.tool_calls) > 1: + logger.warning( + "Multiple tool calls detected in response message. Not a tested feature." + ) + + # Execute all tools and add their results to messages + for tool_call in response_message.tool_calls: + logger.info(f"Processing tool call: {tool_call.function.name}") + + # Execute the tool + args = json.loads(tool_call.function.arguments) + tool_result = self.skill_library.call(tool_call.function.name, **args) + logger.info(f"Function Call Results: {tool_result}") + + # Add tool result to conversation history (OpenAI format) + messages.append( + { + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(tool_result), + "name": tool_call.function.name, + } + ) diff --git a/dimos/agents/agent.py b/dimos/agents/agent.py index 298af0eac9..c5d7195585 100644 --- a/dimos/agents/agent.py +++ b/dimos/agents/agent.py @@ -27,19 +27,16 @@ from __future__ import annotations # Standard library imports -import ast import json import os import threading -import logging -from typing import Any, Dict, List, Tuple, Optional, Union +from typing import Any, Tuple, Optional, Union # Third-party imports from dotenv import load_dotenv from openai import NOT_GIVEN, OpenAI from pydantic import BaseModel -import reactivex -from reactivex import Observer, create, Observable, empty, operators as RxOps, throw, just +from reactivex import Observer, create, Observable, empty, operators as RxOps, just from reactivex.disposable import CompositeDisposable, Disposable from reactivex.scheduler import ThreadPoolScheduler from reactivex.subject import Subject @@ -54,7 +51,6 @@ from dimos.stream.frame_processor import FrameProcessor from dimos.stream.stream_merger import create_stream_merger from dimos.stream.video_operators import Operators as MyOps, VideoOperators as MyVidOps -from dimos.types.constants import Colors from dimos.utils.threadpool import get_scheduler from dimos.utils.logging_config import setup_logger @@ -75,11 +71,13 @@ class Agent: """Base agent that manages memory and subscriptions.""" - def __init__(self, - dev_name: str = "NA", - agent_type: str = "Base", - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - pool_scheduler: Optional[ThreadPoolScheduler] = None): + def __init__( + self, + dev_name: str = "NA", + agent_type: str = "Base", + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + pool_scheduler: Optional[ThreadPoolScheduler] = None, + ): """ Initializes a new instance of the Agent. @@ -123,7 +121,7 @@ class LLMAgent(Agent): Subclasses must implement the `_send_query` method, which is responsible for sending the prompt to a specific LLM API. - + Attributes: query (str): The current query text to process. prompt_builder (PromptBuilder): Handles construction of prompts. @@ -137,23 +135,26 @@ class LLMAgent(Agent): frame_processor (FrameProcessor): Processes video frames. output_dir (str): Directory for output files. response_subject (Subject): Subject that emits agent responses. - process_all_inputs (bool): Whether to process every input emission (True) or + process_all_inputs (bool): Whether to process every input emission (True) or skip emissions when the agent is busy processing a previous input (False). """ + logging_file_memory_lock = threading.Lock() - def __init__(self, - dev_name: str = "NA", - agent_type: str = "LLM", - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: bool = False, - system_query: Optional[str] = None, - max_output_tokens_per_request: int = 16384, - max_input_tokens_per_request: int = 128000, - input_query_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None): + def __init__( + self, + dev_name: str = "NA", + agent_type: str = "LLM", + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: bool = False, + system_query: Optional[str] = None, + max_output_tokens_per_request: int = 16384, + max_input_tokens_per_request: int = 128000, + input_query_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + ): """ Initializes a new instance of the LLMAgent. @@ -163,7 +164,7 @@ def __init__(self, agent_memory (AbstractAgentSemanticMemory): The memory system for the agent. pool_scheduler (ThreadPoolScheduler): The scheduler to use for thread pool operations. If None, the global scheduler from get_scheduler() will be used. - process_all_inputs (bool): Whether to process every input emission (True) or + process_all_inputs (bool): Whether to process every input emission (True) or skip emissions when the agent is busy processing a previous input (False). """ super().__init__(dev_name, agent_type, agent_memory, pool_scheduler) @@ -174,60 +175,71 @@ def __init__(self, self.image_detail: str = "low" self.max_input_tokens_per_request: int = max_input_tokens_per_request self.max_output_tokens_per_request: int = max_output_tokens_per_request - self.max_tokens_per_request: int = (self.max_input_tokens_per_request + - self.max_output_tokens_per_request) + self.max_tokens_per_request: int = ( + self.max_input_tokens_per_request + self.max_output_tokens_per_request + ) self.rag_query_n: int = 4 self.rag_similarity_threshold: float = 0.45 self.frame_processor: Optional[FrameProcessor] = None self.output_dir: str = os.path.join(os.getcwd(), "assets", "agent") self.process_all_inputs: bool = process_all_inputs os.makedirs(self.output_dir, exist_ok=True) - + # Subject for emitting responses self.response_subject = Subject() - + # Conversation history for maintaining context between calls self.conversation_history = [] # Initialize input streams self.input_video_stream = input_video_stream - self.input_query_stream = input_query_stream if (input_data_stream is None) else (input_query_stream.pipe( - RxOps.with_latest_from(input_data_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:]]), - )) + self.input_query_stream = ( + input_query_stream + if (input_data_stream is None) + else ( + input_query_stream.pipe( + RxOps.with_latest_from(input_data_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:]] + ), + ) + ) + ) # Setup stream subscriptions based on inputs provided if (self.input_video_stream is not None) and (self.input_query_stream is not None): self.merged_stream = create_stream_merger( - data_input_stream=self.input_video_stream, - text_query_stream=self.input_query_stream + data_input_stream=self.input_video_stream, text_query_stream=self.input_query_stream ) - + logger.info("Subscribing to merged input stream...") # Define a query extractor for the merged stream query_extractor = lambda emission: (emission[0], emission[1][0]) self.disposables.add( self.subscribe_to_image_processing( - self.merged_stream, - query_extractor=query_extractor + self.merged_stream, query_extractor=query_extractor ) ) else: # If no merged stream, fall back to individual streams if self.input_video_stream is not None: logger.info("Subscribing to input video stream...") - self.disposables.add( - self.subscribe_to_image_processing(self.input_video_stream)) + self.disposables.add(self.subscribe_to_image_processing(self.input_video_stream)) if self.input_query_stream is not None: logger.info("Subscribing to input query stream...") - self.disposables.add( - self.subscribe_to_query_processing(self.input_query_stream)) + self.disposables.add(self.subscribe_to_query_processing(self.input_query_stream)) def _update_query(self, incoming_query: Optional[str]) -> None: """Updates the query if an incoming query is provided. @@ -248,20 +260,24 @@ def _get_rag_context(self) -> Tuple[str, str]: results = self.agent_memory.query( query_texts=self.query, n_results=self.rag_query_n, - similarity_threshold=self.rag_similarity_threshold) + similarity_threshold=self.rag_similarity_threshold, + ) formatted_results = "\n".join( f"Document ID: {doc.id}\nMetadata: {doc.metadata}\nContent: {doc.page_content}\nScore: {score}\n" - for (doc, score) in results) - condensed_results = " | ".join( - f"{doc.page_content}" for (doc, _) in results) + for (doc, score) in results + ) + condensed_results = " | ".join(f"{doc.page_content}" for (doc, _) in results) logger.info(f"Agent Memory Query Results:\n{formatted_results}") logger.info("=== Results End ===") return formatted_results, condensed_results - def _build_prompt(self, base64_image: Optional[str], - dimensions: Optional[Tuple[int, int]], - override_token_limit: bool, - condensed_results: str) -> list: + def _build_prompt( + self, + base64_image: Optional[str], + dimensions: Optional[Tuple[int, int]], + override_token_limit: bool, + condensed_results: str, + ) -> list: """Builds a prompt message using the prompt builder. Args: @@ -275,14 +291,10 @@ def _build_prompt(self, base64_image: Optional[str], """ # Budget for each component of the prompt budgets = { - "system_prompt": - self.max_input_tokens_per_request // _TOKEN_BUDGET_PARTS, - "user_query": - self.max_input_tokens_per_request // _TOKEN_BUDGET_PARTS, - "image": - self.max_input_tokens_per_request // _TOKEN_BUDGET_PARTS, - "rag": - self.max_input_tokens_per_request // _TOKEN_BUDGET_PARTS, + "system_prompt": self.max_input_tokens_per_request // _TOKEN_BUDGET_PARTS, + "user_query": self.max_input_tokens_per_request // _TOKEN_BUDGET_PARTS, + "image": self.max_input_tokens_per_request // _TOKEN_BUDGET_PARTS, + "rag": self.max_input_tokens_per_request // _TOKEN_BUDGET_PARTS, } # Define truncation policies for each component @@ -322,8 +334,7 @@ def _handle_tooling(self, response_message, messages): # TODO: Make this more generic or move implementation to OpenAIAgent. # This is presently OpenAI-specific. - def _tooling_callback(message, messages, response_message, - skill_library: SkillLibrary): + def _tooling_callback(message, messages, response_message, skill_library: SkillLibrary): has_called_tools = False new_messages = [] for tool_call in message.tool_calls: @@ -332,12 +343,14 @@ def _tooling_callback(message, messages, response_message, args = json.loads(tool_call.function.arguments) result = skill_library.call(name, **args) logger.info(f"Function Call Results: {result}") - new_messages.append({ - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(result), - "name": name - }) + new_messages.append( + { + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(result), + "name": name, + } + ) if has_called_tools: logger.info("Sending Another Query.") messages.append(response_message) @@ -349,16 +362,19 @@ def _tooling_callback(message, messages, response_message, return None if response_message.tool_calls is not None: - return _tooling_callback(response_message, messages, - response_message, self.skill_library) + return _tooling_callback( + response_message, messages, response_message, self.skill_library + ) return None - def _observable_query(self, - observer: Observer, - base64_image: Optional[str] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - incoming_query: Optional[str] = None): + def _observable_query( + self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + ): """Prepares and sends a query to the LLM, emitting the response to the observer. Args: @@ -374,9 +390,9 @@ def _observable_query(self, try: self._update_query(incoming_query) _, condensed_results = self._get_rag_context() - messages = self._build_prompt(base64_image, dimensions, - override_token_limit, - condensed_results) + messages = self._build_prompt( + base64_image, dimensions, override_token_limit, condensed_results + ) # logger.debug(f"Sending Query: {messages}") logger.info("Sending Query.") response_message = self._send_query(messages) @@ -386,20 +402,28 @@ def _observable_query(self, # TODO: Make this more generic. The parsed tag and tooling handling may be OpenAI-specific. # If no skill library is provided or there are no tool calls, emit the response directly. - if (self.skill_library is None or - self.skill_library.get_tools() in (None, NOT_GIVEN) or - response_message.tool_calls is None): - final_msg = (response_message.parsed - if hasattr(response_message, 'parsed') and - response_message.parsed else - (response_message.content if hasattr(response_message, 'content') else response_message)) + if ( + self.skill_library is None + or self.skill_library.get_tools() in (None, NOT_GIVEN) + or response_message.tool_calls is None + ): + final_msg = ( + response_message.parsed + if hasattr(response_message, "parsed") and response_message.parsed + else ( + response_message.content + if hasattr(response_message, "content") + else response_message + ) + ) observer.on_next(final_msg) self.response_subject.on_next(final_msg) else: - response_message_2 = self._handle_tooling( - response_message, messages) - final_msg = response_message_2 if response_message_2 is not None else response_message - if isinstance(final_msg, BaseModel): # TODO: Test + response_message_2 = self._handle_tooling(response_message, messages) + final_msg = ( + response_message_2 if response_message_2 is not None else response_message + ) + if isinstance(final_msg, BaseModel): # TODO: Test final_msg = str(final_msg.content) observer.on_next(final_msg) self.response_subject.on_next(final_msg) @@ -423,8 +447,7 @@ def _send_query(self, messages: list) -> Any: Raises: NotImplementedError: Always, unless overridden. """ - raise NotImplementedError( - "Subclasses must implement _send_query method.") + raise NotImplementedError("Subclasses must implement _send_query method.") def _log_response_to_file(self, response, output_dir: str = None): """Logs the LLM response to a file. @@ -437,15 +460,14 @@ def _log_response_to_file(self, response, output_dir: str = None): output_dir = self.output_dir if response is not None: with self.logging_file_memory_lock: - log_path = os.path.join(output_dir, 'memory.txt') - with open(log_path, 'a') as file: + log_path = os.path.join(output_dir, "memory.txt") + with open(log_path, "a") as file: file.write(f"{self.dev_name}: {response}\n") logger.info(f"LLM Response [{self.dev_name}]: {response}") def subscribe_to_image_processing( - self, - frame_observable: Observable, - query_extractor=None) -> Disposable: + self, frame_observable: Observable, query_extractor=None + ) -> Disposable: """Subscribes to a stream of video frames for processing. This method sets up a subscription to process incoming video frames. @@ -466,11 +488,7 @@ def subscribe_to_image_processing( if self.frame_processor is None: self.frame_processor = FrameProcessor(delete_on_init=True) - print_emission_args = { - "enabled": True, - "dev_name": self.dev_name, - "counts": {} - } + print_emission_args = {"enabled": True, "dev_name": self.dev_name, "counts": {}} def _process_frame(emission) -> Observable: """ @@ -483,28 +501,36 @@ def _process_frame(emission) -> Observable: query = self.system_query frame = emission return just(frame).pipe( - MyOps.print_emission(id='B', **print_emission_args), + MyOps.print_emission(id="B", **print_emission_args), RxOps.observe_on(self.pool_scheduler), - MyOps.print_emission(id='C', **print_emission_args), + MyOps.print_emission(id="C", **print_emission_args), RxOps.subscribe_on(self.pool_scheduler), - MyOps.print_emission(id='D', **print_emission_args), - MyVidOps.with_jpeg_export(self.frame_processor, - suffix=f"{self.dev_name}_frame_", - save_limit=_MAX_SAVED_FRAMES), - MyOps.print_emission(id='E', **print_emission_args), + MyOps.print_emission(id="D", **print_emission_args), + MyVidOps.with_jpeg_export( + self.frame_processor, + suffix=f"{self.dev_name}_frame_", + save_limit=_MAX_SAVED_FRAMES, + ), + MyOps.print_emission(id="E", **print_emission_args), MyVidOps.encode_image(), - MyOps.print_emission(id='F', **print_emission_args), - RxOps.filter(lambda base64_and_dims: base64_and_dims is not None - and base64_and_dims[0] is not None and - base64_and_dims[1] is not None), - MyOps.print_emission(id='G', **print_emission_args), - RxOps.flat_map(lambda base64_and_dims: create( - lambda observer, _: self._observable_query( - observer, - base64_image=base64_and_dims[0], - dimensions=base64_and_dims[1], - incoming_query=query))), # Use the extracted query - MyOps.print_emission(id='H', **print_emission_args), + MyOps.print_emission(id="F", **print_emission_args), + RxOps.filter( + lambda base64_and_dims: base64_and_dims is not None + and base64_and_dims[0] is not None + and base64_and_dims[1] is not None + ), + MyOps.print_emission(id="G", **print_emission_args), + RxOps.flat_map( + lambda base64_and_dims: create( + lambda observer, _: self._observable_query( + observer, + base64_image=base64_and_dims[0], + dimensions=base64_and_dims[1], + incoming_query=query, + ) + ) + ), # Use the extracted query + MyOps.print_emission(id="H", **print_emission_args), ) # Use a mutable flag to ensure only one frame is processed at a time. @@ -517,35 +543,33 @@ def process_if_free(emission): else: is_processing[0] = True return _process_frame(emission).pipe( - MyOps.print_emission(id='I', **print_emission_args), + MyOps.print_emission(id="I", **print_emission_args), RxOps.observe_on(self.pool_scheduler), - MyOps.print_emission(id='J', **print_emission_args), + MyOps.print_emission(id="J", **print_emission_args), RxOps.subscribe_on(self.pool_scheduler), - MyOps.print_emission(id='K', **print_emission_args), + MyOps.print_emission(id="K", **print_emission_args), RxOps.do_action( - on_completed=lambda: is_processing.__setitem__( - 0, False), - on_error=lambda e: is_processing.__setitem__(0, False)), - MyOps.print_emission(id='L', **print_emission_args), + on_completed=lambda: is_processing.__setitem__(0, False), + on_error=lambda e: is_processing.__setitem__(0, False), + ), + MyOps.print_emission(id="L", **print_emission_args), ) observable = frame_observable.pipe( - MyOps.print_emission(id='A', **print_emission_args), + MyOps.print_emission(id="A", **print_emission_args), RxOps.flat_map(process_if_free), - MyOps.print_emission(id='M', **print_emission_args), + MyOps.print_emission(id="M", **print_emission_args), ) disposable = observable.subscribe( - on_next=lambda response: self._log_response_to_file( - response, self.output_dir), + on_next=lambda response: self._log_response_to_file(response, self.output_dir), on_error=lambda e: logger.error(f"Error encountered: {e}"), - on_completed=lambda: logger.info( - f"Stream processing completed for {self.dev_name}")) + on_completed=lambda: logger.info(f"Stream processing completed for {self.dev_name}"), + ) self.disposables.add(disposable) return disposable - def subscribe_to_query_processing( - self, query_observable: Observable) -> Disposable: + def subscribe_to_query_processing(self, query_observable: Observable) -> Disposable: """Subscribes to a stream of queries for processing. This method sets up a subscription to process incoming queries by directly @@ -557,11 +581,7 @@ def subscribe_to_query_processing( Returns: Disposable: A disposable representing the subscription. """ - print_emission_args = { - "enabled": True, - "dev_name": self.dev_name, - "counts": {} - } + print_emission_args = {"enabled": True, "dev_name": self.dev_name, "counts": {}} def _process_query(query) -> Observable: """ @@ -569,11 +589,13 @@ def _process_query(query) -> Observable: Returns an observable that emits the LLM response. """ return just(query).pipe( - MyOps.print_emission(id='Pr A', **print_emission_args), - RxOps.flat_map(lambda query: create( - lambda observer, _: self._observable_query( - observer, incoming_query=query))), - MyOps.print_emission(id='Pr B', **print_emission_args), + MyOps.print_emission(id="Pr A", **print_emission_args), + RxOps.flat_map( + lambda query: create( + lambda observer, _: self._observable_query(observer, incoming_query=query) + ) + ), + MyOps.print_emission(id="Pr B", **print_emission_args), ) # A mutable flag indicating whether a query is currently being processed. @@ -588,62 +610,65 @@ def process_if_free(query): is_processing[0] = True logger.info("Processing Query.") return _process_query(query).pipe( - MyOps.print_emission(id='B', **print_emission_args), + MyOps.print_emission(id="B", **print_emission_args), RxOps.observe_on(self.pool_scheduler), - MyOps.print_emission(id='C', **print_emission_args), + MyOps.print_emission(id="C", **print_emission_args), RxOps.subscribe_on(self.pool_scheduler), - MyOps.print_emission(id='D', **print_emission_args), + MyOps.print_emission(id="D", **print_emission_args), RxOps.do_action( - on_completed=lambda: is_processing.__setitem__( - 0, False), - on_error=lambda e: is_processing.__setitem__(0, False)), - MyOps.print_emission(id='E', **print_emission_args), + on_completed=lambda: is_processing.__setitem__(0, False), + on_error=lambda e: is_processing.__setitem__(0, False), + ), + MyOps.print_emission(id="E", **print_emission_args), ) observable = query_observable.pipe( - MyOps.print_emission(id='A', **print_emission_args), + MyOps.print_emission(id="A", **print_emission_args), RxOps.flat_map(lambda query: process_if_free(query)), - MyOps.print_emission(id='F', **print_emission_args)) + MyOps.print_emission(id="F", **print_emission_args), + ) disposable = observable.subscribe( - on_next=lambda response: self._log_response_to_file( - response, self.output_dir), - on_error=lambda e: logger.error( - f"Error processing query for {self.dev_name}: {e}"), - on_completed=lambda: logger.info( - f"Stream processing completed for {self.dev_name}")) + on_next=lambda response: self._log_response_to_file(response, self.output_dir), + on_error=lambda e: logger.error(f"Error processing query for {self.dev_name}: {e}"), + on_completed=lambda: logger.info(f"Stream processing completed for {self.dev_name}"), + ) self.disposables.add(disposable) return disposable def get_response_observable(self) -> Observable: """Gets an observable that emits responses from this agent. - + Returns: Observable: An observable that emits string responses from the agent. """ return self.response_subject.pipe( - RxOps.observe_on(self.pool_scheduler), + RxOps.observe_on(self.pool_scheduler), RxOps.subscribe_on(self.pool_scheduler), - RxOps.share()) + RxOps.share(), + ) def run_observable_query(self, query_text: str, **kwargs) -> Observable: """Creates an observable that processes a one-off text query to Agent and emits the response. - + This method provides a simple way to send a text query and get an observable stream of the response. It's designed for one-off queries rather than continuous processing of input streams. Useful for testing and development. - + Args: query_text (str): The query text to process. **kwargs: Additional arguments to pass to _observable_query. Supported args vary by agent type. For example, ClaudeAgent supports: base64_image, dimensions, override_token_limit, reset_conversation, thinking_budget_tokens - + Returns: Observable: An observable that emits the response as a string. """ - return create(lambda observer, _: self._observable_query( - observer, incoming_query=query_text, **kwargs)) + return create( + lambda observer, _: self._observable_query( + observer, incoming_query=query_text, **kwargs + ) + ) def dispose_all(self): """Disposes of all active subscriptions managed by this agent.""" @@ -665,31 +690,32 @@ class OpenAIAgent(LLMAgent): tokenizer, and response model. """ - def __init__(self, - dev_name: str, - agent_type: str = "Vision", - query: str = "What do you see?", - input_query_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", - "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_input_tokens_per_request: int = 128000, - max_output_tokens_per_request: int = 16384, - model_name: str = "gpt-4o", - prompt_builder: Optional[PromptBuilder] = None, - tokenizer: Optional[AbstractTokenizer] = None, - rag_query_n: int = 4, - rag_similarity_threshold: float = 0.45, - skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, - response_model: Optional[BaseModel] = None, - frame_processor: Optional[FrameProcessor] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None, - openai_client: Optional[OpenAI] = None): + def __init__( + self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "gpt-4o", + prompt_builder: Optional[PromptBuilder] = None, + tokenizer: Optional[AbstractTokenizer] = None, + rag_query_n: int = 4, + rag_similarity_threshold: float = 0.45, + skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + openai_client: Optional[OpenAI] = None, + ): """ Initializes a new instance of the OpenAIAgent. @@ -727,7 +753,7 @@ def __init__(self, process_all_inputs = True else: process_all_inputs = False - + super().__init__( dev_name=dev_name, agent_type=agent_type, @@ -737,7 +763,7 @@ def __init__(self, system_query=system_query, input_query_stream=input_query_stream, input_data_stream=input_data_stream, - input_video_stream=input_video_stream + input_video_stream=input_video_stream, ) self.client = openai_client or OpenAI() self.query = query @@ -759,10 +785,10 @@ def __init__(self, self.response_model = response_model if response_model is not None else NOT_GIVEN self.model_name = model_name - self.tokenizer = tokenizer or OpenAITokenizer( - model_name=self.model_name) + self.tokenizer = tokenizer or OpenAITokenizer(model_name=self.model_name) self.prompt_builder = prompt_builder or PromptBuilder( - self.model_name, tokenizer=self.tokenizer) + self.model_name, tokenizer=self.tokenizer + ) self.rag_query_n = rag_query_n self.rag_similarity_threshold = rag_similarity_threshold self.image_detail = image_detail @@ -773,28 +799,30 @@ def __init__(self, # Add static context to memory. self._add_context_to_memory() - self.frame_processor = frame_processor or FrameProcessor( - delete_on_init=True) + self.frame_processor = frame_processor or FrameProcessor(delete_on_init=True) logger.info("OpenAI Agent Initialized.") def _add_context_to_memory(self): """Adds initial context to the agent's memory.""" context_data = [ - ("id0", - "Optical Flow is a technique used to track the movement of objects in a video sequence." - ), - ("id1", - "Edge Detection is a technique used to identify the boundaries of objects in an image." - ), - ("id2", - "Video is a sequence of frames captured at regular intervals."), - ("id3", - "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects." - ), - ("id4", - "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate." - ), + ( + "id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence.", + ), + ( + "id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image.", + ), + ("id2", "Video is a sequence of frames captured at regular intervals."), + ( + "id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", + ), + ( + "id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", + ), ] for doc_id, text in context_data: self.agent_memory.add_vector(doc_id, text) @@ -822,7 +850,11 @@ def _send_query(self, messages: list) -> Any: model=self.model_name, messages=messages, response_format=self.response_model, - tools=(self.skill_library.get_tools() if self.skill_library is not None else NOT_GIVEN), + tools=( + self.skill_library.get_tools() + if self.skill_library is not None + else NOT_GIVEN + ), max_tokens=self.max_output_tokens_per_request, ) else: @@ -830,8 +862,11 @@ def _send_query(self, messages: list) -> Any: model=self.model_name, messages=messages, max_tokens=self.max_output_tokens_per_request, - tools=(self.skill_library.get_tools() - if self.skill_library is not None else NOT_GIVEN), + tools=( + self.skill_library.get_tools() + if self.skill_library is not None + else NOT_GIVEN + ), ) response_message = response.choices[0].message if response_message is None: @@ -850,19 +885,20 @@ def _send_query(self, messages: list) -> Any: def stream_query(self, query_text: str) -> Observable: """Creates an observable that processes a text query and emits the response. - + This method provides a simple way to send a text query and get an observable stream of the response. It's designed for one-off queries rather than continuous processing of input streams. - + Args: query_text (str): The query text to process. - + Returns: Observable: An observable that emits the response as a string. """ - return create(lambda observer, _: self._observable_query( - observer, incoming_query=query_text)) + return create( + lambda observer, _: self._observable_query(observer, incoming_query=query_text) + ) -# endregion OpenAIAgent Subclass (OpenAI-Specific Implementation) \ No newline at end of file +# endregion OpenAIAgent Subclass (OpenAI-Specific Implementation) diff --git a/dimos/agents/agent_config.py b/dimos/agents/agent_config.py index de31644597..0ffbcd2983 100644 --- a/dimos/agents/agent_config.py +++ b/dimos/agents/agent_config.py @@ -15,6 +15,7 @@ from typing import List from dimos.agents.agent import Agent + class AgentConfig: def __init__(self, agents: List[Agent] = None): """ diff --git a/dimos/agents/agent_ctransformers_gguf.py b/dimos/agents/agent_ctransformers_gguf.py index 14d4649832..32d6fc59ca 100644 --- a/dimos/agents/agent_ctransformers_gguf.py +++ b/dimos/agents/agent_ctransformers_gguf.py @@ -15,7 +15,6 @@ from __future__ import annotations # Standard library imports -import json import logging import os from typing import Any, Optional @@ -26,14 +25,11 @@ from reactivex.scheduler import ThreadPoolScheduler from reactivex.subject import Subject import torch -from transformers import AutoModelForCausalLM, AutoTokenizer # Local imports from dimos.agents.agent import LLMAgent from dimos.agents.memory.base import AbstractAgentSemanticMemory from dimos.agents.prompt_builder.impl import PromptBuilder -from dimos.agents.tokenizer.base import AbstractTokenizer -from dimos.agents.tokenizer.huggingface_tokenizer import HuggingFaceTokenizer from dimos.utils.logging_config import setup_logger # Initialize environment variables @@ -44,6 +40,7 @@ from ctransformers import AutoModelForCausalLM as CTransformersModel + class CTransformersTokenizerAdapter: def __init__(self, model): self.model = model @@ -84,26 +81,27 @@ def apply_chat_template(self, conversation, tokenize=False, add_generation_promp # CTransformers Agent Class class CTransformersGGUFAgent(LLMAgent): - def __init__(self, - dev_name: str, - agent_type: str = "HF-LLM", - model_name: str = "TheBloke/Llama-2-7B-GGUF", - model_file: str = "llama-2-7b.Q4_K_M.gguf", - model_type: str = "llama", - gpu_layers: int = 50, - device: str = "auto", - query: str = "How many r's are in the word 'strawberry'?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = "You are a helpful assistant.", - max_output_tokens_per_request: int = 10, - max_input_tokens_per_request: int = 250, - prompt_builder: Optional[PromptBuilder] = None, - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None,): - + def __init__( + self, + dev_name: str, + agent_type: str = "HF-LLM", + model_name: str = "TheBloke/Llama-2-7B-GGUF", + model_file: str = "llama-2-7b.Q4_K_M.gguf", + model_type: str = "llama", + gpu_layers: int = 50, + device: str = "auto", + query: str = "How many r's are in the word 'strawberry'?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = "You are a helpful assistant.", + max_output_tokens_per_request: int = 10, + max_input_tokens_per_request: int = 250, + prompt_builder: Optional[PromptBuilder] = None, + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + ): # Determine appropriate default for process_all_inputs if not provided if process_all_inputs is None: # Default to True for text queries, False for video streams @@ -120,7 +118,7 @@ def __init__(self, process_all_inputs=process_all_inputs, system_query=system_query, max_output_tokens_per_request=max_output_tokens_per_request, - max_input_tokens_per_request=max_input_tokens_per_request + max_input_tokens_per_request=max_input_tokens_per_request, ) self.query = query @@ -138,17 +136,13 @@ def __init__(self, print(f"Device: {self.device}") self.model = CTransformersModel.from_pretrained( - model_name, - model_file=model_file, - model_type=model_type, - gpu_layers=gpu_layers + model_name, model_file=model_file, model_type=model_type, gpu_layers=gpu_layers ) self.tokenizer = CTransformersTokenizerAdapter(self.model) self.prompt_builder = prompt_builder or PromptBuilder( - self.model_name, - tokenizer=self.tokenizer + self.model_name, tokenizer=self.tokenizer ) self.max_output_tokens_per_request = max_output_tokens_per_request @@ -166,13 +160,10 @@ def __init__(self, if self.input_video_stream is not None: logger.info("Subscribing to input video stream...") - self.disposables.add( - self.subscribe_to_image_processing(self.input_video_stream)) + self.disposables.add(self.subscribe_to_image_processing(self.input_video_stream)) if self.input_query_stream is not None: logger.info("Subscribing to input query stream...") - self.disposables.add( - self.subscribe_to_query_processing(self.input_query_stream)) - + self.disposables.add(self.subscribe_to_query_processing(self.input_query_stream)) def _send_query(self, messages: list) -> Any: try: @@ -194,9 +185,7 @@ def _send_query(self, messages: list) -> Any: print("Applying chat template...") prompt_text = self.tokenizer.apply_chat_template( - conversation=flat_messages, - tokenize=False, - add_generation_prompt=True + conversation=flat_messages, tokenize=False, add_generation_prompt=True ) print("Chat template applied.") print(f"Prompt text:\n{prompt_text}") @@ -213,7 +202,9 @@ def stream_query(self, query_text: str) -> Subject: """ Creates an observable that processes a text query and emits the response. """ - return create(lambda observer, _: self._observable_query( - observer, incoming_query=query_text)) + return create( + lambda observer, _: self._observable_query(observer, incoming_query=query_text) + ) + # endregion HuggingFaceLLMAgent Subclass (HuggingFace-Specific Implementation) diff --git a/dimos/agents/agent_huggingface_local.py b/dimos/agents/agent_huggingface_local.py index d209f8d88f..14f970c3bc 100644 --- a/dimos/agents/agent_huggingface_local.py +++ b/dimos/agents/agent_huggingface_local.py @@ -15,7 +15,6 @@ from __future__ import annotations # Standard library imports -import json import logging import os from typing import Any, Optional @@ -26,7 +25,7 @@ from reactivex.scheduler import ThreadPoolScheduler from reactivex.subject import Subject import torch -from transformers import AutoModelForCausalLM, AutoTokenizer +from transformers import AutoModelForCausalLM # Local imports from dimos.agents.agent import LLMAgent @@ -43,28 +42,29 @@ # Initialize logger for the agent module logger = setup_logger("dimos.agents", level=logging.DEBUG) + # HuggingFaceLLMAgent Class class HuggingFaceLocalAgent(LLMAgent): - def __init__(self, - dev_name: str, - agent_type: str = "HF-LLM", - model_name: str = "Qwen/Qwen2.5-3B", - device: str = "auto", - query: str = "How many r's are in the word 'strawberry'?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", - "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_output_tokens_per_request: int = None, - max_input_tokens_per_request: int = None, - prompt_builder: Optional[PromptBuilder] = None, - tokenizer: Optional[AbstractTokenizer] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None,): - + def __init__( + self, + dev_name: str, + agent_type: str = "HF-LLM", + model_name: str = "Qwen/Qwen2.5-3B", + device: str = "auto", + query: str = "How many r's are in the word 'strawberry'?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_output_tokens_per_request: int = None, + max_input_tokens_per_request: int = None, + prompt_builder: Optional[PromptBuilder] = None, + tokenizer: Optional[AbstractTokenizer] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + ): # Determine appropriate default for process_all_inputs if not provided if process_all_inputs is None: # Default to True for text queries, False for video streams @@ -79,7 +79,7 @@ def __init__(self, agent_memory=agent_memory or LocalSemanticMemory(), pool_scheduler=pool_scheduler, process_all_inputs=process_all_inputs, - system_query=system_query + system_query=system_query, ) self.query = query @@ -99,14 +99,13 @@ def __init__(self, self.tokenizer = tokenizer or HuggingFaceTokenizer(self.model_name) self.prompt_builder = prompt_builder or PromptBuilder( - self.model_name, - tokenizer=self.tokenizer + self.model_name, tokenizer=self.tokenizer ) self.model = AutoModelForCausalLM.from_pretrained( model_name, torch_dtype=torch.float16 if self.device == "cuda" else torch.float32, - device_map=self.device + device_map=self.device, ) self.max_output_tokens_per_request = max_output_tokens_per_request @@ -124,105 +123,113 @@ def __init__(self, if self.input_video_stream is not None: logger.info("Subscribing to input video stream...") - self.disposables.add( - self.subscribe_to_image_processing(self.input_video_stream)) + self.disposables.add(self.subscribe_to_image_processing(self.input_video_stream)) if self.input_query_stream is not None: logger.info("Subscribing to input query stream...") - self.disposables.add( - self.subscribe_to_query_processing(self.input_query_stream)) - + self.disposables.add(self.subscribe_to_query_processing(self.input_query_stream)) def _send_query(self, messages: list) -> Any: _BLUE_PRINT_COLOR: str = "\033[34m" _RESET_COLOR: str = "\033[0m" - + try: # Log the incoming messages print(f"{_BLUE_PRINT_COLOR}Messages: {str(messages)}{_RESET_COLOR}") - + # Process with chat template try: print("Applying chat template...") prompt_text = self.tokenizer.tokenizer.apply_chat_template( conversation=[{"role": "user", "content": str(messages)}], tokenize=False, - add_generation_prompt=True + add_generation_prompt=True, ) print("Chat template applied.") - + # Tokenize the prompt print("Preparing model inputs...") - model_inputs = self.tokenizer.tokenizer([prompt_text], return_tensors="pt").to(self.model.device) + model_inputs = self.tokenizer.tokenizer([prompt_text], return_tensors="pt").to( + self.model.device + ) print("Model inputs prepared.") - + # Generate the response print("Generating response...") generated_ids = self.model.generate( - **model_inputs, - max_new_tokens=self.max_output_tokens_per_request + **model_inputs, max_new_tokens=self.max_output_tokens_per_request ) - + # Extract the generated tokens (excluding the input prompt tokens) print("Processing generated output...") generated_ids = [ - output_ids[len(input_ids):] + output_ids[len(input_ids) :] for input_ids, output_ids in zip(model_inputs.input_ids, generated_ids) ] - + # Convert tokens back to text - response = self.tokenizer.tokenizer.batch_decode(generated_ids, skip_special_tokens=True)[0] + response = self.tokenizer.tokenizer.batch_decode( + generated_ids, skip_special_tokens=True + )[0] print("Response successfully generated.") - + return response - + except AttributeError as e: # Handle case where tokenizer doesn't have the expected methods logger.warning(f"Chat template not available: {e}. Using simple format.") # Continue with execution and use simple format - + except Exception as e: # Log any other errors but continue execution - logger.warning(f"Error in chat template processing: {e}. Falling back to simple format.") - + logger.warning( + f"Error in chat template processing: {e}. Falling back to simple format." + ) + # Fallback approach for models without chat template support # This code runs if the try block above raises an exception print("Using simple prompt format...") - + # Convert messages to a simple text format - if isinstance(messages, list) and messages and isinstance(messages[0], dict) and "content" in messages[0]: + if ( + isinstance(messages, list) + and messages + and isinstance(messages[0], dict) + and "content" in messages[0] + ): prompt_text = messages[0]["content"] else: prompt_text = str(messages) - + # Tokenize the prompt model_inputs = self.tokenizer.tokenize_text(prompt_text) model_inputs = torch.tensor([model_inputs], device=self.model.device) - + # Generate the response generated_ids = self.model.generate( - input_ids=model_inputs, - max_new_tokens=self.max_output_tokens_per_request + input_ids=model_inputs, max_new_tokens=self.max_output_tokens_per_request ) - + # Extract the generated tokens - generated_ids = generated_ids[0][len(model_inputs[0]):] - + generated_ids = generated_ids[0][len(model_inputs[0]) :] + # Convert tokens back to text response = self.tokenizer.detokenize_text(generated_ids.tolist()) print("Response generated using simple format.") - + return response - + except Exception as e: # Catch all other errors logger.error(f"Error during query processing: {e}", exc_info=True) - return f"Error processing request. Please try again." + return "Error processing request. Please try again." def stream_query(self, query_text: str) -> Subject: """ Creates an observable that processes a text query and emits the response. """ - return create(lambda observer, _: self._observable_query( - observer, incoming_query=query_text)) + return create( + lambda observer, _: self._observable_query(observer, incoming_query=query_text) + ) + # endregion HuggingFaceLLMAgent Subclass (HuggingFace-Specific Implementation) diff --git a/dimos/agents/agent_huggingface_remote.py b/dimos/agents/agent_huggingface_remote.py index d974259815..d98b277706 100644 --- a/dimos/agents/agent_huggingface_remote.py +++ b/dimos/agents/agent_huggingface_remote.py @@ -40,29 +40,30 @@ # Initialize logger for the agent module logger = setup_logger("dimos.agents", level=logging.DEBUG) + # HuggingFaceLLMAgent Class class HuggingFaceRemoteAgent(LLMAgent): - def __init__(self, - dev_name: str, - agent_type: str = "HF-LLM", - model_name: str = "Qwen/QwQ-32B", - query: str = "How many r's are in the word 'strawberry'?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", - "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_output_tokens_per_request: int = 16384, - prompt_builder: Optional[PromptBuilder] = None, - tokenizer: Optional[AbstractTokenizer] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None, - api_key: Optional[str] = None, - hf_provider: Optional[str] = None, - hf_base_url: Optional[str] = None): - + def __init__( + self, + dev_name: str, + agent_type: str = "HF-LLM", + model_name: str = "Qwen/QwQ-32B", + query: str = "How many r's are in the word 'strawberry'?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_output_tokens_per_request: int = 16384, + prompt_builder: Optional[PromptBuilder] = None, + tokenizer: Optional[AbstractTokenizer] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + api_key: Optional[str] = None, + hf_provider: Optional[str] = None, + hf_base_url: Optional[str] = None, + ): # Determine appropriate default for process_all_inputs if not provided if process_all_inputs is None: # Default to True for text queries, False for video streams @@ -77,7 +78,7 @@ def __init__(self, agent_memory=agent_memory, pool_scheduler=pool_scheduler, process_all_inputs=process_all_inputs, - system_query=system_query + system_query=system_query, ) self.query = query @@ -86,17 +87,16 @@ def __init__(self, self.model_name = model_name self.prompt_builder = prompt_builder or PromptBuilder( - self.model_name, - tokenizer=tokenizer or HuggingFaceTokenizer(self.model_name) + self.model_name, tokenizer=tokenizer or HuggingFaceTokenizer(self.model_name) ) self.model_name = model_name self.max_output_tokens_per_request = max_output_tokens_per_request - self.api_key = api_key or os.getenv('HF_TOKEN') + self.api_key = api_key or os.getenv("HF_TOKEN") self.provider = hf_provider or "hf-inference" - self.base_url = hf_base_url or os.getenv('HUGGINGFACE_PRV_ENDPOINT') + self.base_url = hf_base_url or os.getenv("HUGGINGFACE_PRV_ENDPOINT") self.client = InferenceClient( provider=self.provider, base_url=self.base_url, @@ -116,13 +116,10 @@ def __init__(self, if self.input_video_stream is not None: logger.info("Subscribing to input video stream...") - self.disposables.add( - self.subscribe_to_image_processing(self.input_video_stream)) + self.disposables.add(self.subscribe_to_image_processing(self.input_video_stream)) if self.input_query_stream is not None: logger.info("Subscribing to input query stream...") - self.disposables.add( - self.subscribe_to_query_processing(self.input_query_stream)) - + self.disposables.add(self.subscribe_to_query_processing(self.input_query_stream)) def _send_query(self, messages: list) -> Any: try: @@ -132,7 +129,7 @@ def _send_query(self, messages: list) -> Any: max_tokens=self.max_output_tokens_per_request, ) - return (completion.choices[0].message) + return completion.choices[0].message except Exception as e: logger.error(f"Error during HuggingFace query: {e}") return "Error processing request." @@ -141,5 +138,6 @@ def stream_query(self, query_text: str) -> Subject: """ Creates an observable that processes a text query and emits the response. """ - return create(lambda observer, _: self._observable_query( - observer, incoming_query=query_text)) + return create( + lambda observer, _: self._observable_query(observer, incoming_query=query_text) + ) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 08a3920a26..2c32453ed6 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -51,30 +51,32 @@ class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. - + This class implements the _send_query method to interact with Cerebras API using their official SDK, allowing most of the LLMAgent logic to be reused. """ - def __init__(self, - dev_name: str, - agent_type: str = "Vision", - query: str = "What do you see?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_input_tokens_per_request: int = 128000, - max_output_tokens_per_request: int = 16384, - model_name: str = "llama-4-scout-17b-16e-instruct", - skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, - response_model: Optional[BaseModel] = None, - frame_processor: Optional[FrameProcessor] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None): + def __init__( + self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "llama-4-scout-17b-16e-instruct", + skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + ): """ Initializes a new instance of the CerebrasAgent. @@ -110,7 +112,7 @@ def __init__(self, process_all_inputs = True else: process_all_inputs = False - + super().__init__( dev_name=dev_name, agent_type=agent_type, @@ -120,12 +122,12 @@ def __init__(self, system_query=system_query, input_query_stream=input_query_stream, input_video_stream=input_video_stream, - input_data_stream=input_data_stream + input_data_stream=input_data_stream, ) - + # Initialize Cerebras client self.client = Cerebras() - + self.query = query self.output_dir = output_dir os.makedirs(self.output_dir, exist_ok=True) @@ -146,7 +148,7 @@ def __init__(self, elif isinstance(self.skills, AbstractSkill): self.skill_library = SkillLibrary() self.skill_library.add(self.skills) - + self.response_model = response_model self.model_name = model_name self.image_detail = image_detail @@ -161,28 +163,35 @@ def __init__(self, def _add_context_to_memory(self): """Adds initial context to the agent's memory.""" context_data = [ - ("id0", - "Optical Flow is a technique used to track the movement of objects in a video sequence." - ), - ("id1", - "Edge Detection is a technique used to identify the boundaries of objects in an image." - ), - ("id2", - "Video is a sequence of frames captured at regular intervals."), - ("id3", - "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects." - ), - ("id4", - "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate." - ), + ( + "id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence.", + ), + ( + "id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image.", + ), + ("id2", "Video is a sequence of frames captured at regular intervals."), + ( + "id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", + ), + ( + "id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", + ), ] for doc_id, text in context_data: self.agent_memory.add_vector(doc_id, text) - def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[str]]] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - condensed_results: str = "") -> list: + def _build_prompt( + self, + messages: list, + base64_image: Optional[Union[str, List[str]]] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + condensed_results: str = "", + ) -> list: """Builds a prompt message specifically for Cerebras API. Args: @@ -195,44 +204,41 @@ def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[s Returns: list: Messages formatted for Cerebras API. """ - + # Add system message if provided and not already in history if self.system_query and (not messages or messages[0].get("role") != "system"): messages.insert(0, {"role": "system", "content": self.system_query}) logger.info("Added system message to conversation") - + # Append user query while handling RAG if condensed_results: user_message = {"role": "user", "content": f"{condensed_results}\n\n{self.query}"} logger.info("Created user message with RAG context") - else: + else: user_message = {"role": "user", "content": self.query} - + messages.append(user_message) - + if base64_image is not None: # Handle both single image (str) and multiple images (List[str]) images = [base64_image] if isinstance(base64_image, str) else base64_image - + # For Cerebras, we'll add images inline with text (OpenAI-style format) for img in images: img_content = [ - { - "type": "text", - "text": "Here is an image to analyze:" - }, + {"type": "text", "text": "Here is an image to analyze:"}, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{img}", - "detail": self.image_detail - } - } + "detail": self.image_detail, + }, + }, ] messages.append({"role": "user", "content": img_content}) - + logger.info(f"Added {len(images)} image(s) to conversation") - + return messages def _send_query(self, messages: list) -> Any: @@ -256,7 +262,7 @@ def _send_query(self, messages: list) -> Any: "messages": messages, "max_tokens": self.max_output_tokens_per_request, } - + # Add tools if available if self.skill_library and self.skill_library.get_tools(): tools = self.skill_library.get_tools() @@ -265,14 +271,14 @@ def _send_query(self, messages: list) -> Any: # Make the API call response = self.client.chat.completions.create(**api_params) - + response_message = response.choices[0].message if response_message is None: logger.error("Response message does not exist.") raise Exception("Response message does not exist.") - + return response_message - + except ConnectionError as ce: logger.error(f"Connection error with Cerebras API: {ce}") raise @@ -283,17 +289,19 @@ def _send_query(self, messages: list) -> Any: logger.error(f"Unexpected error in Cerebras API call: {e}") raise - def _observable_query(self, - observer: Observer, - base64_image: Optional[str] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - incoming_query: Optional[str] = None, - reset_conversation: bool = False): + def _observable_query( + self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + reset_conversation: bool = False, + ): """Main query handler that manages conversation history and Cerebras interactions. - + This method follows ClaudeAgent's pattern for efficient conversation history management. - + Args: observer (Observer): The observer to emit responses to. base64_image (str): Optional Base64-encoded image. @@ -317,13 +325,15 @@ def _observable_query(self, _, condensed_results = self._get_rag_context() # Build prompt - messages = self._build_prompt(messages, base64_image, dimensions, override_token_limit, condensed_results) - + messages = self._build_prompt( + messages, base64_image, dimensions, override_token_limit, condensed_results + ) + # Send query and get response logger.info("Sending Query.") response_message = self._send_query(messages) logger.info(f"Received Response: {response_message}") - + if response_message is None: logger.error("Received None response from Cerebras API") observer.on_next("") @@ -332,44 +342,50 @@ def _observable_query(self, # Add assistant response to local messages (always) assistant_message = {"role": "assistant"} - + if response_message.content: assistant_message["content"] = response_message.content else: assistant_message["content"] = "" # Ensure content is never None - - if hasattr(response_message, 'tool_calls') and response_message.tool_calls: + + if hasattr(response_message, "tool_calls") and response_message.tool_calls: assistant_message["tool_calls"] = [] for tool_call in response_message.tool_calls: - assistant_message["tool_calls"].append({ - "id": tool_call.id, - "type": "function", - "function": { - "name": tool_call.function.name, - "arguments": tool_call.function.arguments + assistant_message["tool_calls"].append( + { + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments, + }, } - }) - logger.info(f"Assistant response includes {len(response_message.tool_calls)} tool call(s)") - + ) + logger.info( + f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" + ) + messages.append(assistant_message) # Handle tool calls if present (add tool messages to conversation) self._handle_tooling(response_message, messages) # At the end, append only new messages to the global conversation history under a lock - if not hasattr(self, '_history_lock'): + if not hasattr(self, "_history_lock"): self._history_lock = threading.Lock() with self._history_lock: for msg in messages[base_len:]: self.conversation_history.append(msg) - logger.info(f"Updated conversation history (total: {len(self.conversation_history)} messages)") + logger.info( + f"Updated conversation history (total: {len(self.conversation_history)} messages)" + ) # Send response to observers result = response_message.content or "" observer.on_next(result) self.response_subject.on_next(result) observer.on_completed() - + except Exception as e: logger.error(f"Query failed in {self.dev_name}: {e}") observer.on_error(e) @@ -377,26 +393,30 @@ def _observable_query(self, def _handle_tooling(self, response_message, messages): """Executes tools and appends tool-use/result blocks to messages.""" - if not hasattr(response_message, 'tool_calls') or not response_message.tool_calls: + if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: logger.info("No tool calls found in response message") return None - + if len(response_message.tool_calls) > 1: - logger.warning("Multiple tool calls detected in response message. Not a tested feature.") + logger.warning( + "Multiple tool calls detected in response message. Not a tested feature." + ) # Execute all tools and add their results to messages for tool_call in response_message.tool_calls: logger.info(f"Processing tool call: {tool_call.function.name}") - + # Execute the tool args = json.loads(tool_call.function.arguments) tool_result = self.skill_library.call(tool_call.function.name, **args) logger.info(f"Function Call Results: {tool_result}") - + # Add tool result to conversation history (OpenAI format) - messages.append({ - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(tool_result), - "name": tool_call.function.name - }) \ No newline at end of file + messages.append( + { + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(tool_result), + "name": tool_call.function.name, + } + ) diff --git a/dimos/agents/claude_agent.py b/dimos/agents/claude_agent.py index a2f7d5556b..53148d17b3 100644 --- a/dimos/agents/claude_agent.py +++ b/dimos/agents/claude_agent.py @@ -23,18 +23,13 @@ import json import os -from typing import Any, Dict, List, Optional, Tuple, Union, cast -import logging +from typing import Any, Dict, List, Optional, Tuple, Union import anthropic -from anthropic.types import ContentBlock, MessageParam, ToolUseBlock from dotenv import load_dotenv -from httpx._transports import base from pydantic import BaseModel from reactivex import Observable -from reactivex.disposable import Disposable from reactivex.scheduler import ThreadPoolScheduler -from reactivex import create # Local imports from dimos.agents.agent import LLMAgent @@ -43,7 +38,6 @@ from dimos.skills.skills import AbstractSkill, SkillLibrary from dimos.stream.frame_processor import FrameProcessor from dimos.utils.logging_config import setup_logger -from dimos.utils.threadpool import get_scheduler # Initialize environment variables load_dotenv() @@ -51,6 +45,7 @@ # Initialize logger for the Claude agent logger = setup_logger("dimos.agents.claude") + # Response object compatible with LLMAgent class ResponseMessage: def __init__(self, content="", tool_calls=None, thinking_blocks=None): @@ -58,22 +53,23 @@ def __init__(self, content="", tool_calls=None, thinking_blocks=None): self.tool_calls = tool_calls or [] self.thinking_blocks = thinking_blocks or [] self.parsed = None - + def __str__(self): # Return a string representation for logging parts = [] - + # Include content if available if self.content: parts.append(self.content) - + # Include tool calls if available if self.tool_calls: tool_names = [tc.function.name for tc in self.tool_calls] parts.append(f"[Tools called: {', '.join(tool_names)}]") - + return "\n".join(parts) if parts else "[No content]" + class ClaudeAgent(LLMAgent): """Claude agent implementation that uses Anthropic's API for processing. @@ -81,29 +77,31 @@ class ClaudeAgent(LLMAgent): and overrides _build_prompt to create Claude-formatted messages directly. """ - def __init__(self, - dev_name: str, - agent_type: str = "Vision", - query: str = "What do you see?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_input_tokens_per_request: int = 128000, - max_output_tokens_per_request: int = 16384, - model_name: str = "claude-3-7-sonnet-20250219", - prompt_builder: Optional[PromptBuilder] = None, - rag_query_n: int = 4, - rag_similarity_threshold: float = 0.45, - skills: Optional[AbstractSkill] = None, - response_model: Optional[BaseModel] = None, - frame_processor: Optional[FrameProcessor] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None, - thinking_budget_tokens: Optional[int] = 2000): + def __init__( + self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "claude-3-7-sonnet-20250219", + prompt_builder: Optional[PromptBuilder] = None, + rag_query_n: int = 4, + rag_similarity_threshold: float = 0.45, + skills: Optional[AbstractSkill] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + thinking_budget_tokens: Optional[int] = 2000, + ): """ Initializes a new instance of the ClaudeAgent. @@ -137,7 +135,7 @@ def __init__(self, process_all_inputs = True else: process_all_inputs = False - + super().__init__( dev_name=dev_name, agent_type=agent_type, @@ -147,9 +145,9 @@ def __init__(self, system_query=system_query, input_query_stream=input_query_stream, input_video_stream=input_video_stream, - input_data_stream=input_data_stream + input_data_stream=input_data_stream, ) - + self.client = anthropic.Anthropic() self.query = query self.output_dir = output_dir @@ -158,10 +156,10 @@ def __init__(self, # Claude-specific parameters self.thinking_budget_tokens = thinking_budget_tokens self.claude_api_params = {} # Will store params for Claude API calls - + # Configure skills self.skills = skills - self.skill_library = None # Required for error 'ClaudeAgent' object has no attribute 'skill_library' due to skills refactor + self.skill_library = None # Required for error 'ClaudeAgent' object has no attribute 'skill_library' due to skills refactor if isinstance(self.skills, SkillLibrary): self.skill_library = self.skills elif isinstance(self.skills, list): @@ -171,7 +169,7 @@ def __init__(self, elif isinstance(self.skills, AbstractSkill): self.skill_library = SkillLibrary() self.skill_library.add(self.skills) - + self.response_model = response_model self.model_name = model_name self.rag_query_n = rag_query_n @@ -186,7 +184,6 @@ def __init__(self, self.frame_processor = frame_processor or FrameProcessor(delete_on_init=True) - # Ensure only one input stream is provided. if self.input_video_stream is not None and self.input_query_stream is not None: raise ValueError( @@ -198,20 +195,23 @@ def __init__(self, def _add_context_to_memory(self): """Adds initial context to the agent's memory.""" context_data = [ - ("id0", - "Optical Flow is a technique used to track the movement of objects in a video sequence." - ), - ("id1", - "Edge Detection is a technique used to identify the boundaries of objects in an image." - ), - ("id2", - "Video is a sequence of frames captured at regular intervals."), - ("id3", - "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects." - ), - ("id4", - "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate." - ), + ( + "id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence.", + ), + ( + "id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image.", + ), + ("id2", "Video is a sequence of frames captured at regular intervals."), + ( + "id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", + ), + ( + "id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", + ), ] for doc_id, text in context_data: self.agent_memory.add_vector(doc_id, text) @@ -219,47 +219,51 @@ def _add_context_to_memory(self): def _convert_tools_to_claude_format(self, tools: List[Dict[str, Any]]) -> List[Dict[str, Any]]: """ Converts DIMOS tools to Claude format. - + Args: tools: List of tools in DIMOS format. - + Returns: List of tools in Claude format. """ if not tools: return [] - + claude_tools = [] - + for tool in tools: # Skip if not a function - if tool.get('type') != 'function': + if tool.get("type") != "function": continue - - function = tool.get('function', {}) - name = function.get('name') - description = function.get('description', '') - parameters = function.get('parameters', {}) - + + function = tool.get("function", {}) + name = function.get("name") + description = function.get("description", "") + parameters = function.get("parameters", {}) + claude_tool = { "name": name, "description": description, "input_schema": { "type": "object", - "properties": parameters.get('properties', {}), - "required": parameters.get('required', []), - } + "properties": parameters.get("properties", {}), + "required": parameters.get("required", []), + }, } - + claude_tools.append(claude_tool) - + return claude_tools - def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[str]]] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - rag_results: str = "", - thinking_budget_tokens: int = None) -> list: + def _build_prompt( + self, + messages: list, + base64_image: Optional[Union[str, List[str]]] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + rag_results: str = "", + thinking_budget_tokens: int = None, + ) -> list: """Builds a prompt message specifically for Claude API, using local messages copy.""" """Builds a prompt message specifically for Claude API. @@ -276,216 +280,247 @@ def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[s Returns: dict: A dict containing Claude API parameters. """ - + # Append user query to conversation history while handling RAG if rag_results: messages.append({"role": "user", "content": f"{rag_results}\n\n{self.query}"}) - logger.info(f"Added new user message to conversation history with RAG context (now has {len(messages)} messages)") - else: + logger.info( + f"Added new user message to conversation history with RAG context (now has {len(messages)} messages)" + ) + else: messages.append({"role": "user", "content": self.query}) - logger.info(f"Added new user message to conversation history (now has {len(messages)} messages)") - + logger.info( + f"Added new user message to conversation history (now has {len(messages)} messages)" + ) + if base64_image is not None: # Handle both single image (str) and multiple images (List[str]) images = [base64_image] if isinstance(base64_image, str) else base64_image - + # Add each image as a separate entry in conversation history for img in images: img_content = [ { "type": "image", - "source": { - "type": "base64", - "media_type": "image/jpeg", - "data": img - } + "source": {"type": "base64", "media_type": "image/jpeg", "data": img}, } ] messages.append({"role": "user", "content": img_content}) - + if images: - logger.info(f"Added {len(images)} image(s) as separate entries to conversation history") - + logger.info( + f"Added {len(images)} image(s) as separate entries to conversation history" + ) + # Create Claude parameters with basic settings claude_params = { "model": self.model_name, "max_tokens": self.max_output_tokens_per_request, "temperature": 0, # Add temperature to make responses more deterministic - "messages": messages + "messages": messages, } - + # Add system prompt as a top-level parameter (not as a message) if self.system_query: - claude_params['system'] = self.system_query - + claude_params["system"] = self.system_query + # Store the parameters for use in _send_query self.claude_api_params = claude_params.copy() - + # Add tools if skills are available if self.skills and self.skills.get_tools(): tools = self._convert_tools_to_claude_format(self.skills.get_tools()) if tools: # Only add if we have valid tools claude_params["tools"] = tools # Enable tool calling with proper format - claude_params["tool_choice"] = { - "type": "auto" - } - + claude_params["tool_choice"] = {"type": "auto"} + # Add thinking if enabled and hard code required temperature = 1 if thinking_budget_tokens is not None and thinking_budget_tokens != 0: - claude_params["thinking"] = { - "type": "enabled", - "budget_tokens": thinking_budget_tokens - } - claude_params["temperature"] = 1 # Required to be 1 when thinking is enabled # Default to 0 for deterministic responses - + claude_params["thinking"] = {"type": "enabled", "budget_tokens": thinking_budget_tokens} + claude_params["temperature"] = ( + 1 # Required to be 1 when thinking is enabled # Default to 0 for deterministic responses + ) + # Store the parameters for use in _send_query and return them self.claude_api_params = claude_params.copy() return messages, claude_params - + def _send_query(self, messages: list, claude_params: dict) -> Any: """Sends the query to Anthropic's API using streaming for better thinking visualization. - + Args: messages: Dict with 'claude_prompt' key containing Claude API parameters. - + Returns: The response message in a format compatible with LLMAgent's expectations. """ try: # Get Claude parameters - claude_params = (claude_params.get('claude_prompt', None) or self.claude_api_params) - + claude_params = claude_params.get("claude_prompt", None) or self.claude_api_params + # Log request parameters with truncated base64 data logger.debug(self._debug_api_call(claude_params)) - + # Initialize response containers text_content = "" tool_calls = [] thinking_blocks = [] - + # Log the start of streaming and the query - logger.info(f"Sending streaming request to Claude API") - + logger.info("Sending streaming request to Claude API") + # Log the query to memory.txt with open(os.path.join(self.output_dir, "memory.txt"), "a") as f: f.write(f"\n\nQUERY: {self.query}\n\n") f.flush() - + # Stream the response with self.client.messages.stream(**claude_params) as stream: print("\n==== CLAUDE API RESPONSE STREAM STARTED ====") - + # Open the memory file once for the entire stream processing with open(os.path.join(self.output_dir, "memory.txt"), "a") as memory_file: # Track the current block being processed - current_block = {'type': None, 'id': None, 'content': "", 'signature': None} - + current_block = {"type": None, "id": None, "content": "", "signature": None} + for event in stream: # Log each event to console - # print(f"EVENT: {event.type}") + # print(f"EVENT: {event.type}") # print(json.dumps(event.model_dump(), indent=2, default=str)) - + if event.type == "content_block_start": # Initialize a new content block block_type = event.content_block.type - current_block = {'type': block_type, 'id': event.index, 'content': "", 'signature': None} + current_block = { + "type": block_type, + "id": event.index, + "content": "", + "signature": None, + } logger.debug(f"Starting {block_type} block...") - + elif event.type == "content_block_delta": if event.delta.type == "thinking_delta": # Accumulate thinking content - current_block['content'] = event.delta.thinking + current_block["content"] = event.delta.thinking memory_file.write(f"{event.delta.thinking}") memory_file.flush() # Ensure content is written immediately - + elif event.delta.type == "text_delta": # Accumulate text content text_content += event.delta.text - current_block['content'] += event.delta.text + current_block["content"] += event.delta.text memory_file.write(f"{event.delta.text}") memory_file.flush() - + elif event.delta.type == "signature_delta": # Store signature for thinking blocks - current_block['signature'] = event.delta.signature - memory_file.write(f"\n[Signature received for block {current_block['id']}]\n") + current_block["signature"] = event.delta.signature + memory_file.write( + f"\n[Signature received for block {current_block['id']}]\n" + ) memory_file.flush() - + elif event.type == "content_block_stop": # Store completed blocks - if current_block['type'] == "thinking": + if current_block["type"] == "thinking": # IMPORTANT: Store the complete event.content_block to ensure we preserve # the exact format that Claude expects in subsequent requests - if hasattr(event, 'content_block'): + if hasattr(event, "content_block"): # Use the exact thinking block as provided by Claude thinking_blocks.append(event.content_block.model_dump()) - memory_file.write(f"\nTHINKING COMPLETE: block {current_block['id']}\n") + memory_file.write( + f"\nTHINKING COMPLETE: block {current_block['id']}\n" + ) else: # Fallback to constructed thinking block if content_block missing thinking_block = { "type": "thinking", - "thinking": current_block['content'], - "signature": current_block['signature'] + "thinking": current_block["content"], + "signature": current_block["signature"], } thinking_blocks.append(thinking_block) - memory_file.write(f"\nTHINKING COMPLETE: block {current_block['id']}\n") - - elif current_block['type'] == "redacted_thinking": + memory_file.write( + f"\nTHINKING COMPLETE: block {current_block['id']}\n" + ) + + elif current_block["type"] == "redacted_thinking": # Handle redacted thinking blocks - if hasattr(event, 'content_block') and hasattr(event.content_block, 'data'): + if hasattr(event, "content_block") and hasattr( + event.content_block, "data" + ): redacted_block = { "type": "redacted_thinking", - "data": event.content_block.data + "data": event.content_block.data, } thinking_blocks.append(redacted_block) - - elif current_block['type'] == "tool_use": + + elif current_block["type"] == "tool_use": # Process tool use blocks when they're complete - if hasattr(event, 'content_block'): + if hasattr(event, "content_block"): tool_block = event.content_block tool_id = tool_block.id tool_name = tool_block.name tool_input = tool_block.input - + # Create a tool call object for LLMAgent compatibility - tool_call_obj = type('ToolCall', (), { - 'id': tool_id, - 'function': type('Function', (), { - 'name': tool_name, - 'arguments': json.dumps(tool_input) - }) - }) + tool_call_obj = type( + "ToolCall", + (), + { + "id": tool_id, + "function": type( + "Function", + (), + { + "name": tool_name, + "arguments": json.dumps(tool_input), + }, + ), + }, + ) tool_calls.append(tool_call_obj) - + # Write tool call information to memory.txt memory_file.write(f"\n\nTOOL CALL: {tool_name}\n") - memory_file.write(f"ARGUMENTS: {json.dumps(tool_input, indent=2)}\n") - + memory_file.write( + f"ARGUMENTS: {json.dumps(tool_input, indent=2)}\n" + ) + # Reset current block - current_block = {'type': None, 'id': None, 'content': "", 'signature': None} + current_block = { + "type": None, + "id": None, + "content": "", + "signature": None, + } memory_file.flush() - - elif event.type == "message_delta" and event.delta.stop_reason == "tool_use": + + elif ( + event.type == "message_delta" and event.delta.stop_reason == "tool_use" + ): # When a tool use is detected - logger.info(f"Tool use stop reason detected in stream") + logger.info("Tool use stop reason detected in stream") # Mark the end of the response in memory.txt - memory_file.write(f"\n\nRESPONSE COMPLETE\n\n") + memory_file.write("\n\nRESPONSE COMPLETE\n\n") memory_file.flush() - + print("\n==== CLAUDE API RESPONSE STREAM COMPLETED ====") - + # Final response - logger.info(f"Claude streaming complete. Text: {len(text_content)} chars, Tool calls: {len(tool_calls)}, Thinking blocks: {len(thinking_blocks)}") - + logger.info( + f"Claude streaming complete. Text: {len(text_content)} chars, Tool calls: {len(tool_calls)}, Thinking blocks: {len(thinking_blocks)}" + ) + # Return the complete response with all components return ResponseMessage( - content=text_content, + content=text_content, tool_calls=tool_calls if tool_calls else None, - thinking_blocks=thinking_blocks if thinking_blocks else None + thinking_blocks=thinking_blocks if thinking_blocks else None, ) - + except ConnectionError as ce: logger.error(f"Connection error with Anthropic API: {ce}") raise @@ -497,20 +532,22 @@ def _send_query(self, messages: list, claude_params: dict) -> Any: logger.exception(e) # This will print the full traceback raise - def _observable_query(self, - observer: Observer, - base64_image: Optional[str] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - incoming_query: Optional[str] = None, - reset_conversation: bool = False, - thinking_budget_tokens: int = None): + def _observable_query( + self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + reset_conversation: bool = False, + thinking_budget_tokens: int = None, + ): """Main query handler that manages conversation history and Claude interactions. - + This is the primary method for handling all queries, whether they come through direct_query or through the observable pattern. It manages the conversation history, builds prompts, and handles tool calls. - + Args: observer (Observer): The observer to emit responses to base64_image (Optional[str]): Optional Base64-encoded image @@ -519,10 +556,11 @@ def _observable_query(self, incoming_query (Optional[str]): Optional query to update the agent's query reset_conversation (bool): Whether to reset the conversation history """ - + try: logger.info("_observable_query called in claude") import copy + # Reset conversation history if requested if reset_conversation: self.conversation_history = [] @@ -536,12 +574,18 @@ def _observable_query(self, _, rag_results = self._get_rag_context() # Build prompt and get Claude parameters - budget = thinking_budget_tokens if thinking_budget_tokens is not None else self.thinking_budget_tokens - messages, claude_params = self._build_prompt(messages, base64_image, dimensions, override_token_limit, rag_results, budget) - + budget = ( + thinking_budget_tokens + if thinking_budget_tokens is not None + else self.thinking_budget_tokens + ) + messages, claude_params = self._build_prompt( + messages, base64_image, dimensions, override_token_limit, rag_results, budget + ) + # Send query and get response response_message = self._send_query(messages, claude_params) - + if response_message is None: logger.error("Received None response from Claude API") observer.on_next("") @@ -552,23 +596,18 @@ def _observable_query(self, if response_message.thinking_blocks: content_blocks.extend(response_message.thinking_blocks) if response_message.content: - content_blocks.append({ - "type": "text", - "text": response_message.content - }) + content_blocks.append({"type": "text", "text": response_message.content}) if content_blocks: - messages.append({ - "role": "assistant", - "content": content_blocks - }) - + messages.append({"role": "assistant", "content": content_blocks}) + # Handle tool calls if present if response_message.tool_calls: self._handle_tooling(response_message, messages) # At the end, append only new messages (including tool-use/results) to the global conversation history under a lock import threading - if not hasattr(self, '_history_lock'): + + if not hasattr(self, "_history_lock"): self._history_lock = threading.Lock() with self._history_lock: for msg in messages[base_len:]: @@ -587,15 +626,17 @@ def _observable_query(self, logger.error(f"Query failed in {self.dev_name}: {e}") observer.on_error(e) self.response_subject.on_error(e) - + def _handle_tooling(self, response_message, messages): """Executes tools and appends tool-use/result blocks to messages.""" - if not hasattr(response_message, 'tool_calls') or not response_message.tool_calls: + if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: logger.info("No tool calls found in response message") return None - + if len(response_message.tool_calls) > 1: - logger.warning("Multiple tool calls detected in response message. Not a tested feature.") + logger.warning( + "Multiple tool calls detected in response message. Not a tested feature." + ) # Execute all tools first and collect their results for tool_call in response_message.tool_calls: @@ -604,56 +645,58 @@ def _handle_tooling(self, response_message, messages): "type": "tool_use", "id": tool_call.id, "name": tool_call.function.name, - "input": json.loads(tool_call.function.arguments) + "input": json.loads(tool_call.function.arguments), } - messages.append({ - "role": "assistant", - "content": [tool_use_block] - }) - + messages.append({"role": "assistant", "content": [tool_use_block]}) + # Execute the tool args = json.loads(tool_call.function.arguments) tool_result = self.skills.call(tool_call.function.name, **args) - + # Add tool result to conversation history if tool_result: - messages.append({ - "role": "user", - "content": [{ - "type": "tool_result", - "tool_use_id": tool_call.id, - "content": f"{tool_result}" - }] - }) + messages.append( + { + "role": "user", + "content": [ + { + "type": "tool_result", + "tool_use_id": tool_call.id, + "content": f"{tool_result}", + } + ], + } + ) def _tooling_callback(self, response_message): """Runs the observable query for each tool call in the current response_message""" - if not hasattr(response_message, 'tool_calls') or not response_message.tool_calls: + if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: return for tool_call in response_message.tool_calls: tool_name = tool_call.function.name tool_id = tool_call.id self.run_observable_query( query_text=f"Tool {tool_name}, ID: {tool_id} execution complete. Please summarize the results and continue.", - thinking_budget_tokens=0 + thinking_budget_tokens=0, ).run() def _debug_api_call(self, claude_params: dict): """Debugging function to log API calls with truncated base64 data.""" # Remove tools to reduce verbosity import copy + log_params = copy.deepcopy(claude_params) - if 'tools' in log_params: - del log_params['tools'] - + if "tools" in log_params: + del log_params["tools"] + # Truncate base64 data in images - much cleaner approach - if 'messages' in log_params: - for msg in log_params['messages']: - if 'content' in msg: - for content in msg['content']: - if isinstance(content, dict) and content.get('type') == 'image': - source = content.get('source', {}) - if source.get('type') == 'base64' and 'data' in source: - data = source['data'] - source['data'] = f"{data[:50]}..." - return json.dumps(log_params, indent=2, default=str) \ No newline at end of file + if "messages" in log_params: + for msg in log_params["messages"]: + if "content" in msg: + for content in msg["content"]: + if isinstance(content, dict) and content.get("type") == "image": + source = content.get("source", {}) + if source.get("type") == "base64" and "data" in source: + data = source["data"] + source["data"] = f"{data[:50]}..." + return json.dumps(log_params, indent=2, default=str) diff --git a/dimos/agents/memory/base.py b/dimos/agents/memory/base.py index 340b886edc..af8cbf689f 100644 --- a/dimos/agents/memory/base.py +++ b/dimos/agents/memory/base.py @@ -12,9 +12,11 @@ # See the License for the specific language governing permissions and # limitations under the License. -from abc import ABC, abstractmethod -import logging -from dimos.exceptions.agent_memory_exceptions import UnknownConnectionTypeError, AgentMemoryConnectionError +from abc import abstractmethod +from dimos.exceptions.agent_memory_exceptions import ( + UnknownConnectionTypeError, + AgentMemoryConnectionError, +) from dimos.utils.logging_config import setup_logger # TODO @@ -23,8 +25,9 @@ # TODO # class AbstractAgentSymbolicMemory(AbstractAgentMemory): -class AbstractAgentSemanticMemory(): # AbstractAgentMemory): - def __init__(self, connection_type='local', **kwargs): + +class AbstractAgentSemanticMemory: # AbstractAgentMemory): + def __init__(self, connection_type="local", **kwargs): """ Initialize with dynamic connection parameters. Args: @@ -34,25 +37,30 @@ def __init__(self, connection_type='local', **kwargs): AgentMemoryConnectionError: If initializing the database connection fails. """ self.logger = setup_logger(self.__class__.__name__) - self.logger.info('Initializing AgentMemory with connection type: %s', connection_type) + self.logger.info("Initializing AgentMemory with connection type: %s", connection_type) self.connection_params = kwargs - self.db_connection = None # Holds the conection, whether local or remote, to the database used. - - if connection_type not in ['local', 'remote']: - error = UnknownConnectionTypeError(f"Invalid connection_type {connection_type}. Expected 'local' or 'remote'.") + self.db_connection = ( + None # Holds the conection, whether local or remote, to the database used. + ) + + if connection_type not in ["local", "remote"]: + error = UnknownConnectionTypeError( + f"Invalid connection_type {connection_type}. Expected 'local' or 'remote'." + ) self.logger.error(str(error)) raise error try: - if connection_type == 'remote': + if connection_type == "remote": self.connect() - elif connection_type == 'local': + elif connection_type == "local": self.create() except Exception as e: self.logger.error("Failed to initialize database connection: %s", str(e), exc_info=True) - raise AgentMemoryConnectionError("Initialization failed due to an unexpected error.", cause=e) from e + raise AgentMemoryConnectionError( + "Initialization failed due to an unexpected error.", cause=e + ) from e - @abstractmethod def connect(self): """Establish a connection to the data store using dynamic parameters specified during initialization.""" @@ -77,7 +85,7 @@ def get_vector(self, vector_id): Args: vector_id (any): The identifier of the vector to retrieve. """ - + @abstractmethod def query(self, query_texts, n_results=4, similarity_threshold=None): """Performs a semantic search in the vector database. @@ -123,4 +131,3 @@ def delete_vector(self, vector_id): # (some sort of tag/metadata) # temporal - diff --git a/dimos/agents/memory/chroma_impl.py b/dimos/agents/memory/chroma_impl.py index 369003d290..06f6989355 100644 --- a/dimos/agents/memory/chroma_impl.py +++ b/dimos/agents/memory/chroma_impl.py @@ -14,7 +14,6 @@ from dimos.agents.memory.base import AbstractAgentSemanticMemory -import chromadb from langchain_openai import OpenAIEmbeddings from langchain_chroma import Chroma import os @@ -23,18 +22,18 @@ class ChromaAgentSemanticMemory(AbstractAgentSemanticMemory): """Base class for Chroma-based semantic memory implementations.""" - + def __init__(self, collection_name="my_collection"): """Initialize the connection to the local Chroma DB.""" self.collection_name = collection_name self.db_connection = None self.embeddings = None - super().__init__(connection_type='local') + super().__init__(connection_type="local") def connect(self): # Stub return super().connect() - + def create(self): """Create the embedding function and initialize the Chroma database. This method must be implemented by child classes.""" @@ -52,27 +51,22 @@ def add_vector(self, vector_id, vector_data): def get_vector(self, vector_id): """Retrieve a vector from the ChromaDB by its identifier.""" - result = self.db_connection.get(include=['embeddings'], ids=[vector_id]) + result = self.db_connection.get(include=["embeddings"], ids=[vector_id]) return result def query(self, query_texts, n_results=4, similarity_threshold=None): """Query the collection with a specific text and return up to n results.""" if not self.db_connection: raise Exception("Collection not initialized. Call connect() first.") - + if similarity_threshold is not None: if not (0 <= similarity_threshold <= 1): raise ValueError("similarity_threshold must be between 0 and 1.") return self.db_connection.similarity_search_with_relevance_scores( - query=query_texts, - k=n_results, - score_threshold=similarity_threshold + query=query_texts, k=n_results, score_threshold=similarity_threshold ) else: - documents = self.db_connection.similarity_search( - query=query_texts, - k=n_results - ) + documents = self.db_connection.similarity_search(query=query_texts, k=n_results) return [(doc, None) for doc in documents] def update_vector(self, vector_id, new_vector_data): @@ -88,10 +82,12 @@ def delete_vector(self, vector_id): class OpenAISemanticMemory(ChromaAgentSemanticMemory): """Semantic memory implementation using OpenAI's embedding API.""" - - def __init__(self, collection_name="my_collection", model="text-embedding-3-large", dimensions=1024): + + def __init__( + self, collection_name="my_collection", model="text-embedding-3-large", dimensions=1024 + ): """Initialize OpenAI-based semantic memory. - + Args: collection_name (str): Name of the Chroma collection model (str): OpenAI embedding model to use @@ -119,22 +115,23 @@ def create(self): self.db_connection = Chroma( collection_name=self.collection_name, embedding_function=self.embeddings, - collection_metadata={"hnsw:space": "cosine"} + collection_metadata={"hnsw:space": "cosine"}, ) class LocalSemanticMemory(ChromaAgentSemanticMemory): """Semantic memory implementation using local models.""" - - def __init__(self, collection_name="my_collection", model_name="sentence-transformers/all-MiniLM-L6-v2"): + + def __init__( + self, collection_name="my_collection", model_name="sentence-transformers/all-MiniLM-L6-v2" + ): """Initialize the local semantic memory using SentenceTransformer. - + Args: collection_name (str): Name of the Chroma collection model_name (str): Embeddings model """ - from sentence_transformers import SentenceTransformer - + self.model_name = model_name super().__init__(collection_name=collection_name) @@ -142,23 +139,23 @@ def create(self): """Create local embedding model and initialize the ChromaDB client.""" # Load the sentence transformer model # Use CUDA if available, otherwise fall back to CPU - device = 'cuda' if torch.cuda.is_available() else 'cpu' + device = "cuda" if torch.cuda.is_available() else "cpu" print(f"Using device: {device}") self.model = SentenceTransformer(self.model_name, device=device) - + # Create a custom embedding class that implements the embed_query method class SentenceTransformerEmbeddings: def __init__(self, model): self.model = model - + def embed_query(self, text): """Embed a single query text.""" return self.model.encode(text, normalize_embeddings=True).tolist() - + def embed_documents(self, texts): """Embed multiple documents/texts.""" return self.model.encode(texts, normalize_embeddings=True).tolist() - + # Create an instance of our custom embeddings class self.embeddings = SentenceTransformerEmbeddings(self.model) @@ -166,6 +163,5 @@ def embed_documents(self, texts): self.db_connection = Chroma( collection_name=self.collection_name, embedding_function=self.embeddings, - collection_metadata={"hnsw:space": "cosine"} + collection_metadata={"hnsw:space": "cosine"}, ) - diff --git a/dimos/agents/memory/image_embedding.py b/dimos/agents/memory/image_embedding.py index 49c1ec67b6..8bcd225d85 100644 --- a/dimos/agents/memory/image_embedding.py +++ b/dimos/agents/memory/image_embedding.py @@ -20,9 +20,8 @@ """ import os -import logging import numpy as np -from typing import Union, List, Dict, Any +from typing import Union from PIL import Image import io import cv2 @@ -31,18 +30,19 @@ logger = setup_logger("dimos.agents.memory.image_embedding") + class ImageEmbeddingProvider: """ A provider for generating vector embeddings from images. - + This class uses pre-trained models to convert images into vector embeddings that can be stored in a vector database and used for similarity search. """ - + def __init__(self, model_name: str = "clip", dimensions: int = 512): """ Initialize the image embedding provider. - + Args: model_name: Name of the embedding model to use ("clip", "resnet", etc.) dimensions: Dimensions of the embedding vectors @@ -51,17 +51,17 @@ def __init__(self, model_name: str = "clip", dimensions: int = 512): self.dimensions = dimensions self.model = None self.processor = None - + self._initialize_model() - + logger.info(f"ImageEmbeddingProvider initialized with model {model_name}") - + def _initialize_model(self): """Initialize the specified embedding model.""" try: import torch from transformers import CLIPProcessor, CLIPModel, AutoFeatureExtractor, AutoModel - + if self.model_name == "clip": model_id = "openai/clip-vit-base-patch32" self.model = CLIPModel.from_pretrained(model_id) @@ -81,102 +81,106 @@ def _initialize_model(self): self.model = None self.processor = None raise - + def get_embedding(self, image: Union[np.ndarray, str, bytes]) -> np.ndarray: """ Generate an embedding vector for the provided image. - + Args: image: The image to embed, can be a numpy array (OpenCV format), a file path, or a base64-encoded string - + Returns: A numpy array containing the embedding vector """ if self.model is None or self.processor is None: logger.error("Model not initialized. Using fallback random embedding.") return np.random.randn(self.dimensions).astype(np.float32) - + pil_image = self._prepare_image(image) - + try: import torch - + if self.model_name == "clip": inputs = self.processor(images=pil_image, return_tensors="pt") - + with torch.no_grad(): image_features = self.model.get_image_features(**inputs) - + image_embedding = image_features / image_features.norm(dim=1, keepdim=True) embedding = image_embedding.numpy()[0] - + elif self.model_name == "resnet": inputs = self.processor(images=pil_image, return_tensors="pt") - + with torch.no_grad(): outputs = self.model(**inputs) - + # Get the [CLS] token embedding embedding = outputs.last_hidden_state[:, 0, :].numpy()[0] else: logger.warning(f"Unsupported model: {self.model_name}. Using random embedding.") embedding = np.random.randn(self.dimensions).astype(np.float32) - + # Normalize and ensure correct dimensions embedding = embedding / np.linalg.norm(embedding) - + logger.debug(f"Generated embedding with shape {embedding.shape}") return embedding - + except Exception as e: logger.error(f"Error generating embedding: {e}") return np.random.randn(self.dimensions).astype(np.float32) - + def get_text_embedding(self, text: str) -> np.ndarray: """ Generate an embedding vector for the provided text. - + Args: text: The text to embed - + Returns: A numpy array containing the embedding vector """ if self.model is None or self.processor is None: logger.error("Model not initialized. Using fallback random embedding.") return np.random.randn(self.dimensions).astype(np.float32) - + if self.model_name != "clip": - logger.warning(f"Text embeddings are only supported with CLIP model, not {self.model_name}. Using random embedding.") + logger.warning( + f"Text embeddings are only supported with CLIP model, not {self.model_name}. Using random embedding." + ) return np.random.randn(self.dimensions).astype(np.float32) - + try: import torch - + inputs = self.processor(text=[text], return_tensors="pt", padding=True) - + with torch.no_grad(): text_features = self.model.get_text_features(**inputs) - + # Normalize the features text_embedding = text_features / text_features.norm(dim=1, keepdim=True) embedding = text_embedding.numpy()[0] - - logger.debug(f"Generated text embedding with shape {embedding.shape} for text: '{text}'") + + logger.debug( + f"Generated text embedding with shape {embedding.shape} for text: '{text}'" + ) return embedding - + except Exception as e: logger.error(f"Error generating text embedding: {e}") return np.random.randn(self.dimensions).astype(np.float32) - + def _prepare_image(self, image: Union[np.ndarray, str, bytes]) -> Image.Image: """ Convert the input image to PIL format required by the models. - + Args: image: Input image in various formats - + Returns: PIL Image object """ @@ -185,9 +189,9 @@ def _prepare_image(self, image: Union[np.ndarray, str, bytes]) -> Image.Image: image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) else: image_rgb = image - + return Image.fromarray(image_rgb) - + elif isinstance(image, str): if os.path.isfile(image): return Image.open(image) @@ -198,9 +202,9 @@ def _prepare_image(self, image: Union[np.ndarray, str, bytes]) -> Image.Image: except Exception as e: logger.error(f"Failed to decode image string: {e}") raise ValueError("Invalid image string format") - + elif isinstance(image, bytes): return Image.open(io.BytesIO(image)) - + else: raise ValueError(f"Unsupported image format: {type(image)}") diff --git a/dimos/agents/memory/spatial_vector_db.py b/dimos/agents/memory/spatial_vector_db.py index 247c8dee65..cf44d0c589 100644 --- a/dimos/agents/memory/spatial_vector_db.py +++ b/dimos/agents/memory/spatial_vector_db.py @@ -19,47 +19,43 @@ their XY locations and querying by location or image similarity. """ -import os -import logging import numpy as np -import cv2 -import json -import base64 -from typing import List, Dict, Tuple, Any, Optional, Union +from typing import List, Dict, Tuple, Any import chromadb -from chromadb.utils import embedding_functions -from dimos.agents.memory.base import AbstractAgentSemanticMemory from dimos.agents.memory.visual_memory import VisualMemory from dimos.utils.logging_config import setup_logger logger = setup_logger("dimos.agents.memory.spatial_vector_db") + class SpatialVectorDB: """ A vector database for storing and querying images mapped to X,Y,theta absolute locations for SpatialMemory. - + This class extends the ChromaDB implementation to support storing images with their absolute locations and querying by location, text, or image cosine semantic similarity. """ - - def __init__(self, collection_name: str = "spatial_memory", chroma_client=None, visual_memory=None): + + def __init__( + self, collection_name: str = "spatial_memory", chroma_client=None, visual_memory=None + ): """ Initialize the spatial vector database. - + Args: collection_name: Name of the vector database collection chroma_client: Optional ChromaDB client for persistence. If None, an in-memory client is used. visual_memory: Optional VisualMemory instance for storing images. If None, a new one is created. """ self.collection_name = collection_name - + # Use provided client or create in-memory client self.client = chroma_client if chroma_client is not None else chromadb.Client() - + # Check if collection already exists - in newer ChromaDB versions list_collections returns names directly existing_collections = self.client.list_collections() - + # Handle different versions of ChromaDB API try: collection_exists = collection_name in existing_collections @@ -72,32 +68,36 @@ def __init__(self, collection_name: str = "spatial_memory", chroma_client=None, collection_exists = True except Exception: collection_exists = False - + # Get or create the collection self.image_collection = self.client.get_or_create_collection( - name=collection_name, - metadata={"hnsw:space": "cosine"} + name=collection_name, metadata={"hnsw:space": "cosine"} ) - + # Use provided visual memory or create a new one self.visual_memory = visual_memory if visual_memory is not None else VisualMemory() - + # Log initialization info with details about whether using existing collection client_type = "persistent" if chroma_client is not None else "in-memory" try: - count = len(self.image_collection.get(include=[])['ids']) + count = len(self.image_collection.get(include=[])["ids"]) if collection_exists: - logger.info(f"Using EXISTING {client_type} collection '{collection_name}' with {count} entries") + logger.info( + f"Using EXISTING {client_type} collection '{collection_name}' with {count} entries" + ) else: logger.info(f"Created NEW {client_type} collection '{collection_name}'") except Exception as e: - logger.info(f"Initialized {client_type} collection '{collection_name}' (count error: {str(e)})") - - def add_image_vector(self, vector_id: str, image: np.ndarray, embedding: np.ndarray, - metadata: Dict[str, Any]) -> None: + logger.info( + f"Initialized {client_type} collection '{collection_name}' (count error: {str(e)})" + ) + + def add_image_vector( + self, vector_id: str, image: np.ndarray, embedding: np.ndarray, metadata: Dict[str, Any] + ) -> None: """ Add an image with its embedding and metadata to the vector database. - + Args: vector_id: Unique identifier for the vector image: The image to store @@ -106,156 +106,162 @@ def add_image_vector(self, vector_id: str, image: np.ndarray, embedding: np.ndar """ # Store the image in visual memory self.visual_memory.add(vector_id, image) - + # Add the vector to ChromaDB self.image_collection.add( - ids=[vector_id], - embeddings=[embedding.tolist()], - metadatas=[metadata] + ids=[vector_id], embeddings=[embedding.tolist()], metadatas=[metadata] ) - + logger.debug(f"Added image vector {vector_id} with metadata: {metadata}") - + def query_by_embedding(self, embedding: np.ndarray, limit: int = 5) -> List[Dict]: """ Query the vector database for images similar to the provided embedding. - + Args: embedding: Query embedding vector limit: Maximum number of results to return - + Returns: List of results, each containing the image and its metadata """ results = self.image_collection.query( - query_embeddings=[embedding.tolist()], - n_results=limit + query_embeddings=[embedding.tolist()], n_results=limit ) - + return self._process_query_results(results) - # TODO: implement efficient nearest neighbor search - def query_by_location(self, x: float, y: float, radius: float = 2.0, limit: int = 5) -> List[Dict]: + + # TODO: implement efficient nearest neighbor search + def query_by_location( + self, x: float, y: float, radius: float = 2.0, limit: int = 5 + ) -> List[Dict]: """ Query the vector database for images near the specified location. - + Args: x: X coordinate y: Y coordinate radius: Search radius in meters limit: Maximum number of results to return - + Returns: List of results, each containing the image and its metadata """ results = self.image_collection.get() - - if not results or not results['ids']: + + if not results or not results["ids"]: return [] - - filtered_results = { - 'ids': [], - 'metadatas': [], - 'distances': [] - } - - for i, metadata in enumerate(results['metadatas']): - item_x = metadata.get('x') - item_y = metadata.get('y') - + + filtered_results = {"ids": [], "metadatas": [], "distances": []} + + for i, metadata in enumerate(results["metadatas"]): + item_x = metadata.get("x") + item_y = metadata.get("y") + if item_x is not None and item_y is not None: - distance = np.sqrt((x - item_x)**2 + (y - item_y)**2) - + distance = np.sqrt((x - item_x) ** 2 + (y - item_y) ** 2) + if distance <= radius: - filtered_results['ids'].append(results['ids'][i]) - filtered_results['metadatas'].append(metadata) - filtered_results['distances'].append(distance) - - sorted_indices = np.argsort(filtered_results['distances']) - filtered_results['ids'] = [filtered_results['ids'][i] for i in sorted_indices[:limit]] - filtered_results['metadatas'] = [filtered_results['metadatas'][i] for i in sorted_indices[:limit]] - filtered_results['distances'] = [filtered_results['distances'][i] for i in sorted_indices[:limit]] - + filtered_results["ids"].append(results["ids"][i]) + filtered_results["metadatas"].append(metadata) + filtered_results["distances"].append(distance) + + sorted_indices = np.argsort(filtered_results["distances"]) + filtered_results["ids"] = [filtered_results["ids"][i] for i in sorted_indices[:limit]] + filtered_results["metadatas"] = [ + filtered_results["metadatas"][i] for i in sorted_indices[:limit] + ] + filtered_results["distances"] = [ + filtered_results["distances"][i] for i in sorted_indices[:limit] + ] + return self._process_query_results(filtered_results) - + def _process_query_results(self, results) -> List[Dict]: """Process query results to include decoded images.""" - if not results or not results['ids']: + if not results or not results["ids"]: return [] - + processed_results = [] - - for i, vector_id in enumerate(results['ids']): + + for i, vector_id in enumerate(results["ids"]): lookup_id = vector_id[0] if isinstance(vector_id, list) else vector_id - + # Create the result dictionary with metadata regardless of image availability result = { - 'metadata': results['metadatas'][i] if 'metadatas' in results else {}, - 'id': lookup_id + "metadata": results["metadatas"][i] if "metadatas" in results else {}, + "id": lookup_id, } - + # Add distance if available - if 'distances' in results: - result['distance'] = results['distances'][i][0] if isinstance(results['distances'][i], list) else results['distances'][i] - + if "distances" in results: + result["distance"] = ( + results["distances"][i][0] + if isinstance(results["distances"][i], list) + else results["distances"][i] + ) + # Get the image from visual memory image = self.visual_memory.get(lookup_id) - result['image'] = image - + result["image"] = image + processed_results.append(result) - + return processed_results - + def query_by_text(self, text: str, limit: int = 5) -> List[Dict]: """ Query the vector database for images matching the provided text description. - + This method uses CLIP's text-to-image matching capability to find images that semantically match the text query (e.g., "where is the kitchen"). - + Args: text: Text query to search for limit: Maximum number of results to return - + Returns: List of results, each containing the image, its metadata, and similarity score """ from dimos.agents.memory.image_embedding import ImageEmbeddingProvider - + embedding_provider = ImageEmbeddingProvider(model_name="clip") - + text_embedding = embedding_provider.get_text_embedding(text) - + results = self.image_collection.query( query_embeddings=[text_embedding.tolist()], n_results=limit, - include=["documents", "metadatas", "distances"] + include=["documents", "metadatas", "distances"], + ) + + logger.info( + f"Text query: '{text}' returned {len(results['ids'] if 'ids' in results else [])} results" ) - - logger.info(f"Text query: '{text}' returned {len(results['ids'] if 'ids' in results else [])} results") return self._process_query_results(results) - + def get_all_locations(self) -> List[Tuple[float, float, float]]: """Get all locations stored in the database.""" # Get all items from the collection without embeddings results = self.image_collection.get(include=["metadatas"]) - + if not results or "metadatas" not in results or not results["metadatas"]: return [] - + # Extract x, y coordinates from metadata locations = [] for metadata in results["metadatas"]: if isinstance(metadata, list) and metadata and isinstance(metadata[0], dict): metadata = metadata[0] # Handle nested metadata - + if isinstance(metadata, dict) and "x" in metadata and "y" in metadata: x = metadata.get("x", 0) y = metadata.get("y", 0) z = metadata.get("z", 0) if "z" in metadata else 0 locations.append((x, y, z)) - + return locations - + @property def image_storage(self): """Legacy accessor for compatibility with existing code.""" diff --git a/dimos/agents/memory/visual_memory.py b/dimos/agents/memory/visual_memory.py index fb520c9c85..0087a4fe9b 100644 --- a/dimos/agents/memory/visual_memory.py +++ b/dimos/agents/memory/visual_memory.py @@ -15,78 +15,81 @@ """ Visual memory storage for managing image data persistence and retrieval """ + import os import pickle import base64 -import logging import numpy as np import cv2 -from typing import Dict, Optional, Tuple, Any, List +from typing import Optional from dimos.utils.logging_config import setup_logger logger = setup_logger("dimos.agents.memory.visual_memory") + class VisualMemory: """ A class for storing and retrieving visual memories (images) with persistence. - + This class handles the storage, encoding, and retrieval of images associated with vector database entries. It provides persistence mechanisms to save and load the image data from disk. """ - + def __init__(self, output_dir: str = None): """ Initialize the visual memory system. - + Args: output_dir: Directory to store the serialized image data """ self.images = {} # Maps IDs to encoded images self.output_dir = output_dir - + if output_dir: os.makedirs(output_dir, exist_ok=True) logger.info(f"VisualMemory initialized with output directory: {output_dir}") else: logger.info("VisualMemory initialized with no persistence directory") - + def add(self, image_id: str, image: np.ndarray) -> None: """ Add an image to visual memory. - + Args: image_id: Unique identifier for the image image: The image data as a numpy array """ # Encode the image to base64 for storage - success, encoded_image = cv2.imencode('.jpg', image) + success, encoded_image = cv2.imencode(".jpg", image) if not success: logger.error(f"Failed to encode image {image_id}") return - + image_bytes = encoded_image.tobytes() - b64_encoded = base64.b64encode(image_bytes).decode('utf-8') - + b64_encoded = base64.b64encode(image_bytes).decode("utf-8") + # Store the encoded image self.images[image_id] = b64_encoded logger.debug(f"Added image {image_id} to visual memory") - + def get(self, image_id: str) -> Optional[np.ndarray]: """ Retrieve an image from visual memory. - + Args: image_id: Unique identifier for the image - + Returns: The decoded image as a numpy array, or None if not found """ if image_id not in self.images: - logger.warning(f"Image not found in storage for ID {image_id}. Incomplete or corrupted image storage.") + logger.warning( + f"Image not found in storage for ID {image_id}. Incomplete or corrupted image storage." + ) return None - + try: encoded_image = self.images[image_id] image_bytes = base64.b64decode(encoded_image) @@ -96,83 +99,83 @@ def get(self, image_id: str) -> Optional[np.ndarray]: except Exception as e: logger.warning(f"Failed to decode image for ID {image_id}: {str(e)}") return None - + def contains(self, image_id: str) -> bool: """ Check if an image ID exists in visual memory. - + Args: image_id: Unique identifier for the image - + Returns: True if the image exists, False otherwise """ return image_id in self.images - + def count(self) -> int: """ Get the number of images in visual memory. - + Returns: The number of images stored """ return len(self.images) - + def save(self, filename: Optional[str] = None) -> str: """ Save the visual memory to disk. - + Args: filename: Optional filename to save to. If None, uses a default name in the output directory. - + Returns: The path where the data was saved """ if not self.output_dir: logger.warning("No output directory specified for VisualMemory. Cannot save.") return "" - + if not filename: filename = "visual_memory.pkl" - + output_path = os.path.join(self.output_dir, filename) - + try: - with open(output_path, 'wb') as f: + with open(output_path, "wb") as f: pickle.dump(self.images, f) logger.info(f"Saved {len(self.images)} images to {output_path}") return output_path except Exception as e: logger.error(f"Failed to save visual memory: {str(e)}") return "" - + @classmethod - def load(cls, path: str, output_dir: Optional[str] = None) -> 'VisualMemory': + def load(cls, path: str, output_dir: Optional[str] = None) -> "VisualMemory": """ Load visual memory from disk. - + Args: path: Path to the saved visual memory file output_dir: Optional output directory for the new instance - + Returns: A new VisualMemory instance with the loaded data """ instance = cls(output_dir=output_dir) - + if not os.path.exists(path): logger.warning(f"Visual memory file {path} not found") return instance - + try: - with open(path, 'rb') as f: + with open(path, "rb") as f: instance.images = pickle.load(f) logger.info(f"Loaded {len(instance.images)} images from {path}") return instance except Exception as e: logger.error(f"Failed to load visual memory: {str(e)}") return instance - + def clear(self) -> None: """Clear all images from memory.""" self.images = {} diff --git a/dimos/agents/planning_agent.py b/dimos/agents/planning_agent.py index 197ebe76d5..52971e770a 100644 --- a/dimos/agents/planning_agent.py +++ b/dimos/agents/planning_agent.py @@ -13,47 +13,49 @@ # limitations under the License. import threading -from typing import List, Optional, Dict, Union, Literal -import json -from reactivex import Subject, Observable, disposable, create +from typing import List, Optional, Literal +from reactivex import Observable from reactivex import operators as ops -from openai import OpenAI, NOT_GIVEN import time from dimos.skills.skills import AbstractSkill from dimos.agents.agent import OpenAIAgent from dimos.utils.logging_config import setup_logger from textwrap import dedent -from pydantic import BaseModel, Field +from pydantic import BaseModel logger = setup_logger("dimos.agents.planning_agent") + # For response validation class PlanningAgentResponse(BaseModel): type: Literal["dialogue", "plan"] content: List[str] needs_confirmation: bool + class PlanningAgent(OpenAIAgent): """Agent that plans and breaks down tasks through dialogue. - + This agent specializes in: 1. Understanding complex tasks through dialogue 2. Breaking tasks into concrete, executable steps 3. Refining plans based on user feedback 4. Streaming individual steps to ExecutionAgents - + The agent maintains conversation state and can refine plans until the user confirms they are ready to execute. """ - - def __init__(self, - dev_name: str = "PlanningAgent", - model_name: str = "gpt-4", - input_query_stream: Optional[Observable] = None, - use_terminal: bool = False, - skills: Optional[AbstractSkill] = None): + + def __init__( + self, + dev_name: str = "PlanningAgent", + model_name: str = "gpt-4", + input_query_stream: Optional[Observable] = None, + use_terminal: bool = False, + skills: Optional[AbstractSkill] = None, + ): """Initialize the planning agent. - + Args: dev_name: Name identifier for the agent model_name: OpenAI model to use @@ -66,12 +68,12 @@ def __init__(self, self.current_plan = [] self.plan_confirmed = False self.latest_response = None - + # Build system prompt skills_list = [] if skills is not None: skills_list = skills.get_tools() - + system_query = dedent(f""" You are a Robot planning assistant that helps break down tasks into concrete, executable steps. Your goal is to: @@ -120,7 +122,7 @@ def __init__(self, input_query_stream=input_query_stream, system_query=system_query, max_output_tokens_per_request=1000, - response_model=PlanningAgentResponse + response_model=PlanningAgentResponse, ) logger.info("Planning agent initialized") @@ -132,32 +134,31 @@ def __init__(self, logger.info("Starting terminal interface in a separate thread") terminal_thread = threading.Thread(target=self.start_terminal_interface, daemon=True) terminal_thread.start() - + def _handle_response(self, response) -> None: """Handle the agent's response and update state. - + Args: response: ParsedChatCompletionMessage containing PlanningAgentResponse """ print("handle response", response) print("handle response type", type(response)) - + # Extract the PlanningAgentResponse from parsed field if available - planning_response = response.parsed if hasattr(response, 'parsed') else response + planning_response = response.parsed if hasattr(response, "parsed") else response print("planning response", planning_response) print("planning response type", type(planning_response)) # Convert to dict for storage in conversation history response_dict = planning_response.model_dump() self.conversation_history.append(response_dict) - + # If it's a plan, update current plan if planning_response.type == "plan": logger.info(f"Updating current plan: {planning_response.content}") self.current_plan = planning_response.content - + # Store latest response self.latest_response = response_dict - def _stream_plan(self) -> None: """Stream each step of the confirmed plan.""" @@ -173,18 +174,18 @@ def _stream_plan(self) -> None: logger.debug(f"Successfully emitted step {i} to response_subject") except Exception as e: logger.error(f"Error emitting step {i}: {e}") - + logger.info("Plan streaming completed") self.response_subject.on_completed() - + def _send_query(self, messages: list) -> PlanningAgentResponse: """Send query to OpenAI and parse the response. - + Extends OpenAIAgent's _send_query to handle planning-specific response formats. - + Args: messages: List of message dictionaries - + Returns: PlanningAgentResponse: Validated response with type, content, and needs_confirmation """ @@ -193,20 +194,18 @@ def _send_query(self, messages: list) -> PlanningAgentResponse: except Exception as e: logger.error(f"Caught exception in _send_query: {str(e)}") return PlanningAgentResponse( - type="dialogue", - content=f"Error: {str(e)}", - needs_confirmation=False + type="dialogue", content=f"Error: {str(e)}", needs_confirmation=False ) def process_user_input(self, user_input: str) -> None: """Process user input and generate appropriate response. - + Args: user_input: The user's message """ if not user_input: return - + # Check for plan confirmation if self.current_plan and user_input.lower() in ["yes", "y", "confirm"]: logger.info("Plan confirmation received") @@ -215,23 +214,20 @@ def process_user_input(self, user_input: str) -> None: confirmation_msg = PlanningAgentResponse( type="dialogue", content="Plan confirmed! Streaming steps to execution...", - needs_confirmation=False + needs_confirmation=False, ) self._handle_response(confirmation_msg) self._stream_plan() return - + # Build messages for OpenAI with conversation history messages = [ {"role": "system", "content": self.system_query} # Using system_query from OpenAIAgent ] - + # Add the new user input to conversation history - self.conversation_history.append({ - "type": "user_message", - "content": user_input - }) - + self.conversation_history.append({"type": "user_message", "content": user_input}) + # Add complete conversation history including both user and assistant messages for msg in self.conversation_history: if msg["type"] == "user_message": @@ -239,9 +235,11 @@ def process_user_input(self, user_input: str) -> None: elif msg["type"] == "dialogue": messages.append({"role": "assistant", "content": msg["content"]}) elif msg["type"] == "plan": - plan_text = "Here's my proposed plan:\n" + "\n".join(f"{i+1}. {step}" for i, step in enumerate(msg["content"])) + plan_text = "Here's my proposed plan:\n" + "\n".join( + f"{i + 1}. {step}" for i, step in enumerate(msg["content"]) + ) messages.append({"role": "assistant", "content": plan_text}) - + # Get and handle response response = self._send_query(messages) self._handle_response(response) @@ -249,23 +247,25 @@ def process_user_input(self, user_input: str) -> None: def start_terminal_interface(self): """Start the terminal interface for input/output.""" - time.sleep(5) # buffer time for clean terminal interface printing + time.sleep(5) # buffer time for clean terminal interface printing print("=" * 50) print("\nDimOS Action PlanningAgent\n") print("I have access to your Robot() and Robot Skills()") - print("Describe your task and I'll break it down into steps using your skills as a reference.") + print( + "Describe your task and I'll break it down into steps using your skills as a reference." + ) print("Once you're happy with the plan, type 'yes' to execute it.") print("Type 'quit' to exit.\n") - + while True: try: print("=" * 50) user_input = input("USER > ") - if user_input.lower() in ['quit', 'exit']: + if user_input.lower() in ["quit", "exit"]: break - + self.process_user_input(user_input) - + # Display response if self.latest_response["type"] == "dialogue": print(f"\nPlanner: {self.latest_response['content']}") @@ -275,28 +275,29 @@ def start_terminal_interface(self): print(f"{i}. {step}") if self.latest_response["needs_confirmation"]: print("\nDoes this plan look good? (yes/no)") - + if self.plan_confirmed: print("\nPlan confirmed! Streaming steps to execution...") break - + except KeyboardInterrupt: print("\nStopping...") break except Exception as e: print(f"\nError: {e}") break - + def get_response_observable(self) -> Observable: """Gets an observable that emits responses from this agent. This method processes the response stream from the parent class, extracting content from `PlanningAgentResponse` objects and flattening any lists of plan steps for emission. - + Returns: Observable: An observable that emits plan steps from the agent. """ + def extract_content(response) -> List[str]: if isinstance(response, PlanningAgentResponse): if response.type == "plan": @@ -312,5 +313,5 @@ def extract_content(response) -> List[str]: # Process the stream: extract content and flatten plan lists return base_observable.pipe( ops.map(extract_content), - ops.flat_map(lambda items: items) # Flatten the list of items + ops.flat_map(lambda items: items), # Flatten the list of items ) diff --git a/dimos/agents/prompt_builder/impl.py b/dimos/agents/prompt_builder/impl.py index f1ddf5681f..0e66191837 100644 --- a/dimos/agents/prompt_builder/impl.py +++ b/dimos/agents/prompt_builder/impl.py @@ -21,8 +21,8 @@ # TODO: Make class more generic when implementing other tokenizers. Presently its OpenAI specific. # TODO: Build out testing and logging -class PromptBuilder(): +class PromptBuilder: DEFAULT_SYSTEM_PROMPT = dedent(""" You are an AI assistant capable of understanding and analyzing both visual and textual information. Your task is to provide accurate and insightful responses based on the data provided to you. @@ -37,8 +37,10 @@ class PromptBuilder(): - If the information is insufficient to provide a complete answer, acknowledge the limitation. - Maintain a professional and informative tone in your response. """) - - def __init__(self, model_name='gpt-4o', max_tokens=128000, tokenizer: Optional[AbstractTokenizer] = None): + + def __init__( + self, model_name="gpt-4o", max_tokens=128000, tokenizer: Optional[AbstractTokenizer] = None + ): """ Initialize the prompt builder. Args: @@ -49,7 +51,7 @@ def __init__(self, model_name='gpt-4o', max_tokens=128000, tokenizer: Optional[A self.model_name = model_name self.max_tokens = max_tokens self.tokenizer: AbstractTokenizer = tokenizer or OpenAITokenizer(model_name=self.model_name) - + def truncate_tokens(self, text, max_tokens, strategy): """ Truncate text to fit within max_tokens using a specified strategy. @@ -78,7 +80,7 @@ def truncate_tokens(self, text, max_tokens, strategy): raise ValueError(f"Unknown truncation strategy: {strategy}") return self.tokenizer.detokenize_text(truncated) - + def build( self, system_prompt=None, @@ -138,7 +140,7 @@ def build( system_prompt = self.DEFAULT_SYSTEM_PROMPT rag_context = rag_context or "" - + # Debug: # print("system_prompt: ", system_prompt) # print("rag_context: ", rag_context) @@ -148,7 +150,11 @@ def build( rag_token_cnt = self.tokenizer.token_count(rag_context) system_prompt_token_cnt = self.tokenizer.token_count(system_prompt) user_query_token_cnt = self.tokenizer.token_count(user_query) - image_token_cnt = self.tokenizer.image_token_count(image_width, image_height, image_detail) if base64_image else 0 + image_token_cnt = ( + self.tokenizer.image_token_count(image_width, image_height, image_detail) + if base64_image + else 0 + ) else: rag_token_cnt = 0 system_prompt_token_cnt = 0 @@ -185,18 +191,25 @@ def build( messages = [{"role": "system", "content": components["system_prompt"]["text"]}] if components["rag"]["text"]: - user_content = [{"type": "text", "text": f"{components['rag']['text']}\n\n{components['user_query']['text']}"}] + user_content = [ + { + "type": "text", + "text": f"{components['rag']['text']}\n\n{components['user_query']['text']}", + } + ] else: user_content = [{"type": "text", "text": components["user_query"]["text"]}] if base64_image: - user_content.append({ - "type": "image_url", - "image_url": { - "url": f"data:image/jpeg;base64,{base64_image}", - "detail": image_detail, - }, - }) + user_content.append( + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{base64_image}", + "detail": image_detail, + }, + } + ) messages.append({"role": "user", "content": user_content}) # Debug: diff --git a/dimos/agents/tokenizer/base.py b/dimos/agents/tokenizer/base.py index 8097bdd685..b7e96de71f 100644 --- a/dimos/agents/tokenizer/base.py +++ b/dimos/agents/tokenizer/base.py @@ -13,8 +13,6 @@ # limitations under the License. from abc import ABC, abstractmethod -import tiktoken -from dimos.utils.logging_config import setup_logger # TODO: Add a class for specific tokenizer exceptions # TODO: Build out testing and logging @@ -22,7 +20,6 @@ class AbstractTokenizer(ABC): - @abstractmethod def tokenize_text(self, text): pass diff --git a/dimos/agents/tokenizer/huggingface_tokenizer.py b/dimos/agents/tokenizer/huggingface_tokenizer.py index e06a2520da..2a7b0d2283 100644 --- a/dimos/agents/tokenizer/huggingface_tokenizer.py +++ b/dimos/agents/tokenizer/huggingface_tokenizer.py @@ -16,8 +16,8 @@ from dimos.agents.tokenizer.base import AbstractTokenizer from dimos.utils.logging_config import setup_logger -class HuggingFaceTokenizer(AbstractTokenizer): +class HuggingFaceTokenizer(AbstractTokenizer): def __init__(self, model_name: str = "Qwen/Qwen2.5-0.5B", **kwargs): super().__init__(**kwargs) @@ -56,15 +56,13 @@ def image_token_count(image_width, image_height, image_detail="high"): """ Calculate the number of tokens in an image. Low detail is 85 tokens, high detail is 170 tokens per 512x512 square. """ - logger = setup_logger( - "dimos.agents.tokenizer.HuggingFaceTokenizer.image_token_count") + logger = setup_logger("dimos.agents.tokenizer.HuggingFaceTokenizer.image_token_count") if image_detail == "low": return 85 elif image_detail == "high": # Image dimensions - logger.debug( - f"Image Width: {image_width}, Image Height: {image_height}") + logger.debug(f"Image Width: {image_width}, Image Height: {image_height}") if image_width is None or image_height is None: raise ValueError( "Image width and height must be provided for high detail image token count calculation." @@ -87,5 +85,4 @@ def image_token_count(image_width, image_height, image_detail="high"): num_squares = (image_width // 512) * (image_height // 512) return 170 * num_squares + 85 else: - raise ValueError( - "Detail specification of image is not 'low' or 'high'") \ No newline at end of file + raise ValueError("Detail specification of image is not 'low' or 'high'") diff --git a/dimos/agents/tokenizer/openai_tokenizer.py b/dimos/agents/tokenizer/openai_tokenizer.py index b410e13aa6..7517ae5e72 100644 --- a/dimos/agents/tokenizer/openai_tokenizer.py +++ b/dimos/agents/tokenizer/openai_tokenizer.py @@ -16,8 +16,8 @@ from dimos.agents.tokenizer.base import AbstractTokenizer from dimos.utils.logging_config import setup_logger -class OpenAITokenizer(AbstractTokenizer): +class OpenAITokenizer(AbstractTokenizer): def __init__(self, model_name: str = "gpt-4o", **kwargs): super().__init__(**kwargs) @@ -56,15 +56,13 @@ def image_token_count(image_width, image_height, image_detail="high"): """ Calculate the number of tokens in an image. Low detail is 85 tokens, high detail is 170 tokens per 512x512 square. """ - logger = setup_logger( - "dimos.agents.tokenizer.openai.image_token_count") + logger = setup_logger("dimos.agents.tokenizer.openai.image_token_count") if image_detail == "low": return 85 elif image_detail == "high": # Image dimensions - logger.debug( - f"Image Width: {image_width}, Image Height: {image_height}") + logger.debug(f"Image Width: {image_width}, Image Height: {image_height}") if image_width is None or image_height is None: raise ValueError( "Image width and height must be provided for high detail image token count calculation." @@ -87,7 +85,4 @@ def image_token_count(image_width, image_height, image_detail="high"): num_squares = (image_width // 512) * (image_height // 512) return 170 * num_squares + 85 else: - raise ValueError( - "Detail specification of image is not 'low' or 'high'") - - + raise ValueError("Detail specification of image is not 'low' or 'high'") diff --git a/dimos/data/data_pipeline.py b/dimos/data/data_pipeline.py index d828bdc00b..bebb881f48 100644 --- a/dimos/data/data_pipeline.py +++ b/dimos/data/data_pipeline.py @@ -16,7 +16,6 @@ from dimos.stream.videostream import VideoStream import warnings -from concurrent.futures import ProcessPoolExecutor, as_completed from collections import deque from dimos.types.depth_map import DepthMapType from dimos.types.label import LabelType @@ -24,13 +23,17 @@ from dimos.types.segmentation import SegmentationType import os + class DataPipeline: - def __init__(self, video_stream: VideoStream, - run_depth: bool = False, - run_labels: bool = False, - run_pointclouds: bool = False, - run_segmentations: bool = False, - max_workers: int = 4): + def __init__( + self, + video_stream: VideoStream, + run_depth: bool = False, + run_labels: bool = False, + run_pointclouds: bool = False, + run_segmentations: bool = False, + max_workers: int = 4, + ): self.video_stream = video_stream self.run_depth = run_depth self.run_labels = run_labels @@ -53,20 +56,25 @@ def __init__(self, video_stream: VideoStream, def _validate_pipeline(self): """Validate the pipeline configuration based on dependencies.""" if self.run_pointclouds and not self.run_depth: - raise ValueError("PointClouds generation requires Depth maps. " - "Enable run_depth=True to use run_pointclouds=True.") + raise ValueError( + "PointClouds generation requires Depth maps. Enable run_depth=True to use run_pointclouds=True." + ) if self.run_segmentations and not self.run_labels: - raise ValueError("Segmentations generation requires Labels. " - "Enable run_labels=True to use run_segmentations=True.") + raise ValueError( + "Segmentations generation requires Labels. Enable run_labels=True to use run_segmentations=True." + ) if not any([self.run_depth, self.run_labels, self.run_pointclouds, self.run_segmentations]): - warnings.warn("No pipeline layers selected to run. The DataPipeline will be initialized without any processing.") + warnings.warn( + "No pipeline layers selected to run. The DataPipeline will be initialized without any processing." + ) def _initialize_pipeline(self): """Initialize necessary components based on selected pipeline layers.""" if self.run_depth: from .depth import DepthProcessor + self.depth_processor = DepthProcessor(debug=True) print("Depth map generation enabled.") else: @@ -74,6 +82,7 @@ def _initialize_pipeline(self): if self.run_labels: from .labels import LabelProcessor + self.labels_processor = LabelProcessor(debug=True) print("Label generation enabled.") else: @@ -81,6 +90,7 @@ def _initialize_pipeline(self): if self.run_pointclouds: from .pointcloud import PointCloudProcessor + self.pointcloud_processor = PointCloudProcessor(debug=True) print("PointCloud generation enabled.") else: @@ -88,6 +98,7 @@ def _initialize_pipeline(self): if self.run_segmentations: from .segment import SegmentProcessor + self.segmentation_processor = SegmentProcessor(debug=True) print("Segmentation generation enabled.") else: @@ -124,7 +135,11 @@ def _process_frame(self, frame): if self.run_labels: label = self.labels_processor.caption_image_data(frame) - if self.run_pointclouds and isinstance(depth_map, DepthMapType) and self.pointcloud_processor: + if ( + self.run_pointclouds + and isinstance(depth_map, DepthMapType) + and self.pointcloud_processor + ): pointcloud = self.pointcloud_processor.process_frame(frame, depth_map.depth_data) if self.run_segmentations and isinstance(label, LabelType) and self.segmentation_processor: diff --git a/dimos/data/depth.py b/dimos/data/depth.py index 76e60bebb8..893fd1d000 100644 --- a/dimos/data/depth.py +++ b/dimos/data/depth.py @@ -13,25 +13,14 @@ # limitations under the License. from dimos.models.depth.metric3d import Metric3D -import os -import pickle -import argparse -import pandas as pd from PIL import Image -from io import BytesIO import torch -import sys import cv2 -import tarfile import logging -import time -import tempfile -import gc -import io -import csv import numpy as np from dimos.types.depth_map import DepthMapType + class DepthProcessor: def __init__(self, debug=False): self.debug = debug @@ -47,14 +36,13 @@ def __init__(self, debug=False): print("Running in debug mode") self.logger.info("Running in debug mode") - def process(self, frame: Image.Image, intrinsics=None): """Process a frame to generate a depth map. - + Args: frame: PIL Image to process intrinsics: Optional camera intrinsics parameters - + Returns: DepthMapType containing the depth map """ @@ -65,7 +53,7 @@ def process(self, frame: Image.Image, intrinsics=None): # Convert frame to numpy array suitable for processing if isinstance(frame, Image.Image): - image = frame.convert('RGB') + image = frame.convert("RGB") elif isinstance(frame, np.ndarray): image = Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)) else: @@ -85,7 +73,7 @@ def process(self, frame: Image.Image, intrinsics=None): if is_depth_map_valid(np.array(depth_map)): self.valid_depth_count += 1 else: - self.logger.error(f"Invalid depth map for the provided frame.") + self.logger.error("Invalid depth map for the provided frame.") print("Invalid depth map for the provided frame.") return None @@ -97,4 +85,4 @@ def process(self, frame: Image.Image, intrinsics=None): except Exception as e: self.logger.error(f"Error processing frame: {e}") - return None \ No newline at end of file + return None diff --git a/dimos/data/labels.py b/dimos/data/labels.py index fe8d9107b8..662af56f34 100644 --- a/dimos/data/labels.py +++ b/dimos/data/labels.py @@ -13,10 +13,9 @@ # limitations under the License. import os -from dimos.models.labels.llava_34b import Llava -from PIL import Image from dimos.types.label import LabelType + class LabelProcessor: def __init__(self, debug: bool = False): self.model = None @@ -26,7 +25,12 @@ def __init__(self, debug: bool = False): def _initialize_model(self): if self.model is None: from dimos.models.labels.llava_34b import Llava - self.model = Llava(mmproj=f"{os.getcwd()}/models/mmproj-model-f16.gguf", model_path=f"{os.getcwd()}/models/llava-v1.6-34b.Q4_K_M.gguf", gpu=True) + + self.model = Llava( + mmproj=f"{os.getcwd()}/models/mmproj-model-f16.gguf", + model_path=f"{os.getcwd()}/models/llava-v1.6-34b.Q4_K_M.gguf", + gpu=True, + ) if self.debug: print("Llava model initialized.") @@ -39,4 +43,4 @@ def caption_image_data(self, frame): return LabelType(labels=output, metadata={"frame_id": frame.id}) except Exception as e: print(f"Error in captioning image: {e}") - return LabelType(labels={}, metadata={"error": str(e)}) \ No newline at end of file + return LabelType(labels={}, metadata={"error": str(e)}) diff --git a/dimos/data/pointcloud.py b/dimos/data/pointcloud.py index 8d16a62590..8d95635d2e 100644 --- a/dimos/data/pointcloud.py +++ b/dimos/data/pointcloud.py @@ -16,14 +16,13 @@ import cv2 import numpy as np import open3d as o3d -from pathlib import Path from PIL import Image import logging from dimos.models.segmentation.segment_utils import apply_mask_to_image from dimos.models.pointcloud.pointcloud_utils import ( create_point_cloud_from_rgbd, - canonicalize_point_cloud + canonicalize_point_cloud, ) from dimos.types.pointcloud import PointCloudType @@ -48,14 +47,16 @@ def __init__(self, output_dir, intrinsic_parameters=None): # Default intrinsic parameters self.default_intrinsic_parameters = { - 'width': 640, - 'height': 480, - 'fx': 960.0, - 'fy': 960.0, - 'cx': 320.0, - 'cy': 240.0, + "width": 640, + "height": 480, + "fx": 960.0, + "fy": 960.0, + "cx": 320.0, + "cy": 240.0, } - self.intrinsic_parameters = intrinsic_parameters if intrinsic_parameters else self.default_intrinsic_parameters + self.intrinsic_parameters = ( + intrinsic_parameters if intrinsic_parameters else self.default_intrinsic_parameters + ) def process_frame(self, image, depth_map, masks): """ @@ -71,34 +72,42 @@ def process_frame(self, image, depth_map, masks): bool: A flag indicating if the point clouds were canonicalized. """ try: - self.logger.info("STARTING POINT CLOUD PROCESSING ---------------------------------------") + self.logger.info( + "STARTING POINT CLOUD PROCESSING ---------------------------------------" + ) # Convert images to OpenCV format if they are PIL Images if isinstance(image, Image.Image): - original_image_cv = cv2.cvtColor(np.array(image.convert('RGB')), cv2.COLOR_RGB2BGR) + original_image_cv = cv2.cvtColor(np.array(image.convert("RGB")), cv2.COLOR_RGB2BGR) else: original_image_cv = image if isinstance(depth_map, Image.Image): - depth_image_cv = cv2.cvtColor(np.array(depth_map.convert('RGB')), cv2.COLOR_RGB2BGR) + depth_image_cv = cv2.cvtColor(np.array(depth_map.convert("RGB")), cv2.COLOR_RGB2BGR) else: depth_image_cv = depth_map width, height = original_image_cv.shape[1], original_image_cv.shape[0] intrinsic_parameters = self.intrinsic_parameters.copy() - intrinsic_parameters.update({ - 'width': width, - 'height': height, - 'cx': width / 2, - 'cy': height / 2, - }) + intrinsic_parameters.update( + { + "width": width, + "height": height, + "cx": width / 2, + "cy": height / 2, + } + ) point_clouds = [] point_cloud_data = [] # Create original point cloud - original_pcd = create_point_cloud_from_rgbd(original_image_cv, depth_image_cv, intrinsic_parameters) - pcd, canonicalized, transformation = canonicalize_point_cloud(original_pcd, canonicalize_threshold=0.3) + original_pcd = create_point_cloud_from_rgbd( + original_image_cv, depth_image_cv, intrinsic_parameters + ) + pcd, canonicalized, transformation = canonicalize_point_cloud( + original_pcd, canonicalize_threshold=0.3 + ) for idx, mask in enumerate(masks): mask_binary = mask > 0 @@ -113,7 +122,9 @@ def process_frame(self, image, depth_map, masks): if canonicalized: inlier_cloud.transform(transformation) - point_clouds.append(PointCloudType(point_cloud=inlier_cloud, metadata={"mask_index": idx})) + point_clouds.append( + PointCloudType(point_cloud=inlier_cloud, metadata={"mask_index": idx}) + ) # Save point cloud to file pointcloud_filename = f"pointcloud_{idx}.pcd" pointcloud_filepath = os.path.join(self.output_dir, pointcloud_filename) diff --git a/dimos/data/segment.py b/dimos/data/segment.py index 8a830520a4..5279235b4e 100644 --- a/dimos/data/segment.py +++ b/dimos/data/segment.py @@ -26,7 +26,7 @@ class SegmentProcessor: - def __init__(self, device='cuda'): + def __init__(self, device="cuda"): # Initialize CLIPSeg and SAM models self.clipseg = CLIPSeg(model_name="CIDAS/clipseg-rd64-refined", device=device) self.sam = SAM(model_name="facebook/sam-vit-huge", device=device) @@ -73,14 +73,20 @@ def process_frame(self, image, captions): mask = (255 * mask_tensor[0].numpy().squeeze()).astype(np.uint8) sam_masks.append(mask) else: - self.logger.info(f"No mask tensor returned for sampled points at index {idx}") - sam_masks.append(np.zeros((original_size[1], original_size[0]), dtype=np.uint8)) + self.logger.info( + f"No mask tensor returned for sampled points at index {idx}" + ) + sam_masks.append( + np.zeros((original_size[1], original_size[0]), dtype=np.uint8) + ) else: - self.logger.info(f"No sampled points for prediction index {idx}, skipping mask inference") + self.logger.info( + f"No sampled points for prediction index {idx}, skipping mask inference" + ) sam_masks.append(np.zeros((original_size[1], original_size[0]), dtype=np.uint8)) self.logger.info("DONE PROCESSING IMAGE ---------------------------------------") return sam_masks except Exception as e: self.logger.error(f"Error processing image: {e}") - return [] \ No newline at end of file + return [] diff --git a/dimos/environment/agent_environment.py b/dimos/environment/agent_environment.py index 76209f5c76..861a1f429b 100644 --- a/dimos/environment/agent_environment.py +++ b/dimos/environment/agent_environment.py @@ -18,6 +18,7 @@ from typing import List, Union from .environment import Environment + class AgentEnvironment(Environment): def __init__(self): super().__init__() @@ -69,13 +70,13 @@ def initialize_from_file(self, file_path: str) -> bool: cap = cv2.VideoCapture(file_path) self.frames = [] - + while cap.isOpened(): ret, frame = cap.read() if not ret: break self.frames.append(frame) - + cap.release() return len(self.frames) > 0 except Exception as e: @@ -92,8 +93,9 @@ def label_objects(self) -> List[str]: # TODO: Implement object labeling using a detection model raise NotImplementedError("Object labeling not yet implemented") - - def generate_segmentations(self, model: str = None, objects: List[str] = None, *args, **kwargs) -> List[np.ndarray]: + def generate_segmentations( + self, model: str = None, objects: List[str] = None, *args, **kwargs + ) -> List[np.ndarray]: """Generate segmentations for the current frame.""" # TODO: Implement segmentation generation using specified model raise NotImplementedError("Segmentation generation not yet implemented") @@ -115,7 +117,9 @@ def get_point_cloud(self, object: str = None) -> np.ndarray: return self._point_clouds[self.current_frame_idx] return np.array([]) - def generate_depth_map(self, stereo: bool = None, monocular: bool = None, model: str = None, *args, **kwargs) -> np.ndarray: + def generate_depth_map( + self, stereo: bool = None, monocular: bool = None, model: str = None, *args, **kwargs + ) -> np.ndarray: """Generate depth map for the current frame.""" # TODO: Implement depth map generation using specified method raise NotImplementedError("Depth map generation not yet implemented") diff --git a/dimos/environment/colmap_environment.py b/dimos/environment/colmap_environment.py index 1e22d6290b..9981e50098 100644 --- a/dimos/environment/colmap_environment.py +++ b/dimos/environment/colmap_environment.py @@ -19,6 +19,7 @@ from pathlib import Path from dimos.environment.environment import Environment + class COLMAPEnvironment(Environment): def initialize_from_images(self, image_dir): """Initialize the environment from a set of image frames or video.""" diff --git a/dimos/environment/environment.py b/dimos/environment/environment.py index a2d48b3b6d..0770b0f2ce 100644 --- a/dimos/environment/environment.py +++ b/dimos/environment/environment.py @@ -15,6 +15,7 @@ from abc import ABC, abstractmethod import numpy as np + class Environment(ABC): def __init__(self): self.environment_type = None @@ -24,7 +25,7 @@ def __init__(self): def label_objects(self) -> list[str]: """ Label all objects in the environment. - + Returns: A list of string labels representing the objects in the environment. """ @@ -34,9 +35,11 @@ def label_objects(self) -> list[str]: def get_visualization(self, format_type): """Return different visualization formats like images, NERFs, or other 3D file types.""" pass - + @abstractmethod - def generate_segmentations(self, model: str = None, objects: list[str] = None, *args, **kwargs) -> list[np.ndarray]: + def generate_segmentations( + self, model: str = None, objects: list[str] = None, *args, **kwargs + ) -> list[np.ndarray]: """ Generate object segmentations of objects[] using neural methods. @@ -66,7 +69,6 @@ def get_segmentations(self) -> list[np.ndarray]: """ pass - @abstractmethod def generate_point_cloud(self, object: str = None, *args, **kwargs) -> np.ndarray: """ @@ -102,7 +104,9 @@ def get_point_cloud(self, object: str = None) -> np.ndarray: pass @abstractmethod - def generate_depth_map(self, stereo: bool = None, monocular: bool = None, model: str = None, *args, **kwargs) -> np.ndarray: + def generate_depth_map( + self, stereo: bool = None, monocular: bool = None, model: str = None, *args, **kwargs + ) -> np.ndarray: """ Generate a depth map using monocular or stereo camera methods. @@ -166,5 +170,3 @@ def initialize_from_file(self, file_path): NotImplementedError: If the method is not implemented for this environment type. """ raise NotImplementedError("This method is not implemented for this environment type.") - - diff --git a/dimos/exceptions/agent_memory_exceptions.py b/dimos/exceptions/agent_memory_exceptions.py index 9b2ba35b2c..cbf3460754 100644 --- a/dimos/exceptions/agent_memory_exceptions.py +++ b/dimos/exceptions/agent_memory_exceptions.py @@ -14,26 +14,30 @@ import traceback + class AgentMemoryError(Exception): """ Base class for all exceptions raised by AgentMemory operations. All custom exceptions related to AgentMemory should inherit from this class. - + Args: message (str): Human-readable message describing the error. """ + def __init__(self, message="Error in AgentMemory operation"): super().__init__(message) + class AgentMemoryConnectionError(AgentMemoryError): """ Exception raised for errors attempting to connect to the database. This includes failures due to network issues, authentication errors, or incorrect connection parameters. - + Args: message (str): Human-readable message describing the error. cause (Exception, optional): Original exception, if any, that led to this error. """ + def __init__(self, message="Failed to connect to the database", cause=None): super().__init__(message) if cause: @@ -43,36 +47,42 @@ def __init__(self, message="Failed to connect to the database", cause=None): def __str__(self): return f"{self.message}\nCaused by: {repr(self.cause)}" if self.cause else self.message + class UnknownConnectionTypeError(AgentMemoryConnectionError): """ Exception raised when an unknown or unsupported connection type is specified during AgentMemory setup. - + Args: message (str): Human-readable message explaining that an unknown connection type was used. """ + def __init__(self, message="Unknown connection type used in AgentMemory connection"): super().__init__(message) + class DataRetrievalError(AgentMemoryError): """ Exception raised for errors retrieving data from the database. This could occur due to query failures, timeouts, or corrupt data issues. - + Args: message (str): Human-readable message describing the data retrieval error. """ + def __init__(self, message="Error in retrieving data during AgentMemory operation"): super().__init__(message) + class DataNotFoundError(DataRetrievalError): """ Exception raised when the requested data is not found in the database. This is used when a query completes successfully but returns no result for the specified identifier. - + Args: vector_id (int or str): The identifier for the vector that was not found. message (str, optional): Human-readable message providing more detail. If not provided, a default message is generated. """ + def __init__(self, vector_id, message=None): message = message or f"Requested data for vector ID {vector_id} was not found." super().__init__(message) diff --git a/dimos/hardware/camera.py b/dimos/hardware/camera.py index 8793a5dd0a..07c74ce508 100644 --- a/dimos/hardware/camera.py +++ b/dimos/hardware/camera.py @@ -14,8 +14,9 @@ from dimos.hardware.sensor import AbstractSensor + class Camera(AbstractSensor): - def __init__(self, resolution=None, focal_length=None, sensor_size=None, sensor_type='Camera'): + def __init__(self, resolution=None, focal_length=None, sensor_size=None, sensor_type="Camera"): super().__init__(sensor_type) self.resolution = resolution # (width, height) in pixels self.focal_length = focal_length # in millimeters @@ -41,10 +42,10 @@ def calculate_intrinsics(self): focal_length_y = self.focal_length / pixel_size_y return { - 'focal_length_x': focal_length_x, - 'focal_length_y': focal_length_y, - 'principal_point_x': principal_point_x, - 'principal_point_y': principal_point_y + "focal_length_x": focal_length_x, + "focal_length_y": focal_length_y, + "principal_point_x": principal_point_x, + "principal_point_y": principal_point_y, } def get_intrinsics(self): diff --git a/dimos/hardware/end_effector.py b/dimos/hardware/end_effector.py index fd2c130610..373408003d 100644 --- a/dimos/hardware/end_effector.py +++ b/dimos/hardware/end_effector.py @@ -12,6 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. + class EndEffector: def __init__(self, effector_type=None): self.effector_type = effector_type diff --git a/dimos/hardware/interface.py b/dimos/hardware/interface.py index 6c26608995..9d7797a569 100644 --- a/dimos/hardware/interface.py +++ b/dimos/hardware/interface.py @@ -15,10 +15,16 @@ from dimos.hardware.end_effector import EndEffector from dimos.hardware.camera import Camera from dimos.hardware.stereo_camera import StereoCamera -from dimos.hardware.ufactory import UFactoryEndEffector, UFactory7DOFArm +from dimos.hardware.ufactory import UFactory7DOFArm + class HardwareInterface: - def __init__(self, end_effector: EndEffector = None, sensors: list = None, arm_architecture: UFactory7DOFArm = None): + def __init__( + self, + end_effector: EndEffector = None, + sensors: list = None, + arm_architecture: UFactory7DOFArm = None, + ): self.end_effector = end_effector self.sensors = sensors if sensors is not None else [] self.arm_architecture = arm_architecture @@ -26,16 +32,16 @@ def __init__(self, end_effector: EndEffector = None, sensors: list = None, arm_a def get_configuration(self): """Return the current hardware configuration.""" return { - 'end_effector': self.end_effector, - 'sensors': [sensor.get_sensor_type() for sensor in self.sensors], - 'arm_architecture': self.arm_architecture + "end_effector": self.end_effector, + "sensors": [sensor.get_sensor_type() for sensor in self.sensors], + "arm_architecture": self.arm_architecture, } def set_configuration(self, configuration): """Set the hardware configuration.""" - self.end_effector = configuration.get('end_effector', self.end_effector) - self.sensors = configuration.get('sensors', self.sensors) - self.arm_architecture = configuration.get('arm_architecture', self.arm_architecture) + self.end_effector = configuration.get("end_effector", self.end_effector) + self.sensors = configuration.get("sensors", self.sensors) + self.arm_architecture = configuration.get("arm_architecture", self.arm_architecture) def add_sensor(self, sensor): """Add a sensor to the hardware interface.""" diff --git a/dimos/hardware/sensor.py b/dimos/hardware/sensor.py index ac5ff0ebaf..3dc7b3850e 100644 --- a/dimos/hardware/sensor.py +++ b/dimos/hardware/sensor.py @@ -14,6 +14,7 @@ from abc import ABC, abstractmethod + class AbstractSensor(ABC): def __init__(self, sensor_type=None): self.sensor_type = sensor_type diff --git a/dimos/hardware/stereo_camera.py b/dimos/hardware/stereo_camera.py index c81bc9ed18..4ffdc51811 100644 --- a/dimos/hardware/stereo_camera.py +++ b/dimos/hardware/stereo_camera.py @@ -14,6 +14,7 @@ from dimos.hardware.camera import Camera + class StereoCamera(Camera): def __init__(self, baseline=None, **kwargs): super().__init__(**kwargs) @@ -21,5 +22,5 @@ def __init__(self, baseline=None, **kwargs): def get_intrinsics(self): intrinsics = super().get_intrinsics() - intrinsics['baseline'] = self.baseline + intrinsics["baseline"] = self.baseline return intrinsics diff --git a/dimos/hardware/ufactory.py b/dimos/hardware/ufactory.py index cb81337a95..cf4e139ccb 100644 --- a/dimos/hardware/ufactory.py +++ b/dimos/hardware/ufactory.py @@ -14,6 +14,7 @@ from dimos.hardware.end_effector import EndEffector + class UFactoryEndEffector(EndEffector): def __init__(self, model=None, **kwargs): super().__init__(**kwargs) @@ -22,6 +23,7 @@ def __init__(self, model=None, **kwargs): def get_model(self): return self.model + class UFactory7DOFArm: def __init__(self, arm_length=None): self.arm_length = arm_length diff --git a/dimos/models/Detic/configs/BoxSup_ViLD_200e.py b/dimos/models/Detic/configs/BoxSup_ViLD_200e.py index eef46bc174..b0bc16c30b 100644 --- a/dimos/models/Detic/configs/BoxSup_ViLD_200e.py +++ b/dimos/models/Detic/configs/BoxSup_ViLD_200e.py @@ -20,10 +20,10 @@ from detic.modeling.roi_heads.detic_roi_heads import DeticCascadeROIHeads from detic.modeling.roi_heads.detic_fast_rcnn import DeticFastRCNNOutputLayers -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'] +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"]] @@ -35,7 +35,7 @@ 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") + conv_norm=lambda c: NaiveSyncBatchNorm(c, stats_mode="N"), ) for _ in range(1) ], @@ -50,28 +50,28 @@ cls_score=L(ZeroShotClassifier)( input_shape=ShapeSpec(channels=1024), num_classes=1203, - zs_weight_path='datasets/metadata/lvis_v1_clip_a+cname.npy', + 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' + 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] + 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)( +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) + dataset_dicts="${dataloader.train.dataset}", repeat_thresh=0.001 + ) ) image_size = 896 dataloader.train.mapper.augmentations = [ @@ -81,9 +81,9 @@ L(T.FixedSizeCrop)(crop_size=(image_size, image_size)), L(T.RandomFlip)(horizontal=True), ] -dataloader.train.num_workers=32 +dataloader.train.num_workers = 32 -dataloader.test.dataset.names="lvis_v1_val" +dataloader.test.dataset.names = "lvis_v1_val" dataloader.evaluator = L(LVISEvaluator)( dataset_name="${..test.dataset.names}", ) @@ -100,12 +100,10 @@ ) optimizer = L(torch.optim.AdamW)( - params=L(get_default_optimizer_params)( - weight_decay_norm=0.0 - ), + 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='./output/Lazy/{}'.format(os.path.basename(__file__)[:-3]) \ No newline at end of file +train.checkpointer.period = 20000 // num_nodes +train.output_dir = "./output/Lazy/{}".format(os.path.basename(__file__)[:-3]) diff --git a/dimos/models/Detic/configs/Detic_ViLD_200e.py b/dimos/models/Detic/configs/Detic_ViLD_200e.py index 7a98e28b5d..c0983e291c 100644 --- a/dimos/models/Detic/configs/Detic_ViLD_200e.py +++ b/dimos/models/Detic/configs/Detic_ViLD_200e.py @@ -5,7 +5,6 @@ import detectron2.data.transforms as T from detectron2.config import LazyCall as L from detectron2.layers import ShapeSpec -from detectron2.data.samplers import RepeatFactorTrainingSampler from detectron2.evaluation.lvis_evaluation import LVISEvaluator from detectron2.layers.batch_norm import NaiveSyncBatchNorm from detectron2.solver import WarmupParamScheduler @@ -25,12 +24,12 @@ from detic.data.custom_dataset_dataloader import MultiDatasetSampler from detic.data.custom_dataset_dataloader import get_detection_dataset_dicts_with_source -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'] +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' +train.init_checkpoint = "models/BoxSup_ViLD_200e.pth" [model.roi_heads.pop(k) for k in ["box_head", "box_predictor", "proposal_matcher"]] @@ -42,7 +41,7 @@ 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") + conv_norm=lambda c: NaiveSyncBatchNorm(c, stats_mode="N"), ) for _ in range(1) ], @@ -57,22 +56,21 @@ cls_score=L(ZeroShotClassifier)( input_shape=ShapeSpec(channels=1024), num_classes=1203, - zs_weight_path='datasets/metadata/lvis_v1_clip_a+cname.npy', + 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', + 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] + 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, @@ -90,35 +88,40 @@ 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'], + 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'], + dataset_ann=["box", "image"], use_diff_bs_size=True, - dataset_augs = [ - [L(T.ResizeScale)( + 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.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], + dataset_ratio=[1, 4], use_rfs=[True, False], dataset_ann="${dataloader.train.mapper.dataset_ann}", repeat_threshold=0.001, @@ -131,7 +134,7 @@ num_workers=8, ) -dataloader.test.dataset.names="lvis_v1_val" +dataloader.test.dataset.names = "lvis_v1_val" dataloader.evaluator = L(LVISEvaluator)( dataset_name="${..test.dataset.names}", ) @@ -144,12 +147,10 @@ ) optimizer = L(torch.optim.AdamW)( - params=L(get_default_optimizer_params)( - weight_decay_norm=0.0 - ), + 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='./output/Lazy/{}'.format(os.path.basename(__file__)[:-3]) \ No newline at end of file +train.checkpointer.period = 20000 // num_nodes +train.output_dir = "./output/Lazy/{}".format(os.path.basename(__file__)[:-3]) diff --git a/dimos/models/Detic/demo.py b/dimos/models/Detic/demo.py index 9221af2dd6..80efc99884 100755 --- a/dimos/models/Detic/demo.py +++ b/dimos/models/Detic/demo.py @@ -16,26 +16,28 @@ from detectron2.data.detection_utils import read_image from detectron2.utils.logger import setup_logger -sys.path.insert(0, 'third_party/CenterNet2/') +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): self.sct = mss.mss() m0 = self.sct.monitors[0] - self.monitor = {'top': 0, 'left': 0, 'width': m0['width'] / 2, 'height': m0['height'] / 2} + 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)) + img = np.array(self.sct.grab(self.monitor)) nf = cv2.cvtColor(img, cv2.COLOR_BGRA2BGR) return (True, nf) def isOpened(self): return True + def release(self): return True @@ -43,10 +45,11 @@ def release(self): # constants WINDOW_NAME = "Detic" + def setup_cfg(args): cfg = get_cfg() if args.cpu: - cfg.MODEL.DEVICE="cpu" + cfg.MODEL.DEVICE = "cpu" add_centernet_config(cfg) add_detic_config(cfg) cfg.merge_from_file(args.config_file) @@ -55,7 +58,7 @@ def setup_cfg(args): 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 + 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() @@ -71,23 +74,21 @@ def get_parser(): 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("--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'", + 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.", + 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'], + choices=["lvis", "openimages", "objects365", "coco", "custom"], help="", ) parser.add_argument( @@ -95,7 +96,7 @@ def get_parser(): default="", help="", ) - parser.add_argument("--pred_all_class", action='store_true') + parser.add_argument("--pred_all_class", action="store_true") parser.add_argument( "--confidence-threshold", type=float, diff --git a/dimos/models/Detic/detic/__init__.py b/dimos/models/Detic/detic/__init__.py index 8ffba6afd9..ecf772726e 100644 --- a/dimos/models/Detic/detic/__init__.py +++ b/dimos/models/Detic/detic/__init__.py @@ -16,4 +16,4 @@ try: from .modeling.meta_arch import d2_deformable_detr except: - pass \ No newline at end of file + pass diff --git a/dimos/models/Detic/detic/config.py b/dimos/models/Detic/detic/config.py index bbf6e58064..eb8882f3b2 100644 --- a/dimos/models/Detic/detic/config.py +++ b/dimos/models/Detic/detic/config.py @@ -1,48 +1,50 @@ # Copyright (c) Facebook, Inc. and its affiliates. from detectron2.config import CfgNode as CN + def add_detic_config(cfg): _C = cfg - _C.WITH_IMAGE_LABELS = False # Turn on co-training with classification data + _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.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_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.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_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_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 + _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.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" + _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 @@ -55,43 +57,43 @@ def add_detic_config(cfg): # Backbones _C.MODEL.SWIN = CN() - _C.MODEL.SWIN.SIZE = 'T' # 'T', 'S', 'B' + _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.SWIN.OUT_FEATURES = (1, 2, 3) # FPN stride 8 - 32 _C.MODEL.TIMM = CN() - _C.MODEL.TIMM.BASE_NAME = 'resnet50' + _C.MODEL.TIMM.BASE_NAME = "resnet50" _C.MODEL.TIMM.OUT_LEVELS = (3, 4, 5) - _C.MODEL.TIMM.NORM = 'FrozenBN' + _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.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.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 + _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.FROZEN_WEIGHTS = "" # For Segmentation _C.MODEL.DETR.GIOU_WEIGHT = 2.0 _C.MODEL.DETR.L1_WEIGHT = 5.0 _C.MODEL.DETR.DEEP_SUPERVISION = True @@ -113,12 +115,12 @@ def add_detic_config(cfg): _C.MODEL.DETR.USE_FED_LOSS = False _C.MODEL.DETR.WEAK_WEIGHT = 0.1 - _C.INPUT.CUSTOM_AUG = '' + _C.INPUT.CUSTOM_AUG = "" _C.INPUT.TRAIN_SIZE = 640 _C.INPUT.TEST_SIZE = 640 - _C.INPUT.SCALE_RANGE = (0.1, 2.) + _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.TEST_INPUT_TYPE = "default" _C.FIND_UNUSED_PARAM = True _C.EVAL_PRED_AR = False @@ -129,4 +131,4 @@ def add_detic_config(cfg): _C.FP16 = False _C.EVAL_AP_FIX = False _C.GEN_PSEDO_LABELS = False - _C.SAVE_DEBUG_PATH = 'output/save_debug/' \ No newline at end of file + _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 index 0284ae14ed..99eb08ed86 100644 --- a/dimos/models/Detic/detic/custom_solver.py +++ b/dimos/models/Detic/detic/custom_solver.py @@ -1,13 +1,13 @@ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -from enum import Enum import itertools -from typing import Any, Callable, Dict, Iterable, List, Set, Type, Union +from typing import Any, Dict, List, Set import torch from detectron2.config import CfgNode from detectron2.solver.build import maybe_add_gradient_clipping + def match_name_keywords(n, name_keywords): out = False for b in name_keywords: @@ -16,6 +16,7 @@ def match_name_keywords(n, name_keywords): break return out + def build_custom_optimizer(cfg: CfgNode, model: torch.nn.Module) -> torch.optim.Optimizer: """ Build an optimizer from config. @@ -37,10 +38,10 @@ def build_custom_optimizer(cfg: CfgNode, model: torch.nn.Module) -> torch.optim. 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) + print("Costum LR", key, lr) param = {"params": [value], "lr": lr} - if optimizer_type != 'ADAMW': - param['weight_decay'] = weight_decay + if optimizer_type != "ADAMW": + param["weight_decay"] = weight_decay params += [param] def maybe_add_full_model_gradient_clipping(optim): # optim: the optimizer class @@ -60,19 +61,16 @@ def step(self, closure=None): return FullModelGradientClippingOptimizer if enable else optim - - if optimizer_type == 'SGD': + 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 + params, cfg.SOLVER.BASE_LR, momentum=cfg.SOLVER.MOMENTUM, nesterov=cfg.SOLVER.NESTEROV ) - elif optimizer_type == 'ADAMW': + 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 + 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 \ No newline at end of file + return optimizer diff --git a/dimos/models/Detic/detic/data/custom_build_augmentation.py b/dimos/models/Detic/detic/data/custom_build_augmentation.py index 9642c15e58..cd2bba42c2 100644 --- a/dimos/models/Detic/detic/data/custom_build_augmentation.py +++ b/dimos/models/Detic/detic/data/custom_build_augmentation.py @@ -1,17 +1,11 @@ # Copyright (c) Facebook, Inc. and its affiliates. -import logging -import numpy as np -import pycocotools.mask as mask_util -import torch -from fvcore.common.file_io import PathManager -from PIL import Image from detectron2.data import transforms as T from .transforms.custom_augmentation_impl import EfficientDetResizeCrop -def build_custom_augmentation(cfg, is_train, scale=None, size=None, \ - min_size=None, max_size=None): + +def build_custom_augmentation(cfg, is_train, scale=None, size=None, min_size=None, max_size=None): """ Create a list of default :class:`Augmentation` from config. Now it includes resizing and flipping. @@ -19,7 +13,7 @@ def build_custom_augmentation(cfg, is_train, scale=None, size=None, \ Returns: list[Augmentation] """ - if cfg.INPUT.CUSTOM_AUG == 'ResizeShortestEdge': + 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 @@ -29,7 +23,7 @@ def build_custom_augmentation(cfg, is_train, scale=None, size=None, \ 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': + 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 @@ -48,4 +42,4 @@ def build_custom_augmentation(cfg, is_train, scale=None, size=None, \ build_custom_transform_gen = build_custom_augmentation """ Alias for backward-compatibility. -""" \ No newline at end of file +""" diff --git a/dimos/models/Detic/detic/data/custom_dataset_dataloader.py b/dimos/models/Detic/detic/data/custom_dataset_dataloader.py index 8f8d681770..bfbab55733 100644 --- a/dimos/models/Detic/detic/data/custom_dataset_dataloader.py +++ b/dimos/models/Detic/detic/data/custom_dataset_dataloader.py @@ -1,18 +1,12 @@ # 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) -import copy -import logging -import numpy as np import operator import torch import torch.utils.data -import json from detectron2.utils.comm import get_world_size -from detectron2.utils.logger import _log_api_usage, log_first_n from detectron2.config import configurable -from detectron2.data import samplers -from torch.utils.data.sampler import BatchSampler, Sampler +from torch.utils.data.sampler import Sampler from detectron2.data.common import DatasetFromList, MapDataset from detectron2.data.dataset_mapper import DatasetMapper from detectron2.data.build import get_detection_dataset_dicts, build_batch_data_loader @@ -31,12 +25,13 @@ def _custom_train_loader_from_config(cfg, mapper=None, *, dataset=None, sampler=None): sampler_name = cfg.DATALOADER.SAMPLER_TRAIN - if 'MultiDataset' in sampler_name: + 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, + if cfg.MODEL.KEYPOINT_ON + else 0, proposal_files=cfg.DATASETS.PROPOSAL_FILES_TRAIN if cfg.MODEL.LOAD_PROPOSALS else None, ) else: @@ -44,7 +39,8 @@ def _custom_train_loader_from_config(cfg, mapper=None, *, dataset=None, sampler= 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, + if cfg.MODEL.KEYPOINT_ON + else 0, proposal_files=cfg.DATASETS.PROPOSAL_FILES_TRAIN if cfg.MODEL.LOAD_PROPOSALS else None, ) @@ -58,10 +54,10 @@ def _custom_train_loader_from_config(cfg, mapper=None, *, dataset=None, sampler= 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, + 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( @@ -78,24 +74,27 @@ def _custom_train_loader_from_config(cfg, mapper=None, *, dataset=None, sampler= "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) + "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=16, - aspect_ratio_grouping=True, - num_workers=0, - num_datasets=1, - multi_dataset_grouping=False, - use_diff_bs_size=False, - dataset_bs=[] - ): + dataset, + *, + mapper, + sampler, + total_batch_size=16, + aspect_ratio_grouping=True, + num_workers=0, + num_datasets=1, + multi_dataset_grouping=False, + use_diff_bs_size=False, + dataset_bs=[], +): """ Modified from detectron2.data.build.build_custom_train_loader, but supports different samplers @@ -128,16 +127,14 @@ def build_custom_train_loader( def build_multi_dataset_batch_data_loader( - use_diff_bs_size, dataset_bs, - dataset, sampler, total_batch_size, num_datasets, num_workers=0 + use_diff_bs_size, dataset_bs, dataset, sampler, total_batch_size, num_datasets, num_workers=0 ): - """ - """ + """ """ world_size = get_world_size() - assert ( - total_batch_size > 0 and total_batch_size % world_size == 0 - ), "Total batch size ({}) must be divisible by the number of gpus ({}).".format( - total_batch_size, world_size + assert total_batch_size > 0 and total_batch_size % world_size == 0, ( + "Total batch size ({}) must be divisible by the number of gpus ({}).".format( + total_batch_size, world_size + ) ) batch_size = total_batch_size // world_size @@ -150,11 +147,9 @@ def build_multi_dataset_batch_data_loader( worker_init_fn=worker_init_reset_seed, ) # yield individual mapped dict if use_diff_bs_size: - return DIFFMDAspectRatioGroupedDataset( - data_loader, dataset_bs, num_datasets) + return DIFFMDAspectRatioGroupedDataset(data_loader, dataset_bs, num_datasets) else: - return MDAspectRatioGroupedDataset( - data_loader, batch_size, num_datasets) + return MDAspectRatioGroupedDataset(data_loader, batch_size, num_datasets) def get_detection_dataset_dicts_with_source( @@ -164,12 +159,11 @@ def get_detection_dataset_dicts_with_source( dataset_dicts = [DatasetCatalog.get(dataset_name) for dataset_name in dataset_names] for dataset_name, dicts in zip(dataset_names, dataset_dicts): assert len(dicts), "Dataset '{}' is empty!".format(dataset_name) - - for source_id, (dataset_name, dicts) in \ - enumerate(zip(dataset_names, dataset_dicts)): + + for source_id, (dataset_name, dicts) in enumerate(zip(dataset_names, dataset_dicts)): assert len(dicts), "Dataset '{}' is empty!".format(dataset_name) for d in dicts: - d['dataset_source'] = source_id + d["dataset_source"] = source_id if "annotations" in dicts[0]: try: @@ -194,49 +188,50 @@ def get_detection_dataset_dicts_with_source( class MultiDatasetSampler(Sampler): def __init__( - self, - dataset_dicts, + self, + dataset_dicts, dataset_ratio, use_rfs, dataset_ann, repeat_threshold=0.001, seed: Optional[int] = None, - ): - """ - """ + ): + """ """ sizes = [0 for _ in range(len(dataset_ratio))] for d in dataset_dicts: - sizes[d['dataset_source']] += 1 - print('dataset sizes', sizes) + sizes[d["dataset_source"]] += 1 + print("dataset sizes", sizes) self.sizes = sizes - assert len(dataset_ratio) == len(sizes), \ - 'length of dataset ratio {} should be equal to number if dataset {}'.format( + assert len(dataset_ratio) == len(sizes), ( + "length of dataset ratio {} should be equal to number if dataset {}".format( len(dataset_ratio), 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))] + 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)) + ] 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': + 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_func(dataset_dicts[st : st + s], repeat_thresh=repeat_threshold) rfs_factor = rfs_factor * (s / rfs_factor.sum()) else: rfs_factor = torch.ones(s) @@ -249,26 +244,22 @@ def __init__( def __iter__(self): start = self._rank - yield from itertools.islice( - self._infinite_indices(), start, None, self._world_size) - + 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))] + 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))] yield from ids class MDAspectRatioGroupedDataset(torch.utils.data.IterableDataset): def __init__(self, dataset, batch_size, num_datasets): - """ - """ + """ """ self.dataset = dataset self.batch_size = batch_size self._buckets = [[] for _ in range(2 * num_datasets)] @@ -277,7 +268,7 @@ def __iter__(self): 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_id = d["dataset_source"] * 2 + aspect_ratio_bucket_id bucket = self._buckets[bucket_id] bucket.append(d) if len(bucket) == self.batch_size: @@ -287,8 +278,7 @@ def __iter__(self): class DIFFMDAspectRatioGroupedDataset(torch.utils.data.IterableDataset): def __init__(self, dataset, batch_sizes, num_datasets): - """ - """ + """ """ self.dataset = dataset self.batch_sizes = batch_sizes self._buckets = [[] for _ in range(2 * num_datasets)] @@ -297,20 +287,19 @@ def __iter__(self): 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_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']]: + 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'] + cat_ids = dataset_dict["pos_category_ids"] for cat_id in cat_ids: category_freq[cat_id] += 1 num_images = len(dataset_dicts) @@ -324,8 +313,8 @@ def repeat_factors_from_tag_frequency(dataset_dicts, repeat_thresh): rep_factors = [] for dataset_dict in dataset_dicts: - cat_ids = dataset_dict['pos_category_ids'] + 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) \ No newline at end of file + 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 index c7727dded3..ed8e6ade59 100644 --- a/dimos/models/Detic/detic/data/custom_dataset_mapper.py +++ b/dimos/models/Detic/detic/data/custom_dataset_mapper.py @@ -2,36 +2,34 @@ import copy import logging import numpy as np -from typing import List, Optional, Union import torch -import pycocotools.mask as mask_util from detectron2.config import configurable from detectron2.data import detection_utils as utils -from detectron2.data.detection_utils import transform_keypoint_annotations from detectron2.data import transforms as T from detectron2.data.dataset_mapper import DatasetMapper -from detectron2.structures import Boxes, BoxMode, Instances -from detectron2.structures import Keypoints, PolygonMasks, BitMasks -from fvcore.transforms.transform import TransformList 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, + def __init__( + self, + is_train: bool, with_ann_type=False, dataset_ann=[], use_diff_bs_size=False, dataset_augs=[], is_debug=False, use_tar_dataset=False, - tarfile_path='', - tar_index_dir='', - **kwargs): + tarfile_path="", + tar_index_dir="", + **kwargs, + ): """ add image labels """ @@ -43,40 +41,42 @@ def __init__(self, is_train: bool, self.is_debug = is_debug self.use_tar_dataset = use_tar_dataset if self.use_tar_dataset: - print('Using 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': + 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)] + ret["dataset_augs"] = [ + build_custom_augmentation(cfg, True, scale, size) + for scale, size in zip(dataset_scales, dataset_sizes) + ] else: - assert cfg.INPUT.CUSTOM_AUG == 'ResizeShortestEdge' + 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)] + ret["dataset_augs"] = [ + build_custom_augmentation(cfg, True, min_size=mi, max_size=ma) + for mi, ma in zip(min_sizes, max_sizes) + ] else: - ret['dataset_augs'] = [] + ret["dataset_augs"] = [] return ret @@ -86,9 +86,8 @@ def __call__(self, dataset_dict): """ 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) + 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) @@ -97,30 +96,29 @@ def __call__(self, dataset_dict): # 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) + 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_dict["dataset_source"] = 0 - not_full_labeled = 'dataset_source' in dataset_dict and \ - self.with_ann_type and \ - self.dataset_ann[dataset_dict['dataset_source']] != 'box' + not_full_labeled = ( + "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) + 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))) - + 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")) @@ -128,8 +126,7 @@ def __call__(self, dataset_dict): # 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 + dataset_dict, image_shape, transforms, proposal_topk=self.proposal_topk ) if not self.is_train: @@ -148,37 +145,41 @@ def __call__(self, dataset_dict): # 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)) + ( + 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() - ))] + 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): - """ - """ + """ """ if is_train: min_size = cfg.INPUT.MIN_SIZE_TRAIN max_size = cfg.INPUT.MAX_SIZE_TRAIN @@ -188,7 +189,9 @@ def build_transform_gen(cfg, is_train): max_size = cfg.INPUT.MAX_SIZE_TEST sample_style = "choice" if sample_style == "range": - assert len(min_size) == 2, "more than 2 ({}) min_size(s) are provided for ranges".format(len(min_size)) + assert len(min_size) == 2, "more than 2 ({}) min_size(s) are provided for ranges".format( + len(min_size) + ) logger = logging.getLogger(__name__) tfm_gens = [] @@ -223,7 +226,9 @@ def __init__(self, cfg, is_train=True): self.mask_on = cfg.MODEL.MASK_ON self.tfm_gens = build_transform_gen(cfg, is_train) logging.getLogger(__name__).info( - "Full TransformGens used in training: {}, crop: {}".format(str(self.tfm_gens), str(self.crop_gen)) + "Full TransformGens used in training: {}, crop: {}".format( + str(self.tfm_gens), str(self.crop_gen) + ) ) self.img_format = cfg.INPUT.FORMAT @@ -277,4 +282,4 @@ def __call__(self, dataset_dict): ] instances = utils.annotations_to_instances(annos, image_shape) dataset_dict["instances"] = utils.filter_empty_instances(instances) - return dataset_dict \ No newline at end of file + return dataset_dict diff --git a/dimos/models/Detic/detic/data/datasets/cc.py b/dimos/models/Detic/detic/data/datasets/cc.py index 7c3e50726f..706db88415 100644 --- a/dimos/models/Detic/detic/data/datasets/cc.py +++ b/dimos/models/Detic/detic/data/datasets/cc.py @@ -1,8 +1,6 @@ # Copyright (c) Facebook, Inc. and its affiliates. -import logging import os -from detectron2.data.datasets.builtin_meta import _get_builtin_metadata from detectron2.data.datasets.lvis import get_lvis_instances_meta from .lvis_v1 import custom_register_lvis_instances @@ -10,14 +8,12 @@ "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'), + 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 index aee895de41..caf169adc9 100644 --- a/dimos/models/Detic/detic/data/datasets/coco_zeroshot.py +++ b/dimos/models/Detic/detic/data/datasets/coco_zeroshot.py @@ -6,98 +6,120 @@ 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'}, + {"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'}, + {"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} + 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} + 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_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} + "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'), + "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(): @@ -110,12 +132,16 @@ def _get_metadata(cat): _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"),} + "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'), + _get_builtin_metadata("coco"), os.path.join("datasets", json_file) if "://" not in json_file else json_file, os.path.join("datasets", image_root), - ) \ No newline at end of file + ) diff --git a/dimos/models/Detic/detic/data/datasets/imagenet.py b/dimos/models/Detic/detic/data/datasets/imagenet.py index 9b6d78e51f..9b893a704e 100644 --- a/dimos/models/Detic/detic/data/datasets/imagenet.py +++ b/dimos/models/Detic/detic/data/datasets/imagenet.py @@ -1,35 +1,40 @@ # 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 .lvis_v1 import custom_load_lvis_json, get_lvis_22k_meta + + def custom_register_imagenet_instances(name, metadata, json_file, image_root): - """ - """ - DatasetCatalog.register(name, lambda: custom_load_lvis_json( - json_file, image_root, name)) + """ """ + 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 + 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"), + "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'), + 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"), + "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(): @@ -38,4 +43,4 @@ def custom_register_imagenet_instances(name, metadata, json_file, image_root): get_lvis_22k_meta(), os.path.join("datasets", json_file) if "://" not in json_file else json_file, os.path.join("datasets", image_root), - ) \ No newline at end of file + ) diff --git a/dimos/models/Detic/detic/data/datasets/lvis_22k_categories.py b/dimos/models/Detic/detic/data/datasets/lvis_22k_categories.py index 9525f0873d..2e10b5dd23 100644 --- a/dimos/models/Detic/detic/data/datasets/lvis_22k_categories.py +++ b/dimos/models/Detic/detic/data/datasets/lvis_22k_categories.py @@ -1 +1,22383 @@ -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'}] # noqa \ No newline at end of file +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"}, +] # noqa diff --git a/dimos/models/Detic/detic/data/datasets/lvis_v1.py b/dimos/models/Detic/detic/data/datasets/lvis_v1.py index 4b9b279f17..3eb88bb4a1 100644 --- a/dimos/models/Detic/detic/data/datasets/lvis_v1.py +++ b/dimos/models/Detic/detic/data/datasets/lvis_v1.py @@ -14,23 +14,20 @@ def custom_register_lvis_instances(name, metadata, json_file, image_root): - """ - """ - DatasetCatalog.register(name, lambda: custom_load_lvis_json( - json_file, image_root, name)) + """ """ + 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 + json_file=json_file, image_root=image_root, evaluator_type="lvis", **metadata ) def custom_load_lvis_json(json_file, image_root, dataset_name=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) @@ -38,75 +35,74 @@ def custom_load_lvis_json(json_file, image_root, dataset_name=None): timer = Timer() lvis_api = LVIS(json_file) if timer.seconds() > 1: - logger.info("Loading {} takes {:.2f} seconds.".format( - json_file, timer.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 + logger.info("Loading {} takes {:.2f} seconds.".format(json_file, timer.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), \ - "Annotation ids in '{}' are not unique".format(json_file) + assert len(set(ann_ids)) == len(ann_ids), "Annotation ids in '{}' are not unique".format( + json_file + ) imgs_anns = list(zip(imgs, anns)) - logger.info("Loaded {} images in the LVIS v1 format from {}".format( - len(imgs_anns), json_file)) + logger.info("Loaded {} images in the LVIS v1 format from {}".format(len(imgs_anns), json_file)) dataset_dicts = [] - for (img_dict, anno_dict_list) in imgs_anns: + 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: + 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'] - + 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["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'] + 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: + 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: + 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] + 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') + print("Annotation contains an invalid polygon with < 3 points") assert len(segm) > 0 obj["segmentation"] = segm objs.append(obj) @@ -115,6 +111,7 @@ def custom_load_lvis_json(json_file, image_root, dataset_name=None): 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"), @@ -132,16 +129,18 @@ def custom_load_lvis_json(json_file, image_root, dataset_name=None): 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" + 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"), } @@ -152,4 +151,4 @@ def get_lvis_22k_meta(): get_lvis_22k_meta(), os.path.join("datasets", json_file) if "://" not in json_file else json_file, os.path.join("datasets", image_root), - ) \ No newline at end of file + ) diff --git a/dimos/models/Detic/detic/data/datasets/objects365.py b/dimos/models/Detic/detic/data/datasets/objects365.py index b98128738b..6e0a45044e 100644 --- a/dimos/models/Detic/detic/data/datasets/objects365.py +++ b/dimos/models/Detic/detic/data/datasets/objects365.py @@ -370,395 +370,405 @@ # {'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 '}, + {"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} + 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']))} + 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} + "thing_classes": thing_classes, + } _PREDEFINED_SPLITS_OBJECTS365 = { - "objects365_v2_train": ("objects365/train", "objects365/annotations/zhiyuan_objv2_train_fixname_fixmiss.json"), + "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"), + "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(): @@ -767,4 +777,4 @@ def _get_builtin_metadata(): _get_builtin_metadata(), os.path.join("datasets", json_file) if "://" not in json_file else json_file, os.path.join("datasets", image_root), - ) \ No newline at end of file + ) diff --git a/dimos/models/Detic/detic/data/datasets/oid.py b/dimos/models/Detic/detic/data/datasets/oid.py index 90d7f8613e..d3a6fd14b2 100644 --- a/dimos/models/Detic/detic/data/datasets/oid.py +++ b/dimos/models/Detic/detic/data/datasets/oid.py @@ -4,516 +4,518 @@ import os 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'}, + {"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): - id_to_name = {x['id']: x['name'] for x in cats} + id_to_name = {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'])] + 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} + "thing_classes": thing_classes, + } + _PREDEFINED_SPLITS_OID = { # cat threshold: 500, 1500: r 170, c 151, f 179 @@ -521,8 +523,14 @@ def _get_builtin_metadata(cats): # "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"), + "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", + ), } @@ -532,4 +540,4 @@ def _get_builtin_metadata(cats): _get_builtin_metadata(categories), os.path.join("datasets", json_file) if "://" not in json_file else json_file, os.path.join("datasets", image_root), - ) \ No newline at end of file + ) diff --git a/dimos/models/Detic/detic/data/datasets/register_oid.py b/dimos/models/Detic/detic/data/datasets/register_oid.py index bd281f53f0..59a4da9ab7 100644 --- a/dimos/models/Detic/detic/data/datasets/register_oid.py +++ b/dimos/models/Detic/detic/data/datasets/register_oid.py @@ -1,19 +1,14 @@ # 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 copy import io import logging import contextlib import os -import datetime -import json -import numpy as np -from PIL import Image from fvcore.common.timer import Timer -from fvcore.common.file_io import PathManager, file_lock -from detectron2.structures import BoxMode, PolygonMasks, Boxes +from fvcore.common.file_io import PathManager +from detectron2.structures import BoxMode from detectron2.data import DatasetCatalog, MetadataCatalog logger = logging.getLogger(__name__) @@ -25,13 +20,10 @@ __all__ = ["register_coco_instances", "register_coco_panoptic_separated"] - def register_oid_instances(name, metadata, json_file, image_root): - """ - """ + """ """ # 1. register a function which returns dicts - DatasetCatalog.register(name, lambda: load_coco_json_mem_efficient( - json_file, image_root, name)) + 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 @@ -40,7 +32,9 @@ def register_oid_instances(name, metadata, json_file, image_root): ) -def load_coco_json_mem_efficient(json_file, image_root, dataset_name=None, extra_annotation_keys=None): +def load_coco_json_mem_efficient( + json_file, image_root, dataset_name=None, extra_annotation_keys=None +): """ Actually not mem efficient """ @@ -88,9 +82,8 @@ def load_coco_json_mem_efficient(json_file, image_root, dataset_name=None, extra 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']] + 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: @@ -117,6 +110,6 @@ def load_coco_json_mem_efficient(json_file, image_root, dataset_name=None, extra objs.append(obj) record["annotations"] = objs dataset_dicts.append(record) - + del coco_api - return dataset_dicts \ No newline at end of file + return dataset_dicts diff --git a/dimos/models/Detic/detic/data/tar_dataset.py b/dimos/models/Detic/detic/data/tar_dataset.py index 0605ba3a96..323ef7dbb1 100644 --- a/dimos/models/Detic/detic/data/tar_dataset.py +++ b/dimos/models/Detic/detic/data/tar_dataset.py @@ -15,12 +15,15 @@ # UnidentifiedImageError isn't available in older versions of PIL unidentified_error_available = False + class DiskTarDataset(Dataset): - def __init__(self, - tarfile_path='dataset/imagenet/ImageNet-21k/metadata/tar_files.npy', - tar_index_dir='dataset/imagenet/ImageNet-21k/metadata/tarindex_npy', - preload=False, - num_synsets="all"): + def __init__( + self, + tarfile_path="dataset/imagenet/ImageNet-21k/metadata/tar_files.npy", + tar_index_dir="dataset/imagenet/ImageNet-21k/metadata/tarindex_npy", + preload=False, + num_synsets="all", + ): """ - preload (bool): Recommend to set preload to False when using - num_synsets (integer or string "all"): set to small number for debugging @@ -45,8 +48,10 @@ def __init__(self, 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 + 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 @@ -62,7 +67,9 @@ def __getitem__(self, index): 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}" + 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: @@ -74,7 +81,7 @@ def __getitem__(self, index): try: image = Image.open(data_bytes).convert("RGB") except exception_to_catch: - image = Image.fromarray(np.ones((224,224,3), dtype=np.uint8)*128) + image = Image.fromarray(np.ones((224, 224, 3), dtype=np.uint8) * 128) d_index = -1 # label is the dataset (synset) we indexed into @@ -84,8 +91,8 @@ def __repr__(self): st = f"DiskTarDataset(subdatasets={len(self.dataset_lens)},samples={self.num_samples})" return st -class _TarDataset(object): +class _TarDataset(object): def __init__(self, filename, npy_index_dir, preload=False): # translated from # fbcode/experimental/deeplearning/matthijs/comp_descs/tardataset.lua @@ -97,12 +104,11 @@ def __init__(self, filename, npy_index_dir, preload=False): self.num_samples = len(names) if preload: - self.data = np.memmap(filename, mode='r', dtype='uint8') + self.data = np.memmap(filename, mode="r", dtype="uint8") self.offsets = offsets else: self.data = None - def __len__(self): return self.num_samples @@ -115,24 +121,24 @@ def load_index(self): def __getitem__(self, idx): if self.data is None: - self.data = np.memmap(self.filename, mode='r', dtype='uint8') + 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] + data = self.data[ofs : ofs + fsize] - if data[:13].tostring() == '././@LongLink': - data = data[3 * 512:] + 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): + if tuple(data[:2]) == (0x1F, 0x8B): s = io.BytesIO(data.tostring()) - g = gzip.GzipFile(None, 'r', 0, s) + g = gzip.GzipFile(None, "r", 0, s) sdata = g.read() else: sdata = data.tostring() - return io.BytesIO(sdata) \ No newline at end of file + 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 index 47bef39566..895eebab79 100644 --- a/dimos/models/Detic/detic/data/transforms/custom_augmentation_impl.py +++ b/dimos/models/Detic/detic/data/transforms/custom_augmentation_impl.py @@ -1,18 +1,9 @@ # -*- coding: utf-8 -*- # 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 +# 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 import numpy as np -import sys -from fvcore.transforms.transform import ( - BlendTransform, - CropTransform, - HFlipTransform, - NoOpTransform, - Transform, - VFlipTransform, -) from PIL import Image from detectron2.data.transforms.augmentation import Augmentation @@ -22,17 +13,15 @@ "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, scale, interp=Image.BILINEAR - ): - """ - """ + def __init__(self, size, scale, interp=Image.BILINEAR): + """ """ super().__init__() self.target_size = (size, size) self.scale = scale @@ -57,4 +46,5 @@ def get_transform(self, img): 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) + 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 index 3cc28b6b31..a451c0ee85 100644 --- a/dimos/models/Detic/detic/data/transforms/custom_transform.py +++ b/dimos/models/Detic/detic/data/transforms/custom_transform.py @@ -1,17 +1,13 @@ # -*- coding: utf-8 -*- # 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 +# 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 import numpy as np import torch import torch.nn.functional as F from fvcore.transforms.transform import ( - CropTransform, - HFlipTransform, - NoOpTransform, Transform, - TransformList, ) from PIL import Image @@ -25,12 +21,11 @@ "EfficientDetResizeCropTransform", ] + class EfficientDetResizeCropTransform(Transform): - """ - """ + """ """ - def __init__(self, scaled_h, scaled_w, offset_y, offset_x, img_scale, \ - target_size, interp=None): + def __init__(self, scaled_h, scaled_w, offset_y, offset_x, img_scale, target_size, interp=None): """ Args: h, w (int): original image size @@ -54,9 +49,9 @@ def apply_image(self, img, interp=None): 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] + ret = ret[self.offset_y : lower, self.offset_x : right] else: - ret = ret[..., self.offset_y: lower, self.offset_x: right, :] + ret = ret[..., self.offset_y : lower, self.offset_x : right, :] else: # PIL only supports uint8 img = torch.from_numpy(img) @@ -71,12 +66,11 @@ def apply_image(self, img, interp=None): 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] + ret = ret[self.offset_y : lower, self.offset_x : right] else: - ret = ret[..., self.offset_y: lower, self.offset_x: right, :] + 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 @@ -84,16 +78,13 @@ def apply_coords(self, coords): 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 @@ -101,14 +92,12 @@ def inverse_apply_coords(self, coords): 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 \ No newline at end of file + 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 index 2ea1d5e570..b4bbc9fc94 100644 --- a/dimos/models/Detic/detic/evaluation/custom_coco_eval.py +++ b/dimos/models/Detic/detic/evaluation/custom_coco_eval.py @@ -1,36 +1,19 @@ # Copyright (c) Facebook, Inc. and its affiliates. -import contextlib -import copy -import io import itertools -import json -import logging import numpy as np -import os -import pickle -from collections import OrderedDict -import pycocotools.mask as mask_util -import torch -from pycocotools.coco import COCO -from pycocotools.cocoeval import COCOeval from tabulate import tabulate -import detectron2.utils.comm as comm -from detectron2.config import CfgNode -from detectron2.data import MetadataCatalog -from detectron2.data.datasets.coco import convert_to_coco_json from detectron2.evaluation.coco_evaluation import COCOEvaluator -from detectron2.structures import Boxes, BoxMode, pairwise_iou -from detectron2.utils.file_io import PathManager from detectron2.utils.logger import create_small_table from ..data.datasets.coco_zeroshot import categories_seen, categories_unseen + class CustomCOCOEvaluator(COCOEvaluator): def _derive_coco_results(self, coco_eval, iou_type, class_names=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"], @@ -60,8 +43,8 @@ def _derive_coco_results(self, coco_eval, iou_type, class_names=None): # 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]) + 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 = [] @@ -95,7 +78,6 @@ def _derive_coco_results(self, coco_eval, iou_type, class_names=None): ) self._logger.info("Per-category {} AP: \n".format(iou_type) + 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)]) @@ -111,14 +93,18 @@ def _derive_coco_results(self, coco_eval, iou_type, class_names=None): "Seen {} AP50: {}".format( iou_type, sum(results_per_category50_seen) / len(results_per_category50_seen), - )) + ) + ) self._logger.info( "Unseen {} AP50: {}".format( iou_type, 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 \ No newline at end of file + 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 index e60125aec2..d52a151371 100644 --- a/dimos/models/Detic/detic/evaluation/oideval.py +++ b/dimos/models/Detic/detic/evaluation/oideval.py @@ -8,7 +8,7 @@ # 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. -import os +import os import datetime import logging import itertools @@ -32,54 +32,59 @@ from detectron2.utils.logger import create_small_table from detectron2.evaluation import DatasetEvaluator + 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 + """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="bbox", expand_pred_label=False, - oid_hierarchy_path='./datasets/oid/annotations/challenge-2019-label500-hierarchy.json'): + self, + lvis_gt, + lvis_dt, + iou_type="bbox", + expand_pred_label=False, + oid_hierarchy_path="./datasets/oid/annotations/challenge-2019-label500-hierarchy.json", + ): """Constructor for OIDEval. Args: lvis_gt (LVIS class instance, or str containing path of annotation file) @@ -108,46 +113,49 @@ def __init__( raise TypeError("Unsupported type {} of lvis_dt.".format(lvis_dt)) if expand_pred_label: - oid_hierarchy = json.load(open(oid_hierarchy_path, 'r')) - cat_info = self.lvis_gt.dataset['categories'] - freebase2id = {x['freebase_id']: x['id'] for x in cat_info} - id2freebase = {x['id']: x['freebase_id'] for x in cat_info} - id2name = {x['id']: x['name'] for x in cat_info} - + oid_hierarchy = json.load(open(oid_hierarchy_path, "r")) + cat_info = self.lvis_gt.dataset["categories"] + freebase2id = {x["freebase_id"]: x["id"] for x in cat_info} + id2freebase = {x["id"]: x["freebase_id"] for x in cat_info} + id2name = {x["id"]: x["name"] for x in cat_info} + fas = defaultdict(set) + def dfs(hierarchy, cur_id): all_childs = set() all_keyed_child = {} - if 'Subcategory' in hierarchy: - for x in hierarchy['Subcategory']: - childs = dfs(x, freebase2id[x['LabelName']]) + 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'] + 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 + 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 + 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 @@ -199,7 +207,7 @@ def _prepare(self): # 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]: @@ -230,7 +238,7 @@ def evaluate(self): } # loop through images, area range, max detection number - print('Evaluating ...') + print("Evaluating ...") self.eval_imgs = [ self.evaluate_img_google(img_id, cat_id, area_rng) for cat_id in cat_ids @@ -247,16 +255,8 @@ def _get_gt_dt(self, img_id, cat_id): 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] - ] + 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): @@ -270,7 +270,7 @@ def compute_iou(self, img_id, cat_id): 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] + iscrowd = [int("iscrowd" in g and g["iscrowd"] > 0) for g in gt] if self.params.iou_type == "segm": ann_type = "segmentation" @@ -290,7 +290,7 @@ 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, @@ -300,13 +300,11 @@ def evaluate_img_google(self, img_id, cat_id, area_rng): "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) + "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] + 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: @@ -318,7 +316,7 @@ def evaluate_img_google(self, img_id, cat_id, area_rng): 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]) + 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) @@ -329,9 +327,9 @@ def compute_match_iou(iou): 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]) + 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 @@ -339,14 +337,13 @@ def compute_match_iou(iou): 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) + 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]) + 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]) @@ -365,22 +362,23 @@ def compute_match_ioa(ioa): 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) + valid_entries = ~is_matched_to_group_of - scores = np.concatenate( - (scores[valid_entries], scores_box_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)) - + (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_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) + "dt_ignore": np.array([0 for x in scores], dtype=np.int32).reshape(1, -1), + "num_gt": len(gt), } def accumulate(self): @@ -405,9 +403,7 @@ def accumulate(self): num_imgs = len(self.params.img_ids) # -1 for absent categories - precision = -np.ones( - (num_thrs, num_recalls, num_cats, num_area_rngs) - ) + 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 @@ -422,12 +418,9 @@ def accumulate(self): 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) - ] + 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 not e is None] + E = [e for e in E if e is not None] if len(E) == 0: continue @@ -437,7 +430,7 @@ def accumulate(self): 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]) + num_gt = sum([e["num_gt"] for e in E]) if num_gt == 0: continue @@ -456,11 +449,9 @@ def accumulate(self): 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 - ] + recall[iou_thr_idx, cat_idx, area_idx] = rc[-1] else: recall[iou_thr_idx, cat_idx, area_idx] = 0 @@ -473,8 +464,8 @@ def accumulate(self): pr[i - 1] = pr[i] mAP = compute_average_precision( - np.array(pr, np.float).reshape(-1), - np.array(rc, np.float).reshape(-1)) + 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 = { @@ -501,7 +492,7 @@ def summarize(self): raise RuntimeError("Please run accumulate() first.") max_dets = self.params.max_dets - self.results["AP50"] = self._summarize('ap') + self.results["AP50"] = self._summarize("ap") def run(self): """Wrapper function which calculates the results.""" @@ -522,12 +513,10 @@ def print_results(self): _type = "(AR)" if len(key) > 2 and key[2].isdigit(): - iou_thr = (float(key[2:]) / 100) + iou_thr = float(key[2:]) / 100 iou = "{:0.2f}".format(iou_thr) else: - iou = "{:0.2f}:{:0.2f}".format( - self.params.iou_thrs[0], self.params.iou_thrs[-1] - ) + iou = "{:0.2f}:{:0.2f}".format(self.params.iou_thrs[0], self.params.iou_thrs[-1]) cat_group_name = "all" area_rng = "all" @@ -555,7 +544,7 @@ def __init__(self, iou_type): self.max_dets = 1000 self.area_rng = [ - [0 ** 2, 1e5 ** 2], + [0**2, 1e5**2], ] self.area_rng_lbl = ["all"] self.use_cats = 1 @@ -586,8 +575,7 @@ def process(self, inputs, outputs): for input, output in zip(inputs, outputs): prediction = {"image_id": input["image_id"]} instances = output["instances"].to(self._cpu_device) - prediction["instances"] = instances_to_coco_json( - instances, input["image_id"]) + prediction["instances"] = instances_to_coco_json(instances, input["image_id"]) self._predictions.append(prediction) def evaluate(self): @@ -604,16 +592,14 @@ def evaluate(self): return {} self._logger.info("Preparing results in the OID format ...") - self._oid_results = list( - itertools.chain(*[x["instances"] for x in self._predictions])) + 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") + file_path = os.path.join(self._output_dir, "oid_instances_results.json") self._logger.info("Saving results to {}".format(file_path)) with PathManager.open(file_path, "w") as f: f.write(json.dumps(self._oid_results)) @@ -631,37 +617,36 @@ def evaluate(self): eval_seg=self._mask_on, class_names=self._metadata.get("thing_classes"), ) - self._results['bbox'] = res + 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) + 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=False, - class_names=None): + +def _evaluate_predictions_on_oid(oid_gt, oid_results_path, eval_seg=False, class_names=None): logger = logging.getLogger(__name__) metrics = ["AP50", "AP50_expand"] results = {} - oid_eval = OIDEval(oid_gt, oid_results_path, 'bbox', expand_pred_label=False) + 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 = 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 = 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'] + precisions = oid_eval.eval["precision"] assert len(class_names) == precisions.shape[2] results_per_category = [] id2apiid = sorted(oid_gt.get_cat_ids()) @@ -672,10 +657,15 @@ def _evaluate_predictions_on_oid( 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 '{:.1f}k'.format(inst_num / 1000)), - float(ap * 100))) + results_per_category.append( + ( + "{} {}".format( + name.replace(" ", "_"), + inst_num if inst_num < 1000 else "{:.1f}k".format(inst_num / 1000), + ), + float(ap * 100), + ) + ) inst_aware_ap += inst_num * ap inst_count += inst_num mAP[idx] = ap @@ -691,9 +681,8 @@ def _evaluate_predictions_on_oid( 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("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 \ No newline at end of file + 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 index 21cabb37dd..541d3c99dc 100644 --- a/dimos/models/Detic/detic/modeling/backbone/swintransformer.py +++ b/dimos/models/Detic/detic/modeling/backbone/swintransformer.py @@ -25,10 +25,13 @@ from centernet.modeling.backbone.bifpn import BiFPN # from .checkpoint import load_checkpoint + class Mlp(nn.Module): - """ Multilayer perceptron.""" + """Multilayer perceptron.""" - def __init__(self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.): + def __init__( + self, in_features, hidden_features=None, out_features=None, act_layer=nn.GELU, drop=0.0 + ): super().__init__() out_features = out_features or in_features hidden_features = hidden_features or in_features @@ -77,7 +80,7 @@ def window_reverse(windows, window_size, H, W): class WindowAttention(nn.Module): - """ Window based multi-head self attention (W-MSA) module with relative position bias. + """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. @@ -89,18 +92,27 @@ class WindowAttention(nn.Module): proj_drop (float, optional): Dropout ratio of output. Default: 0.0 """ - def __init__(self, dim, window_size, num_heads, qkv_bias=True, qk_scale=None, attn_drop=0., proj_drop=0.): - + def __init__( + self, + dim, + window_size, + num_heads, + qkv_bias=True, + qk_scale=None, + attn_drop=0.0, + proj_drop=0.0, + ): 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 + 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 + 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]) @@ -120,25 +132,34 @@ def __init__(self, dim, window_size, num_heads, qkv_bias=True, qk_scale=None, at self.proj = nn.Linear(dim, dim) self.proj_drop = nn.Dropout(proj_drop) - trunc_normal_(self.relative_position_bias_table, std=.02) + trunc_normal_(self.relative_position_bias_table, std=0.02) self.softmax = nn.Softmax(dim=-1) def forward(self, x, mask=None): - """ Forward function. + """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) + 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 = 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: @@ -158,7 +179,7 @@ def forward(self, x, mask=None): class SwinTransformerBlock(nn.Module): - """ Swin Transformer Block. + """Swin Transformer Block. Args: dim (int): Number of input channels. num_heads (int): Number of attention heads. @@ -174,9 +195,21 @@ class SwinTransformerBlock(nn.Module): norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm """ - def __init__(self, dim, num_heads, window_size=7, shift_size=0, - mlp_ratio=4., qkv_bias=True, qk_scale=None, drop=0., attn_drop=0., drop_path=0., - act_layer=nn.GELU, norm_layer=nn.LayerNorm): + def __init__( + self, + dim, + num_heads, + window_size=7, + shift_size=0, + mlp_ratio=4.0, + qkv_bias=True, + qk_scale=None, + drop=0.0, + attn_drop=0.0, + drop_path=0.0, + act_layer=nn.GELU, + norm_layer=nn.LayerNorm, + ): super().__init__() self.dim = dim self.num_heads = num_heads @@ -187,19 +220,27 @@ def __init__(self, dim, num_heads, window_size=7, shift_size=0, 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. else nn.Identity() + 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.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. + """Forward function. Args: x: Input feature, tensor size (B, H*W, C). H, W: Spatial resolution of the input feature. @@ -229,8 +270,12 @@ def forward(self, x, mask_matrix): 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 + 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 @@ -258,11 +303,12 @@ def forward(self, x, mask_matrix): class PatchMerging(nn.Module): - """ Patch Merging Layer + """Patch Merging Layer Args: dim (int): Number of input channels. norm_layer (nn.Module, optional): Normalization layer. Default: nn.LayerNorm """ + def __init__(self, dim, norm_layer=nn.LayerNorm): super().__init__() self.dim = dim @@ -270,7 +316,7 @@ def __init__(self, dim, norm_layer=nn.LayerNorm): self.norm = norm_layer(4 * dim) def forward(self, x, H, W): - """ Forward function. + """Forward function. Args: x: Input feature, tensor size (B, H*W, C). H, W: Spatial resolution of the input feature. @@ -299,7 +345,7 @@ def forward(self, x, H, W): class BasicLayer(nn.Module): - """ A basic Swin Transformer layer for one stage. + """A basic Swin Transformer layer for one stage. Args: dim (int): Number of feature channels depth (int): Depths of this stage. @@ -316,20 +362,22 @@ class BasicLayer(nn.Module): use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. """ - def __init__(self, - dim, - depth, - num_heads, - window_size=7, - mlp_ratio=4., - qkv_bias=True, - qk_scale=None, - drop=0., - attn_drop=0., - drop_path=0., - norm_layer=nn.LayerNorm, - downsample=None, - use_checkpoint=False): + def __init__( + self, + dim, + depth, + num_heads, + window_size=7, + mlp_ratio=4.0, + qkv_bias=True, + qk_scale=None, + drop=0.0, + attn_drop=0.0, + drop_path=0.0, + norm_layer=nn.LayerNorm, + downsample=None, + use_checkpoint=False, + ): super().__init__() self.window_size = window_size self.shift_size = window_size // 2 @@ -337,20 +385,24 @@ def __init__(self, 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)]) + 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: @@ -359,7 +411,7 @@ def __init__(self, self.downsample = None def forward(self, x, H, W): - """ Forward function. + """Forward function. Args: x: Input feature, tensor size (B, H*W, C). H, W: Spatial resolution of the input feature. @@ -369,22 +421,30 @@ def forward(self, x, H, W): 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)) + 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 = 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, float(-100.0)).masked_fill(attn_mask == 0, float(0.0)) + attn_mask = attn_mask.masked_fill(attn_mask != 0, float(-100.0)).masked_fill( + attn_mask == 0, float(0.0) + ) for blk in self.blocks: blk.H, blk.W = H, W @@ -401,7 +461,7 @@ def forward(self, x, H, W): class PatchEmbed(nn.Module): - """ Image to Patch Embedding + """Image to Patch Embedding Args: patch_size (int): Patch token size. Default: 4. in_chans (int): Number of input image channels. Default: 3. @@ -443,7 +503,7 @@ def forward(self, x): class SwinTransformer(Backbone): - """ Swin Transformer backbone. + """Swin Transformer backbone. A PyTorch impl of : `Swin Transformer: Hierarchical Vision Transformer using Shifted Windows` - https://arxiv.org/pdf/2103.14030 Args: @@ -470,26 +530,28 @@ class SwinTransformer(Backbone): use_checkpoint (bool): Whether to use checkpointing to save memory. Default: False. """ - def __init__(self, - pretrain_img_size=224, - patch_size=4, - in_chans=3, - embed_dim=96, - depths=[2, 2, 6, 2], - num_heads=[3, 6, 12, 24], - window_size=7, - mlp_ratio=4., - qkv_bias=True, - qk_scale=None, - drop_rate=0., - attn_drop_rate=0., - drop_path_rate=0.2, - norm_layer=nn.LayerNorm, - ape=False, - patch_norm=True, - out_indices=(0, 1, 2, 3), - frozen_stages=-1, - use_checkpoint=False): + def __init__( + self, + pretrain_img_size=224, + patch_size=4, + in_chans=3, + embed_dim=96, + depths=[2, 2, 6, 2], + num_heads=[3, 6, 12, 24], + window_size=7, + mlp_ratio=4.0, + qkv_bias=True, + qk_scale=None, + drop_rate=0.0, + attn_drop_rate=0.0, + drop_path_rate=0.2, + norm_layer=nn.LayerNorm, + ape=False, + patch_norm=True, + out_indices=(0, 1, 2, 3), + frozen_stages=-1, + use_checkpoint=False, + ): super().__init__() self.pretrain_img_size = pretrain_img_size @@ -502,28 +564,38 @@ def __init__(self, # 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) + 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]] + 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=.02) + 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 + 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), + dim=int(embed_dim * 2**i_layer), depth=depths[i_layer], num_heads=num_heads[i_layer], window_size=window_size, @@ -532,32 +604,30 @@ def __init__(self, qk_scale=qk_scale, drop=drop_rate, attn_drop=attn_drop_rate, - drop_path=dpr[sum(depths[:i_layer]):sum(depths[:i_layer + 1])], + 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) + use_checkpoint=use_checkpoint, + ) self.layers.append(layer) - num_features = [int(embed_dim * 2 ** i) for i in range(self.num_layers)] + 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}' + layer_name = f"norm{i_layer}" self.add_module(layer_name, layer) self._freeze_stages() - self._out_features = ['swin{}'.format(i) for i in self.out_indices] + self._out_features = ["swin{}".format(i) for i in self.out_indices] self._out_feature_channels = { - 'swin{}'.format(i): self.embed_dim * 2 ** i for i in self.out_indices - } - self._out_feature_strides = { - 'swin{}'.format(i): 2 ** (i + 2) for i in self.out_indices + "swin{}".format(i): self.embed_dim * 2**i for i in self.out_indices } + self._out_feature_strides = {"swin{}".format(i): 2 ** (i + 2) for i in self.out_indices} self._size_devisibility = 32 - def _freeze_stages(self): if self.frozen_stages >= 0: self.patch_embed.eval() @@ -584,7 +654,7 @@ def init_weights(self, pretrained=None): def _init_weights(m): if isinstance(m, nn.Linear): - trunc_normal_(m.weight, std=.02) + 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): @@ -597,7 +667,7 @@ def _init_weights(m): elif pretrained is None: self.apply(_init_weights) else: - raise TypeError('pretrained must be a str or None') + raise TypeError("pretrained must be a str or None") def forward(self, x): """Forward function.""" @@ -606,7 +676,9 @@ def forward(self, 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') + 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) @@ -619,12 +691,12 @@ def forward(self, x): x_out, H, W, x, Wh, Ww = layer(x, Wh, Ww) if i in self.out_indices: - norm_layer = getattr(self, f'norm{i}') + 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['swin{}'.format(i)] = out + outs["swin{}".format(i)] = out return outs @@ -633,90 +705,90 @@ def train(self, mode=True): super(SwinTransformer, self).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' + "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", }, - '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': { - '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': { - '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", }, - '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': { - '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", }, - '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'], + 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 + use_checkpoint=cfg.MODEL.SWIN.USE_CHECKPOINT, ) # print('Initializing', config['pretrained']) - model.init_weights(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 @@ -733,8 +805,7 @@ def build_swintransformer_fpn_backbone(cfg, input_shape: ShapeSpec): @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( @@ -747,4 +818,4 @@ def build_swintransformer_bifpn_backbone(cfg, input_shape: ShapeSpec): num_bifpn=cfg.MODEL.BIFPN.NUM_BIFPN, separable_conv=cfg.MODEL.BIFPN.SEPARABLE_CONV, ) - return backbone \ No newline at end of file + return backbone diff --git a/dimos/models/Detic/detic/modeling/backbone/timm.py b/dimos/models/Detic/detic/modeling/backbone/timm.py index 1ac62cb5d9..8b7dd00006 100644 --- a/dimos/models/Detic/detic/modeling/backbone/timm.py +++ b/dimos/models/Detic/detic/modeling/backbone/timm.py @@ -1,21 +1,16 @@ #!/usr/bin/env python # -*- coding: utf-8 -*- # Copyright (c) Facebook, Inc. and its affiliates. -import math -from os.path import join -import numpy as np import copy -from functools import partial import torch from torch import nn -import torch.utils.model_zoo as model_zoo import torch.nn.functional as F import fvcore.nn.weight_init as weight_init from detectron2.modeling.backbone import FPN from detectron2.modeling.backbone.build import BACKBONE_REGISTRY -from detectron2.layers.batch_norm import get_norm, FrozenBatchNorm2d +from detectron2.layers.batch_norm import FrozenBatchNorm2d from detectron2.modeling.backbone import Backbone from timm import create_model @@ -29,22 +24,25 @@ @register_model def convnext_tiny_21k(pretrained=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' + 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, + 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) + **model_args, + ) return model + class CustomResNet(ResNet): def __init__(self, **kwargs): - self.out_indices = kwargs.pop('out_indices') + self.out_indices = kwargs.pop("out_indices") super().__init__(**kwargs) - def forward(self, x): x = self.conv1(x) x = self.bn1(x) @@ -61,40 +59,42 @@ def forward(self, x): ret.append(x) return [ret[i] for i in self.out_indices] - def load_pretrained(self, cached_file): - data = torch.load(cached_file, map_location='cpu') - if 'state_dict' in data: - self.load_state_dict(data['state_dict']) + 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]), + "resnet50_in21k": dict(block=Bottleneck, layers=[3, 4, 6, 3]), } def create_timm_resnet(variant, out_indices, pretrained=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 + 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, + CustomResNet, + variant, + pretrained, default_cfg=default_cfgs_resnet[variant], out_indices=out_indices, pretrained_custom_load=True, **params, - **kwargs) + **kwargs, + ) class LastLevelP6P7_P5(nn.Module): - """ - """ + """ """ + def __init__(self, in_channels, out_channels): super().__init__() self.num_levels = 2 @@ -111,8 +111,7 @@ def forward(self, c5): def freeze_module(x): - """ - """ + """ """ for p in x.parameters(): p.requires_grad = False FrozenBatchNorm2d.convert_frozen_batchnorm(x) @@ -120,54 +119,57 @@ def freeze_module(x): class TIMM(Backbone): - def __init__(self, base_name, out_levels, freeze_at=0, norm='FrozenBN', pretrained=False): + def __init__(self, base_name, out_levels, freeze_at=0, norm="FrozenBN", pretrained=False): 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_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 + 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) + 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 = ['layer{}'.format(x) for x in out_levels] + feature_info = [ + dict(num_chs=f["num_chs"], reduction=f["reduction"]) + for i, f in enumerate(self.base.feature_info) + ] + self._out_features = ["layer{}".format(x) for x in out_levels] self._out_feature_channels = { - 'layer{}'.format(l): feature_info[l - 1]['num_chs'] for l in out_levels} + "layer{}".format(l): feature_info[l - 1]["num_chs"] for l in out_levels + } self._out_feature_strides = { - 'layer{}'.format(l): feature_info[l - 1]['reduction'] for l in out_levels} + "layer{}".format(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: + if "resnet" in base_name: self.freeze(freeze_at) - if norm == 'FrozenBN': + if norm == "FrozenBN": self = FrozenBatchNorm2d.convert_frozen_batchnorm(self) def freeze(self, freeze_at=0): - """ - """ + """ """ if freeze_at >= 1: - print('Frezing', self.base.conv1) + print("Frezing", self.base.conv1) self.base.conv1 = freeze_module(self.base.conv1) if freeze_at >= 2: - print('Frezing', self.base.layer1) + 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)} return ret - + @property def size_divisibility(self): return self._size_divisibility @@ -176,7 +178,7 @@ def size_divisibility(self): @BACKBONE_REGISTRY.register() def build_timm_backbone(cfg, input_shape): model = TIMM( - cfg.MODEL.TIMM.BASE_NAME, + cfg.MODEL.TIMM.BASE_NAME, cfg.MODEL.TIMM.OUT_LEVELS, freeze_at=cfg.MODEL.TIMM.FREEZE_AT, norm=cfg.MODEL.TIMM.NORM, @@ -187,8 +189,7 @@ def build_timm_backbone(cfg, input_shape): @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 @@ -202,12 +203,12 @@ def build_p67_timm_fpn_backbone(cfg, input_shape): ) 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( @@ -218,4 +219,4 @@ def build_p35_timm_fpn_backbone(cfg, input_shape): top_block=None, fuse_type=cfg.MODEL.FPN.FUSE_TYPE, ) - return backbone \ No newline at end of file + return backbone diff --git a/dimos/models/Detic/detic/modeling/debug.py b/dimos/models/Detic/detic/modeling/debug.py index 9c7c442eb8..21136de2f0 100644 --- a/dimos/models/Detic/detic/modeling/debug.py +++ b/dimos/models/Detic/detic/modeling/debug.py @@ -5,24 +5,26 @@ import torch.nn.functional as F import os -COLORS = ((np.random.rand(1300, 3) * 0.4 + 0.6) * 255).astype( - np.uint8).reshape(1300, 1, 1, 3) +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 + 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 - return color_map def _blend_image(image, color_map, a=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 + 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=0.7): merges = np.zeros((image.shape[0], image.shape[1], 3), np.float32) @@ -32,10 +34,11 @@ def _blend_image_heatmaps(image, color_maps, a=0.7): 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 @@ -44,11 +47,11 @@ def _decompose_level(x, shapes_per_level, N): 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)) + 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] @@ -56,8 +59,7 @@ def _imagelist_to_tensor(images): 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 = [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 @@ -72,21 +74,28 @@ def _ind2il(ind, shapes_per_level, N): 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, pos_inds, - shapes_per_level, locations, strides): - ''' + images, + gt_instances, + flattened_hms, + reg_targets, + labels, + pos_inds, + shapes_per_level, + locations, + strides, +): + """ 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) + """ + 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] + 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)) @@ -96,30 +105,32 @@ def debug_train( 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_map = _get_color_image(gt_hms[l][i].detach().cpu().numpy()) color_maps.append(color_map) - cv2.imshow('gthm_{}'.format(l), color_map) + cv2.imshow("gthm_{}".format(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, + blend, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), - (0, 0, 255), 3, cv2.LINE_AA) - + (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) - + 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: @@ -127,28 +138,37 @@ def debug_train( 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])] + bbox = [(loc[0] - ltrb[0]), (loc[1] - ltrb[1]), (loc[0] + ltrb[2]), (loc[1] + ltrb[3])] cv2.rectangle( - blend, + blend, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), - (255, 0, 0), 1, cv2.LINE_AA) + (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.imshow("blend", blend) cv2.waitKey() def debug_test( - images, logits_pred, reg_pred, agn_hm_pred=[], preds=[], - vis_thresh=0.3, debug_show_name=False, mult_agn=False): - ''' + images, + logits_pred, + reg_pred, + agn_hm_pred=[], + preds=[], + vis_thresh=0.3, + debug_show_name=False, + mult_agn=False, +): + """ 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)] - ''' + """ N = len(images) for i in range(len(images)): image = images[i].detach().cpu().numpy().transpose(1, 2, 0) @@ -159,81 +179,105 @@ def debug_test( 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]) + 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]) + 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_map = _get_color_image(logits_pred[l][i].detach().cpu().numpy()) color_maps.append(color_map) - cv2.imshow('predhm_{}'.format(l), color_map) + cv2.imshow("predhm_{}".format(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] + 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 = ( + 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 + 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) + 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]) + 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) + (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) - + 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('agn_hm_{}'.format(l), agn_hm_) + agn_hm_ = (agn_hm_ * np.array([255, 255, 255]).reshape(1, 1, 3)).astype(np.uint8) + cv2.imshow("agn_hm_{}".format(l), agn_hm_) blend = _blend_image_heatmaps(image.copy(), color_maps) - cv2.imshow('blend', blend) - cv2.imshow('preds', pred_image) + 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=0.3, - save_debug=False, debug_show_name=False, image_labels=[], - save_debug_path='output/save_debug/', - bgr=False): + +def debug_second_stage( + images, + instances, + proposals=None, + vis_thresh=0.3, + save_debug=False, + debug_show_name=False, + image_labels=[], + save_debug_path="output/save_debug/", + bgr=False, +): images = _imagelist_to_tensor(images) - if 'COCO' in save_debug_path: + if "COCO" in save_debug_path: from detectron2.data.datasets.builtin_meta import COCO_CATEGORIES - cat2name = [x['name'] for x in 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] + + 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'): + 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() @@ -247,40 +291,52 @@ def debug_second_stage(images, instances, proposals=None, vis_thresh=0.3, cl = COLORS[cats[j], 0, 0] cl = (int(cl[0]), int(cl[1]), int(cl[2])) cv2.rectangle( - image, + image, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), - cl, 2, cv2.LINE_AA) + cl, + 2, + cv2.LINE_AA, + ) if debug_show_name: cat = cats[j] - txt = '{}{:.1f}'.format( - cat2name[cat] if cat > 0 else '', - scores[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) + (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) + 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() + 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'): + 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'): + if proposals[i].has("selected"): selected = proposals[i].selected else: selected = [-1 for _ in range(len(bboxes))] @@ -290,45 +346,55 @@ def debug_second_stage(images, instances, proposals=None, vis_thresh=0.3, cl = (209, 159, 83) th = 2 if selected[j] >= 0: - cl = (0, 0, 0xa4) + cl = (0, 0, 0xA4) th = 4 cv2.rectangle( - proposal_image, + proposal_image, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), - cl, th, cv2.LINE_AA) + cl, + th, + cv2.LINE_AA, + ) if selected[j] >= 0 and debug_show_name: cat = selected[j].item() - txt = '{}'.format(cat2name[cat]) + txt = "{}".format(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) + (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) + 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 = '{}/{:05d}.jpg'.format(save_debug_path, cnt) + save_name = "{}/{:05d}.jpg".format(save_debug_path, cnt) if i < len(image_labels): image_label = image_labels[i] - save_name = '{}/{:05d}'.format(save_debug_path, cnt) + save_name = "{}/{:05d}".format(save_debug_path, cnt) for x in image_label: class_name = cat2name[x] - save_name = save_name + '|{}'.format(class_name) - save_name = save_name + '.jpg' + save_name = save_name + "|{}".format(class_name) + save_name = save_name + ".jpg" cv2.imwrite(save_name, proposal_image) else: - cv2.imshow('image', image) + cv2.imshow("image", image) if proposals is not None: - cv2.imshow('proposals', proposal_image) - cv2.waitKey() \ No newline at end of file + 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 index 9a5ac721d4..5711c87beb 100644 --- a/dimos/models/Detic/detic/modeling/meta_arch/custom_rcnn.py +++ b/dimos/models/Detic/detic/modeling/meta_arch/custom_rcnn.py @@ -1,45 +1,39 @@ # Copyright (c) Facebook, Inc. and its affiliates. -import copy -import logging -import numpy as np from typing import Dict, List, Optional, Tuple import torch -from torch import nn -import json from detectron2.utils.events import get_event_storage from detectron2.config import configurable -from detectron2.structures import ImageList, Instances, Boxes +from detectron2.structures import Instances import detectron2.utils.comm as comm from detectron2.modeling.meta_arch.build import META_ARCH_REGISTRY from detectron2.modeling.meta_arch.rcnn import GeneralizedRCNN -from detectron2.modeling.postprocessing import detector_postprocess -from detectron2.utils.visualizer import Visualizer, _create_text_labels -from detectron2.data.detection_utils import convert_image_to_rgb from torch.cuda.amp import autocast from ..text.text_encoder import build_text_encoder from ..utils import load_class_freq, get_fed_loss_inds + @META_ARCH_REGISTRY.register() class CustomRCNN(GeneralizedRCNN): - ''' + """ Add image labels - ''' + """ + @configurable def __init__( - self, - with_image_labels = False, - dataset_loss_weight = [], - fp16 = False, - sync_caption_batch = False, - roi_head_name = '', - cap_batch_ratio = 4, - with_caption = False, - dynamic_classifier = False, - **kwargs): - """ - """ + self, + with_image_labels=False, + dataset_loss_weight=[], + fp16=False, + sync_caption_batch=False, + roi_head_name="", + cap_batch_ratio=4, + with_caption=False, + dynamic_classifier=False, + **kwargs, + ): + """ """ self.with_image_labels = with_image_labels self.dataset_loss_weight = dataset_loss_weight self.fp16 = fp16 @@ -50,9 +44,9 @@ def __init__( 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') + 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: @@ -61,29 +55,29 @@ def __init__( 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 + 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]], @@ -98,14 +92,11 @@ def inference( 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) + 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 @@ -116,20 +107,20 @@ def forward(self, batched_inputs: List[Dict[str, torch.Tensor]]): images = self.preprocess_image(batched_inputs) - ann_type = 'box' + 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): - inst._ann_type = x['ann_type'] - inst._pos_category_ids = x['pos_category_ids'] - ann_types = [x['ann_type'] for x in batched_inputs] + 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']: + if ann_type in ["prop", "proptag"]: for t in gt_instances: t.gt_classes *= 0 - - if self.fp16: # TODO (zhouxy): improve + + if self.fp16: # TODO (zhouxy): improve with autocast(): features = self.backbone(images.tensor.half()) features = {k: v.float() for k, v in features.items()} @@ -138,33 +129,40 @@ def forward(self, batched_inputs: List[Dict[str, torch.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)] + 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)] 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 + 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() + 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) + 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) + 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) - + 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: @@ -173,60 +171,55 @@ def forward(self, batched_inputs: List[Dict[str, torch.Tensor]]): losses = {} losses.update(detector_losses) if self.with_image_labels: - if ann_type in ['box', 'prop', 'proptag']: + if ann_type in ["box", "prop", "proptag"]: losses.update(proposal_losses) - else: # ignore proposal loss for non-bbox data + 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] + 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) + 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) + 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='box'): - if ann_type == 'box': - gt_classes = torch.cat( - [x.gt_classes for x in gt_instances]) + def _sample_cls_inds(self, gt_instances, ann_type="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]) + [ + 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, '{} {}'.format(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)) + assert gt_classes.max() < C, "{} {}".format(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 \ No newline at end of file + 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 index 47ff220fc3..636adb1f44 100644 --- a/dimos/models/Detic/detic/modeling/meta_arch/d2_deformable_detr.py +++ b/dimos/models/Detic/detic/modeling/meta_arch/d2_deformable_detr.py @@ -1,16 +1,14 @@ -# Copyright (c) Facebook, Inc. and its affiliates. +# Copyright (c) Facebook, Inc. and its affiliates. import torch import torch.nn.functional as F from torch import nn -import math from detectron2.modeling import META_ARCH_REGISTRY, build_backbone from detectron2.structures import Boxes, Instances from ..utils import load_class_freq, get_fed_loss_inds from models.backbone import Joiner -from models.deformable_detr import DeformableDETR, SetCriterion, MLP -from models.deformable_detr import _get_clones +from models.deformable_detr import DeformableDETR, SetCriterion from models.matcher import HungarianMatcher from models.position_encoding import PositionEmbeddingSine from models.deformable_transformer import DeformableTransformer @@ -21,62 +19,73 @@ __all__ = ["DeformableDetr"] + class CustomSetCriterion(SetCriterion): - def __init__(self, num_classes, matcher, weight_dict, losses, \ - focal_alpha=0.25, use_fed_loss=False): + def __init__( + self, num_classes, matcher, weight_dict, losses, focal_alpha=0.25, use_fed_loss=False + ): 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)) + self.register_buffer("fed_loss_weight", load_class_freq(freq_weight=0.5)) def loss_labels(self, outputs, targets, indices, num_boxes, log=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'] + 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)]) - target_classes = torch.full(src_logits.shape[:2], self.num_classes, - dtype=torch.int64, device=src_logits.device) + 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) + 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 + 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] + 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} + 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] + 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""" + """This is a thin wrapper around D2's backbone to provide padding masking""" def __init__(self, cfg): super().__init__() @@ -96,6 +105,7 @@ def forward(self, tensor_list: NestedTensor): out[name] = NestedTensor(x, mask) return out + @META_ARCH_REGISTRY.register() class DeformableDetr(nn.Module): """ @@ -148,10 +158,13 @@ def __init__(self, cfg): dec_n_points=4, enc_n_points=4, two_stage=two_stage, - two_stage_num_proposals=num_queries) + two_stage_num_proposals=num_queries, + ) self.detr = DeformableDETR( - backbone, transformer, num_classes=self.num_classes, + backbone, + transformer, + num_classes=self.num_classes, num_queries=num_queries, num_feature_levels=num_feature_levels, aux_loss=deep_supervision, @@ -160,10 +173,11 @@ def __init__(self, cfg): ) if self.mask_on: - assert 0, 'Mask is not supported yet :(' + assert 0, "Mask is not supported yet :(" matcher = HungarianMatcher( - cost_class=cls_weight, cost_bbox=l1_weight, cost_giou=giou_weight) + 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: @@ -171,21 +185,22 @@ def __init__(self, cfg): 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) + 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, + self.num_classes, + matcher=matcher, + weight_dict=weight_dict, + focal_alpha=focal_alpha, losses=losses, - use_fed_loss=cfg.MODEL.DETR.USE_FED_LOSS + 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: @@ -204,21 +219,21 @@ def forward(self, batched_inputs): 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) + 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] + 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]) + [(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: @@ -228,29 +243,28 @@ def prepare_targets(self, targets): 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 :(' + 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}) + new_targets[-1].update({"masks": gt_masks}) return new_targets - def post_process(self, outputs, target_sizes): - """ - """ - out_logits, out_bbox = outputs['pred_logits'], outputs['pred_boxes'] + """ """ + 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) + 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)) + 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) @@ -263,10 +277,9 @@ def post_process(self, outputs, target_sizes): r.pred_boxes = Boxes(b) r.scores = s r.pred_classes = l - results.append({'instances': r}) + results.append({"instances": r}) return results - def preprocess_image(self, batched_inputs): """ Normalize, pad and batch the input images. @@ -274,35 +287,33 @@ def preprocess_image(self, batched_inputs): 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 + 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 += 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): - ''' + """ 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. - sizes = boxes[..., 2] * boxes[..., 3] # L x N - ind = sizes.argmax(dim=1) # L + 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 \ No newline at end of file + 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 index 186822dd8f..6d4d2e786e 100644 --- a/dimos/models/Detic/detic/modeling/roi_heads/detic_fast_rcnn.py +++ b/dimos/models/Detic/detic/modeling/roi_heads/detic_fast_rcnn.py @@ -1,9 +1,5 @@ # Copyright (c) Facebook, Inc. and its affiliates. -import logging import math -import json -import numpy as np -from typing import Dict, Union import torch from fvcore.nn import giou_loss, smooth_l1_loss from torch import nn @@ -11,15 +7,12 @@ import fvcore.nn.weight_init as weight_init import detectron2.utils.comm as comm from detectron2.config import configurable -from detectron2.layers import ShapeSpec, batched_nms, cat, cross_entropy, nonzero_tuple -from detectron2.structures import Boxes, Instances +from detectron2.layers import ShapeSpec, cat, nonzero_tuple from detectron2.utils.events import get_event_storage -from detectron2.modeling.box_regression import Box2BoxTransform from detectron2.modeling.roi_heads.fast_rcnn import FastRCNNOutputLayers from detectron2.modeling.roi_heads.fast_rcnn import fast_rcnn_inference from detectron2.modeling.roi_heads.fast_rcnn import _log_classification_stats -from torch.cuda.amp import autocast from ..utils import load_class_freq, get_fed_loss_inds from .zero_shot_classifier import ZeroShotClassifier @@ -29,33 +22,33 @@ class DeticFastRCNNOutputLayers(FastRCNNOutputLayers): @configurable def __init__( - self, + self, input_shape: ShapeSpec, *, mult_proposal_score=False, cls_score=None, - sync_caption_batch = False, - use_sigmoid_ce = False, - use_fed_loss = False, - ignore_zero_cats = False, - fed_loss_num_cat = 50, - dynamic_classifier = False, - image_label_loss = '', - use_zeroshot_cls = False, - image_loss_weight = 0.1, - with_softmax_prop = False, - caption_weight = 1.0, - neg_cap_weight = 1.0, - add_image_box = False, - debug = False, - prior_prob = 0.01, - cat_freq_path = '', - fed_loss_freq_weight = 0.5, - softmax_weak_loss = False, + sync_caption_batch=False, + use_sigmoid_ce=False, + use_fed_loss=False, + ignore_zero_cats=False, + fed_loss_num_cat=50, + dynamic_classifier=False, + image_label_loss="", + use_zeroshot_cls=False, + image_loss_weight=0.1, + with_softmax_prop=False, + caption_weight=1.0, + neg_cap_weight=1.0, + add_image_box=False, + debug=False, + prior_prob=0.01, + cat_freq_path="", + fed_loss_freq_weight=0.5, + softmax_weak_loss=False, **kwargs, ): super().__init__( - input_shape=input_shape, + input_shape=input_shape, **kwargs, ) self.mult_proposal_score = mult_proposal_score @@ -76,40 +69,38 @@ def __init__( self.debug = debug if softmax_weak_loss: - assert image_label_loss in ['max_size'] + 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) + 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') + 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))] + [ + 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) - + 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) + 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) @@ -125,38 +116,39 @@ def __init__( 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) + 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=True, - classifier_info=(None,None,None)): + def losses( + self, predictions, proposals, use_advanced_loss=True, classifier_info=(None, None, None) + ): """ enable advanced loss """ @@ -187,34 +179,31 @@ def losses(self, predictions, proposals, \ else: loss_cls = self.softmax_cross_entropy_loss(scores, gt_classes) return { - "loss_cls": loss_cls, + "loss_cls": loss_cls, "loss_box_reg": self.box_reg_loss( - proposal_boxes, gt_boxes, proposal_deltas, gt_classes, - num_classes=num_classes) + 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. + 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 + 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 + + 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) + 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] = 1 # C + 1 appeared_mask = appeared_mask[:C] fed_w = appeared_mask.view(1, C).expand(B, C) weight = weight * fed_w.float() @@ -224,11 +213,11 @@ def sigmoid_cross_entropy_loss(self, pred_class_logits, gt_classes): # 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 + 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 @@ -237,34 +226,28 @@ def softmax_cross_entropy_loss(self, pred_class_logits, gt_classes): 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 + 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 + 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) + 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. # C + 1 - appeared_mask[C] = 1. + 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") + pred_class_logits, gt_classes, weight=appeared_mask, reduction="mean" + ) else: - loss = F.cross_entropy( - pred_class_logits, gt_classes, reduction="mean") + 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=-1): + def box_reg_loss(self, proposal_boxes, gt_boxes, pred_deltas, gt_classes, num_classes=-1): """ Allow custom background index """ @@ -303,9 +286,8 @@ def inference(self, predictions, proposals): 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)] + proposal_scores = [p.get("objectness_logits") for p in proposals] + scores = [(s * ps[:, None]) ** 0.5 for s, ps in zip(scores, proposal_scores)] image_shapes = [x.image_size for x in proposals] return fast_rcnn_inference( boxes, @@ -316,7 +298,6 @@ def inference(self, predictions, proposals): self.test_topk_per_image, ) - def predict_probs(self, predictions, proposals): """ support sigmoid @@ -330,17 +311,22 @@ def predict_probs(self, predictions, proposals): probs = F.softmax(scores, dim=-1) return probs.split(num_inst_per_image, dim=0) - - def image_label_losses(self, predictions, proposals, image_labels, \ - classifier_info=(None,None,None), ann_type='image'): - ''' + def image_label_losses( + self, + predictions, + proposals, + image_labels, + classifier_info=(None, None, None), + ann_type="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) + 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: @@ -354,38 +340,37 @@ def image_label_losses(self, predictions, proposals, image_labels, \ 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)): + for idx, (score, labels, prop_score, p) in enumerate( + zip(scores, image_labels, prop_scores, proposals) + ): 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) + 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': + if ann_type == "caption": continue if self.debug: - p.selected = score.new_zeros( - (len(p),), dtype=torch.long) - 1 + 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) + 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']: + 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': + elif self.image_label_loss == "max_score": loss_i, ind = self._max_score_loss(score, label) - elif self.image_label_loss == 'max_size': + elif self.image_label_loss == "max_size": loss_i, ind = self._max_size_loss(score, label, p) - elif self.image_label_loss == 'first': + elif self.image_label_loss == "first": loss_i, ind = self._first_loss(score, label) - elif self.image_label_loss == 'image': + elif self.image_label_loss == "image": loss_i, ind = self._image_loss(score, label) - elif self.image_label_loss == 'min_loss': + elif self.image_label_loss == "min_loss": loss_i, ind = self._min_loss_loss(score, label) else: assert 0 @@ -397,43 +382,50 @@ def image_label_losses(self, predictions, proposals, image_labels, \ 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]) + 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] + 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: + 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()) + 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) + 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]} - + "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)): + 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) @@ -444,11 +436,11 @@ def forward(self, x, classifier_info=(None,None,None)): 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]) + 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) + 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: @@ -457,129 +449,113 @@ def forward(self, x, classifier_info=(None,None,None)): else: return scores, proposal_deltas - def _caption_loss(self, score, classifier_info, idx, B): - assert (classifier_info[2] is not None) + 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) + 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_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 + 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, \ - '{} {} {} {} {}'.format( - rank, global_idx, - classifier_info[2][global_idx, -1], - classifier_info[2].shape, - classifier_info[2][:, -1]) - caption_target[:, global_idx] = 1. + assert (classifier_info[2][global_idx, -1] - rank) ** 2 < 1e-8, "{} {} {} {} {}".format( + 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. + caption_target[:, idx] = 1.0 caption_loss_img = F.binary_cross_entropy_with_logits( - caption_score, caption_target, reduction='none') + caption_score, caption_target, reduction="none" + ) if self.sync_caption_batch: fg_mask = (caption_target > 0.5).float() - assert (fg_mask.sum().item() - 1.) ** 2 < 1e-8, '{} {}'.format( - fg_mask.shape, fg_mask) + assert (fg_mask.sum().item() - 1.0) ** 2 < 1e-8, "{} {}".format(fg_mask.shape, fg_mask) pos_loss = (caption_loss_img * fg_mask).sum() - neg_loss = (caption_loss_img * (1. - 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): 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. + 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): loss = 0 target = score.new_zeros(score.shape[1]) - target[label] = 1. + target[label] = 1.0 ind = score[:, label].argmax().item() - loss += F.binary_cross_entropy_with_logits( - score[ind], target, reduction='sum') + loss += F.binary_cross_entropy_with_logits(score[ind], target, reduction="sum") return loss, ind - def _min_loss_loss(self, score, label): loss = 0 target = score.new_zeros(score.shape) - target[:, label] = 1. + target[:, label] = 1.0 with torch.no_grad(): - x = F.binary_cross_entropy_with_logits( - score, target, reduction='none').sum(dim=1) # n + 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') + loss += F.binary_cross_entropy_with_logits(score[ind], target[0], reduction="sum") return loss, ind - def _first_loss(self, score, label): loss = 0 target = score.new_zeros(score.shape[1]) - target[label] = 1. + target[label] = 1.0 ind = 0 - loss += F.binary_cross_entropy_with_logits( - score[ind], target, reduction='sum') + loss += F.binary_cross_entropy_with_logits(score[ind], target, reduction="sum") return loss, ind - def _image_loss(self, score, label): assert self.add_image_box target = score.new_zeros(score.shape[1]) - target[label] = 1. + target[label] = 1.0 ind = score.shape[0] - 1 - loss = F.binary_cross_entropy_with_logits( - score[ind], target, reduction='sum') + loss = F.binary_cross_entropy_with_logits(score[ind], target, reduction="sum") return loss, ind - def _max_size_loss(self, score, label, p): loss = 0 target = score.new_zeros(score.shape[1]) - target[label] = 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') + 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') + loss += F.binary_cross_entropy_with_logits(score[ind], target, reduction="sum") return loss, ind - def put_label_distribution(storage, hist_name, hist_counts, num_classes): - """ - """ + """ """ ht_min, ht_max = 0, num_classes hist_edges = torch.linspace( - start=ht_min, end=ht_max, steps=num_classes + 1, dtype=torch.float32) + start=ht_min, end=ht_max, steps=num_classes + 1, dtype=torch.float32 + ) hist_params = dict( tag=hist_name, @@ -592,4 +568,4 @@ def put_label_distribution(storage, hist_name, hist_counts, num_classes): bucket_counts=hist_counts.tolist(), global_step=storage._iter, ) - storage._histograms.append(hist_params) \ No newline at end of file + 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 index c87559359e..8fa0e3f538 100644 --- a/dimos/models/Detic/detic/modeling/roi_heads/detic_roi_heads.py +++ b/dimos/models/Detic/detic/modeling/roi_heads/detic_roi_heads.py @@ -1,29 +1,16 @@ # Copyright (c) Facebook, Inc. and its affiliates. -import copy -import numpy as np -import json -import math import torch -from torch import nn -from torch.autograd.function import Function -from typing import Dict, List, Optional, Tuple, Union -from torch.nn import functional as F from detectron2.config import configurable -from detectron2.layers import ShapeSpec -from detectron2.layers import batched_nms -from detectron2.structures import Boxes, Instances, pairwise_iou +from detectron2.structures import Boxes, Instances from detectron2.utils.events import get_event_storage from detectron2.modeling.box_regression import Box2BoxTransform 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.modeling.roi_heads.roi_heads import ROI_HEADS_REGISTRY from detectron2.modeling.roi_heads.cascade_rcnn import CascadeROIHeads, _ScaleGradient -from detectron2.modeling.roi_heads.box_head import build_box_head from .detic_fast_rcnn import DeticFastRCNNOutputLayers -from ..debug import debug_second_stage -from torch.cuda.amp import autocast @ROI_HEADS_REGISTRY.register() class DeticCascadeROIHeads(CascadeROIHeads): @@ -54,48 +41,50 @@ def __init__( @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, - }) + 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(self, cfg, input_shape): ret = super()._init_box_head(cfg, input_shape) - del ret['box_predictors'] + 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): + for box_head, bbox_reg_weights in zip(ret["box_heads"], cascade_bbox_reg_weights): box_predictors.append( DeticFastRCNNOutputLayers( - cfg, box_head.output_shape, - box2box_transform=Box2BoxTransform(weights=bbox_reg_weights) - )) - ret['box_predictors'] = box_predictors + 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='box', classifier_info=(None,None,None)): + def _forward_box( + self, features, proposals, targets=None, ann_type="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] + 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] - + 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 @@ -104,40 +93,42 @@ def _forward_box(self, features, proposals, targets=None, 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, 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) + (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("stage{}".format(stage)): - if ann_type != 'box': + if ann_type != "box": stage_losses = {} - if ann_type in ['image', 'caption', 'captiontag']: + 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, + predictions, + proposals, + image_labels, classifier_info=classifier_info, - ann_type=ann_type) + ann_type=ann_type, + ) stage_losses.update(weak_losses) - else: # supervised + else: # supervised stage_losses = predictor.losses( - (predictions[0], predictions[1]), proposals, - classifier_info=classifier_info) + (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 + "_stage{}".format(stage): v \ - for k, v in stage_losses.items()}) + stage_losses["image_loss"] = predictions[0].new_zeros([1])[0] + losses.update({k + "_stage{}".format(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) @@ -147,13 +138,11 @@ def _forward_box(self, features, proposals, targets=None, for scores_per_image in zip(*scores_per_stage) ] if self.mult_proposal_score: - scores = [(s * ps[:, None]) ** 0.5 \ - for s, ps in zip(scores, proposal_scores)] + scores = [(s * ps[:, None]) ** 0.5 for s, ps in zip(scores, proposal_scores)] 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) + boxes = predictor.predict_boxes((predictions[0], predictions[1]), proposals) pred_instances, _ = fast_rcnn_inference( boxes, scores, @@ -164,50 +153,54 @@ def _forward_box(self, features, proposals, targets=None, ) return pred_instances - - def forward(self, images, features, proposals, targets=None, - ann_type='box', classifier_info=(None,None,None)): - ''' + def forward( + self, + images, + features, + proposals, + targets=None, + ann_type="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) + 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'): + + 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({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)) + 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_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] + 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 @@ -215,31 +208,30 @@ def _add_image_box(self, p): f = self.image_box_size image_box.proposal_boxes = Boxes( p.proposal_boxes.tensor.new_tensor( - [w * (1. - f) / 2., - h * (1. - f) / 2., - w * (1. - (1. - f) / 2.), - h * (1. - (1. - f) / 2.)] - ).view(n, 4)) + [ + 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]} + return {"loss_mask": torch.zeros((1,), device=device, dtype=torch.float32)[0]} else: return {} - def _create_proposals_from_boxes(self, boxes, image_sizes, 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): + for boxes_per_image, image_size, logit in zip(boxes, image_sizes, logits): boxes_per_image.clip(image_size) if self.training: inds = boxes_per_image.nonempty() @@ -251,9 +243,7 @@ def _create_proposals_from_boxes(self, boxes, image_sizes, logits): proposals.append(prop) return proposals - - def _run_stage(self, features, proposals, stage, \ - classifier_info=(None,None,None)): + def _run_stage(self, features, proposals, stage, classifier_info=(None, None, None)): """ Support classifier_info and add_feature_to_prop """ @@ -262,10 +252,7 @@ def _run_stage(self, features, proposals, stage, \ 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) + feats_per_image = box_features.split([len(p) for p in proposals], dim=0) for feat, p in zip(feats_per_image, proposals): p.feat = feat - return self.box_predictor[stage]( - box_features, - classifier_info=classifier_info) + 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 index bab706999a..d05a5d0537 100644 --- a/dimos/models/Detic/detic/modeling/roi_heads/res5_roi_heads.py +++ b/dimos/models/Detic/detic/modeling/roi_heads/res5_roi_heads.py @@ -1,35 +1,23 @@ # Copyright (c) Facebook, Inc. and its affiliates. -import inspect -import logging -import numpy as np -from typing import Dict, List, Optional, Tuple import torch -from torch import nn from detectron2.config import configurable -from detectron2.layers import ShapeSpec, nonzero_tuple -from detectron2.structures import Boxes, ImageList, Instances, pairwise_iou -from detectron2.utils.events import get_event_storage -from detectron2.utils.registry import Registry +from detectron2.layers import ShapeSpec +from detectron2.structures import Boxes, Instances -from detectron2.modeling.box_regression import Box2BoxTransform -from detectron2.modeling.roi_heads.fast_rcnn import fast_rcnn_inference from detectron2.modeling.roi_heads.roi_heads import ROI_HEADS_REGISTRY, Res5ROIHeads -from detectron2.modeling.roi_heads.cascade_rcnn import CascadeROIHeads, _ScaleGradient -from detectron2.modeling.roi_heads.box_head import build_box_head from .detic_fast_rcnn import DeticFastRCNNOutputLayers from ..debug import debug_second_stage -from torch.cuda.amp import autocast @ROI_HEADS_REGISTRY.register() class CustomRes5ROIHeads(Res5ROIHeads): @configurable def __init__(self, **kwargs): - cfg = kwargs.pop('cfg') + cfg = kwargs.pop("cfg") super().__init__(**kwargs) - stage_channel_factor = 2 ** 3 + stage_channel_factor = 2**3 out_channels = cfg.MODEL.RESNETS.RES2_OUT_CHANNELS * stage_channel_factor self.with_image_labels = cfg.WITH_IMAGE_LABELS @@ -46,31 +34,39 @@ def __init__(self, **kwargs): 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') + 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 + ret["cfg"] = cfg return ret - def forward(self, images, features, proposals, targets=None, - ann_type='box', classifier_info=(None,None,None)): - ''' + def forward( + self, + images, + features, + proposals, + targets=None, + ann_type="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) + if ann_type in ["box"]: + proposals = self.label_and_sample_proposals(proposals, targets) else: proposals = self.get_top_proposals(proposals) @@ -79,44 +75,49 @@ def forward(self, images, features, proposals, targets=None, [features[f] for f in self.in_features], proposal_boxes ) predictions = self.box_predictor( - box_features.mean(dim=[2, 3]), - classifier_info=classifier_info) - + 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) + [len(p) for p in proposals], dim=0 + ) for feat, p in zip(feats_per_image, proposals): p.feat = feat if self.training: del features - if (ann_type != 'box'): + 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, + predictions, + proposals, + image_labels, classifier_info=classifier_info, - ann_type=ann_type) + ann_type=ann_type, + ) else: - losses = self.box_predictor.losses( - (predictions[0], predictions[1]), proposals) + 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] + assert "image_loss" not in losses + losses["image_loss"] = predictions[0].new_zeros([1])[0] if self.save_debug: denormalizer = lambda x: x * self.pixel_std + self.pixel_mean - if ann_type != 'box': + 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, + 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) + bgr=self.bgr, + ) return proposals, losses else: pred_instances, _ = self.box_predictor.inference(predictions, proposals) @@ -125,18 +126,20 @@ def forward(self, images, features, proposals, targets=None, denormalizer = lambda x: x * self.pixel_std + self.pixel_mean debug_second_stage( [denormalizer(x.clone()) for x in images], - pred_instances, proposals=proposals, + 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) + 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] + 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: @@ -151,23 +154,22 @@ def _add_image_box(self, p, use_score=False): f = self.image_box_size image_box.proposal_boxes = Boxes( p.proposal_boxes.tensor.new_tensor( - [w * (1. - f) / 2., - h * (1. - f) / 2., - w * (1. - (1. - f) / 2.), - h * (1. - (1. - f) / 2.)] - ).view(n, 4)) + [ + 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)) + 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) + 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]) \ No newline at end of file + 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 index edf217c6db..7dfe0d7097 100644 --- a/dimos/models/Detic/detic/modeling/roi_heads/zero_shot_classifier.py +++ b/dimos/models/Detic/detic/modeling/roi_heads/zero_shot_classifier.py @@ -4,7 +4,8 @@ from torch import nn from torch.nn import functional as F from detectron2.config import configurable -from detectron2.layers import Linear, ShapeSpec +from detectron2.layers import ShapeSpec + class ZeroShotClassifier(nn.Module): @configurable @@ -15,7 +16,7 @@ def __init__( num_classes: int, zs_weight_path: str, zs_weight_dim: int = 512, - use_bias: float = 0.0, + use_bias: float = 0.0, norm_weight: bool = True, norm_temperature: float = 50.0, ): @@ -31,52 +32,52 @@ def __init__( self.cls_bias = nn.Parameter(torch.ones(1) * use_bias) self.linear = nn.Linear(input_size, zs_weight_dim) - - if zs_weight_path == 'rand': + + 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.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) - + [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': + + if zs_weight_path == "rand": self.zs_weight = nn.Parameter(zs_weight) else: - self.register_buffer('zs_weight', zs_weight) + 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, + "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 + 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: @@ -84,4 +85,4 @@ def forward(self, x, classifier=None): x = torch.mm(x, zs_weight) if self.use_bias: x = x + self.cls_bias - return x \ No newline at end of file + return x diff --git a/dimos/models/Detic/detic/modeling/text/text_encoder.py b/dimos/models/Detic/detic/modeling/text/text_encoder.py index 3ec5090c29..ff58592bd8 100644 --- a/dimos/models/Detic/detic/modeling/text/text_encoder.py +++ b/dimos/models/Detic/detic/modeling/text/text_encoder.py @@ -6,7 +6,6 @@ from collections import OrderedDict import torch from torch import nn -import torch from clip.simple_tokenizer import SimpleTokenizer as _Tokenizer @@ -14,6 +13,7 @@ count = 0 + class LayerNorm(nn.LayerNorm): """Subclass torch's LayerNorm to handle fp16.""" @@ -34,16 +34,24 @@ def __init__(self, d_model: int, n_head: int, attn_mask: torch.Tensor = None): 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.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 + 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): @@ -58,24 +66,26 @@ def __init__(self, width: int, layers: int, heads: int, attn_mask: torch.Tensor self.width = width self.layers = layers self.resblocks = nn.Sequential( - *[ResidualAttentionBlock(width, heads, attn_mask) \ - for _ in range(layers)]) + *[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=512, - # text - context_length=77, - vocab_size=49408, - transformer_width=512, - transformer_heads=8, - transformer_layers=12 - ): + def __init__( + self, + embed_dim=512, + # text + context_length=77, + vocab_size=49408, + transformer_width=512, + transformer_heads=8, + transformer_layers=12, + ): super().__init__() - + self._tokenizer = _Tokenizer() self.context_length = context_length @@ -83,12 +93,14 @@ def __init__(self, width=transformer_width, layers=transformer_layers, heads=transformer_heads, - attn_mask=self.build_attention_mask() + 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.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)) @@ -100,8 +112,8 @@ def initialize_parameters(self): 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 + 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) @@ -110,7 +122,7 @@ def initialize_parameters(self): 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) + 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 @@ -128,11 +140,8 @@ def device(self): def dtype(self): return self.text_projection.dtype - def tokenize(self, - texts: Union[str, List[str]], \ - context_length: int = 77) -> torch.LongTensor: - """ - """ + def tokenize(self, texts: Union[str, List[str]], context_length: int = 77) -> torch.LongTensor: + """ """ if isinstance(texts, str): texts = [texts] @@ -143,11 +152,10 @@ def tokenize(self, 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] + 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) + result[i, : len(tokens)] = torch.tensor(tokens) return result @@ -163,11 +171,11 @@ def encode_text(self, text): 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 + """ + text = self.tokenize(captions).to(self.device) # B x L x D + features = self.encode_text(text) # B x D return features @@ -175,15 +183,16 @@ def build_text_encoder(pretrain=True): text_encoder = CLIPTEXT() if pretrain: import clip - pretrained_model, _ = clip.load("ViT-B/32", device='cpu') + + 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.')] + 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') + print("Loading pretrained CLIP") text_encoder.load_state_dict(state_dict) # import pdb; pdb.set_trace() - return text_encoder \ No newline at end of file + return text_encoder diff --git a/dimos/models/Detic/detic/modeling/utils.py b/dimos/models/Detic/detic/modeling/utils.py index 297fb469a0..a028e9246d 100644 --- a/dimos/models/Detic/detic/modeling/utils.py +++ b/dimos/models/Detic/detic/modeling/utils.py @@ -4,46 +4,42 @@ import numpy as np from torch.nn import functional as F -def load_class_freq( - path='datasets/metadata/lvis_v1_train_cat_info.json', freq_weight=1.0): - cat_info = json.load(open(path, 'r')) - cat_info = torch.tensor( - [c['image_count'] for c in sorted(cat_info, key=lambda x: x['id'])]) + +def load_class_freq(path="datasets/metadata/lvis_v1_train_cat_info.json", freq_weight=1.0): + cat_info = json.load(open(path, "r")) + 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, C, weight=None): - appeared = torch.unique(gt_classes) # C' + 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) + 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): 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 + 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) + [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 \ No newline at end of file + 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 index 318205acb9..9985c2d854 100644 --- a/dimos/models/Detic/detic/predictor.py +++ b/dimos/models/Detic/detic/predictor.py @@ -14,31 +14,33 @@ from .modeling.utils import reset_cls_test -def get_clip_embeddings(vocabulary, prompt='a '): +def get_clip_embeddings(vocabulary, prompt="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', + "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', + "lvis": "lvis_v1_val", + "objects365": "objects365_v2_val", + "openimages": "oid_val_expanded", + "coco": "coco_2017_val", } + class VisualizationDemo(object): - def __init__(self, cfg, args, - instance_mode=ColorMode.IMAGE, parallel=False): + def __init__(self, cfg, args, instance_mode=ColorMode.IMAGE, parallel=False): """ Args: cfg (CfgNode): @@ -46,13 +48,12 @@ def __init__(self, cfg, args, parallel (bool): whether to run the model in different processes from visualization. Useful since the visualization logic can be slow. """ - if args.vocabulary == 'custom': + if args.vocabulary == "custom": self.metadata = MetadataCatalog.get("__unused") - self.metadata.thing_classes = args.custom_vocabulary.split(',') + 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]) + self.metadata = MetadataCatalog.get(BUILDIN_METADATA_PATH[args.vocabulary]) classifier = BUILDIN_CLASSIFIER[args.vocabulary] num_classes = len(self.metadata.thing_classes) diff --git a/dimos/models/Detic/lazy_train_net.py b/dimos/models/Detic/lazy_train_net.py index 2734befb0d..d6c4e7e841 100644 --- a/dimos/models/Detic/lazy_train_net.py +++ b/dimos/models/Detic/lazy_train_net.py @@ -9,6 +9,7 @@ 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 @@ -26,10 +27,12 @@ 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') + +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( @@ -126,4 +129,4 @@ def main(args): machine_rank=args.machine_rank, dist_url=args.dist_url, args=(args,), - ) \ No newline at end of file + ) diff --git a/dimos/models/Detic/predict.py b/dimos/models/Detic/predict.py index a0fa53bb15..4091bec3b9 100644 --- a/dimos/models/Detic/predict.py +++ b/dimos/models/Detic/predict.py @@ -12,34 +12,35 @@ from detectron2.data import MetadataCatalog # Detic libraries -sys.path.insert(0, 'third_party/CenterNet2/') +sys.path.insert(0, "third_party/CenterNet2/") from centernet.config import add_centernet_config from detic.config import add_detic_config from detic.modeling.utils import reset_cls_test from detic.modeling.text.text_encoder import build_text_encoder + class Predictor(cog.Predictor): def setup(self): 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.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_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', + "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', + "lvis": "lvis_v1_val", + "objects365": "objects365_v2_val", + "openimages": "oid_val_expanded", + "coco": "coco_2017_val", } @cog.input( @@ -50,8 +51,8 @@ def setup(self): @cog.input( "vocabulary", type=str, - default='lvis', - options=['lvis', 'objects365', 'openimages', 'coco', 'custom'], + default="lvis", + options=["lvis", "objects365", "openimages", "coco", "custom"], help="Choose vocabulary", ) @cog.input( @@ -62,24 +63,27 @@ def setup(self): ) def predict(self, image, vocabulary, custom_vocabulary): image = cv2.imread(str(image)) - if not vocabulary == 'custom': + 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, \ + 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(',') + 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 + self.predictor.model.roi_heads.box_predictor[ + cascade_stages + ].test_score_thresh = output_score_threshold outputs = self.predictor(image) v = Visualizer(image[:, :, ::-1], metadata) @@ -89,7 +93,7 @@ def predict(self, image, vocabulary, custom_vocabulary): return out_path -def get_clip_embeddings(vocabulary, prompt='a '): +def get_clip_embeddings(vocabulary, prompt="a "): text_encoder = build_text_encoder(pretrain=True) text_encoder.eval() texts = [prompt + x for x in vocabulary] diff --git a/dimos/models/Detic/third_party/CenterNet2/centernet/config.py b/dimos/models/Detic/third_party/CenterNet2/centernet/config.py index 82c44fa640..3ff5c725c9 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/config.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/config.py @@ -1,5 +1,6 @@ from detectron2.config import CfgNode as CN + def add_centernet_config(cfg): _C = cfg @@ -21,21 +22,21 @@ def add_centernet_config(cfg): _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.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. - _C.MODEL.CENTERNET.NEG_WEIGHT = 1. - _C.MODEL.CENTERNET.REG_WEIGHT = 2. + _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. + _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 @@ -46,8 +47,7 @@ def add_centernet_config(cfg): _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.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 @@ -57,30 +57,30 @@ def add_centernet_config(cfg): _C.MODEL.BIFPN = CN() _C.MODEL.BIFPN.NUM_LEVELS = 5 _C.MODEL.BIFPN.NUM_BIFPN = 6 - _C.MODEL.BIFPN.NORM = 'GN' + _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.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.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.CUSTOM_AUG = "" _C.INPUT.TRAIN_SIZE = 640 _C.INPUT.TEST_SIZE = 640 - _C.INPUT.SCALE_RANGE = (0.1, 2.) + _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.TEST_INPUT_TYPE = "default" _C.INPUT.NOT_CLAMP_BOX = False - + _C.DEBUG = False _C.SAVE_DEBUG = False _C.SAVE_PTH = 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 index 7d91f21edb..72e399fa40 100644 --- 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 @@ -1,24 +1,7 @@ -import logging -import numpy as np -import pycocotools.mask as mask_util -import torch -from fvcore.common.file_io import PathManager -from PIL import Image - -from detectron2.structures import ( - BitMasks, - Boxes, - BoxMode, - Instances, - Keypoints, - PolygonMasks, - RotatedBoxes, - polygons_to_bitmask, -) - from detectron2.data import transforms as T from .transforms.custom_augmentation_impl import EfficientDetResizeCrop + def build_custom_augmentation(cfg, is_train): """ Create a list of default :class:`Augmentation` from config. @@ -27,7 +10,7 @@ def build_custom_augmentation(cfg, is_train): Returns: list[Augmentation] """ - if cfg.INPUT.CUSTOM_AUG == 'ResizeShortestEdge': + if cfg.INPUT.CUSTOM_AUG == "ResizeShortestEdge": if is_train: min_size = cfg.INPUT.MIN_SIZE_TRAIN max_size = cfg.INPUT.MAX_SIZE_TRAIN @@ -37,7 +20,7 @@ def build_custom_augmentation(cfg, is_train): 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': + elif cfg.INPUT.CUSTOM_AUG == "EfficientDetResizeCrop": if is_train: scale = cfg.INPUT.SCALE_RANGE size = cfg.INPUT.TRAIN_SIZE @@ -56,4 +39,4 @@ def build_custom_augmentation(cfg, is_train): build_custom_transform_gen = build_custom_augmentation """ Alias for backward-compatibility. -""" \ No newline at end of file +""" 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 index 4e9844c99b..b8776789cf 100644 --- 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 @@ -1,32 +1,25 @@ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import copy import logging -import numpy as np -import operator import torch import torch.utils.data -import json -from detectron2.utils.comm import get_world_size -from detectron2.data import samplers -from torch.utils.data.sampler import BatchSampler, Sampler +from torch.utils.data.sampler import Sampler from detectron2.data.common import DatasetFromList, MapDataset -from detectron2.data.dataset_mapper import DatasetMapper from detectron2.data.build import get_detection_dataset_dicts, build_batch_data_loader from detectron2.data.samplers import TrainingSampler, RepeatFactorTrainingSampler -from detectron2.data.build import worker_init_reset_seed, print_instances_class_histogram +from detectron2.data.build import print_instances_class_histogram from detectron2.data.build import filter_images_with_only_crowd_annotations from detectron2.data.build import filter_images_with_few_keypoints from detectron2.data.build import check_metadata_consistency from detectron2.data.catalog import MetadataCatalog, DatasetCatalog from detectron2.utils import comm import itertools -import math from collections import defaultdict from typing import Optional # 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 @@ -44,8 +37,8 @@ def build_custom_train_loader(cfg, mapper=None): ) sizes = [0 for _ in range(len(cfg.DATASETS.TRAIN))] for d in dataset_dicts: - sizes[d['dataset_source']] += 1 - print('dataset sizes', sizes) + sizes[d["dataset_source"]] += 1 + print("dataset sizes", sizes) else: dataset_dicts = get_detection_dataset_dicts( cfg.DATASETS.TRAIN, @@ -104,29 +97,23 @@ def __init__(self, dataset_dicts, seed: Optional[int] = None): 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): start = self._rank - yield from itertools.islice( - self._infinite_indices(), start, None, self._world_size) - + 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) + ids = torch.multinomial(self.weights, self._size, generator=g, replacement=True) yield from ids - - def _get_class_balance_factor(self, dataset_dicts, l=1.): + def _get_class_balance_factor(self, dataset_dicts, l=1.0): # 1. For each category c, compute the fraction of images that contain it: f(c) ret = [] category_freq = defaultdict(int) @@ -136,8 +123,7 @@ def _get_class_balance_factor(self, dataset_dicts, l=1.): 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. / (category_freq[cat_id] ** l) for cat_id in cat_ids])) + ret.append(sum([1.0 / (category_freq[cat_id] ** l) for cat_id in cat_ids])) return torch.tensor(ret).float() @@ -148,12 +134,11 @@ def get_detection_dataset_dicts_with_source( dataset_dicts = [DatasetCatalog.get(dataset_name) for dataset_name in dataset_names] for dataset_name, dicts in zip(dataset_names, dataset_dicts): assert len(dicts), "Dataset '{}' is empty!".format(dataset_name) - - for source_id, (dataset_name, dicts) in \ - enumerate(zip(dataset_names, dataset_dicts)): + + for source_id, (dataset_name, dicts) in enumerate(zip(dataset_names, dataset_dicts)): assert len(dicts), "Dataset '{}' is empty!".format(dataset_name) for d in dicts: - d['dataset_source'] = source_id + d["dataset_source"] = source_id if "annotations" in dicts[0]: try: @@ -175,6 +160,7 @@ def get_detection_dataset_dicts_with_source( return dataset_dicts + class MultiDatasetSampler(Sampler): def __init__(self, cfg, sizes, dataset_dicts, seed: Optional[int] = None): """ @@ -187,43 +173,44 @@ def __init__(self, cfg, sizes, dataset_dicts, seed: Optional[int] = None): self.sizes = sizes dataset_ratio = cfg.DATALOADER.DATASET_RATIO self._batch_size = cfg.SOLVER.IMS_PER_BATCH - assert len(dataset_ratio) == len(sizes), \ - 'length of dataset ratio {} should be equal to number if dataset {}'.format( + assert len(dataset_ratio) == len(sizes), ( + "length of dataset ratio {} should be equal to number if dataset {}".format( len(dataset_ratio), 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) + 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))] + dataset_weight = [ + torch.ones(s) * max(sizes) / s * r / sum(dataset_ratio) + for i, (r, s) in enumerate(zip(dataset_ratio, sizes)) + ] dataset_weight = torch.cat(dataset_weight) self.weights = dataset_weight self.sample_epoch_size = len(self.weights) def __iter__(self): start = self._rank - yield from itertools.islice( - self._infinite_indices(), start, None, self._world_size) - + 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]], + 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 \ No newline at end of file + 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 index f8496aacf2..93f0a13428 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/coco.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/coco.py @@ -14,8 +14,9 @@ def register_distill_coco_instances(name, metadata, json_file, image_root): 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'])) + 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 @@ -31,19 +32,22 @@ def register_distill_coco_instances(name, metadata, json_file, image_root): for key, (image_root, json_file) in _PREDEFINED_SPLITS_COCO.items(): register_coco_instances( key, - _get_builtin_metadata('coco'), + _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"), + "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'), + _get_builtin_metadata("coco"), os.path.join("datasets", json_file) if "://" not in json_file else json_file, os.path.join("datasets", image_root), - ) \ No newline at end of file + ) 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 index 52736e331c..22b80828c0 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/nuimages.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/nuimages.py @@ -2,25 +2,28 @@ import os 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'}, + {"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} + 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} + "thing_classes": thing_classes, + } + _PREDEFINED_SPLITS = { "nuimages_train": ("nuimages", "nuimages/annotations/nuimages_v1.0-train.json"), 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 index 41395bdd53..22a017444f 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/objects365.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/data/datasets/objects365.py @@ -2,383 +2,386 @@ import os 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'} , + {"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} + 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} + "thing_classes": thing_classes, + } + _PREDEFINED_SPLITS_OBJECTS365 = { "objects365_train": ("objects365/train", "objects365/annotations/objects365_train.json"), @@ -388,7 +391,7 @@ def _get_builtin_metadata(version): for key, (image_root, json_file) in _PREDEFINED_SPLITS_OBJECTS365.items(): register_coco_instances( key, - _get_builtin_metadata('v1'), + _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 index 5a69e178a5..cc6f2ccc9f 100644 --- 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 @@ -4,16 +4,8 @@ """ Implement many useful :class:`Augmentation`. """ + import numpy as np -import sys -from fvcore.transforms.transform import ( - BlendTransform, - CropTransform, - HFlipTransform, - NoOpTransform, - Transform, - VFlipTransform, -) from PIL import Image from detectron2.data.transforms.augmentation import Augmentation @@ -30,9 +22,7 @@ class EfficientDetResizeCrop(Augmentation): If `max_size` is reached, then downscale so that the longer edge does not exceed max_size. """ - def __init__( - self, size, scale, interp=Image.BILINEAR - ): + def __init__(self, size, scale, interp=Image.BILINEAR): """ Args: """ @@ -60,4 +50,5 @@ def get_transform(self, img): 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) + 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 index 654d65d97d..bd0ce13dc0 100644 --- 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 @@ -7,11 +7,7 @@ import torch import torch.nn.functional as F from fvcore.transforms.transform import ( - CropTransform, - HFlipTransform, - NoOpTransform, Transform, - TransformList, ) from PIL import Image @@ -27,8 +23,7 @@ class EfficientDetResizeCropTransform(Transform): - """ - """ + """ """ def __init__(self, scaled_h, scaled_w, offset_y, offset_x, img_scale, target_size, interp=None): """ @@ -56,9 +51,9 @@ def apply_image(self, img, interp=None): 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] + ret = ret[self.offset_y : lower, self.offset_x : right] else: - ret = ret[..., self.offset_y: lower, self.offset_x: right, :] + ret = ret[..., self.offset_y : lower, self.offset_x : right, :] else: # PIL only supports uint8 img = torch.from_numpy(img) @@ -73,9 +68,9 @@ def apply_image(self, img, interp=None): 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] + ret = ret[self.offset_y : lower, self.offset_x : right] else: - ret = ret[..., self.offset_y: lower, self.offset_x: right, :] + ret = ret[..., self.offset_y : lower, self.offset_x : right, :] return ret def apply_coords(self, coords): @@ -91,4 +86,4 @@ def apply_segmentation(self, segmentation): def inverse(self): raise NotImplementedError - # return ResizeTransform(self.new_h, self.new_w, self.h, self.w, self.interp) \ No newline at end of file + # 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 index 565e2940ad..dd66c1f0c3 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/bifpn.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/bifpn.py @@ -1,16 +1,10 @@ # Modified from https://github.com/rwightman/efficientdet-pytorch/blob/master/effdet/efficientdet.py # The original file is under Apache-2.0 License import math -from os.path import join -import numpy as np from collections import OrderedDict -from typing import List import torch from torch import nn -import torch.utils.model_zoo as model_zoo -import torch.nn.functional as F -import fvcore.nn.weight_init as weight_init from detectron2.layers import ShapeSpec, Conv2d from detectron2.modeling.backbone.resnet import build_resnet_backbone @@ -19,27 +13,27 @@ from detectron2.modeling.backbone import Backbone from .dlafpn import dla34 + def get_fpn_config(base_reduction=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]}, + "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', + "weight_method": "fastattn", } return p def swish(x, inplace: bool = False): - """Swish - Described in: https://arxiv.org/abs/1710.05941 - """ + """Swish - Described in: https://arxiv.org/abs/1710.05941""" return x.mul_(x.sigmoid()) if inplace else x.mul(x.sigmoid()) @@ -74,14 +68,29 @@ def forward(self, x): class ConvBnAct2d(nn.Module): - def __init__(self, in_channels, out_channels, kernel_size, stride=1, dilation=1, padding='', bias=False, - norm='', act_layer=Swish): + def __init__( + self, + in_channels, + out_channels, + kernel_size, + stride=1, + dilation=1, + padding="", + bias=False, + norm="", + act_layer=Swish, + ): super(ConvBnAct2d, self).__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 == '')) + 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) @@ -95,11 +104,22 @@ def forward(self, x): class SeparableConv2d(nn.Module): - """ Separable Conv - """ - def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, dilation=1, padding='', bias=False, - channel_multiplier=1.0, pw_kernel_size=1, act_layer=Swish, - norm=''): + """Separable Conv""" + + def __init__( + self, + in_channels, + out_channels, + kernel_size=3, + stride=1, + dilation=1, + padding="", + bias=False, + channel_multiplier=1.0, + pw_kernel_size=1, + act_layer=Swish, + norm="", + ): super(SeparableConv2d, self).__init__() # self.conv_dw = create_conv2d( @@ -107,17 +127,26 @@ def __init__(self, in_channels, out_channels, kernel_size=3, stride=1, dilation= # 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) + 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) + 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) @@ -133,11 +162,20 @@ def forward(self, x): class ResampleFeatureMap(nn.Sequential): - def __init__(self, in_channels, out_channels, reduction_ratio=1., pad_type='', pooling_type='max', - norm='', apply_bn=False, conv_after_downsample=False, - redundant_bias=False): + def __init__( + self, + in_channels, + out_channels, + reduction_ratio=1.0, + pad_type="", + pooling_type="max", + norm="", + apply_bn=False, + conv_after_downsample=False, + redundant_bias=False, + ): super(ResampleFeatureMap, self).__init__() - pooling_type = pooling_type or 'max' + pooling_type = pooling_type or "max" self.in_channels = in_channels self.out_channels = out_channels self.reduction_ratio = reduction_ratio @@ -146,35 +184,52 @@ def __init__(self, in_channels, out_channels, reduction_ratio=1., pad_type='', p 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) + 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("conv", conv) self.add_module( - 'downsample', + "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) - ) + nn.MaxPool2d(kernel_size=stride_size, stride=stride_size), + ) if conv is not None and self.conv_after_downsample: - self.add_module('conv', conv) + self.add_module("conv", conv) else: if conv is not None: - self.add_module('conv', conv) + self.add_module("conv", conv) if reduction_ratio < 1: scale = int(1 // reduction_ratio) - self.add_module('upsample', nn.UpsamplingNearest2d(scale_factor=scale)) + 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='', - pooling_type='max', norm='', apply_bn_for_resampling=False, - conv_after_downsample=False, redundant_bias=False, weight_method='attn'): + def __init__( + self, + feature_info, + fpn_config, + fpn_channels, + inputs_offsets, + target_reduction, + pad_type="", + pooling_type="max", + norm="", + apply_bn_for_resampling=False, + conv_after_downsample=False, + redundant_bias=False, + weight_method="attn", + ): super(FpnCombine, self).__init__() self.inputs_offsets = inputs_offsets self.weight_method = weight_method @@ -183,20 +238,26 @@ def __init__(self, feature_info, fpn_config, fpn_channels, inputs_offsets, targe 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'] + 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'] + 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) + 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': + if weight_method == "attn" or weight_method == "fastattn": # WSM self.edge_weights = nn.Parameter(torch.ones(len(inputs_offsets)), requires_grad=True) else: @@ -210,27 +271,41 @@ def forward(self, x): input_node = self.resample[str(offset)](input_node) nodes.append(input_node) - if self.weight_method == 'attn': + 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': + 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': + [(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('unknown weight_method {}'.format(self.weight_method)) + raise ValueError("unknown weight_method {}".format(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=5, pad_type='', - pooling_type='max', norm='', act_layer=Swish, - apply_bn_for_resampling=False, conv_after_downsample=True, conv_bn_relu_pattern=False, - separable_conv=True, redundant_bias=False): + def __init__( + self, + feature_info, + fpn_config, + fpn_channels, + num_levels=5, + pad_type="", + pooling_type="max", + norm="", + act_layer=Swish, + apply_bn_for_resampling=False, + conv_after_downsample=True, + conv_bn_relu_pattern=False, + separable_conv=True, + redundant_bias=False, + ): super(BiFpnLayer, self).__init__() self.fpn_config = fpn_config self.num_levels = num_levels @@ -238,34 +313,51 @@ def __init__(self, feature_info, fpn_config, fpn_channels, num_levels=5, pad_typ self.feature_info = [] self.fnode = SequentialAppend() - for i, fnode_cfg in enumerate(fpn_config['nodes']): + 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']) + 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) + 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) + 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)) @@ -273,17 +365,24 @@ def __init__(self, feature_info, fpn_config, fpn_channels, num_levels=5, pad_typ def forward(self, x): x = self.fnode(x) - return x[-self.num_levels::] + return x[-self.num_levels : :] class BiFPN(Backbone): def __init__( - self, cfg, bottom_up, in_features, out_channels, norm='', - num_levels=5, num_bifpn=4, separable_conv=False, + self, + cfg, + bottom_up, + in_features, + out_channels, + norm="", + num_levels=5, + num_bifpn=4, + separable_conv=False, ): super(BiFPN, self).__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] @@ -295,20 +394,19 @@ def __init__( self.in_features = in_features self._size_divisibility = 128 levels = [int(math.log2(s)) for s in in_strides] - self._out_feature_strides = { - "p{}".format(int(math.log2(s))): s for s in in_strides} + self._out_feature_strides = {"p{}".format(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["p{}".format(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]} \ + {"num_chs": in_channels[level], "reduction": in_strides[level]} for level in range(len(self.in_features)) ] # self.config = config @@ -316,22 +414,25 @@ def __init__( 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'] + 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, - )) + 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)) @@ -345,7 +446,7 @@ def __init__( fpn_config=fpn_config, fpn_channels=out_channels, num_levels=self.num_levels, - pad_type='same', + pad_type="same", pooling_type=None, norm=norm, act_layer=Swish, @@ -400,6 +501,7 @@ def build_resnet_bifpn_backbone(cfg, input_shape: ShapeSpec): ) return backbone + @BACKBONE_REGISTRY.register() def build_p37_dla_bifpn_backbone(cfg, input_shape: ShapeSpec): """ 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 index 17f2904cca..67c7b67b9e 100644 --- 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 @@ -29,10 +29,12 @@ def __init__(self, in_channels, out_channels, stride, norm=""): super(FeatureMapResampler, self).__init__() if in_channels != out_channels: self.reduction = Conv2d( - in_channels, out_channels, kernel_size=1, + in_channels, + out_channels, + kernel_size=1, bias=(norm == ""), norm=get_norm(norm, out_channels), - activation=None + activation=None, ) else: self.reduction = None @@ -45,10 +47,7 @@ def forward(self, x): x = self.reduction(x) if self.stride == 2: - x = F.max_pool2d( - x, kernel_size=self.stride + 1, - stride=self.stride, padding=1 - ) + x = F.max_pool2d(x, kernel_size=self.stride + 1, stride=self.stride, padding=1) elif self.stride == 1: pass else: @@ -62,8 +61,12 @@ def __init__(self, backbone, out_channels, num_top_levels, norm=""): 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_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]) @@ -77,9 +80,7 @@ def __init__(self, backbone, out_channels, num_top_levels, norm=""): 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 - )) + self.add_module(name, FeatureMapResampler(prev_channels, out_channels, 2, norm)) prev_channels = out_channels self._out_feature_channels[name] = out_channels @@ -106,9 +107,7 @@ class SingleBiFPN(Backbone): It creates pyramid features built on top of some input feature maps. """ - def __init__( - self, in_channels_list, out_channels, norm="" - ): + def __init__(self, in_channels_list, out_channels, norm=""): """ Args: bottom_up (Backbone): module representing the bottom up subnetwork. @@ -128,21 +127,21 @@ def __init__( # 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]}, + {"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]}, + {"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 @@ -160,34 +159,34 @@ def __init__( 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( - "lateral_{}_f{}".format(input_offset, feat_level), lateral_conv + in_channels, out_channels, kernel_size=1, norm=get_norm(norm, out_channels) ) + self.add_module("lateral_{}_f{}".format(input_offset, feat_level), lateral_conv) node_info.append(out_channels) num_output_connections.append(0) # generate attention weights name = "weights_f{}_{}".format(feat_level, inputs_offsets_str) - self.__setattr__(name, nn.Parameter( - torch.ones(len(inputs_offsets), dtype=torch.float32), - requires_grad=True - )) + self.__setattr__( + name, + nn.Parameter( + torch.ones(len(inputs_offsets), dtype=torch.float32), requires_grad=True + ), + ) # generate convolutions after combination name = "outputs_f{}_{}".format(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 == "") - )) + 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): """ @@ -226,15 +225,15 @@ def forward(self, feats): 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 + 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" + input_node, size=(target_h, target_w), mode="nearest" ) else: raise NotImplementedError() @@ -257,7 +256,7 @@ def forward(self, feats): output_feats = [] for idx in range(num_levels): for i, fnode in enumerate(reversed(self.nodes)): - if fnode['feat_level'] == idx: + if fnode["feat_level"] == idx: output_feats.append(feats[-1 - i]) break else: @@ -271,9 +270,7 @@ class BiFPN(Backbone): It creates pyramid features built on top of some input feature maps. """ - def __init__( - self, bottom_up, in_features, out_channels, num_top_levels, num_repeats, norm="" - ): + def __init__(self, bottom_up, in_features, out_channels, num_top_levels, num_repeats, norm=""): """ Args: bottom_up (Backbone): module representing the bottom up subnetwork. @@ -293,14 +290,11 @@ def __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 - ) + 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._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] @@ -322,16 +316,10 @@ def __init__( 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 - ] + 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 - )) + 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): @@ -353,7 +341,7 @@ def forward(self, x): feats = [bottom_up_features[f] for f in self.in_features] for bifpn in self.repeated_bifpn: - feats = bifpn(feats) + feats = bifpn(feats) return dict(zip(self._out_features, feats)) @@ -388,12 +376,11 @@ def build_fcos_resnet_bifpn_backbone(cfg, input_shape: ShapeSpec): out_channels=out_channels, num_top_levels=top_levels, num_repeats=num_repeats, - norm=cfg.MODEL.BIFPN.NORM + norm=cfg.MODEL.BIFPN.NORM, ) return backbone - @BACKBONE_REGISTRY.register() def build_p35_fcos_resnet_bifpn_backbone(cfg, input_shape: ShapeSpec): """ @@ -414,7 +401,7 @@ def build_p35_fcos_resnet_bifpn_backbone(cfg, input_shape: ShapeSpec): out_channels=out_channels, num_top_levels=top_levels, num_repeats=num_repeats, - norm=cfg.MODEL.BIFPN.NORM + norm=cfg.MODEL.BIFPN.NORM, ) return backbone @@ -439,10 +426,11 @@ def build_p35_fcos_dla_bifpn_backbone(cfg, input_shape: ShapeSpec): out_channels=out_channels, num_top_levels=top_levels, num_repeats=num_repeats, - norm=cfg.MODEL.BIFPN.NORM + norm=cfg.MODEL.BIFPN.NORM, ) return backbone + @BACKBONE_REGISTRY.register() def build_p37_fcos_dla_bifpn_backbone(cfg, input_shape: ShapeSpec): """ @@ -464,6 +452,6 @@ def build_p37_fcos_dla_bifpn_backbone(cfg, input_shape: ShapeSpec): out_channels=out_channels, num_top_levels=top_levels, num_repeats=num_repeats, - norm=cfg.MODEL.BIFPN.NORM + norm=cfg.MODEL.BIFPN.NORM, ) - return backbone \ No newline at end of file + 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 index 9f15f84035..1cb2fa51e8 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dla.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dla.py @@ -7,12 +7,10 @@ from torch import nn import torch.utils.model_zoo as model_zoo -from detectron2.modeling.backbone.resnet import ( - BasicStem, BottleneckBlock, DeformBottleneckBlock) +from detectron2.modeling.backbone.resnet import BasicStem, BottleneckBlock, DeformBottleneckBlock from detectron2.layers import ( Conv2d, DeformConv, - FrozenBatchNorm2d, ModulatedDeformConv, ShapeSpec, get_norm, @@ -31,24 +29,32 @@ DCNV1 = False HASH = { - 34: 'ba72cf86', - 60: '24839fc4', + 34: "ba72cf86", + 60: "24839fc4", } + def get_model_url(data, name, hash): - return join('http://dl.yf.io/dla/models', data, '{}-{}.pth'.format(name, hash)) + return join("http://dl.yf.io/dla/models", data, "{}-{}.pth".format(name, hash)) + class BasicBlock(nn.Module): - def __init__(self, inplanes, planes, stride=1, dilation=1, norm='BN'): + def __init__(self, inplanes, planes, stride=1, dilation=1, norm="BN"): super(BasicBlock, self).__init__() - self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=3, - stride=stride, padding=dilation, - bias=False, dilation=dilation) + 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.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 @@ -68,22 +74,27 @@ def forward(self, x, residual=None): return out + class Bottleneck(nn.Module): expansion = 2 - def __init__(self, inplanes, planes, stride=1, dilation=1, norm='BN'): + def __init__(self, inplanes, planes, stride=1, dilation=1, norm="BN"): super(Bottleneck, self).__init__() expansion = Bottleneck.expansion bottle_planes = planes // expansion - self.conv1 = nn.Conv2d(inplanes, bottle_planes, - kernel_size=1, bias=False) + 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.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.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 @@ -108,12 +119,13 @@ def forward(self, x, residual=None): return out + class Root(nn.Module): - def __init__(self, in_channels, out_channels, kernel_size, residual, norm='BN'): + def __init__(self, in_channels, out_channels, kernel_size, residual, norm="BN"): super(Root, self).__init__() self.conv = nn.Conv2d( - in_channels, out_channels, 1, - stride=1, bias=False, padding=(kernel_size - 1) // 2) + 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 @@ -130,33 +142,54 @@ def forward(self, *x): class Tree(nn.Module): - def __init__(self, levels, block, in_channels, out_channels, stride=1, - level_root=False, root_dim=0, root_kernel_size=1, - dilation=1, root_residual=False, norm='BN'): + def __init__( + self, + levels, + block, + in_channels, + out_channels, + stride=1, + level_root=False, + root_dim=0, + root_kernel_size=1, + dilation=1, + root_residual=False, + norm="BN", + ): super(Tree, self).__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) + 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) + 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.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 @@ -166,9 +199,8 @@ def __init__(self, levels, block, in_channels, out_channels, 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) + 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): @@ -186,9 +218,11 @@ def forward(self, x, residual=None, children=None): x = self.tree2(x1, children=children) return x + class DLA(nn.Module): - def __init__(self, num_layers, levels, channels, - block=BasicBlock, residual_root=False, norm='BN'): + def __init__( + self, num_layers, levels, channels, block=BasicBlock, residual_root=False, norm="BN" + ): """ Args: """ @@ -196,49 +230,84 @@ def __init__(self, num_layers, levels, channels, 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), + 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) + 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='dla{}'.format(num_layers), - hash=HASH[num_layers]) + data="imagenet", name="dla{}".format(num_layers), hash=HASH[num_layers] + ) def load_pretrained_model(self, data, name, hash): 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.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=1, dilation=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)]) + 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) @@ -246,7 +315,7 @@ def forward(self, x): y = [] x = self.base_layer(x) for i in range(6): - x = getattr(self, 'level{}'.format(i))(x) + x = getattr(self, "level{}".format(i))(x) y.append(x) return y @@ -254,39 +323,31 @@ def forward(self, x): def fill_up_weights(up): w = up.weight.data f = math.ceil(w.size(2) / 2) - c = (2 * f - 1 - f % 2) / (2. * f) + 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)) + 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='BN'): + def __init__(self, chi, cho, norm="BN"): super(_DeformConv, self).__init__() - self.actf = nn.Sequential( - get_norm(norm, cho), - nn.ReLU(inplace=True) - ) + 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.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) + 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.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) + 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) @@ -302,35 +363,34 @@ def forward(self, x): class IDAUp(nn.Module): - def __init__(self, o, channels, up_f, norm='BN'): + def __init__(self, o, channels, up_f, norm="BN"): super(IDAUp, self).__init__() for i in range(1, len(channels)): c = channels[i] - f = int(up_f[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) + + 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) - - + setattr(self, "proj_" + str(i), proj) + setattr(self, "up_" + str(i), up) + setattr(self, "node_" + str(i), node) + def forward(self, layers, startp, endp): for i in range(startp + 1, endp): - upsample = getattr(self, 'up_' + str(i - startp)) - project = getattr(self, 'proj_' + str(i - startp)) + 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)) + 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='BN'): + def __init__(self, startp, channels, scales, in_channels=None, norm="BN"): super(DLAUp, self).__init__() self.startp = startp if in_channels is None: @@ -340,56 +400,57 @@ def __init__(self, startp, channels, scales, in_channels=None, norm='BN'): scales = np.array(scales, dtype=int) for i in range(len(channels) - 1): j = -i - 2 - setattr(self, 'ida_{}'.format(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:]] + setattr( + self, + "ida_{}".format(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 + out = [layers[-1]] # start with 32 for i in range(len(layers) - self.startp - 1): - ida = getattr(self, 'ida_{}'.format(i)) - ida(layers, len(layers) -i - 2, len(layers)) + ida = getattr(self, "ida_{}".format(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) + 60: ([1, 1, 1, 2, 3, 1], [16, 32, 128, 256, 512, 1024], Bottleneck), } class DLASeg(Backbone): - def __init__(self, num_layers, out_features, use_dla_up=True, - ms_output=False, norm='BN'): + def __init__(self, num_layers, out_features, use_dla_up=True, ms_output=False, norm="BN"): super(DLASeg, self).__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) + 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:]))] + 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) + 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 + 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) + 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 = { - 'dla{}'.format(i): channels[i] for i in range(6)} - self._out_feature_strides = { - 'dla{}'.format(i): 2 ** i for i in range(6)} + self._out_feature_channels = {"dla{}".format(i): channels[i] for i in range(6)} + self._out_feature_strides = {"dla{}".format(i): 2**i for i in range(6)} self._size_divisibility = 32 @property @@ -400,24 +461,24 @@ 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 + 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 = 'dla{}'.format(i) + out_feature = "dla{}".format(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 = 'dla{}'.format(i + st) + out_feature = "dla{}".format(i + st) if out_feature in self._out_features: ret[out_feature] = x[i] - + return ret @@ -430,11 +491,13 @@ def build_dla_backbone(cfg, input_shape): ResNet: a :class:`ResNet` instance. """ return DLASeg( - out_features=cfg.MODEL.DLA.OUT_FEATURES, + 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) + norm=cfg.MODEL.DLA.NORM, + ) + class LastLevelP6P7(nn.Module): """ @@ -456,6 +519,7 @@ def forward(self, c5): p7 = self.p7(F.relu(p6)) return [p6, p7] + @BACKBONE_REGISTRY.register() def build_retinanet_dla_fpn_backbone(cfg, input_shape: ShapeSpec): """ @@ -467,7 +531,7 @@ def build_retinanet_dla_fpn_backbone(cfg, input_shape: ShapeSpec): 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 + in_channels_p6p7 = bottom_up.output_shape()["dla5"].channels backbone = FPN( bottom_up=bottom_up, in_features=in_features, 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 index 2a33c66bf3..8cc478ece9 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dlafpn.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/dlafpn.py @@ -19,31 +19,35 @@ from detectron2.layers.batch_norm import get_norm from detectron2.modeling.backbone import Backbone -WEB_ROOT = 'http://dl.yf.io/dla/models' +WEB_ROOT = "http://dl.yf.io/dla/models" def get_model_url(data, name, hash): - return join( - 'http://dl.yf.io/dla/models', data, '{}-{}.pth'.format(name, hash)) + return join("http://dl.yf.io/dla/models", data, "{}-{}.pth".format(name, hash)) def conv3x3(in_planes, out_planes, stride=1): "3x3 convolution with padding" - return nn.Conv2d(in_planes, out_planes, kernel_size=3, stride=stride, - padding=1, bias=False) + 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=1, dilation=1): super(BasicBlock, self).__init__() - self.conv1 = nn.Conv2d(inplanes, planes, kernel_size=3, - stride=stride, padding=dilation, - bias=False, dilation=dilation) + 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.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 @@ -71,15 +75,19 @@ def __init__(self, cfg, inplanes, planes, stride=1, dilation=1): super(Bottleneck, self).__init__() expansion = Bottleneck.expansion bottle_planes = planes // expansion - self.conv1 = nn.Conv2d(inplanes, bottle_planes, - kernel_size=1, bias=False) + 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.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.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 @@ -109,8 +117,13 @@ class Root(nn.Module): def __init__(self, cfg, in_channels, out_channels, kernel_size, residual): super(Root, self).__init__() self.conv = nn.Conv2d( - in_channels, out_channels, kernel_size, - stride=1, bias=False, padding=(kernel_size - 1) // 2) + 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 @@ -127,31 +140,54 @@ def forward(self, *x): class Tree(nn.Module): - def __init__(self, cfg, levels, block, in_channels, out_channels, stride=1, - level_root=False, root_dim=0, root_kernel_size=1, - dilation=1, root_residual=False): + def __init__( + self, + cfg, + levels, + block, + in_channels, + out_channels, + stride=1, + level_root=False, + root_dim=0, + root_kernel_size=1, + dilation=1, + root_residual=False, + ): super(Tree, self).__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) + 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) + 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.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 @@ -161,9 +197,8 @@ def __init__(self, cfg, levels, block, in_channels, out_channels, 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) + 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): @@ -192,52 +227,89 @@ def __init__(self, cfg, levels, channels, block=BasicBlock, residual_root=False) self._out_features = ["dla{}".format(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._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), + 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) + 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. / n)) + m.weight.data.normal_(0, math.sqrt(2.0 / n)) - self.load_pretrained_model( - data='imagenet', name='dla34', hash='ba72cf86') + self.load_pretrained_model(data="imagenet", name="dla34", hash="ba72cf86") def load_pretrained_model(self, data, name, hash): 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!') + 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=1, dilation=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)]) + 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) @@ -245,20 +317,19 @@ def forward(self, x): y = {} x = self.base_layer(x) for i in range(6): - name = 'level{}'.format(i) + name = "level{}".format(i) x = getattr(self, name)(x) - y['dla{}'.format(i)] = x + y["dla{}".format(i)] = x return y def fill_up_weights(up): w = up.weight.data f = math.ceil(w.size(2) / 2) - c = (2 * f - 1 - f % 2) / (2. * f) + 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)) + 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, :, :] @@ -269,8 +340,9 @@ def __init__(self, chi, cho, norm): self.conv = nn.Sequential( nn.Conv2d(chi, cho, kernel_size=1, stride=1, bias=False), get_norm(norm, cho), - nn.ReLU(inplace=True)) - + nn.ReLU(inplace=True), + ) + def forward(self, x): return self.conv(x) @@ -278,16 +350,11 @@ def forward(self, x): class DeformConv(nn.Module): def __init__(self, chi, cho, norm): super(DeformConv, self).__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.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) + 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) @@ -302,58 +369,58 @@ def forward(self, x): class IDAUp(nn.Module): - def __init__(self, o, channels, up_f, norm='FrozenBN', node_type=Conv): + def __init__(self, o, channels, up_f, norm="FrozenBN", node_type=Conv): super(IDAUp, self).__init__() for i in range(1, len(channels)): c = channels[i] - f = int(up_f[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) + + 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) - - + setattr(self, "proj_" + str(i), proj) + setattr(self, "up_" + str(i), up) + setattr(self, "node_" + str(i), node) + def forward(self, layers, startp, endp): for i in range(startp + 1, endp): - upsample = getattr(self, 'up_' + str(i - startp)) - project = getattr(self, 'proj_' + str(i - startp)) + 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)) + node = getattr(self, "node_" + str(i - startp)) layers[i] = node(layers[i] + layers[i - 1]) DLAUP_NODE_MAP = { - 'conv': Conv, - 'dcn': DeformConv, + "conv": Conv, + "dcn": DeformConv, } + class DLAUP(Backbone): - def __init__(self, bottom_up, in_features, norm, dlaup_node='conv'): + def __init__(self, bottom_up, in_features, norm, dlaup_node="conv"): super(DLAUP, self).__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_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 = ['dlaup{}'.format(l) for l in in_levels] + out_features = ["dlaup{}".format(l) for l in in_levels] self._out_features = out_features self._out_feature_channels = { - 'dlaup{}'.format(l): in_channels[i] for i, l in enumerate(in_levels)} - self._out_feature_strides = { - 'dlaup{}'.format(l): 2 ** l for l in in_levels} + "dlaup{}".format(l): in_channels[i] for i, l in enumerate(in_levels) + } + self._out_feature_strides = {"dlaup{}".format(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) + 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] @@ -361,16 +428,22 @@ def __init__(self, bottom_up, in_features, norm, dlaup_node='conv'): 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) + 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, 'ida_{}'.format(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:]] + setattr( + self, + "ida_{}".format(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): @@ -379,9 +452,9 @@ def size_divisibility(self): 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 + out = [layers[-1]] # start with 32 for i in range(len(layers) - 1): - ida = getattr(self, 'ida_{}'.format(i)) + ida = getattr(self, "ida_{}".format(i)) ida(layers, len(layers) - i - 2, len(layers)) out.insert(0, layers[-1]) ret = {} @@ -392,9 +465,7 @@ def forward(self, x): def dla34(cfg, pretrained=None): # DLA-34 - model = DLA(cfg, [1, 1, 1, 2, 2, 1], - [16, 32, 64, 128, 256, 512], - block=BasicBlock) + model = DLA(cfg, [1, 1, 1, 2, 2, 1], [16, 32, 64, 128, 256, 512], block=BasicBlock) return model @@ -429,7 +500,7 @@ def build_dla_fpn3_backbone(cfg, input_shape: ShapeSpec): """ depth_to_creator = {"dla34": dla34} - bottom_up = depth_to_creator['dla{}'.format(cfg.MODEL.DLA.NUM_LAYERS)](cfg) + bottom_up = depth_to_creator["dla{}".format(cfg.MODEL.DLA.NUM_LAYERS)](cfg) in_features = cfg.MODEL.FPN.IN_FEATURES out_channels = cfg.MODEL.FPN.OUT_CHANNELS @@ -444,6 +515,7 @@ def build_dla_fpn3_backbone(cfg, input_shape: ShapeSpec): return backbone + @BACKBONE_REGISTRY.register() def build_dla_fpn5_backbone(cfg, input_shape: ShapeSpec): """ @@ -454,10 +526,10 @@ def build_dla_fpn5_backbone(cfg, input_shape: ShapeSpec): """ depth_to_creator = {"dla34": dla34} - bottom_up = depth_to_creator['dla{}'.format(cfg.MODEL.DLA.NUM_LAYERS)](cfg) + bottom_up = depth_to_creator["dla{}".format(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 + in_channels_top = bottom_up.output_shape()["dla5"].channels backbone = FPN( bottom_up=bottom_up, @@ -481,7 +553,7 @@ def build_dlaup_backbone(cfg, input_shape: ShapeSpec): """ depth_to_creator = {"dla34": dla34} - bottom_up = depth_to_creator['dla{}'.format(cfg.MODEL.DLA.NUM_LAYERS)](cfg) + bottom_up = depth_to_creator["dla{}".format(cfg.MODEL.DLA.NUM_LAYERS)](cfg) backbone = DLAUP( bottom_up=bottom_up, 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 index e991f9c7be..228b822bbf 100644 --- 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 @@ -1,13 +1,11 @@ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import math import fvcore.nn.weight_init as weight_init import torch.nn.functional as F from torch import nn -from detectron2.layers import Conv2d, ShapeSpec, get_norm +from detectron2.layers import ShapeSpec -from detectron2.modeling.backbone import Backbone -from detectron2.modeling.backbone.fpn import FPN +from detectron2.modeling.backbone.fpn import FPN from detectron2.modeling.backbone.build import BACKBONE_REGISTRY from detectron2.modeling.backbone.resnet import build_resnet_backbone @@ -55,6 +53,7 @@ def build_p67_resnet_fpn_backbone(cfg, input_shape: ShapeSpec): ) return backbone + @BACKBONE_REGISTRY.register() def build_p35_resnet_fpn_backbone(cfg, input_shape: ShapeSpec): """ @@ -75,4 +74,4 @@ def build_p35_resnet_fpn_backbone(cfg, input_shape: ShapeSpec): top_block=None, fuse_type=cfg.MODEL.FPN.FUSE_TYPE, ) - return backbone \ No newline at end of file + 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 index 1d0d40adb4..b35f9b2413 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/res2net.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/backbone/res2net.py @@ -17,7 +17,7 @@ ) from detectron2.modeling.backbone import Backbone -from detectron2.modeling.backbone.fpn import FPN +from detectron2.modeling.backbone.fpn import FPN from detectron2.modeling.backbone.build import BACKBONE_REGISTRY from .fpn_p5 import LastLevelP6P7_P5 from .bifpn import BiFPN @@ -124,7 +124,7 @@ def __init__( norm="BN", stride_in_1x1=False, dilation=1, - basewidth=26, + basewidth=26, scale=4, ): """ @@ -142,8 +142,9 @@ def __init__( if in_channels != out_channels: self.shortcut = nn.Sequential( - nn.AvgPool2d(kernel_size=stride, stride=stride, - ceil_mode=True, count_include_pad=False), + nn.AvgPool2d( + kernel_size=stride, stride=stride, ceil_mode=True, count_include_pad=False + ), Conv2d( in_channels, out_channels, @@ -151,7 +152,7 @@ def __init__( stride=1, bias=False, norm=get_norm(norm, out_channels), - ) + ), ) else: self.shortcut = None @@ -160,7 +161,7 @@ def __init__( # 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 + width = bottleneck_channels // scale self.conv1 = Conv2d( in_channels, @@ -171,25 +172,27 @@ def __init__( norm=get_norm(norm, bottleneck_channels), ) if scale == 1: - self.nums = 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) + 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, - )) + 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) @@ -213,7 +216,7 @@ def __init__( 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) @@ -236,19 +239,19 @@ def forward(self, x): spx = torch.split(out, self.width, 1) for i in range(self.nums): - if i==0 or self.in_channels!=self.out_channels: + 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: + if i == 0: out = sp else: out = torch.cat((out, sp), 1) - if self.scale!=1 and self.stride_3x3==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: + elif self.scale != 1 and self.stride_3x3 == 2: out = torch.cat((out, self.pool(spx[self.nums])), 1) out = self.conv3(out) @@ -282,7 +285,7 @@ def __init__( dilation=1, deform_modulated=False, deform_num_groups=1, - basewidth=26, + basewidth=26, scale=4, ): super().__init__(in_channels, out_channels, stride) @@ -298,8 +301,9 @@ def __init__( # norm=get_norm(norm, out_channels), # ) self.shortcut = nn.Sequential( - nn.AvgPool2d(kernel_size=stride, stride=stride, - ceil_mode=True, count_include_pad=False), + nn.AvgPool2d( + kernel_size=stride, stride=stride, ceil_mode=True, count_include_pad=False + ), Conv2d( in_channels, out_channels, @@ -307,13 +311,13 @@ def __init__( 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 + width = bottleneck_channels // scale self.conv1 = Conv2d( in_channels, @@ -325,11 +329,11 @@ def __init__( ) if scale == 1: - self.nums = 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) + 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 @@ -364,27 +368,31 @@ def __init__( 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, - )) + 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) @@ -415,7 +423,7 @@ def __init__( 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) @@ -443,11 +451,11 @@ def forward(self, x): spx = torch.split(out, self.width, 1) for i in range(self.nums): - if i==0 or self.in_channels!=self.out_channels: + 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) @@ -459,13 +467,13 @@ def forward(self, x): offset = self.conv2_offsets[i](sp) sp = self.convs[i](sp, offset) sp = F.relu_(self.bns[i](sp)) - if i==0: + if i == 0: out = sp else: out = torch.cat((out, sp), 1) - if self.scale!=1 and self.stride_3x3==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: + elif self.scale != 1 and self.stride_3x3 == 2: out = torch.cat((out, self.pool(spx[self.nums])), 1) out = self.conv3(out) @@ -529,7 +537,7 @@ def __init__(self, in_channels=3, out_channels=64, norm="BN"): stride=2, padding=1, bias=False, - ), + ), get_norm(norm, 32), nn.ReLU(inplace=True), Conv2d( @@ -539,7 +547,7 @@ def __init__(self, in_channels=3, out_channels=64, norm="BN"): stride=1, padding=1, bias=False, - ), + ), get_norm(norm, 32), nn.ReLU(inplace=True), Conv2d( @@ -549,7 +557,7 @@ def __init__(self, in_channels=3, out_channels=64, norm="BN"): stride=1, padding=1, bias=False, - ), + ), ) self.bn1 = get_norm(norm, out_channels) @@ -709,9 +717,9 @@ def build_res2net_backbone(cfg, input_shape): 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 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" @@ -799,4 +807,4 @@ def build_res2net_bifpn_backbone(cfg, input_shape: ShapeSpec): num_bifpn=cfg.MODEL.BIFPN.NUM_BIFPN, separable_conv=cfg.MODEL.BIFPN.SEPARABLE_CONV, ) - return backbone \ No newline at end of file + 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 index 0a4437fb5a..247653c23a 100644 --- a/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/debug.py +++ b/dimos/models/Detic/third_party/CenterNet2/centernet/modeling/debug.py @@ -3,24 +3,26 @@ import torch import torch.nn.functional as F -COLORS = ((np.random.rand(1300, 3) * 0.4 + 0.6) * 255).astype( - np.uint8).reshape(1300, 1, 1, 3) +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 + 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 - return color_map def _blend_image(image, color_map, a=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 + 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=0.7): merges = np.zeros((image.shape[0], image.shape[1], 3), np.float32) @@ -30,10 +32,11 @@ def _blend_image_heatmaps(image, color_maps, a=0.7): 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 @@ -42,11 +45,11 @@ def _decompose_level(x, shapes_per_level, N): 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)) + 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] @@ -54,8 +57,7 @@ def _imagelist_to_tensor(images): 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 = [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 @@ -70,21 +72,28 @@ def _ind2il(ind, shapes_per_level, N): 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, pos_inds, - shapes_per_level, locations, strides): - ''' + images, + gt_instances, + flattened_hms, + reg_targets, + labels, + pos_inds, + shapes_per_level, + locations, + strides, +): + """ 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) + """ + 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] + 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)) @@ -94,30 +103,32 @@ def debug_train( 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_map = _get_color_image(gt_hms[l][i].detach().cpu().numpy()) color_maps.append(color_map) - cv2.imshow('gthm_{}'.format(l), color_map) + cv2.imshow("gthm_{}".format(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, + blend, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), - (0, 0, 255), 3, cv2.LINE_AA) - + (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) - + 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: @@ -125,28 +136,37 @@ def debug_train( 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])] + bbox = [(loc[0] - ltrb[0]), (loc[1] - ltrb[1]), (loc[0] + ltrb[2]), (loc[1] + ltrb[3])] cv2.rectangle( - blend, + blend, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), - (255, 0, 0), 1, cv2.LINE_AA) + (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.imshow("blend", blend) cv2.waitKey() def debug_test( - images, logits_pred, reg_pred, agn_hm_pred=[], preds=[], - vis_thresh=0.3, debug_show_name=False, mult_agn=False): - ''' + images, + logits_pred, + reg_pred, + agn_hm_pred=[], + preds=[], + vis_thresh=0.3, + debug_show_name=False, + mult_agn=False, +): + """ 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)] - ''' + """ N = len(images) for i in range(len(images)): image = images[i].detach().cpu().numpy().transpose(1, 2, 0) @@ -157,73 +177,91 @@ def debug_test( 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]) + 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]) + 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_map = _get_color_image(logits_pred[l][i].detach().cpu().numpy()) color_maps.append(color_map) - cv2.imshow('predhm_{}'.format(l), color_map) + cv2.imshow("predhm_{}".format(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] + 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 = ( + 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 + 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) + 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]) + 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) + (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) - + 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('agn_hm_{}'.format(l), agn_hm_) + agn_hm_ = (agn_hm_ * np.array([255, 255, 255]).reshape(1, 1, 3)).astype(np.uint8) + cv2.imshow("agn_hm_{}".format(l), agn_hm_) blend = _blend_image_heatmaps(image.copy(), color_maps) - cv2.imshow('blend', blend) - cv2.imshow('preds', pred_image) + 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=0.3, - save_debug=False, debug_show_name=False): + +def debug_second_stage( + images, instances, proposals=None, vis_thresh=0.3, save_debug=False, debug_show_name=False +): 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] + + 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'): + 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() @@ -237,29 +275,41 @@ def debug_second_stage(images, instances, proposals=None, vis_thresh=0.3, cl = COLORS[cats[j], 0, 0] cl = (int(cl[0]), int(cl[1]), int(cl[2])) cv2.rectangle( - image, + image, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), - cl, 2, cv2.LINE_AA) + cl, + 2, + cv2.LINE_AA, + ) if debug_show_name: cat = cats[j] - txt = '{}{:.1f}'.format( - cat2name[cat] if cat > 0 else '', - scores[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) + (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) + 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() + 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'): + if proposals[i].has("scores"): scores = proposals[i].scores.cpu().numpy() else: scores = proposals[i].objectness_logits.sigmoid().cpu().numpy() @@ -268,16 +318,19 @@ def debug_second_stage(images, instances, proposals=None, vis_thresh=0.3, bbox = bboxes[j] cl = (209, 159, 83) cv2.rectangle( - proposal_image, + proposal_image, (int(bbox[0]), int(bbox[1])), (int(bbox[2]), int(bbox[3])), - cl, 2, cv2.LINE_AA) - - cv2.imshow('image', image) + cl, + 2, + cv2.LINE_AA, + ) + + cv2.imshow("image", image) if proposals is not None: - cv2.imshow('proposals', proposal_image) + cv2.imshow("proposals", proposal_image) if save_debug: global cnt cnt += 1 - cv2.imwrite('output/save_debug/{}.jpg'.format(cnt), proposal_image) - cv2.waitKey() \ No newline at end of file + cv2.imwrite("output/save_debug/{}.jpg".format(cnt), 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 index aef02942ab..53b28eb18a 100644 --- 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 @@ -1,17 +1,9 @@ - -import math -import json -import copy -from typing import List, Dict -import numpy as np import torch from torch import nn -from torch.nn import functional as F from detectron2.modeling.proposal_generator.build import PROPOSAL_GENERATOR_REGISTRY -from detectron2.layers import ShapeSpec, cat +from detectron2.layers import cat from detectron2.structures import Instances, Boxes -from detectron2.modeling import detector_postprocess from detectron2.utils.comm import get_world_size from detectron2.config import configurable @@ -27,10 +19,12 @@ INF = 100000000 + @PROPOSAL_GENERATOR_REGISTRY.register() class CenterNet(nn.Module): @configurable - def __init__(self, + def __init__( + self, # input_shape: Dict[str, ShapeSpec], in_channels=256, *, @@ -39,7 +33,7 @@ def __init__(self, strides=(8, 16, 32, 64, 128), score_thresh=0.05, hm_min_overlap=0.8, - loc_loss_type='giou', + loc_loss_type="giou", min_radius=4, hm_focal_alpha=0.25, hm_focal_beta=4, @@ -50,12 +44,12 @@ def __init__(self, only_proposal=False, as_proposal=False, not_nms=False, - pos_weight=1., - neg_weight=1., + pos_weight=1.0, + neg_weight=1.0, sigmoid_clamp=1e-4, - ignore_high_fp=-1., + ignore_high_fp=-1.0, center_nms=False, - sizes_of_interest=[[0,80],[64,160],[128,320],[256,640],[512,10000000]], + sizes_of_interest=[[0, 80], [64, 160], [128, 320], [256, 640], [512, 10000000]], more_pos=False, more_pos_thresh=0.2, more_pos_topk=9, @@ -69,9 +63,9 @@ def __init__(self, not_clamp_box=False, debug=False, vis_thresh=0.5, - pixel_mean=[103.530,116.280,123.675], - pixel_std=[1.0,1.0,1.0], - device='cuda', + pixel_mean=[103.530, 116.280, 123.675], + pixel_std=[1.0, 1.0, 1.0], + device="cuda", centernet_head=None, ): super().__init__() @@ -106,7 +100,7 @@ def __init__(self, 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: @@ -120,128 +114,140 @@ def __init__(self, in_channels=in_channels, num_levels=len(in_features), with_agn_hm=with_agn_hm, - only_proposal=only_proposal) + 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) + 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]), + "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) + 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]) - + [(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) + 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) + 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) + 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 + 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 + + 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 + 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, + 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 - + 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) + 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], + 0, + w * self.strides[level], step=self.strides[level], - dtype=torch.float32, device=feature.device) + dtype=torch.float32, + device=feature.device, + ) shifts_y = torch.arange( - 0, h * self.strides[level], + 0, + h * self.strides[level], step=self.strides[level], - dtype=torch.float32, device=feature.device) + 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_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: @@ -352,202 +366,206 @@ def _get_ground_truth(self, grids, shapes_per_level, gt_instances): 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) + 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 + 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] + 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))) + 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 + + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 + 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 = (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) + 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 + 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 + 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) + 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.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 - + 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 + """ + 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]) + 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]]) + """ + 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 - ''' + """ + 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 + 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, 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 + inds = labels == c # N if inds.int().sum() == 0: continue heatmaps[:, c] = torch.exp(-dist[:, inds].min(dim=1)[0]) @@ -555,118 +573,129 @@ def _create_heatmaps_from_dist(self, dist, labels, channels): 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 + 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): - ''' + """ 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 + 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]) - + 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] + 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]) + 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) + 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') + 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) + [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, agn_hm_pred, - is_proposal=False): + self, grids, logits_pred, reg_pred, image_sizes, agn_hm_pred, is_proposal=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)) + 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)) boxlists = [Instances.cat(boxlist) for boxlist in boxlists] - boxlists = self.nms_and_topK( - boxlists, nms=not self.not_nms) + 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, agn_hm, level, - is_proposal=False): + self, grids, heatmap, reg_pred, image_sizes, agn_hm, level, is_proposal=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_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 + 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 + 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 + 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) @@ -675,118 +704,115 @@ def predict_single_level( 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_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_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_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 + 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_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 + + 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 + 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=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 + 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)) + 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 + 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 + 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)) + 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) + 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 + 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 + 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[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 + 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 = [] @@ -795,58 +821,61 @@ def _get_c33_inds(self, gt_instances, shapes_per_level): 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 + 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 + 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 + 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 = (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 + 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 + 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 = 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 + 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) + 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() @@ -858,11 +887,11 @@ def _get_c33_inds(self, gt_instances, shapes_per_level): 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_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) @@ -875,4 +904,4 @@ def _get_c33_inds(self, gt_instances, shapes_per_level): 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 + 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 index 57e0960a57..3f939233a1 100644 --- 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 @@ -1,15 +1,15 @@ import math -from typing import List import torch from torch import nn from torch.nn import functional as F -from detectron2.layers import ShapeSpec, get_norm +from detectron2.layers import get_norm from detectron2.config import configurable from ..layers.deform_conv import DFConv2d __all__ = ["CenterNetHead"] + class Scale(nn.Module): def __init__(self, init_value=1.0): super(Scale, self).__init__() @@ -18,9 +18,11 @@ def __init__(self, init_value=1.0): def forward(self, input): return input * self.scale + class CenterNetHead(nn.Module): @configurable - def __init__(self, + def __init__( + self, # input_shape: List[ShapeSpec], in_channels, num_levels, @@ -28,12 +30,13 @@ def __init__(self, num_classes=80, with_agn_hm=False, only_proposal=False, - norm='GN', + norm="GN", num_cls_convs=4, num_box_convs=4, num_share_convs=0, use_deformable=False, - prior_prob=0.01): + prior_prob=0.01, + ): super().__init__() self.num_classes = num_classes self.with_agn_hm = with_agn_hm @@ -41,19 +44,19 @@ def __init__(self, self.out_kernel = 3 head_configs = { - "cls": (num_cls_convs if not self.only_proposal else 0, \ - use_deformable), + "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)} + "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, + "cls": in_channels, + "bbox": in_channels, + "share": in_channels, } for head in head_configs: tower = [] @@ -64,30 +67,32 @@ def __init__(self, conv_func = DFConv2d else: conv_func = nn.Conv2d - tower.append(conv_func( + 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: + 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 != '': + elif norm != "": tower.append(get_norm(norm, channel)) tower.append(nn.ReLU()) - self.add_module('{}_tower'.format(head), - nn.Sequential(*tower)) + self.add_module("{}_tower".format(head), nn.Sequential(*tower)) self.bbox_pred = nn.Conv2d( - in_channels, 4, kernel_size=self.out_kernel, - stride=1, padding=self.out_kernel // 2 + 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)]) + self.scales = nn.ModuleList([Scale(init_value=1.0) for _ in range(num_levels)]) for modules in [ - self.cls_tower, self.bbox_tower, + self.cls_tower, + self.bbox_tower, self.share_tower, self.bbox_pred, ]: @@ -95,15 +100,14 @@ def __init__(self, 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.) + + 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 + 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) @@ -111,8 +115,9 @@ def __init__(self, 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, + in_channels, + self.num_classes, + kernel_size=cls_kernel_size, stride=1, padding=cls_kernel_size // 2, ) @@ -124,17 +129,17 @@ def __init__(self, def from_config(cls, cfg, input_shape): ret = { # 'input_shape': input_shape, - 'in_channels': [s.channels for s in input_shape][0], - '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, + "in_channels": [s.channels for s in input_shape][0], + "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 @@ -158,5 +163,5 @@ def forward(self, x): reg = self.bbox_pred(bbox_tower) reg = self.scales[l](reg) bbox_reg.append(F.relu(reg)) - - return clss, bbox_reg, agn_hms \ No newline at end of file + + 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 index c9efa287fc..527d362d90 100644 --- 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 @@ -1,31 +1,25 @@ -import cv2 import torch -from torch import nn from detectron2.utils.comm import get_world_size -from detectron2.structures import pairwise_iou, Boxes + # from .data import CenterNetCrop -import torch.nn.functional as F -import numpy as np -from detectron2.structures import Boxes, ImageList, Instances -__all__ = ['reduce_sum', '_transpose'] +__all__ = ["reduce_sum", "_transpose"] INF = 1000000000 + def _transpose(training_targets, num_loc_list): - ''' - This function is used to transpose image first training targets to + """ + 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) + 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): - targets_level_first.append( - torch.cat(targets_per_level, dim=0)) + targets_level_first.append(torch.cat(targets_per_level, dim=0)) return targets_level_first @@ -35,4 +29,4 @@ def reduce_sum(tensor): return tensor tensor = tensor.clone() torch.distributed.all_reduce(tensor, op=torch.distributed.ReduceOp.SUM) - return tensor \ No newline at end of file + 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 index e5650c4067..396aa9554a 100644 --- 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 @@ -18,18 +18,19 @@ def backward(ctx, grad): class DFConv2d(nn.Module): """Deformable convolutional layer""" + def __init__( - self, - in_channels, - out_channels, - with_modulated_dcn=True, - kernel_size=3, - stride=1, - groups=1, - dilation=1, - deformable_groups=1, - bias=False, - padding=None + self, + in_channels, + out_channels, + with_modulated_dcn=True, + kernel_size=3, + stride=1, + groups=1, + dilation=1, + deformable_groups=1, + bias=False, + padding=None, ): super(DFConv2d, self).__init__() if isinstance(kernel_size, (list, tuple)): @@ -40,7 +41,7 @@ def __init__( assert len(dilation) == 2 padding = ( dilation[0] * (kernel_size[0] - 1) // 2, - dilation[1] * (kernel_size[1] - 1) // 2 + dilation[1] * (kernel_size[1] - 1) // 2, ) offset_base_channels = kernel_size[0] * kernel_size[1] else: @@ -48,10 +49,12 @@ def __init__( 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( @@ -61,15 +64,15 @@ def __init__( stride=stride, padding=padding, groups=1, - dilation=dilation + 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, @@ -79,7 +82,7 @@ def __init__( dilation=dilation, groups=groups, deformable_groups=deformable_groups, - bias=bias + bias=bias, ) self.with_modulated_dcn = with_modulated_dcn self.kernel_size = kernel_size @@ -95,8 +98,8 @@ def forward(self, x, return_offset=False): 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() + 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 @@ -105,12 +108,8 @@ def forward(self, x, return_offset=False): 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 + x.shape[-2:], self.padding, self.dilation, self.kernel_size, self.stride ) ] output_shape = [x.shape[0], self.conv.weight.shape[0]] + output_shape - return _NewEmptyTensorOp.apply(x, output_shape) \ No newline at end of file + 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 index 8c0c1be13d..893fd9ffab 100644 --- 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 @@ -1,5 +1,5 @@ import torch -from torch.nn import functional as F + # TODO: merge these two function def heatmap_focal_loss( @@ -10,9 +10,9 @@ def heatmap_focal_loss( alpha: float = -1, beta: float = 4, gamma: float = 2, - reduction: str = 'sum', + reduction: str = "sum", sigmoid_clamp: float = 1e-4, - ignore_high_fp: float = -1., + ignore_high_fp: float = -1.0, ): """ Loss used in RetinaNet for dense detection: https://arxiv.org/abs/1708.02002. @@ -24,9 +24,9 @@ def heatmap_focal_loss( Returns: Loss tensor with the reduction option applied. """ - pred = torch.clamp(inputs.sigmoid_(), min=sigmoid_clamp, max=1-sigmoid_clamp) + 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_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 @@ -43,11 +43,13 @@ def heatmap_focal_loss( pos_loss = alpha * pos_loss neg_loss = (1 - alpha) * neg_loss - return - pos_loss, - 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, @@ -56,7 +58,7 @@ def binary_heatmap_focal_loss( beta: float = 4, gamma: float = 2, sigmoid_clamp: float = 1e-4, - ignore_high_fp: float = -1., + ignore_high_fp: float = -1.0, ): """ Args: @@ -66,17 +68,17 @@ def binary_heatmap_focal_loss( Returns: Loss tensor with the reduction option applied. """ - pred = torch.clamp(inputs.sigmoid_(), min=sigmoid_clamp, max=1-sigmoid_clamp) + 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_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() + pos_loss = -pos_loss.sum() + neg_loss = -neg_loss.sum() if alpha >= 0: pos_loss = alpha * pos_loss @@ -84,4 +86,5 @@ def binary_heatmap_focal_loss( return pos_loss, neg_loss -binary_heatmap_focal_loss_jit = torch.jit.script(binary_heatmap_focal_loss) \ No newline at end of file + +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 index 6a02464651..9cfe00765c 100644 --- 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 @@ -3,11 +3,11 @@ class IOULoss(nn.Module): - def __init__(self, loc_loss_type='iou'): + def __init__(self, loc_loss_type="iou"): super(IOULoss, self).__init__() self.loc_loss_type = loc_loss_type - def forward(self, pred, target, weight=None, reduction='sum'): + def forward(self, pred, target, weight=None, reduction="sum"): pred_left = pred[:, 0] pred_top = pred[:, 1] pred_right = pred[:, 2] @@ -18,20 +18,14 @@ def forward(self, pred, target, weight=None, reduction='sum'): 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) + 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) + 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) + 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 @@ -39,11 +33,11 @@ def forward(self, pred, target, weight=None, reduction='sum'): ious = (area_intersect + 1.0) / (area_union + 1.0) gious = ious - (ac_uion - area_union) / ac_uion - if self.loc_loss_type == 'iou': + if self.loc_loss_type == "iou": losses = -torch.log(ious) - elif self.loc_loss_type == 'linear_iou': + elif self.loc_loss_type == "linear_iou": losses = 1 - ious - elif self.loc_loss_type == 'giou': + elif self.loc_loss_type == "giou": losses = 1 - gious else: raise NotImplementedError @@ -53,11 +47,11 @@ def forward(self, pred, target, weight=None, reduction='sum'): else: losses = losses - if reduction == 'sum': + if reduction == "sum": return losses.sum() - elif reduction == 'batch': + elif reduction == "batch": return losses.sum(dim=[1]) - elif reduction == 'none': + elif reduction == "none": return losses else: raise NotImplementedError @@ -118,4 +112,4 @@ def giou_loss( elif reduction == "sum": loss = loss.sum() - return loss \ No newline at end of file + 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 index 325d709a98..80029fa60b 100644 --- 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 @@ -1,8 +1,7 @@ from detectron2.layers import batched_nms -def ml_nms(boxlist, nms_thresh, max_proposals=-1, - score_field="scores", label_field="labels"): +def ml_nms(boxlist, nms_thresh, max_proposals=-1, score_field="scores", label_field="labels"): """ Performs non-maximum suppression on a boxlist, with scores specified in a boxlist field via score_field. @@ -15,17 +14,16 @@ def ml_nms(boxlist, nms_thresh, max_proposals=-1, """ if nms_thresh <= 0: return boxlist - if boxlist.has('pred_boxes'): + 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)) + 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] + 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 index b7525c7b31..63a1cb13f9 100644 --- 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 @@ -1,6 +1,3 @@ -import math -import json -import numpy as np import torch from torch import nn @@ -9,6 +6,7 @@ from detectron2.modeling import detector_postprocess from detectron2.structures import ImageList + @META_ARCH_REGISTRY.register() class CenterNetDetector(nn.Module): def __init__(self, cfg): @@ -16,12 +14,12 @@ def __init__(self, cfg): 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 - - + 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) @@ -29,16 +27,13 @@ def forward(self, 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) + _, 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=True): images = self.preprocess_image(batched_inputs) @@ -48,7 +43,8 @@ def inference(self, batched_inputs, do_postprocess=True): processed_results = [] for results_per_image, input_per_image, image_size in zip( - proposals, batched_inputs, images.image_sizes): + proposals, batched_inputs, images.image_sizes + ): if do_postprocess: height = input_per_image.get("height", image_size[0]) width = input_per_image.get("width", image_size[1]) 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 index 1f0f430d0f..a0c44fec3d 100644 --- 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 @@ -1,51 +1,38 @@ # 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 logging import math -import json -from typing import Dict, Union import torch -from fvcore.nn import giou_loss, smooth_l1_loss from torch import nn from torch.nn import functional as F -from detectron2.config import configurable -from detectron2.layers import Linear, ShapeSpec, batched_nms, cat, nonzero_tuple -from detectron2.modeling.box_regression import Box2BoxTransform -from detectron2.structures import Boxes, Instances -from detectron2.utils.events import get_event_storage +from detectron2.layers import ShapeSpec, cat from detectron2.modeling.roi_heads.fast_rcnn import FastRCNNOutputLayers from detectron2.modeling.roi_heads.fast_rcnn import fast_rcnn_inference from detectron2.modeling.roi_heads.fast_rcnn import _log_classification_stats -from detectron2.utils.comm import get_world_size from .fed_loss import load_class_freq, get_fed_loss_inds __all__ = ["CustomFastRCNNOutputLayers"] + class CustomFastRCNNOutputLayers(FastRCNNOutputLayers): - def __init__( - self, - cfg, - input_shape: ShapeSpec, - **kwargs - ): + def __init__(self, cfg, input_shape: ShapeSpec, **kwargs): 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', + "freq_weight", load_class_freq( - cfg.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH, + cfg.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH, cfg.MODEL.ROI_BOX_HEAD.FED_LOSS_FREQ_WEIGHT, - ) + ), ) def losses(self, predictions, proposals): @@ -74,42 +61,40 @@ def losses(self, predictions, proposals): else: loss_cls = self.softmax_cross_entropy_loss(scores, gt_classes) return { - "loss_cls": loss_cls, + "loss_cls": loss_cls, "loss_box_reg": self.box_reg_loss( - proposal_boxes, gt_boxes, proposal_deltas, gt_classes) + 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. + 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 + 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 + 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) + 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] = 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 + 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 @@ -120,22 +105,18 @@ def softmax_cross_entropy_loss(self, pred_class_logits, gt_classes): 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) + 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. # C + 1 - appeared_mask[C] = 1. + 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") + pred_class_logits, gt_classes, weight=appeared_mask, reduction="mean" + ) else: - loss = F.cross_entropy( - pred_class_logits, gt_classes, reduction="mean") + loss = F.cross_entropy(pred_class_logits, gt_classes, reduction="mean") return loss - def inference(self, predictions, proposals): """ enable use proposal boxes @@ -143,9 +124,8 @@ def inference(self, predictions, proposals): 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)] + proposal_scores = [p.get("objectness_logits") for p in proposals] + scores = [(s * ps[:, None]) ** 0.5 for s, ps in zip(scores, proposal_scores)] image_shapes = [x.image_size for x in proposals] return fast_rcnn_inference( boxes, @@ -156,7 +136,6 @@ def inference(self, predictions, proposals): self.test_topk_per_image, ) - def predict_probs(self, predictions, proposals): """ support sigmoid 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 index 90fadf1a96..aefd1d164e 100644 --- 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 @@ -1,21 +1,12 @@ # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved -import numpy as np -import json -import math import torch -from torch import nn -from torch.autograd.function import Function -from typing import Dict, List, Optional, Tuple, Union -from detectron2.layers import ShapeSpec -from detectron2.structures import Boxes, Instances, pairwise_iou from detectron2.utils.events import get_event_storage from detectron2.modeling.box_regression import Box2BoxTransform 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.modeling.roi_heads.cascade_rcnn import CascadeROIHeads -from detectron2.modeling.roi_heads.box_head import build_box_head from .custom_fast_rcnn import CustomFastRCNNOutputLayers @@ -24,18 +15,19 @@ class CustomROIHeads(StandardROIHeads): @classmethod def _init_box_head(self, 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) + del ret["box_predictor"] + ret["box_predictor"] = CustomFastRCNNOutputLayers(cfg, ret["box_head"].output_shape) self.debug = cfg.DEBUG if self.debug: self.debug_show_name = cfg.DEBUG_SHOW_NAME self.save_debug = cfg.SAVE_DEBUG 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.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) + ) return ret def forward(self, images, features, proposals, targets=None): @@ -59,11 +51,14 @@ def forward(self, images, features, proposals, targets=None): pred_instances = self.forward_with_given_boxes(features, pred_instances) if self.debug: from ..debug import debug_second_stage + denormalizer = lambda x: 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) + pred_instances, + proposals=proposals, + debug_show_name=self.debug_show_name, + ) return pred_instances, {} @@ -73,40 +68,41 @@ class CustomCascadeROIHeads(CascadeROIHeads): def _init_box_head(self, cfg, input_shape): self.mult_proposal_score = cfg.MODEL.ROI_BOX_HEAD.MULT_PROPOSAL_SCORE ret = super()._init_box_head(cfg, input_shape) - del ret['box_predictors'] + 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): + for box_head, bbox_reg_weights in zip(ret["box_heads"], cascade_bbox_reg_weights): box_predictors.append( CustomFastRCNNOutputLayers( - cfg, box_head.output_shape, - box2box_transform=Box2BoxTransform(weights=bbox_reg_weights) - )) - ret['box_predictors'] = box_predictors + cfg, + box_head.output_shape, + box2box_transform=Box2BoxTransform(weights=bbox_reg_weights), + ) + ) + ret["box_predictors"] = box_predictors self.debug = cfg.DEBUG if self.debug: self.debug_show_name = cfg.DEBUG_SHOW_NAME self.save_debug = cfg.SAVE_DEBUG 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.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) + ) 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] + 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] - + 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 @@ -135,10 +131,9 @@ def _forward_box(self, features, proposals, targets=None): sum(list(scores_per_image)) * (1.0 / self.num_cascade_stages) for scores_per_image in zip(*scores_per_stage) ] - + if self.mult_proposal_score: - scores = [(s * ps[:, None]) ** 0.5 \ - for s, ps in zip(scores, proposal_scores)] + scores = [(s * ps[:, None]) ** 0.5 for s, ps in zip(scores, proposal_scores)] predictor, predictions, proposals = head_outputs[-1] boxes = predictor.predict_boxes(predictions, proposals) @@ -150,13 +145,13 @@ def _forward_box(self, features, proposals, targets=None): 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: @@ -173,13 +168,14 @@ def forward(self, images, features, proposals, targets=None): pred_instances = self.forward_with_given_boxes(features, pred_instances) if self.debug: from ..debug import debug_second_stage + denormalizer = lambda x: x * self.pixel_std + self.pixel_mean debug_second_stage( [denormalizer(x.clone()) for x in images], - pred_instances, proposals=proposals, + pred_instances, + proposals=proposals, save_debug=self.save_debug, debug_show_name=self.debug_show_name, - vis_thresh=self.vis_thresh) + 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 index 290f0f0720..d10e826786 100644 --- 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 @@ -1,21 +1,16 @@ import torch import json -import numpy as np -from torch.nn import functional as F -def load_class_freq( - path='datasets/lvis/lvis_v1_train_cat_info.json', - freq_weight=0.5): - cat_info = json.load(open(path, 'r')) - cat_info = torch.tensor( - [c['image_count'] for c in sorted(cat_info, key=lambda x: x['id'])]) + +def load_class_freq(path="datasets/lvis/lvis_v1_train_cat_info.json", freq_weight=0.5): + cat_info = json.load(open(path, "r")) + 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=50, C=1203, \ - weight=None, fed_cls_inds=-1): - appeared = torch.unique(gt_classes) # C' + +def get_fed_loss_inds(gt_classes, num_sample_cats=50, C=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: @@ -24,8 +19,6 @@ def get_fed_loss_inds( 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) + more_appeared = torch.multinomial(prob, num_sample_cats - len(appeared), replacement=False) appeared = torch.cat([appeared, more_appeared]) - return appeared \ No newline at end of file + return appeared diff --git a/dimos/models/Detic/third_party/CenterNet2/demo.py b/dimos/models/Detic/third_party/CenterNet2/demo.py index 5213faf4d8..281063f61b 100644 --- a/dimos/models/Detic/third_party/CenterNet2/demo.py +++ b/dimos/models/Detic/third_party/CenterNet2/demo.py @@ -13,13 +13,15 @@ from predictor import VisualizationDemo from centernet.config import add_centernet_config + # constants WINDOW_NAME = "CenterNet2 detections" from detectron2.utils.video_visualizer import VideoVisualizer -from detectron2.utils.visualizer import ColorMode, Visualizer +from detectron2.utils.visualizer import ColorMode from detectron2.data import MetadataCatalog + def setup_cfg(args): # load config from file and command-line arguments cfg = get_cfg() @@ -29,7 +31,7 @@ def setup_cfg(args): # 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']: + 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 @@ -50,8 +52,7 @@ def get_parser(): 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.", + help="A file or directory to save output visualizations. If not given, will show output in an OpenCV window.", ) parser.add_argument( @@ -86,17 +87,15 @@ def get_parser(): 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) + 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: + 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 @@ -134,7 +133,7 @@ def get_parser(): else: # cv2.namedWindow(WINDOW_NAME, cv2.WINDOW_NORMAL) cv2.imshow(WINDOW_NAME, visualized_output.get_image()[:, :, ::-1]) - if cv2.waitKey(1 ) == 27: + if cv2.waitKey(1) == 27: break # esc to quit elif args.webcam: assert args.input is None, "Cannot have both --input and --webcam!" @@ -149,7 +148,7 @@ def get_parser(): 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) + 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) diff --git a/dimos/models/Detic/third_party/CenterNet2/predictor.py b/dimos/models/Detic/third_party/CenterNet2/predictor.py index 8a036bde3f..990040fc03 100644 --- a/dimos/models/Detic/third_party/CenterNet2/predictor.py +++ b/dimos/models/Detic/third_party/CenterNet2/predictor.py @@ -65,8 +65,7 @@ def run_on_image(self, image, visualizer=None): if "instances" in predictions: instances = predictions["instances"].to(self.cpu_device) if use_video_vis: - vis_output = visualizer.draw_instance_predictions( - image, predictions=instances) + vis_output = visualizer.draw_instance_predictions(image, predictions=instances) else: vis_output = visualizer.draw_instance_predictions(predictions=instances) elif "proposals" in predictions: @@ -75,8 +74,7 @@ def run_on_image(self, image, visualizer=None): instances.scores = instances.objectness_logits instances.pred_classes[:] = -1 if use_video_vis: - vis_output = visualizer.draw_instance_predictions( - image, predictions=instances) + vis_output = visualizer.draw_instance_predictions(image, predictions=instances) else: vis_output = visualizer.draw_instance_predictions(predictions=instances) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/analyze_model.py b/dimos/models/Detic/third_party/CenterNet2/tools/analyze_model.py index 8e38f8b71e..75a4a794df 100755 --- a/dimos/models/Detic/third_party/CenterNet2/tools/analyze_model.py +++ b/dimos/models/Detic/third_party/CenterNet2/tools/analyze_model.py @@ -141,8 +141,7 @@ def do_structure(cfg): "--num-inputs", default=100, type=int, - help="number of inputs used to compute statistics for flops/activations, " - "both are data dependent.", + help="number of inputs used to compute statistics for flops/activations, both are data dependent.", ) args = parser.parse_args() assert not args.eval_only diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/benchmark.py b/dimos/models/Detic/third_party/CenterNet2/tools/benchmark.py index aaac564001..c2d673fab1 100755 --- a/dimos/models/Detic/third_party/CenterNet2/tools/benchmark.py +++ b/dimos/models/Detic/third_party/CenterNet2/tools/benchmark.py @@ -62,7 +62,7 @@ def create_data_benchmark(cfg, args): def RAM_msg(): vram = psutil.virtual_memory() return "RAM Usage: {:.2f}/{:.2f} GB".format( - (vram.total - vram.available) / 1024 ** 3, vram.total / 1024 ** 3 + (vram.total - vram.available) / 1024**3, vram.total / 1024**3 ) 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 index bb1bcee632..067309f241 100755 --- a/dimos/models/Detic/third_party/CenterNet2/tools/deploy/export_model.py +++ b/dimos/models/Detic/third_party/CenterNet2/tools/deploy/export_model.py @@ -147,7 +147,6 @@ def eval_wrapper(inputs): 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]) @@ -223,8 +222,7 @@ def get_sample_inputs(args): # run evaluation with the converted model if args.run_eval: assert exported_model is not None, ( - "Python inference is not yet implemented for " - f"export_method={args.export_method}, format={args.format}." + 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] 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 index bb62d36c0c..506e8baff6 100755 --- a/dimos/models/Detic/third_party/CenterNet2/tools/lazyconfig_train_net.py +++ b/dimos/models/Detic/third_party/CenterNet2/tools/lazyconfig_train_net.py @@ -12,6 +12,7 @@ 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 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 index f6734b566b..037957bac6 100644 --- a/dimos/models/Detic/third_party/CenterNet2/tools/lightning_train_net.py +++ b/dimos/models/Detic/third_party/CenterNet2/tools/lightning_train_net.py @@ -149,8 +149,9 @@ def validation_epoch_end(self, _outputs): v = float(v) except Exception as e: raise ValueError( - "[EvalHook] eval_function should return a nested dict of float. " - "Got '{}: {}' instead.".format(k, v) + "[EvalHook] eval_function should return a nested dict of float. Got '{}: {}' instead.".format( + k, v + ) ) from e self.storage.put_scalars(**flattened_results, smoothing_hint=False) @@ -191,9 +192,9 @@ def train(cfg, args): 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_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, + "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, 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 index 4851a8398e..2ff9080f7f 100755 --- a/dimos/models/Detic/third_party/CenterNet2/tools/plain_train_net.py +++ b/dimos/models/Detic/third_party/CenterNet2/tools/plain_train_net.py @@ -77,14 +77,14 @@ def get_evaluator(cfg, dataset_name, output_folder=None): 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." + 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." + 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) diff --git a/dimos/models/Detic/third_party/CenterNet2/tools/train_net.py b/dimos/models/Detic/third_party/CenterNet2/tools/train_net.py index 6ebf5f60a2..10334aa1d8 100755 --- a/dimos/models/Detic/third_party/CenterNet2/tools/train_net.py +++ b/dimos/models/Detic/third_party/CenterNet2/tools/train_net.py @@ -64,14 +64,14 @@ def build_evaluator(cfg, dataset_name, output_folder=None): 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." + 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." + 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) diff --git a/dimos/models/Detic/third_party/CenterNet2/train_net.py b/dimos/models/Detic/third_party/CenterNet2/train_net.py index d903efde07..1ca9f4cdd7 100644 --- a/dimos/models/Detic/third_party/CenterNet2/train_net.py +++ b/dimos/models/Detic/third_party/CenterNet2/train_net.py @@ -5,7 +5,6 @@ from torch.nn.parallel import DistributedDataParallel import time import datetime -import json from fvcore.common.timer import Timer import detectron2.utils.comm as comm @@ -40,34 +39,35 @@ 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)) + 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, "inference_{}".format(dataset_name)) + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference_{}".format(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': + 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) + + results[dataset_name] = inference_on_dataset(model, data_loader, evaluator) if comm.is_main_process(): - logger.info("Evaluation results for {} in csv format:".format( - dataset_name)) + logger.info("Evaluation results for {} in csv format:".format(dataset_name)) print_csv_format(results[dataset_name]) if len(results) == 1: results = list(results.values())[0] return results + def do_train(cfg, model, resume=False): model.train() optimizer = build_optimizer(cfg, model) @@ -79,11 +79,13 @@ def do_train(cfg, model, resume=False): start_iter = ( checkpointer.resume_or_load( - cfg.MODEL.WEIGHTS, resume=resume, - ).get("iteration", -1) + 1 + cfg.MODEL.WEIGHTS, + resume=resume, + ).get("iteration", -1) + + 1 ) if cfg.SOLVER.RESET_ITER: - logger.info('Reset loaded iteration. Start training from iteration 0.') + 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 @@ -101,15 +103,17 @@ def do_train(cfg, model, resume=False): 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']: + 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) + from centernet.data.custom_dataset_dataloader import build_custom_train_loader + data_loader = build_custom_train_loader(cfg, mapper=mapper) logger.info("Starting training from iteration {}".format(start_iter)) with EventStorage(start_iter) as storage: @@ -124,23 +128,19 @@ def do_train(cfg, model, resume=False): storage.step() loss_dict = model(data) - losses = sum( - loss for k, loss in loss_dict.items()) + 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()} + 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) + 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) + storage.put_scalar("lr", optimizer.param_groups[0]["lr"], smoothing_hint=False) step_time = step_timer.seconds() storage.put_scalars(time=step_time) @@ -155,16 +155,16 @@ def do_train(cfg, model, resume=False): do_test(cfg, model) comm.synchronize() - if iteration - start_iter > 5 and \ - (iteration % 20 == 0 or iteration == max_iter): + 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( - "Total training time: {}".format( - str(datetime.timedelta(seconds=int(total_time))))) + "Total training time: {}".format(str(datetime.timedelta(seconds=int(total_time)))) + ) + def setup(args): """ @@ -174,10 +174,10 @@ def setup(args): add_centernet_config(cfg) cfg.merge_from_file(args.config_file) cfg.merge_from_list(args.opts) - if '/auto' in cfg.OUTPUT_DIR: + if "/auto" in cfg.OUTPUT_DIR: file_name = os.path.basename(args.config_file)[:-5] - cfg.OUTPUT_DIR = cfg.OUTPUT_DIR.replace('/auto', '/{}'.format(file_name)) - logger.info('OUTPUT_DIR: {}'.format(cfg.OUTPUT_DIR)) + cfg.OUTPUT_DIR = cfg.OUTPUT_DIR.replace("/auto", "/{}".format(file_name)) + logger.info("OUTPUT_DIR: {}".format(cfg.OUTPUT_DIR)) cfg.freeze() default_setup(cfg, args) return cfg @@ -201,8 +201,10 @@ def main(args): distributed = comm.get_world_size() > 1 if distributed: model = DistributedDataParallel( - model, device_ids=[comm.get_local_rank()], broadcast_buffers=False, - find_unused_parameters=True + model, + device_ids=[comm.get_local_rank()], + broadcast_buffers=False, + find_unused_parameters=True, ) do_train(cfg, model, resume=args.resume) @@ -211,12 +213,11 @@ def main(args): if __name__ == "__main__": args = default_argument_parser() - args.add_argument('--manual_device', default='') + 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 = 'tcp://127.0.0.1:{}'.format( - torch.randint(11111, 60000, (1,))[0].item()) + if args.manual_device != "": + os.environ["CUDA_VISIBLE_DEVICES"] = args.manual_device + args.dist_url = "tcp://127.0.0.1:{}".format(torch.randint(11111, 60000, (1,))[0].item()) print("Command Line Args:", args) launch( main, diff --git a/dimos/models/Detic/third_party/Deformable-DETR/benchmark.py b/dimos/models/Detic/third_party/Deformable-DETR/benchmark.py index 5919477899..9830274aa6 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/benchmark.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/benchmark.py @@ -7,6 +7,7 @@ """ Benchmark inference speed of Deformable DETR. """ + import os import time import argparse @@ -20,11 +21,13 @@ 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') + 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 @@ -38,7 +41,7 @@ def measure_average_inference_time(model, inputs, num_iters=100, warm_iters=5): torch.cuda.synchronize() t = time.perf_counter() - t_ if iter_ >= warm_iters: - ts.append(t) + ts.append(t) print(ts) return sum(ts) / len(ts) @@ -49,19 +52,20 @@ def benchmark(): 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) + 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)]) + 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__': +if __name__ == "__main__": fps = benchmark() - print(f'Inference Speed: {fps:.1f} FPS') - + print(f"Inference Speed: {fps:.1f} FPS") diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/__init__.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/__init__.py index f5bd856992..d34b127147 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/__init__.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/datasets/__init__.py @@ -24,10 +24,11 @@ def get_coco_api_from_dataset(dataset): def build_dataset(image_set, args): - if args.dataset_file == 'coco': + if args.dataset_file == "coco": return build_coco(image_set, args) - if args.dataset_file == 'coco_panoptic': + 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') + 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 index 1be8308c84..00e3d431ba 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco.py @@ -12,6 +12,7 @@ Mostly copy-paste from https://github.com/pytorch/vision/blob/13b35ff/references/detection/coco_utils.py """ + from pathlib import Path import torch @@ -24,16 +25,30 @@ class CocoDetection(TvCocoDetection): - def __init__(self, img_folder, ann_file, transforms, return_masks, cache_mode=False, local_rank=0, local_size=1): - super(CocoDetection, self).__init__(img_folder, ann_file, - cache_mode=cache_mode, local_rank=local_rank, local_size=local_size) + def __init__( + self, + img_folder, + ann_file, + transforms, + return_masks, + cache_mode=False, + local_rank=0, + local_size=1, + ): + super(CocoDetection, self).__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): img, target = super(CocoDetection, self).__getitem__(idx) image_id = self.ids[idx] - target = {'image_id': image_id, 'annotations': target} + 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) @@ -69,7 +84,7 @@ def __call__(self, image, target): anno = target["annotations"] - anno = [obj for obj in anno if 'iscrowd' not in obj or obj['iscrowd'] == 0] + 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 @@ -123,47 +138,56 @@ def __call__(self, 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]) - ]) + 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), + if image_set == "train": + return T.Compose( + [ + T.RandomHorizontalFlip(), + T.RandomSelect( 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}') + 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' + 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'), + "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()) + 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 index 9a3ebe7e7d..b0b9a76d39 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_eval.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_eval.py @@ -14,6 +14,7 @@ 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 os import contextlib import copy @@ -49,7 +50,7 @@ def update(self, predictions): results = self.prepare(predictions, iou_type) # suppress pycocotools prints - with open(os.devnull, 'w') as devnull: + 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] @@ -63,7 +64,9 @@ def update(self, predictions): def synchronize_between_processes(self): 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]) + create_common_coco_eval( + self.coco_eval[iou_type], self.img_ids, self.eval_imgs[iou_type] + ) def accumulate(self): for coco_eval in self.coco_eval.values(): @@ -161,7 +164,7 @@ def prepare_for_coco_keypoint(self, predictions): { "image_id": original_id, "category_id": labels[k], - 'keypoints': keypoint, + "keypoints": keypoint, "score": scores[k], } for k, keypoint in enumerate(keypoints) @@ -214,17 +217,17 @@ def create_common_coco_eval(coco_eval, img_ids, eval_imgs): 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('useSegm (deprecated) is not None. Running {} evaluation'.format(p.iouType)) + p.iouType = "segm" if p.useSegm == 1 else "bbox" + print("useSegm (deprecated) is not None. Running {} evaluation".format(p.iouType)) # print('Evaluate annotation type *{}*'.format(p.iouType)) p.imgIds = list(np.unique(p.imgIds)) if p.useCats: @@ -236,14 +239,11 @@ def evaluate(self): # loop through images, area range, max detection number catIds = p.catIds if p.useCats else [-1] - if p.iouType == 'segm' or p.iouType == 'bbox': + if p.iouType == "segm" or p.iouType == "bbox": computeIoU = self.computeIoU - elif p.iouType == 'keypoints': + elif p.iouType == "keypoints": computeIoU = self.computeOks - self.ious = { - (imgId, catId): computeIoU(imgId, catId) - for imgId in p.imgIds - for catId in catIds} + self.ious = {(imgId, catId): computeIoU(imgId, catId) for imgId in p.imgIds for catId in catIds} evaluateImg = self.evaluateImg maxDet = p.maxDets[-1] @@ -260,6 +260,7 @@ def evaluate(self): # 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 index e856e49d84..f0697b63b2 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_panoptic.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/datasets/coco_panoptic.py @@ -22,16 +22,16 @@ class CocoPanoptic: def __init__(self, img_folder, ann_folder, ann_file, transforms=None, return_masks=True): - with open(ann_file, 'r') as f: + with open(ann_file, "r") 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']) + 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']): - assert img['file_name'][:-4] == ann['file_name'][:-4] + for img, ann in zip(self.coco["images"], self.coco["annotations"]): + assert img["file_name"][:-4] == ann["file_name"][:-4] self.img_folder = img_folder self.ann_folder = ann_folder @@ -40,35 +40,43 @@ def __init__(self, img_folder, ann_folder, ann_file, transforms=None, return_mas self.return_masks = return_masks def __getitem__(self, idx): - 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') + 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']]) + 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) + 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"]]) + 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["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)]) + 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']]) + 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) @@ -76,32 +84,37 @@ def __getitem__(self, idx): return img, target def __len__(self): - return len(self.coco['images']) + return len(self.coco["images"]) def get_height_and_width(self, idx): - img_info = self.coco['images'][idx] - height = img_info['height'] - width = img_info['width'] + 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' + 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'), + "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_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) + 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 index 7d28d9fdd7..731ebc19d4 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/data_prefetcher.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/datasets/data_prefetcher.py @@ -6,12 +6,14 @@ 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(): + +class data_prefetcher: def __init__(self, loader, device, prefetch=True): self.loader = iter(loader) self.prefetch = prefetch @@ -35,7 +37,9 @@ def preload(self): # 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) + 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) 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 index 0dabffdb58..ad606603a9 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/panoptic_eval.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/datasets/panoptic_eval.py @@ -48,5 +48,10 @@ def summarize(self): 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 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 index 14c0af2f98..a8892f7561 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/samplers.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/datasets/samplers.py @@ -28,7 +28,9 @@ class DistributedSampler(Sampler): rank (optional): Rank of the current process within num_replicas. """ - def __init__(self, dataset, num_replicas=None, rank=None, local_rank=None, local_size=None, shuffle=True): + def __init__( + self, dataset, num_replicas=None, rank=None, local_rank=None, local_size=None, shuffle=True + ): if num_replicas is None: if not dist.is_available(): raise RuntimeError("Requires distributed package to be available") @@ -87,7 +89,9 @@ class NodeDistributedSampler(Sampler): rank (optional): Rank of the current process within num_replicas. """ - def __init__(self, dataset, num_replicas=None, rank=None, local_rank=None, local_size=None, shuffle=True): + def __init__( + self, dataset, num_replicas=None, rank=None, local_rank=None, local_size=None, shuffle=True + ): if num_replicas is None: if not dist.is_available(): raise RuntimeError("Requires distributed package to be available") @@ -97,9 +101,9 @@ def __init__(self, dataset, num_replicas=None, rank=None, local_rank=None, local 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)) + local_rank = int(os.environ.get("LOCAL_RANK", 0)) if local_size is None: - local_size = int(os.environ.get('LOCAL_SIZE', 1)) + local_size = int(os.environ.get("LOCAL_SIZE", 1)) self.dataset = dataset self.shuffle = shuffle self.num_replicas = num_replicas @@ -123,11 +127,14 @@ def __iter__(self): 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))] + 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] + 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) 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 index 45b5f52fa9..a634e37e47 100644 --- 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 @@ -9,6 +9,7 @@ """ Copy-Paste from torchvision, but add utility of caching images on memory """ + from torchvision.datasets.vision import VisionDataset from PIL import Image import os @@ -30,10 +31,20 @@ class CocoDetection(VisionDataset): and returns a transformed version. """ - def __init__(self, root, annFile, transform=None, target_transform=None, transforms=None, - cache_mode=False, local_rank=0, local_size=1): + def __init__( + self, + root, + annFile, + transform=None, + target_transform=None, + transforms=None, + cache_mode=False, + local_rank=0, + local_size=1, + ): super(CocoDetection, self).__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 @@ -48,17 +59,17 @@ def cache_images(self): for index, img_id in zip(tqdm.trange(len(self.ids)), self.ids): 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: + 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: + 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') + return Image.open(BytesIO(self.cache[path])).convert("RGB") + return Image.open(os.path.join(self.root, path)).convert("RGB") def __getitem__(self, index): """ @@ -72,7 +83,7 @@ def __getitem__(self, index): ann_ids = coco.getAnnIds(imgIds=img_id) target = coco.loadAnns(ann_ids) - path = coco.loadImgs(img_id)[0]['file_name'] + path = coco.loadImgs(img_id)[0]["file_name"] img = self.get_image(path) if self.transforms is not None: diff --git a/dimos/models/Detic/third_party/Deformable-DETR/datasets/transforms.py b/dimos/models/Detic/third_party/Deformable-DETR/datasets/transforms.py index 8f4baeb51c..08a771d475 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/datasets/transforms.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/datasets/transforms.py @@ -10,6 +10,7 @@ """ Transforms and data augmentation for both image + bbox. """ + import random import PIL @@ -45,7 +46,7 @@ def crop(image, target, region): 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] + 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 @@ -53,10 +54,10 @@ def crop(image, target, region): # 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) + 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) + keep = target["masks"].flatten(1).any(1) for field in fields: target[field] = target[field][keep] @@ -72,11 +73,13 @@ def hflip(image, target): 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]) + 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) + target["masks"] = target["masks"].flip(-1) return flipped_image, target @@ -122,7 +125,9 @@ def get_size(image_size, size, max_size=None): target = target.copy() if "boxes" in target: boxes = target["boxes"] - scaled_boxes = boxes * torch.as_tensor([ratio_width, ratio_height, ratio_width, ratio_height]) + scaled_boxes = boxes * torch.as_tensor( + [ratio_width, ratio_height, ratio_width, ratio_height] + ) target["boxes"] = scaled_boxes if "area" in target: @@ -134,8 +139,9 @@ def get_size(image_size, size, max_size=None): target["size"] = torch.tensor([h, w]) if "masks" in target: - target['masks'] = interpolate( - target['masks'][:, None].float(), size, mode="nearest")[:, 0] > 0.5 + target["masks"] = ( + interpolate(target["masks"][:, None].float(), size, mode="nearest")[:, 0] > 0.5 + ) return rescaled_image, target @@ -149,7 +155,7 @@ def pad(image, target, padding): # 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])) + target["masks"] = torch.nn.functional.pad(target["masks"], (0, padding[0], 0, padding[1])) return padded_image, target @@ -181,8 +187,8 @@ def __init__(self, size): def __call__(self, img, target): image_width, image_height = img.size crop_height, crop_width = self.size - crop_top = int(round((image_height - crop_height) / 2.)) - crop_left = int(round((image_width - crop_width) / 2.)) + crop_top = int(round((image_height - crop_height) / 2.0)) + crop_left = int(round((image_width - crop_width) / 2.0)) return crop(img, target, (crop_top, crop_left, crop_height, crop_width)) @@ -222,6 +228,7 @@ class RandomSelect(object): Randomly selects between transforms1 and transforms2, with probability p for transforms1 and (1 - p) for transforms2 """ + def __init__(self, transforms1, transforms2, p=0.5): self.transforms1 = transforms1 self.transforms2 = transforms2 @@ -239,7 +246,6 @@ def __call__(self, img, target): class RandomErasing(object): - def __init__(self, *args, **kwargs): self.eraser = T.RandomErasing(*args, **kwargs) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/engine.py b/dimos/models/Detic/third_party/Deformable-DETR/engine.py index 1ae2ae9591..f47471648c 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/engine.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/engine.py @@ -10,6 +10,7 @@ """ Train and eval functions used in main.py """ + import math import os import sys @@ -22,16 +23,22 @@ from datasets.data_prefetcher import data_prefetcher -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): +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 = 'Epoch: [{}]'.format(epoch) + 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 = "Epoch: [{}]".format(epoch) print_freq = 10 prefetcher = data_prefetcher(data_loader, device, prefetch=True) @@ -46,10 +53,10 @@ def train_one_epoch(model: torch.nn.Module, criterion: torch.nn.Module, # 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} + 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() @@ -67,8 +74,10 @@ def train_one_epoch(model: torch.nn.Module, criterion: torch.nn.Module, 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( + 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) @@ -85,15 +94,15 @@ def evaluate(model, criterion, postprocessors, data_loader, base_ds, device, out criterion.eval() metric_logger = utils.MetricLogger(delimiter=" ") - metric_logger.add_meter('class_error', utils.SmoothedValue(window_size=1, fmt='{value:.2f}')) - header = 'Test:' + 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()) + 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(): + if "panoptic" in postprocessors.keys(): panoptic_evaluator = PanopticEvaluator( data_loader.dataset.ann_file, data_loader.dataset.ann_folder, @@ -110,21 +119,23 @@ def evaluate(model, criterion, postprocessors, data_loader, base_ds, device, out # 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']) + 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(): + 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)} + results = postprocessors["segm"](results, outputs, orig_target_sizes, target_sizes) + res = {target["image_id"].item(): output for target, output in zip(targets, results)} if coco_evaluator is not None: coco_evaluator.update(res) @@ -155,12 +166,12 @@ def evaluate(model, criterion, postprocessors, data_loader, base_ds, device, out 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 "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"] + 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 index fc6ccfac28..ff91fd52a5 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/main.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/main.py @@ -27,101 +27,143 @@ 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') + 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') + 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") + 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') + 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) + 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") + 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)") + 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") + 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) + 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') + 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 @@ -147,10 +189,10 @@ def main(args): model_without_ddp = model n_parameters = sum(p.numel() for p in model.parameters() if p.requires_grad) - print('number of params:', n_parameters) + print("number of params:", n_parameters) - dataset_train = build_dataset(image_set='train', args=args) - dataset_val = build_dataset(image_set='val', args=args) + 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: @@ -164,14 +206,25 @@ def main(args): 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) + 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): @@ -187,26 +240,38 @@ def match_name_keywords(n, name_keywords): 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], + "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], + "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], + "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) + 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) + 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: @@ -221,48 +286,66 @@ def match_name_keywords(n, name_keywords): 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']) + 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'): + if args.resume.startswith("https"): checkpoint = torch.hub.load_state_dict_from_url( - args.resume, map_location='cpu', check_hash=True) + 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'))] + 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('Missing Keys: {}'.format(missing_keys)) + print("Missing Keys: {}".format(missing_keys)) if len(unexpected_keys) > 0: - print('Unexpected Keys: {}'.format(unexpected_keys)) - if not args.eval and 'optimizer' in checkpoint and 'lr_scheduler' in checkpoint and 'epoch' in checkpoint: + print("Unexpected Keys: {}".format(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']) + optimizer.load_state_dict(checkpoint["optimizer"]) for pg, pg_old in zip(optimizer.param_groups, p_groups): - pg['lr'] = pg_old['lr'] - pg['initial_lr'] = pg_old['initial_lr'] + pg["lr"] = pg_old["lr"] + pg["initial_lr"] = pg_old["initial_lr"] print(optimizer.param_groups) - lr_scheduler.load_state_dict(checkpoint['lr_scheduler']) + 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.') + 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.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 + 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) + 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 @@ -273,30 +356,36 @@ def match_name_keywords(n, name_keywords): 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) + 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'] + 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') + 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) + 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} + 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: @@ -304,22 +393,25 @@ def match_name_keywords(n, name_keywords): # for evaluation logs if coco_evaluator is not None: - (output_dir / 'eval').mkdir(exist_ok=True) + (output_dir / "eval").mkdir(exist_ok=True) if "bbox" in coco_evaluator.coco_eval: - filenames = ['latest.pth'] + filenames = ["latest.pth"] if epoch % 50 == 0: - filenames.append(f'{epoch:03}.pth') + filenames.append(f"{epoch:03}.pth") for name in filenames: - torch.save(coco_evaluator.coco_eval["bbox"].eval, - output_dir / "eval" / name) + 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('Training time {}'.format(total_time_str)) + print("Training time {}".format(total_time_str)) -if __name__ == '__main__': - parser = argparse.ArgumentParser('Deformable DETR training and evaluation script', parents=[get_args_parser()]) +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) diff --git a/dimos/models/Detic/third_party/Deformable-DETR/models/__init__.py b/dimos/models/Detic/third_party/Deformable-DETR/models/__init__.py index 9a59c33484..46b898b988 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/__init__.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/__init__.py @@ -12,4 +12,3 @@ 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 index 4bfe7053e9..341dac2bde 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/backbone.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/backbone.py @@ -10,7 +10,6 @@ """ Backbone modules. """ -from collections import OrderedDict import torch import torch.nn.functional as F @@ -41,15 +40,16 @@ def __init__(self, n, eps=1e-5): self.register_buffer("running_var", torch.ones(n)) self.eps = eps - def _load_from_state_dict(self, state_dict, prefix, local_metadata, strict, - missing_keys, unexpected_keys, error_msgs): - num_batches_tracked_key = prefix + 'num_batches_tracked' + def _load_from_state_dict( + self, state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs + ): + num_batches_tracked_key = prefix + "num_batches_tracked" if num_batches_tracked_key in state_dict: del state_dict[num_batches_tracked_key] super(FrozenBatchNorm2d, self)._load_from_state_dict( - state_dict, prefix, local_metadata, strict, - missing_keys, unexpected_keys, error_msgs) + state_dict, prefix, local_metadata, strict, missing_keys, unexpected_keys, error_msgs + ) def forward(self, x): # move reshapes to the beginning @@ -65,11 +65,15 @@ def forward(self, x): class BackboneBase(nn.Module): - def __init__(self, backbone: nn.Module, train_backbone: bool, return_interm_layers: bool): 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: + 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"} @@ -77,7 +81,7 @@ def __init__(self, backbone: nn.Module, train_backbone: bool, return_interm_laye self.strides = [8, 16, 32] self.num_channels = [512, 1024, 2048] else: - return_layers = {'layer4': "0"} + return_layers = {"layer4": "0"} self.strides = [32] self.num_channels = [2048] self.body = IntermediateLayerGetter(backbone, return_layers=return_layers) @@ -95,15 +99,15 @@ def forward(self, tensor_list: NestedTensor): class Backbone(BackboneBase): """ResNet backbone with frozen BatchNorm.""" - def __init__(self, name: str, - train_backbone: bool, - return_interm_layers: bool, - dilation: bool): + + def __init__(self, name: str, train_backbone: bool, return_interm_layers: bool, dilation: bool): 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" + 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 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 index f1415e8562..cce6571795 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_detr.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_detr.py @@ -10,20 +10,32 @@ """ Deformable DETR model and criterion classes. """ + import torch import torch.nn.functional as F from torch import nn import math from util import box_ops -from util.misc import (NestedTensor, nested_tensor_from_tensor_list, - accuracy, get_world_size, interpolate, - is_dist_avail_and_initialized, inverse_sigmoid) +from util.misc import ( + NestedTensor, + nested_tensor_from_tensor_list, + accuracy, + get_world_size, + interpolate, + is_dist_avail_and_initialized, + inverse_sigmoid, +) from .backbone import build_backbone from .matcher import build_matcher -from .segmentation import (DETRsegm, PostProcessPanoptic, PostProcessSegm, - dice_loss, sigmoid_focal_loss) +from .segmentation import ( + DETRsegm, + PostProcessPanoptic, + PostProcessSegm, + dice_loss, + sigmoid_focal_loss, +) from .deformable_transformer import build_deforamble_transformer import copy @@ -33,10 +45,20 @@ def _get_clones(module, N): class DeformableDETR(nn.Module): - """ This is the Deformable DETR module that performs object detection """ - def __init__(self, backbone, transformer, num_classes, num_queries, num_feature_levels, - aux_loss=True, with_box_refine=False, two_stage=False): - """ Initializes the model. + """This is the Deformable DETR module that performs object detection""" + + def __init__( + self, + backbone, + transformer, + num_classes, + num_queries, + num_feature_levels, + aux_loss=True, + with_box_refine=False, + two_stage=False, + ): + """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 @@ -55,29 +77,36 @@ def __init__(self, backbone, transformer, num_classes, num_queries, num_feature_ 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) + 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), - )) + 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), - )) + 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.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 @@ -93,7 +122,9 @@ def __init__(self, backbone, transformer, num_classes, num_queries, num_feature_ 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 + 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) @@ -112,19 +143,19 @@ def __init__(self, backbone, transformer, num_classes, num_queries, num_feature_ 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. + """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) @@ -154,7 +185,9 @@ def forward(self, samples: NestedTensor): 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) + hs, init_reference, inter_references, enc_outputs_class, enc_outputs_coord_unact = ( + self.transformer(srcs, masks, pos, query_embeds) + ) outputs_classes = [] outputs_coords = [] @@ -177,13 +210,13 @@ def forward(self, samples: NestedTensor): outputs_class = torch.stack(outputs_classes) outputs_coord = torch.stack(outputs_coords) - out = {'pred_logits': outputs_class[-1], 'pred_boxes': outputs_coord[-1]} + 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) + 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} + out["enc_outputs"] = {"pred_logits": enc_outputs_class, "pred_boxes": enc_outputs_coord} return out @torch.jit.unused @@ -191,18 +224,21 @@ 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])] + return [ + {"pred_logits": a, "pred_boxes": b} + for a, b in zip(outputs_class[:-1], outputs_coord[:-1]) + ] class SetCriterion(nn.Module): - """ This class computes the loss for DETR. + """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, matcher, weight_dict, losses, focal_alpha=0.25): - """ Create the criterion. + """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 @@ -221,66 +257,78 @@ def loss_labels(self, outputs, targets, indices, num_boxes, log=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'] + 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)]) - target_classes = torch.full(src_logits.shape[:2], self.num_classes, - dtype=torch.int64, device=src_logits.device) + 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 = 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} + 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] + 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): - """ Compute the cardinality error, ie the absolute error in the number of predicted non-empty boxes + """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'] + 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} + losses = {"cardinality_error": card_err} return losses def loss_boxes(self, outputs, targets, indices, num_boxes): """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. + 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 + 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)], dim=0) + src_boxes = outputs["pred_boxes"][idx] + target_boxes = torch.cat([t["boxes"][i] for t, (_, i) in zip(targets, indices)], dim=0) - loss_bbox = F.l1_loss(src_boxes, target_boxes, reduction='none') + 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 + 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): """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] + targets dicts must contain the key "masks" containing a tensor of dim [nb_target_boxes, h, w] """ assert "pred_masks" in outputs @@ -290,13 +338,16 @@ def loss_masks(self, outputs, targets, indices, num_boxes): 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, 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 = 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) @@ -321,29 +372,33 @@ def _get_tgt_permutation_idx(self, indices): def get_loss(self, loss, outputs, targets, indices, num_boxes, **kwargs): loss_map = { - 'labels': self.loss_labels, - 'cardinality': self.loss_cardinality, - 'boxes': self.loss_boxes, - 'masks': self.loss_masks + "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?' + 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. + """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'} + 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) + 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() @@ -355,55 +410,55 @@ def forward(self, outputs, targets): 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']): + 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': + if loss == "masks": # Intermediate masks losses are too costly to compute, we ignore them. continue kwargs = {} - if loss == 'labels': + if loss == "labels": # Logging is enabled only for the last layer - kwargs['log'] = False + 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()} + 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'] + 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']) + bt["labels"] = torch.zeros_like(bt["labels"]) indices = self.matcher(enc_outputs, bin_targets) for loss in self.losses: - if loss == 'masks': + if loss == "masks": # Intermediate masks losses are too costly to compute, we ignore them. continue kwargs = {} - if loss == 'labels': + if loss == "labels": # Logging is enabled only for the last layer - kwargs['log'] = False + kwargs["log"] = False l_dict = self.get_loss(loss, enc_outputs, bin_targets, indices, num_boxes, **kwargs) - l_dict = {k + f'_enc': v for k, v in l_dict.items()} + 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""" + """This module converts the model's output into the format expected by the coco api""" @torch.no_grad() def forward(self, outputs, target_sizes): - """ Perform the computation + """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'] + out_logits, out_bbox = outputs["pred_logits"], outputs["pred_boxes"] assert len(out_logits) == len(target_sizes) assert target_sizes.shape[1] == 2 @@ -414,26 +469,28 @@ def forward(self, outputs, target_sizes): 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)) + 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)] + results = [{"scores": s, "labels": l, "boxes": b} for s, l, b in zip(scores, labels, boxes)] return results class MLP(nn.Module): - """ Very simple multi-layer perceptron (also called FFN)""" + """Very simple multi-layer perceptron (also called FFN)""" def __init__(self, input_dim, hidden_dim, output_dim, num_layers): 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])) + self.layers = nn.ModuleList( + nn.Linear(n, k) for n, k in zip([input_dim] + h, h + [output_dim]) + ) def forward(self, x): for i, layer in enumerate(self.layers): @@ -442,7 +499,7 @@ def forward(self, x): def build(args): - num_classes = 20 if args.dataset_file != 'coco' else 91 + num_classes = 20 if args.dataset_file != "coco" else 91 if args.dataset_file == "coco_panoptic": num_classes = 250 device = torch.device(args.device) @@ -463,8 +520,8 @@ def build(args): 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 + 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 @@ -472,19 +529,21 @@ def build(args): 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 + f'_enc': v for k, v in weight_dict.items()}) + 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'] + 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 = SetCriterion( + num_classes, matcher, weight_dict, losses, focal_alpha=args.focal_alpha + ) criterion.to(device) - postprocessors = {'bbox': PostProcess()} + postprocessors = {"bbox": PostProcess()} if args.masks: - postprocessors['segm'] = PostProcessSegm() + 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) 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 index 08ca377798..6e75127833 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_transformer.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/deformable_transformer.py @@ -8,24 +8,34 @@ # ------------------------------------------------------------------------ import copy -from typing import Optional, List import math import torch import torch.nn.functional as F -from torch import nn, Tensor -from torch.nn.init import xavier_uniform_, constant_, uniform_, normal_ +from torch import nn +from torch.nn.init import xavier_uniform_, constant_, normal_ from util.misc import inverse_sigmoid from models.ops.modules import MSDeformAttn class DeformableTransformer(nn.Module): - def __init__(self, d_model=256, nhead=8, - num_encoder_layers=6, num_decoder_layers=6, dim_feedforward=1024, dropout=0.1, - activation="relu", return_intermediate_dec=False, - num_feature_levels=4, dec_n_points=4, enc_n_points=4, - two_stage=False, two_stage_num_proposals=300): + def __init__( + self, + d_model=256, + nhead=8, + num_encoder_layers=6, + num_decoder_layers=6, + dim_feedforward=1024, + dropout=0.1, + activation="relu", + return_intermediate_dec=False, + num_feature_levels=4, + dec_n_points=4, + enc_n_points=4, + two_stage=False, + two_stage_num_proposals=300, + ): super().__init__() self.d_model = d_model @@ -33,15 +43,17 @@ def __init__(self, d_model=256, nhead=8, 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) + 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) + 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)) @@ -64,7 +76,7 @@ def _reset_parameters(self): 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.) + constant_(self.reference_points.bias.data, 0.0) normal_(self.level_embed) def get_proposal_pos_embed(self, proposals): @@ -88,25 +100,31 @@ def gen_encoder_output_proposals(self, memory, memory_padding_mask, spatial_shap 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) + 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_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) + 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_) + _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_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_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)) @@ -145,29 +163,48 @@ def forward(self, srcs, masks, pos_embeds, query_embed=None): 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])) + 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) + 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) + 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 + 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 = 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))) + 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) @@ -177,20 +214,40 @@ def forward(self, srcs, masks, pos_embeds, query_embed=None): 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) + 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, + 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=256, d_ffn=1024, - dropout=0.1, activation="relu", - n_levels=4, n_heads=8, n_points=4): + def __init__( + self, + d_model=256, + d_ffn=1024, + dropout=0.1, + activation="relu", + n_levels=4, + n_heads=8, + n_points=4, + ): super().__init__() # self attention @@ -216,9 +273,18 @@ def forward_ffn(self, src): src = self.norm2(src) return src - def forward(self, src, pos, reference_points, spatial_shapes, level_start_index, padding_mask=None): + 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) + 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) @@ -238,9 +304,10 @@ def __init__(self, encoder_layer, num_layers): 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_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) @@ -249,19 +316,32 @@ def get_reference_points(spatial_shapes, valid_ratios, device): 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): + 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) + 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) + output = layer( + output, pos, reference_points, spatial_shapes, level_start_index, padding_mask + ) return output class DeformableTransformerDecoderLayer(nn.Module): - def __init__(self, d_model=256, d_ffn=1024, - dropout=0.1, activation="relu", - n_levels=4, n_heads=8, n_points=4): + def __init__( + self, + d_model=256, + d_ffn=1024, + dropout=0.1, + activation="relu", + n_levels=4, + n_heads=8, + n_points=4, + ): super().__init__() # cross attention @@ -292,17 +372,33 @@ def forward_ffn(self, tgt): 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): + 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) + 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) + 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) @@ -322,20 +418,39 @@ def __init__(self, decoder_layer, num_layers, return_intermediate=False): 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): + 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] + 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) + 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: @@ -372,7 +487,7 @@ def _get_activation_fn(activation): return F.gelu if activation == "glu": return F.glu - raise RuntimeError(F"activation should be relu/gelu, not {activation}.") + raise RuntimeError(f"activation should be relu/gelu, not {activation}.") def build_deforamble_transformer(args): @@ -389,6 +504,5 @@ def build_deforamble_transformer(args): 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) - - + 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 index 63ef029425..29838972ab 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/matcher.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/matcher.py @@ -10,6 +10,7 @@ """ Modules to compute the matching cost and solve the corresponding LSAP. """ + import torch from scipy.optimize import linear_sum_assignment from torch import nn @@ -25,10 +26,7 @@ class HungarianMatcher(nn.Module): 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): + def __init__(self, cost_class: float = 1, cost_bbox: float = 1, cost_giou: float = 1): """Creates the matcher Params: @@ -43,7 +41,7 @@ def __init__(self, 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 + """Performs the matching Params: outputs: This is a dict that contains at least these entries: @@ -76,7 +74,7 @@ def forward(self, outputs, 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()) + 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] @@ -84,19 +82,27 @@ def forward(self, outputs, targets): 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)) + 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 = ( + 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] + 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) + 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 index 8a2197bda3..c528f3c6cf 100644 --- 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 @@ -7,4 +7,3 @@ # ------------------------------------------------------------------------------------------------ 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 index 8c5df8cf5d..c18582590e 100644 --- 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 @@ -20,20 +20,52 @@ class MSDeformAttnFunction(Function): @staticmethod - def forward(ctx, value, value_spatial_shapes, value_level_start_index, sampling_locations, attention_weights, im2col_step): + 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) + 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) + ( + 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 @@ -48,14 +80,19 @@ def ms_deform_attn_core_pytorch(value, value_spatial_shapes, sampling_locations, 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_) + 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_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_) + 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/modules/ms_deform_attn.py b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/modules/ms_deform_attn.py index 663d64a3d2..bc02668b96 100644 --- 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 @@ -24,7 +24,7 @@ def _is_power_of_2(n): if (not isinstance(n, int)) or (n < 0): raise ValueError("invalid input for _is_power_of_2: {} (type: {})".format(n, type(n))) - return (n & (n-1) == 0) and n != 0 + return (n & (n - 1) == 0) and n != 0 class MSDeformAttn(nn.Module): @@ -38,12 +38,16 @@ def __init__(self, d_model=256, n_levels=4, n_heads=8, n_points=4): """ super().__init__() if d_model % n_heads != 0: - raise ValueError('d_model must be divisible by n_heads, but got {} and {}'.format(d_model, n_heads)) + raise ValueError( + "d_model must be divisible by n_heads, but got {} and {}".format(d_model, 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.") + 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." + ) self.im2col_step = 64 @@ -60,22 +64,34 @@ def __init__(self, d_model=256, n_levels=4, n_heads=8, n_points=4): self._reset_parameters() def _reset_parameters(self): - constant_(self.sampling_offsets.weight.data, 0.) + 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) + 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.) - constant_(self.attention_weights.bias.data, 0.) + 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.) + constant_(self.value_proj.bias.data, 0.0) xavier_uniform_(self.output_proj.weight.data) - constant_(self.output_proj.bias.data, 0.) - - def forward(self, query, reference_points, input_flatten, input_spatial_shapes, input_level_start_index, input_padding_mask=None): + 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, + ): """ :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 @@ -95,21 +111,42 @@ def forward(self, query, reference_points, input_flatten, input_spatial_shapes, 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) + 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, :] + 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 + sampling_locations = ( + reference_points[:, :, None, :, None, :2] + + sampling_offsets / self.n_points * reference_points[:, :, None, :, None, 2:] * 0.5 + ) else: raise ValueError( - 'Last dim of reference_points must be 2 or 4, but get {} instead.'.format(reference_points.shape[-1])) + "Last dim of reference_points must be 2 or 4, but get {} instead.".format( + reference_points.shape[-1] + ) + ) output = MSDeformAttnFunction.apply( - value, input_spatial_shapes, input_level_start_index, sampling_locations, attention_weights, self.im2col_step) + 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 index a0131bc21c..7cf252f0cf 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/setup.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/setup.py @@ -20,6 +20,7 @@ requirements = ["torch", "torchvision"] + def get_extensions(): this_dir = os.path.dirname(os.path.abspath(__file__)) extensions_dir = os.path.join(this_dir, "src") @@ -44,7 +45,7 @@ def get_extensions(): "-D__CUDA_NO_HALF2_OPERATORS__", ] else: - raise NotImplementedError('Cuda is not availabel') + raise NotImplementedError("Cuda is not availabel") sources = [os.path.join(extensions_dir, s) for s in sources] include_dirs = [extensions_dir] @@ -59,13 +60,19 @@ def get_extensions(): ] 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",)), + 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/test.py b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/test.py index 8dbf6d5547..3fa3c7da6d 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/ops/test.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/ops/test.py @@ -10,9 +10,7 @@ from __future__ import print_function from __future__ import division -import time import torch -import torch.nn as nn from torch.autograd import gradcheck from functions.ms_deform_attn_func import MSDeformAttnFunction, ms_deform_attn_core_pytorch @@ -21,8 +19,8 @@ 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]) +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) @@ -35,13 +33,32 @@ def check_forward_equal_with_pytorch_double(): 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() + 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}') + 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() @@ -51,17 +68,30 @@ def check_forward_equal_with_pytorch_float(): 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() + 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}') + 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=4, grad_value=True, grad_sampling_loc=True, grad_attn_weight=True): - +def check_gradient_numerical( + channels=4, grad_value=True, grad_sampling_loc=True, grad_attn_weight=True +): 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 @@ -73,17 +103,24 @@ def check_gradient_numerical(channels=4, grad_value=True, grad_sampling_loc=True 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)) + 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})') + print(f"* {gradok} check_gradient_numerical(D={channels})") -if __name__ == '__main__': +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 index a92f0d36ae..c0ab1b34c3 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/position_encoding.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/position_encoding.py @@ -10,6 +10,7 @@ """ Various positional encodings for the transformer. """ + import math import torch from torch import nn @@ -22,6 +23,7 @@ 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=64, temperature=10000, normalize=False, scale=None): super().__init__() self.num_pos_feats = num_pos_feats @@ -50,8 +52,12 @@ def forward(self, tensor_list: NestedTensor): 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_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 @@ -60,6 +66,7 @@ class PositionEmbeddingLearned(nn.Module): """ Absolute pos embedding, learned. """ + def __init__(self, num_pos_feats=256): super().__init__() self.row_embed = nn.Embedding(50, num_pos_feats) @@ -77,19 +84,27 @@ def forward(self, tensor_list: NestedTensor): 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) + 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'): + 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'): + elif args.position_embedding in ("v3", "learned"): position_embedding = PositionEmbeddingLearned(N_steps) else: raise ValueError(f"not supported {args.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 index c801c0eaad..edb3f0a3c4 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/models/segmentation.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/models/segmentation.py @@ -10,6 +10,7 @@ """ This file provides the definition of the convolutional heads used to predict masks, as well as the losses """ + import io from collections import defaultdict @@ -56,14 +57,19 @@ def forward(self, samples: NestedTensor): 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]) + {"pred_logits": a, "pred_boxes": b} + for a, b in zip(outputs_class[:-1], outputs_coord[:-1]) ] # 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]) + 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 @@ -78,7 +84,14 @@ class MaskHeadSmallConv(nn.Module): def __init__(self, dim, fpn_dims, context_dim): super().__init__() - inter_dims = [dim, context_dim // 2, context_dim // 4, context_dim // 8, context_dim // 16, context_dim // 64] + 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) @@ -165,7 +178,9 @@ 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]) + 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: @@ -231,10 +246,14 @@ def forward(self, results, outputs, orig_target_sizes, max_target_sizes): 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 = 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)): + for i, (cur_mask, t, tt) in enumerate( + zip(outputs_masks, max_target_sizes, orig_target_sizes) + ): img_h, img_w = t[0], t[1] results[i]["masks"] = cur_mask[:, :img_h, :img_w].unsqueeze(1) results[i]["masks"] = F.interpolate( @@ -246,7 +265,7 @@ def forward(self, results, outputs, orig_target_sizes, max_target_sizes): 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 """ + coco panoptic API""" def __init__(self, is_thing_map, threshold=0.85): """ @@ -260,18 +279,22 @@ def __init__(self, is_thing_map, threshold=0.85): self.is_thing_map = is_thing_map def forward(self, outputs, processed_sizes, target_sizes=None): - """ This function computes the panoptic prediction from the model's predictions. + """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"] + 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 = [] @@ -329,7 +352,9 @@ def get_ids_area(masks, scores, dedup=False): 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() + 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)) @@ -343,7 +368,9 @@ def get_ids_area(masks, scores, dedup=False): # 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 + [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] @@ -359,7 +386,9 @@ def get_ids_area(masks, scores, dedup=False): 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}) + segments_info.append( + {"id": i, "isthing": self.is_thing_map[cat], "category_id": cat, "area": a} + ) del cur_classes with io.BytesIO() as out: diff --git a/dimos/models/Detic/third_party/Deformable-DETR/tools/launch.py b/dimos/models/Detic/third_party/Deformable-DETR/tools/launch.py index 2b3ceaa7bc..9e9fdfea2c 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/tools/launch.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/tools/launch.py @@ -103,56 +103,69 @@ how things can go wrong if you don't do this correctly. """ - -import sys import subprocess import os -import socket from argparse import ArgumentParser, REMAINDER -import torch - 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") + 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") + 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") + 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) + parser.add_argument("training_script_args", nargs=REMAINDER) return parser.parse_args() @@ -184,9 +197,8 @@ def main(): for process in processes: process.wait() if process.returncode != 0: - raise subprocess.CalledProcessError(returncode=process.returncode, - cmd=process.args) + raise subprocess.CalledProcessError(returncode=process.returncode, cmd=process.args) if __name__ == "__main__": - main() \ No newline at end of file + main() 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 index ca29592f80..5864b68d3b 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/util/box_ops.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/util/box_ops.py @@ -10,21 +10,20 @@ """ 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)] + 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)] + b = [(x0 + x1) / 2, (y0 + y1) / 2, (x1 - x0), (y1 - y0)] return torch.stack(b, dim=-1) @@ -85,11 +84,11 @@ def masks_to_boxes(masks): x = torch.arange(0, w, dtype=torch.float) y, x = torch.meshgrid(y, x) - x_mask = (masks * x.unsqueeze(0)) + 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_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] diff --git a/dimos/models/Detic/third_party/Deformable-DETR/util/misc.py b/dimos/models/Detic/third_party/Deformable-DETR/util/misc.py index 6d4d076720..661807da15 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/util/misc.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/util/misc.py @@ -12,6 +12,7 @@ Mostly copy-paste from torchvision references. """ + import os import subprocess import time @@ -21,15 +22,16 @@ from typing import Optional, List import torch -import torch.nn as nn import torch.distributed as dist from torch import Tensor # 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, size, scale_factor): # type: (int, Optional[List[int]], Optional[float]) -> None if size is None and scale_factor is None: @@ -38,9 +40,11 @@ def _check_size_scale_factor(dim, size, scale_factor): 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( - "scale_factor shape must match input shape. " - "Input is {}D, scale_factor size is {}".format(dim, len(scale_factor)) + "scale_factor shape must match input shape. Input is {}D, scale_factor size is {}".format( + dim, len(scale_factor) + ) ) + def _output_size(dim, input, size, scale_factor): # type: (int, Tensor, Optional[List[int]], Optional[float]) -> List[int] assert dim == 2 @@ -51,9 +55,7 @@ def _output_size(dim, input, size, scale_factor): 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 [ - int(math.floor(input.size(i + 2) * scale_factors[i])) for i in range(dim) - ] + return [int(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 @@ -83,7 +85,7 @@ def synchronize_between_processes(self): """ if not is_dist_avail_and_initialized(): return - t = torch.tensor([self.count, self.total], dtype=torch.float64, device='cuda') + t = torch.tensor([self.count, self.total], dtype=torch.float64, device="cuda") dist.barrier() dist.all_reduce(t) t = t.tolist() @@ -118,7 +120,8 @@ def __str__(self): avg=self.avg, global_avg=self.global_avg, max=self.max, - value=self.value) + value=self.value, + ) def all_gather(data): @@ -208,15 +211,12 @@ def __getattr__(self, attr): return self.meters[attr] if attr in self.__dict__: return self.__dict__[attr] - raise AttributeError("'{}' object has no attribute '{}'".format( - type(self).__name__, attr)) + raise AttributeError("'{}' object has no attribute '{}'".format(type(self).__name__, attr)) def __str__(self): loss_str = [] for name, meter in self.meters.items(): - loss_str.append( - "{}: {}".format(name, str(meter)) - ) + loss_str.append("{}: {}".format(name, str(meter))) return self.delimiter.join(loss_str) def synchronize_between_processes(self): @@ -229,31 +229,35 @@ def add_meter(self, name, meter): def log_every(self, iterable, print_freq, header=None): i = 0 if not header: - 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' + 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}' - ]) + 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}' - ]) + 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) @@ -263,38 +267,54 @@ def log_every(self, iterable, print_freq, header=None): 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)) + 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))) + 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('{} Total time: {} ({:.4f} s / it)'.format( - header, total_time_str, total_time / len(iterable))) + print( + "{} Total time: {} ({:.4f} s / it)".format( + header, total_time_str, total_time / len(iterable) + ) + ) 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' + return subprocess.check_output(command, cwd=cwd).decode("ascii").strip() + + sha = "N/A" diff = "clean" - branch = 'N/A' + branch = "N/A" try: - sha = _run(['git', 'rev-parse', 'HEAD']) - subprocess.check_output(['git', 'diff'], cwd=cwd) - diff = _run(['git', 'diff-index', 'HEAD']) + 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']) + branch = _run(["git", "rev-parse", "--abbrev-ref", "HEAD"]) except Exception: pass message = f"sha: {sha}, status: {diff}, branch: {branch}" @@ -330,9 +350,9 @@ def nested_tensor_from_tensor_list(tensor_list: List[Tensor]): mask = torch.ones((b, h, w), dtype=torch.bool, device=device) for img, pad_img, m in zip(tensor_list, tensor, mask): pad_img[: img.shape[0], : img.shape[1], : img.shape[2]].copy_(img) - m[: img.shape[1], :img.shape[2]] = False + m[: img.shape[1], : img.shape[2]] = False else: - raise ValueError('not supported') + raise ValueError("not supported") return NestedTensor(tensor, mask) @@ -369,10 +389,11 @@ def setup_for_distributed(is_master): This function disables printing when not in master process """ import builtins as __builtin__ + builtin_print = __builtin__.print def print(*args, **kwargs): - force = kwargs.pop('force', False) + force = kwargs.pop("force", False) if is_master or force: builtin_print(*args, **kwargs) @@ -402,13 +423,13 @@ def get_rank(): def get_local_size(): if not is_dist_avail_and_initialized(): return 1 - return int(os.environ['LOCAL_SIZE']) + 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']) + return int(os.environ["LOCAL_RANK"]) def is_main_process(): @@ -421,42 +442,44 @@ def save_on_master(*args, **kwargs): def init_distributed_mode(args): - if 'RANK' in os.environ and 'WORLD_SIZE' in os.environ: + 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'] + 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( - 'scontrol show hostname {} | head -n1'.format(node_list)) - 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://' + addr = subprocess.getoutput("scontrol show hostname {} | head -n1".format(node_list)) + 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') + print("Not using distributed mode") args.distributed = False return args.distributed = True torch.cuda.set_device(args.gpu) - args.dist_backend = 'nccl' - print('| distributed init (rank {}): {}'.format( - 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) + args.dist_backend = "nccl" + print("| distributed init (rank {}): {}".format(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) @@ -489,9 +512,7 @@ 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 - ) + 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) @@ -506,13 +527,15 @@ def get_total_grad_norm(parameters, norm_type=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) + 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=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) - + 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 index 759f34d252..3bbb97b3d1 100644 --- a/dimos/models/Detic/third_party/Deformable-DETR/util/plot_utils.py +++ b/dimos/models/Detic/third_party/Deformable-DETR/util/plot_utils.py @@ -10,6 +10,7 @@ """ Plotting utilities to visualize training logs. """ + import torch import pandas as pd import seaborn as sns @@ -18,8 +19,10 @@ from pathlib import Path, PurePath -def plot_logs(logs, fields=('class_error', 'loss_bbox_unscaled', 'mAP'), ewm_col=0, log_name='log.txt'): - ''' +def plot_logs( + logs, fields=("class_error", "loss_bbox_unscaled", "mAP"), ewm_col=0, log_name="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 @@ -30,7 +33,7 @@ def plot_logs(logs, fields=('class_error', 'loss_bbox_unscaled', 'mAP'), ewm_col :: 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, @@ -41,13 +44,17 @@ def plot_logs(logs, fields=('class_error', 'loss_bbox_unscaled', 'mAP'), ewm_col 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)}") + 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}") + 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}") @@ -59,53 +66,55 @@ def plot_logs(logs, fields=('class_error', 'loss_bbox_unscaled', 'mAP'), ewm_col for df, color in zip(dfs, sns.color_palette(n_colors=len(logs))): 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() + 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}'], + y=[f"train_{field}", f"test_{field}"], ax=axs[j], color=[color] * 2, - style=['-', '--'] + style=["-", "--"], ) for ax, field in zip(axs, fields): ax.legend([Path(p).name for p in logs]) ax.set_title(field) -def plot_precision_recall(files, naming_scheme='iter'): - if naming_scheme == 'exp_id': +def plot_precision_recall(files, naming_scheme="iter"): + if naming_scheme == "exp_id": # name becomes exp_id names = [f.parts[-3] for f in files] - elif naming_scheme == 'iter': + elif naming_scheme == "iter": names = [f.stem for f in files] else: - raise ValueError(f'not supported {naming_scheme}') + 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): 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'] + 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}' - ) + 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].set_title("Precision / Recall") axs[0].legend(names) - axs[1].set_title('Scores / Recall') + 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 index ec042b8ce4..6b24b5b260 100644 --- a/dimos/models/Detic/tools/convert-thirdparty-pretrained-model-to-d2.py +++ b/dimos/models/Detic/tools/convert-thirdparty-pretrained-model-to-d2.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # Copyright (c) Facebook, Inc. and its affiliates. All Rights Reserved import argparse -import pickle +import pickle import torch """ @@ -19,21 +19,17 @@ if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument('--path', default='') + parser.add_argument("--path", default="") args = parser.parse_args() - print('Loading', args.path) + 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) + 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 index 8f44f6221f..54883d7337 100644 --- a/dimos/models/Detic/tools/create_imagenetlvis_json.py +++ b/dimos/models/Detic/tools/create_imagenetlvis_json.py @@ -2,21 +2,22 @@ import argparse import json import os -import cv2 from nltk.corpus import wordnet from detectron2.data.detection_utils import read_image -if __name__ == '__main__': +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') + 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, 'r')) - print('Done') - synset2cat = {x['synset']: x for x in data['categories']} + print("Loading LVIS meta") + data = json.load(open(args.lvis_meta_path, "r")) + print("Done") + synset2cat = {x["synset"]: x for x in data["categories"]} count = 0 images = [] image_counts = {} @@ -24,31 +25,31 @@ 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() + synset = wordnet.synset_from_pos_and_offset("n", int(folder[1:])).name() cat = synset2cat[synset] - cat_id = cat['id'] - cat_name = cat['name'] + cat_id = cat["id"] + cat_name = cat["name"] cat_images = [] for file in files: count = count + 1 - file_name = '{}/{}'.format(folder, file) + file_name = "{}/{}".format(folder, file) # img = cv2.imread('{}/{}'.format(args.imagenet_path, file_name)) - img = read_image('{}/{}'.format(args.imagenet_path, file_name)) + img = read_image("{}/{}".format(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 + "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')) + 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 index 3e6fe60a2d..05e9530181 100644 --- a/dimos/models/Detic/tools/create_lvis_21k.py +++ b/dimos/models/Detic/tools/create_lvis_21k.py @@ -3,72 +3,73 @@ import copy import json -if __name__ == '__main__': +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') + 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, 'r')) - print('Loading', args.lvis_path) - lvis_data = json.load(open(args.lvis_path, 'r')) + print("Loading", args.imagenet_path) + in_data = json.load(open(args.imagenet_path, "r")) + print("Loading", args.lvis_path) + lvis_data = json.load(open(args.lvis_path, "r")) - 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} + 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']] + 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 + 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)) + + 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: + 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 + in_data["categories"] = categories + lvis_data["categories"] = categories if not args.not_save_imagenet: - in_out_path = args.imagenet_path[:-5] + '_{}.json'.format(args.mark) + in_out_path = args.imagenet_path[:-5] + "_{}.json".format(args.mark) 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')) - + 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] + '_{}.json'.format(args.mark) + lvis_out_path = args.lvis_path[:-5] + "_{}.json".format(args.mark) 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')) + 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 != '': + if args.save_categories != "": for x in categories: - for k in ['image_count', 'instance_count', 'synonyms', 'def']: + for k in ["image_count", "instance_count", "synonyms", "def"]: if k in x: del x[k] CATEGORIES = repr(categories) + " # noqa" - open(args.save_categories, 'wt').write(f"CATEGORIES = {CATEGORIES}") + open(args.save_categories, "wt").write(f"CATEGORIES = {CATEGORIES}") diff --git a/dimos/models/Detic/tools/download_cc.py b/dimos/models/Detic/tools/download_cc.py index 3c43690a3c..fb493c8edc 100644 --- a/dimos/models/Detic/tools/download_cc.py +++ b/dimos/models/Detic/tools/download_cc.py @@ -5,43 +5,40 @@ from PIL import Image import numpy as np -if __name__ == '__main__': +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') + 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, 'r'))['categories'] + categories = json.load(open(args.cat_info, "r"))["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') + cap, path = line[:-1].split("\t") print(i, cap, path) if not args.not_download_image: - os.system( - 'wget {} -O {}/{}.jpg'.format( - path, args.save_image_path, i + 1)) + os.system("wget {} -O {}/{}.jpg".format(path, args.save_image_path, i + 1)) try: - img = Image.open( - open('{}/{}.jpg'.format(args.save_image_path, i + 1), "rb")) + img = Image.open(open("{}/{}.jpg".format(args.save_image_path, i + 1), "rb")) img = np.asarray(img.convert("RGB")) h, w = img.shape[:2] except: continue image_info = { - 'id': i + 1, - 'file_name': '{}.jpg'.format(i + 1), - 'height': h, - 'width': w, - 'captions': [cap], + "id": i + 1, + "file_name": "{}.jpg".format(i + 1), + "height": h, + "width": w, + "captions": [cap], } images.append(image_info) - data = {'categories': categories, 'images': images, 'annotations': []} + 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')) + 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 index 127f8c2a86..941fe221ed 100644 --- a/dimos/models/Detic/tools/dump_clip_features.py +++ b/dimos/models/Detic/tools/dump_clip_features.py @@ -5,96 +5,99 @@ import numpy as np import itertools from nltk.corpus import wordnet -import sys -if __name__ == '__main__': +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') + 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, 'r')) - cat_names = [x['name'] for x in \ - sorted(data['categories'], key=lambda x: x['id'])] - if 'synonyms' in data['categories'][0]: + print("Loading", args.ann) + data = json.load(open(args.ann, "r")) + 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'])] + [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'])] + 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] + 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) + cat_names = [x.strip().replace("/ ", "/").replace(" ", "_") for x in cat_names] + print("cat_names", cat_names) device = "cuda" if torch.cuda.is_available() else "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': + + 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 = ['a photo of a {}'.format(x) for x in cat_names] - sentences_synonyms = [['a photo of a {}'.format(xx) for xx in x] \ - for x in synonyms] - elif args.prompt == 'scene': - sentences = ['a photo of a {} in the scene'.format(x) for x in cat_names] - sentences_synonyms = [['a photo of a {} in the scene'.format(xx) for xx in x] \ - for x in synonyms] + elif args.prompt == "photo": + sentences = ["a photo of a {}".format(x) for x in cat_names] + sentences_synonyms = [["a photo of a {}".format(xx) for xx in x] for x in synonyms] + elif args.prompt == "scene": + sentences = ["a photo of a {} in the scene".format(x) for x in cat_names] + sentences_synonyms = [ + ["a photo of a {} in the scene".format(xx) 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': + print("sentences_synonyms", len(sentences_synonyms), sum(len(x) for x in sentences_synonyms)) + if args.model == "clip": import clip - print('Loading 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)) + 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) + 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) + 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) + print("after stack", text_features.shape) text_features = text_features.cpu().numpy() - elif args.model in ['bert', 'roberta']: + elif args.model in ["bert", "roberta"]: from transformers import AutoTokenizer, AutoModel - if args.model == 'bert': - model_name = 'bert-large-uncased' - if args.model == 'roberta': - model_name = 'roberta-large' + + 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)) + print("flattened_sentences", len(sentences)) inputs = tokenizer(sentences, padding=True, return_tensors="pt") with torch.no_grad(): model_outputs = model(**inputs) @@ -105,12 +108,14 @@ 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) + print("after stack", text_features.shape) text_features = text_features.numpy() - print('text_features.shape', text_features.shape) + 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() + 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 index c6730eacec..7b2ffad365 100644 --- a/dimos/models/Detic/tools/fix_o365_names.py +++ b/dimos/models/Detic/tools/fix_o365_names.py @@ -3,32 +3,34 @@ import json import copy -if __name__ == '__main__': +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') + 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, 'r') as f: + with open(args.fix_name_map, "r") as f: for line in f: - tmp = line.strip().split(',') + tmp = line.strip().split(",") old_names[int(tmp[0])] = tmp[1] new_names[int(tmp[0])] = tmp[2] - data = json.load(open(args.ann, 'r')) + data = json.load(open(args.ann, "r")) + + cat_info = copy.deepcopy(data["categories"]) - 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')) + 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 index 38716e56c4..8e0b476323 100644 --- a/dimos/models/Detic/tools/fix_o365_path.py +++ b/dimos/models/Detic/tools/fix_o365_path.py @@ -4,25 +4,27 @@ import path import os -if __name__ == '__main__': +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/') + 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, 'r')) + print("Loading", args.ann) + data = json.load(open(args.ann, "r")) images = [] count = 0 - for x in data['images']: - path = '{}/{}'.format(args.img_dir, x['file_name']) + 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')) + 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 index 570d236faa..52aa05445c 100644 --- a/dimos/models/Detic/tools/get_cc_tags.py +++ b/dimos/models/Detic/tools/get_cc_tags.py @@ -90,106 +90,108 @@ {"synset": "toothbrush.n.01", "coco_cat_id": 90}, ] + def map_name(x): - x = x.replace('_', ' ') - if '(' in x: - x = x[:x.find('(')] + x = x.replace("_", " ") + if "(" in x: + x = x[: x.find("(")] return x.lower().strip() -if __name__ == '__main__': + +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("--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, 'r')) + cc_data = json.load(open(args.cc_ann, "r")) 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) + 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} + 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 + 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']} + 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']} + examples = {x["id"]: [] for x in cc_data["categories"]} - print('class_data', class_data) + print("class_data", class_data) images = [] - for i, x in enumerate(cc_data['images']): + for i, x in enumerate(cc_data["images"]): if i % 10000 == 0: - print(i, len(cc_data['images'])) + print(i, len(cc_data["images"])) if args.allcaps: - caption = (' '.join(x['captions'])).lower() + caption = (" ".join(x["captions"])).lower() else: - caption = x['captions'][0].lower() - x['pos_category_ids'] = [] + 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]): + 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) + 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: + 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=', ') + print(id2cat[cat_id]["name"], count, end=", ") if count == 0: zero_class.append(id2cat[cat_id]) - print('==') - print('zero class', zero_class) + 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])) + 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': []} + 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')) + 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 index ed6748be1f..874d378d48 100644 --- a/dimos/models/Detic/tools/get_coco_zeroshot_oriorder.py +++ b/dimos/models/Detic/tools/get_coco_zeroshot_oriorder.py @@ -2,17 +2,19 @@ import argparse import json -if __name__ == '__main__': +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') + 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, 'r'))['categories'] + print("Loading", args.cat_path) + cat = json.load(open(args.cat_path, "r"))["categories"] - print('Loading', args.data_path) - data = json.load(open(args.data_path, 'r')) - data['categories'] = cat - out_path = args.data_path[:-5] + '_oriorder.json' - print('Saving to', out_path) - json.dump(data, open(out_path, 'w')) + print("Loading", args.data_path) + data = json.load(open(args.data_path, "r")) + 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 index a5fc0a8ee3..2f19a6cf91 100644 --- a/dimos/models/Detic/tools/get_imagenet_21k_full_tar_json.py +++ b/dimos/models/Detic/tools/get_imagenet_21k_full_tar_json.py @@ -2,9 +2,6 @@ import argparse import json import numpy as np -import pickle -import io -import gzip import sys import time from nltk.corpus import wordnet @@ -12,47 +9,49 @@ import operator import torch -sys.path.insert(0, 'third_party/CenterNet2/') -sys.path.insert(0, 'third_party/Deformable-DETR') -from detic.data.tar_dataset import DiskTarDataset, _TarDataset +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__': +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("--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') + 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"Took {end_time - start_time} seconds to make the dataset.") print(f"Have {len(dataset)} samples.") - print('dataset', dataset) - + 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:])) + 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, + "id": i + 1, + "synset": synset.name(), + "name": synonyms[0], + "def": synset.definition(), + "synonyms": synonyms, } categories.append(category) - print('categories', len(categories)) + print("categories", len(categories)) data_loader = torch.utils.data.DataLoader( - dataset, batch_size=1, shuffle=False, + dataset, + batch_size=1, + shuffle=False, num_workers=args.workers, collate_fn=operator.itemgetter(0), ) @@ -61,21 +60,22 @@ 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), + "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': []} + + 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')) + print("Saving to ", args.out_path) + json.dump(data, open(args.out_path, "w")) except: pass - import pdb; pdb.set_trace() - + 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 index 83f286983c..79d025300c 100644 --- a/dimos/models/Detic/tools/get_lvis_cat_info.py +++ b/dimos/models/Detic/tools/get_lvis_cat_info.py @@ -2,43 +2,42 @@ import argparse import json -if __name__ == '__main__': +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("--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, 'r')) - 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']} + print("Loading", args.ann) + data = json.load(open(args.ann, "r")) + 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']] + 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 + 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]) + 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']: + 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')) - + 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 index abc2b673a3..5ef480d28e 100644 --- a/dimos/models/Detic/tools/merge_lvis_coco.py +++ b/dimos/models/Detic/tools/merge_lvis_coco.py @@ -1,19 +1,18 @@ # Copyright (c) Facebook, Inc. and its affiliates. from collections import defaultdict import torch -import sys import json -import numpy as np from detectron2.structures import Boxes, pairwise_iou -COCO_PATH = 'datasets/coco/annotations/instances_train2017.json' -IMG_PATH = 'datasets/coco/train2017/' -LVIS_PATH = 'datasets/lvis/lvis_v1_train.json' + +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' + SAVE_PATH = "datasets/lvis/lvis_v1_train+coco_box.json" else: - SAVE_PATH = 'datasets/lvis/lvis_v1_train+coco_mask.json' + SAVE_PATH = "datasets/lvis/lvis_v1_train+coco_mask.json" THRESH = 0.7 DEBUG = False @@ -105,60 +104,63 @@ def get_bbox(ann): - bbox = ann['bbox'] + 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, 'r')) - lvis_data = json.load(open(LVIS_PATH, 'r')) +if __name__ == "__main__": + file_name_key = "file_name" if "v0.5" in LVIS_PATH else "coco_url" + coco_data = json.load(open(COCO_PATH, "r")) + lvis_data = json.load(open(LVIS_PATH, "r")) - coco_cats = coco_data['categories'] - lvis_cats = lvis_data['categories'] + 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} + 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} + 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']} + + 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_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: + 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']: + 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) + 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 + 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']] + 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) @@ -168,35 +170,37 @@ def get_bbox(ann): 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])) + 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 + 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 + 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']: + 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 + 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')) + 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 index 67795c209b..f4ea6fcbfe 100644 --- a/dimos/models/Detic/tools/preprocess_imagenet22k.py +++ b/dimos/models/Detic/tools/preprocess_imagenet22k.py @@ -5,17 +5,15 @@ import numpy as np import sys -sys.path.insert(0, 'third_party/CenterNet2/') -sys.path.insert(0, 'third_party/Deformable-DETR') -from detic.data.tar_dataset import _TarDataset, DiskTarDataset -import pickle +sys.path.insert(0, "third_party/CenterNet2/") +sys.path.insert(0, "third_party/Deformable-DETR") +from detic.data.tar_dataset import _TarDataset import io import gzip import time class _RawTarDataset(object): - def __init__(self, filename, indexname, preload=False): self.filename = filename self.names = [] @@ -25,18 +23,18 @@ def __init__(self, filename, indexname, preload=False): ll = l.split() a, b, c = ll[:3] offset = int(b[:-1]) - if l.endswith('** Block of NULs **\n'): + if l.endswith("** Block of NULs **\n"): self.offsets.append(offset) break else: - if c.endswith('JPEG'): + 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') + self.data = np.memmap(filename, mode="r", dtype="uint8") else: self.data = None @@ -45,40 +43,39 @@ def __len__(self): def __getitem__(self, idx): if self.data is None: - self.data = np.memmap(self.filename, mode='r', dtype='uint8') + 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] + data = self.data[ofs : ofs + fsize] - if data[:13].tostring() == '././@LongLink': - data = data[3 * 512:] + 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): + if tuple(data[:2]) == (0x1F, 0x8B): s = io.StringIO(data.tostring()) - g = gzip.GzipFile(None, 'r', 0, s) + g = gzip.GzipFile(None, "r", 0, s) sdata = g.read() else: sdata = data.tostring() return sdata - def preprocess(): # 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' + 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') + 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() @@ -86,14 +83,16 @@ def preprocess(): dataset_lens = [] min_count = 0 create_npy_tarlogs = True - print('Creating folders') + 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) + 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) @@ -112,7 +111,6 @@ def preprocess(): end_time = time.time() print(f"Time {end_time - start_time}") - dataset_lens = np.array(dataset_lens) dataset_valid = dataset_lens > min_count diff --git a/dimos/models/Detic/tools/remove_lvis_rare.py b/dimos/models/Detic/tools/remove_lvis_rare.py index 06e4e881bf..2e1705d50c 100644 --- a/dimos/models/Detic/tools/remove_lvis_rare.py +++ b/dimos/models/Detic/tools/remove_lvis_rare.py @@ -2,19 +2,20 @@ import argparse import json -if __name__ == '__main__': +if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument('--ann', default='datasets/lvis/lvis_v1_train.json') + 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, 'r')) - 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')) + print("Loading", args.ann) + data = json.load(open(args.ann, "r")) + 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 index 56ccad1a90..d550db9980 100644 --- a/dimos/models/Detic/tools/unzip_imagenet_lvis.py +++ b/dimos/models/Detic/tools/unzip_imagenet_lvis.py @@ -2,18 +2,17 @@ import os import argparse -if __name__ == '__main__': +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') + 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) + 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 index ff1f570dd8..53699045bd 100644 --- a/dimos/models/Detic/train_net.py +++ b/dimos/models/Detic/train_net.py @@ -37,13 +37,13 @@ from detectron2.utils.logger import setup_logger from torch.cuda.amp import GradScaler -sys.path.insert(0, 'third_party/CenterNet2/') +sys.path.insert(0, "third_party/CenterNet2/") from centernet.config import add_centernet_config -sys.path.insert(0, 'third_party/Deformable-DETR') +sys.path.insert(0, "third_party/Deformable-DETR") from detic.config import add_detic_config 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_dataloader import build_custom_train_loader from detic.data.custom_dataset_mapper import CustomDatasetMapper, DetrDatasetMapper from detic.custom_solver import build_custom_optimizer from detic.evaluation.oideval import OIDEvaluator @@ -53,53 +53,51 @@ 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)) + 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, "inference_{}".format(dataset_name)) + output_folder = os.path.join(cfg.OUTPUT_DIR, "inference_{}".format(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': + 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': + 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) + + results[dataset_name] = inference_on_dataset(model, data_loader, evaluator) if comm.is_main_process(): - logger.info("Evaluation results for {} in csv format:".format( - dataset_name)) + logger.info("Evaluation results for {} in csv format:".format(dataset_name)) print_csv_format(results[dataset_name]) if len(results) == 1: results = list(results.values())[0] return results + def do_train(cfg, model, resume=False): 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. + 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) @@ -107,8 +105,9 @@ def do_train(cfg, model, resume=False): model, cfg.OUTPUT_DIR, optimizer=optimizer, scheduler=scheduler ) - start_iter = checkpointer.resume_or_load( - cfg.MODEL.WEIGHTS, resume=resume).get("iteration", -1) + 1 + 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 @@ -129,10 +128,14 @@ def do_train(cfg, model, resume=False): 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']: + 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) @@ -153,16 +156,13 @@ def do_train(cfg, model, resume=False): storage.step() loss_dict = model(data) - losses = sum( - loss for k, loss in loss_dict.items()) + 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()} + 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) + storage.put_scalars(total_loss=losses_reduced, **loss_dict_reduced) optimizer.zero_grad() if cfg.FP16: @@ -173,30 +173,31 @@ def do_train(cfg, model, resume=False): losses.backward() optimizer.step() - storage.put_scalar( - "lr", optimizer.param_groups[0]["lr"], smoothing_hint=False) + 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 + if ( + cfg.TEST.EVAL_PERIOD > 0 and iteration % cfg.TEST.EVAL_PERIOD == 0 - and iteration != max_iter): + and iteration != max_iter + ): do_test(cfg, model) comm.synchronize() - if iteration - start_iter > 5 and \ - (iteration % 20 == 0 or iteration == max_iter): + 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( - "Total training time: {}".format( - str(datetime.timedelta(seconds=int(total_time))))) + "Total training time: {}".format(str(datetime.timedelta(seconds=int(total_time)))) + ) + def setup(args): """ @@ -207,14 +208,13 @@ def setup(args): add_detic_config(cfg) cfg.merge_from_file(args.config_file) cfg.merge_from_list(args.opts) - if '/auto' in cfg.OUTPUT_DIR: + if "/auto" in cfg.OUTPUT_DIR: file_name = os.path.basename(args.config_file)[:-5] - cfg.OUTPUT_DIR = cfg.OUTPUT_DIR.replace('/auto', '/{}'.format(file_name)) - logger.info('OUTPUT_DIR: {}'.format(cfg.OUTPUT_DIR)) + cfg.OUTPUT_DIR = cfg.OUTPUT_DIR.replace("/auto", "/{}".format(file_name)) + logger.info("OUTPUT_DIR: {}".format(cfg.OUTPUT_DIR)) cfg.freeze() default_setup(cfg, args) - setup_logger(output=cfg.OUTPUT_DIR, \ - distributed_rank=comm.get_rank(), name="detic") + setup_logger(output=cfg.OUTPUT_DIR, distributed_rank=comm.get_rank(), name="detic") return cfg @@ -233,8 +233,10 @@ def main(args): 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 + model, + device_ids=[comm.get_local_rank()], + broadcast_buffers=False, + find_unused_parameters=cfg.FIND_UNUSED_PARAM, ) do_train(cfg, model, resume=args.resume) @@ -245,19 +247,16 @@ def main(args): args = default_argument_parser() args = args.parse_args() if args.num_machines == 1: - args.dist_url = 'tcp://127.0.0.1:{}'.format( - torch.randint(11111, 60000, (1,))[0].item()) + args.dist_url = "tcp://127.0.0.1:{}".format(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'): + 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( - 'echo $(scontrol show job {} | grep BatchHost)'.format( - args.dist_url) - ).read() - tmp = tmp[tmp.find('=') + 1: -1] - args.dist_url = 'tcp://{}:12345'.format(tmp) + "echo $(scontrol show job {} | grep BatchHost)".format(args.dist_url) + ).read() + tmp = tmp[tmp.find("=") + 1 : -1] + args.dist_url = "tcp://{}:12345".format(tmp) print("Command Line Args:", args) launch( main, diff --git a/dimos/models/depth/metric3d.py b/dimos/models/depth/metric3d.py index 3e5dd7cf2f..58cb63f640 100644 --- a/dimos/models/depth/metric3d.py +++ b/dimos/models/depth/metric3d.py @@ -12,8 +12,6 @@ # See the License for the specific language governing permissions and # limitations under the License. -import os -import sys import torch from PIL import Image import cv2 @@ -27,23 +25,26 @@ class Metric3D: def __init__(self, gt_depth_scale=256.0): - #self.conf = get_config("zoedepth", "infer") - #self.depth_model = build_model(self.conf) - self.depth_model = torch.hub.load('yvanyin/metric3d', 'metric3d_vit_small', pretrain=True).cuda() + # self.conf = get_config("zoedepth", "infer") + # self.depth_model = build_model(self.conf) + self.depth_model = torch.hub.load( + "yvanyin/metric3d", "metric3d_vit_small", pretrain=True + ).cuda() if torch.cuda.device_count() > 1: print(f"Using {torch.cuda.device_count()} GPUs!") - #self.depth_model = torch.nn.DataParallel(self.depth_model) + # self.depth_model = torch.nn.DataParallel(self.depth_model) self.depth_model.eval() - self.intrinsic = [707.0493, 707.0493, 604.0814, 180.5066] + self.intrinsic = [707.0493, 707.0493, 604.0814, 180.5066] self.intrinsic_scaled = None - self.gt_depth_scale = gt_depth_scale # And this + self.gt_depth_scale = gt_depth_scale # And this self.pad_info = None self.rgb_origin = None - ''' + + """ Input: Single image in RGB format Output: Depth map - ''' + """ def update_intrinsic(self, intrinsic): """ @@ -71,18 +72,21 @@ def infer_depth(self, img, debug=False): img = self.rescale_input(img, self.rgb_origin) with torch.no_grad(): - pred_depth, confidence, output_dict = self.depth_model.inference({'input': img}) + pred_depth, confidence, output_dict = self.depth_model.inference({"input": img}) # Convert to PIL format depth_image = self.unpad_transform_depth(pred_depth) - out_16bit_numpy = (depth_image.squeeze().cpu().numpy() * self.gt_depth_scale).astype(np.uint16) + out_16bit_numpy = (depth_image.squeeze().cpu().numpy() * self.gt_depth_scale).astype( + np.uint16 + ) depth_map_pil = Image.fromarray(out_16bit_numpy) return depth_map_pil + def save_depth(self, pred_depth): # Save the depth map to a file pred_depth_np = pred_depth.cpu().numpy() - output_depth_file = 'output_depth_map.png' + output_depth_file = "output_depth_map.png" cv2.imwrite(output_depth_file, pred_depth_np) print(f"Depth map saved to {output_depth_file}") @@ -94,9 +98,16 @@ def rescale_input(self, rgb, rgb_origin): # input_size = (544, 1216) # for convnext model h, w = rgb_origin.shape[:2] scale = min(input_size[0] / h, input_size[1] / w) - rgb = cv2.resize(rgb_origin, (int(w * scale), int(h * scale)), interpolation=cv2.INTER_LINEAR) + rgb = cv2.resize( + rgb_origin, (int(w * scale), int(h * scale)), interpolation=cv2.INTER_LINEAR + ) # remember to scale intrinsic, hold depth - self.intrinsic_scaled = [self.intrinsic[0] * scale, self.intrinsic[1] * scale, self.intrinsic[2] * scale, self.intrinsic[3] * scale] + self.intrinsic_scaled = [ + self.intrinsic[0] * scale, + self.intrinsic[1] * scale, + self.intrinsic[2] * scale, + self.intrinsic[3] * scale, + ] # padding to input_size padding = [123.675, 116.28, 103.53] h, w = rgb.shape[:2] @@ -104,8 +115,15 @@ def rescale_input(self, rgb, rgb_origin): pad_w = input_size[1] - w pad_h_half = pad_h // 2 pad_w_half = pad_w // 2 - rgb = cv2.copyMakeBorder(rgb, pad_h_half, pad_h - pad_h_half, pad_w_half, pad_w - pad_w_half, - cv2.BORDER_CONSTANT, value=padding) + rgb = cv2.copyMakeBorder( + rgb, + pad_h_half, + pad_h - pad_h_half, + pad_w_half, + pad_w - pad_w_half, + cv2.BORDER_CONSTANT, + value=padding, + ) self.pad_info = [pad_h_half, pad_h - pad_h_half, pad_w_half, pad_w - pad_w_half] #### normalize @@ -115,25 +133,31 @@ def rescale_input(self, rgb, rgb_origin): rgb = torch.div((rgb - mean), std) rgb = rgb[None, :, :, :].cuda() return rgb + def unpad_transform_depth(self, pred_depth): # un pad pred_depth = pred_depth.squeeze() - pred_depth = pred_depth[self.pad_info[0]: pred_depth.shape[0] - self.pad_info[1], - self.pad_info[2]: pred_depth.shape[1] - self.pad_info[3]] + pred_depth = pred_depth[ + self.pad_info[0] : pred_depth.shape[0] - self.pad_info[1], + self.pad_info[2] : pred_depth.shape[1] - self.pad_info[3], + ] # upsample to original size - pred_depth = torch.nn.functional.interpolate(pred_depth[None, None, :, :], self.rgb_origin.shape[:2], - mode='bilinear').squeeze() + pred_depth = torch.nn.functional.interpolate( + pred_depth[None, None, :, :], self.rgb_origin.shape[:2], mode="bilinear" + ).squeeze() ###################### canonical camera space ###################### #### de-canonical transform - canonical_to_real_scale = self.intrinsic_scaled[0] / 1000.0 # 1000.0 is the focal length of canonical camera + canonical_to_real_scale = ( + self.intrinsic_scaled[0] / 1000.0 + ) # 1000.0 is the focal length of canonical camera pred_depth = pred_depth * canonical_to_real_scale # now the depth is metric pred_depth = torch.clamp(pred_depth, 0, 1000) return pred_depth - """Set new intrinsic value.""" + def update_intrinsic(self, intrinsic): self.intrinsic = intrinsic @@ -144,6 +168,6 @@ def eval_predicted_depth(self, depth_file, pred_depth): gt_depth = torch.from_numpy(gt_depth).float().cuda() assert gt_depth.shape == pred_depth.shape - mask = (gt_depth > 1e-8) + mask = gt_depth > 1e-8 abs_rel_err = (torch.abs(pred_depth[mask] - gt_depth[mask]) / gt_depth[mask]).mean() - print('abs_rel_err:', abs_rel_err.item()) \ No newline at end of file + print("abs_rel_err:", abs_rel_err.item()) diff --git a/dimos/models/labels/llava-34b.py b/dimos/models/labels/llava-34b.py index 3290409950..c59a5c8aa9 100644 --- a/dimos/models/labels/llava-34b.py +++ b/dimos/models/labels/llava-34b.py @@ -21,31 +21,51 @@ from vqasynth.datasets.utils import image_to_base64_data_uri + class Llava: - def __init__(self, mmproj=f"{os.getcwd()}/models/mmproj-model-f16.gguf", model_path=f"{os.getcwd()}/models/llava-v1.6-34b.Q4_K_M.gguf", gpu=True): + def __init__( + self, + mmproj=f"{os.getcwd()}/models/mmproj-model-f16.gguf", + model_path=f"{os.getcwd()}/models/llava-v1.6-34b.Q4_K_M.gguf", + gpu=True, + ): chat_handler = Llava15ChatHandler(clip_model_path=mmproj, verbose=True) n_gpu_layers = 0 if gpu: - n_gpu_layers = -1 - self.llm = Llama(model_path=model_path, chat_handler=chat_handler, n_ctx=2048, logits_all=True, n_gpu_layers=n_gpu_layers) + n_gpu_layers = -1 + self.llm = Llama( + model_path=model_path, + chat_handler=chat_handler, + n_ctx=2048, + logits_all=True, + n_gpu_layers=n_gpu_layers, + ) def run_inference(self, image, prompt, return_json=True): data_uri = image_to_base64_data_uri(image) res = self.llm.create_chat_completion( - messages = [ - {"role": "system", "content": "You are an assistant who perfectly describes images."}, - { - "role": "user", - "content": [ - {"type": "image_url", "image_url": {"url": data_uri}}, - {"type" : "text", "text": prompt} - ] - } - ] - ) + messages=[ + { + "role": "system", + "content": "You are an assistant who perfectly describes images.", + }, + { + "role": "user", + "content": [ + {"type": "image_url", "image_url": {"url": data_uri}}, + {"type": "text", "text": prompt}, + ], + }, + ] + ) if return_json: - - return list(set(self.extract_descriptions_from_incomplete_json(res["choices"][0]["message"]["content"]))) + return list( + set( + self.extract_descriptions_from_incomplete_json( + res["choices"][0]["message"]["content"] + ) + ) + ) return res["choices"][0]["message"]["content"] @@ -53,15 +73,19 @@ def extract_descriptions_from_incomplete_json(self, json_like_str): last_object_idx = json_like_str.rfind(',"object') if last_object_idx != -1: - json_str = json_like_str[:last_object_idx] + '}' + json_str = json_like_str[:last_object_idx] + "}" else: json_str = json_like_str.strip() - if not json_str.endswith('}'): - json_str += '}' + if not json_str.endswith("}"): + json_str += "}" try: json_obj = json.loads(json_str) - descriptions = [details['description'].replace(".","") for key, details in json_obj.items() if 'description' in details] + descriptions = [ + details["description"].replace(".", "") + for key, details in json_obj.items() + if "description" in details + ] return descriptions except json.JSONDecodeError as e: diff --git a/dimos/models/pointcloud/pointcloud_utils.py b/dimos/models/pointcloud/pointcloud_utils.py index 54cbd5f319..c0951f44f2 100644 --- a/dimos/models/pointcloud/pointcloud_utils.py +++ b/dimos/models/pointcloud/pointcloud_utils.py @@ -12,17 +12,18 @@ # See the License for the specific language governing permissions and # limitations under the License. -import pickle import numpy as np import open3d as o3d import random + def save_pointcloud(pcd, file_path): """ Save a point cloud to a file using Open3D. """ o3d.io.write_point_cloud(file_path, pcd) + def restore_pointclouds(pointcloud_paths): restored_pointclouds = [] for path in pointcloud_paths: @@ -34,20 +35,28 @@ def create_point_cloud_from_rgbd(rgb_image, depth_image, intrinsic_parameters): rgbd_image = o3d.geometry.RGBDImage.create_from_color_and_depth( o3d.geometry.Image(rgb_image), o3d.geometry.Image(depth_image), - depth_scale=0.125, #1000.0, - depth_trunc=10.0, #10.0, - convert_rgb_to_intensity=False + depth_scale=0.125, # 1000.0, + depth_trunc=10.0, # 10.0, + convert_rgb_to_intensity=False, ) intrinsic = o3d.camera.PinholeCameraIntrinsic() - intrinsic.set_intrinsics(intrinsic_parameters['width'], intrinsic_parameters['height'], - intrinsic_parameters['fx'], intrinsic_parameters['fy'], - intrinsic_parameters['cx'], intrinsic_parameters['cy']) + intrinsic.set_intrinsics( + intrinsic_parameters["width"], + intrinsic_parameters["height"], + intrinsic_parameters["fx"], + intrinsic_parameters["fy"], + intrinsic_parameters["cx"], + intrinsic_parameters["cy"], + ) pcd = o3d.geometry.PointCloud.create_from_rgbd_image(rgbd_image, intrinsic) return pcd + def canonicalize_point_cloud(pcd, canonicalize_threshold=0.3): # Segment the largest plane, assumed to be the floor - plane_model, inliers = pcd.segment_plane(distance_threshold=0.01, ransac_n=3, num_iterations=1000) + plane_model, inliers = pcd.segment_plane( + distance_threshold=0.01, ransac_n=3, num_iterations=1000 + ) canonicalized = False if len(inliers) / len(pcd.points) > canonicalize_threshold: @@ -75,9 +84,9 @@ def canonicalize_point_cloud(pcd, canonicalize_threshold=0.3): pcd.transform(transformation) # Additional 180-degree rotation around the Z-axis - rotation_z_180 = np.array([[np.cos(np.pi), -np.sin(np.pi), 0], - [np.sin(np.pi), np.cos(np.pi), 0], - [0, 0, 1]]) + rotation_z_180 = np.array( + [[np.cos(np.pi), -np.sin(np.pi), 0], [np.sin(np.pi), np.cos(np.pi), 0], [0, 0, 1]] + ) pcd.rotate(rotation_z_180, center=(0, 0, 0)) return pcd, canonicalized, transformation @@ -141,6 +150,7 @@ def human_like_distance(distance_meters): # Fallback to the last choice if something goes wrong return f"{choices[-1][0]} {choices[-1][1]}" + def calculate_distances_between_point_clouds(A, B): dist_pcd1_to_pcd2 = np.asarray(A.compute_point_cloud_distance(B)) dist_pcd2_to_pcd1 = np.asarray(B.compute_point_cloud_distance(A)) @@ -148,12 +158,14 @@ def calculate_distances_between_point_clouds(A, B): avg_dist = np.mean(combined_distances) return human_like_distance(avg_dist) + def calculate_centroid(pcd): """Calculate the centroid of a point cloud.""" points = np.asarray(pcd.points) centroid = np.mean(points, axis=0) return centroid + def calculate_relative_positions(centroids): """Calculate the relative positions between centroids of point clouds.""" num_centroids = len(centroids) @@ -164,14 +176,13 @@ def calculate_relative_positions(centroids): relative_vector = centroids[j] - centroids[i] distance = np.linalg.norm(relative_vector) - relative_positions_info.append({ - 'pcd_pair': (i, j), - 'relative_vector': relative_vector, - 'distance': distance - }) + relative_positions_info.append( + {"pcd_pair": (i, j), "relative_vector": relative_vector, "distance": distance} + ) return relative_positions_info + def get_bounding_box_height(pcd): """ Compute the height of the bounding box for a given point cloud. @@ -185,6 +196,7 @@ def get_bounding_box_height(pcd): aabb = pcd.get_axis_aligned_bounding_box() return aabb.get_extent()[1] # Assuming the Y-axis is the up-direction + def compare_bounding_box_height(pcd_i, pcd_j): """ Compare the bounding box heights of two point clouds. diff --git a/dimos/models/qwen/video_query.py b/dimos/models/qwen/video_query.py index 9ba73dbece..3471e52268 100644 --- a/dimos/models/qwen/video_query.py +++ b/dimos/models/qwen/video_query.py @@ -1,7 +1,6 @@ """Utility functions for one-off video frame queries using Qwen model.""" import os -import threading import numpy as np from typing import Optional from openai import OpenAI @@ -18,19 +17,19 @@ def query_single_frame_observable( video_observable: Observable, query: str, api_key: Optional[str] = None, - model_name: str = "qwen2.5-vl-72b-instruct" + model_name: str = "qwen2.5-vl-72b-instruct", ) -> Observable: """Process a single frame from a video observable with Qwen model. - + Args: video_observable: An observable that emits video frames query: The query to ask about the frame api_key: Alibaba API key. If None, will try to get from ALIBABA_API_KEY env var model_name: The Qwen model to use. Defaults to qwen2.5-vl-72b-instruct - + Returns: Observable: An observable that emits a single response string - + Example: ```python video_obs = video_provider.capture_video_as_observable() @@ -40,19 +39,21 @@ def query_single_frame_observable( ``` """ # Get API key from env if not provided - api_key = api_key or os.getenv('ALIBABA_API_KEY') + api_key = api_key or os.getenv("ALIBABA_API_KEY") if not api_key: - raise ValueError("Alibaba API key must be provided or set in ALIBABA_API_KEY environment variable") + raise ValueError( + "Alibaba API key must be provided or set in ALIBABA_API_KEY environment variable" + ) # Create Qwen client qwen_client = OpenAI( - base_url='https://dashscope-intl.aliyuncs.com/compatible-mode/v1', + base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1", api_key=api_key, ) # Create response subject response_subject = Subject() - + # Create temporary agent for processing agent = OpenAIAgent( dev_name="QwenSingleFrameAgent", @@ -65,45 +66,41 @@ def query_single_frame_observable( ) # Take only first frame - single_frame = video_observable.pipe( - ops.take(1) - ) + single_frame = video_observable.pipe(ops.take(1)) # Subscribe to frame processing and forward response to our subject agent.subscribe_to_image_processing(single_frame) - + # Forward agent responses to our response subject agent.get_response_observable().subscribe( on_next=lambda x: response_subject.on_next(x), on_error=lambda e: response_subject.on_error(e), - on_completed=lambda: response_subject.on_completed() + on_completed=lambda: response_subject.on_completed(), ) # Clean up agent when response subject completes - response_subject.subscribe( - on_completed=lambda: agent.dispose_all() - ) + response_subject.subscribe(on_completed=lambda: agent.dispose_all()) - return response_subject + return response_subject def query_single_frame( - image: 'PIL.Image', - query: str = 'Return the center coordinates of the fridge handle as a tuple (x,y)', + image: "PIL.Image", + query: str = "Return the center coordinates of the fridge handle as a tuple (x,y)", api_key: Optional[str] = None, - model_name: str = "qwen2.5-vl-72b-instruct" + model_name: str = "qwen2.5-vl-72b-instruct", ) -> str: """Process a single PIL image with Qwen model. - + Args: image: A PIL Image to process query: The query to ask about the image api_key: Alibaba API key. If None, will try to get from ALIBABA_API_KEY env var model_name: The Qwen model to use. Defaults to qwen2.5-vl-72b-instruct - + Returns: str: The model's response - + Example: ```python from PIL import Image @@ -113,13 +110,15 @@ def query_single_frame( ``` """ # Get API key from env if not provided - api_key = api_key or os.getenv('ALIBABA_API_KEY') + api_key = api_key or os.getenv("ALIBABA_API_KEY") if not api_key: - raise ValueError("Alibaba API key must be provided or set in ALIBABA_API_KEY environment variable") + raise ValueError( + "Alibaba API key must be provided or set in ALIBABA_API_KEY environment variable" + ) # Create Qwen client qwen_client = OpenAI( - base_url='https://dashscope-intl.aliyuncs.com/compatible-mode/v1', + base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1", api_key=api_key, ) @@ -136,40 +135,38 @@ def query_single_frame( # Convert PIL image to numpy array frame = np.array(image) - + # Create a Subject that will emit the image once frame_subject = Subject() - + # Subscribe to frame processing agent.subscribe_to_image_processing(frame_subject) - + # Create response observable response_observable = agent.get_response_observable() - + # Emit the image frame_subject.on_next(frame) frame_subject.on_completed() - + # Take first response and run synchronously - response = response_observable.pipe( - ops.take(1) - ).run() - + response = response_observable.pipe(ops.take(1)).run() + # Clean up agent.dispose_all() - + return response + def get_bbox_from_qwen( - video_stream: Observable, - object_name: Optional[str] = None + video_stream: Observable, object_name: Optional[str] = None ) -> Optional[list]: """Get bounding box coordinates from Qwen for a specific object or any object. - + Args: video_stream: Observable video stream object_name: Optional name of object to detect - + Returns: bbox: Bounding box as [x1, y1, x2, y2] or None if no detection """ @@ -183,31 +180,29 @@ def get_bbox_from_qwen( try: # Extract JSON from response - start_idx = response.find('{') - end_idx = response.rfind('}') + 1 + start_idx = response.find("{") + end_idx = response.rfind("}") + 1 if start_idx >= 0 and end_idx > start_idx: json_str = response[start_idx:end_idx] result = json.loads(json_str) - + # Extract and validate bbox - if 'bbox' in result and len(result['bbox']) == 4: - return result['bbox'], result['size'] + if "bbox" in result and len(result["bbox"]) == 4: + return result["bbox"], result["size"] except Exception as e: print(f"Error parsing Qwen response: {e}") print(f"Raw response: {response}") return None -def get_bbox_from_qwen_frame( - frame, - object_name: Optional[str] = None -) -> Optional[tuple]: + +def get_bbox_from_qwen_frame(frame, object_name: Optional[str] = None) -> Optional[tuple]: """Get bounding box coordinates from Qwen for a specific object or any object using a single frame. - + Args: frame: A single image frame (PIL Image or numpy array) object_name: Optional name of object to detect - + Returns: tuple: (bbox, size) where bbox is [x1, y1, x2, y2] or None if no detection and size is the estimated height in meters @@ -215,8 +210,9 @@ def get_bbox_from_qwen_frame( # Convert numpy array to PIL Image if needed if isinstance(frame, np.ndarray): from PIL import Image + frame = Image.fromarray(frame) - + prompt = ( f"Look at this image and find the {object_name if object_name else 'most prominent object'}. Estimate the approximate height of the subject." "Return ONLY a JSON object with format: {'name': 'object_name', 'bbox': [x1, y1, x2, y2], 'size': height_in_meters} " @@ -227,17 +223,17 @@ def get_bbox_from_qwen_frame( try: # Extract JSON from response - start_idx = response.find('{') - end_idx = response.rfind('}') + 1 + start_idx = response.find("{") + end_idx = response.rfind("}") + 1 if start_idx >= 0 and end_idx > start_idx: json_str = response[start_idx:end_idx] result = json.loads(json_str) - + # Extract and validate bbox - if 'bbox' in result and len(result['bbox']) == 4: - return result['bbox'], result['size'] + if "bbox" in result and len(result["bbox"]) == 4: + return result["bbox"], result["size"] except Exception as e: print(f"Error parsing Qwen response: {e}") print(f"Raw response: {response}") - return None \ No newline at end of file + return None diff --git a/dimos/models/segmentation/clipseg.py b/dimos/models/segmentation/clipseg.py index 34100dff52..043cd194b0 100644 --- a/dimos/models/segmentation/clipseg.py +++ b/dimos/models/segmentation/clipseg.py @@ -13,8 +13,7 @@ # limitations under the License. from transformers import AutoProcessor, CLIPSegForImageSegmentation -import torch -import numpy as np + class CLIPSeg: def __init__(self, model_name="CIDAS/clipseg-rd64-refined"): @@ -22,7 +21,12 @@ def __init__(self, model_name="CIDAS/clipseg-rd64-refined"): self.clipseg_model = CLIPSegForImageSegmentation.from_pretrained(model_name) def run_inference(self, image, text_descriptions): - inputs = self.clipseg_processor(text=text_descriptions, images=[image] * len(text_descriptions), padding=True, return_tensors="pt") + inputs = self.clipseg_processor( + text=text_descriptions, + images=[image] * len(text_descriptions), + padding=True, + return_tensors="pt", + ) outputs = self.clipseg_model(**inputs) logits = outputs.logits - return logits.detach().unsqueeze(1) \ No newline at end of file + return logits.detach().unsqueeze(1) diff --git a/dimos/models/segmentation/sam.py b/dimos/models/segmentation/sam.py index b1c41915c2..1efb07c484 100644 --- a/dimos/models/segmentation/sam.py +++ b/dimos/models/segmentation/sam.py @@ -14,7 +14,7 @@ from transformers import SamModel, SamProcessor import torch -import numpy as np + class SAM: def __init__(self, model_name="facebook/sam-vit-huge", device="cuda"): @@ -23,7 +23,13 @@ def __init__(self, model_name="facebook/sam-vit-huge", device="cuda"): self.sam_processor = SamProcessor.from_pretrained(model_name) def run_inference_from_points(self, image, points): - sam_inputs = self.sam_processor(image, input_points=points, return_tensors="pt").to(self.device) + sam_inputs = self.sam_processor(image, input_points=points, return_tensors="pt").to( + self.device + ) with torch.no_grad(): sam_outputs = self.sam_model(**sam_inputs) - return self.sam_processor.image_processor.post_process_masks(sam_outputs.pred_masks.cpu(), sam_inputs["original_sizes"].cpu(), sam_inputs["reshaped_input_sizes"].cpu()) + return self.sam_processor.image_processor.post_process_masks( + sam_outputs.pred_masks.cpu(), + sam_inputs["original_sizes"].cpu(), + sam_inputs["reshaped_input_sizes"].cpu(), + ) diff --git a/dimos/models/segmentation/segment_utils.py b/dimos/models/segmentation/segment_utils.py index 04f18f22a1..9808f5d4e4 100644 --- a/dimos/models/segmentation/segment_utils.py +++ b/dimos/models/segmentation/segment_utils.py @@ -15,6 +15,7 @@ import torch import numpy as np + def find_medoid_and_closest_points(points, num_closest=5): """ Find the medoid from a collection of points and the closest points to the medoid. @@ -32,9 +33,10 @@ def find_medoid_and_closest_points(points, num_closest=5): medoid_idx = np.argmin(distance_sums) medoid = points[medoid_idx] sorted_indices = np.argsort(distances[medoid_idx]) - closest_indices = sorted_indices[1:num_closest + 1] + closest_indices = sorted_indices[1 : num_closest + 1] return medoid, points[closest_indices] + def sample_points_from_heatmap(heatmap, original_size, num_points=5, percentile=0.95): """ Sample points from the given heatmap, focusing on areas with higher values. @@ -46,7 +48,9 @@ def sample_points_from_heatmap(heatmap, original_size, num_points=5, percentile= attn = torch.sigmoid(heatmap) w = attn.shape[0] - sampled_indices = torch.multinomial(torch.tensor(probabilities.ravel()), num_points, replacement=True) + sampled_indices = torch.multinomial( + torch.tensor(probabilities.ravel()), num_points, replacement=True + ) sampled_coords = np.array(np.unravel_index(sampled_indices, attn.shape)).T medoid, sampled_coords = find_medoid_and_closest_points(sampled_coords) @@ -66,4 +70,4 @@ def apply_mask_to_image(image, mask): masked_image = image.copy() for c in range(masked_image.shape[2]): masked_image[:, :, c] = masked_image[:, :, c] * mask - return masked_image \ No newline at end of file + return masked_image diff --git a/dimos/perception/common/__init__.py b/dimos/perception/common/__init__.py index a4dd07c913..ad815d3f46 100644 --- a/dimos/perception/common/__init__.py +++ b/dimos/perception/common/__init__.py @@ -1,3 +1,3 @@ from .detection2d_tracker import target2dTracker, get_tracked_results from .cuboid_fit import * -from .ibvs import * \ No newline at end of file +from .ibvs import * diff --git a/dimos/perception/common/cuboid_fit.py b/dimos/perception/common/cuboid_fit.py index 8bf37be170..cbfed972af 100644 --- a/dimos/perception/common/cuboid_fit.py +++ b/dimos/perception/common/cuboid_fit.py @@ -2,19 +2,18 @@ from sklearn.decomposition import PCA import matplotlib.pyplot as plt import cv2 -import argparse -from pathlib import Path + def depth_to_point_cloud(depth_image, camera_matrix, subsample_factor=4): """ Convert depth image to point cloud using camera intrinsics. Subsamples points to reduce density. - + Args: depth_image: HxW depth image in meters camera_matrix: 3x3 camera intrinsic matrix subsample_factor: Factor to subsample points (higher = fewer points) - + Returns: Nx3 array of 3D points """ @@ -23,39 +22,41 @@ def depth_to_point_cloud(depth_image, camera_matrix, subsample_factor=4): fy = camera_matrix[1, 1] cx = camera_matrix[0, 2] cy = camera_matrix[1, 2] - + # Create pixel coordinate grid rows, cols = depth_image.shape - x_grid, y_grid = np.meshgrid(np.arange(0, cols, subsample_factor), - np.arange(0, rows, subsample_factor)) - + x_grid, y_grid = np.meshgrid( + np.arange(0, cols, subsample_factor), np.arange(0, rows, subsample_factor) + ) + # Flatten grid and depth x = x_grid.flatten() y = y_grid.flatten() z = depth_image[y_grid, x_grid].flatten() - + # Remove points with invalid depth valid = z > 0 x = x[valid] y = y[valid] z = z[valid] - + # Convert to 3D points X = (x - cx) * z / fx Y = (y - cy) * z / fy Z = z - + return np.column_stack([X, Y, Z]) + def fit_cuboid(points, n_iterations=5, inlier_thresh=2.0): """ Fit a cuboid to a point cloud using iteratively refined PCA. - + Args: points: Nx3 array of points n_iterations: Number of refinement iterations inlier_thresh: Threshold for inlier detection in standard deviations - + Returns: dict containing: - center: 3D center point @@ -66,126 +67,130 @@ def fit_cuboid(points, n_iterations=5, inlier_thresh=2.0): points = np.asarray(points) if len(points) < 4: return None - + # Initial center estimate using median for robustness - best_error = float('inf') + best_error = float("inf") best_params = None center = np.median(points, axis=0) current_points = points - center - + for iteration in range(n_iterations): if len(current_points) < 4: # Need at least 4 points for PCA break - + # Perform PCA pca = PCA(n_components=3) pca.fit(current_points) - + # Get rotation matrix from PCA rotation = pca.components_ - + # Transform points to PCA space local_points = current_points @ rotation.T - + # Initialize mask for this iteration inlier_mask = np.ones(len(current_points), dtype=bool) dimensions = np.zeros(3) - + # Filter points along each dimension for dim in range(3): points_1d = local_points[inlier_mask, dim] if len(points_1d) < 4: break - + median = np.median(points_1d) mad = np.median(np.abs(points_1d - median)) sigma = mad * 1.4826 # Convert MAD to standard deviation estimate - + # Avoid issues with constant values if sigma < 1e-6: continue - + # Update mask for this dimension dim_inliers = np.abs(points_1d - median) < (inlier_thresh * sigma) inlier_mask[inlier_mask] = dim_inliers - + # Calculate dimension based on robust statistics valid_points = points_1d[dim_inliers] if len(valid_points) > 0: dimensions[dim] = np.max(valid_points) - np.min(valid_points) - + # Skip if we don't have enough inliers if np.sum(inlier_mask) < 4: continue - + # Calculate error for this iteration # Mean squared distance from points to cuboid surface half_dims = dimensions / 2 dx = np.abs(local_points[:, 0]) - half_dims[0] dy = np.abs(local_points[:, 1]) - half_dims[1] dz = np.abs(local_points[:, 2]) - half_dims[2] - - outside_dist = np.sqrt(np.maximum(dx, 0)**2 + - np.maximum(dy, 0)**2 + - np.maximum(dz, 0)**2) + + outside_dist = np.sqrt( + np.maximum(dx, 0) ** 2 + np.maximum(dy, 0) ** 2 + np.maximum(dz, 0) ** 2 + ) inside_dist = np.minimum(np.maximum(np.maximum(dx, dy), dz), 0) distances = outside_dist + inside_dist error = np.mean(distances**2) - + if error < best_error: best_error = error best_params = { - 'center': center, - 'rotation': rotation, - 'dimensions': dimensions, - 'error': error + "center": center, + "rotation": rotation, + "dimensions": dimensions, + "error": error, } - + # Update points for next iteration current_points = current_points[inlier_mask] - + return best_params + def compute_fitting_error(local_points, dimensions): """Compute mean squared distance from points to cuboid surface.""" half_dims = dimensions / 2 dx = np.abs(local_points[:, 0]) - half_dims[0] dy = np.abs(local_points[:, 1]) - half_dims[1] dz = np.abs(local_points[:, 2]) - half_dims[2] - - outside_dist = np.sqrt(np.maximum(dx, 0)**2 + - np.maximum(dy, 0)**2 + - np.maximum(dz, 0)**2) + + outside_dist = np.sqrt(np.maximum(dx, 0) ** 2 + np.maximum(dy, 0) ** 2 + np.maximum(dz, 0) ** 2) inside_dist = np.minimum(np.maximum(np.maximum(dx, dy), dz), 0) - + distances = outside_dist + inside_dist return np.mean(distances**2) + def get_cuboid_corners(center, dimensions, rotation): """Get the 8 corners of a cuboid.""" half_dims = dimensions / 2 - corners_local = np.array([ - [-1, -1, -1], # 0: left bottom back - [-1, -1, 1], # 1: left bottom front - [-1, 1, -1], # 2: left top back - [-1, 1, 1], # 3: left top front - [ 1, -1, -1], # 4: right bottom back - [ 1, -1, 1], # 5: right bottom front - [ 1, 1, -1], # 6: right top back - [ 1, 1, 1] # 7: right top front - ]) * half_dims - + corners_local = ( + np.array( + [ + [-1, -1, -1], # 0: left bottom back + [-1, -1, 1], # 1: left bottom front + [-1, 1, -1], # 2: left top back + [-1, 1, 1], # 3: left top front + [1, -1, -1], # 4: right bottom back + [1, -1, 1], # 5: right bottom front + [1, 1, -1], # 6: right top back + [1, 1, 1], # 7: right top front + ] + ) + * half_dims + ) + return corners_local @ rotation + center + def visualize_fit(image, cuboid_params, camera_matrix, R=None, t=None): """ Draw the fitted cuboid on the image. """ # Get corners in world coordinates corners = get_cuboid_corners( - cuboid_params['center'], - cuboid_params['dimensions'], - cuboid_params['rotation'] + cuboid_params["center"], cuboid_params["dimensions"], cuboid_params["rotation"] ) # Transform corners if R and t are provided @@ -193,93 +198,120 @@ def visualize_fit(image, cuboid_params, camera_matrix, R=None, t=None): corners = (R @ corners.T).T + t # Project corners to image space - corners_img = cv2.projectPoints( - corners, - np.zeros(3), np.zeros(3), # Already in camera frame - camera_matrix, - None - )[0].reshape(-1, 2).astype(int) + corners_img = ( + cv2.projectPoints( + corners, + np.zeros(3), + np.zeros(3), # Already in camera frame + camera_matrix, + None, + )[0] + .reshape(-1, 2) + .astype(int) + ) # Define edges for visualization edges = [ # Bottom face - (0, 1), (1, 5), (5, 4), (4, 0), + (0, 1), + (1, 5), + (5, 4), + (4, 0), # Top face - (2, 3), (3, 7), (7, 6), (6, 2), + (2, 3), + (3, 7), + (7, 6), + (6, 2), # Vertical edges - (0, 2), (1, 3), (5, 7), (4, 6) + (0, 2), + (1, 3), + (5, 7), + (4, 6), ] # Draw edges vis_img = image.copy() for i, j in edges: - cv2.line(vis_img, - tuple(corners_img[i]), - tuple(corners_img[j]), - (0, 255, 0), 2) + cv2.line(vis_img, tuple(corners_img[i]), tuple(corners_img[j]), (0, 255, 0), 2) # Add text with dimensions - dims = cuboid_params['dimensions'] + dims = cuboid_params["dimensions"] dim_text = f"Dims: {dims[0]:.3f} x {dims[1]:.3f} x {dims[2]:.3f}" - cv2.putText(vis_img, dim_text, (10, 30), - cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) + cv2.putText(vis_img, dim_text, (10, 30), cv2.FONT_HERSHEY_SIMPLEX, 0.7, (0, 255, 0), 2) return vis_img + def plot_3d_fit(points, cuboid_params, title="3D Cuboid Fit"): """Plot points and fitted cuboid in 3D.""" fig = plt.figure(figsize=(10, 10)) - ax = fig.add_subplot(111, projection='3d') - + ax = fig.add_subplot(111, projection="3d") + # Plot points - ax.scatter(points[:, 0], points[:, 1], points[:, 2], - c='b', marker='.', alpha=0.1, label='Points') - + ax.scatter( + points[:, 0], points[:, 1], points[:, 2], c="b", marker=".", alpha=0.1, label="Points" + ) + # Plot fitted cuboid corners = get_cuboid_corners( - cuboid_params['center'], - cuboid_params['dimensions'], - cuboid_params['rotation'] + cuboid_params["center"], cuboid_params["dimensions"], cuboid_params["rotation"] ) - + # Define edges edges = [ # Bottom face - (0, 1), (1, 5), (5, 4), (4, 0), + (0, 1), + (1, 5), + (5, 4), + (4, 0), # Top face - (2, 3), (3, 7), (7, 6), (6, 2), + (2, 3), + (3, 7), + (7, 6), + (6, 2), # Vertical edges - (0, 2), (1, 3), (5, 7), (4, 6) + (0, 2), + (1, 3), + (5, 7), + (4, 6), ] - + # Plot edges for i, j in edges: - ax.plot3D([corners[i,0], corners[j,0]], - [corners[i,1], corners[j,1]], - [corners[i,2], corners[j,2]], 'r-') - + ax.plot3D( + [corners[i, 0], corners[j, 0]], + [corners[i, 1], corners[j, 1]], + [corners[i, 2], corners[j, 2]], + "r-", + ) + # Set labels and title - ax.set_xlabel('X') - ax.set_ylabel('Y') - ax.set_zlabel('Z') + ax.set_xlabel("X") + ax.set_ylabel("Y") + ax.set_zlabel("Z") ax.set_title(title) - + # Make scaling uniform all_points = np.vstack([points, corners]) - max_range = np.array([ - all_points[:,0].max() - all_points[:,0].min(), - all_points[:,1].max() - all_points[:,1].min(), - all_points[:,2].max() - all_points[:,2].min() - ]).max() / 2.0 - - mid_x = (all_points[:,0].max() + all_points[:,0].min()) * 0.5 - mid_y = (all_points[:,1].max() + all_points[:,1].min()) * 0.5 - mid_z = (all_points[:,2].max() + all_points[:,2].min()) * 0.5 - + max_range = ( + np.array( + [ + all_points[:, 0].max() - all_points[:, 0].min(), + all_points[:, 1].max() - all_points[:, 1].min(), + all_points[:, 2].max() - all_points[:, 2].min(), + ] + ).max() + / 2.0 + ) + + mid_x = (all_points[:, 0].max() + all_points[:, 0].min()) * 0.5 + mid_y = (all_points[:, 1].max() + all_points[:, 1].min()) * 0.5 + mid_z = (all_points[:, 2].max() + all_points[:, 2].min()) * 0.5 + ax.set_xlim(mid_x - max_range, mid_x + max_range) ax.set_ylim(mid_y - max_range, mid_y + max_range) ax.set_zlim(mid_z - max_range, mid_z + max_range) - - ax.set_box_aspect([1,1,1]) + + ax.set_box_aspect([1, 1, 1]) plt.legend() return fig, ax diff --git a/dimos/perception/common/detection2d_tracker.py b/dimos/perception/common/detection2d_tracker.py index 62b465a4a9..90ddbe5c7f 100644 --- a/dimos/perception/common/detection2d_tracker.py +++ b/dimos/perception/common/detection2d_tracker.py @@ -1,6 +1,7 @@ import numpy as np from collections import deque + def compute_iou(bbox1, bbox2): """ Compute Intersection over Union (IoU) of two bounding boxes. @@ -10,24 +11,25 @@ def compute_iou(bbox1, bbox2): y1 = max(bbox1[1], bbox2[1]) x2 = min(bbox1[2], bbox2[2]) y2 = min(bbox1[3], bbox2[3]) - + inter_area = max(0, x2 - x1) * max(0, y2 - y1) area1 = (bbox1[2] - bbox1[0]) * (bbox1[3] - bbox1[1]) area2 = (bbox2[2] - bbox2[0]) * (bbox2[3] - bbox2[1]) - + union_area = area1 + area2 - inter_area if union_area == 0: return 0 return inter_area / union_area + def get_tracked_results(tracked_targets): """ Extract tracked results from a list of target2d objects. - + Args: tracked_targets (list[target2d]): List of target2d objects (published targets) returned by the tracker's update() function. - + Returns: tuple: (tracked_masks, tracked_bboxes, tracked_track_ids, tracked_probs, tracked_names) where each is a list of the corresponding attribute from each target. @@ -37,7 +39,7 @@ def get_tracked_results(tracked_targets): tracked_track_ids = [] tracked_probs = [] tracked_names = [] - + for target in tracked_targets: # Extract the latest values stored in each target. tracked_masks.append(target.latest_mask) @@ -48,9 +50,8 @@ def get_tracked_results(tracked_targets): tracked_probs.append(target.score) # Use the stored name (if any). If not available, you can use a default value. tracked_names.append(target.name) - - return tracked_masks, tracked_bboxes, tracked_track_ids, tracked_probs, tracked_names + return tracked_masks, tracked_bboxes, tracked_track_ids, tracked_probs, tracked_names class target2d: @@ -59,7 +60,18 @@ class target2d: Stores the latest bounding box and mask along with a short history of track IDs, detection probabilities, and computed texture values. """ - def __init__(self, initial_mask, initial_bbox, track_id, prob, name, texture_value, target_id, history_size=10): + + def __init__( + self, + initial_mask, + initial_bbox, + track_id, + prob, + name, + texture_value, + target_id, + history_size=10, + ): """ Args: initial_mask (torch.Tensor): Latest segmentation mask. @@ -76,13 +88,13 @@ def __init__(self, initial_mask, initial_bbox, track_id, prob, name, texture_val self.latest_bbox = initial_bbox self.name = name self.score = 1.0 - + self.track_id = track_id self.probs_history = deque(maxlen=history_size) self.texture_history = deque(maxlen=history_size) - - self.frame_count = deque(maxlen=history_size) # Total frames this target has been seen. - self.missed_frames = 0 # Consecutive frames when no detection was assigned. + + self.frame_count = deque(maxlen=history_size) # Total frames this target has been seen. + self.missed_frames = 0 # Consecutive frames when no detection was assigned. self.history_size = history_size def update(self, mask, bbox, track_id, prob, name, texture_value): @@ -92,14 +104,14 @@ def update(self, mask, bbox, track_id, prob, name, texture_value): self.latest_mask = mask self.latest_bbox = bbox self.name = name - + self.track_id = track_id self.probs_history.append(prob) self.texture_history.append(texture_value) - + self.frame_count.append(1) self.missed_frames = 0 - + def mark_missed(self): """ Increment the count of consecutive frames where this target was not updated. @@ -107,35 +119,41 @@ def mark_missed(self): self.missed_frames += 1 self.frame_count.append(0) - def compute_score(self, frame_shape, min_area_ratio, max_area_ratio, - texture_range=(0.0, 1.0), border_safe_distance=50, - weights=None): + def compute_score( + self, + frame_shape, + min_area_ratio, + max_area_ratio, + texture_range=(0.0, 1.0), + border_safe_distance=50, + weights=None, + ): """ Compute a combined score for the target based on several factors. - + Factors: - **Detection probability:** Average over recent frames. - **Temporal stability:** How consistently the target has appeared. - **Texture quality:** Normalized using the provided min and max values. - **Border proximity:** Computed from the minimum distance from the bbox to the frame edges. - **Size:** How the object's area (relative to the frame) compares to acceptable bounds. - + Args: frame_shape (tuple): (height, width) of the frame. min_area_ratio (float): Minimum acceptable ratio (bbox area / frame area). max_area_ratio (float): Maximum acceptable ratio. texture_range (tuple): (min_texture, max_texture) expected values. border_safe_distance (float): Distance (in pixels) considered safe from the border. - weights (dict): Weights for each component. Expected keys: + weights (dict): Weights for each component. Expected keys: 'prob', 'temporal', 'texture', 'border', and 'size'. - + Returns: float: The combined (normalized) score in the range [0, 1]. """ # Default weights if none provided. if weights is None: weights = {"prob": 1.0, "temporal": 1.0, "texture": 1.0, "border": 1.0, "size": 1.0} - + h, w = frame_shape x1, y1, x2, y2 = self.latest_bbox bbox_area = (x2 - x1) * (y2 - y1) @@ -183,42 +201,51 @@ def compute_score(self, frame_shape, min_area_ratio, max_area_ratio, w_size = weights.get("size", 1.0) total_weight = w_prob + w_temporal + w_texture + w_border + w_size - #print(f"track_id: {self.target_id}, avg_prob: {avg_prob:.2f}, temporal_stability: {temporal_stability:.2f}, normalized_texture: {normalized_texture:.2f}, border_factor: {border_factor:.2f}, size_factor: {size_factor:.2f}") - - final_score = (w_prob * avg_prob + - w_temporal * temporal_stability + - w_texture * normalized_texture + - w_border * border_factor + - w_size * size_factor) / total_weight - + # print(f"track_id: {self.target_id}, avg_prob: {avg_prob:.2f}, temporal_stability: {temporal_stability:.2f}, normalized_texture: {normalized_texture:.2f}, border_factor: {border_factor:.2f}, size_factor: {size_factor:.2f}") + + final_score = ( + w_prob * avg_prob + + w_temporal * temporal_stability + + w_texture * normalized_texture + + w_border * border_factor + + w_size * size_factor + ) / total_weight + self.score = final_score - + return final_score + class target2dTracker: """ Tracker that maintains a history of targets across frames. New segmentation detections (frame, masks, bboxes, track_ids, probabilities, and computed texture values) are matched to existing targets or used to create new ones. - + The tracker uses a scoring system that incorporates: - **Detection probability** - **Temporal stability** - **Texture quality** (normalized within a specified range) - **Proximity to image borders** (a continuous penalty based on the distance) - **Object size** relative to the frame - + Targets are published if their score exceeds the start threshold and are removed if their score falls below the stop threshold or if they are missed for too many consecutive frames. """ - def __init__(self, history_size=10, - score_threshold_start=0.5, score_threshold_stop=0.3, - min_frame_count=10, - max_missed_frames=3, - min_area_ratio=0.001, max_area_ratio=0.1, - texture_range=(0.0, 1.0), - border_safe_distance=50, - weights=None): + + def __init__( + self, + history_size=10, + score_threshold_start=0.5, + score_threshold_stop=0.3, + min_frame_count=10, + max_missed_frames=3, + min_area_ratio=0.001, + max_area_ratio=0.1, + texture_range=(0.0, 1.0), + border_safe_distance=50, + weights=None, + ): """ Args: history_size (int): Maximum history length (number of frames) per target. @@ -246,14 +273,14 @@ def __init__(self, history_size=10, if weights is None: weights = {"prob": 1.0, "temporal": 1.0, "texture": 1.0, "border": 1.0, "size": 1.0} self.weights = weights - + self.targets = {} # Dictionary mapping target_id -> target2d instance. self.next_target_id = 0 def update(self, frame, masks, bboxes, track_ids, probs, names, texture_values): """ Update the tracker with new detections from the current frame. - + Args: frame (np.ndarray): Current BGR frame. masks (list[torch.Tensor]): List of segmentation masks. @@ -262,7 +289,7 @@ def update(self, frame, masks, bboxes, track_ids, probs, names, texture_values): probs (list): List of detection probabilities. names (list): List of class names. texture_values (list): List of computed texture values. - + Returns: published_targets (list[target2d]): Targets that are active and have scores above the start threshold. @@ -271,7 +298,9 @@ def update(self, frame, masks, bboxes, track_ids, probs, names, texture_values): frame_shape = frame.shape[:2] # (height, width) # For each detection, try to match with an existing target. - for mask, bbox, det_tid, prob, name, texture in zip(masks, bboxes, track_ids, probs, names, texture_values): + for mask, bbox, det_tid, prob, name, texture in zip( + masks, bboxes, track_ids, probs, names, texture_values + ): matched_target = None # First, try matching by detection track ID if valid. @@ -295,7 +324,9 @@ def update(self, frame, masks, bboxes, track_ids, probs, names, texture_values): matched_target.update(mask, bbox, det_tid, prob, name, texture) updated_target_ids.add(matched_target.target_id) else: - new_target = target2d(mask, bbox, det_tid, prob, name, texture, self.next_target_id, self.history_size) + new_target = target2d( + mask, bbox, det_tid, prob, name, texture, self.next_target_id, self.history_size + ) self.targets[self.next_target_id] = new_target updated_target_ids.add(self.next_target_id) self.next_target_id += 1 @@ -308,23 +339,33 @@ def update(self, frame, masks, bboxes, track_ids, probs, names, texture_values): del self.targets[target_id] continue # Skip further checks for this target. # Remove targets whose score falls below the stop threshold. - score = target.compute_score(frame_shape, self.min_area_ratio, self.max_area_ratio, - texture_range=self.texture_range, - border_safe_distance=self.border_safe_distance, - weights=self.weights) + score = target.compute_score( + frame_shape, + self.min_area_ratio, + self.max_area_ratio, + texture_range=self.texture_range, + border_safe_distance=self.border_safe_distance, + weights=self.weights, + ) if score < self.score_threshold_stop: del self.targets[target_id] # Publish targets with scores above the start threshold. published_targets = [] for target in self.targets.values(): - score = target.compute_score(frame_shape, self.min_area_ratio, self.max_area_ratio, - texture_range=self.texture_range, - border_safe_distance=self.border_safe_distance, - weights=self.weights) - if score >= self.score_threshold_start and \ - sum(target.frame_count) >= self.min_frame_count and \ - target.missed_frames <= 5: + score = target.compute_score( + frame_shape, + self.min_area_ratio, + self.max_area_ratio, + texture_range=self.texture_range, + border_safe_distance=self.border_safe_distance, + weights=self.weights, + ) + if ( + score >= self.score_threshold_start + and sum(target.frame_count) >= self.min_frame_count + and target.missed_frames <= 5 + ): published_targets.append(target) return published_targets diff --git a/dimos/perception/common/export_tensorrt.py b/dimos/perception/common/export_tensorrt.py index cdc5663b5d..b7b48e0367 100644 --- a/dimos/perception/common/export_tensorrt.py +++ b/dimos/perception/common/export_tensorrt.py @@ -1,22 +1,36 @@ import argparse from ultralytics import YOLO, FastSAM -from pathlib import Path + def parse_args(): - parser = argparse.ArgumentParser(description='Export YOLO/FastSAM models to different formats') - parser.add_argument('--model_path', type=str, required=True, help='Path to the model weights') - parser.add_argument('--model_type', type=str, choices=['yolo', 'fastsam'], required=True, help='Type of model to export') - parser.add_argument('--precision', type=str, choices=['fp32', 'fp16', 'int8'], default='fp32', help='Precision for export') - parser.add_argument('--format', type=str, choices=['onnx', 'engine'], default='onnx', help='Export format') + parser = argparse.ArgumentParser(description="Export YOLO/FastSAM models to different formats") + parser.add_argument("--model_path", type=str, required=True, help="Path to the model weights") + parser.add_argument( + "--model_type", + type=str, + choices=["yolo", "fastsam"], + required=True, + help="Type of model to export", + ) + parser.add_argument( + "--precision", + type=str, + choices=["fp32", "fp16", "int8"], + default="fp32", + help="Precision for export", + ) + parser.add_argument( + "--format", type=str, choices=["onnx", "engine"], default="onnx", help="Export format" + ) return parser.parse_args() + def main(): args = parse_args() - half = args.precision == 'fp16' - int8 = args.precision == 'int8' + half = args.precision == "fp16" + int8 = args.precision == "int8" # Load the appropriate model - if args.model_type == 'yolo': - + if args.model_type == "yolo": model = YOLO(args.model_path) else: model = FastSAM(args.model_path) @@ -24,5 +38,6 @@ def main(): # Export the model model.export(format=args.format, half=half, int8=int8) -if __name__ == '__main__': - main() \ No newline at end of file + +if __name__ == "__main__": + main() diff --git a/dimos/perception/common/ibvs.py b/dimos/perception/common/ibvs.py index 040bd66799..2c08752a0c 100644 --- a/dimos/perception/common/ibvs.py +++ b/dimos/perception/common/ibvs.py @@ -1,10 +1,11 @@ import numpy as np + class PersonDistanceEstimator: def __init__(self, K, camera_pitch, camera_height): """ Initialize the distance estimator using ground plane constraint. - + Args: K: 3x3 Camera intrinsic matrix in OpenCV format (Assumed to be already for an undistorted image) @@ -14,26 +15,22 @@ def __init__(self, K, camera_pitch, camera_height): """ self.K = K self.camera_height = camera_height - + # Precompute the inverse intrinsic matrix self.K_inv = np.linalg.inv(K) - + # Transform from camera to robot frame (z-forward to x-forward) - self.T = np.array([[0, 0, 1], - [-1, 0, 0], - [0, -1, 0]]) - + self.T = np.array([[0, 0, 1], [-1, 0, 0], [0, -1, 0]]) + # Pitch rotation matrix (positive is upward) theta = -camera_pitch # Negative since positive pitch is negative rotation about robot Y - self.R_pitch = np.array([ - [ np.cos(theta), 0, np.sin(theta)], - [ 0, 1, 0], - [-np.sin(theta), 0, np.cos(theta)] - ]) - + self.R_pitch = np.array( + [[np.cos(theta), 0, np.sin(theta)], [0, 1, 0], [-np.sin(theta), 0, np.cos(theta)]] + ) + # Combined transform from camera to robot frame self.A = self.R_pitch @ self.T - + # Store focal length and principal point for angle calculation self.fx = K[0, 0] self.cx = K[0, 2] @@ -41,79 +38,81 @@ def __init__(self, K, camera_pitch, camera_height): def estimate_distance_angle(self, bbox: tuple, robot_pitch: float = None): """ Estimate distance and angle to person using ground plane constraint. - + Args: bbox: tuple (x_min, y_min, x_max, y_max) where y_max represents the feet position robot_pitch: Current pitch of the robot body (in radians) If provided, this will be combined with the camera's fixed pitch - + Returns: depth: distance to person along camera's z-axis (meters) angle: horizontal angle in camera frame (radians, positive right) """ x_min, _, x_max, y_max = bbox - + # Get center point of feet u_c = (x_min + x_max) / 2.0 v_feet = y_max - + # Create homogeneous feet point and get ray direction p_feet = np.array([u_c, v_feet, 1.0]) d_feet_cam = self.K_inv @ p_feet - + # If robot_pitch is provided, recalculate the transformation matrix if robot_pitch is not None: # Combined pitch (fixed camera pitch + current robot pitch) total_pitch = -camera_pitch - robot_pitch # Both negated for correct rotation direction - R_total_pitch = np.array([ - [ np.cos(total_pitch), 0, np.sin(total_pitch)], - [ 0, 1, 0], - [-np.sin(total_pitch), 0, np.cos(total_pitch)] - ]) + R_total_pitch = np.array( + [ + [np.cos(total_pitch), 0, np.sin(total_pitch)], + [0, 1, 0], + [-np.sin(total_pitch), 0, np.cos(total_pitch)], + ] + ) # Use the updated transformation matrix A = R_total_pitch @ self.T else: # Use the precomputed transformation matrix A = self.A - + # Convert ray to robot frame using appropriate transformation d_feet_robot = A @ d_feet_cam - + # Ground plane intersection (z=0) # camera_height + t * d_feet_robot[2] = 0 if abs(d_feet_robot[2]) < 1e-6: raise ValueError("Feet ray is parallel to ground plane") - + # Solve for scaling factor t t = -self.camera_height / d_feet_robot[2] - + # Get 3D feet position in robot frame p_feet_robot = t * d_feet_robot - + # Convert back to camera frame p_feet_cam = self.A.T @ p_feet_robot - + # Extract depth (z-coordinate in camera frame) depth = p_feet_cam[2] - + # Calculate horizontal angle from image center angle = np.arctan((u_c - self.cx) / self.fx) - + return depth, angle class ObjectDistanceEstimator: - """ Estimate distance to an object using the ground plane constraint. This class assumes the camera is mounted on a robot and uses the camera's intrinsic parameters to estimate the distance to a detected object. """ + def __init__(self, K, camera_pitch, camera_height): """ Initialize the distance estimator using ground plane constraint. - + Args: K: 3x3 Camera intrinsic matrix in OpenCV format (Assumed to be already for an undistorted image) @@ -123,26 +122,22 @@ def __init__(self, K, camera_pitch, camera_height): """ self.K = K self.camera_height = camera_height - + # Precompute the inverse intrinsic matrix self.K_inv = np.linalg.inv(K) - + # Transform from camera to robot frame (z-forward to x-forward) - self.T = np.array([[0, 0, 1], - [-1, 0, 0], - [0, -1, 0]]) - + self.T = np.array([[0, 0, 1], [-1, 0, 0], [0, -1, 0]]) + # Pitch rotation matrix (positive is upward) theta = -camera_pitch # Negative since positive pitch is negative rotation about robot Y - self.R_pitch = np.array([ - [ np.cos(theta), 0, np.sin(theta)], - [ 0, 1, 0], - [-np.sin(theta), 0, np.cos(theta)] - ]) - + self.R_pitch = np.array( + [[np.cos(theta), 0, np.sin(theta)], [0, 1, 0], [-np.sin(theta), 0, np.cos(theta)]] + ) + # Combined transform from camera to robot frame self.A = self.R_pitch @ self.T - + # Store focal length and principal point for angle calculation self.fx = K[0, 0] self.fy = K[1, 1] @@ -152,30 +147,30 @@ def __init__(self, K, camera_pitch, camera_height): def estimate_object_size(self, bbox: tuple, distance: float): """ Estimate the physical size of an object based on its bbox and known distance. - + Args: bbox: tuple (x_min, y_min, x_max, y_max) bounding box in the image distance: Known distance to the object (in meters) robot_pitch: Current pitch of the robot body (in radians), if any - + Returns: estimated_size: Estimated physical height of the object (in meters) """ x_min, y_min, x_max, y_max = bbox - + # Calculate object height in pixels object_height_px = y_max - y_min - + # Calculate the physical height using the known distance and focal length estimated_size = object_height_px * distance / self.fy self.estimated_object_size = estimated_size - + return estimated_size - + def set_estimated_object_size(self, size: float): """ Set the estimated object size for future distance calculations. - + Args: size: Estimated physical size of the object (in meters) """ @@ -184,7 +179,7 @@ def set_estimated_object_size(self, size: float): def estimate_distance_angle(self, bbox: tuple): """ Estimate distance and angle to object using size-based estimation. - + Args: bbox: tuple (x_min, y_min, x_max, y_max) where y_max represents the bottom of the object @@ -192,7 +187,7 @@ def estimate_distance_angle(self, bbox: tuple): If provided, this will be combined with the camera's fixed pitch initial_distance: Initial distance estimate for the object (in meters) Used to calibrate object size if not previously known - + Returns: depth: distance to object along camera's z-axis (meters) angle: horizontal angle in camera frame (radians, positive right) @@ -202,45 +197,43 @@ def estimate_distance_angle(self, bbox: tuple): # we can't estimate the distance if self.estimated_object_size is None: return None, None - + x_min, y_min, x_max, y_max = bbox - + # Calculate center of the object for angle calculation u_c = (x_min + x_max) / 2.0 - + # If we have an initial distance estimate and no object size yet, # calculate and store the object size using the initial distance object_height_px = y_max - y_min depth = self.estimated_object_size * self.fy / object_height_px - + # Calculate horizontal angle from image center angle = np.arctan((u_c - self.cx) / self.fx) - + return depth, angle # Example usage: if __name__ == "__main__": # Example camera calibration - K = np.array([[600, 0, 320], - [ 0, 600, 240], - [ 0, 0, 1]], dtype=np.float32) - + K = np.array([[600, 0, 320], [0, 600, 240], [0, 0, 1]], dtype=np.float32) + # Camera mounted 1.2m high, pitched down 10 degrees camera_pitch = np.deg2rad(0) # negative for downward pitch camera_height = 1.0 # meters - + estimator = PersonDistanceEstimator(K, camera_pitch, camera_height) object_estimator = ObjectDistanceEstimator(K, camera_pitch, camera_height) - + # Example detection bbox = (300, 100, 380, 400) # x1, y1, x2, y2 - + depth, angle = estimator.estimate_distance_angle(bbox) # Estimate object size based on the known distance object_size = object_estimator.estimate_object_size(bbox, depth) depth_obj, angle_obj = object_estimator.estimate_distance_angle(bbox) - + print(f"Estimated person depth: {depth:.2f} m") print(f"Estimated person angle: {np.rad2deg(angle):.1f}°") print(f"Estimated object depth: {depth_obj:.2f} m") @@ -252,15 +245,15 @@ def estimate_distance_angle(self, bbox: tuple): height = y_max - y_min center_x = (x_min + x_max) // 2 center_y = (y_min + y_max) // 2 - + new_width = max(width - 20, 2) # Ensure width is at least 2 pixels new_height = max(height - 20, 2) # Ensure height is at least 2 pixels - + x_min = center_x - new_width // 2 x_max = center_x + new_width // 2 y_min = center_y - new_height // 2 y_max = center_y + new_height // 2 - + bbox = (x_min, y_min, x_max, y_max) # Re-estimate distance and angle with the new bbox @@ -270,4 +263,4 @@ def estimate_distance_angle(self, bbox: tuple): print(f"New estimated person depth: {depth:.2f} m") print(f"New estimated person angle: {np.rad2deg(angle):.1f}°") print(f"New estimated object depth: {depth_obj:.2f} m") - print(f"New estimated object angle: {np.rad2deg(angle_obj):.1f}°") \ No newline at end of file + print(f"New estimated object angle: {np.rad2deg(angle_obj):.1f}°") diff --git a/dimos/perception/detection2d/__init__.py b/dimos/perception/detection2d/__init__.py index 265f6982d9..a43c5da6ce 100644 --- a/dimos/perception/detection2d/__init__.py +++ b/dimos/perception/detection2d/__init__.py @@ -1,2 +1,2 @@ from .utils import * -from .yolo_2d_det import * \ No newline at end of file +from .yolo_2d_det import * diff --git a/dimos/perception/detection2d/detic_2d_det.py b/dimos/perception/detection2d/detic_2d_det.py index c320438325..bed5700521 100644 --- a/dimos/perception/detection2d/detic_2d_det.py +++ b/dimos/perception/detection2d/detic_2d_det.py @@ -1,133 +1,137 @@ -import cv2 import numpy as np import os -import torch import sys -from pathlib import Path # Add Detic to Python path -detic_path = os.path.join(os.path.dirname(__file__), '..', '..', 'models', 'Detic') +detic_path = os.path.join(os.path.dirname(__file__), "..", "..", "models", "Detic") if detic_path not in sys.path: sys.path.append(detic_path) - sys.path.append(os.path.join(detic_path, 'third_party/CenterNet2')) + sys.path.append(os.path.join(detic_path, "third_party/CenterNet2")) # PIL patch for compatibility import PIL.Image -if not hasattr(PIL.Image, 'LINEAR') and hasattr(PIL.Image, 'BILINEAR'): + +if not hasattr(PIL.Image, "LINEAR") and hasattr(PIL.Image, "BILINEAR"): PIL.Image.LINEAR = PIL.Image.BILINEAR # Detectron2 imports from detectron2.config import get_cfg -from detectron2.utils.visualizer import Visualizer from detectron2.data import MetadataCatalog + # Simple tracking implementation class SimpleTracker: """Simple IOU-based tracker implementation without external dependencies""" - + def __init__(self, iou_threshold=0.3, max_age=5): self.iou_threshold = iou_threshold self.max_age = max_age self.next_id = 1 self.tracks = {} # id -> {bbox, class_id, age, etc} - + def _calculate_iou(self, bbox1, bbox2): """Calculate IoU between two bboxes in format [x1,y1,x2,y2]""" x1 = max(bbox1[0], bbox2[0]) y1 = max(bbox1[1], bbox2[1]) x2 = min(bbox1[2], bbox2[2]) y2 = min(bbox1[3], bbox2[3]) - + if x2 < x1 or y2 < y1: return 0.0 - + intersection = (x2 - x1) * (y2 - y1) area1 = (bbox1[2] - bbox1[0]) * (bbox1[3] - bbox1[1]) area2 = (bbox2[2] - bbox2[0]) * (bbox2[3] - bbox2[1]) union = area1 + area2 - intersection - + return intersection / union if union > 0 else 0 - + def update(self, detections): """Update tracker with new detections - + Args: detections: List of [x1,y1,x2,y2,score,class_id] - + Returns: List of [track_id, bbox, score, class_id] """ if len(detections) == 0: # Age existing tracks for track_id in list(self.tracks.keys()): - self.tracks[track_id]['age'] += 1 + self.tracks[track_id]["age"] += 1 # Remove old tracks - if self.tracks[track_id]['age'] > self.max_age: + if self.tracks[track_id]["age"] > self.max_age: del self.tracks[track_id] return [] - + # Convert to numpy for easier handling if not isinstance(detections, np.ndarray): detections = np.array(detections) - + result = [] matched_indices = set() - + # Update existing tracks for track_id, track in list(self.tracks.items()): - track['age'] += 1 - - if track['age'] > self.max_age: + track["age"] += 1 + + if track["age"] > self.max_age: del self.tracks[track_id] continue - + # Find best matching detection for this track best_iou = self.iou_threshold best_idx = -1 - + for i, det in enumerate(detections): if i in matched_indices: continue - + # Check class match - if det[5] != track['class_id']: + if det[5] != track["class_id"]: continue - - iou = self._calculate_iou(track['bbox'], det[:4]) + + iou = self._calculate_iou(track["bbox"], det[:4]) if iou > best_iou: best_iou = iou best_idx = i - + # If we found a match, update the track if best_idx >= 0: - self.tracks[track_id]['bbox'] = detections[best_idx][:4] - self.tracks[track_id]['score'] = detections[best_idx][4] - self.tracks[track_id]['age'] = 0 + self.tracks[track_id]["bbox"] = detections[best_idx][:4] + self.tracks[track_id]["score"] = detections[best_idx][4] + self.tracks[track_id]["age"] = 0 matched_indices.add(best_idx) - + # Add to results - result.append([track_id, detections[best_idx][:4], - detections[best_idx][4], int(detections[best_idx][5])]) - + result.append( + [ + track_id, + detections[best_idx][:4], + detections[best_idx][4], + int(detections[best_idx][5]), + ] + ) + # Create new tracks for unmatched detections for i, det in enumerate(detections): if i in matched_indices: continue - + # Create new track new_id = self.next_id self.next_id += 1 - + self.tracks[new_id] = { - 'bbox': det[:4], - 'score': det[4], - 'class_id': int(det[5]), - 'age': 0 + "bbox": det[:4], + "score": det[4], + "class_id": int(det[5]), + "age": 0, } - + # Add to results result.append([new_id, det[:4], det[4], int(det[5])]) - + return result @@ -135,7 +139,7 @@ class Detic2DDetector: def __init__(self, model_path=None, device="cuda", vocabulary=None, threshold=0.5): """ Initialize the Detic detector with open vocabulary support. - + Args: model_path (str): Path to a custom Detic model weights (optional) device (str): Device to run inference on ('cuda' or 'cpu') @@ -144,82 +148,89 @@ def __init__(self, model_path=None, device="cuda", vocabulary=None, threshold=0. """ self.device = device self.threshold = threshold - + # Set up Detic paths - already added to sys.path at module level - + # Import Detic modules from centernet.config import add_centernet_config from detic.config import add_detic_config from detic.modeling.utils import reset_cls_test from detic.modeling.text.text_encoder import build_text_encoder - + # Keep reference to these functions for later use self.reset_cls_test = reset_cls_test self.build_text_encoder = build_text_encoder - + # Setup model configuration self.cfg = get_cfg() add_centernet_config(self.cfg) add_detic_config(self.cfg) - + # Use default Detic config - self.cfg.merge_from_file(os.path.join( - detic_path, - "configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml" - )) - + self.cfg.merge_from_file( + os.path.join( + detic_path, "configs/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.yaml" + ) + ) + # Set default weights if not provided if model_path is None: - self.cfg.MODEL.WEIGHTS = 'https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth' + self.cfg.MODEL.WEIGHTS = "https://dl.fbaipublicfiles.com/detic/Detic_LCOCOI21k_CLIP_SwinB_896b32_4x_ft4x_max-size.pth" else: self.cfg.MODEL.WEIGHTS = model_path - + # Set device if device == "cpu": - self.cfg.MODEL.DEVICE = 'cpu' - + self.cfg.MODEL.DEVICE = "cpu" + # Set detection threshold self.cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = threshold - self.cfg.MODEL.ROI_BOX_HEAD.ZEROSHOT_WEIGHT_PATH = 'rand' + self.cfg.MODEL.ROI_BOX_HEAD.ZEROSHOT_WEIGHT_PATH = "rand" self.cfg.MODEL.ROI_HEADS.ONE_CLASS_PER_PROPOSAL = True - + # Built-in datasets for Detic - use absolute paths with detic_path self.builtin_datasets = { - 'lvis': { - 'metadata': 'lvis_v1_val', - 'classifier': os.path.join(detic_path, 'datasets/metadata/lvis_v1_clip_a+cname.npy') + "lvis": { + "metadata": "lvis_v1_val", + "classifier": os.path.join( + detic_path, "datasets/metadata/lvis_v1_clip_a+cname.npy" + ), }, - 'objects365': { - 'metadata': 'objects365_v2_val', - 'classifier': os.path.join(detic_path, 'datasets/metadata/o365_clip_a+cnamefix.npy') + "objects365": { + "metadata": "objects365_v2_val", + "classifier": os.path.join( + detic_path, "datasets/metadata/o365_clip_a+cnamefix.npy" + ), }, - 'openimages': { - 'metadata': 'oid_val_expanded', - 'classifier': os.path.join(detic_path, 'datasets/metadata/oid_clip_a+cname.npy') + "openimages": { + "metadata": "oid_val_expanded", + "classifier": os.path.join(detic_path, "datasets/metadata/oid_clip_a+cname.npy"), + }, + "coco": { + "metadata": "coco_2017_val", + "classifier": os.path.join(detic_path, "datasets/metadata/coco_clip_a+cname.npy"), }, - 'coco': { - 'metadata': 'coco_2017_val', - 'classifier': os.path.join(detic_path, 'datasets/metadata/coco_clip_a+cname.npy') - } } - + # Override config paths to use absolute paths - self.cfg.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH = os.path.join(detic_path, 'datasets/metadata/lvis_v1_train_cat_info.json') - + self.cfg.MODEL.ROI_BOX_HEAD.CAT_FREQ_PATH = os.path.join( + detic_path, "datasets/metadata/lvis_v1_train_cat_info.json" + ) + # Initialize model self.predictor = None - + # Setup with initial vocabulary - vocabulary = vocabulary or 'lvis' + vocabulary = vocabulary or "lvis" self.setup_vocabulary(vocabulary) - + # Initialize our simple tracker self.tracker = SimpleTracker(iou_threshold=0.5, max_age=5) - + def setup_vocabulary(self, vocabulary): """ Setup the model's vocabulary. - + Args: vocabulary: Either a string ('lvis', 'objects365', 'openimages', 'coco') or a list of class names for custom vocabulary. @@ -227,13 +238,14 @@ def setup_vocabulary(self, vocabulary): if self.predictor is None: # Initialize the model from detectron2.engine import DefaultPredictor + self.predictor = DefaultPredictor(self.cfg) - + if isinstance(vocabulary, str) and vocabulary in self.builtin_datasets: # Use built-in dataset dataset = vocabulary - metadata = MetadataCatalog.get(self.builtin_datasets[dataset]['metadata']) - classifier = self.builtin_datasets[dataset]['classifier'] + metadata = MetadataCatalog.get(self.builtin_datasets[dataset]["metadata"]) + classifier = self.builtin_datasets[dataset]["classifier"] num_classes = len(metadata.thing_classes) self.class_names = metadata.thing_classes else: @@ -241,37 +253,37 @@ def setup_vocabulary(self, vocabulary): if isinstance(vocabulary, str): # If it's a string but not a built-in dataset, treat as a file try: - with open(vocabulary, 'r') as f: + with open(vocabulary, "r") as f: class_names = [line.strip() for line in f if line.strip()] except: # Default to LVIS if there's an issue print(f"Error loading vocabulary from {vocabulary}, using LVIS") - return self.setup_vocabulary('lvis') + return self.setup_vocabulary("lvis") else: # Assume it's a list of class names class_names = vocabulary - + # Create classifier from text embeddings metadata = MetadataCatalog.get("__unused") metadata.thing_classes = class_names self.class_names = class_names - + # Generate CLIP embeddings for custom vocabulary classifier = self._get_clip_embeddings(class_names) num_classes = len(class_names) - + # Reset model with new vocabulary self.reset_cls_test(self.predictor.model, classifier, num_classes) return self.class_names - - def _get_clip_embeddings(self, vocabulary, prompt='a '): + + def _get_clip_embeddings(self, vocabulary, prompt="a "): """ Generate CLIP embeddings for a vocabulary list. - + Args: vocabulary (list): List of class names prompt (str): Prompt prefix to use for CLIP - + Returns: torch.Tensor: Tensor of embeddings """ @@ -280,14 +292,14 @@ def _get_clip_embeddings(self, vocabulary, prompt='a '): texts = [prompt + x for x in vocabulary] emb = text_encoder(texts).detach().permute(1, 0).contiguous().cpu() return emb - + def process_image(self, image): """ Process an image and return detection results. - + Args: image: Input image in BGR format (OpenCV) - + Returns: tuple: (bboxes, track_ids, class_ids, confidences, names) - bboxes: list of [x1, y1, x2, y2] coordinates @@ -299,57 +311,57 @@ def process_image(self, image): # Run inference with Detic outputs = self.predictor(image) instances = outputs["instances"].to("cpu") - + # Extract bounding boxes, classes, and scores if len(instances) == 0: return [], [], [], [], [] - + boxes = instances.pred_boxes.tensor.numpy() class_ids = instances.pred_classes.numpy() scores = instances.scores.numpy() - + # Convert boxes to [x1, y1, x2, y2] format bboxes = [] for box in boxes: x1, y1, x2, y2 = box.tolist() bboxes.append([x1, y1, x2, y2]) - + # Get class names names = [self.class_names[class_id] for class_id in class_ids] - + # Apply tracking detections = [] for i, bbox in enumerate(bboxes): if scores[i] >= self.threshold: # Format for tracker: [x1, y1, x2, y2, score, class_id] detections.append(bbox + [scores[i], class_ids[i]]) - + if not detections: return [], [], [], [], [] - + # Update tracker with detections track_results = self.tracker.update(detections) - + # Process tracking results track_ids = [] tracked_bboxes = [] tracked_class_ids = [] tracked_scores = [] tracked_names = [] - + for track_id, bbox, score, class_id in track_results: track_ids.append(int(track_id)) tracked_bboxes.append(bbox.tolist() if isinstance(bbox, np.ndarray) else bbox) tracked_class_ids.append(int(class_id)) tracked_scores.append(score) tracked_names.append(self.class_names[int(class_id)]) - + return tracked_bboxes, track_ids, tracked_class_ids, tracked_scores, tracked_names - + def visualize_results(self, image, bboxes, track_ids, class_ids, confidences, names): """ Generate visualization of detection results. - + Args: image: Original input image bboxes: List of bounding boxes @@ -357,15 +369,15 @@ def visualize_results(self, image, bboxes, track_ids, class_ids, confidences, na class_ids: List of class indices confidences: List of detection confidences names: List of class names - + Returns: Image with visualized detections """ from dimos.perception.detection2d.utils import plot_results + return plot_results(image, bboxes, track_ids, class_ids, confidences, names) - + def cleanup(self): """Clean up resources.""" # Nothing specific to clean up for Detic pass - diff --git a/dimos/perception/detection2d/utils.py b/dimos/perception/detection2d/utils.py index ffe560b777..1eb26db76c 100644 --- a/dimos/perception/detection2d/utils.py +++ b/dimos/perception/detection2d/utils.py @@ -3,11 +3,20 @@ from dimos.utils.ros_utils import distance_angle_to_goal_xy -def filter_detections(bboxes, track_ids, class_ids, confidences, names, - class_filter=None, name_filter=None, track_id_filter=None): + +def filter_detections( + bboxes, + track_ids, + class_ids, + confidences, + names, + class_filter=None, + name_filter=None, + track_id_filter=None, +): """ Filter detection results based on class IDs, names, and/or tracking IDs. - + Args: bboxes: List of bounding boxes [x1, y1, x2, y2] track_ids: List of tracking IDs @@ -17,9 +26,9 @@ def filter_detections(bboxes, track_ids, class_ids, confidences, names, class_filter: List/set of class IDs to keep, or None to keep all name_filter: List/set of class names to keep, or None to keep all track_id_filter: List/set of track IDs to keep, or None to keep all - + Returns: - tuple: (filtered_bboxes, filtered_track_ids, filtered_class_ids, + tuple: (filtered_bboxes, filtered_track_ids, filtered_class_ids, filtered_confidences, filtered_names) """ # Convert filters to sets for efficient lookup @@ -29,30 +38,30 @@ def filter_detections(bboxes, track_ids, class_ids, confidences, names, name_filter = set(name_filter) if track_id_filter is not None: track_id_filter = set(track_id_filter) - + # Initialize lists for filtered results filtered_bboxes = [] filtered_track_ids = [] filtered_class_ids = [] filtered_confidences = [] filtered_names = [] - + # Filter detections for bbox, track_id, class_id, conf, name in zip( - bboxes, track_ids, class_ids, confidences, names): - + bboxes, track_ids, class_ids, confidences, names + ): # Check if detection passes all specified filters keep = True - + if class_filter is not None: keep = keep and (class_id in class_filter) - + if name_filter is not None: keep = keep and (name in name_filter) - + if track_id_filter is not None: keep = keep and (track_id in track_id_filter) - + # If detection passes all filters, add it to results if keep: filtered_bboxes.append(bbox) @@ -60,20 +69,26 @@ def filter_detections(bboxes, track_ids, class_ids, confidences, names, filtered_class_ids.append(class_id) filtered_confidences.append(conf) filtered_names.append(name) - - return (filtered_bboxes, filtered_track_ids, filtered_class_ids, - filtered_confidences, filtered_names) + + return ( + filtered_bboxes, + filtered_track_ids, + filtered_class_ids, + filtered_confidences, + filtered_names, + ) + def extract_detection_results(result, class_filter=None, name_filter=None, track_id_filter=None): """ Extract and optionally filter detection information from a YOLO result object. - + Args: result: Ultralytics result object class_filter: List/set of class IDs to keep, or None to keep all name_filter: List/set of class names to keep, or None to keep all track_id_filter: List/set of track IDs to keep, or None to keep all - + Returns: tuple: (bboxes, track_ids, class_ids, confidences, names) - bboxes: list of [x1, y1, x2, y2] coordinates @@ -94,19 +109,19 @@ def extract_detection_results(result, class_filter=None, name_filter=None, track for box in result.boxes: # Extract bounding box coordinates x1, y1, x2, y2 = box.xyxy[0].tolist() - + # Extract tracking ID if available track_id = -1 - if hasattr(box, 'id') and box.id is not None: + if hasattr(box, "id") and box.id is not None: track_id = int(box.id[0].item()) - + # Extract class information cls_idx = int(box.cls[0]) name = result.names[cls_idx] - + # Extract confidence conf = float(box.conf[0]) - + # Check filters before adding to results keep = True if class_filter is not None: @@ -115,7 +130,7 @@ def extract_detection_results(result, class_filter=None, name_filter=None, track keep = keep and (name in name_filter) if track_id_filter is not None: keep = keep and (track_id in track_id_filter) - + if keep: bboxes.append([x1, y1, x2, y2]) track_ids.append(track_id) @@ -129,7 +144,7 @@ def extract_detection_results(result, class_filter=None, name_filter=None, track def plot_results(image, bboxes, track_ids, class_ids, confidences, names, alpha=0.5): """ Draw bounding boxes and labels on the image. - + Args: image: Original input image bboxes: List of bounding boxes [x1, y1, x2, y2] @@ -138,7 +153,7 @@ def plot_results(image, bboxes, track_ids, class_ids, confidences, names, alpha= confidences: List of detection confidences names: List of class names alpha: Transparency of the overlay - + Returns: Image with visualized detections """ @@ -152,7 +167,7 @@ def plot_results(image, bboxes, track_ids, class_ids, confidences, names, alpha= np.random.seed(hash(name) % 100000) color = np.random.randint(0, 255, (3,), dtype=np.uint8) np.random.seed(None) - + # Draw bounding box x1, y1, x2, y2 = map(int, bbox) cv2.rectangle(vis_img, (x1, y1), (x2, y2), color.tolist(), 2) @@ -164,45 +179,29 @@ def plot_results(image, bboxes, track_ids, class_ids, confidences, names, alpha= label = f"{name} {conf:.2f}" # Calculate text size for background rectangle - (text_w, text_h), _ = cv2.getTextSize( - label, - cv2.FONT_HERSHEY_SIMPLEX, - 0.5, - 1 - ) + (text_w, text_h), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1) # Draw background rectangle for text - cv2.rectangle( - vis_img, - (x1, y1-text_h-8), - (x1+text_w+4, y1), - color.tolist(), - -1 - ) + cv2.rectangle(vis_img, (x1, y1 - text_h - 8), (x1 + text_w + 4, y1), color.tolist(), -1) # Draw text with white color for better visibility cv2.putText( - vis_img, - label, - (x1+2, y1-5), - cv2.FONT_HERSHEY_SIMPLEX, - 0.5, - (255, 255, 255), - 1 + vis_img, label, (x1 + 2, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1 ) return vis_img + def calculate_depth_from_bbox(depth_model, frame, bbox): """ Calculate the average depth of an object within a bounding box. Uses the 25th to 75th percentile range to filter outliers. - + Args: depth_model: Depth model frame: The image frame bbox: Bounding box in format [x1, y1, x2, y2] - + Returns: float: Average depth in meters, or None if depth estimation fails """ @@ -210,117 +209,124 @@ def calculate_depth_from_bbox(depth_model, frame, bbox): # Get depth map for the entire frame depth_map = depth_model.infer_depth(frame) depth_map = np.array(depth_map) - + # Extract region of interest from the depth map x1, y1, x2, y2 = map(int, bbox) roi_depth = depth_map[y1:y2, x1:x2] - + if roi_depth.size == 0: return None - + # Calculate 25th and 75th percentile to filter outliers p25 = np.percentile(roi_depth, 25) p75 = np.percentile(roi_depth, 75) - + # Filter depth values within this range filtered_depth = roi_depth[(roi_depth >= p25) & (roi_depth <= p75)] - + # Calculate average depth (convert to meters) if filtered_depth.size > 0: return np.mean(filtered_depth) / 1000.0 # Convert mm to meters - + return None except Exception as e: print(f"Error calculating depth from bbox: {e}") return None + def calculate_distance_angle_from_bbox(bbox, depth, camera_intrinsics): """ Calculate distance and angle to object center based on bbox and depth. - + Args: bbox: Bounding box [x1, y1, x2, y2] depth: Depth value in meters camera_intrinsics: List [fx, fy, cx, cy] with camera parameters - + Returns: tuple: (distance, angle) in meters and radians """ if camera_intrinsics is None: raise ValueError("Camera intrinsics required for distance calculation") - + # Extract camera parameters fx, fy, cx, cy = camera_intrinsics - + # Calculate center of bounding box in pixels x1, y1, x2, y2 = bbox center_x = (x1 + x2) / 2 center_y = (y1 + y2) / 2 - + # Calculate normalized image coordinates x_norm = (center_x - cx) / fx - + # Calculate angle (positive to the right) angle = np.arctan(x_norm) - + # Calculate distance using depth and angle distance = depth / np.cos(angle) if np.cos(angle) != 0 else depth - + return distance, angle + def calculate_object_size_from_bbox(bbox, depth, camera_intrinsics): """ Estimate physical width and height of object in meters. - + Args: bbox: Bounding box [x1, y1, x2, y2] depth: Depth value in meters camera_intrinsics: List [fx, fy, cx, cy] with camera parameters - + Returns: tuple: (width, height) in meters """ if camera_intrinsics is None: return 0.0, 0.0 - + fx, fy, _, _ = camera_intrinsics - + # Calculate bbox dimensions in pixels x1, y1, x2, y2 = bbox width_px = x2 - x1 height_px = y2 - y1 - + # Convert to meters using similar triangles and depth width_m = (width_px * depth) / fx height_m = (height_px * depth) / fy - + return width_m, height_m + def calculate_position_rotation_from_bbox(bbox, depth, camera_intrinsics): """ - Calculate position (xyz) and rotation (roll, pitch, yaw) for an object + Calculate position (xyz) and rotation (roll, pitch, yaw) for an object based on its bounding box and depth. - + Args: bbox: Bounding box [x1, y1, x2, y2] depth: Depth value in meters camera_intrinsics: List [fx, fy, cx, cy] with camera parameters - + Returns: Tuple of (position_dict, rotation_dict) """ # Calculate distance and angle to object distance, angle = calculate_distance_angle_from_bbox(bbox, depth, camera_intrinsics) - + # Convert distance and angle to x,y coordinates (in camera frame) # Note: We negate the angle since positive angle means object is to the right, # but we want positive y to be to the left in the standard coordinate system x, y = distance_angle_to_goal_xy(distance, -angle) - + # For now, rotation is only in yaw (around z-axis) # We can use the negative of the angle as an estimate of the object's yaw # assuming objects tend to face the camera position = {"x": x, "y": y, "z": 0.0} # z=0 assuming objects are on the ground - rotation = {"roll": 0.0, "pitch": 0.0, "yaw": -angle} # Only yaw is meaningful with monocular camera - - return position, rotation \ No newline at end of file + rotation = { + "roll": 0.0, + "pitch": 0.0, + "yaw": -angle, + } # Only yaw is meaningful with monocular camera + + return position, rotation diff --git a/dimos/perception/detection2d/yolo_2d_det.py b/dimos/perception/detection2d/yolo_2d_det.py index 0c78e56950..ad47b58eda 100644 --- a/dimos/perception/detection2d/yolo_2d_det.py +++ b/dimos/perception/detection2d/yolo_2d_det.py @@ -1,7 +1,10 @@ import cv2 -import numpy as np from ultralytics import YOLO -from dimos.perception.detection2d.utils import extract_detection_results, plot_results, filter_detections +from dimos.perception.detection2d.utils import ( + extract_detection_results, + plot_results, + filter_detections, +) import os @@ -9,7 +12,7 @@ class Yolo2DDetector: def __init__(self, model_path="models/yolo11n.engine", device="cuda"): """ Initialize the YOLO detector. - + Args: model_path (str): Path to the YOLO model weights device (str): Device to run inference on ('cuda' or 'cpu') @@ -18,15 +21,15 @@ def __init__(self, model_path="models/yolo11n.engine", device="cuda"): self.model = YOLO(model_path) module_dir = os.path.dirname(__file__) - self.tracker_config = os.path.join(module_dir, 'config', 'custom_tracker.yaml') + self.tracker_config = os.path.join(module_dir, "config", "custom_tracker.yaml") def process_image(self, image): """ Process an image and return detection results. - + Args: image: Input image in BGR format (OpenCV) - + Returns: tuple: (bboxes, track_ids, class_ids, confidences, names) - bboxes: list of [x1, y1, x2, y2] coordinates @@ -42,20 +45,20 @@ def process_image(self, image): iou=0.6, persist=True, verbose=False, - tracker=self.tracker_config + tracker=self.tracker_config, ) if len(results) > 0: # Extract detection results bboxes, track_ids, class_ids, confidences, names = extract_detection_results(results[0]) return bboxes, track_ids, class_ids, confidences, names - + return [], [], [], [], [] def visualize_results(self, image, bboxes, track_ids, class_ids, confidences, names): """ Generate visualization of detection results. - + Args: image: Original input image bboxes: List of bounding boxes @@ -63,7 +66,7 @@ def visualize_results(self, image, bboxes, track_ids, class_ids, confidences, na class_ids: List of class indices confidences: List of detection confidences names: List of class names - + Returns: Image with visualized detections """ @@ -74,7 +77,7 @@ def main(): """Example usage of the Yolo2DDetector class.""" # Initialize video capture cap = cv2.VideoCapture(0) - + # Initialize detector detector = Yolo2DDetector() @@ -88,30 +91,29 @@ def main(): # Process frame bboxes, track_ids, class_ids, confidences, names = detector.process_image(frame) - + # Apply person filtering if enabled if enable_person_filter and len(bboxes) > 0: # Person is class_id 0 in COCO dataset bboxes, track_ids, class_ids, confidences, names = filter_detections( - bboxes, track_ids, class_ids, confidences, names, + bboxes, + track_ids, + class_ids, + confidences, + names, class_filter=[0], # 0 is the class_id for person - name_filter=['person'] + name_filter=["person"], ) - + # Visualize results if len(bboxes) > 0: frame = detector.visualize_results( - frame, - bboxes, - track_ids, - class_ids, - confidences, - names + frame, bboxes, track_ids, class_ids, confidences, names ) # Display results cv2.imshow("YOLO Detection", frame) - if cv2.waitKey(1) & 0xFF == ord('q'): + if cv2.waitKey(1) & 0xFF == ord("q"): break finally: @@ -120,4 +122,4 @@ def main(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/dimos/perception/object_detection_stream.py b/dimos/perception/object_detection_stream.py index 0e4c4783b0..daa9fa8273 100644 --- a/dimos/perception/object_detection_stream.py +++ b/dimos/perception/object_detection_stream.py @@ -9,11 +9,12 @@ from dimos.perception.detection2d.utils import ( calculate_depth_from_bbox, calculate_object_size_from_bbox, - calculate_position_rotation_from_bbox + calculate_position_rotation_from_bbox, ) from dimos.types.vector import Vector from typing import Optional, Union + class ObjectDetectionStream: """ A stream processor that: @@ -21,10 +22,10 @@ class ObjectDetectionStream: 2. Estimates depth using Metric3D 3. Calculates 3D position and dimensions using camera intrinsics 4. Transforms coordinates to map frame - + Provides a stream of structured object data with position and rotation information. """ - + def __init__( self, camera_intrinsics=None, # [fx, fy, cx, cy] @@ -34,11 +35,11 @@ def __init__( class_filter=None, # Optional list of class names to filter (e.g., ["person", "car"]) transform_to_map=None, # Optional function to transform coordinates to map frame detector: Optional[Union[Detic2DDetector, Yolo2DDetector]] = None, - video_stream: Observable = None + video_stream: Observable = None, ): """ Initialize the ObjectDetectionStream. - + Args: camera_intrinsics: List [fx, fy, cx, cy] with camera parameters device: Device to run inference on ("cuda" or "cpu") @@ -54,85 +55,86 @@ def __init__( self.transform_to_map = transform_to_map # Initialize object detector self.detector = detector or Detic2DDetector(vocabulary=None, threshold=min_confidence) - + # Initialize depth estimation model self.depth_model = Metric3D(gt_depth_scale) - + # Set up camera intrinsics self.camera_intrinsics = camera_intrinsics if camera_intrinsics is not None: self.depth_model.update_intrinsic(camera_intrinsics) - + # Create 3x3 camera matrix for calculations fx, fy, cx, cy = camera_intrinsics - self.camera_matrix = np.array([ - [fx, 0, cx], - [0, fy, cy], - [0, 0, 1] - ], dtype=np.float32) + self.camera_matrix = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]], dtype=np.float32) else: raise ValueError("camera_intrinsics must be provided") - + # If video_stream is provided, create and store the stream immediately self.stream = None if video_stream is not None: self.stream = self.create_stream(video_stream) - + def create_stream(self, video_stream: Observable) -> Observable: """ Create an Observable stream of object data from a video stream. - + Args: video_stream: Observable that emits video frames - + Returns: - Observable that emits dictionaries containing object data + Observable that emits dictionaries containing object data with position and rotation information """ + def process_frame(frame): # Detect objects bboxes, track_ids, class_ids, confidences, names = self.detector.process_image(frame) - + # Create visualization viz_frame = frame.copy() - + # Process detections objects = [] - + for i, bbox in enumerate(bboxes): # Skip if confidence is too low if i < len(confidences) and confidences[i] < self.min_confidence: continue - + # Skip if class filter is active and class not in filter class_name = names[i] if i < len(names) else None if self.class_filter and class_name not in self.class_filter: continue - + # Get depth for this object depth = calculate_depth_from_bbox(self.depth_model, frame, bbox) if depth is None: # Skip objects with invalid depth continue - + # Calculate object position and rotation - position, rotation = calculate_position_rotation_from_bbox(bbox, depth, self.camera_intrinsics) - + position, rotation = calculate_position_rotation_from_bbox( + bbox, depth, self.camera_intrinsics + ) + # Get object dimensions width, height = calculate_object_size_from_bbox(bbox, depth, self.camera_intrinsics) - + # Transform to map frame if a transform function is provided try: if self.transform_to_map: - position = Vector([position['x'], position['y'], position['z']]) - rotation = Vector([rotation['roll'], rotation['pitch'], rotation['yaw']]) - position, rotation = self.transform_to_map(position, rotation, source_frame="base_link") + position = Vector([position["x"], position["y"], position["z"]]) + rotation = Vector([rotation["roll"], rotation["pitch"], rotation["yaw"]]) + position, rotation = self.transform_to_map( + position, rotation, source_frame="base_link" + ) position = dict(x=position.x, y=position.y, z=position.z) rotation = dict(roll=rotation.x, pitch=rotation.y, yaw=rotation.z) except Exception as e: print(f"Error transforming to map frame: {e}") position, rotation = position, rotation - + # Create object data dictionary object_data = { "object_id": track_ids[i] if i < len(track_ids) else -1, @@ -143,102 +145,110 @@ def process_frame(frame): "label": class_name, "position": position, "rotation": rotation, - "size": { - "width": width, - "height": height - } + "size": {"width": width, "height": height}, } - + objects.append(object_data) - + # Add visualization x1, y1, x2, y2 = map(int, bbox) color = (0, 255, 0) # Green for detected objects - + # Draw bounding box cv2.rectangle(viz_frame, (x1, y1), (x2, y2), color, 2) - + # Add text for class and position text = f"{class_name}: {depth:.2f}m" pos_text = f"Pos: ({position['x']:.2f}, {position['y']:.2f})" - + # Draw text background text_size = cv2.getTextSize(text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0] - cv2.rectangle(viz_frame, (x1, y1 - text_size[1] - 5), (x1 + text_size[0], y1), (0, 0, 0), -1) - + cv2.rectangle( + viz_frame, (x1, y1 - text_size[1] - 5), (x1 + text_size[0], y1), (0, 0, 0), -1 + ) + # Draw text - cv2.putText(viz_frame, text, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) - + cv2.putText( + viz_frame, text, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2 + ) + # Position text below - cv2.putText(viz_frame, pos_text, (x1, y1 + 15), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) - - return { - "frame": frame, - "viz_frame": viz_frame, - "objects": objects - } - self.stream = video_stream.pipe( - ops.map(process_frame) - ) + cv2.putText( + viz_frame, + pos_text, + (x1, y1 + 15), + cv2.FONT_HERSHEY_SIMPLEX, + 0.5, + (255, 255, 255), + 2, + ) + + return {"frame": frame, "viz_frame": viz_frame, "objects": objects} + + self.stream = video_stream.pipe(ops.map(process_frame)) return self.stream - + def get_stream(self): """ Returns the current detection stream if available. Creates a new one with the provided video_stream if not already created. - + Returns: Observable: The reactive stream of detection results """ if self.stream is None: - raise ValueError("Stream not initialized. Either provide a video_stream during initialization or call create_stream first.") + raise ValueError( + "Stream not initialized. Either provide a video_stream during initialization or call create_stream first." + ) return self.stream - + def get_formatted_stream(self): """ Returns a formatted stream of object detection data for better readability. This is especially useful for LLMs like Claude that need structured text input. - + Returns: Observable: A stream of formatted string representations of object data """ if self.stream is None: - raise ValueError("Stream not initialized. Either provide a video_stream during initialization or call create_stream first.") - + raise ValueError( + "Stream not initialized. Either provide a video_stream during initialization or call create_stream first." + ) + def format_detection_data(result): # Extract objects from result objects = result.get("objects", []) if not objects: return "No objects detected." - + formatted_data = "[DETECTED OBJECTS]\n" - + for i, obj in enumerate(objects): pos = obj["position"] rot = obj["rotation"] size = obj["size"] bbox = obj["bbox"] - + # Format each object with a multiline f-string for better readability bbox_str = f"[{int(bbox[0])}, {int(bbox[1])}, {int(bbox[2])}, {int(bbox[3])}]" - formatted_data += f"Object {i+1}: {obj['label']}\n"\ - f" ID: {obj['object_id']}\n"\ - f" Confidence: {obj['confidence']:.2f}\n"\ - f" Position: x={pos['x']:.2f}m, y={pos['y']:.2f}m, z={pos['z']:.2f}m\n"\ - f" Rotation: yaw={rot['yaw']:.2f} rad\n"\ - f" Size: width={size['width']:.2f}m, height={size['height']:.2f}m\n"\ - f" Depth: {obj['depth']:.2f}m\n"\ - f" Bounding box: {bbox_str}\n"\ - "----------------------------------\n" - + formatted_data += ( + f"Object {i + 1}: {obj['label']}\n" + f" ID: {obj['object_id']}\n" + f" Confidence: {obj['confidence']:.2f}\n" + f" Position: x={pos['x']:.2f}m, y={pos['y']:.2f}m, z={pos['z']:.2f}m\n" + f" Rotation: yaw={rot['yaw']:.2f} rad\n" + f" Size: width={size['width']:.2f}m, height={size['height']:.2f}m\n" + f" Depth: {obj['depth']:.2f}m\n" + f" Bounding box: {bbox_str}\n" + "----------------------------------\n" + ) + return formatted_data - + # Return a new stream with the formatter applied - return self.stream.pipe( - ops.map(format_detection_data) - ) + return self.stream.pipe(ops.map(format_detection_data)) def cleanup(self): """Clean up resources.""" diff --git a/dimos/perception/object_tracker.py b/dimos/perception/object_tracker.py index 578208d148..8b77434fa9 100644 --- a/dimos/perception/object_tracker.py +++ b/dimos/perception/object_tracker.py @@ -5,12 +5,21 @@ from dimos.perception.common.ibvs import ObjectDistanceEstimator from dimos.models.depth.metric3d import Metric3D from dimos.perception.detection2d.utils import calculate_depth_from_bbox + + class ObjectTrackingStream: - def __init__(self, camera_intrinsics=None, camera_pitch=0.0, camera_height=1.0, - reid_threshold=5, reid_fail_tolerance=10, gt_depth_scale=1000.0): + def __init__( + self, + camera_intrinsics=None, + camera_pitch=0.0, + camera_height=1.0, + reid_threshold=5, + reid_fail_tolerance=10, + gt_depth_scale=1000.0, + ): """ Initialize an object tracking stream using OpenCV's CSRT tracker with ORB re-ID. - + Args: camera_intrinsics: List in format [fx, fy, cx, cy] where: - fx: Focal length in x direction (pixels) @@ -20,52 +29,46 @@ def __init__(self, camera_intrinsics=None, camera_pitch=0.0, camera_height=1.0, camera_pitch: Camera pitch angle in radians (positive is up) camera_height: Height of the camera from the ground in meters reid_threshold: Minimum good feature matches needed to confirm re-ID. - reid_fail_tolerance: Number of consecutive frames Re-ID can fail before + reid_fail_tolerance: Number of consecutive frames Re-ID can fail before tracking is stopped. gt_depth_scale: Ground truth depth scale factor for Metric3D model """ self.tracker = None - self.tracking_bbox = None # Stores (x, y, w, h) for tracker initialization + self.tracking_bbox = None # Stores (x, y, w, h) for tracker initialization self.tracking_initialized = False self.orb = cv2.ORB_create() self.bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=False) - self.original_des = None # Store original ORB descriptors + self.original_des = None # Store original ORB descriptors self.reid_threshold = reid_threshold self.reid_fail_tolerance = reid_fail_tolerance - self.reid_fail_count = 0 # Counter for consecutive re-id failures - + self.reid_fail_count = 0 # Counter for consecutive re-id failures + # Initialize distance estimator if camera parameters are provided self.distance_estimator = None if camera_intrinsics is not None: # Convert [fx, fy, cx, cy] to 3x3 camera matrix fx, fy, cx, cy = camera_intrinsics - K = np.array([ - [fx, 0, cx], - [0, fy, cy], - [0, 0, 1] - ], dtype=np.float32) - + K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]], dtype=np.float32) + self.distance_estimator = ObjectDistanceEstimator( - K=K, - camera_pitch=camera_pitch, - camera_height=camera_height + K=K, camera_pitch=camera_pitch, camera_height=camera_height ) - + # Initialize depth model self.depth_model = Metric3D(gt_depth_scale) if camera_intrinsics is not None: self.depth_model.update_intrinsic(camera_intrinsics) - + def track(self, bbox, frame=None, distance=None, size=None): """ Set the initial bounding box for tracking. Features are extracted later. - + Args: bbox: Bounding box in format [x1, y1, x2, y2] frame: Optional - Current frame for depth estimation and feature extraction distance: Optional - Known distance to object (meters) size: Optional - Known size of object (meters) - + Returns: bool: True if intention to track is set (bbox is valid) """ @@ -73,14 +76,14 @@ def track(self, bbox, frame=None, distance=None, size=None): w, h = x2 - x1, y2 - y1 if w <= 0 or h <= 0: print(f"Warning: Invalid initial bbox provided: {bbox}. Tracking not started.") - self.stop_track() # Ensure clean state - return False - - self.tracking_bbox = (x1, y1, w, h) # Store in (x, y, w, h) format + self.stop_track() # Ensure clean state + return False + + self.tracking_bbox = (x1, y1, w, h) # Store in (x, y, w, h) format self.tracker = cv2.legacy.TrackerCSRT_create() - self.tracking_initialized = False # Reset flag - self.original_des = None # Clear previous descriptors - self.reid_fail_count = 0 # Reset counter on new track + self.tracking_initialized = False # Reset flag + self.original_des = None # Clear previous descriptors + self.reid_fail_count = 0 # Reset counter on new track print(f"Tracking target set with bbox: {self.tracking_bbox}") # Calculate depth only if distance and size not provided @@ -91,22 +94,26 @@ def track(self, bbox, frame=None, distance=None, size=None): # Update distance estimator if needed if self.distance_estimator is not None: - if size is not None: self.distance_estimator.set_estimated_object_size(size) - elif distance is not None: self.distance_estimator.estimate_object_size(bbox, distance) - elif depth_estimate is not None: self.distance_estimator.estimate_object_size(bbox, depth_estimate) - else: print("No distance or size provided. Cannot estimate object size.") + if size is not None: + self.distance_estimator.set_estimated_object_size(size) + elif distance is not None: + self.distance_estimator.estimate_object_size(bbox, distance) + elif depth_estimate is not None: + self.distance_estimator.estimate_object_size(bbox, depth_estimate) + else: + print("No distance or size provided. Cannot estimate object size.") + + return True # Indicate intention to track is set - return True # Indicate intention to track is set - def calculate_depth_from_bbox(self, frame, bbox): """ Calculate the average depth of an object within a bounding box. Uses the 25th to 75th percentile range to filter outliers. - + Args: frame: The image frame bbox: Bounding box in format [x1, y1, x2, y2] - + Returns: float: Average depth in meters, or None if depth estimation fails """ @@ -114,39 +121,42 @@ def calculate_depth_from_bbox(self, frame, bbox): # Get depth map for the entire frame depth_map = self.depth_model.infer_depth(frame) depth_map = np.array(depth_map) - + # Extract region of interest from the depth map x1, y1, x2, y2 = map(int, bbox) roi_depth = depth_map[y1:y2, x1:x2] - + if roi_depth.size == 0: return None - + # Calculate 25th and 75th percentile to filter outliers p25 = np.percentile(roi_depth, 25) p75 = np.percentile(roi_depth, 75) - + # Filter depth values within this range filtered_depth = roi_depth[(roi_depth >= p25) & (roi_depth <= p75)] - + # Calculate average depth (convert to meters) if filtered_depth.size > 0: return np.mean(filtered_depth) / 1000.0 # Convert mm to meters - + return None except Exception as e: print(f"Error calculating depth from bbox: {e}") return None - + def reid(self, frame, current_bbox) -> bool: """Check if features in current_bbox match stored original features.""" - if self.original_des is None: return True # Cannot re-id if no original features + if self.original_des is None: + return True # Cannot re-id if no original features x1, y1, x2, y2 = map(int, current_bbox) roi = frame[y1:y2, x1:x2] - if roi.size == 0: return False # Empty ROI cannot match + if roi.size == 0: + return False # Empty ROI cannot match _, des_current = self.orb.detectAndCompute(roi, None) - if des_current is None or len(des_current) < 2: return False # Need at least 2 descriptors for knnMatch + if des_current is None or len(des_current) < 2: + return False # Need at least 2 descriptors for knnMatch # Handle case where original_des has only 1 descriptor (cannot use knnMatch with k=2) if len(self.original_des) < 2: @@ -161,7 +171,7 @@ def reid(self, frame, current_bbox) -> bool: m, n = match_pair if m.distance < 0.75 * n.distance: good_matches += 1 - + # print(f"ReID: Good Matches={good_matches}, Threshold={self.reid_threshold}") # Debug return good_matches >= self.reid_threshold @@ -169,7 +179,7 @@ def stop_track(self): """ Stop tracking the current object. This resets the tracker and all tracking state. - + Returns: bool: True if tracking was successfully stopped """ @@ -177,56 +187,64 @@ def stop_track(self): self.tracking_bbox = None self.tracking_initialized = False self.original_des = None - self.reid_fail_count = 0 # Reset counter + self.reid_fail_count = 0 # Reset counter return True - + def create_stream(self, video_stream: Observable) -> Observable: """ Create an Observable stream of object tracking results from a video stream. - + Args: video_stream: Observable that emits video frames - + Returns: Observable that emits dictionaries containing tracking results and visualizations """ + def process_frame(frame): viz_frame = frame.copy() - tracker_succeeded = False # Success from tracker.update() - reid_confirmed_this_frame = False # Result of reid() call for this frame - final_success = False # Overall success considering re-id tolerance + tracker_succeeded = False # Success from tracker.update() + reid_confirmed_this_frame = False # Result of reid() call for this frame + final_success = False # Overall success considering re-id tolerance target_data = None - current_bbox_x1y1x2y2 = None # Store current bbox if tracking succeeds + current_bbox_x1y1x2y2 = None # Store current bbox if tracking succeeds if self.tracker is not None and self.tracking_bbox is not None: if not self.tracking_initialized: # Extract initial features and initialize tracker on first frame x_init, y_init, w_init, h_init = self.tracking_bbox - roi = frame[y_init:y_init+h_init, x_init:x_init+w_init] - + roi = frame[y_init : y_init + h_init, x_init : x_init + w_init] + if roi.size > 0: _, self.original_des = self.orb.detectAndCompute(roi, None) if self.original_des is None: - print("Warning: No ORB features found in initial ROI during stream processing.") + print( + "Warning: No ORB features found in initial ROI during stream processing." + ) else: print(f"Initial ORB features extracted: {len(self.original_des)}") - + # Initialize the tracker init_success = self.tracker.init(frame, self.tracking_bbox) if init_success: self.tracking_initialized = True tracker_succeeded = True - reid_confirmed_this_frame = True # Assume re-id true on init - current_bbox_x1y1x2y2 = [x_init, y_init, x_init + w_init, y_init + h_init] + reid_confirmed_this_frame = True # Assume re-id true on init + current_bbox_x1y1x2y2 = [ + x_init, + y_init, + x_init + w_init, + y_init + h_init, + ] print("Tracker initialized successfully.") else: print("Error: Tracker initialization failed in stream.") - self.stop_track() # Reset if init fails + self.stop_track() # Reset if init fails else: print("Error: Empty ROI during tracker initialization in stream.") - self.stop_track() # Reset if ROI is bad - - else: # Tracker already initialized, perform update and re-id + self.stop_track() # Reset if ROI is bad + + else: # Tracker already initialized, perform update and re-id tracker_succeeded, bbox_cv = self.tracker.update(frame) if tracker_succeeded: x, y, w, h = map(int, bbox_cv) @@ -235,68 +253,89 @@ def process_frame(frame): reid_confirmed_this_frame = self.reid(frame, current_bbox_x1y1x2y2) if reid_confirmed_this_frame: - self.reid_fail_count = 0 # Reset counter on success + self.reid_fail_count = 0 # Reset counter on success else: - self.reid_fail_count += 1 # Increment counter on failure - print(f"Re-ID failed ({self.reid_fail_count}/{self.reid_fail_tolerance}). Continuing track...") - - # --- Determine final success and stop tracking if needed --- + self.reid_fail_count += 1 # Increment counter on failure + print( + f"Re-ID failed ({self.reid_fail_count}/{self.reid_fail_tolerance}). Continuing track..." + ) + + # --- Determine final success and stop tracking if needed --- if tracker_succeeded: if self.reid_fail_count >= self.reid_fail_tolerance: print(f"Re-ID failed consecutively {self.reid_fail_count} times. Target lost.") - final_success = False # Stop tracking + final_success = False # Stop tracking else: - final_success = True # Tracker ok, Re-ID ok or within tolerance - else: # Tracker update failed + final_success = True # Tracker ok, Re-ID ok or within tolerance + else: # Tracker update failed final_success = False if self.tracking_initialized: - print("Tracker update failed. Stopping track.") - - # --- Post-processing based on final_success --- + print("Tracker update failed. Stopping track.") + + # --- Post-processing based on final_success --- if final_success and current_bbox_x1y1x2y2 is not None: # Tracking is considered successful (tracker ok, re-id ok or within tolerance) x1, y1, x2, y2 = current_bbox_x1y1x2y2 # Visualize based on *this frame's* re-id result - viz_color = (0, 255, 0) if reid_confirmed_this_frame else (0, 165, 255) # Green if confirmed, Orange if failed but tolerated + viz_color = ( + (0, 255, 0) if reid_confirmed_this_frame else (0, 165, 255) + ) # Green if confirmed, Orange if failed but tolerated cv2.rectangle(viz_frame, (x1, y1), (x2, y2), viz_color, 2) - + target_data = { - "target_id": 0, "bbox": current_bbox_x1y1x2y2, "confidence": 1.0, - "reid_confirmed": reid_confirmed_this_frame # Report actual re-id status + "target_id": 0, + "bbox": current_bbox_x1y1x2y2, + "confidence": 1.0, + "reid_confirmed": reid_confirmed_this_frame, # Report actual re-id status } - + dist_text = "Object Tracking" - if not reid_confirmed_this_frame: dist_text += " (Re-ID Failed - Tolerated)" - - if self.distance_estimator is not None and self.distance_estimator.estimated_object_size is not None: - distance, angle = self.distance_estimator.estimate_distance_angle(current_bbox_x1y1x2y2) + if not reid_confirmed_this_frame: + dist_text += " (Re-ID Failed - Tolerated)" + + if ( + self.distance_estimator is not None + and self.distance_estimator.estimated_object_size is not None + ): + distance, angle = self.distance_estimator.estimate_distance_angle( + current_bbox_x1y1x2y2 + ) if distance is not None: target_data["distance"] = distance target_data["angle"] = angle dist_text = f"Object: {distance:.2f}m, {np.rad2deg(angle):.1f} deg" - if not reid_confirmed_this_frame: dist_text += " (Re-ID Failed - Tolerated)" - + if not reid_confirmed_this_frame: + dist_text += " (Re-ID Failed - Tolerated)" + text_size = cv2.getTextSize(dist_text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1)[0] label_bg_y = max(y1 - text_size[1] - 5, 0) - cv2.rectangle(viz_frame, (x1, label_bg_y), (x1 + text_size[0], y1), (0,0,0), -1) - cv2.putText(viz_frame, dist_text, (x1, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) + cv2.rectangle(viz_frame, (x1, label_bg_y), (x1 + text_size[0], y1), (0, 0, 0), -1) + cv2.putText( + viz_frame, + dist_text, + (x1, y1 - 5), + cv2.FONT_HERSHEY_SIMPLEX, + 0.5, + (255, 255, 255), + 1, + ) + + elif ( + self.tracking_initialized + ): # Tracking stopped this frame (either tracker fail or re-id tolerance exceeded) + self.stop_track() # Reset tracker state and counter - elif self.tracking_initialized: # Tracking stopped this frame (either tracker fail or re-id tolerance exceeded) - self.stop_track() # Reset tracker state and counter - # else: # Not tracking or initialization failed, do nothing, return empty result - # pass + # pass return { "frame": frame, "viz_frame": viz_frame, - "targets": [target_data] if target_data else [] + "targets": [target_data] if target_data else [], } - - return video_stream.pipe( - ops.map(process_frame) - ) - + + return video_stream.pipe(ops.map(process_frame)) + def cleanup(self): """Clean up resources.""" - self.stop_track() \ No newline at end of file + self.stop_track() diff --git a/dimos/perception/person_tracker.py b/dimos/perception/person_tracker.py index dd86e9d0ef..50302d1382 100644 --- a/dimos/perception/person_tracker.py +++ b/dimos/perception/person_tracker.py @@ -14,11 +14,11 @@ def __init__( device="cuda", camera_intrinsics=None, camera_pitch=0.0, - camera_height=1.0 + camera_height=1.0, ): """ Initialize a person tracking stream using Yolo2DDetector and PersonDistanceEstimator. - + Args: model_path: Path to the YOLO model file device: Computation device ("cuda" or "cpu") @@ -30,56 +30,59 @@ def __init__( camera_pitch: Camera pitch angle in radians (positive is up) camera_height: Height of the camera from the ground in meters """ - self.detector = Yolo2DDetector( - model_path=model_path, - device=device - ) - + self.detector = Yolo2DDetector(model_path=model_path, device=device) + # Initialize distance estimator if camera_intrinsics is None: raise ValueError("Camera intrinsics are required for distance estimation") - + # Validate camera intrinsics format [fx, fy, cx, cy] - if not isinstance(camera_intrinsics, (list, tuple, np.ndarray)) or len(camera_intrinsics) != 4: + if ( + not isinstance(camera_intrinsics, (list, tuple, np.ndarray)) + or len(camera_intrinsics) != 4 + ): raise ValueError("Camera intrinsics must be provided as [fx, fy, cx, cy]") - + # Convert [fx, fy, cx, cy] to 3x3 camera matrix fx, fy, cx, cy = camera_intrinsics - K = np.array([ - [fx, 0, cx], - [0, fy, cy], - [0, 0, 1] - ], dtype=np.float32) - + K = np.array([[fx, 0, cx], [0, fy, cy], [0, 0, 1]], dtype=np.float32) + self.distance_estimator = PersonDistanceEstimator( - K=K, - camera_pitch=camera_pitch, - camera_height=camera_height + K=K, camera_pitch=camera_pitch, camera_height=camera_height ) - + def create_stream(self, video_stream: Observable) -> Observable: """ Create an Observable stream of person tracking results from a video stream. - + Args: video_stream: Observable that emits video frames - + Returns: Observable that emits dictionaries containing tracking results and visualizations """ + def process_frame(frame): # Detect people in the frame bboxes, track_ids, class_ids, confidences, names = self.detector.process_image(frame) - + # Filter to keep only person detections using filter_detections - filtered_bboxes, filtered_track_ids, filtered_class_ids, filtered_confidences, filtered_names = ( - filter_detections( - bboxes, track_ids, class_ids, confidences, names, - class_filter=[0], # 0 is the class_id for person - name_filter=['person'] - ) + ( + filtered_bboxes, + filtered_track_ids, + filtered_class_ids, + filtered_confidences, + filtered_names, + ) = filter_detections( + bboxes, + track_ids, + class_ids, + confidences, + names, + class_filter=[0], # 0 is the class_id for person + name_filter=["person"], ) - + # Create visualization viz_frame = self.detector.visualize_results( frame, @@ -87,58 +90,55 @@ def process_frame(frame): filtered_track_ids, filtered_class_ids, filtered_confidences, - filtered_names + filtered_names, ) - + # Calculate distance and angle for each person targets = [] for i, bbox in enumerate(filtered_bboxes): target_data = { "target_id": filtered_track_ids[i] if i < len(filtered_track_ids) else -1, "bbox": bbox, - "confidence": filtered_confidences[i] if i < len(filtered_confidences) else None, + "confidence": filtered_confidences[i] + if i < len(filtered_confidences) + else None, } - + distance, angle = self.distance_estimator.estimate_distance_angle(bbox) target_data["distance"] = distance target_data["angle"] = angle - + # Add text to visualization x1, y1, x2, y2 = map(int, bbox) dist_text = f"{distance:.2f}m, {np.rad2deg(angle):.1f} deg" - + # Add black background for better visibility text_size = cv2.getTextSize(dist_text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0] # Position at top-right corner cv2.rectangle( - viz_frame, - (x2 - text_size[0], y1 - text_size[1] - 5), - (x2, y1), - (0, 0, 0), -1 + viz_frame, (x2 - text_size[0], y1 - text_size[1] - 5), (x2, y1), (0, 0, 0), -1 ) - + # Draw text in white at top-right cv2.putText( - viz_frame, dist_text, + viz_frame, + dist_text, (x2 - text_size[0], y1 - 5), - cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2 + cv2.FONT_HERSHEY_SIMPLEX, + 0.5, + (255, 255, 255), + 2, ) - + targets.append(target_data) - + # Create the result dictionary - result = { - "frame": frame, - "viz_frame": viz_frame, - "targets": targets - } - + result = {"frame": frame, "viz_frame": viz_frame, "targets": targets} + return result - - return video_stream.pipe( - ops.map(process_frame) - ) - + + return video_stream.pipe(ops.map(process_frame)) + def cleanup(self): """Clean up resources.""" pass # No specific cleanup needed for now diff --git a/dimos/perception/segmentation/image_analyzer.py b/dimos/perception/segmentation/image_analyzer.py index 5371f178ae..8e6676116f 100644 --- a/dimos/perception/segmentation/image_analyzer.py +++ b/dimos/perception/segmentation/image_analyzer.py @@ -1,8 +1,6 @@ import base64 -import requests from openai import OpenAI import cv2 -import numpy as np import os NORMAL_PROMPT = "What are in these images? Give a short word answer with at most two words, \ @@ -10,12 +8,14 @@ if does not look like an object, say 'unknown'. Export objects as a list of strings \ in this exact format '['object 1', 'object 2', '...']'." -RICH_PROMPT = "What are in these images? Give a detailed description of each item, the first n images will be \ +RICH_PROMPT = ( + "What are in these images? Give a detailed description of each item, the first n images will be \ cropped patches of the original image detected by the object detection model. \ The last image will be the original image. Use the last image only for context, \ do not describe objects in the last image. \ Export the objects as a list of strings in this exact format, '['description of object 1', '...', '...']', \ don't include anything else. " +) class ImageAnalyzer: @@ -53,7 +53,10 @@ def analyze_images(self, images, detail="auto", prompt_type="normal"): image_data = [ { "type": "image_url", - "image_url": {"url": f"data:image/jpeg;base64,{self.encode_image(img)}", "detail": detail}, + "image_url": { + "url": f"data:image/jpeg;base64,{self.encode_image(img)}", + "detail": detail, + }, } for img in images ] @@ -87,7 +90,7 @@ def main(): if not os.path.exists(cropped_images_dir): print(f"Directory '{cropped_images_dir}' does not exist.") return - + # Load all images from the directory images = [] for filename in os.listdir(cropped_images_dir): @@ -98,19 +101,19 @@ def main(): images.append(image) else: print(f"Warning: Could not read image {image_path}") - + if not images: print("No valid images found in the directory.") return - + # Initialize ImageAnalyzer analyzer = ImageAnalyzer() - + # Analyze images results = analyzer.analyze_images(images) - + # Split results into a list of items - object_list = [item.strip()[2:] for item in results.split('\n')] + object_list = [item.strip()[2:] for item in results.split("\n")] # Overlay text on images and display them for i, (img, obj) in enumerate(zip(images, object_list)): @@ -120,23 +123,25 @@ def main(): font_scale = 0.5 thickness = 2 text = obj.strip() - + # Get text size (text_width, text_height), _ = cv2.getTextSize(text, font, font_scale, thickness) - + # Position text at top of image x = 10 y = text_height + 10 - + # Add white background for text - cv2.rectangle(img, (x-5, y-text_height-5), (x+text_width+5, y+5), (255,255,255), -1) + cv2.rectangle( + img, (x - 5, y - text_height - 5), (x + text_width + 5, y + 5), (255, 255, 255), -1 + ) # Add text - cv2.putText(img, text, (x, y), font, font_scale, (0,0,0), thickness) - + cv2.putText(img, text, (x, y), font, font_scale, (0, 0, 0), thickness) + # Save or display the image cv2.imwrite(f"annotated_image_{i}.jpg", img) print(f"Detected object: {obj}") if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/dimos/perception/segmentation/sam_2d_seg.py b/dimos/perception/segmentation/sam_2d_seg.py index 9a0437f910..97976dd007 100644 --- a/dimos/perception/segmentation/sam_2d_seg.py +++ b/dimos/perception/segmentation/sam_2d_seg.py @@ -1,21 +1,29 @@ import cv2 -import numpy as np import time from ultralytics import FastSAM -from dimos.perception.segmentation.utils import extract_masks_bboxes_probs_names, \ - filter_segmentation_results, \ - plot_results, \ - crop_images_from_bboxes +from dimos.perception.segmentation.utils import ( + extract_masks_bboxes_probs_names, + filter_segmentation_results, + plot_results, + crop_images_from_bboxes, +) from dimos.perception.common.detection2d_tracker import target2dTracker, get_tracked_results from dimos.perception.segmentation.image_analyzer import ImageAnalyzer import os from collections import deque from concurrent.futures import ThreadPoolExecutor + class Sam2DSegmenter: - def __init__(self, model_path="FastSAM-s.pt", device="cuda", - min_analysis_interval=5.0, use_tracker=True, use_analyzer=True, - use_rich_labeling=False): + def __init__( + self, + model_path="FastSAM-s.pt", + device="cuda", + min_analysis_interval=5.0, + use_tracker=True, + use_analyzer=True, + use_rich_labeling=False, + ): # Core components self.device = device self.model = FastSAM(model_path) @@ -24,7 +32,7 @@ def __init__(self, model_path="FastSAM-s.pt", device="cuda", self.use_rich_labeling = use_rich_labeling module_dir = os.path.dirname(__file__) - self.tracker_config = os.path.join(module_dir, 'config', 'custom_tracker.yaml') + self.tracker_config = os.path.join(module_dir, "config", "custom_tracker.yaml") # Initialize tracker if enabled if self.use_tracker: @@ -38,9 +46,9 @@ def __init__(self, model_path="FastSAM-s.pt", device="cuda", max_area_ratio=0.4, texture_range=(0.0, 0.35), border_safe_distance=100, - weights={"prob": 1.0, "temporal": 3.0, "texture": 2.0, "border": 3.0, "size": 1.0} + weights={"prob": 1.0, "temporal": 3.0, "texture": 2.0, "border": 3.0, "size": 1.0}, ) - + # Initialize analyzer components if enabled if self.use_analyzer: self.image_analyzer = ImageAnalyzer() @@ -67,12 +75,20 @@ def process_image(self, image): if len(results) > 0: # Get initial segmentation results - masks, bboxes, track_ids, probs, names, areas = extract_masks_bboxes_probs_names(results[0]) - + masks, bboxes, track_ids, probs, names, areas = extract_masks_bboxes_probs_names( + results[0] + ) + # Filter results - filtered_masks, filtered_bboxes, filtered_track_ids, filtered_probs, filtered_names, filtered_texture_values = \ - filter_segmentation_results(image, masks, bboxes, track_ids, probs, names, areas) - + ( + filtered_masks, + filtered_bboxes, + filtered_track_ids, + filtered_probs, + filtered_names, + filtered_texture_values, + ) = filter_segmentation_results(image, masks, bboxes, track_ids, probs, names, areas) + if self.use_tracker: # Update tracker with filtered results tracked_targets = self.tracker.update( @@ -84,37 +100,63 @@ def process_image(self, image): filtered_names, filtered_texture_values, ) - + # Get tracked results - tracked_masks, tracked_bboxes, tracked_target_ids, tracked_probs, tracked_names = get_tracked_results(tracked_targets) - + tracked_masks, tracked_bboxes, tracked_target_ids, tracked_probs, tracked_names = ( + get_tracked_results(tracked_targets) + ) + if self.use_analyzer: # Update analysis queue with tracked IDs target_id_set = set(tracked_target_ids) # Remove untracked objects from object_names all_target_ids = list(self.tracker.targets.keys()) - self.object_names = {track_id: name for track_id, name in self.object_names.items() - if track_id in all_target_ids} - + self.object_names = { + track_id: name + for track_id, name in self.object_names.items() + if track_id in all_target_ids + } + # Remove untracked objects from queue and results - self.to_be_analyzed = deque([track_id for track_id in self.to_be_analyzed - if track_id in target_id_set]) - + self.to_be_analyzed = deque( + [track_id for track_id in self.to_be_analyzed if track_id in target_id_set] + ) + # Filter out any IDs being analyzed from the to_be_analyzed queue if self.current_queue_ids: - self.to_be_analyzed = deque([tid for tid in self.to_be_analyzed - if tid not in self.current_queue_ids]) - + self.to_be_analyzed = deque( + [ + tid + for tid in self.to_be_analyzed + if tid not in self.current_queue_ids + ] + ) + # Add new track_ids to analysis queue for track_id in tracked_target_ids: - if track_id not in self.object_names and track_id not in self.to_be_analyzed: + if ( + track_id not in self.object_names + and track_id not in self.to_be_analyzed + ): self.to_be_analyzed.append(track_id) - - return tracked_masks, tracked_bboxes, tracked_target_ids, tracked_probs, tracked_names + + return ( + tracked_masks, + tracked_bboxes, + tracked_target_ids, + tracked_probs, + tracked_names, + ) else: # Return filtered results directly if tracker is disabled - return filtered_masks, filtered_bboxes, filtered_track_ids, filtered_probs, filtered_names + return ( + filtered_masks, + filtered_bboxes, + filtered_track_ids, + filtered_probs, + filtered_names, + ) return [], [], [], [], [] def check_analysis_status(self, tracked_target_ids): @@ -123,7 +165,7 @@ def check_analysis_status(self, tracked_target_ids): return None, None current_time = time.time() - + # Check if current queue analysis is complete if self.current_future and self.current_future.done(): try: @@ -140,12 +182,14 @@ def check_analysis_status(self, tracked_target_ids): self.last_analysis_time = current_time # If enough time has passed and we have items to analyze, start new analysis - if (not self.current_future and self.to_be_analyzed and - current_time - self.last_analysis_time >= self.min_analysis_interval): - + if ( + not self.current_future + and self.to_be_analyzed + and current_time - self.last_analysis_time >= self.min_analysis_interval + ): queue_indices = [] queue_ids = [] - + # Collect all valid track IDs from the queue while self.to_be_analyzed: track_id = self.to_be_analyzed[0] @@ -154,7 +198,7 @@ def check_analysis_status(self, tracked_target_ids): queue_indices.append(bbox_idx) queue_ids.append(track_id) self.to_be_analyzed.popleft() - + if queue_indices: return queue_indices, queue_ids return None, None @@ -177,20 +221,20 @@ def run_analysis(self, frame, tracked_bboxes, tracked_target_ids): cropped_images.append(frame) else: prompt_type = "normal" - + self.current_future = self.analysis_executor.submit( - self.image_analyzer.analyze_images, - cropped_images, - prompt_type=prompt_type + self.image_analyzer.analyze_images, cropped_images, prompt_type=prompt_type ) def get_object_names(self, track_ids, tracked_names): """Get object names for the given track IDs, falling back to tracked names.""" if not self.use_analyzer: return tracked_names - - return [self.object_names.get(track_id, tracked_name) - for track_id, tracked_name in zip(track_ids, tracked_names)] + + return [ + self.object_names.get(track_id, tracked_name) + for track_id, tracked_name in zip(track_ids, tracked_names) + ] def visualize_results(self, image, masks, bboxes, track_ids, probs, names): """Generate an overlay visualization with segmentation results and object names.""" @@ -205,21 +249,21 @@ def cleanup(self): def main(): # Example usage with different configurations cap = cv2.VideoCapture(0) - + # Example 1: Full functionality with rich labeling segmenter = Sam2DSegmenter( - min_analysis_interval=4.0, - use_tracker=True, + min_analysis_interval=4.0, + use_tracker=True, use_analyzer=True, - use_rich_labeling=True # Enable rich labeling + use_rich_labeling=True, # Enable rich labeling ) - + # Example 2: Full functionality with normal labeling # segmenter = Sam2DSegmenter(min_analysis_interval=4.0, use_tracker=True, use_analyzer=True) - + # Example 3: Tracker only (analyzer disabled) # segmenter = Sam2DSegmenter(use_analyzer=False) - + # Example 4: Basic segmentation only (both tracker and analyzer disabled) # segmenter = Sam2DSegmenter(use_tracker=False, use_analyzer=False) @@ -230,26 +274,19 @@ def main(): break start_time = time.time() - + # Process image and get results masks, bboxes, target_ids, probs, names = segmenter.process_image(frame) - + # Run analysis if enabled if segmenter.use_tracker and segmenter.use_analyzer: segmenter.run_analysis(frame, bboxes, target_ids) names = segmenter.get_object_names(target_ids, names) - #processing_time = time.time() - start_time - #print(f"Processing time: {processing_time:.2f}s") + # processing_time = time.time() - start_time + # print(f"Processing time: {processing_time:.2f}s") - overlay = segmenter.visualize_results( - frame, - masks, - bboxes, - target_ids, - probs, - names - ) + overlay = segmenter.visualize_results(frame, masks, bboxes, target_ids, probs, names) cv2.imshow("Segmentation", overlay) key = cv2.waitKey(1) diff --git a/dimos/perception/segmentation/utils.py b/dimos/perception/segmentation/utils.py index cd9544928c..cdc265303c 100644 --- a/dimos/perception/segmentation/utils.py +++ b/dimos/perception/segmentation/utils.py @@ -1,7 +1,6 @@ import numpy as np import cv2 import torch -import time class SimpleTracker: @@ -25,21 +24,21 @@ def update(self, track_ids): self.history.pop(0) # Consider only the latest `count_window` frames for counting - recent_history = self.history[-self.count_window:] + recent_history = self.history[-self.count_window :] all_tracks = np.concatenate(recent_history) if recent_history else np.array([]) - + # Compute occurrences efficiently using numpy unique_ids, counts = np.unique(all_tracks, return_counts=True) id_counts = dict(zip(unique_ids, counts)) - + # Update total counts but ensure it only contains IDs within the history size total_tracked_ids = np.concatenate(self.history) if self.history else np.array([]) unique_total_ids, total_counts = np.unique(total_tracked_ids, return_counts=True) self.total_counts = dict(zip(unique_total_ids, total_counts)) - + # Return IDs that appear often enough return [track_id for track_id, count in id_counts.items() if count >= self.min_count] - + def get_total_counts(self): """Returns the total count of each tracking ID seen over time, limited to history size.""" return self.total_counts @@ -48,11 +47,11 @@ def get_total_counts(self): def extract_masks_bboxes_probs_names(result, max_size=0.7): """ Extracts masks, bounding boxes, probabilities, and class names from one Ultralytics result object. - + Parameters: result: Ultralytics result object max_size: float, maximum allowed size of object relative to image (0-1) - + Returns: tuple: (masks, bboxes, track_ids, probs, names, areas) """ @@ -65,7 +64,7 @@ def extract_masks_bboxes_probs_names(result, max_size=0.7): if result.masks is None: return masks, bboxes, track_ids, probs, names, areas - + total_area = result.masks.orig_shape[0] * result.masks.orig_shape[1] for box, mask_data in zip(result.boxes, result.masks.data): @@ -73,12 +72,12 @@ def extract_masks_bboxes_probs_names(result, max_size=0.7): # Extract bounding box x1, y1, x2, y2 = box.xyxy[0].tolist() - + # Extract track_id if available track_id = -1 # default if no tracking - if hasattr(box, 'id') and box.id is not None: + if hasattr(box, "id") and box.id is not None: track_id = int(box.id[0].item()) - + # Extract probability and class index conf = float(box.conf[0]) cls_idx = int(box.cls[0]) @@ -96,15 +95,16 @@ def extract_masks_bboxes_probs_names(result, max_size=0.7): return masks, bboxes, track_ids, probs, names, areas + def compute_texture_map(frame, blur_size=3): """ Compute texture map using gradient statistics. Returns high values for textured regions and low values for smooth regions. - + Parameters: frame: BGR image blur_size: Size of Gaussian blur kernel for pre-processing - + Returns: numpy array: Texture map with values normalized to [0,1] """ @@ -113,32 +113,34 @@ def compute_texture_map(frame, blur_size=3): gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) else: gray = frame - + # Pre-process with slight blur to reduce noise if blur_size > 0: gray = cv2.GaussianBlur(gray, (blur_size, blur_size), 0) - + # Compute gradients in x and y directions grad_x = cv2.Sobel(gray, cv2.CV_32F, 1, 0, ksize=3) grad_y = cv2.Sobel(gray, cv2.CV_32F, 0, 1, ksize=3) - + # Compute gradient magnitude and direction magnitude = np.sqrt(grad_x**2 + grad_y**2) - + # Compute local standard deviation of gradient magnitude texture_map = cv2.GaussianBlur(magnitude, (15, 15), 0) - + # Normalize to [0,1] texture_map = (texture_map - texture_map.min()) / (texture_map.max() - texture_map.min() + 1e-8) - + return texture_map -def filter_segmentation_results(frame, masks, bboxes, track_ids, probs, names, areas, texture_threshold=0.07, size_filter=800): +def filter_segmentation_results( + frame, masks, bboxes, track_ids, probs, names, areas, texture_threshold=0.07, size_filter=800 +): """ Filters segmentation results using both overlap and saliency detection. Uses mask_sum tensor for efficient overlap detection. - + Parameters: masks: list of torch.Tensor containing mask data bboxes: list of bounding boxes [x1, y1, x2, y2] @@ -149,38 +151,42 @@ def filter_segmentation_results(frame, masks, bboxes, track_ids, probs, names, a frame: BGR image for computing saliency texture_threshold: Average texture value required for mask to be kept size_filter: Minimum size of the object to be kept - + Returns: tuple: (filtered_masks, filtered_bboxes, filtered_track_ids, filtered_probs, filtered_names, filtered_texture_values, texture_map) """ if len(masks) <= 1: return masks, bboxes, track_ids, probs, names, [] - + # Compute texture map once and convert to tensor texture_map = compute_texture_map(frame) - + # Sort by area (smallest to largest) sorted_indices = torch.tensor(areas).argsort(descending=False) device = masks[0].device # Get the device of the first mask - + # Create mask_sum tensor where each pixel stores the index of the mask that claims it mask_sum = torch.zeros_like(masks[0], dtype=torch.int32) - - texture_map = torch.from_numpy(texture_map).to(device) # Convert texture_map to tensor and move to device - + + texture_map = torch.from_numpy(texture_map).to( + device + ) # Convert texture_map to tensor and move to device + filtered_texture_values = [] # List to store texture values of filtered masks - + for i, idx in enumerate(sorted_indices): mask = masks[idx] # Compute average texture value within mask texture_value = torch.mean(texture_map[mask > 0]) if torch.any(mask > 0) else 0 - + # Only claim pixels if mask passes texture threshold if texture_value >= texture_threshold: mask_sum[mask > 0] = i - filtered_texture_values.append(texture_value.item()) # Store the texture value as a Python float - + filtered_texture_values.append( + texture_value.item() + ) # Store the texture value as a Python float + # Get indices that appear in mask_sum (these are the masks we want to keep) keep_indices, counts = torch.unique(mask_sum[mask_sum > 0], return_counts=True) size_indices = counts > size_filter @@ -188,17 +194,24 @@ def filter_segmentation_results(frame, masks, bboxes, track_ids, probs, names, a sorted_indices = sorted_indices.cpu() keep_indices = keep_indices.cpu() - + # Map back to original indices and filter final_indices = sorted_indices[keep_indices].tolist() - + filtered_masks = [masks[i] for i in final_indices] filtered_bboxes = [bboxes[i] for i in final_indices] filtered_track_ids = [track_ids[i] for i in final_indices] filtered_probs = [probs[i] for i in final_indices] filtered_names = [names[i] for i in final_indices] - return filtered_masks, filtered_bboxes, filtered_track_ids, filtered_probs, filtered_names, filtered_texture_values + return ( + filtered_masks, + filtered_bboxes, + filtered_track_ids, + filtered_probs, + filtered_names, + filtered_texture_values, + ) def plot_results(image, masks, bboxes, track_ids, probs, names, alpha=0.5): @@ -215,7 +228,7 @@ def plot_results(image, masks, bboxes, track_ids, probs, names, alpha=0.5): mask = mask.cpu().numpy() mask_resized = cv2.resize(mask, (w, h), interpolation=cv2.INTER_LINEAR) - + # Generate consistent color based on track_id if track_id != -1: np.random.seed(track_id) @@ -223,7 +236,7 @@ def plot_results(image, masks, bboxes, track_ids, probs, names, alpha=0.5): np.random.seed(None) else: color = np.random.randint(0, 255, (3,), dtype=np.uint8) - + # Apply mask color overlay[mask_resized > 0.5] = color @@ -237,31 +250,20 @@ def plot_results(image, masks, bboxes, track_ids, probs, names, alpha=0.5): label += f" {name}" # Calculate text size for background rectangle - (text_w, text_h), _ = cv2.getTextSize( - label, - cv2.FONT_HERSHEY_SIMPLEX, - 0.5, - 1 - ) + (text_w, text_h), _ = cv2.getTextSize(label, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 1) # Draw background rectangle for text - cv2.rectangle( - overlay, - (x1, y1-text_h-8), - (x1+text_w+4, y1), - color.tolist(), - -1 - ) + cv2.rectangle(overlay, (x1, y1 - text_h - 8), (x1 + text_w + 4, y1), color.tolist(), -1) # Draw text with white color for better visibility cv2.putText( overlay, label, - (x1+2, y1-5), + (x1 + 2, y1 - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), # White text - 1 + 1, ) # Blend overlay with original image @@ -293,7 +295,7 @@ def crop_images_from_bboxes(image, bboxes, buffer=0): x2 = min(width, x2 + buffer) y2 = min(height, y2 + buffer) - cropped_image = image[int(y1):int(y2), int(x1):int(x2)] + cropped_image = image[int(y1) : int(y2), int(x1) : int(x2)] cropped_images.append(cropped_image) return cropped_images diff --git a/dimos/perception/semantic_seg.py b/dimos/perception/semantic_seg.py index 4f5a1b5b80..3ef2eb7399 100644 --- a/dimos/perception/semantic_seg.py +++ b/dimos/perception/semantic_seg.py @@ -24,17 +24,17 @@ class SemanticSegmentationStream: def __init__( - self, + self, model_path: str = "FastSAM-s.pt", device: str = "cuda", enable_mono_depth: bool = True, enable_rich_labeling: bool = True, camera_params: dict = None, - gt_depth_scale=256.0 + gt_depth_scale=256.0, ): """ Initialize a semantic segmentation stream using Sam2DSegmenter. - + Args: model_path: Path to the FastSAM model file device: Computation device ("cuda" or "cpu") @@ -50,65 +50,63 @@ def __init__( min_analysis_interval=5.0, use_tracker=True, use_analyzer=True, - use_rich_labeling=enable_rich_labeling + use_rich_labeling=enable_rich_labeling, ) - + self.enable_mono_depth = enable_mono_depth if enable_mono_depth: self.depth_model = Metric3D(gt_depth_scale) - + if camera_params: # Check if direct intrinsics are provided - if 'intrinsics' in camera_params: - intrinsics = camera_params['intrinsics'] + if "intrinsics" in camera_params: + intrinsics = camera_params["intrinsics"] if len(intrinsics) != 4: raise ValueError("Intrinsics must be a list of 4 values: [fx, fy, cx, cy]") self.depth_model.update_intrinsic(intrinsics) else: # Create camera object and calculate intrinsics from physical parameters self.camera = Camera( - resolution=camera_params.get('resolution'), - focal_length=camera_params.get('focal_length'), - sensor_size=camera_params.get('sensor_size') + resolution=camera_params.get("resolution"), + focal_length=camera_params.get("focal_length"), + sensor_size=camera_params.get("sensor_size"), ) intrinsics = self.camera.calculate_intrinsics() - self.depth_model.update_intrinsic([ - intrinsics['focal_length_x'], - intrinsics['focal_length_y'], - intrinsics['principal_point_x'], - intrinsics['principal_point_y'] - ]) + self.depth_model.update_intrinsic( + [ + intrinsics["focal_length_x"], + intrinsics["focal_length_y"], + intrinsics["principal_point_x"], + intrinsics["principal_point_y"], + ] + ) else: raise ValueError("Camera parameters are required for monocular depth processing.") - + def create_stream(self, video_stream: Observable) -> Observable[SegmentationType]: """ Create an Observable stream of segmentation results from a video stream. - + Args: video_stream: Observable that emits video frames - + Returns: Observable that emits SegmentationType objects containing masks and metadata """ + def process_frame(frame): # Process image and get results masks, bboxes, target_ids, probs, names = self.segmenter.process_image(frame) - + # Run analysis if enabled if self.segmenter.use_analyzer: self.segmenter.run_analysis(frame, bboxes, target_ids) names = self.segmenter.get_object_names(target_ids, names) viz_frame = self.segmenter.visualize_results( - frame, - masks, - bboxes, - target_ids, - probs, - names + frame, masks, bboxes, target_ids, probs, names ) - + # Process depth if enabled depth_viz = None object_depths = [] @@ -116,21 +114,21 @@ def process_frame(frame): # Get depth map depth_map = self.depth_model.infer_depth(frame) depth_map = np.array(depth_map) - + # Calculate average depth for each object object_depths = [] for mask in masks: # Convert mask to numpy if needed - mask_np = mask.cpu().numpy() if hasattr(mask, 'cpu') else mask + mask_np = mask.cpu().numpy() if hasattr(mask, "cpu") else mask # Get depth values where mask is True object_depth = depth_map[mask_np > 0.5] # Calculate average depth (in meters) avg_depth = np.mean(object_depth) if len(object_depth) > 0 else 0 - object_depths.append(avg_depth/1000) - + object_depths.append(avg_depth / 1000) + # Create colorized depth visualization depth_viz = self._create_depth_visualization(depth_map) - + # Overlay depth values on the visualization frame for bbox, depth in zip(bboxes, object_depths): x1, y1, x2, y2 = map(int, bbox) @@ -138,15 +136,24 @@ def process_frame(frame): depth_text = f"{depth:.2f}mm" # Add black background for better visibility text_size = cv2.getTextSize(depth_text, cv2.FONT_HERSHEY_SIMPLEX, 0.5, 2)[0] - cv2.rectangle(viz_frame, - (x1, y2 - text_size[1] - 5), - (x1 + text_size[0], y2), - (0, 0, 0), -1) + cv2.rectangle( + viz_frame, + (x1, y2 - text_size[1] - 5), + (x1 + text_size[0], y2), + (0, 0, 0), + -1, + ) # Draw text in white - cv2.putText(viz_frame, depth_text, - (x1, y2 - 5), - cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2) - + cv2.putText( + viz_frame, + depth_text, + (x1, y2 - 5), + cv2.FONT_HERSHEY_SIMPLEX, + 0.5, + (255, 255, 255), + 2, + ) + # Create metadata in the new requested format objects = [] for i in range(len(bboxes)): @@ -156,75 +163,86 @@ def process_frame(frame): "prob": probs[i] if i < len(probs) else None, "label": names[i] if i < len(names) else None, } - + # Add depth if available if self.enable_mono_depth and i < len(object_depths): obj_data["depth"] = object_depths[i] - + objects.append(obj_data) - + # Create the new metadata dictionary - metadata = { - "frame": frame, - "viz_frame": viz_frame, - "objects": objects - } - + metadata = {"frame": frame, "viz_frame": viz_frame, "objects": objects} + # Add depth visualization if available if depth_viz is not None: metadata["depth_viz"] = depth_viz - + # Convert masks to numpy arrays if they aren't already - numpy_masks = [mask.cpu().numpy() if hasattr(mask, 'cpu') else mask for mask in masks] - + numpy_masks = [mask.cpu().numpy() if hasattr(mask, "cpu") else mask for mask in masks] + return SegmentationType(masks=numpy_masks, metadata=metadata) - - return video_stream.pipe( - ops.map(process_frame) - ) - + + return video_stream.pipe(ops.map(process_frame)) + def _create_depth_visualization(self, depth_map): """ Create a colorized visualization of the depth map. - + Args: depth_map: Raw depth map in meters - + Returns: Colorized depth map visualization """ # Normalize depth map to 0-255 range for visualization depth_min = np.min(depth_map) depth_max = np.max(depth_map) - depth_normalized = ((depth_map - depth_min) / (depth_max - depth_min) * 255).astype(np.uint8) - + depth_normalized = ((depth_map - depth_min) / (depth_max - depth_min) * 255).astype( + np.uint8 + ) + # Apply colormap (using JET colormap for better depth perception) depth_colored = cv2.applyColorMap(depth_normalized, cv2.COLORMAP_JET) - + # Add depth scale bar scale_height = 30 scale_width = depth_map.shape[1] # Match width with depth map scale_bar = np.zeros((scale_height, scale_width, 3), dtype=np.uint8) - + # Create gradient for scale bar for i in range(scale_width): - color = cv2.applyColorMap(np.array([[i * 255 // scale_width]], dtype=np.uint8), cv2.COLORMAP_JET) + color = cv2.applyColorMap( + np.array([[i * 255 // scale_width]], dtype=np.uint8), cv2.COLORMAP_JET + ) scale_bar[:, i] = color[0, 0] - + # Add depth values to scale bar - cv2.putText(scale_bar, f"{depth_min:.1f}mm", (5, 20), - cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) - cv2.putText(scale_bar, f"{depth_max:.1f}mm", (scale_width-60, 20), - cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 1) - + cv2.putText( + scale_bar, + f"{depth_min:.1f}mm", + (5, 20), + cv2.FONT_HERSHEY_SIMPLEX, + 0.5, + (255, 255, 255), + 1, + ) + cv2.putText( + scale_bar, + f"{depth_max:.1f}mm", + (scale_width - 60, 20), + cv2.FONT_HERSHEY_SIMPLEX, + 0.5, + (255, 255, 255), + 1, + ) + # Combine depth map and scale bar combined_viz = np.vstack((depth_colored, scale_bar)) - + return combined_viz - + def cleanup(self): """Clean up resources.""" self.segmenter.cleanup() if self.enable_mono_depth: del self.depth_model - diff --git a/dimos/perception/spatial_perception.py b/dimos/perception/spatial_perception.py index c689b07d07..6a9ee553b3 100644 --- a/dimos/perception/spatial_perception.py +++ b/dimos/perception/spatial_perception.py @@ -16,19 +16,14 @@ Spatial Memory module for creating a semantic map of the environment. """ -import logging import uuid import time import os -import math -from typing import Dict, List, Tuple, Optional, Any, Union +from typing import Dict, List, Optional, Any import numpy as np -import cv2 from reactivex import Observable, disposable from reactivex import operators as ops -from reactivex.subject import Subject -from reactivex.disposable import CompositeDisposable from datetime import datetime from dimos.utils.logging_config import setup_logger @@ -40,19 +35,20 @@ logger = setup_logger("dimos.perception.spatial_memory") + class SpatialMemory: """ A class for building and querying Robot spatial memory. - + This class processes video frames from ROSControl, associates them with XY locations, and stores them in a vector database for later retrieval. It also maintains a list of named robot locations that can be queried by name. """ - + def __init__( self, collection_name: str = "spatial_memory", - embedding_model: str = "clip", + embedding_model: str = "clip", embedding_dimensions: int = 512, min_distance_threshold: float = 0.01, # Min distance in meters to store a new frame min_time_threshold: float = 1.0, # Min time in seconds to record a new frame @@ -61,13 +57,17 @@ def __init__( new_memory: bool = False, # Whether to create a new memory from scratch output_dir: Optional[str] = None, # Directory for storing visual memory data chroma_client: Any = None, # Optional ChromaDB client for persistence - visual_memory: Optional['VisualMemory'] = None, # Optional VisualMemory instance for storing images + visual_memory: Optional[ + "VisualMemory" + ] = None, # Optional VisualMemory instance for storing images video_stream: Optional[Observable] = None, # Video stream to process - transform_provider: Optional[callable] = None, # Function that returns position and rotation + transform_provider: Optional[ + callable + ] = None, # Function that returns position and rotation ): """ Initialize the spatial perception system. - + Args: collection_name: Name of the vector database collection embedding_model: Model to use for image embeddings ("clip", "resnet", etc.) @@ -83,24 +83,25 @@ def __init__( self.embedding_dimensions = embedding_dimensions self.min_distance_threshold = min_distance_threshold self.min_time_threshold = min_time_threshold - + # Set up paths for persistence self.db_path = db_path self.visual_memory_path = visual_memory_path self.output_dir = output_dir - + # Setup ChromaDB client if not provided self._chroma_client = chroma_client if chroma_client is None and db_path is not None: # Create db directory if needed os.makedirs(db_path, exist_ok=True) - + # Clean up existing DB if creating new memory if new_memory and os.path.exists(db_path): try: - logger.info(f"Creating new ChromaDB database (new_memory=True)") + logger.info("Creating new ChromaDB database (new_memory=True)") # Try to delete any existing database files import shutil + for item in os.listdir(db_path): item_path = os.path.join(db_path, item) if os.path.isfile(item_path): @@ -110,14 +111,14 @@ def __init__( logger.info(f"Removed existing ChromaDB files from {db_path}") except Exception as e: logger.error(f"Error clearing ChromaDB directory: {e}") - + from chromadb.config import Settings import chromadb + self._chroma_client = chromadb.PersistentClient( - path=db_path, - settings=Settings(anonymized_telemetry=False) + path=db_path, settings=Settings(anonymized_telemetry=False) ) - + # Initialize or load visual memory self._visual_memory = visual_memory if visual_memory is None: @@ -127,95 +128,98 @@ def __init__( else: try: logger.info(f"Loading existing visual memory from {visual_memory_path}...") - self._visual_memory = VisualMemory.load(visual_memory_path, output_dir=output_dir) + self._visual_memory = VisualMemory.load( + visual_memory_path, output_dir=output_dir + ) logger.info(f"Loaded {self._visual_memory.count()} images from previous runs") except Exception as e: logger.error(f"Error loading visual memory: {e}") self._visual_memory = VisualMemory(output_dir=output_dir) - + # Initialize vector database self.vector_db: SpatialVectorDB = SpatialVectorDB( collection_name=collection_name, chroma_client=self._chroma_client, - visual_memory=self._visual_memory + visual_memory=self._visual_memory, ) - + self.embedding_provider: ImageEmbeddingProvider = ImageEmbeddingProvider( - model_name=embedding_model, - dimensions=embedding_dimensions + model_name=embedding_model, dimensions=embedding_dimensions ) - + self.last_position: Optional[Vector] = None self.last_record_time: Optional[float] = None - + self.frame_count: int = 0 self.stored_frame_count: int = 0 - + # For tracking stream subscription self._subscription = None - + # List to store robot locations self.robot_locations: List[RobotLocation] = [] - + logger.info(f"SpatialMemory initialized with model {embedding_model}") - + # Start processing video stream if provided if video_stream is not None and transform_provider is not None: self.start_continuous_processing(video_stream, transform_provider) - - - def query_by_location(self, x: float, y: float, radius: float = 2.0, limit: int = 5) -> List[Dict]: + + def query_by_location( + self, x: float, y: float, radius: float = 2.0, limit: int = 5 + ) -> List[Dict]: """ Query the vector database for images near the specified location. - + Args: x: X coordinate y: Y coordinate radius: Search radius in meters limit: Maximum number of results to return - + Returns: List of results, each containing the image and its metadata """ return self.vector_db.query_by_location(x, y, radius, limit) - - def start_continuous_processing(self, video_stream: Observable, transform_provider: callable) -> disposable.Disposable: + + def start_continuous_processing( + self, video_stream: Observable, transform_provider: callable + ) -> disposable.Disposable: """ Start continuous processing of video frames from an Observable stream. - + Args: video_stream: Observable of video frames transform_provider: Callable that returns position and rotation for each frame - + Returns: Disposable subscription that can be used to stop processing """ # Stop any existing subscription self.stop_continuous_processing() - + # Map each video frame to include transform data combined_stream = video_stream.pipe( - ops.map(lambda video_frame: { - "frame": video_frame, - **transform_provider() - }), + ops.map(lambda video_frame: {"frame": video_frame, **transform_provider()}), # Filter out bad transforms - ops.filter(lambda data: data.get('position') is not None and data.get('rotation') is not None) + ops.filter( + lambda data: data.get("position") is not None and data.get("rotation") is not None + ), ) - + # Process with spatial memory result_stream = self.process_stream(combined_stream) - + # Subscribe to the result stream self._subscription = result_stream.subscribe( on_next=self._on_frame_processed, on_error=lambda e: logger.error(f"Error in spatial memory stream: {e}"), - on_completed=lambda: logger.info("Spatial memory stream completed") + on_completed=lambda: logger.info("Spatial memory stream completed"), ) - + logger.info("Continuous spatial memory processing started") return self._subscription - + def stop_continuous_processing(self) -> None: """ Stop continuous processing of video frames. @@ -227,25 +231,27 @@ def stop_continuous_processing(self) -> None: logger.info("Stopped continuous spatial memory processing") except Exception as e: logger.error(f"Error stopping spatial memory processing: {e}") - + def _on_frame_processed(self, result: Dict[str, Any]) -> None: """ Handle updates from the spatial memory processing stream. """ # Log successful frame storage (if stored) - position = result.get('position') + position = result.get("position") if position is not None: - logger.debug(f"Spatial memory updated with frame at ({position[0]:.2f}, {position[1]:.2f}, {position[2]:.2f})") - + logger.debug( + f"Spatial memory updated with frame at ({position[0]:.2f}, {position[1]:.2f}, {position[2]:.2f})" + ) + # Periodically save visual memory to disk (e.g., every 100 frames) if self._visual_memory is not None and self.visual_memory_path is not None: if self.stored_frame_count % 100 == 0: self.save() - + def save(self) -> bool: """ Save the visual memory component to disk. - + Returns: True if memory was saved successfully, False otherwise """ @@ -257,50 +263,55 @@ def save(self) -> bool: except Exception as e: logger.error(f"Failed to save visual memory: {e}") return False - + def process_stream(self, combined_stream: Observable) -> Observable: """ Process a combined stream of video frames and positions. - + This method handles a stream where each item already contains both the frame and position, - such as the stream created by combining video and transform streams with the + such as the stream created by combining video and transform streams with the with_latest_from operator. - + Args: combined_stream: Observable stream of dictionaries containing 'frame' and 'position' - + Returns: Observable of processing results, including the stored frame and its metadata """ self.last_position = None self.last_record_time = None - + def process_combined_data(data): self.frame_count += 1 - - frame = data.get('frame') - position_vec = data.get('position') # Use .get() for consistency - rotation_vec = data.get('rotation') # Get rotation data if available - - + + frame = data.get("frame") + position_vec = data.get("position") # Use .get() for consistency + rotation_vec = data.get("rotation") # Get rotation data if available + if not position_vec or not rotation_vec: logger.info("No position or rotation data available, skipping frame") return None - - if self.last_position is not None and (self.last_position - position_vec).length() < self.min_distance_threshold: + + if ( + self.last_position is not None + and (self.last_position - position_vec).length() < self.min_distance_threshold + ): logger.debug("Position has not moved, skipping frame") return None - if self.last_record_time is not None and (time.time() - self.last_record_time) < self.min_time_threshold: + if ( + self.last_record_time is not None + and (time.time() - self.last_record_time) < self.min_time_threshold + ): logger.debug("Time since last record too short, skipping frame") return None - + current_time = time.time() - + frame_embedding = self.embedding_provider.get_embedding(frame) - + frame_id = f"frame_{datetime.now().strftime('%Y%m%d_%H%M%S')}_{uuid.uuid4().hex[:8]}" - + # Create metadata dictionary with primitive types only metadata = { "pos_x": float(position_vec.x), @@ -310,75 +321,73 @@ def process_combined_data(data): "rot_y": float(rotation_vec.y), "rot_z": float(rotation_vec.z), "timestamp": current_time, - "frame_id": frame_id + "frame_id": frame_id, } - + self.vector_db.add_image_vector( - vector_id=frame_id, - image=frame, - embedding=frame_embedding, - metadata=metadata + vector_id=frame_id, image=frame, embedding=frame_embedding, metadata=metadata ) - + self.last_position = position_vec self.last_record_time = current_time self.stored_frame_count += 1 - - logger.info(f"Stored frame at position {position_vec}, rotation {rotation_vec})" - f" stored {self.stored_frame_count}/{self.frame_count} frames") - + + logger.info( + f"Stored frame at position {position_vec}, rotation {rotation_vec})" + f" stored {self.stored_frame_count}/{self.frame_count} frames" + ) + # Create return dictionary with primitive-compatible values return { "frame": frame, "position": (position_vec.x, position_vec.y, position_vec.z), "rotation": (rotation_vec.x, rotation_vec.y, rotation_vec.z), "frame_id": frame_id, - "timestamp": current_time + "timestamp": current_time, } - + return combined_stream.pipe( - ops.map(process_combined_data), - ops.filter(lambda result: result is not None) + ops.map(process_combined_data), ops.filter(lambda result: result is not None) ) def query_by_image(self, image: np.ndarray, limit: int = 5) -> List[Dict]: """ Query the vector database for images similar to the provided image. - + Args: image: Query image limit: Maximum number of results to return - + Returns: List of results, each containing the image and its metadata """ embedding = self.embedding_provider.get_embedding(image) return self.vector_db.query_by_embedding(embedding, limit) - + def query_by_text(self, text: str, limit: int = 5) -> List[Dict]: """ Query the vector database for images matching the provided text description. - + This method uses CLIP's text-to-image matching capability to find images that semantically match the text query (e.g., "where is the kitchen"). - + Args: text: Text query to search for limit: Maximum number of results to return - + Returns: List of results, each containing the image, its metadata, and similarity score """ logger.info(f"Querying spatial memory with text: '{text}'") return self.vector_db.query_by_text(text, limit) - + def add_robot_location(self, location: RobotLocation) -> bool: """ Add a named robot location to spatial memory. - + Args: location: The RobotLocation object to add - + Returns: True if successfully added, False otherwise """ @@ -387,27 +396,27 @@ def add_robot_location(self, location: RobotLocation) -> bool: self.robot_locations.append(location) logger.info(f"Added robot location '{location.name}' at position {location.position}") return True - + except Exception as e: logger.error(f"Error adding robot location: {e}") return False - + def get_robot_locations(self) -> List[RobotLocation]: """ Get all stored robot locations. - + Returns: List of RobotLocation objects """ return self.robot_locations - + def find_robot_location(self, name: str) -> Optional[RobotLocation]: """ Find a robot location by name. - + Args: name: Name of the location to find - + Returns: RobotLocation object if found, None otherwise """ @@ -415,17 +424,17 @@ def find_robot_location(self, name: str) -> Optional[RobotLocation]: for location in self.robot_locations: if location.name.lower() == name.lower(): return location - + return None - + def cleanup(self): """Clean up resources.""" # Stop any ongoing processing self.stop_continuous_processing() - + # Save data if possible self.save() - + # Log cleanup if self.vector_db: logger.info(f"Cleaning up SpatialMemory, stored {self.stored_frame_count} frames") diff --git a/dimos/perception/visual_servoing.py b/dimos/perception/visual_servoing.py index ba8883cc9d..40cee7c60c 100644 --- a/dimos/perception/visual_servoing.py +++ b/dimos/perception/visual_servoing.py @@ -30,28 +30,35 @@ def calculate_iou(box1, box2): y1 = max(box1[1], box2[1]) x2 = min(box1[2], box2[2]) y2 = min(box1[3], box2[3]) - + intersection = max(0, x2 - x1) * max(0, y2 - y1) area1 = (box1[2] - box1[0]) * (box1[3] - box1[1]) area2 = (box2[2] - box2[0]) * (box2[3] - box2[1]) union = area1 + area2 - intersection - + return intersection / union if union > 0 else 0 class VisualServoing: """ A class that performs visual servoing to track and follow a human target. - + The class will use the provided tracking stream to detect people and estimate their distance and angle, then use a VisualServoingController to generate appropriate velocity commands to track the target. """ - - def __init__(self, tracking_stream=None, max_linear_speed=0.8, max_angular_speed=1.5, - desired_distance=1.5, max_lost_frames=10000, iou_threshold=0.6): + + def __init__( + self, + tracking_stream=None, + max_linear_speed=0.8, + max_angular_speed=1.5, + desired_distance=1.5, + max_lost_frames=10000, + iou_threshold=0.6, + ): """Initialize the visual servoing. - + Args: tracking_stream: Observable tracking stream (must be already set up) max_linear_speed: Maximum linear speed in m/s @@ -66,65 +73,69 @@ def __init__(self, tracking_stream=None, max_linear_speed=0.8, max_angular_speed self.desired_distance = desired_distance self.max_lost_frames = max_lost_frames self.iou_threshold = iou_threshold - + # Initialize the controller with PID parameters tuned for slow-moving robot # Distance PID: (kp, ki, kd, output_limits, integral_limit, deadband, output_deadband) distance_pid_params = ( - 1.0, # kp: Moderate proportional gain for smooth approach - 0.2, # ki: Small integral gain to eliminate steady-state error - 0.1, # kd: Some damping for smooth motion + 1.0, # kp: Moderate proportional gain for smooth approach + 0.2, # ki: Small integral gain to eliminate steady-state error + 0.1, # kd: Some damping for smooth motion (-self.max_linear_speed, self.max_linear_speed), # output_limits - 0.5, # integral_limit: Prevent windup - 0.1, # deadband: Small deadband for distance control - 0.05, # output_deadband: Minimum output to overcome friction + 0.5, # integral_limit: Prevent windup + 0.1, # deadband: Small deadband for distance control + 0.05, # output_deadband: Minimum output to overcome friction ) - + # Angle PID: (kp, ki, kd, output_limits, integral_limit, deadband, output_deadband) angle_pid_params = ( - 1.4, # kp: Higher proportional gain for responsive turning - 0.1, # ki: Small integral gain - 0.05, # kd: Light damping to prevent oscillation + 1.4, # kp: Higher proportional gain for responsive turning + 0.1, # ki: Small integral gain + 0.05, # kd: Light damping to prevent oscillation (-self.max_angular_speed, self.max_angular_speed), # output_limits - 0.3, # integral_limit: Prevent windup - 0.1, # deadband: Small deadband for angle control - 0.1, # output_deadband: Minimum output to overcome friction + 0.3, # integral_limit: Prevent windup + 0.1, # deadband: Small deadband for angle control + 0.1, # output_deadband: Minimum output to overcome friction True, # Invert output for angular control ) - + # Initialize the visual servoing controller self.controller = VisualServoingController( - distance_pid_params=distance_pid_params, - angle_pid_params=angle_pid_params + distance_pid_params=distance_pid_params, angle_pid_params=angle_pid_params ) - + # Initialize tracking state self.last_control_time = time.time() self.running = False self.current_target = None # (target_id, bbox) self.target_lost_frames = 0 - + # Add variables to track current distance and angle self.current_distance = None self.current_angle = None - + # Stream subscription management self.subscription = None self.latest_result = None self.result_lock = threading.Lock() self.stop_event = threading.Event() - + # Subscribe to the tracking stream self._subscribe_to_tracking_stream() - - def start_tracking(self, desired_distance: int = None, point: Tuple[int, int] = None, timeout_wait_for_target: float = 20.0,) -> bool: + + def start_tracking( + self, + desired_distance: int = None, + point: Tuple[int, int] = None, + timeout_wait_for_target: float = 20.0, + ) -> bool: """ Start tracking a human target using visual servoing. - + Args: point: Optional tuple of (x, y) coordinates in image space. If provided, will find the target whose bounding box contains this point. If None, will track the closest person. - + Returns: bool: True if tracking was successfully started, False otherwise """ @@ -134,17 +145,19 @@ def start_tracking(self, desired_distance: int = None, point: Tuple[int, int] = if self.tracking_stream is None: self.running = False return False - + # Get the latest frame and targets from person tracker try: # Try getting the result multiple times with delays - for attempt in range(10): + for attempt in range(10): result = self._get_current_tracking_result() - + if result is not None: break - - logger.warning(f"Attempt {attempt + 1}: No tracking result, retrying in 1 second...") + + logger.warning( + f"Attempt {attempt + 1}: No tracking result, retrying in 1 second..." + ) time.sleep(3) # Wait 1 second between attempts if result is None: @@ -152,7 +165,7 @@ def start_tracking(self, desired_distance: int = None, point: Tuple[int, int] = return False targets = result.get("targets") - + # If bbox is provided, find matching target based on IOU if point is not None and not self.running: # Find the target with highest IOU to the provided bbox @@ -172,7 +185,7 @@ def start_tracking(self, desired_distance: int = None, point: Tuple[int, int] = else: # Already tracking return True - + if best_target: # Set as current target and reset lost counter target_id = best_target.get("target_id") @@ -181,7 +194,7 @@ def start_tracking(self, desired_distance: int = None, point: Tuple[int, int] = self.target_lost_frames = 0 self.running = True logger.info(f"Started tracking target ID: {target_id}") - + # Get distance and angle and compute control (store as initial control values) distance = best_target.get("distance") angle = best_target.get("angle") @@ -198,14 +211,14 @@ def start_tracking(self, desired_distance: int = None, point: Tuple[int, int] = logger.error(f"Error starting tracking: {e}") self.running = False return False - + def _find_target_by_point(self, point, targets): """Find the target whose bounding box contains the given point. - + Args: point: Tuple of (x, y) coordinates in image space targets: List of target dictionaries - + Returns: dict: The target whose bbox contains the point, or None if no match """ @@ -214,16 +227,16 @@ def _find_target_by_point(self, point, targets): bbox = target.get("bbox") if not bbox: continue - + x1, y1, x2, y2 = bbox if x1 <= x <= x2 and y1 <= y <= y2: return target return None - + def updateTracking(self) -> Dict[str, any]: """ Update tracking of current target. - + Returns: Dict with linear_vel, angular_vel, and running state """ @@ -232,17 +245,17 @@ def updateTracking(self) -> Dict[str, any]: self.current_distance = None self.current_angle = None return {"linear_vel": 0.0, "angular_vel": 0.0} - + # Get the latest tracking result result = self._get_current_tracking_result() - + # Get targets from result targets = result.get("targets") - + # Try to find current target by ID or IOU current_target_id, current_bbox = self.current_target target_found = False - + # First try to find by ID for target in targets: if target.get("target_id") == current_target_id: @@ -250,15 +263,15 @@ def updateTracking(self) -> Dict[str, any]: self.current_target = (current_target_id, target.get("bbox")) self.target_lost_frames = 0 target_found = True - + # Store current distance and angle self.current_distance = target.get("distance") self.current_angle = target.get("angle") - + # Compute control control = self._compute_control(self.current_distance, self.current_angle) return control - + # If not found by ID, try to find by IOU if not target_found and current_bbox is not None: best_target = self._find_best_target_by_iou(current_bbox, targets) @@ -269,115 +282,111 @@ def updateTracking(self) -> Dict[str, any]: self.current_target = (new_id, new_bbox) self.target_lost_frames = 0 logger.info(f"Target ID updated: {current_target_id} -> {new_id}") - + # Store current distance and angle self.current_distance = best_target.get("distance") self.current_angle = best_target.get("angle") - + # Compute control control = self._compute_control(self.current_distance, self.current_angle) return control - + # Target not found, increment lost counter if not target_found: self.target_lost_frames += 1 logger.warning(f"Target lost: frame {self.target_lost_frames}/{self.max_lost_frames}") - + # Check if target is lost for too many frames if self.target_lost_frames >= self.max_lost_frames: logger.info("Target lost for too many frames, stopping tracking") self.stop_tracking() return {"linear_vel": 0.0, "angular_vel": 0.0, "running": False} - + return {"linear_vel": 0.0, "angular_vel": 0.0} - - + def _compute_control(self, distance: float, angle: float) -> Dict[str, float]: """ Compute control commands based on measured distance and angle. - + Args: distance: Measured distance to target in meters angle: Measured angle to target in radians - + Returns: Dict with linear_vel and angular_vel keys """ current_time = time.time() dt = current_time - self.last_control_time self.last_control_time = current_time - + # Compute control with visual servoing controller linear_vel, angular_vel = self.controller.compute_control( measured_distance=distance, measured_angle=angle, desired_distance=self.desired_distance, desired_angle=0.0, # Keep target centered - dt=dt + dt=dt, ) - + # Log control values for debugging logger.debug(f"Distance: {distance:.2f}m, Angle: {np.rad2deg(angle):.1f}°") logger.debug(f"Control: linear={linear_vel:.2f}m/s, angular={angular_vel:.2f}rad/s") - - return { - "linear_vel": linear_vel, - "angular_vel": angular_vel - } - + + return {"linear_vel": linear_vel, "angular_vel": angular_vel} + def _find_best_target_by_iou(self, bbox: List[float], targets: List[Dict]) -> Optional[Dict]: """ Find the target with highest IOU to the given bbox. - + Args: bbox: Bounding box to match [x1, y1, x2, y2] targets: List of target dictionaries - + Returns: Best matching target or None if no match found """ if not targets: return None - + best_iou = self.iou_threshold best_target = None - + for target in targets: target_bbox = target.get("bbox") if target_bbox is None: continue - + iou = calculate_iou(bbox, target_bbox) if iou > best_iou: best_iou = iou best_target = target - + return best_target - + def _find_closest_target(self, targets: List[Dict]) -> Optional[Dict]: """ Find the target with shortest distance to the camera. - + Args: targets: List of target dictionaries - + Returns: The closest target or None if no targets available """ if not targets: return None - + closest_target = None - min_distance = float('inf') - + min_distance = float("inf") + for target in targets: distance = target.get("distance") if distance is not None and distance < min_distance: min_distance = distance closest_target = target - + return closest_target - + def _subscribe_to_tracking_stream(self): """ Subscribe to the already set up tracking stream. @@ -385,56 +394,56 @@ def _subscribe_to_tracking_stream(self): if self.tracking_stream is None: logger.warning("No tracking stream provided to subscribe to") return - + try: # Set up subscription to process frames self.subscription = self.tracking_stream.subscribe( on_next=self._on_tracking_result, on_error=self._on_tracking_error, - on_completed=self._on_tracking_completed + on_completed=self._on_tracking_completed, ) - + logger.info("Subscribed to tracking stream successfully") except Exception as e: logger.error(f"Error subscribing to tracking stream: {e}") - + def _on_tracking_result(self, result): """ Callback for tracking stream results. - + This updates the latest result for use by _get_current_tracking_result. - + Args: result: The result from the tracking stream """ if self.stop_event.is_set(): return - + # Update the latest result with self.result_lock: self.latest_result = result - + def _on_tracking_error(self, error): """ Callback for tracking stream errors. - + Args: error: The error from the tracking stream """ logger.error(f"Tracking stream error: {error}") self.stop_event.set() - + def _on_tracking_completed(self): """Callback for tracking stream completion.""" logger.info("Tracking stream completed") self.stop_event.set() - + def _get_current_tracking_result(self) -> Optional[Dict]: """ Get the current tracking result. - + Returns the latest result cached from the tracking stream subscription. - + Returns: Dict with 'frame' and 'targets' or None if not available """ @@ -450,31 +459,33 @@ def stop_tracking(self): self.current_distance = None self.current_angle = None return {"linear_vel": 0.0, "angular_vel": 0.0, "running": False} - + def is_goal_reached(self, distance_threshold=0.2, angle_threshold=0.1) -> bool: """ Check if the robot has reached the tracking goal (desired distance and angle). - + Args: distance_threshold: Maximum allowed difference between current and desired distance (meters) angle_threshold: Maximum allowed difference between current and desired angle (radians) - + Returns: bool: True if both distance and angle are within threshold of desired values """ if not self.running or self.current_target is None: return False - + # Use the stored distance and angle values if self.current_distance is None or self.current_angle is None: return False - + # Check if within thresholds distance_error = abs(self.current_distance - self.desired_distance) angle_error = abs(self.current_angle) # Desired angle is always 0 (centered) - - logger.debug(f"Goal check - Distance error: {distance_error:.2f}m, Angle error: {angle_error:.2f}rad") - + + logger.debug( + f"Goal check - Distance error: {distance_error:.2f}m, Angle error: {angle_error:.2f}rad" + ) + return (distance_error <= distance_threshold) and (angle_error <= angle_threshold) def cleanup(self): diff --git a/dimos/robot/abstract_robot.py b/dimos/robot/abstract_robot.py index 4c6345f1b0..ffe69dde6d 100644 --- a/dimos/robot/abstract_robot.py +++ b/dimos/robot/abstract_robot.py @@ -6,60 +6,58 @@ """ from abc import ABC, abstractmethod -from typing import Any, Union, Optional from reactivex.observable import Observable -import numpy as np class AbstractRobot(ABC): """Abstract base class for all robot implementations. - + This class defines the minimal interface that all robot implementations must provide, regardless of whether they use ROS, WebRTC, or other communication protocols. """ - + @abstractmethod def connect(self) -> bool: """Establish a connection to the robot. - - This method should handle all necessary setup to establish + + This method should handle all necessary setup to establish communication with the robot hardware. - + Returns: bool: True if connection was successful, False otherwise. """ pass - + @abstractmethod def move(self, *args, **kwargs) -> bool: """Move the robot. - + This is a generic movement interface that should be implemented by all robot classes. The exact parameters will depend on the specific robot implementation. - + Returns: bool: True if movement command was successfully sent. """ pass - + @abstractmethod def get_video_stream(self, fps: int = 30) -> Observable: """Get a video stream from the robot's camera. - + Args: fps: Frames per second for the video stream. Defaults to 30. - + Returns: Observable: An observable stream of video frames. """ pass - + @abstractmethod def stop(self) -> None: """Clean up resources and stop the robot. - + This method should handle all necessary cleanup when shutting down the robot connection, including stopping any ongoing movements. """ diff --git a/dimos/robot/global_planner/algo.py b/dimos/robot/global_planner/algo.py index c553a5e659..c710b2027e 100644 --- a/dimos/robot/global_planner/algo.py +++ b/dimos/robot/global_planner/algo.py @@ -8,20 +8,17 @@ def find_nearest_free_cell( - costmap: Costmap, - position: VectorLike, - cost_threshold: int = 90, - max_search_radius: int = 20 + costmap: Costmap, position: VectorLike, cost_threshold: int = 90, max_search_radius: int = 20 ) -> Tuple[int, int]: """ Find the nearest unoccupied cell in the costmap using BFS. - + Args: costmap: Costmap object containing the environment position: Position to find nearest free cell from cost_threshold: Cost threshold above which a cell is considered an obstacle max_search_radius: Maximum search radius in cells - + Returns: Tuple of (x, y) in grid coordinates of the nearest free cell, or the original position if no free cell is found within max_search_radius @@ -29,43 +26,53 @@ def find_nearest_free_cell( # Convert world coordinates to grid coordinates grid_pos = costmap.world_to_grid(position) start_x, start_y = int(grid_pos.x), int(grid_pos.y) - + # If the cell is already free, return it if 0 <= start_x < costmap.width and 0 <= start_y < costmap.height: if costmap.grid[start_y, start_x] < cost_threshold: return (start_x, start_y) - + # BFS to find nearest free cell queue = deque([(start_x, start_y, 0)]) # (x, y, distance) visited = set([(start_x, start_y)]) - + # Possible movements (8-connected grid) directions = [ - (0, 1), (1, 0), (0, -1), (-1, 0), # horizontal/vertical - (1, 1), (1, -1), (-1, 1), (-1, -1) # diagonal + (0, 1), + (1, 0), + (0, -1), + (-1, 0), # horizontal/vertical + (1, 1), + (1, -1), + (-1, 1), + (-1, -1), # diagonal ] - + while queue: x, y, dist = queue.popleft() - + # Check if we've reached the maximum search radius if dist > max_search_radius: - print(f"Could not find free cell within {max_search_radius} cells of ({start_x}, {start_y})") + print( + f"Could not find free cell within {max_search_radius} cells of ({start_x}, {start_y})" + ) return (start_x, start_y) # Return original position if no free cell found - + # Check if this cell is valid and free if 0 <= x < costmap.width and 0 <= y < costmap.height: if costmap.grid[y, x] < cost_threshold: - print(f"Found free cell at ({x}, {y}), {dist} cells away from ({start_x}, {start_y})") + print( + f"Found free cell at ({x}, {y}), {dist} cells away from ({start_x}, {start_y})" + ) return (x, y) - + # Add neighbors to the queue for dx, dy in directions: nx, ny = x + dx, y + dy if (nx, ny) not in visited: visited.add((nx, ny)) queue.append((nx, ny, dist + 1)) - + # If the queue is empty and no free cell is found, return the original position return (start_x, start_y) @@ -93,22 +100,21 @@ def astar( # Convert world coordinates to grid coordinates directly using vector-like inputs start_vector = costmap.world_to_grid(start) goal_vector = costmap.world_to_grid(goal) - + # Store original positions for reference original_start = (int(start_vector.x), int(start_vector.y)) original_goal = (int(goal_vector.x), int(goal_vector.y)) - + adjusted_start = original_start adjusted_goal = original_goal # Check if start is out of bounds or in an obstacle - start_valid = (0 <= start_vector.x < costmap.width and - 0 <= start_vector.y < costmap.height) - + start_valid = 0 <= start_vector.x < costmap.width and 0 <= start_vector.y < costmap.height + start_in_obstacle = False if start_valid: start_in_obstacle = costmap.grid[int(start_vector.y), int(start_vector.x)] >= cost_threshold - + if not start_valid or start_in_obstacle: print("Start position is out of bounds or in an obstacle, finding nearest free cell") adjusted_start = find_nearest_free_cell(costmap, start, cost_threshold) @@ -116,13 +122,12 @@ def astar( start_vector = Vector(adjusted_start[0], adjusted_start[1]) # Check if goal is out of bounds or in an obstacle - goal_valid = (0 <= goal_vector.x < costmap.width and - 0 <= goal_vector.y < costmap.height) - + goal_valid = 0 <= goal_vector.x < costmap.width and 0 <= goal_vector.y < costmap.height + goal_in_obstacle = False if goal_valid: goal_in_obstacle = costmap.grid[int(goal_vector.y), int(goal_vector.x)] >= cost_threshold - + if not goal_valid or goal_in_obstacle: print("Goal position is out of bounds or in an obstacle, finding nearest free cell") adjusted_goal = find_nearest_free_cell(costmap, goal, cost_threshold) @@ -168,7 +173,9 @@ def heuristic(x1, y1, x2, y2): return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2) # Start with the starting node - f_score = g_score[start_tuple] + heuristic(start_tuple[0], start_tuple[1], goal_tuple[0], goal_tuple[1]) + f_score = g_score[start_tuple] + heuristic( + start_tuple[0], start_tuple[1], goal_tuple[0], goal_tuple[1] + ) heapq.heappush(open_set, (f_score, start_tuple)) while open_set: @@ -197,7 +204,7 @@ def heuristic(x1, y1, x2, y2): if not waypoints or waypoints[-1].distance(goal_point) > 1e-5: waypoints.append(goal_point) - + # If we adjusted the goal, add the original goal as the final point if adjusted_goal != original_goal and goal_valid: original_goal_point = costmap.grid_to_world(original_goal) @@ -227,7 +234,11 @@ def heuristic(x1, y1, x2, y2): continue obstacle_proximity_penalty = costmap.grid[neighbor_y, neighbor_x] / 25 - tentative_g_score = g_score[current] + movement_costs[i] + (obstacle_proximity_penalty * movement_costs[i]) + tentative_g_score = ( + g_score[current] + + movement_costs[i] + + (obstacle_proximity_penalty * movement_costs[i]) + ) # Get the current g_score for the neighbor or set to infinity if not yet explored neighbor_g_score = g_score.get(neighbor, float("inf")) @@ -237,7 +248,9 @@ def heuristic(x1, y1, x2, y2): # Update the neighbor's scores and parent parents[neighbor] = current g_score[neighbor] = tentative_g_score - f_score = tentative_g_score + heuristic(neighbor_x, neighbor_y, goal_tuple[0], goal_tuple[1]) + f_score = tentative_g_score + heuristic( + neighbor_x, neighbor_y, goal_tuple[0], goal_tuple[1] + ) # Add the neighbor to the open set with its f_score heapq.heappush(open_set, (f_score, neighbor)) diff --git a/dimos/robot/global_planner/planner.py b/dimos/robot/global_planner/planner.py index 0a59428917..f4b5d17bc6 100644 --- a/dimos/robot/global_planner/planner.py +++ b/dimos/robot/global_planner/planner.py @@ -35,7 +35,10 @@ class Planner(Visualizable): def plan(self, goal: VectorLike) -> Path: ... def set_goal( - self, goal: VectorLike, goal_theta: Optional[float] = None, stop_event: Optional[threading.Event] = None + self, + goal: VectorLike, + goal_theta: Optional[float] = None, + stop_event: Optional[threading.Event] = None, ): path = self.plan(goal) if not path: diff --git a/dimos/robot/local_planner/__init__.py b/dimos/robot/local_planner/__init__.py index 72a7adea57..472b58dcd2 100644 --- a/dimos/robot/local_planner/__init__.py +++ b/dimos/robot/local_planner/__init__.py @@ -4,4 +4,4 @@ navigate_path_local, ) -from dimos.robot.local_planner.vfh_local_planner import VFHPurePursuitPlanner \ No newline at end of file +from dimos.robot.local_planner.vfh_local_planner import VFHPurePursuitPlanner diff --git a/dimos/robot/local_planner/local_planner.py b/dimos/robot/local_planner/local_planner.py index f32d8db81f..d7af8a80d3 100644 --- a/dimos/robot/local_planner/local_planner.py +++ b/dimos/robot/local_planner/local_planner.py @@ -2,7 +2,7 @@ import math import numpy as np -from typing import Dict, Tuple, Optional, List, Any, Callable, Protocol +from typing import Dict, Tuple, Optional, Callable from abc import ABC, abstractmethod import cv2 from reactivex import Observable @@ -12,46 +12,43 @@ import logging from collections import deque from dimos.utils.logging_config import setup_logger -from dimos.utils.ros_utils import ( - normalize_angle, - distance_angle_to_goal_xy -) +from dimos.utils.ros_utils import normalize_angle, distance_angle_to_goal_xy -from dimos.robot.robot import Robot from dimos.types.vector import VectorLike, Vector, to_tuple from dimos.types.path import Path -from dimos.types.costmap import Costmap -from dimos.robot.global_planner.algo import astar from nav_msgs.msg import OccupancyGrid logger = setup_logger("dimos.robot.unitree.local_planner", level=logging.DEBUG) + class BaseLocalPlanner(ABC): """ Abstract base class for local planners that handle obstacle avoidance and path following. - - This class defines the common interface and shared functionality that all local planners + + This class defines the common interface and shared functionality that all local planners must implement, regardless of the specific algorithm used. """ - - def __init__(self, - get_costmap: Callable[[], Optional[OccupancyGrid]], - transform: object, - move_vel_control: Callable[[float, float, float], None], - safety_threshold: float = 0.5, - max_linear_vel: float = 0.8, - max_angular_vel: float = 1.0, - lookahead_distance: float = 1.0, - goal_tolerance: float = 0.75, - angle_tolerance: float = 0.15, - robot_width: float = 0.5, - robot_length: float = 0.7, - visualization_size: int = 400, - control_frequency: float = 10.0, - safe_goal_distance: float = 1.5): # Control frequency in Hz + + def __init__( + self, + get_costmap: Callable[[], Optional[OccupancyGrid]], + transform: object, + move_vel_control: Callable[[float, float, float], None], + safety_threshold: float = 0.5, + max_linear_vel: float = 0.8, + max_angular_vel: float = 1.0, + lookahead_distance: float = 1.0, + goal_tolerance: float = 0.75, + angle_tolerance: float = 0.15, + robot_width: float = 0.5, + robot_length: float = 0.7, + visualization_size: int = 400, + control_frequency: float = 10.0, + safe_goal_distance: float = 1.5, + ): # Control frequency in Hz """ Initialize the base local planner. - + Args: get_costmap: Function to get the latest local costmap transform: Object with transform methods (transform_point, transform_rot, etc.) @@ -72,7 +69,7 @@ def __init__(self, self.get_costmap = get_costmap self.transform = transform self.move_vel_control = move_vel_control - + # Store parameters self.safety_threshold = safety_threshold self.max_linear_vel = max_linear_vel @@ -92,16 +89,18 @@ def __init__(self, self.goal_xy: Optional[Tuple[float, float]] = None # Current target for planning self.goal_theta: Optional[float] = None # Goal orientation in odom frame self.position_reached: bool = False # Flag indicating if position goal is reached - self.waypoints: Optional[Path] = None # Full path if following waypoints - self.waypoints_in_odom: Optional[Path] = None # Full path in odom frame - self.waypoint_frame: Optional[str] = None # Frame of the waypoints - self.current_waypoint_index: int = 0 # Index of the next waypoint to reach - self.final_goal_reached: bool = False # Flag indicating if the final waypoint is reached + self.waypoints: Optional[Path] = None # Full path if following waypoints + self.waypoints_in_odom: Optional[Path] = None # Full path in odom frame + self.waypoint_frame: Optional[str] = None # Frame of the waypoints + self.current_waypoint_index: int = 0 # Index of the next waypoint to reach + self.final_goal_reached: bool = False # Flag indicating if the final waypoint is reached # Stuck detection self.stuck_detection_window_seconds = 8.0 # Time window for stuck detection (seconds) self.position_history_size = int(self.stuck_detection_window_seconds * control_frequency) - self.position_history = deque(maxlen=self.position_history_size) # History of recent positions + self.position_history = deque( + maxlen=self.position_history_size + ) # History of recent positions self.stuck_distance_threshold = 0.1 # Distance threshold for stuck detection (meters) self.unstuck_distance_threshold = 0.5 # Distance threshold for unstuck detection (meters) self.stuck_time_threshold = 4.0 # Time threshold for stuck detection (seconds) @@ -121,16 +120,18 @@ def reset(self): self.is_recovery_active = False self.recovery_start_time = 0.0 self.last_update_time = time.time() - + # Reset navigation state flags self.navigation_failed = False self.position_reached = False self.final_goal_reached = False self.ignore_obstacles = False - + logger.info("Local planner state has been reset") - def set_goal(self, goal_xy: VectorLike, frame: str = "odom", goal_theta: Optional[float] = None): + def set_goal( + self, goal_xy: VectorLike, frame: str = "odom", goal_theta: Optional[float] = None + ): """Set a single goal position, converting to odom frame if necessary. This clears any existing waypoints being followed. @@ -141,33 +142,45 @@ def set_goal(self, goal_xy: VectorLike, frame: str = "odom", goal_theta: Optiona """ # Reset all state variables self.reset() - + # Clear waypoint following state self.waypoints = None self.current_waypoint_index = 0 - self.goal_xy = None # Clear previous goal - self.goal_theta = None # Clear previous goal orientation + self.goal_xy = None # Clear previous goal + self.goal_theta = None # Clear previous goal orientation target_goal_xy: Optional[Tuple[float, float]] = None - target_goal_xy = self.transform.transform_point(goal_xy, source_frame=frame, target_frame="odom").to_tuple() + target_goal_xy = self.transform.transform_point( + goal_xy, source_frame=frame, target_frame="odom" + ).to_tuple() + + logger.info( + f"Goal set directly in odom frame: ({target_goal_xy[0]:.2f}, {target_goal_xy[1]:.2f})" + ) - logger.info(f"Goal set directly in odom frame: ({target_goal_xy[0]:.2f}, {target_goal_xy[1]:.2f})") - # Check if goal is valid (in bounds and not colliding) - if not self.is_goal_in_costmap_bounds(target_goal_xy) or self.check_goal_collision(target_goal_xy): - logger.warning("Goal is in collision or out of bounds. Adjusting goal to valid position.") + if not self.is_goal_in_costmap_bounds(target_goal_xy) or self.check_goal_collision( + target_goal_xy + ): + logger.warning( + "Goal is in collision or out of bounds. Adjusting goal to valid position." + ) self.goal_xy = self.adjust_goal_to_valid_position(target_goal_xy) else: - self.goal_xy = target_goal_xy # Set the adjusted or original valid goal - + self.goal_xy = target_goal_xy # Set the adjusted or original valid goal + # Set goal orientation if provided if goal_theta is not None: - transformed_rot = self.transform.transform_rot(Vector(0.0, 0.0, goal_theta), source_frame=frame, target_frame="odom") + transformed_rot = self.transform.transform_rot( + Vector(0.0, 0.0, goal_theta), source_frame=frame, target_frame="odom" + ) self.goal_theta = transformed_rot[2] - def set_goal_waypoints(self, waypoints: Path, frame: str = "map", goal_theta: Optional[float] = None): - """Sets a path of waypoints for the robot to follow. + def set_goal_waypoints( + self, waypoints: Path, frame: str = "map", goal_theta: Optional[float] = None + ): + """Sets a path of waypoints for the robot to follow. Args: waypoints: A list of waypoints to follow. Each waypoint is a tuple of (x, y) coordinates in odom frame. @@ -192,25 +205,31 @@ def set_goal_waypoints(self, waypoints: Path, frame: str = "map", goal_theta: Op self.current_waypoint_index = 0 # Transform waypoints to odom frame - self.waypoints_in_odom = self.transform.transform_path(self.waypoints, source_frame=frame, target_frame="odom") - + self.waypoints_in_odom = self.transform.transform_path( + self.waypoints, source_frame=frame, target_frame="odom" + ) + # Set the initial target to the first waypoint, adjusting if necessary first_waypoint = self.waypoints_in_odom[0] - if not self.is_goal_in_costmap_bounds(first_waypoint) or self.check_goal_collision(first_waypoint): + if not self.is_goal_in_costmap_bounds(first_waypoint) or self.check_goal_collision( + first_waypoint + ): logger.warning("First waypoint is invalid. Adjusting...") self.goal_xy = self.adjust_goal_to_valid_position(first_waypoint) else: - self.goal_xy = to_tuple(first_waypoint) # Initial target - + self.goal_xy = to_tuple(first_waypoint) # Initial target + # Set goal orientation if provided if goal_theta is not None: - transformed_rot = self.transform.transform_rot(Vector(0.0, 0.0, goal_theta), source_frame=frame, target_frame="odom") + transformed_rot = self.transform.transform_rot( + Vector(0.0, 0.0, goal_theta), source_frame=frame, target_frame="odom" + ) self.goal_theta = transformed_rot[2] def _get_robot_pose(self) -> Tuple[Tuple[float, float], float]: """ Get the current robot position and orientation. - + Returns: Tuple containing: - position as (x, y) tuple @@ -218,11 +237,11 @@ def _get_robot_pose(self) -> Tuple[Tuple[float, float], float]: """ [pos, rot] = self.transform.transform_euler("base_link", "odom") return (pos[0], pos[1]), rot[2] - + def _get_final_goal_position(self) -> Optional[Tuple[float, float]]: """ Get the final goal position (either last waypoint or direct goal). - + Returns: Tuple (x, y) of the final goal, or None if no goal is set """ @@ -231,32 +250,37 @@ def _get_final_goal_position(self) -> Optional[Tuple[float, float]]: elif self.goal_xy is not None: return self.goal_xy return None - + def _distance_to_position(self, target_position: Tuple[float, float]) -> float: """ Calculate distance from the robot to a target position. - + Args: target_position: Target (x, y) position - + Returns: Distance in meters """ robot_pos, _ = self._get_robot_pose() - return np.linalg.norm([target_position[0] - robot_pos[0], - target_position[1] - robot_pos[1]]) - + return np.linalg.norm( + [target_position[0] - robot_pos[0], target_position[1] - robot_pos[1]] + ) + def plan(self) -> Dict[str, float]: """ Main planning method that computes velocity commands. This includes common planning logic like waypoint following, with algorithm-specific calculations delegated to subclasses. - + Returns: Dict[str, float]: Velocity commands with 'x_vel' and 'angular_vel' keys """ # If goal orientation is specified, rotate to match it - if self.position_reached and self.goal_theta is not None and not self._is_goal_orientation_reached(): + if ( + self.position_reached + and self.goal_theta is not None + and not self._is_goal_orientation_reached() + ): logger.info("Position goal reached. Rotating to target orientation.") return self._rotate_to_goal_orientation() @@ -264,39 +288,41 @@ def plan(self) -> Dict[str, float]: if self.check_if_stuck() and not self.position_reached: # Check if we're stuck but close to our goal final_goal_pos = self._get_final_goal_position() - + # If we have a goal position, check distance to it if final_goal_pos is not None: distance_to_goal = self._distance_to_position(final_goal_pos) - + # If we're stuck but within 2x safe_goal_distance of the goal, consider it a success if distance_to_goal < 2.0 * self.safe_goal_distance: - logger.info(f"Robot is stuck but within {distance_to_goal:.2f}m of goal (< {2.0 * self.safe_goal_distance:.2f}m). Considering navigation successful.") + logger.info( + f"Robot is stuck but within {distance_to_goal:.2f}m of goal (< {2.0 * self.safe_goal_distance:.2f}m). Considering navigation successful." + ) self.position_reached = True - return {'x_vel': 0.0, 'angular_vel': 0.0} - - # Otherwise, execute normal recovery behavior + return {"x_vel": 0.0, "angular_vel": 0.0} + + # Otherwise, execute normal recovery behavior logger.warning("Robot is stuck - executing recovery behavior") return self.execute_recovery_behavior() - + # Reset obstacle ignore flag self.ignore_obstacles = False - - # --- Waypoint Following Mode --- + + # --- Waypoint Following Mode --- if self.waypoints is not None: if self.final_goal_reached: logger.info("Final waypoint reached. Stopping.") - return {'x_vel': 0.0, 'angular_vel': 0.0} - + return {"x_vel": 0.0, "angular_vel": 0.0} + # Get current robot pose robot_pos, robot_theta = self._get_robot_pose() robot_pos_np = np.array(robot_pos) - + # Check if close to final waypoint if self.waypoints_in_odom is not None and len(self.waypoints_in_odom) > 0: final_waypoint = self.waypoints_in_odom[-1] dist_to_final = np.linalg.norm(robot_pos_np - final_waypoint) - + # If we're close to the final waypoint, adjust it and ignore obstacles if dist_to_final < self.safe_goal_distance: final_wp_tuple = to_tuple(final_waypoint) @@ -306,44 +332,44 @@ def plan(self) -> Dict[str, float]: new_waypoints.append(adjusted_goal) # Append the adjusted goal self.waypoints_in_odom = new_waypoints self.ignore_obstacles = True - logger.debug(f"Within safe distance of final waypoint. Ignoring obstacles.") - + logger.debug("Within safe distance of final waypoint. Ignoring obstacles.") + # Update the target goal based on waypoint progression just_reached_final = self._update_waypoint_target(robot_pos_np) - + # If the helper indicates the final goal was just reached, stop immediately if just_reached_final: - return {'x_vel': 0.0, 'angular_vel': 0.0} + return {"x_vel": 0.0, "angular_vel": 0.0} - # --- Single Goal or Current Waypoint Target Set --- + # --- Single Goal or Current Waypoint Target Set --- if self.goal_xy is None: # If no goal is set (e.g., empty path or rejected goal), stop. - return {'x_vel': 0.0, 'angular_vel': 0.0} + return {"x_vel": 0.0, "angular_vel": 0.0} # Get necessary data for planning costmap = self.get_costmap() if costmap is None: logger.warning("Local costmap is None. Cannot plan.") - return {'x_vel': 0.0, 'angular_vel': 0.0} - + return {"x_vel": 0.0, "angular_vel": 0.0} + # Check if close to single goal mode goal if self.waypoints is None: # Get distance to goal goal_distance = self._distance_to_position(self.goal_xy) - + # If within safe distance of goal, adjust it and ignore obstacles if goal_distance < self.safe_goal_distance: self.goal_xy = self.adjust_goal_to_valid_position(self.goal_xy) self.ignore_obstacles = True - logger.debug(f"Within safe distance of goal. Ignoring obstacles.") - + logger.debug("Within safe distance of goal. Ignoring obstacles.") + # First check position if goal_distance < self.goal_tolerance or self.position_reached: self.position_reached = True else: self.position_reached = False - + # Call the algorithm-specific planning implementation return self._compute_velocity_commands() @@ -352,7 +378,7 @@ def _compute_velocity_commands(self) -> Dict[str, float]: """ Algorithm-specific method to compute velocity commands. Must be implemented by derived classes. - + Returns: Dict[str, float]: Velocity commands with 'x_vel' and 'angular_vel' keys """ @@ -360,69 +386,73 @@ def _compute_velocity_commands(self) -> Dict[str, float]: def _rotate_to_goal_orientation(self) -> Dict[str, float]: """Compute velocity commands to rotate to the goal orientation. - + Returns: Dict[str, float]: Velocity commands with zero linear velocity """ # Get current robot orientation _, robot_theta = self._get_robot_pose() - + # Calculate the angle difference angle_diff = normalize_angle(self.goal_theta - robot_theta) - + # Determine rotation direction and speed if abs(angle_diff) < self.angle_tolerance: # Already at correct orientation - return {'x_vel': 0.0, 'angular_vel': 0.0} - + return {"x_vel": 0.0, "angular_vel": 0.0} + # Calculate rotation speed - proportional to the angle difference # but capped at max_angular_vel direction = 1.0 if angle_diff > 0 else -1.0 angular_vel = direction * min(abs(angle_diff) * 2.0, self.max_angular_vel) - + # logger.debug(f"Rotating to goal orientation: angle_diff={angle_diff:.4f}, angular_vel={angular_vel:.4f}") - return {'x_vel': 0.0, 'angular_vel': angular_vel} + return {"x_vel": 0.0, "angular_vel": angular_vel} def _is_goal_orientation_reached(self) -> bool: """Check if the current robot orientation matches the goal orientation. - + Returns: bool: True if orientation is reached or no orientation goal is set """ if self.goal_theta is None: return True # No orientation goal set - + # Get current robot orientation _, robot_theta = self._get_robot_pose() - + # Calculate the angle difference and normalize angle_diff = abs(normalize_angle(self.goal_theta - robot_theta)) - - logger.debug(f"Orientation error: {angle_diff:.4f} rad, tolerance: {self.angle_tolerance:.4f} rad") + + logger.debug( + f"Orientation error: {angle_diff:.4f} rad, tolerance: {self.angle_tolerance:.4f} rad" + ) return angle_diff <= self.angle_tolerance def _update_waypoint_target(self, robot_pos_np: np.ndarray) -> bool: """Helper function to manage waypoint progression and update the target goal. - + Args: robot_pos_np: Current robot position as a numpy array [x, y]. - + Returns: bool: True if the final waypoint has just been reached, False otherwise. """ if self.waypoints is None or len(self.waypoints) == 0: return False # Not in waypoint mode or empty path - - self.waypoints_in_odom = self.transform.transform_path(self.waypoints, source_frame=self.waypoint_frame, target_frame="odom") + + self.waypoints_in_odom = self.transform.transform_path( + self.waypoints, source_frame=self.waypoint_frame, target_frame="odom" + ) # Check if final goal is reached final_waypoint = self.waypoints_in_odom[-1] dist_to_final = np.linalg.norm(robot_pos_np - final_waypoint) - + if dist_to_final < self.goal_tolerance: self.position_reached = True self.goal_xy = to_tuple(final_waypoint) - + # If goal orientation is not specified or achieved, consider fully reached if self.goal_theta is None or self._is_goal_orientation_reached(): self.final_goal_reached = True @@ -431,7 +461,7 @@ def _update_waypoint_target(self, robot_pos_np: np.ndarray) -> bool: else: logger.info("Reached final waypoint position, rotating to target orientation.") return False - + # Always find the lookahead point lookahead_point = None for i in range(self.current_waypoint_index, len(self.waypoints_in_odom)): @@ -442,14 +472,16 @@ def _update_waypoint_target(self, robot_pos_np: np.ndarray) -> bool: # Update current waypoint index to this point self.current_waypoint_index = i break - + # If no point is far enough, target the final waypoint if lookahead_point is None: lookahead_point = self.waypoints_in_odom[-1] self.current_waypoint_index = len(self.waypoints_in_odom) - 1 - + # Set the lookahead point as the immediate target, adjusting if needed - if not self.is_goal_in_costmap_bounds(lookahead_point) or self.check_goal_collision(lookahead_point): + if not self.is_goal_in_costmap_bounds(lookahead_point) or self.check_goal_collision( + lookahead_point + ): logger.debug("Lookahead point is invalid. Adjusting...") adjusted_lookahead = self.adjust_goal_to_valid_position(lookahead_point) # Only update if adjustment didn't fail completely @@ -457,7 +489,7 @@ def _update_waypoint_target(self, robot_pos_np: np.ndarray) -> bool: self.goal_xy = adjusted_lookahead else: self.goal_xy = to_tuple(lookahead_point) - + return False # Final goal not reached in this update cycle @abstractmethod @@ -465,7 +497,7 @@ def update_visualization(self) -> np.ndarray: """ Generate visualization of the planning state. Must be implemented by derived classes. - + Returns: np.ndarray: Visualization image as numpy array """ @@ -474,46 +506,46 @@ def update_visualization(self) -> np.ndarray: def create_stream(self, frequency_hz: float = None) -> Observable: """ Create an Observable stream that emits the visualization image at a fixed frequency. - + Args: frequency_hz: Optional frequency override (defaults to 1/4 of control_frequency if None) - + Returns: Observable: Stream of visualization frames """ # Default to 1/4 of control frequency if not specified (to reduce CPU usage) if frequency_hz is None: frequency_hz = self.control_frequency / 4.0 - + subject = Subject() sleep_time = 1.0 / frequency_hz - + def frame_emitter(): while True: try: # Generate the frame using the updated method - frame = self.update_visualization() + frame = self.update_visualization() subject.on_next(frame) except Exception as e: logger.error(f"Error in frame emitter thread: {e}") # Optionally, emit an error frame or simply skip # subject.on_error(e) # This would terminate the stream time.sleep(sleep_time) - + emitter_thread = threading.Thread(target=frame_emitter, daemon=True) emitter_thread.start() logger.info(f"Started visualization frame emitter thread at {frequency_hz:.1f} Hz") return subject - + @abstractmethod def check_collision(self, direction: float) -> bool: """ Check if there's a collision in the given direction. Must be implemented by derived classes. - + Args: direction: Direction to check for collision in radians - + Returns: bool: True if collision detected, False otherwise """ @@ -527,34 +559,34 @@ def is_goal_reached(self) -> bool: else: # Single goal mode: check distance to the single goal and orientation if self.goal_xy is None: - return False # No goal set - + return False # No goal set + return self.position_reached and self._is_goal_orientation_reached() def check_goal_collision(self, goal_xy: VectorLike) -> bool: """Check if the current goal is in collision with obstacles in the costmap. - + Returns: bool: True if goal is in collision, False if goal is safe or cannot be checked """ - + costmap = self.get_costmap() if costmap is None: logger.warning("Cannot check collision: No costmap available") return False - + # Check if the position is occupied collision_threshold = 80 # Consider values above 80 as obstacles - + # Use Costmap's is_occupied method return costmap.is_occupied(goal_xy, threshold=collision_threshold) def is_goal_in_costmap_bounds(self, goal_xy: VectorLike) -> bool: """Check if the goal position is within the bounds of the costmap. - + Args: goal_xy: Goal position (x, y) in odom frame - + Returns: bool: True if the goal is within the costmap bounds, False otherwise """ @@ -562,33 +594,35 @@ def is_goal_in_costmap_bounds(self, goal_xy: VectorLike) -> bool: if costmap is None: logger.warning("Cannot check bounds: No costmap available") return False - + # Get goal position in grid coordinates goal_point = costmap.world_to_grid(goal_xy) goal_cell_x, goal_cell_y = goal_point.x, goal_point.y - + # Check if goal is within the costmap bounds is_in_bounds = 0 <= goal_cell_x < costmap.width and 0 <= goal_cell_y < costmap.height - + if not is_in_bounds: logger.warning(f"Goal ({goal_xy[0]:.2f}, {goal_xy[1]:.2f}) is outside costmap bounds") - + return is_in_bounds - def adjust_goal_to_valid_position(self, goal_xy: VectorLike, clearance: float = 0.5) -> Tuple[float, float]: + def adjust_goal_to_valid_position( + self, goal_xy: VectorLike, clearance: float = 0.5 + ) -> Tuple[float, float]: """Find a valid (non-colliding) goal position by moving it towards the robot. - + Args: goal_xy: Original goal position (x, y) in odom frame clearance: Additional distance to move back from obstacles for better clearance (meters) - + Returns: Tuple[float, float]: A valid goal position, or the original goal if already valid - """ + """ [pos, rot] = self.transform.transform_euler("base_link", "odom") - + robot_x, robot_y = pos[0], pos[1] - + # Original goal goal_x, goal_y = to_tuple(goal_xy) @@ -598,192 +632,211 @@ def adjust_goal_to_valid_position(self, goal_xy: VectorLike, clearance: float = # Calculate vector from goal to robot dx = robot_x - goal_x dy = robot_y - goal_y - distance = np.sqrt(dx*dx + dy*dy) - + distance = np.sqrt(dx * dx + dy * dy) + if distance < 0.001: # Goal is at robot position return to_tuple(goal_xy) - + # Normalize direction vector dx /= distance dy /= distance - + # Step size step_size = 0.25 # meters - + # Move goal towards robot step by step current_x, current_y = goal_x, goal_y steps = 0 max_steps = 50 # Safety limit - + # Variables to store the first valid position found valid_found = False valid_x, valid_y = None, None - + while steps < max_steps: # Move towards robot current_x += dx * step_size current_y += dy * step_size steps += 1 - + # Check if we've reached or passed the robot - new_distance = np.sqrt((current_x - robot_x)**2 + (current_y - robot_y)**2) + new_distance = np.sqrt((current_x - robot_x) ** 2 + (current_y - robot_y) ** 2) if new_distance < step_size: # We've reached the robot without finding a valid point # Move back one step from robot to avoid self-collision current_x = robot_x - dx * step_size current_y = robot_y - dy * step_size break - + # Check if this position is valid - if not self.check_goal_collision((current_x, current_y)) and self.is_goal_in_costmap_bounds((current_x, current_y)): + if not self.check_goal_collision( + (current_x, current_y) + ) and self.is_goal_in_costmap_bounds((current_x, current_y)): # Store the first valid position if not valid_found: valid_found = True valid_x, valid_y = current_x, current_y - + # If clearance is requested, continue searching for a better position if clearance > 0: continue - + # Calculate position with additional clearance if clearance > 0: - # Calculate clearance position clearance_x = current_x + dx * clearance clearance_y = current_y + dy * clearance - logger.info(f"Checking clearance position at ({clearance_x:.2f}, {clearance_y:.2f})") - + logger.info( + f"Checking clearance position at ({clearance_x:.2f}, {clearance_y:.2f})" + ) + # Check if the clearance position is also valid - if (not self.check_goal_collision((clearance_x, clearance_y)) and - self.is_goal_in_costmap_bounds((clearance_x, clearance_y))): - logger.info(f"Found valid goal with clearance at ({clearance_x:.2f}, {clearance_y:.2f})") + if not self.check_goal_collision( + (clearance_x, clearance_y) + ) and self.is_goal_in_costmap_bounds((clearance_x, clearance_y)): + logger.info( + f"Found valid goal with clearance at ({clearance_x:.2f}, {clearance_y:.2f})" + ) return (clearance_x, clearance_y) - + # Return the valid position without clearance logger.info(f"Found valid goal at ({current_x:.2f}, {current_y:.2f})") return (current_x, current_y) - + # If we found a valid position earlier but couldn't add clearance if valid_found: logger.info(f"Using valid goal found at ({valid_x:.2f}, {valid_y:.2f})") return (valid_x, valid_y) - - logger.warning(f"Could not find valid goal after {steps} steps, using closest point to robot") + + logger.warning( + f"Could not find valid goal after {steps} steps, using closest point to robot" + ) return (current_x, current_y) def check_if_stuck(self) -> bool: """ Check if the robot is stuck by analyzing movement history. - + Returns: bool: True if the robot is determined to be stuck, False otherwise """ # Get current position and time current_time = time.time() - + # Get current robot position [pos, _] = self.transform.transform_euler("base_link", "odom") current_position = (pos[0], pos[1], current_time) - + # Add current position to history (newest is appended at the end) self.position_history.append(current_position) - + # Need enough history to make a determination min_history_size = self.stuck_detection_window_seconds * self.control_frequency if len(self.position_history) < min_history_size: return False - + # Find positions within our detection window (positions are already in order from oldest to newest) window_start_time = current_time - self.stuck_detection_window_seconds window_positions = [] - + # Collect positions within the window (newest entries will be at the end) for pos_x, pos_y, timestamp in self.position_history: if timestamp >= window_start_time: window_positions.append((pos_x, pos_y, timestamp)) - + # Need at least a few positions in the window if len(window_positions) < 3: return False - + # Ensure correct order: oldest to newest window_positions.sort(key=lambda p: p[2]) - + # Get the oldest and newest positions in the window oldest_x, oldest_y, oldest_time = window_positions[0] newest_x, newest_y, newest_time = window_positions[-1] - + # Calculate time range in the window (should always be positive) time_range = newest_time - oldest_time - + # Calculate displacement from oldest to newest position - displacement = np.sqrt((newest_x - oldest_x)**2 + (newest_y - oldest_y)**2) - + displacement = np.sqrt((newest_x - oldest_x) ** 2 + (newest_y - oldest_y) ** 2) + # Check if we're stuck - moved less than threshold over minimum time # Only consider it if the time range makes sense (positive and sufficient) - is_currently_stuck = (time_range >= self.stuck_time_threshold and - time_range <= self.stuck_detection_window_seconds and - displacement < self.stuck_distance_threshold) - + is_currently_stuck = ( + time_range >= self.stuck_time_threshold + and time_range <= self.stuck_detection_window_seconds + and displacement < self.stuck_distance_threshold + ) + if is_currently_stuck: - logger.warning(f"Robot appears to be stuck! Displacement {displacement:.3f}m over {time_range:.1f}s") - + logger.warning( + f"Robot appears to be stuck! Displacement {displacement:.3f}m over {time_range:.1f}s" + ) + # Don't trigger recovery if it's already active if not self.is_recovery_active: self.is_recovery_active = True self.recovery_start_time = current_time return True - + # Check if we've been trying to recover for too long elif current_time - self.recovery_start_time > self.recovery_duration: - logger.error(f"Recovery behavior has been active for {self.recovery_duration}s without success") + logger.error( + f"Recovery behavior has been active for {self.recovery_duration}s without success" + ) # Reset recovery state - maybe a different behavior will work self.is_recovery_active = False self.recovery_start_time = current_time - + # If we've moved enough, we're not stuck anymore elif self.is_recovery_active and displacement > self.unstuck_distance_threshold: logger.info(f"Robot has escaped from stuck state (moved {displacement:.3f}m)") self.is_recovery_active = False - + return self.is_recovery_active - + def execute_recovery_behavior(self) -> Dict[str, float]: """ Execute a recovery behavior when the robot is stuck. - + Returns: Dict[str, float]: Velocity commands for the recovery behavior """ # Calculate how long we've been in recovery recovery_time = time.time() - self.recovery_start_time - + # Calculate recovery phases based on control frequency backup_phase_time = 3.0 # seconds rotate_phase_time = 2.0 # seconds - + # Simple recovery behavior state machine if recovery_time < backup_phase_time: # First try backing up logger.info("Recovery: backing up") - return {'x_vel': -0.2, 'angular_vel': 0.0} + return {"x_vel": -0.2, "angular_vel": 0.0} elif recovery_time < backup_phase_time + rotate_phase_time: # Then try rotating logger.info("Recovery: rotating to find new path") rotation_direction = 1.0 if np.random.random() > 0.5 else -1.0 - return {'x_vel': 0.0, 'angular_vel': rotation_direction * self.max_angular_vel * 0.7} + return {"x_vel": 0.0, "angular_vel": rotation_direction * self.max_angular_vel * 0.7} else: # If we're still stuck after backup and rotation, terminate navigation logger.error("Recovery failed after backup and rotation. Navigation terminated.") # Set a flag to indicate navigation should terminate self.navigation_failed = True # Stop the robot - return {'x_vel': 0.0, 'angular_vel': 0.0} + return {"x_vel": 0.0, "angular_vel": 0.0} + def navigate_to_goal_local( - robot, goal_xy_robot: Tuple[float, float], goal_theta: Optional[float] = None, distance: float = 0.0, timeout: float = 60.0, - stop_event: Optional[threading.Event] = None + robot, + goal_xy_robot: Tuple[float, float], + goal_theta: Optional[float] = None, + distance: float = 0.0, + timeout: float = 60.0, + stop_event: Optional[threading.Event] = None, ) -> bool: """ Navigates the robot to a goal specified in the robot's local frame @@ -801,29 +854,31 @@ def navigate_to_goal_local( Returns: bool: True if the goal was reached within the timeout, False otherwise. """ - logger.info(f"Starting navigation to local goal {goal_xy_robot} with distance {distance}m and timeout {timeout}s.") + logger.info( + f"Starting navigation to local goal {goal_xy_robot} with distance {distance}m and timeout {timeout}s." + ) goal_x, goal_y = goal_xy_robot - + # Calculate goal orientation to face the target if goal_theta is None: goal_theta = np.arctan2(goal_y, goal_x) - + # If distance is non-zero, adjust the goal to stop at the desired distance if distance > 0: # Calculate magnitude of the goal vector goal_distance = np.sqrt(goal_x**2 + goal_y**2) - + # Only adjust if goal is further than the desired distance if goal_distance > distance: goal_x, goal_y = distance_angle_to_goal_xy(goal_distance - distance, goal_theta) - + # Set the goal in the robot's frame with orientation to face the original target robot.local_planner.set_goal((goal_x, goal_y), frame="base_link", goal_theta=goal_theta) - + # Get control period from robot's local planner for consistent timing control_period = 1.0 / robot.local_planner.control_frequency - + start_time = time.time() goal_reached = False @@ -834,7 +889,7 @@ def navigate_to_goal_local( logger.info("Goal reached successfully.") goal_reached = True break - + # Check if navigation failed flag is set if robot.local_planner.navigation_failed: logger.error("Navigation aborted due to repeated recovery failures.") @@ -867,9 +922,13 @@ def navigate_to_goal_local( return goal_reached + def navigate_path_local( - robot, path: Path, timeout: float = 120.0, goal_theta: Optional[float] = None, - stop_event: Optional[threading.Event] = None + robot, + path: Path, + timeout: float = 120.0, + goal_theta: Optional[float] = None, + stop_event: Optional[threading.Event] = None, ) -> bool: """ Navigates the robot along a path of waypoints using the waypoint following capability @@ -885,14 +944,16 @@ def navigate_path_local( Returns: bool: True if the entire path was successfully followed, False otherwise """ - logger.info(f"Starting navigation along path with {len(path)} waypoints and timeout {timeout}s.") + logger.info( + f"Starting navigation along path with {len(path)} waypoints and timeout {timeout}s." + ) # Set the path in the local planner robot.local_planner.set_goal_waypoints(path, goal_theta=goal_theta) - + # Get control period from robot's local planner for consistent timing control_period = 1.0 / robot.local_planner.control_frequency - + start_time = time.time() path_completed = False @@ -903,7 +964,7 @@ def navigate_path_local( logger.info("Path traversed successfully.") path_completed = True break - + # Check if navigation failed flag is set if robot.local_planner.navigation_failed: logger.error("Navigation aborted due to repeated recovery failures.") @@ -922,7 +983,9 @@ def navigate_path_local( time.sleep(control_period) if not path_completed: - logger.warning(f"Path following timed out after {timeout} seconds before completing the path.") + logger.warning( + f"Path following timed out after {timeout} seconds before completing the path." + ) except KeyboardInterrupt: logger.info("Path navigation interrupted by user.") @@ -936,25 +999,26 @@ def navigate_path_local( return path_completed + def visualize_local_planner_state( - occupancy_grid: np.ndarray, - grid_resolution: float, - grid_origin: Tuple[float, float, float], - robot_pose: Tuple[float, float, float], - visualization_size: int = 400, - robot_width: float = 0.5, + occupancy_grid: np.ndarray, + grid_resolution: float, + grid_origin: Tuple[float, float, float], + robot_pose: Tuple[float, float, float], + visualization_size: int = 400, + robot_width: float = 0.5, robot_length: float = 0.7, map_size_meters: float = 10.0, - goal_xy: Optional[Tuple[float, float]] = None, + goal_xy: Optional[Tuple[float, float]] = None, goal_theta: Optional[float] = None, histogram: Optional[np.ndarray] = None, selected_direction: Optional[float] = None, - waypoints: Optional['Path'] = None, - current_waypoint_index: Optional[int] = None + waypoints: Optional["Path"] = None, + current_waypoint_index: Optional[int] = None, ) -> np.ndarray: """Generate a bird's eye view visualization of the local costmap. Optionally includes VFH histogram, selected direction, and waypoints path. - + Args: occupancy_grid: 2D numpy array of the occupancy grid grid_resolution: Resolution of the grid in meters/cell @@ -971,34 +1035,36 @@ def visualize_local_planner_state( waypoints: Optional Path object containing waypoints to visualize current_waypoint_index: Optional index of the current target waypoint """ - + robot_x, robot_y, robot_theta = robot_pose grid_origin_x, grid_origin_y, _ = grid_origin vis_size = visualization_size scale = vis_size / map_size_meters - + vis_img = np.ones((vis_size, vis_size, 3), dtype=np.uint8) * 255 center_x = vis_size // 2 center_y = vis_size // 2 - + grid_height, grid_width = occupancy_grid.shape - + # Calculate robot position relative to grid origin robot_rel_x = robot_x - grid_origin_x robot_rel_y = robot_y - grid_origin_y robot_cell_x = int(robot_rel_x / grid_resolution) robot_cell_y = int(robot_rel_y / grid_resolution) - + half_size_cells = int(map_size_meters / grid_resolution / 2) # Draw grid cells (using standard occupancy coloring) - for y in range(max(0, robot_cell_y - half_size_cells), - min(grid_height, robot_cell_y + half_size_cells)): - for x in range(max(0, robot_cell_x - half_size_cells), - min(grid_width, robot_cell_x + half_size_cells)): + for y in range( + max(0, robot_cell_y - half_size_cells), min(grid_height, robot_cell_y + half_size_cells) + ): + for x in range( + max(0, robot_cell_x - half_size_cells), min(grid_width, robot_cell_x + half_size_cells) + ): cell_rel_x_meters = (x - robot_cell_x) * grid_resolution cell_rel_y_meters = (y - robot_cell_y) * grid_resolution - + img_x = int(center_x + cell_rel_x_meters * scale) img_y = int(center_y - cell_rel_y_meters * scale) # Flip y-axis @@ -1012,12 +1078,15 @@ def visualize_local_planner_state( # Scale darkness based on occupancy value (0-100) darkness = 255 - int(155 * (cell_value / 100)) - 100 color = (darkness, darkness, darkness) # Shades of gray/black - + cell_size_px = max(1, int(grid_resolution * scale)) - cv2.rectangle(vis_img, - (img_x - cell_size_px//2, img_y - cell_size_px//2), - (img_x + cell_size_px//2, img_y + cell_size_px//2), - color, -1) + cv2.rectangle( + vis_img, + (img_x - cell_size_px // 2, img_y - cell_size_px // 2), + (img_x + cell_size_px // 2, img_y + cell_size_px // 2), + color, + -1, + ) # Draw waypoints path if provided if waypoints is not None and len(waypoints) > 0: @@ -1028,24 +1097,26 @@ def visualize_local_planner_state( wp_x, wp_y = waypoint[0], waypoint[1] wp_rel_x = wp_x - robot_x wp_rel_y = wp_y - robot_y - + wp_img_x = int(center_x + wp_rel_x * scale) wp_img_y = int(center_y - wp_rel_y * scale) # Flip y-axis - + if 0 <= wp_img_x < vis_size and 0 <= wp_img_y < vis_size: path_points.append((wp_img_x, wp_img_y)) - + # Draw each waypoint as a small circle cv2.circle(vis_img, (wp_img_x, wp_img_y), 3, (0, 128, 0), -1) # Dark green dots - + # Highlight current target waypoint if current_waypoint_index is not None and i == current_waypoint_index: cv2.circle(vis_img, (wp_img_x, wp_img_y), 6, (0, 0, 255), 2) # Red circle - + # Connect waypoints with lines to show the path if len(path_points) > 1: for i in range(len(path_points) - 1): - cv2.line(vis_img, path_points[i], path_points[i + 1], (0, 200, 0), 1) # Green line + cv2.line( + vis_img, path_points[i], path_points[i + 1], (0, 200, 0), 1 + ) # Green line except Exception as e: logger.error(f"Error drawing waypoints: {e}") @@ -1055,26 +1126,26 @@ def visualize_local_planner_state( # Find absolute maximum value (ignoring any negative debug values) abs_histogram = np.abs(histogram) max_hist_value = np.max(abs_histogram) if np.max(abs_histogram) > 0 else 1.0 - hist_scale = (vis_size / 2) * 0.8 # Scale histogram lines to 80% of half the viz size - + hist_scale = (vis_size / 2) * 0.8 # Scale histogram lines to 80% of half the viz size + for i in range(num_bins): # Angle relative to robot's forward direction angle_relative_to_robot = (i / num_bins) * 2 * math.pi - math.pi # Angle in the visualization frame (relative to image +X axis) - vis_angle = angle_relative_to_robot + robot_theta - + vis_angle = angle_relative_to_robot + robot_theta + # Get the value and check if it's a special debug value (negative) hist_val = histogram[i] is_debug_value = hist_val < 0 - + # Use absolute value for line length normalized_val = min(1.0, abs(hist_val) / max_hist_value) line_length = normalized_val * hist_scale - + # Calculate endpoint using the visualization angle end_x = int(center_x + line_length * math.cos(vis_angle)) - end_y = int(center_y - line_length * math.sin(vis_angle)) # Flipped Y - + end_y = int(center_y - line_length * math.sin(vis_angle)) # Flipped Y + # Color based on value and whether it's a debug value if is_debug_value: # Use green for debug values (minimum cost bin) @@ -1086,28 +1157,37 @@ def visualize_local_planner_state( red = min(255, int(normalized_val * 255)) color = (blue, 0, red) # BGR format: obstacles are redder, clear areas are bluer line_width = 1 - + cv2.line(vis_img, (center_x, center_y), (end_x, end_y), color, line_width) # Draw robot robot_length_px = int(robot_length * scale) robot_width_px = int(robot_width * scale) - robot_pts = np.array([ - [-robot_length_px/2, -robot_width_px/2], [robot_length_px/2, -robot_width_px/2], - [robot_length_px/2, robot_width_px/2], [-robot_length_px/2, robot_width_px/2] - ], dtype=np.float32) - rotation_matrix = np.array([ - [math.cos(robot_theta), -math.sin(robot_theta)], - [math.sin(robot_theta), math.cos(robot_theta)] - ]) + robot_pts = np.array( + [ + [-robot_length_px / 2, -robot_width_px / 2], + [robot_length_px / 2, -robot_width_px / 2], + [robot_length_px / 2, robot_width_px / 2], + [-robot_length_px / 2, robot_width_px / 2], + ], + dtype=np.float32, + ) + rotation_matrix = np.array( + [ + [math.cos(robot_theta), -math.sin(robot_theta)], + [math.sin(robot_theta), math.cos(robot_theta)], + ] + ) robot_pts = np.dot(robot_pts, rotation_matrix.T) robot_pts[:, 0] += center_x robot_pts[:, 1] = center_y - robot_pts[:, 1] # Flip y-axis - cv2.fillPoly(vis_img, [robot_pts.reshape((-1, 1, 2)).astype(np.int32)], (0, 0, 255)) # Red robot + cv2.fillPoly( + vis_img, [robot_pts.reshape((-1, 1, 2)).astype(np.int32)], (0, 0, 255) + ) # Red robot # Draw robot direction line - front_x = int(center_x + (robot_length_px/2) * math.cos(robot_theta)) - front_y = int(center_y - (robot_length_px/2) * math.sin(robot_theta)) + front_x = int(center_x + (robot_length_px / 2) * math.cos(robot_theta)) + front_y = int(center_y - (robot_length_px / 2) * math.sin(robot_theta)) cv2.line(vis_img, (center_x, center_y), (front_x, front_y), (255, 0, 0), 2) # Blue line # Draw selected direction @@ -1117,12 +1197,14 @@ def visualize_local_planner_state( vis_angle_selected = selected_direction + robot_theta # Make slightly longer than max histogram line - sel_dir_line_length = (vis_size / 2) * 0.9 + sel_dir_line_length = (vis_size / 2) * 0.9 sel_end_x = int(center_x + sel_dir_line_length * math.cos(vis_angle_selected)) - sel_end_y = int(center_y - sel_dir_line_length * math.sin(vis_angle_selected)) # Flipped Y - - cv2.line(vis_img, (center_x, center_y), (sel_end_x, sel_end_y), (0, 165, 255), 2) # BGR for Orange + sel_end_y = int(center_y - sel_dir_line_length * math.sin(vis_angle_selected)) # Flipped Y + + cv2.line( + vis_img, (center_x, center_y), (sel_end_x, sel_end_y), (0, 165, 255), 2 + ) # BGR for Orange # Draw goal if goal_xy is not None: @@ -1133,7 +1215,7 @@ def visualize_local_planner_state( goal_img_y = int(center_y - goal_rel_y_map * scale) # Flip y-axis if 0 <= goal_img_x < vis_size and 0 <= goal_img_y < vis_size: cv2.circle(vis_img, (goal_img_x, goal_img_y), 5, (0, 255, 0), -1) # Green circle - cv2.circle(vis_img, (goal_img_x, goal_img_y), 8, (0, 0, 0), 1) # Black outline + cv2.circle(vis_img, (goal_img_x, goal_img_y), 8, (0, 0, 0), 1) # Black outline # Draw goal orientation if goal_theta is not None and goal_xy is not None: @@ -1145,32 +1227,43 @@ def visualize_local_planner_state( else: # Use the current goal position goal_x, goal_y = goal_xy - + goal_rel_x_map = goal_x - robot_x goal_rel_y_map = goal_y - robot_y goal_img_x = int(center_x + goal_rel_x_map * scale) goal_img_y = int(center_y - goal_rel_y_map * scale) # Flip y-axis - + # Calculate goal orientation vector direction in visualization frame # goal_theta is already in odom frame, need to adjust for visualization orientation goal_dir_length = 30 # Length of direction indicator in pixels goal_dir_end_x = int(goal_img_x + goal_dir_length * math.cos(goal_theta)) goal_dir_end_y = int(goal_img_y - goal_dir_length * math.sin(goal_theta)) # Flip y-axis - + # Draw goal orientation arrow if 0 <= goal_img_x < vis_size and 0 <= goal_img_y < vis_size: - cv2.arrowedLine(vis_img, (goal_img_x, goal_img_y), (goal_dir_end_x, goal_dir_end_y), - (255, 0, 255), 4) # Magenta arrow + cv2.arrowedLine( + vis_img, + (goal_img_x, goal_img_y), + (goal_dir_end_x, goal_dir_end_y), + (255, 0, 255), + 4, + ) # Magenta arrow # Add scale bar scale_bar_length_px = int(1.0 * scale) scale_bar_x = vis_size - scale_bar_length_px - 10 scale_bar_y = vis_size - 20 - cv2.line(vis_img, (scale_bar_x, scale_bar_y), - (scale_bar_x + scale_bar_length_px, scale_bar_y), (0, 0, 0), 2) - cv2.putText(vis_img, "1m", (scale_bar_x, scale_bar_y - 5), - cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 0), 1) - + cv2.line( + vis_img, + (scale_bar_x, scale_bar_y), + (scale_bar_x + scale_bar_length_px, scale_bar_y), + (0, 0, 0), + 2, + ) + cv2.putText( + vis_img, "1m", (scale_bar_x, scale_bar_y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.4, (0, 0, 0), 1 + ) + # Add status info status_text = [] if waypoints is not None: @@ -1178,11 +1271,10 @@ def visualize_local_planner_state( status_text.append(f"WP: {current_waypoint_index}/{len(waypoints)}") else: status_text.append(f"WPs: {len(waypoints)}") - + y_pos = 20 for text in status_text: - cv2.putText(vis_img, text, (10, y_pos), - cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1) + cv2.putText(vis_img, text, (10, y_pos), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (0, 0, 0), 1) y_pos += 20 - return vis_img \ No newline at end of file + return vis_img diff --git a/dimos/robot/local_planner/vfh_local_planner.py b/dimos/robot/local_planner/vfh_local_planner.py index 53d4588bf3..d133c3ade8 100644 --- a/dimos/robot/local_planner/vfh_local_planner.py +++ b/dimos/robot/local_planner/vfh_local_planner.py @@ -1,11 +1,9 @@ #!/usr/bin/env python3 -import math import numpy as np from typing import Dict, Tuple, Optional, Callable import cv2 import logging -import time from dimos.utils.logging_config import setup_logger from dimos.utils.ros_utils import normalize_angle @@ -16,31 +14,34 @@ logger = setup_logger("dimos.robot.unitree.vfh_local_planner", level=logging.DEBUG) + class VFHPurePursuitPlanner(BaseLocalPlanner): """ A local planner that combines Vector Field Histogram (VFH) for obstacle avoidance with Pure Pursuit for goal tracking. """ - - def __init__(self, - get_costmap: Callable[[], Optional[OccupancyGrid]], - transform: object, - move_vel_control: Callable[[float, float, float], None], - safety_threshold: float = 0.8, - histogram_bins: int = 144, - max_linear_vel: float = 0.8, - max_angular_vel: float = 1.0, - lookahead_distance: float = 1.0, - goal_tolerance: float = 0.2, - angle_tolerance: float = 0.1, # ~5.7 degrees - robot_width: float = 0.5, - robot_length: float = 0.7, - visualization_size: int = 400, - control_frequency: float = 10.0, - safe_goal_distance: float = 1.0): + + def __init__( + self, + get_costmap: Callable[[], Optional[OccupancyGrid]], + transform: object, + move_vel_control: Callable[[float, float, float], None], + safety_threshold: float = 0.8, + histogram_bins: int = 144, + max_linear_vel: float = 0.8, + max_angular_vel: float = 1.0, + lookahead_distance: float = 1.0, + goal_tolerance: float = 0.2, + angle_tolerance: float = 0.1, # ~5.7 degrees + robot_width: float = 0.5, + robot_length: float = 0.7, + visualization_size: int = 400, + control_frequency: float = 10.0, + safe_goal_distance: float = 1.0, + ): """ Initialize the VFH + Pure Pursuit planner. - + Args: get_costmap: Function to get the latest local costmap transform: Object with transform methods (transform_point, transform_rot, etc.) @@ -73,14 +74,14 @@ def __init__(self, robot_length=robot_length, visualization_size=visualization_size, control_frequency=control_frequency, - safe_goal_distance=safe_goal_distance + safe_goal_distance=safe_goal_distance, ) - + # VFH specific parameters self.histogram_bins = histogram_bins self.histogram = None self.selected_direction = None - + # VFH tuning parameters self.alpha = 0.2 # Histogram smoothing factor self.obstacle_weight = 10.0 @@ -93,12 +94,12 @@ def __init__(self, # Add after other initialization self.angle_mapping = np.linspace(-np.pi, np.pi, self.histogram_bins, endpoint=False) - self.smoothing_kernel = np.array([self.alpha, (1-2*self.alpha), self.alpha]) + self.smoothing_kernel = np.array([self.alpha, (1 - 2 * self.alpha), self.alpha]) def _compute_velocity_commands(self) -> Dict[str, float]: """ VFH + Pure Pursuit specific implementation of velocity command computation. - + Returns: Dict[str, float]: Velocity commands with 'x_vel' and 'angular_vel' keys """ @@ -106,12 +107,12 @@ def _compute_velocity_commands(self) -> Dict[str, float]: costmap = self.get_costmap() if costmap is None: logger.warning("No costmap available for planning") - return {'x_vel': 0.0, 'angular_vel': 0.0} - + return {"x_vel": 0.0, "angular_vel": 0.0} + [pos, rot] = self.transform.transform_euler("base_link", "odom") robot_x, robot_y, robot_theta = pos[0], pos[1], rot[2] robot_pose = (robot_x, robot_y, robot_theta) - + # Calculate goal-related parameters goal_x, goal_y = self.goal_xy dx = goal_x - robot_x @@ -119,18 +120,18 @@ def _compute_velocity_commands(self) -> Dict[str, float]: goal_distance = np.linalg.norm([dx, dy]) goal_direction = np.arctan2(dy, dx) - robot_theta goal_direction = normalize_angle(goal_direction) - + self.histogram = self.build_polar_histogram(costmap, robot_pose) - + # If we're ignoring obstacles near the goal, zero out the histogram if self.ignore_obstacles: self.histogram = np.zeros_like(self.histogram) - + self.selected_direction = self.select_direction( self.goal_weight, self.obstacle_weight, self.prev_direction_weight, - self.histogram, + self.histogram, goal_direction, ) @@ -140,45 +141,51 @@ def _compute_velocity_commands(self) -> Dict[str, float]: # Slow down when turning sharply if abs(self.selected_direction) > 0.25: # ~15 degrees # Scale from 1.0 (small turn) to 0.5 (sharp turn at 90 degrees or more) - turn_factor = max(0.25, 1.0 - (abs(self.selected_direction) / (np.pi/2))) + turn_factor = max(0.25, 1.0 - (abs(self.selected_direction) / (np.pi / 2))) linear_vel *= turn_factor # Apply Collision Avoidance Stop - skip if ignoring obstacles - if not self.ignore_obstacles and self.check_collision(self.selected_direction, safety_threshold=0.5): + if not self.ignore_obstacles and self.check_collision( + self.selected_direction, safety_threshold=0.5 + ): # Re-select direction prioritizing obstacle avoidance if colliding self.selected_direction = self.select_direction( self.goal_weight * 0.2, self.obstacle_weight, self.prev_direction_weight * 0.2, self.histogram, - goal_direction + goal_direction, + ) + linear_vel, angular_vel = self.compute_pure_pursuit( + goal_distance, self.selected_direction ) - linear_vel, angular_vel = self.compute_pure_pursuit(goal_distance, self.selected_direction) if self.check_collision(0.0, safety_threshold=self.safety_threshold): logger.warning("Collision detected ahead. Stopping.") linear_vel = 0.0 self.prev_linear_vel = linear_vel - filtered_linear_vel = self.prev_linear_vel * self.linear_vel_filter_factor + linear_vel * (1 - self.linear_vel_filter_factor) + filtered_linear_vel = self.prev_linear_vel * self.linear_vel_filter_factor + linear_vel * ( + 1 - self.linear_vel_filter_factor + ) + + return {"x_vel": filtered_linear_vel, "angular_vel": angular_vel} - return {'x_vel': filtered_linear_vel, 'angular_vel': angular_vel} - def _smooth_histogram(self, histogram: np.ndarray) -> np.ndarray: """ Apply advanced smoothing to the polar histogram to better identify valleys and reduce noise. - + Args: histogram: Raw histogram to smooth - + Returns: np.ndarray: Smoothed histogram """ # Apply a windowed average with variable width based on obstacle density smoothed = np.zeros_like(histogram) bins = len(histogram) - + # First pass: basic smoothing with a 5-point kernel # This uses a wider window than the original 3-point smoother for i in range(bins): @@ -187,14 +194,14 @@ def _smooth_histogram(self, histogram: np.ndarray) -> np.ndarray: # Apply weighted average (more weight to the center) weights = [0.1, 0.2, 0.4, 0.2, 0.1] # Sum = 1.0 smoothed[i] = sum(histogram[idx] * weight for idx, weight in zip(indices, weights)) - + # Second pass: peak and valley enhancement enhanced = np.zeros_like(smoothed) for i in range(bins): # Check neighboring values prev_idx = (i - 1) % bins next_idx = (i + 1) % bins - + # Enhance valleys (low values) if smoothed[i] < smoothed[prev_idx] and smoothed[i] < smoothed[next_idx]: # It's a local minimum - make it even lower @@ -205,142 +212,148 @@ def _smooth_histogram(self, histogram: np.ndarray) -> np.ndarray: enhanced[i] = min(1.0, smoothed[i] * 1.2) else: enhanced[i] = smoothed[i] - + return enhanced def build_polar_histogram(self, costmap: Costmap, robot_pose: Tuple[float, float, float]): """ Build a polar histogram of obstacle densities around the robot. - + Args: costmap: Costmap object with grid and metadata robot_pose: Tuple (x, y, theta) of the robot pose in the odom frame - + Returns: np.ndarray: Polar histogram of obstacle densities """ - + # Get grid and find all obstacle cells occupancy_grid = costmap.grid y_indices, x_indices = np.where(occupancy_grid > 0) if len(y_indices) == 0: # No obstacles return np.zeros(self.histogram_bins) - + # Get robot position in grid coordinates robot_x, robot_y, robot_theta = robot_pose robot_point = costmap.world_to_grid((robot_x, robot_y)) robot_cell_x, robot_cell_y = robot_point.x, robot_point.y - + # Vectorized distance and angle calculation dx_cells = x_indices - robot_cell_x dy_cells = y_indices - robot_cell_y distances = np.sqrt(dx_cells**2 + dy_cells**2) * costmap.resolution angles_grid = np.arctan2(dy_cells, dx_cells) angles_robot = normalize_angle(angles_grid - robot_theta) - + # Convert to bin indices - bin_indices = ((angles_robot + np.pi) / (2 * np.pi) * self.histogram_bins).astype(int) % self.histogram_bins - + bin_indices = ((angles_robot + np.pi) / (2 * np.pi) * self.histogram_bins).astype( + int + ) % self.histogram_bins + # Get obstacle values obstacle_values = occupancy_grid[y_indices, x_indices] / 100.0 - + # Build histogram histogram = np.zeros(self.histogram_bins) mask = distances > 0 # Weight obstacles by inverse square of distance and cell value np.add.at(histogram, bin_indices[mask], obstacle_values[mask] / (distances[mask] ** 2)) - + # Apply the enhanced smoothing return self._smooth_histogram(histogram) - - def select_direction(self, goal_weight, obstacle_weight, prev_direction_weight, histogram, goal_direction): + + def select_direction( + self, goal_weight, obstacle_weight, prev_direction_weight, histogram, goal_direction + ): """ Select best direction based on a simple weighted cost function. - + Args: goal_weight: Weight for the goal direction component obstacle_weight: Weight for the obstacle avoidance component prev_direction_weight: Weight for previous direction consistency histogram: Polar histogram of obstacle density goal_direction: Desired direction to goal - + Returns: float: Selected direction in radians """ # Normalize histogram if needed if np.max(histogram) > 0: histogram = histogram / np.max(histogram) - + # Calculate costs for each possible direction angle_diffs = np.abs(normalize_angle(self.angle_mapping - goal_direction)) prev_diffs = np.abs(normalize_angle(self.angle_mapping - self.prev_selected_angle)) - + # Combine costs with weights obstacle_costs = obstacle_weight * histogram goal_costs = goal_weight * angle_diffs prev_costs = prev_direction_weight * prev_diffs - + total_costs = obstacle_costs + goal_costs + prev_costs - + # Select direction with lowest cost min_cost_idx = np.argmin(total_costs) selected_angle = self.angle_mapping[min_cost_idx] - + # Update history for next iteration self.prev_selected_angle = selected_angle - + return selected_angle - - def compute_pure_pursuit(self, goal_distance: float, goal_direction: float) -> Tuple[float, float]: - """ Compute pure pursuit velocities.""" + + def compute_pure_pursuit( + self, goal_distance: float, goal_direction: float + ) -> Tuple[float, float]: + """Compute pure pursuit velocities.""" if goal_distance < self.goal_tolerance: return 0.0, 0.0 - + lookahead = min(self.lookahead_distance, goal_distance) linear_vel = min(self.max_linear_vel, goal_distance) angular_vel = 2.0 * np.sin(goal_direction) / lookahead angular_vel = max(-self.max_angular_vel, min(angular_vel, self.max_angular_vel)) - + return linear_vel, angular_vel - + def check_collision(self, selected_direction: float, safety_threshold: float = 1.0) -> bool: """Check if there's an obstacle in the selected direction within safety threshold.""" # Skip collision check if ignoring obstacles if self.ignore_obstacles: return False - + # Get the latest costmap and robot pose costmap = self.get_costmap() if costmap is None: return False # No costmap available - + [pos, rot] = self.transform.transform_euler("base_link", "odom") robot_x, robot_y, robot_theta = pos[0], pos[1], rot[2] - + # Direction in world frame direction_world = robot_theta + selected_direction - + # Safety distance in cells safety_cells = int(safety_threshold / costmap.resolution) - + # Get robot position in grid coordinates robot_point = costmap.world_to_grid((robot_x, robot_y)) robot_cell_x, robot_cell_y = robot_point.x, robot_point.y - + # Check for obstacles along the selected direction for dist in range(1, safety_cells + 1): # Calculate cell position cell_x = robot_cell_x + int(dist * np.cos(direction_world)) cell_y = robot_cell_y + int(dist * np.sin(direction_world)) - + # Check if cell is within grid bounds if not (0 <= cell_x < costmap.width and 0 <= cell_y < costmap.height): continue - + # Check if cell contains an obstacle (threshold at 50) if costmap.grid[int(cell_y), int(cell_x)] > 50: return True - + return False # No collision detected def update_visualization(self) -> np.ndarray: @@ -349,45 +362,55 @@ def update_visualization(self) -> np.ndarray: costmap = self.get_costmap() if costmap is None: raise ValueError("Costmap is None") - + [pos, rot] = self.transform.transform_euler("base_link", "odom") robot_x, robot_y, robot_theta = pos[0], pos[1], rot[2] robot_pose = (robot_x, robot_y, robot_theta) - - goal_xy = self.goal_xy # This could be a lookahead point or final goal - + + goal_xy = self.goal_xy # This could be a lookahead point or final goal + # Get the latest histogram and selected direction, if available - histogram = getattr(self, 'histogram', None) - selected_direction = getattr(self, 'selected_direction', None) - + histogram = getattr(self, "histogram", None) + selected_direction = getattr(self, "selected_direction", None) + # Get waypoint data if in waypoint mode waypoints_to_draw = self.waypoints_in_odom - current_wp_index_to_draw = self.current_waypoint_index if self.waypoints_in_odom is not None else None + current_wp_index_to_draw = ( + self.current_waypoint_index if self.waypoints_in_odom is not None else None + ) # Ensure index is valid before passing - if waypoints_to_draw is not None and current_wp_index_to_draw is not None: + if waypoints_to_draw is not None and current_wp_index_to_draw is not None: if not (0 <= current_wp_index_to_draw < len(waypoints_to_draw)): - current_wp_index_to_draw = None # Invalidate index if out of bounds + current_wp_index_to_draw = None # Invalidate index if out of bounds return visualize_local_planner_state( occupancy_grid=costmap.grid, grid_resolution=costmap.resolution, grid_origin=(costmap.origin.x, costmap.origin.y, costmap.origin_theta), robot_pose=robot_pose, - goal_xy=goal_xy, # Current target (lookahead or final) - goal_theta=self.goal_theta, # Pass goal orientation if available + goal_xy=goal_xy, # Current target (lookahead or final) + goal_theta=self.goal_theta, # Pass goal orientation if available visualization_size=self.visualization_size, robot_width=self.robot_width, robot_length=self.robot_length, - histogram=histogram, + histogram=histogram, selected_direction=selected_direction, - waypoints=waypoints_to_draw, # Pass the full path - current_waypoint_index=current_wp_index_to_draw # Pass the target index + waypoints=waypoints_to_draw, # Pass the full path + current_waypoint_index=current_wp_index_to_draw, # Pass the target index ) except Exception as e: logger.error(f"Error during visualization update: {e}") # Return a blank image with error text - blank = np.ones((self.visualization_size, self.visualization_size, 3), dtype=np.uint8) * 255 - cv2.putText(blank, "Viz Error", - (self.visualization_size // 4, self.visualization_size // 2), - cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 0, 0), 2) + blank = ( + np.ones((self.visualization_size, self.visualization_size, 3), dtype=np.uint8) * 255 + ) + cv2.putText( + blank, + "Viz Error", + (self.visualization_size // 4, self.visualization_size // 2), + cv2.FONT_HERSHEY_SIMPLEX, + 1, + (0, 0, 0), + 2, + ) return blank diff --git a/dimos/robot/position_stream.py b/dimos/robot/position_stream.py index 9a59fe012a..05d80b8bcf 100644 --- a/dimos/robot/position_stream.py +++ b/dimos/robot/position_stream.py @@ -19,12 +19,10 @@ """ import logging -import numpy as np -from typing import Tuple, Optional, Callable, Dict, Any +from typing import Tuple, Optional import time from reactivex import Subject, Observable from reactivex import operators as ops -import rclpy from rclpy.node import Node from geometry_msgs.msg import PoseStamped from nav_msgs.msg import Odometry @@ -33,24 +31,25 @@ logger = setup_logger("dimos.robot.position_stream", level=logging.INFO) + class PositionStreamProvider: """ A provider for streaming position updates from ROS. - + This class creates an Observable stream of position updates by subscribing to ROS odometry or pose topics. """ - + def __init__( self, ros_node: Node, odometry_topic: str = "/odom", pose_topic: Optional[str] = None, - use_odometry: bool = True + use_odometry: bool = True, ): """ Initialize the position stream provider. - + Args: ros_node: ROS node to use for subscriptions odometry_topic: Name of the odometry topic (if use_odometry is True) @@ -61,108 +60,103 @@ def __init__( self.odometry_topic = odometry_topic self.pose_topic = pose_topic self.use_odometry = use_odometry - + self._subject = Subject() - + self.last_position = None self.last_update_time = None - + self._create_subscription() - - logger.info(f"PositionStreamProvider initialized with " - f"{'odometry topic' if use_odometry else 'pose topic'}: " - f"{odometry_topic if use_odometry else pose_topic}") - + + logger.info( + f"PositionStreamProvider initialized with " + f"{'odometry topic' if use_odometry else 'pose topic'}: " + f"{odometry_topic if use_odometry else pose_topic}" + ) + def _create_subscription(self): """Create the appropriate ROS subscription based on configuration.""" if self.use_odometry: self.subscription = self.ros_node.create_subscription( - Odometry, - self.odometry_topic, - self._odometry_callback, - 10 + Odometry, self.odometry_topic, self._odometry_callback, 10 ) logger.info(f"Subscribed to odometry topic: {self.odometry_topic}") else: if not self.pose_topic: raise ValueError("Pose topic must be specified when use_odometry is False") - + self.subscription = self.ros_node.create_subscription( - PoseStamped, - self.pose_topic, - self._pose_callback, - 10 + PoseStamped, self.pose_topic, self._pose_callback, 10 ) logger.info(f"Subscribed to pose topic: {self.pose_topic}") - - + def _odometry_callback(self, msg: Odometry): """ Process odometry messages and extract position. - + Args: msg: Odometry message from ROS """ x = msg.pose.pose.position.x y = msg.pose.pose.position.y - + self._update_position(x, y) - + def _pose_callback(self, msg: PoseStamped): """ Process pose messages and extract position. - + Args: msg: PoseStamped message from ROS """ x = msg.pose.position.x y = msg.pose.position.y - + self._update_position(x, y) - + def _update_position(self, x: float, y: float): """ Update the current position and emit to subscribers. - + Args: x: X coordinate y: Y coordinate """ current_time = time.time() position = (x, y) - + if self.last_update_time: update_rate = 1.0 / (current_time - self.last_update_time) logger.debug(f"Position update rate: {update_rate:.1f} Hz") - + self.last_position = position self.last_update_time = current_time - + self._subject.on_next(position) logger.debug(f"Position updated: ({x:.2f}, {y:.2f})") - + def get_position_stream(self) -> Observable: """ Get an Observable stream of position updates. - + Returns: Observable that emits (x, y) tuples """ return self._subject.pipe( ops.share() # Share the stream among multiple subscribers ) - + def get_current_position(self) -> Optional[Tuple[float, float]]: """ Get the most recent position. - + Returns: Tuple of (x, y) coordinates, or None if no position has been received """ return self.last_position - + def cleanup(self): """Clean up resources.""" - if hasattr(self, 'subscription') and self.subscription: + if hasattr(self, "subscription") and self.subscription: self.ros_node.destroy_subscription(self.subscription) logger.info("Position subscription destroyed") diff --git a/dimos/robot/recorder.py b/dimos/robot/recorder.py index 8f5ccc9218..56b6cea888 100644 --- a/dimos/robot/recorder.py +++ b/dimos/robot/recorder.py @@ -17,9 +17,9 @@ import threading import time from queue import Queue -from typing import Any, Callable, Literal +from typing import Callable, Literal -#from dimos.data.recording import Recorder +# from dimos.data.recording import Recorder class RobotRecorder: @@ -125,7 +125,9 @@ def _process_queue(self) -> None: """Processes the recording queue asynchronously.""" while True: image, instruction, action, state = self.recording_queue.get() - self.recorder.record(observation={"image": image, "instruction": instruction}, action=action, state=state) + self.recorder.record( + observation={"image": image, "instruction": instruction}, action=action, state=state + ) self.recording_queue.task_done() def record_current_state(self) -> None: @@ -154,4 +156,4 @@ def record_current_state(self) -> None: def record_last_state(self) -> None: """Records the final pose and image after the movement completes.""" - self.record_current_state() \ No newline at end of file + self.record_current_state() diff --git a/dimos/robot/robot.py b/dimos/robot/robot.py index ba1eb3cf58..aaf4b57083 100644 --- a/dimos/robot/robot.py +++ b/dimos/robot/robot.py @@ -14,31 +14,25 @@ """Base module for all DIMOS robots. -This module provides the foundation for all DIMOS robots, including both physical -and simulated implementations, with common functionality for movement, control, +This module provides the foundation for all DIMOS robots, including both physical +and simulated implementations, with common functionality for movement, control, and video streaming. """ from abc import ABC import os -import logging -from typing import TYPE_CHECKING, Optional, Dict, Tuple, Any +from typing import TYPE_CHECKING, Optional -import chromadb from dimos.hardware.interface import HardwareInterface from dimos.perception.spatial_perception import SpatialMemory -from dimos.agents.memory.visual_memory import VisualMemory -from dimos.types.robot_location import RobotLocation from dimos.utils.logging_config import setup_logger if TYPE_CHECKING: from dimos.robot.ros_control import ROSControl else: - ROSControl = 'ROSControl' + ROSControl = "ROSControl" from dimos.skills.skills import SkillLibrary -from dimos.stream.frame_processor import FrameProcessor -from dimos.stream.video_operators import VideoOperators as vops from reactivex import Observable, operators as ops from reactivex.disposable import CompositeDisposable from reactivex.scheduler import ThreadPoolScheduler @@ -47,13 +41,14 @@ logger = setup_logger("dimos.robot.robot") + class Robot(ABC): """Base class for all DIMOS robots. - + This abstract base class defines the common interface and functionality for all DIMOS robots, whether physical or simulated. It provides methods for movement, rotation, video streaming, and hardware configuration management. - + Attributes: agent_config: Configuration for the robot's agent. hardware_interface: Interface to the robot's hardware components. @@ -63,17 +58,19 @@ class Robot(ABC): pool_scheduler: Thread pool scheduler for managing concurrent operations. """ - def __init__(self, - hardware_interface: HardwareInterface = None, - ros_control: ROSControl = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "output"), - pool_scheduler: ThreadPoolScheduler = None, - skill_library: SkillLibrary = None, - spatial_memory_dir: str = None, - spatial_memory_collection: str = "spatial_memory", - new_memory: bool = False,): + def __init__( + self, + hardware_interface: HardwareInterface = None, + ros_control: ROSControl = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "output"), + pool_scheduler: ThreadPoolScheduler = None, + skill_library: SkillLibrary = None, + spatial_memory_dir: str = None, + spatial_memory_collection: str = "spatial_memory", + new_memory: bool = False, + ): """Initialize a Robot instance. - + Args: hardware_interface: Interface to the robot's hardware. Defaults to None. ros_control: ROS-based control system. Defaults to None. @@ -96,42 +93,38 @@ def __init__(self, # Create output directory if it doesn't exist logger.info(f"Robot outputs will be saved to: {self.output_dir}") - + # Initialize spatial memory properties - self.spatial_memory_dir = spatial_memory_dir or os.path.join(self.output_dir, "spatial_memory") + self.spatial_memory_dir = spatial_memory_dir or os.path.join( + self.output_dir, "spatial_memory" + ) self.spatial_memory_collection = spatial_memory_collection self.db_path = os.path.join(self.spatial_memory_dir, "chromadb_data") self.visual_memory_path = os.path.join(self.spatial_memory_dir, "visual_memory.pkl") - + # Create spatial memory directory os.makedirs(self.spatial_memory_dir, exist_ok=True) os.makedirs(self.db_path, exist_ok=True) - + # Import SpatialMemory here to avoid circular imports from dimos.perception.spatial_perception import SpatialMemory - + # Initialize spatial memory - this will be handled by SpatialMemory class video_stream = None transform_provider = None - + # Only create video stream if ROS control is available if self.ros_control is not None and self.ros_control.video_provider is not None: # Get video stream video_stream = self.get_ros_video_stream(fps=10) # Lower FPS for processing - + # Define transform provider def transform_provider(): position, rotation = self.ros_control.transform_euler("base_link") if position is None or rotation is None: - return { - "position": None, - "rotation": None - } - return { - "position": position, - "rotation": rotation - } - + return {"position": None, "rotation": None} + return {"position": position, "rotation": rotation} + # Create SpatialMemory instance - it will handle all initialization internally self._spatial_memory = SpatialMemory( collection_name=self.spatial_memory_collection, @@ -140,18 +133,18 @@ def transform_provider(): new_memory=new_memory, output_dir=self.spatial_memory_dir, video_stream=video_stream, - transform_provider=transform_provider + transform_provider=transform_provider, ) def get_ros_video_stream(self, fps: int = 30) -> Observable: """Get the ROS video stream with rate limiting and frame processing. - + Args: fps: Frames per second for the video stream. Defaults to 30. - + Returns: Observable: An observable stream of video frames. - + Raises: RuntimeError: If no ROS video provider is available. """ @@ -161,30 +154,29 @@ def get_ros_video_stream(self, fps: int = 30) -> Observable: print(f"Starting ROS video stream at {fps} FPS...") # Get base stream from video provider - video_stream = self.ros_control.video_provider.capture_video_as_observable( - fps=fps) + video_stream = self.ros_control.video_provider.capture_video_as_observable(fps=fps) # Add minimal processing pipeline with proper thread handling processed_stream = video_stream.pipe( ops.subscribe_on(self.pool_scheduler), ops.observe_on(self.pool_scheduler), # Ensure thread safety - ops.share() # Share the stream + ops.share(), # Share the stream ) return processed_stream def move(self, distance: float, speed: float = 0.5) -> bool: """Move the robot using velocity commands. - + DEPRECATED: Use move_vel instead for direct velocity control. - + Args: distance: Distance to move forward in meters (must be positive). speed: Speed to move at in m/s. Defaults to 0.5. - + Returns: bool: True if movement succeeded. - + Raises: RuntimeError: If no ROS control interface is available. """ @@ -192,16 +184,16 @@ def move(self, distance: float, speed: float = 0.5) -> bool: def reverse(self, distance: float, speed: float = 0.5) -> bool: """Move the robot backward by a specified distance. - + DEPRECATED: Use move_vel with negative x value instead for direct velocity control. - + Args: distance: Distance to move backward in meters (must be positive). speed: Speed to move at in m/s. Defaults to 0.5. - + Returns: bool: True if movement succeeded. - + Raises: RuntimeError: If no ROS control interface is available. """ @@ -211,25 +203,32 @@ def spin(self, degrees: float, speed: float = 45.0) -> bool: """Rotate the robot by a specified angle. Args: - degrees: Angle to rotate in degrees (positive for counter-clockwise, + degrees: Angle to rotate in degrees (positive for counter-clockwise, negative for clockwise). speed: Angular speed in degrees/second. Defaults to 45.0. - + Returns: bool: True if rotation succeeded. - + Raises: RuntimeError: If no ROS control interface is available. """ if self.ros_control is None: - raise RuntimeError( - "No ROS control interface available for rotation") + raise RuntimeError("No ROS control interface available for rotation") return self.ros_control.spin(degrees, speed) - def webrtc_req(self, api_id: int, topic: str = None, parameter: str = '', - priority: int = 0, request_id: str = None, data=None, timeout: float = 1000.0) -> bool: + def webrtc_req( + self, + api_id: int, + topic: str = None, + parameter: str = "", + priority: int = 0, + request_id: str = None, + data=None, + timeout: float = 1000.0, + ) -> bool: """Send a WebRTC request command to the robot. - + Args: api_id: The API ID for the command. topic: The API topic to publish to. Defaults to ROSControl.webrtc_api_topic. @@ -240,7 +239,7 @@ def webrtc_req(self, api_id: int, topic: str = None, parameter: str = '', Returns: bool: True if command was sent successfully. - + Raises: RuntimeError: If no ROS control interface is available. @@ -248,45 +247,45 @@ def webrtc_req(self, api_id: int, topic: str = None, parameter: str = '', if self.ros_control is None: raise RuntimeError("No ROS control interface available for WebRTC commands") return self.ros_control.queue_webrtc_req( - api_id=api_id, + api_id=api_id, topic=topic, - parameter=parameter, + parameter=parameter, priority=priority, request_id=request_id, data=data, - timeout=timeout + timeout=timeout, ) def move_vel(self, x: float, y: float, yaw: float, duration: float = 0.0) -> bool: """Move the robot using direct movement commands. - + Args: x: Forward/backward velocity (m/s) y: Left/right velocity (m/s) yaw: Rotational velocity (rad/s) duration: How long to move (seconds). If 0, command is continuous - + Returns: bool: True if command was sent successfully - + Raises: RuntimeError: If no ROS control interface is available. """ if self.ros_control is None: raise RuntimeError("No ROS control interface available for movement") return self.ros_control.move_vel(x, y, yaw, duration) - + def pose_command(self, roll: float, pitch: float, yaw: float) -> bool: """Send a pose command to the robot. - + Args: roll: Roll angle in radians. pitch: Pitch angle in radians. yaw: Yaw angle in radians. - + Returns: bool: True if command was sent successfully. - + Raises: RuntimeError: If no ROS control interface is available. """ @@ -294,10 +293,9 @@ def pose_command(self, roll: float, pitch: float, yaw: float) -> bool: raise RuntimeError("No ROS control interface available for pose commands") return self.ros_control.pose_command(roll, pitch, yaw) - def update_hardware_interface(self, - new_hardware_interface: HardwareInterface): + def update_hardware_interface(self, new_hardware_interface: HardwareInterface): """Update the hardware interface with a new configuration. - + Args: new_hardware_interface: New hardware interface to use for the robot. """ @@ -305,10 +303,10 @@ def update_hardware_interface(self, def get_hardware_configuration(self): """Retrieve the current hardware configuration. - + Returns: The current hardware configuration from the hardware interface. - + Raises: AttributeError: If hardware_interface is None. """ @@ -316,32 +314,26 @@ def get_hardware_configuration(self): def set_hardware_configuration(self, configuration): """Set a new hardware configuration. - + Args: configuration: The new hardware configuration to set. - + Raises: AttributeError: If hardware_interface is None. """ self.hardware_interface.set_configuration(configuration) - - - - def get_spatial_memory(self) -> Optional[SpatialMemory]: """Simple getter for the spatial memory instance. - + Returns: The spatial memory instance or None if not set. """ return self._spatial_memory if self._spatial_memory else None - - def cleanup(self): """Clean up resources used by the robot. - + This method should be called when the robot is no longer needed to ensure proper release of resources such as ROS connections and subscriptions. @@ -349,11 +341,12 @@ def cleanup(self): # Dispose of resources if self.disposables: self.disposables.dispose() - + if self.ros_control: self.ros_control.cleanup() self.disposables.dispose() + class MockRobot(Robot): def __init__(self): super().__init__() @@ -362,4 +355,4 @@ def __init__(self): self.skill_library = SkillLibrary() def my_print(self): - print("Hello, world!") \ No newline at end of file + print("Hello, world!") diff --git a/dimos/robot/ros_command_queue.py b/dimos/robot/ros_command_queue.py index ca69e2419c..fc48ce5cde 100644 --- a/dimos/robot/ros_command_queue.py +++ b/dimos/robot/ros_command_queue.py @@ -25,20 +25,23 @@ import uuid from enum import Enum, auto from queue import PriorityQueue, Empty -from typing import Callable, Optional, NamedTuple, Dict, Any, Tuple, List +from typing import Callable, Optional, NamedTuple, Dict, Any from dimos.utils.logging_config import setup_logger -import logging # Initialize logger for the ros command queue module logger = setup_logger("dimos.robot.ros_command_queue") + class CommandType(Enum): """Types of commands that can be queued""" + WEBRTC = auto() # WebRTC API requests - ACTION = auto() # Any action client or function call + ACTION = auto() # Any action client or function call + class WebRTCRequest(NamedTuple): """Class to represent a WebRTC request in the queue""" + id: str # Unique ID for tracking api_id: int # API ID for the command topic: str # Topic to publish to @@ -46,8 +49,10 @@ class WebRTCRequest(NamedTuple): priority: int # Priority level timeout: float # How long to wait for this request to complete + class ROSCommand(NamedTuple): """Class to represent a command in the queue""" + id: str # Unique ID for tracking cmd_type: CommandType # Type of command execute_func: Callable # Function to execute the command @@ -55,22 +60,25 @@ class ROSCommand(NamedTuple): priority: int # Priority level (lower is higher priority) timeout: float # How long to wait for this command to complete + class ROSCommandQueue: """ Manages a queue of commands for the robot. - + Commands are executed sequentially, with only one command being processed at a time. Commands are only executed when the robot is in the IDLE state. """ - - def __init__(self, - webrtc_func: Callable, - is_ready_func: Callable[[], bool] = None, - is_busy_func: Optional[Callable[[], bool]] = None, - debug: bool = True): + + def __init__( + self, + webrtc_func: Callable, + is_ready_func: Callable[[], bool] = None, + is_busy_func: Optional[Callable[[], bool]] = None, + debug: bool = True, + ): """ Initialize the ROSCommandQueue. - + Args: webrtc_func: Function to send WebRTC requests is_ready_func: Function to check if the robot is ready for a command @@ -81,53 +89,55 @@ def __init__(self, self._is_ready_func = is_ready_func or (lambda: True) self._is_busy_func = is_busy_func self._debug = debug - + # Queue of commands to process self._queue = PriorityQueue() self._current_command = None self._last_command_time = 0 - + # Last known robot state self._last_ready_state = None self._last_busy_state = None self._stuck_in_busy_since = None - + # Command execution status self._should_stop = False self._queue_thread = None - + # Stats self._command_count = 0 self._success_count = 0 self._failure_count = 0 self._command_history = [] - - self._max_queue_wait_time = 30.0 # Maximum time to wait for robot to be ready before forcing - + + self._max_queue_wait_time = ( + 30.0 # Maximum time to wait for robot to be ready before forcing + ) + logger.info("ROSCommandQueue initialized") - + def start(self): """Start the queue processing thread""" if self._queue_thread is not None and self._queue_thread.is_alive(): logger.warning("Queue processing thread already running") return - + self._should_stop = False self._queue_thread = threading.Thread(target=self._process_queue, daemon=True) self._queue_thread.start() logger.info("Queue processing thread started") - + def stop(self, timeout=2.0): """ Stop the queue processing thread - + Args: timeout: Maximum time to wait for the thread to stop """ if self._queue_thread is None or not self._queue_thread.is_alive(): logger.warning("Queue processing thread not running") return - + self._should_stop = True try: self._queue_thread.join(timeout=timeout) @@ -137,13 +147,20 @@ def stop(self, timeout=2.0): logger.info("Queue processing thread stopped") except Exception as e: logger.error(f"Error stopping queue processing thread: {e}") - - def queue_webrtc_request(self, api_id: int, topic: str = None, parameter: str = '', - request_id: str = None, data: Dict[str, Any] = None, - priority: int = 0, timeout: float = 30.0) -> str: + + def queue_webrtc_request( + self, + api_id: int, + topic: str = None, + parameter: str = "", + request_id: str = None, + data: Dict[str, Any] = None, + priority: int = 0, + timeout: float = 30.0, + ) -> str: """ Queue a WebRTC request - + Args: api_id: API ID for the command topic: Topic to publish to @@ -152,21 +169,21 @@ def queue_webrtc_request(self, api_id: int, topic: str = None, parameter: str = data: Data to include in the request priority: Priority level (lower is higher priority) timeout: Maximum time to wait for the command to complete - + Returns: str: Unique ID for the request """ request_id = request_id or str(uuid.uuid4()) - + # Create a function that will execute this WebRTC request def execute_webrtc(): try: logger.info(f"Executing WebRTC request: {api_id} (ID: {request_id})") if self._debug: logger.debug(f"[WebRTC Queue] SENDING request: API ID {api_id}") - + result = self._webrtc_func( - api_id=api_id, + api_id=api_id, topic=topic, parameter=parameter, request_id=request_id, @@ -177,30 +194,36 @@ def execute_webrtc(): if self._debug: logger.debug(f"[WebRTC Queue] Request API ID {api_id} FAILED to send") return False - + if self._debug: logger.debug(f"[WebRTC Queue] Request API ID {api_id} sent SUCCESSFULLY") - + # Allow time for the robot to process the command start_time = time.time() stabilization_delay = 0.5 # Half-second delay for stabilization time.sleep(stabilization_delay) - + # Wait for the robot to complete the command (timeout check) while self._is_busy_func() and (time.time() - start_time) < timeout: - if self._debug and (time.time() - start_time) % 5 < 0.1: # Print every ~5 seconds - logger.debug(f"[WebRTC Queue] Still waiting on API ID {api_id} - elapsed: {time.time()-start_time:.1f}s") + if ( + self._debug and (time.time() - start_time) % 5 < 0.1 + ): # Print every ~5 seconds + logger.debug( + f"[WebRTC Queue] Still waiting on API ID {api_id} - elapsed: {time.time() - start_time:.1f}s" + ) time.sleep(0.1) - + # Check if we timed out if self._is_busy_func() and (time.time() - start_time) >= timeout: logger.warning(f"WebRTC request timed out: {api_id} (ID: {request_id})") return False - + wait_time = time.time() - start_time if self._debug: - logger.debug(f"[WebRTC Queue] Request API ID {api_id} completed after {wait_time:.1f}s") - + logger.debug( + f"[WebRTC Queue] Request API ID {api_id} completed after {wait_time:.1f}s" + ) + logger.info(f"WebRTC request completed: {api_id} (ID: {request_id})") return True except Exception as e: @@ -208,201 +231,224 @@ def execute_webrtc(): if self._debug: logger.debug(f"[WebRTC Queue] ERROR processing request: {e}") return False - + # Create the command and queue it command = ROSCommand( id=request_id, cmd_type=CommandType.WEBRTC, execute_func=execute_webrtc, - params={'api_id': api_id, 'topic': topic, 'request_id': request_id}, + params={"api_id": api_id, "topic": topic, "request_id": request_id}, priority=priority, - timeout=timeout + timeout=timeout, ) - + # Queue the command self._queue.put((priority, self._command_count, command)) self._command_count += 1 if self._debug: - logger.debug(f"[WebRTC Queue] Added request ID {request_id} for API ID {api_id} - Queue size now: {self.queue_size}") + logger.debug( + f"[WebRTC Queue] Added request ID {request_id} for API ID {api_id} - Queue size now: {self.queue_size}" + ) logger.info(f"Queued WebRTC request: {api_id} (ID: {request_id}, Priority: {priority})") - + return request_id - - def queue_action_client_request(self, action_name: str, execute_func: Callable, - priority: int = 0, timeout: float = 30.0, **kwargs) -> str: + + def queue_action_client_request( + self, + action_name: str, + execute_func: Callable, + priority: int = 0, + timeout: float = 30.0, + **kwargs, + ) -> str: """ Queue any action client request or function - + Args: action_name: Name of the action for logging/tracking execute_func: Function to execute the command priority: Priority level (lower is higher priority) timeout: Maximum time to wait for the command to complete **kwargs: Additional parameters to pass to the execute function - + Returns: str: Unique ID for the request """ request_id = str(uuid.uuid4()) - + # Create the command command = ROSCommand( id=request_id, cmd_type=CommandType.ACTION, execute_func=execute_func, - params={'action_name': action_name, **kwargs}, + params={"action_name": action_name, **kwargs}, priority=priority, - timeout=timeout + timeout=timeout, ) - + # Queue the command self._queue.put((priority, self._command_count, command)) self._command_count += 1 - - action_params = ', '.join([f"{k}={v}" for k, v in kwargs.items()]) - logger.info(f"Queued action request: {action_name} (ID: {request_id}, Priority: {priority}, Params: {action_params})") - + + action_params = ", ".join([f"{k}={v}" for k, v in kwargs.items()]) + logger.info( + f"Queued action request: {action_name} (ID: {request_id}, Priority: {priority}, Params: {action_params})" + ) + return request_id - + def _process_queue(self): """Process commands in the queue""" logger.info("Starting queue processing") logger.info("[WebRTC Queue] Processing thread started") - + while not self._should_stop: # Print queue status self._print_queue_status() - + # Check if we're ready to process a command if not self._queue.empty() and self._current_command is None: current_time = time.time() is_ready = self._is_ready_func() is_busy = self._is_busy_func() if self._is_busy_func else False - + if self._debug: - logger.debug(f"[WebRTC Queue] Status: {self.queue_size} requests waiting | Robot ready: {is_ready} | Robot busy: {is_busy}") - + logger.debug( + f"[WebRTC Queue] Status: {self.queue_size} requests waiting | Robot ready: {is_ready} | Robot busy: {is_busy}" + ) + # Track robot state changes if is_ready != self._last_ready_state: - logger.debug(f"Robot ready state changed: {self._last_ready_state} -> {is_ready}") + logger.debug( + f"Robot ready state changed: {self._last_ready_state} -> {is_ready}" + ) self._last_ready_state = is_ready - + if is_busy != self._last_busy_state: logger.debug(f"Robot busy state changed: {self._last_busy_state} -> {is_busy}") self._last_busy_state = is_busy - + # If the robot has transitioned to busy, record the time if is_busy: self._stuck_in_busy_since = current_time else: self._stuck_in_busy_since = None - + # Check if we've been waiting too long for the robot to be ready force_processing = False - if (not is_ready and is_busy and - self._stuck_in_busy_since is not None and - current_time - self._stuck_in_busy_since > self._max_queue_wait_time): + if ( + not is_ready + and is_busy + and self._stuck_in_busy_since is not None + and current_time - self._stuck_in_busy_since > self._max_queue_wait_time + ): logger.warning( f"Robot has been busy for {current_time - self._stuck_in_busy_since:.1f}s, " f"forcing queue to continue" ) force_processing = True - + # Process the next command if ready or forcing if is_ready or force_processing: if self._debug and is_ready: logger.debug("[WebRTC Queue] Robot is READY for next command") - + try: # Get the next command _, _, command = self._queue.get(block=False) self._current_command = command self._last_command_time = current_time - + # Log the command cmd_info = f"ID: {command.id}, Type: {command.cmd_type.name}" if command.cmd_type == CommandType.WEBRTC: - api_id = command.params.get('api_id') + api_id = command.params.get("api_id") cmd_info += f", API: {api_id}" if self._debug: logger.debug(f"[WebRTC Queue] DEQUEUED request: API ID {api_id}") elif command.cmd_type == CommandType.ACTION: - action_name = command.params.get('action_name') + action_name = command.params.get("action_name") cmd_info += f", Action: {action_name}" if self._debug: logger.debug(f"[WebRTC Queue] DEQUEUED action: {action_name}") - + forcing_str = " (FORCED)" if force_processing else "" logger.info(f"Processing command{forcing_str}: {cmd_info}") - + # Execute the command try: # Where command execution occurs success = command.execute_func() - + if success: self._success_count += 1 logger.info(f"Command succeeded: {cmd_info}") if self._debug: - logger.debug(f"[WebRTC Queue] Command {command.id} marked as COMPLETED") + logger.debug( + f"[WebRTC Queue] Command {command.id} marked as COMPLETED" + ) else: self._failure_count += 1 logger.warning(f"Command failed: {cmd_info}") if self._debug: logger.debug(f"[WebRTC Queue] Command {command.id} FAILED") - + # Record command history - self._command_history.append({ - 'id': command.id, - 'type': command.cmd_type.name, - 'params': command.params, - 'success': success, - 'time': time.time() - self._last_command_time - }) - + self._command_history.append( + { + "id": command.id, + "type": command.cmd_type.name, + "params": command.params, + "success": success, + "time": time.time() - self._last_command_time, + } + ) + except Exception as e: self._failure_count += 1 logger.error(f"Error executing command: {e}") if self._debug: logger.debug(f"[WebRTC Queue] ERROR executing command: {e}") - + # Mark the command as complete self._current_command = None if self._debug: - logger.debug("[WebRTC Queue] Adding 0.5s stabilization delay before next command") + logger.debug( + "[WebRTC Queue] Adding 0.5s stabilization delay before next command" + ) time.sleep(0.5) - + except Empty: pass - + # Sleep to avoid busy-waiting time.sleep(0.1) - + logger.info("Queue processing stopped") - + def _print_queue_status(self): """Print the current queue status""" current_time = time.time() - + # Only print once per second to avoid spamming the log if current_time - self._last_command_time < 1.0 and self._current_command is None: return - + is_ready = self._is_ready_func() is_busy = self._is_busy_func() if self._is_busy_func else False queue_size = self.queue_size - + # Get information about the current command current_command_info = "None" if self._current_command is not None: current_command_info = f"{self._current_command.cmd_type.name}" if self._current_command.cmd_type == CommandType.WEBRTC: - api_id = self._current_command.params.get('api_id') + api_id = self._current_command.params.get("api_id") current_command_info += f" (API: {api_id})" elif self._current_command.cmd_type == CommandType.ACTION: - action_name = self._current_command.params.get('action_name') + action_name = self._current_command.params.get("action_name") current_command_info += f" (Action: {action_name})" - + # Print the status status = ( f"Queue: {queue_size} items | " @@ -410,17 +456,16 @@ def _print_queue_status(self): f"Current: {current_command_info} | " f"Stats: {self._success_count} OK, {self._failure_count} FAIL" ) - + logger.debug(status) self._last_command_time = current_time - + @property def queue_size(self) -> int: """Get the number of commands in the queue""" return self._queue.qsize() - + @property def current_command(self) -> Optional[ROSCommand]: """Get the current command being processed""" return self._current_command - \ No newline at end of file diff --git a/dimos/robot/ros_control.py b/dimos/robot/ros_control.py index 13f90d4c2e..454f41c2b6 100644 --- a/dimos/robot/ros_control.py +++ b/dimos/robot/ros_control.py @@ -24,7 +24,7 @@ from enum import Enum, auto import threading import time -from typing import Optional, Tuple, Dict, Any, Type +from typing import Optional, Dict, Any, Type from abc import ABC, abstractmethod from rclpy.qos import ( QoSProfile, @@ -35,7 +35,7 @@ from dimos.stream.ros_video_provider import ROSVideoProvider import math from builtin_interfaces.msg import Duration -from geometry_msgs.msg import Point, Vector3, Twist +from geometry_msgs.msg import Point, Vector3 from dimos.robot.ros_command_queue import ROSCommandQueue from dimos.utils.logging_config import setup_logger @@ -61,27 +61,31 @@ class RobotMode(Enum): MOVING = auto() ERROR = auto() + class ROSControl(ROSTransformAbility, ROSObservableTopicAbility, ABC): """Abstract base class for ROS-controlled robots""" - def __init__(self, - node_name: str, - camera_topics: Dict[str, str] = None, - max_linear_velocity: float = 1.0, - mock_connection: bool = False, - max_angular_velocity: float = 2.0, - state_topic: str = None, - imu_topic: str = None, - state_msg_type: Type = None, - imu_msg_type: Type = None, - webrtc_topic: str = None, - webrtc_api_topic: str = None, - webrtc_msg_type: Type = None, - move_vel_topic: str = None, - pose_topic: str = None, - odom_topic: str = '/odom', - global_costmap_topic: str = "map", - costmap_topic: str = '/local_costmap/costmap', - debug: bool = False): + + def __init__( + self, + node_name: str, + camera_topics: Dict[str, str] = None, + max_linear_velocity: float = 1.0, + mock_connection: bool = False, + max_angular_velocity: float = 2.0, + state_topic: str = None, + imu_topic: str = None, + state_msg_type: Type = None, + imu_msg_type: Type = None, + webrtc_topic: str = None, + webrtc_api_topic: str = None, + webrtc_msg_type: Type = None, + move_vel_topic: str = None, + pose_topic: str = None, + odom_topic: str = "/odom", + global_costmap_topic: str = "map", + costmap_topic: str = "/local_costmap/costmap", + debug: bool = False, + ): """ Initialize base ROS control interface Args: @@ -159,9 +163,7 @@ def __init__(self, ) self._subscriptions.append(self._global_costmap_sub) else: - logger.warning( - "No costmap topic provided - costmap data tracking will be unavailable" - ) + logger.warning("No costmap topic provided - costmap data tracking will be unavailable") # Initialize data handling self._video_provider = None @@ -204,25 +206,23 @@ def __init__(self, ) self._subscriptions.append(self._imu_sub) else: - logger.warning("No IMU topic and/or message type provided - IMU data tracking will be unavailable") - + logger.warning( + "No IMU topic and/or message type provided - IMU data tracking will be unavailable" + ) + if self._odom_topic: self._odom_sub = self._node.create_subscription( - Odometry, - self._odom_topic, - self._odom_callback, - sensor_qos + Odometry, self._odom_topic, self._odom_callback, sensor_qos ) self._subscriptions.append(self._odom_sub) else: - logger.warning("No odometry topic provided - odometry data tracking will be unavailable") - + logger.warning( + "No odometry topic provided - odometry data tracking will be unavailable" + ) + if self._costmap_topic: self._costmap_sub = self._node.create_subscription( - OccupancyGrid, - self._costmap_topic, - self._costmap_callback, - sensor_qos + OccupancyGrid, self._costmap_topic, self._costmap_callback, sensor_qos ) self._subscriptions.append(self._costmap_sub) else: @@ -236,9 +236,7 @@ def __init__(self, self._spin_client.wait_for_server() # Publishers - self._move_vel_pub = self._node.create_publisher( - Twist, move_vel_topic, command_qos - ) + self._move_vel_pub = self._node.create_publisher(Twist, move_vel_topic, command_qos) self._pose_pub = self._node.create_publisher(Vector3, pose_topic, command_qos) if webrtc_msg_type: @@ -256,12 +254,12 @@ def __init__(self, self._command_queue.start() else: logger.warning("No WebRTC message type provided - WebRTC commands will be unavailable") - + # Initialize TF Buffer and Listener for transform abilities self._tf_buffer = tf2_ros.Buffer() self._tf_listener = tf2_ros.TransformListener(self._tf_buffer, self._node) logger.info(f"TF Buffer and Listener initialized for {node_name}") - + # Start ROS spin in a background thread via the executor self._spin_thread = threading.Thread(target=self._ros_spin, daemon=True) self._spin_thread.start() @@ -295,12 +293,12 @@ def _imu_callback(self, msg): """Callback for IMU data""" self._imu_state = msg # Log IMU state (very verbose) - #logger.debug(f"IMU state updated: {self._imu_state}") + # logger.debug(f"IMU state updated: {self._imu_state}") def _odom_callback(self, msg): """Callback for odometry data""" self._odom_data = msg - + def _costmap_callback(self, msg): """Callback for costmap data""" self._costmap_data = msg @@ -347,9 +345,7 @@ def get_state(self) -> Optional[Any]: ROS msg containing the robot state information """ if not self._state_topic: - logger.warning( - "No state topic provided - robot state tracking will be unavailable" - ) + logger.warning("No state topic provided - robot state tracking will be unavailable") return None return self._robot_state @@ -365,28 +361,28 @@ def get_imu_state(self) -> Optional[Any]: ROS msg containing the IMU state information """ if not self._imu_topic: - logger.warning( - "No IMU topic provided - IMU data tracking will be unavailable" - ) + logger.warning("No IMU topic provided - IMU data tracking will be unavailable") return None return self._imu_state def get_odometry(self) -> Optional[Odometry]: """ Get current odometry data - + Returns: Optional[Odometry]: Current odometry data or None if not available """ if not self._odom_topic: - logger.warning("No odometry topic provided - odometry data tracking will be unavailable") + logger.warning( + "No odometry topic provided - odometry data tracking will be unavailable" + ) return None return self._odom_data - + def get_costmap(self) -> Optional[OccupancyGrid]: """ Get current costmap data - + Returns: Optional[OccupancyGrid]: Current costmap data or None if not available """ @@ -394,7 +390,7 @@ def get_costmap(self) -> Optional[OccupancyGrid]: logger.warning("No costmap topic provided - costmap data tracking will be unavailable") return None return self._costmap_data - + def _image_callback(self, msg): """Convert ROS image to numpy array and push to data stream""" if self._video_provider and self._bridge: @@ -416,9 +412,7 @@ def video_provider(self) -> Optional[ROSVideoProvider]: """Data provider property for streaming data""" return self._video_provider - def _send_action_client_goal( - self, client, goal_msg, description=None, time_allowance=20.0 - ): + def _send_action_client_goal(self, client, goal_msg, description=None, time_allowance=20.0): """ Generic function to send any action client goal and wait for completion. @@ -441,16 +435,12 @@ def _send_action_client_goal( self._action_success = None # Send the goal - send_goal_future = client.send_goal_async( - goal_msg, feedback_callback=lambda feedback: None - ) + send_goal_future = client.send_goal_async(goal_msg, feedback_callback=lambda feedback: None) send_goal_future.add_done_callback(self._goal_response_callback) # Wait for completion start_time = time.time() - while ( - self._action_success is None and time.time() - start_time < time_allowance - ): + while self._action_success is None and time.time() - start_time < time_allowance: time.sleep(0.1) elapsed = time.time() - start_time @@ -463,15 +453,13 @@ def _send_action_client_goal( logger.error(f"Action timed out after {time_allowance}s") return False elif self._action_success: - logger.info(f"Action succeeded") + logger.info("Action succeeded") return True else: - logger.error(f"Action failed") + logger.error("Action failed") return False - def move( - self, distance: float, speed: float = 0.5, time_allowance: float = 120 - ) -> bool: + def move(self, distance: float, speed: float = 0.5, time_allowance: float = 120) -> bool: """ Move the robot forward by a specified distance @@ -518,9 +506,7 @@ def execute_move(): distance=distance, speed=speed, ) - logger.info( - f"Queued move command: {cmd_id} - Distance: {distance}m, Speed: {speed}m/s" - ) + logger.info(f"Queued move command: {cmd_id} - Distance: {distance}m, Speed: {speed}m/s") return True except Exception as e: @@ -530,9 +516,7 @@ def execute_move(): logger.error(traceback.format_exc()) return False - def reverse( - self, distance: float, speed: float = 0.5, time_allowance: float = 120 - ) -> bool: + def reverse(self, distance: float, speed: float = 0.5, time_allowance: float = 120) -> bool: """ Move the robot backward by a specified distance @@ -602,9 +586,7 @@ def execute_reverse(): logger.error(traceback.format_exc()) return False - def spin( - self, degrees: float, speed: float = 45.0, time_allowance: float = 120 - ) -> bool: + def spin(self, degrees: float, speed: float = 45.0, time_allowance: float = 120) -> bool: """ Rotate the robot by a specified angle @@ -652,9 +634,7 @@ def execute_spin(): degrees=degrees, speed=speed, ) - logger.info( - f"Queued spin command: {cmd_id} - Degrees: {degrees}, Speed: {speed}deg/s" - ) + logger.info(f"Queued spin command: {cmd_id} - Degrees: {degrees}, Speed: {speed}deg/s") return True except Exception as e: @@ -902,21 +882,21 @@ def pose_command(self, roll: float, pitch: float, yaw: float) -> bool: except Exception as e: logger.error(f"Failed to send pose command: {e}") return False - + def get_position_stream(self): """ Get a stream of position updates from ROS. - + Returns: Observable that emits (x, y) tuples representing the robot's position """ from dimos.robot.position_stream import PositionStreamProvider - + # Create a position stream provider position_provider = PositionStreamProvider( ros_node=self._node, odometry_topic="/odom", # Default odometry topic - use_odometry=True + use_odometry=True, ) - + return position_provider.get_position_stream() diff --git a/dimos/robot/ros_observable_topic.py b/dimos/robot/ros_observable_topic.py index 8826a894f4..697ddff398 100644 --- a/dimos/robot/ros_observable_topic.py +++ b/dimos/robot/ros_observable_topic.py @@ -116,7 +116,10 @@ def topic( # upstream ROS callback def _on_subscribe(obs, _): ros_sub = self._node.create_subscription( - self._sub_msg_type(msg_type), topic_name, self._maybe_conversion(msg_type, obs.on_next), qos_profile + self._sub_msg_type(msg_type), + topic_name, + self._maybe_conversion(msg_type, obs.on_next), + qos_profile, ) return Disposable(lambda: self._node.destroy_subscription(ros_sub)) @@ -158,7 +161,9 @@ def _subscribe(observer, sch=None): # odom.dispose() # clean up the subscription # # see test_ros_observable_topic.py test_topic_latest for more details - def topic_latest(self, topic_name: str, msg_type: TopicType, timeout: float | None = 100.0, qos=QOS.SENSOR): + def topic_latest( + self, topic_name: str, msg_type: TopicType, timeout: float | None = 100.0, qos=QOS.SENSOR + ): """ Blocks the current thread until the first message is received, then returns `reader()` (sync) and keeps one ROS subscription alive @@ -173,7 +178,9 @@ def topic_latest(self, topic_name: str, msg_type: TopicType, timeout: float | No conn = core.connect() # starts the ROS subscription immediately try: - first_val = core.pipe(ops.first(), *([ops.timeout(timeout)] if timeout is not None else [])).run() + first_val = core.pipe( + ops.first(), *([ops.timeout(timeout)] if timeout is not None else []) + ).run() except Exception: conn.dispose() msg = f"{topic_name} message not received after {timeout} seconds. Is robot connected?" @@ -204,7 +211,9 @@ def reader(): # odom.dispose() # clean up the subscription # # see test_ros_observable_topic.py test_topic_latest for more details - async def topic_latest_async(self, topic_name: str, msg_type: TopicType, qos=QOS.SENSOR, timeout: float = 30.0): + async def topic_latest_async( + self, topic_name: str, msg_type: TopicType, qos=QOS.SENSOR, timeout: float = 30.0 + ): loop = asyncio.get_running_loop() first = loop.create_future() cache = {"val": None} diff --git a/dimos/robot/ros_transform.py b/dimos/robot/ros_transform.py index 2fc7a7a2ba..b0c46fd275 100644 --- a/dimos/robot/ros_transform.py +++ b/dimos/robot/ros_transform.py @@ -37,6 +37,7 @@ def to_euler_rot(msg: TransformStamped) -> [Vector, Vector]: def to_euler_pos(msg: TransformStamped) -> [Vector, Vector]: return Vector(msg.transform.translation).to_2d() + def to_euler(msg: TransformStamped) -> [Vector, Vector]: return [to_euler_pos(msg), to_euler_rot(msg)] @@ -53,10 +54,14 @@ def tf_buffer(self) -> Buffer: return self._tf_buffer - def transform_euler_pos(self, source_frame: str, target_frame: str = "map", timeout: float = 1.0): + def transform_euler_pos( + self, source_frame: str, target_frame: str = "map", timeout: float = 1.0 + ): return to_euler_pos(self.transform(source_frame, target_frame, timeout)) - def transform_euler_rot(self, source_frame: str, target_frame: str = "map", timeout: float = 1.0): + def transform_euler_rot( + self, source_frame: str, target_frame: str = "map", timeout: float = 1.0 + ): return to_euler_rot(self.transform(source_frame, target_frame, timeout)) def transform_euler(self, source_frame: str, target_frame: str = "map", timeout: float = 1.0): @@ -82,7 +87,9 @@ def transform( logger.error(f"Transform lookup failed: {e}") return None - def transform_point(self, point: Vector, source_frame: str, target_frame: str = "map", timeout: float = 1.0): + def transform_point( + self, point: Vector, source_frame: str, target_frame: str = "map", timeout: float = 1.0 + ): """Transform a point from source_frame to target_frame. Args: @@ -97,7 +104,10 @@ def transform_point(self, point: Vector, source_frame: str, target_frame: str = try: # Wait for transform to become available self.tf_buffer.can_transform( - target_frame, source_frame, rclpy.time.Time(), rclpy.duration.Duration(seconds=timeout) + target_frame, + source_frame, + rclpy.time.Time(), + rclpy.duration.Duration(seconds=timeout), ) # Create a PointStamped message @@ -109,20 +119,28 @@ def transform_point(self, point: Vector, source_frame: str, target_frame: str = ps.point.z = point[2] if len(point) > 2 else 0.0 # Transform point - transformed_ps = self.tf_buffer.transform(ps, target_frame, rclpy.duration.Duration(seconds=timeout)) + transformed_ps = self.tf_buffer.transform( + ps, target_frame, rclpy.duration.Duration(seconds=timeout) + ) # Return as Vector type if len(point) > 2: - return Vector(transformed_ps.point.x, transformed_ps.point.y, transformed_ps.point.z) + return Vector( + transformed_ps.point.x, transformed_ps.point.y, transformed_ps.point.z + ) else: return Vector(transformed_ps.point.x, transformed_ps.point.y) - except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException) as e: + except ( + tf2_ros.LookupException, + tf2_ros.ConnectivityException, + tf2_ros.ExtrapolationException, + ) as e: logger.error(f"Transform from {source_frame} to {target_frame} failed: {e}") return None - - - def transform_path(self, path: Path, source_frame: str, target_frame: str = "map", timeout: float = 1.0): + def transform_path( + self, path: Path, source_frame: str, target_frame: str = "map", timeout: float = 1.0 + ): """Transform a path from source_frame to target_frame. Args: @@ -141,7 +159,9 @@ def transform_path(self, path: Path, source_frame: str, target_frame: str = "map transformed_path.append(transformed_point) return transformed_path - def transform_rot(self, rotation: Vector, source_frame: str, target_frame: str = "map", timeout: float = 1.0): + def transform_rot( + self, rotation: Vector, source_frame: str, target_frame: str = "map", timeout: float = 1.0 + ): """Transform a rotation from source_frame to target_frame. Args: @@ -156,36 +176,50 @@ def transform_rot(self, rotation: Vector, source_frame: str, target_frame: str = try: # Wait for transform to become available self.tf_buffer.can_transform( - target_frame, source_frame, rclpy.time.Time(), rclpy.duration.Duration(seconds=timeout) + target_frame, + source_frame, + rclpy.time.Time(), + rclpy.duration.Duration(seconds=timeout), ) - + # Create a rotation matrix from the input Euler angles - input_rotation = R.from_euler('xyz', rotation, degrees=False) - + input_rotation = R.from_euler("xyz", rotation, degrees=False) + # Get the transform from source to target frame transform = self.transform(source_frame, target_frame, timeout) if transform is None: return None - + # Extract the rotation from the transform q = transform.transform.rotation transform_rotation = R.from_quat([q.x, q.y, q.z, q.w]) - + # Compose the rotations # The resulting rotation is the composition of the transform rotation and input rotation result_rotation = transform_rotation * input_rotation - + # Convert back to Euler angles - euler_angles = result_rotation.as_euler('xyz', degrees=False) - + euler_angles = result_rotation.as_euler("xyz", degrees=False) + # Return as Vector type return Vector(euler_angles) - - except (tf2_ros.LookupException, tf2_ros.ConnectivityException, tf2_ros.ExtrapolationException) as e: + + except ( + tf2_ros.LookupException, + tf2_ros.ConnectivityException, + tf2_ros.ExtrapolationException, + ) as e: logger.error(f"Transform rotation from {source_frame} to {target_frame} failed: {e}") return None - def transform_pose(self, position: Vector, rotation: Vector, source_frame: str, target_frame: str = "map", timeout: float = 1.0): + def transform_pose( + self, + position: Vector, + rotation: Vector, + source_frame: str, + target_frame: str = "map", + timeout: float = 1.0, + ): """Transform a pose from source_frame to target_frame. Args: @@ -196,14 +230,14 @@ def transform_pose(self, position: Vector, rotation: Vector, source_frame: str, timeout: Time to wait for the transform to become available (seconds) Returns: - Tuple of (transformed_position, transformed_rotation) as Vectors, + Tuple of (transformed_position, transformed_rotation) as Vectors, or (None, None) if either transform failed """ # Transform position transformed_position = self.transform_point(position, source_frame, target_frame, timeout) - + # Transform rotation transformed_rotation = self.transform_rot(rotation, source_frame, target_frame, timeout) - + # Return results (both might be None if transforms failed) - return transformed_position, transformed_rotation \ No newline at end of file + return transformed_position, transformed_rotation diff --git a/dimos/robot/test_ros_observable_topic.py b/dimos/robot/test_ros_observable_topic.py index dbac9ef11e..e62af0c55d 100644 --- a/dimos/robot/test_ros_observable_topic.py +++ b/dimos/robot/test_ros_observable_topic.py @@ -5,7 +5,6 @@ import pytest from dimos.robot.ros_observable_topic import ROSObservableTopicAbility from dimos.utils.logging_config import setup_logger -from dimos.types.costmap import Costmap from dimos.types.vector import Vector import asyncio @@ -96,7 +95,9 @@ def test_parallel_and_cleanup(): assert i in received_messages, f"Expected {i} in received messages, got {received_messages}" # ensure that ROS end has only a single subscription - assert len(robot._node.subs) == 1, f"Expected 1 subscription, got {len(robot._node.subs)}: {robot._node.subs}" + assert len(robot._node.subs) == 1, ( + f"Expected 1 subscription, got {len(robot._node.subs)}: {robot._node.subs}" + ) subscription1.dispose() subscription2.dispose() diff --git a/dimos/robot/unitree/external/go2_ros2_sdk b/dimos/robot/unitree/external/go2_ros2_sdk deleted file mode 160000 index de298797d0..0000000000 --- a/dimos/robot/unitree/external/go2_ros2_sdk +++ /dev/null @@ -1 +0,0 @@ -Subproject commit de298797d04340ead4ad763668c3a62d48b7214a diff --git a/dimos/robot/unitree/unitree_go2.py b/dimos/robot/unitree/unitree_go2.py index 54ba4c3327..7f1d760b34 100644 --- a/dimos/robot/unitree/unitree_go2.py +++ b/dimos/robot/unitree/unitree_go2.py @@ -21,20 +21,16 @@ from dimos.stream.video_providers.unitree import UnitreeVideoProvider from reactivex.disposable import CompositeDisposable import logging -import time -from dimos.robot.unitree.external.go2_webrtc_connect.go2_webrtc_driver.webrtc_driver import WebRTCConnectionMethod +from go2_webrtc_driver.webrtc_driver import Go2WebRTCConnection, WebRTCConnectionMethod import os from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl from reactivex.scheduler import ThreadPoolScheduler -import threading from dimos.utils.logging_config import setup_logger from dimos.perception.person_tracker import PersonTrackingStream from dimos.perception.object_tracker import ObjectTrackingStream from dimos.robot.local_planner import VFHPurePursuitPlanner, navigate_path_local from dimos.robot.global_planner.planner import AstarPlanner -from dimos.types.path import Path from dimos.types.costmap import Costmap -from dimos.utils.reactive import backpressure # Set up logging logger = setup_logger("dimos.robot.unitree.unitree_go2", level=logging.DEBUG) @@ -85,7 +81,9 @@ def __init__( # Initialize ros_control if it is not provided and use_ros is True if ros_control is None and use_ros: ros_control = UnitreeROSControl( - node_name="unitree_go2", disable_video_stream=disable_video_stream, mock_connection=mock_connection + node_name="unitree_go2", + disable_video_stream=disable_video_stream, + mock_connection=mock_connection, ) # Initialize skill library @@ -175,7 +173,9 @@ def __init__( self.global_planner = AstarPlanner( conservativism=20, # how close to obstacles robot is allowed to path plan - set_local_nav=lambda path, stop_event=None, goal_theta=None: navigate_path_local(self, path, timeout=120.0, goal_theta=goal_theta, stop_event=stop_event), + set_local_nav=lambda path, stop_event=None, goal_theta=None: navigate_path_local( + self, path, timeout=120.0, goal_theta=goal_theta, stop_event=stop_event + ), get_costmap=self.ros_control.topic_latest("map", Costmap), get_robot_pos=lambda: self.ros_control.transform_euler_pos("base_link"), ) @@ -189,7 +189,7 @@ def get_skills(self) -> Optional[SkillLibrary]: def get_pose(self) -> Tuple[Tuple[float, float, float], Tuple[float, float, float]]: """ Get the current pose (position and rotation) of the robot in the map frame. - + Returns: Tuple containing: - position: Tuple[float, float, float] (x, y, z) diff --git a/dimos/robot/unitree/unitree_ros_control.py b/dimos/robot/unitree/unitree_ros_control.py index 63bc622f8b..56e83cb30f 100644 --- a/dimos/robot/unitree/unitree_ros_control.py +++ b/dimos/robot/unitree/unitree_ros_control.py @@ -14,74 +14,64 @@ from go2_interfaces.msg import Go2State, IMU from unitree_go.msg import WebRtcReq -from enum import Enum, auto -import threading -import time -from typing import Optional, Tuple, Dict, Any, Type -from abc import ABC, abstractmethod +from typing import Type from sensor_msgs.msg import Image, CompressedImage, CameraInfo from dimos.robot.ros_control import ROSControl, RobotMode from dimos.utils.logging_config import setup_logger logger = setup_logger("dimos.robot.unitree.unitree_ros_control") + class UnitreeROSControl(ROSControl): """Hardware interface for Unitree Go2 robot using ROS2""" - + # ROS Camera Topics CAMERA_TOPICS = { - 'raw': { - 'topic': 'camera/image_raw', - 'type': Image - }, - 'compressed': { - 'topic': 'camera/compressed', - 'type': CompressedImage - }, - 'info': { - 'topic': 'camera/camera_info', - 'type': CameraInfo - } + "raw": {"topic": "camera/image_raw", "type": Image}, + "compressed": {"topic": "camera/compressed", "type": CompressedImage}, + "info": {"topic": "camera/camera_info", "type": CameraInfo}, } # Hard coded ROS Message types and Topic names for Unitree Go2 DEFAULT_STATE_MSG_TYPE = Go2State DEFAULT_IMU_MSG_TYPE = IMU DEFAULT_WEBRTC_MSG_TYPE = WebRtcReq - DEFAULT_STATE_TOPIC = 'go2_states' - DEFAULT_IMU_TOPIC = 'imu' - DEFAULT_WEBRTC_TOPIC = 'webrtc_req' - DEFAULT_CMD_VEL_TOPIC = 'cmd_vel_out' - DEFAULT_POSE_TOPIC = 'pose_cmd' - DEFAULT_ODOM_TOPIC = 'odom' - DEFAULT_COSTMAP_TOPIC = 'local_costmap/costmap' + DEFAULT_STATE_TOPIC = "go2_states" + DEFAULT_IMU_TOPIC = "imu" + DEFAULT_WEBRTC_TOPIC = "webrtc_req" + DEFAULT_CMD_VEL_TOPIC = "cmd_vel_out" + DEFAULT_POSE_TOPIC = "pose_cmd" + DEFAULT_ODOM_TOPIC = "odom" + DEFAULT_COSTMAP_TOPIC = "local_costmap/costmap" DEFAULT_MAX_LINEAR_VELOCITY = 1.0 DEFAULT_MAX_ANGULAR_VELOCITY = 2.0 # Hard coded WebRTC API parameters for Unitree Go2 - DEFAULT_WEBRTC_API_TOPIC = 'rt/api/sport/request' - - def __init__(self, - node_name: str = "unitree_hardware_interface", - state_topic: str = None, - imu_topic: str = None, - webrtc_topic: str = None, - webrtc_api_topic: str = None, - move_vel_topic: str = None, - pose_topic: str = None, - odom_topic: str = None, - costmap_topic: str = None, - state_msg_type: Type = None, - imu_msg_type: Type = None, - webrtc_msg_type: Type = None, - max_linear_velocity: float = None, - max_angular_velocity: float = None, - use_raw: bool = False, - debug: bool = False, - disable_video_stream: bool = False, - mock_connection: bool = False): + DEFAULT_WEBRTC_API_TOPIC = "rt/api/sport/request" + + def __init__( + self, + node_name: str = "unitree_hardware_interface", + state_topic: str = None, + imu_topic: str = None, + webrtc_topic: str = None, + webrtc_api_topic: str = None, + move_vel_topic: str = None, + pose_topic: str = None, + odom_topic: str = None, + costmap_topic: str = None, + state_msg_type: Type = None, + imu_msg_type: Type = None, + webrtc_msg_type: Type = None, + max_linear_velocity: float = None, + max_angular_velocity: float = None, + use_raw: bool = False, + debug: bool = False, + disable_video_stream: bool = False, + mock_connection: bool = False, + ): """ Initialize Unitree ROS control interface with default values for Unitree Go2 - + Args: node_name: Name for the ROS node state_topic: ROS Topic name for robot state (defaults to DEFAULT_STATE_TOPIC) @@ -99,17 +89,15 @@ def __init__(self, use_raw: Whether to use raw camera topics (defaults to False) debug: Whether to enable debug logging disable_video_stream: Whether to run without video stream for testing. - mock_connection: Whether to run without active ActionClient servers for testing. + mock_connection: Whether to run without active ActionClient servers for testing. """ - + logger.info("Initializing Unitree ROS control interface") # Select which camera topics to use active_camera_topics = None if not disable_video_stream: - active_camera_topics = { - 'main': self.CAMERA_TOPICS['raw' if use_raw else 'compressed'] - } - + active_camera_topics = {"main": self.CAMERA_TOPICS["raw" if use_raw else "compressed"]} + # Use default values if not provided state_topic = state_topic or self.DEFAULT_STATE_TOPIC imu_topic = imu_topic or self.DEFAULT_IMU_TOPIC @@ -124,7 +112,7 @@ def __init__(self, webrtc_msg_type = webrtc_msg_type or self.DEFAULT_WEBRTC_MSG_TYPE max_linear_velocity = max_linear_velocity or self.DEFAULT_MAX_LINEAR_VELOCITY max_angular_velocity = max_angular_velocity or self.DEFAULT_MAX_ANGULAR_VELOCITY - + super().__init__( node_name=node_name, camera_topics=active_camera_topics, @@ -142,14 +130,14 @@ def __init__(self, costmap_topic=costmap_topic, max_linear_velocity=max_linear_velocity, max_angular_velocity=max_angular_velocity, - debug=debug + debug=debug, ) - + # Unitree-specific RobotMode State update conditons def _update_mode(self, msg: Go2State): """ Implementation of abstract method to update robot mode - + Logic: - If progress is 0 and mode is 1, then state is IDLE - If progress is 1 OR mode is NOT equal to 1, then state is MOVING @@ -157,7 +145,7 @@ def _update_mode(self, msg: Go2State): # Direct access to protected instance variables from the parent class mode = msg.mode progress = msg.progress - + if progress == 0 and mode == 1: self._mode = RobotMode.IDLE logger.debug("Robot mode set to IDLE (progress=0, mode=1)") @@ -166,4 +154,4 @@ def _update_mode(self, msg: Go2State): logger.debug(f"Robot mode set to MOVING (progress={progress}, mode={mode})") else: self._mode = RobotMode.UNKNOWN - logger.debug(f"Robot mode set to UNKNOWN (progress={progress}, mode={mode})") \ No newline at end of file + logger.debug(f"Robot mode set to UNKNOWN (progress={progress}, mode={mode})") diff --git a/dimos/robot/unitree/unitree_skills.py b/dimos/robot/unitree/unitree_skills.py index 9c2e406c97..38adc399c8 100644 --- a/dimos/robot/unitree/unitree_skills.py +++ b/dimos/robot/unitree/unitree_skills.py @@ -14,159 +14,182 @@ from __future__ import annotations -from typing import TYPE_CHECKING, List, Optional, Tuple, Type, Union +from typing import TYPE_CHECKING, List, Optional, Tuple, Union import time from pydantic import Field -import threading if TYPE_CHECKING: from dimos.robot.robot import Robot, MockRobot else: - Robot = 'Robot' - MockRobot = 'MockRobot' + Robot = "Robot" + MockRobot = "MockRobot" from dimos.skills.skills import AbstractRobotSkill, AbstractSkill, SkillLibrary from dimos.types.constants import Colors -from inspect import signature, Parameter -from typing import Callable, Any, get_type_hints # Module-level constant for Unitree ROS control definitions UNITREE_ROS_CONTROLS: List[Tuple[str, int, str]] = [ - ("Damp", 1001, - "Lowers the robot to the ground fully." - ), - ("BalanceStand", 1002, - "Activates a mode that maintains the robot in a balanced standing position." - ), - ("StandUp", 1004, - "Commands the robot to transition from a sitting or prone position to a standing posture." - ), - ("StandDown", 1005, - "Instructs the robot to move from a standing position to a sitting or prone posture." - ), - ("RecoveryStand", 1006, - "Recovers the robot to a state from which it can take more commands. Useful to run after multiple dynamic commands like front flips." - ), - ("Euler", 1007, - "Adjusts the robot's orientation using Euler angles, providing precise control over its rotation." + ("Damp", 1001, "Lowers the robot to the ground fully."), + ( + "BalanceStand", + 1002, + "Activates a mode that maintains the robot in a balanced standing position.", + ), + ( + "StandUp", + 1004, + "Commands the robot to transition from a sitting or prone position to a standing posture.", + ), + ( + "StandDown", + 1005, + "Instructs the robot to move from a standing position to a sitting or prone posture.", + ), + ( + "RecoveryStand", + 1006, + "Recovers the robot to a state from which it can take more commands. Useful to run after multiple dynamic commands like front flips.", + ), + ( + "Euler", + 1007, + "Adjusts the robot's orientation using Euler angles, providing precise control over its rotation.", ), # ("Move", 1008, "Move the robot using velocity commands."), # Intentionally omitted - ("Sit", 1009, - "Commands the robot to sit down from a standing or moving stance."), - ("RiseSit", 1010, - "Commands the robot to rise back to a standing position from a sitting posture." - ), - ("SwitchGait", 1011, - "Switches the robot's walking pattern or style dynamically, suitable for different terrains or speeds." - ), - ("Trigger", 1012, - "Triggers a specific action or custom routine programmed into the robot."), - ("BodyHeight", 1013, - "Adjusts the height of the robot's body from the ground, useful for navigating various obstacles." - ), - ("FootRaiseHeight", 1014, - "Controls how high the robot lifts its feet during movement, which can be adjusted for different surfaces." - ), - ("SpeedLevel", 1015, - "Sets or adjusts the speed at which the robot moves, with various levels available for different operational needs." - ), - ("Hello", 1016, - "Performs a greeting action, which could involve a wave or other friendly gesture." - ), - ("Stretch", 1017, - "Engages the robot in a stretching routine." - ), - ("TrajectoryFollow", 1018, - "Directs the robot to follow a predefined trajectory, which could involve complex paths or maneuvers." - ), - ("ContinuousGait", 1019, - "Enables a mode for continuous walking or running, ideal for long-distance travel." - ), - ("Content", 1020, - "To display or trigger when the robot is happy." - ), - ("Wallow", 1021, - "The robot falls onto its back and rolls around." - ), - ("Dance1", 1022, - "Performs a predefined dance routine 1, programmed for entertainment or demonstration." - ), - ("Dance2", 1023, - "Performs another variant of a predefined dance routine 2."), - ("GetBodyHeight", 1024, - "Retrieves the current height of the robot's body from the ground."), - ("GetFootRaiseHeight", 1025, - "Retrieves the current height at which the robot's feet are being raised during movement." - ), - ("GetSpeedLevel", 1026, - "Returns the current speed level at which the robot is operating."), - ("SwitchJoystick", 1027, - "Toggles the control mode to joystick input, allowing for manual direction of the robot's movements." - ), - ("Pose", 1028, - "Directs the robot to take a specific pose or stance, which could be used for tasks or performances." - ), - ("Scrape", 1029, - "Robot falls to its hind legs and makes scraping motions with its front legs." - ), - ("FrontFlip", 1030, - "Executes a front flip, a complex and dynamic maneuver." - ), - ("FrontJump", 1031, - "Commands the robot to perform a forward jump." - ), - ("FrontPounce", 1032, - "Initiates a pouncing movement forward, mimicking animal-like pouncing behavior." - ), - ("WiggleHips", 1033, - "Causes the robot to wiggle its hips." - ), - ("GetState", 1034, - "Retrieves the current operational state of the robot, including status reports or diagnostic information." - ), - ("EconomicGait", 1035, - "Engages a more energy-efficient walking or running mode to conserve battery life." - ), - ("FingerHeart", 1036, - "Performs a finger heart gesture while on its hind legs." - ), - ("Handstand", 1301, - "Commands the robot to perform a handstand, demonstrating balance and control." - ), - ("CrossStep", 1302, - "Engages the robot in a cross-stepping routine, useful for complex locomotion or dance moves." - ), - ("OnesidedStep", 1303, - "Commands the robot to perform a stepping motion that predominantly uses one side." - ), - ("Bound", 1304, - "Initiates a bounding motion, similar to a light, repetitive hopping or leaping." - ), - ("LeadFollow", 1045, - "Engages follow-the-leader behavior, where the robot follows a designated leader or follows a signal." - ), - ("LeftFlip", 1042, - "Executes a flip towards the left side." - ), - ("RightFlip", 1043, - "Performs a flip towards the right side." - ), - ("Backflip", 1044, - "Executes a backflip, a complex and dynamic maneuver." - ) + ("Sit", 1009, "Commands the robot to sit down from a standing or moving stance."), + ( + "RiseSit", + 1010, + "Commands the robot to rise back to a standing position from a sitting posture.", + ), + ( + "SwitchGait", + 1011, + "Switches the robot's walking pattern or style dynamically, suitable for different terrains or speeds.", + ), + ("Trigger", 1012, "Triggers a specific action or custom routine programmed into the robot."), + ( + "BodyHeight", + 1013, + "Adjusts the height of the robot's body from the ground, useful for navigating various obstacles.", + ), + ( + "FootRaiseHeight", + 1014, + "Controls how high the robot lifts its feet during movement, which can be adjusted for different surfaces.", + ), + ( + "SpeedLevel", + 1015, + "Sets or adjusts the speed at which the robot moves, with various levels available for different operational needs.", + ), + ( + "Hello", + 1016, + "Performs a greeting action, which could involve a wave or other friendly gesture.", + ), + ("Stretch", 1017, "Engages the robot in a stretching routine."), + ( + "TrajectoryFollow", + 1018, + "Directs the robot to follow a predefined trajectory, which could involve complex paths or maneuvers.", + ), + ( + "ContinuousGait", + 1019, + "Enables a mode for continuous walking or running, ideal for long-distance travel.", + ), + ("Content", 1020, "To display or trigger when the robot is happy."), + ("Wallow", 1021, "The robot falls onto its back and rolls around."), + ( + "Dance1", + 1022, + "Performs a predefined dance routine 1, programmed for entertainment or demonstration.", + ), + ("Dance2", 1023, "Performs another variant of a predefined dance routine 2."), + ("GetBodyHeight", 1024, "Retrieves the current height of the robot's body from the ground."), + ( + "GetFootRaiseHeight", + 1025, + "Retrieves the current height at which the robot's feet are being raised during movement.", + ), + ("GetSpeedLevel", 1026, "Returns the current speed level at which the robot is operating."), + ( + "SwitchJoystick", + 1027, + "Toggles the control mode to joystick input, allowing for manual direction of the robot's movements.", + ), + ( + "Pose", + 1028, + "Directs the robot to take a specific pose or stance, which could be used for tasks or performances.", + ), + ( + "Scrape", + 1029, + "Robot falls to its hind legs and makes scraping motions with its front legs.", + ), + ("FrontFlip", 1030, "Executes a front flip, a complex and dynamic maneuver."), + ("FrontJump", 1031, "Commands the robot to perform a forward jump."), + ( + "FrontPounce", + 1032, + "Initiates a pouncing movement forward, mimicking animal-like pouncing behavior.", + ), + ("WiggleHips", 1033, "Causes the robot to wiggle its hips."), + ( + "GetState", + 1034, + "Retrieves the current operational state of the robot, including status reports or diagnostic information.", + ), + ( + "EconomicGait", + 1035, + "Engages a more energy-efficient walking or running mode to conserve battery life.", + ), + ("FingerHeart", 1036, "Performs a finger heart gesture while on its hind legs."), + ( + "Handstand", + 1301, + "Commands the robot to perform a handstand, demonstrating balance and control.", + ), + ( + "CrossStep", + 1302, + "Engages the robot in a cross-stepping routine, useful for complex locomotion or dance moves.", + ), + ( + "OnesidedStep", + 1303, + "Commands the robot to perform a stepping motion that predominantly uses one side.", + ), + ( + "Bound", + 1304, + "Initiates a bounding motion, similar to a light, repetitive hopping or leaping.", + ), + ( + "LeadFollow", + 1045, + "Engages follow-the-leader behavior, where the robot follows a designated leader or follows a signal.", + ), + ("LeftFlip", 1042, "Executes a flip towards the left side."), + ("RightFlip", 1043, "Performs a flip towards the right side."), + ("Backflip", 1044, "Executes a backflip, a complex and dynamic maneuver."), ] # region MyUnitreeSkills + class MyUnitreeSkills(SkillLibrary): """My Unitree Skills.""" _robot: Optional[Robot] = None @classmethod - def register_skills(cls, skill_classes: Union['AbstractSkill', list['AbstractSkill']]): + def register_skills(cls, skill_classes: Union["AbstractSkill", list["AbstractSkill"]]): """Add multiple skill classes as class attributes. - + Args: skill_classes: List of skill classes to add """ @@ -193,9 +216,11 @@ def initialize_skills(self): # Provide the robot instance to each skill for skill_class in self: - print(f"{Colors.GREEN_PRINT_COLOR}Creating instance for skill: {skill_class}{Colors.RESET_COLOR}") + print( + f"{Colors.GREEN_PRINT_COLOR}Creating instance for skill: {skill_class}{Colors.RESET_COLOR}" + ) self.create_instance(skill_class.__name__, robot=self._robot) - + # Refresh the class skills self.refresh_class_skills() @@ -214,7 +239,8 @@ def __call__(self): raise RuntimeError( f"{Colors.RED_PRINT_COLOR}" f"No App ID provided to {self.__class__.__name__} Skill" - f"{Colors.RESET_COLOR}") + f"{Colors.RESET_COLOR}" + ) else: self._robot.webrtc_req(api_id=self._app_id) string = f"{Colors.GREEN_PRINT_COLOR}{self.__class__.__name__} was successful: id={self._app_id}{Colors.RESET_COLOR}" @@ -226,123 +252,38 @@ def __call__(self): skill_class = type( name, # Name of the class (BaseUnitreeSkill,), # Base classes - { - '__doc__': description, - '_app_id': app_id - }) + {"__doc__": description, "_app_id": app_id}, + ) skills_classes.append(skill_class) return skills_classes # region Class-based Skills - + class Move(AbstractRobotSkill): - """Move the robot using direct velocity commands. - - This skill works with both ROS and WebRTC robot implementations. - """ + """Move the robot using direct velocity commands. Determine duration required based on user distance instructions.""" x: float = Field(..., description="Forward velocity (m/s).") y: float = Field(default=0.0, description="Left/right velocity (m/s)") yaw: float = Field(default=0.0, description="Rotational velocity (rad/s)") - duration: float = Field(default=0.0, description="How long to move (seconds). If 0, command is continuous") + duration: float = Field(default=0.0, description="How long to move (seconds).") def __call__(self): super().__call__() - - from dimos.types.vector import Vector - vector = Vector(self.x, self.y, self.yaw) - - # Handle duration for continuous movement - if self.duration > 0: - import time - import threading - import asyncio - - # Create a stop event - stop_event = threading.Event() - - # Function to continuously send movement commands - async def continuous_move(): - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - start_time = time.time() - try: - while not stop_event.is_set() and (time.time() - start_time) < self.duration: - self._robot.move(vector) - await asyncio.sleep(0.001) # Send commands at 1000Hz - # Always stop at the end - self._robot.move(Vector(0, 0, 0)) - finally: - loop.close() - - # Run movement in a separate thread with asyncio event loop - move_thread = threading.Thread(target=lambda: asyncio.run(continuous_move())) - move_thread.daemon = True - move_thread.start() - - # Wait for the full duration - time.sleep(self.duration) - stop_event.set() - move_thread.join(timeout=0.5) # Wait for thread to finish with timeout - else: - # Just execute the move command once for continuous movement - self._robot.move(vector) - return True + return self._robot.move_vel(x=self.x, y=self.y, yaw=self.yaw, duration=self.duration) class Reverse(AbstractRobotSkill): - """Reverse the robot using direct velocity commands. - - This skill works with both ROS and WebRTC robot implementations. - """ + """Reverse the robot using direct velocity commands. Determine duration required based on user distance instructions.""" x: float = Field(..., description="Backward velocity (m/s). Positive values move backward.") y: float = Field(default=0.0, description="Left/right velocity (m/s)") yaw: float = Field(default=0.0, description="Rotational velocity (rad/s)") - duration: float = Field(default=0.0, description="How long to move (seconds). If 0, command is continuous") + duration: float = Field(default=0.0, description="How long to move (seconds).") def __call__(self): super().__call__() - from dimos.types.vector import Vector - # Use negative x for backward movement - vector = Vector(-self.x, self.y, self.yaw) - - # Handle duration for continuous movement - if self.duration > 0: - import time - import threading - import asyncio - - # Create a stop event - stop_event = threading.Event() - - # Function to continuously send movement commands - async def continuous_move(): - loop = asyncio.new_event_loop() - asyncio.set_event_loop(loop) - start_time = time.time() - try: - while not stop_event.is_set() and (time.time() - start_time) < self.duration: - self._robot.move(vector) - await asyncio.sleep(0.001) # Send commands at 1000Hz - # Always stop at the end - self._robot.move(Vector(0, 0, 0)) - finally: - loop.close() - - # Run movement in a separate thread with asyncio event loop - move_thread = threading.Thread(target=lambda: asyncio.run(continuous_move())) - move_thread.daemon = True - move_thread.start() - - # Wait for the full duration - time.sleep(self.duration) - stop_event.set() - move_thread.join(timeout=0.5) # Wait for thread to finish with timeout - else: - # Just execute the move command once for continuous movement - self._robot.move(vector) - return True + # Use move_vel with negative x for backward movement + return self._robot.move_vel(x=-self.x, y=self.y, yaw=self.yaw, duration=self.duration) class SpinLeft(AbstractRobotSkill): """Spin the robot left using degree commands.""" @@ -368,5 +309,5 @@ class Wait(AbstractSkill): seconds: float = Field(..., description="Seconds to wait") def __call__(self): - time.sleep(self.seconds) + time.sleep(self.seconds) return f"Wait completed with length={self.seconds}s" diff --git a/dimos/robot/unitree_webrtc/connection.py b/dimos/robot/unitree_webrtc/connection.py index 48ea276883..7b9595b696 100644 --- a/dimos/robot/unitree_webrtc/connection.py +++ b/dimos/robot/unitree_webrtc/connection.py @@ -90,7 +90,11 @@ def raw_odom_stream(self) -> Subject[Position]: @functools.cache def lidar_stream(self) -> Subject[LidarMessage]: - return backpressure(self.raw_lidar_stream().pipe(ops.map(lambda raw_frame: LidarMessage.from_msg(raw_frame)))) + return backpressure( + self.raw_lidar_stream().pipe( + ops.map(lambda raw_frame: LidarMessage.from_msg(raw_frame)) + ) + ) @functools.cache def odom_stream(self) -> Subject[Position]: diff --git a/dimos/robot/unitree_webrtc/test_tooling.py b/dimos/robot/unitree_webrtc/test_tooling.py index d8f6bc5cff..a29a2bd371 100644 --- a/dimos/robot/unitree_webrtc/test_tooling.py +++ b/dimos/robot/unitree_webrtc/test_tooling.py @@ -15,6 +15,7 @@ @pytest.mark.tool def test_record_lidar(): from dimos.robot.unitree_webrtc.unitree_go2 import UnitreeGo2 + load_dotenv() robot = UnitreeGo2(ip=os.getenv("ROBOT_IP"), mode="ai") @@ -42,6 +43,7 @@ def test_record_lidar(): @pytest.mark.tool def test_replay_recording(): from dimos.robot.unitree_webrtc.type.odometry import position_from_odom + odom_stream = Multimock("athens_odom").stream().pipe(ops.map(position_from_odom)) odom_stream.subscribe(lambda x: print(x)) diff --git a/dimos/robot/unitree_webrtc/testing/helpers.py b/dimos/robot/unitree_webrtc/testing/helpers.py index 6f815abd56..20a4dbedc2 100644 --- a/dimos/robot/unitree_webrtc/testing/helpers.py +++ b/dimos/robot/unitree_webrtc/testing/helpers.py @@ -25,7 +25,12 @@ def benchmark(calls: int, targetf: Callable[[], Union[int, None]]) -> float: return (end - start + timemod) * 1000 / calls -O3dDrawable = o3d.geometry.Geometry | o3d.geometry.LineSet | o3d.geometry.TriangleMesh | o3d.geometry.PointCloud +O3dDrawable = ( + o3d.geometry.Geometry + | o3d.geometry.LineSet + | o3d.geometry.TriangleMesh + | o3d.geometry.PointCloud +) class ReturnsDrawable(Protocol): diff --git a/dimos/robot/unitree_webrtc/testing/test_mock.py b/dimos/robot/unitree_webrtc/testing/test_mock.py index d30c38ec27..7e5acce7d1 100644 --- a/dimos/robot/unitree_webrtc/testing/test_mock.py +++ b/dimos/robot/unitree_webrtc/testing/test_mock.py @@ -4,6 +4,7 @@ from dimos.robot.unitree_webrtc.type.lidar import LidarMessage from dimos.robot.unitree_webrtc.testing.mock import Mock + @pytest.mark.needsdata def test_mock_load_cast(): mock = Mock("test") diff --git a/dimos/robot/unitree_webrtc/testing/test_multimock.py b/dimos/robot/unitree_webrtc/testing/test_multimock.py index 26e19d7f26..754a9cce44 100644 --- a/dimos/robot/unitree_webrtc/testing/test_multimock.py +++ b/dimos/robot/unitree_webrtc/testing/test_multimock.py @@ -12,10 +12,13 @@ from dimos.robot.unitree_webrtc.type.timeseries import to_datetime from dimos.robot.unitree_webrtc.testing.multimock import Multimock + @pytest.mark.needsdata @pytest.mark.vis def test_multimock_stream(): - backpressure(Multimock("athens_odom").stream().pipe(ops.map(Odometry.from_msg))).subscribe(lambda x: print(x)) + backpressure(Multimock("athens_odom").stream().pipe(ops.map(Odometry.from_msg))).subscribe( + lambda x: print(x) + ) map = Map() def lidarmsg(msg): @@ -77,12 +80,16 @@ def test_webui_multistream(): websocket_vis.start() odom_stream = Multimock("athens_odom").stream().pipe(ops.map(Odometry.from_msg)) - lidar_stream = backpressure(Multimock("athens_lidar").stream().pipe(ops.map(LidarMessage.from_msg))) + lidar_stream = backpressure( + Multimock("athens_lidar").stream().pipe(ops.map(LidarMessage.from_msg)) + ) map = Map() map_stream = map.consume(lidar_stream) - costmap_stream = map_stream.pipe(ops.map(lambda x: ["costmap", map.costmap.smudge(preserve_unknown=False)])) + costmap_stream = map_stream.pipe( + ops.map(lambda x: ["costmap", map.costmap.smudge(preserve_unknown=False)]) + ) websocket_vis.connect(costmap_stream) websocket_vis.connect(odom_stream.pipe(ops.map(lambda pos: ["robot_pos", pos.pos.to_2d()]))) diff --git a/dimos/robot/unitree_webrtc/type/costmap.py b/dimos/robot/unitree_webrtc/type/costmap.py index 49e600ab46..814184479e 100644 --- a/dimos/robot/unitree_webrtc/type/costmap.py +++ b/dimos/robot/unitree_webrtc/type/costmap.py @@ -65,7 +65,9 @@ def save_pickle(self, pickle_path: str): pickle.dump(self, f) @classmethod - def create_empty(cls, width: int = 100, height: int = 100, resolution: float = 0.1) -> "Costmap": + def create_empty( + cls, width: int = 100, height: int = 100, resolution: float = 0.1 + ) -> "Costmap": """Create an empty costmap with specified dimensions.""" return cls( grid=np.zeros((height, width), dtype=np.int8), @@ -185,7 +187,9 @@ def smudge( for i in range(iterations): # Dilate the binary map - dilated = ndimage.binary_dilation(dilated_map > 0, structure=kernel, iterations=1).astype(np.uint8) + dilated = ndimage.binary_dilation( + dilated_map > 0, structure=kernel, iterations=1 + ).astype(np.uint8) # Calculate the new layer (cells that were just added in this iteration) new_layer = (dilated - (dilated_map > 0).astype(np.uint8)) * 100 diff --git a/dimos/robot/unitree_webrtc/type/lidar.py b/dimos/robot/unitree_webrtc/type/lidar.py index 37a51b702a..a0e081d4f1 100644 --- a/dimos/robot/unitree_webrtc/type/lidar.py +++ b/dimos/robot/unitree_webrtc/type/lidar.py @@ -124,7 +124,9 @@ def icptransform(self, other): def estimate_normals(self) -> "LidarMessage": # Check if normals already exist by testing if the normals attribute has data if not self.pointcloud.has_normals() or len(self.pointcloud.normals) == 0: - self.pointcloud.estimate_normals(search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30)) + self.pointcloud.estimate_normals( + search_param=o3d.geometry.KDTreeSearchParamHybrid(radius=0.1, max_nn=30) + ) return self def color(self, color_choice) -> "LidarMessage": diff --git a/dimos/robot/unitree_webrtc/type/map.py b/dimos/robot/unitree_webrtc/type/map.py index eef15bdeef..cbfe4eb903 100644 --- a/dimos/robot/unitree_webrtc/type/map.py +++ b/dimos/robot/unitree_webrtc/type/map.py @@ -77,9 +77,11 @@ def splice_cylinder( map_pts = np.asarray(map_pcd.points) planar_dists_map = np.linalg.norm(map_pts[:, axes] - center[axes], axis=1) - victims = np.nonzero((planar_dists_map < radius) & (map_pts[:, axis] >= axis_min) & (map_pts[:, axis] <= axis_max))[ - 0 - ] + victims = np.nonzero( + (planar_dists_map < radius) + & (map_pts[:, axis] >= axis_min) + & (map_pts[:, axis] <= axis_max) + )[0] survivors = map_pcd.select_by_index(victims, invert=True) return survivors + patch_pcd diff --git a/dimos/robot/unitree_webrtc/type/test_lidar.py b/dimos/robot/unitree_webrtc/type/test_lidar.py index 65f102c580..0b860c9658 100644 --- a/dimos/robot/unitree_webrtc/type/test_lidar.py +++ b/dimos/robot/unitree_webrtc/type/test_lidar.py @@ -116,7 +116,10 @@ def test_downsample(): # framea_icp = framea.copy().icptransform(frameb) pcd = framea.copy().pointcloud newpcd, _, _ = pcd.voxel_down_sample_and_trace( - voxel_size=0.25, min_bound=pcd.get_min_bound(), max_bound=pcd.get_max_bound(), approximate_class=False + voxel_size=0.25, + min_bound=pcd.get_min_bound(), + max_bound=pcd.get_max_bound(), + approximate_class=False, ) multivis( diff --git a/dimos/robot/unitree_webrtc/type/test_timeseries.py b/dimos/robot/unitree_webrtc/type/test_timeseries.py index 00f29c3202..ff01d2180d 100644 --- a/dimos/robot/unitree_webrtc/type/test_timeseries.py +++ b/dimos/robot/unitree_webrtc/type/test_timeseries.py @@ -1,5 +1,4 @@ from datetime import timedelta, datetime -from typing import TypeVar from dimos.robot.unitree_webrtc.type.timeseries import TEvent, TList diff --git a/dimos/robot/unitree_webrtc/type/vector.py b/dimos/robot/unitree_webrtc/type/vector.py index 368867dd4d..e5fb446884 100644 --- a/dimos/robot/unitree_webrtc/type/vector.py +++ b/dimos/robot/unitree_webrtc/type/vector.py @@ -188,9 +188,7 @@ def distance_squared(self, other: Union["Vector", Iterable[float]]) -> float: def angle(self, other: Union["Vector", Iterable[float]]) -> float: """Compute the angle (in radians) between this vector and another.""" - if self.length() < 1e-10 or ( - isinstance(other, Vector) and other.length() < 1e-10 - ): + if self.length() < 1e-10 or (isinstance(other, Vector) and other.length() < 1e-10): return 0.0 if isinstance(other, Vector): @@ -553,12 +551,8 @@ def z(value: VectorLike) -> float: print("Testing VectorLike Protocol:") print(f"isinstance(Vector(1,2), VectorLike): {isinstance(vec2d, VectorLike)}") print(f"isinstance(np.array([1,2]), VectorLike): {isinstance(arr2d, VectorLike)}") - print( - f"isinstance((1,2), VectorLike): {isinstance((1.0, 2.0), VectorLike)}" - ) - print( - f"isinstance([1,2], VectorLike): {isinstance([1.0, 2.0], VectorLike)}" - ) + print(f"isinstance((1,2), VectorLike): {isinstance((1.0, 2.0), VectorLike)}") + print(f"isinstance([1,2], VectorLike): {isinstance([1.0, 2.0], VectorLike)}") print() # Test mixed operations using different vector types @@ -575,10 +569,6 @@ def midpoint(a: VectorLike, b: VectorLike) -> NDArray[np.float64]: return (a_np + b_np) / 2 print("Mixed operations between different vector types:") - print( - f"distance(Vector(1,2,3), [4,5,6]): {distance(vec3d, [4.0, 5.0, 6.0])}" - ) - print( - f"distance(np.array([1,2,3]), (4,5,6)): {distance(arr3d, (4.0, 5.0, 6.0))}" - ) + print(f"distance(Vector(1,2,3), [4,5,6]): {distance(vec3d, [4.0, 5.0, 6.0])}") + print(f"distance(np.array([1,2,3]), (4,5,6)): {distance(arr3d, (4.0, 5.0, 6.0))}") print(f"midpoint(Vector(1,2,3), np.array([4,5,6])): {midpoint(vec3d, numpy_arr)}") diff --git a/dimos/robot/unitree_webrtc/unitree_go2.py b/dimos/robot/unitree_webrtc/unitree_go2.py index f6e4c1b47c..5d92d61d97 100644 --- a/dimos/robot/unitree_webrtc/unitree_go2.py +++ b/dimos/robot/unitree_webrtc/unitree_go2.py @@ -1,17 +1,14 @@ -from dataclasses import dataclass -from dimos.types.path import Path from dimos.types.vector import Vector from typing import Union, Optional from dimos.robot.unitree_webrtc.type.map import Map from dimos.robot.unitree_webrtc.connection import WebRTCRobot from dimos.robot.global_planner.planner import AstarPlanner -from dimos.utils.reactive import backpressure from dimos.utils.reactive import getter_streaming from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.skills.skills import AbstractRobotSkill, AbstractSkill, SkillLibrary +from dimos.skills.skills import AbstractSkill, SkillLibrary import os from go2_webrtc_driver.constants import VUI_COLOR -from dimos.robot.local_planner import VFHPurePursuitPlanner, navigate_path_local +from dimos.robot.local_planner import navigate_path_local class Color(VUI_COLOR): ... diff --git a/dimos/simulation/__init__.py b/dimos/simulation/__init__.py index 7b35329862..3d25363b30 100644 --- a/dimos/simulation/__init__.py +++ b/dimos/simulation/__init__.py @@ -12,9 +12,4 @@ GenesisSimulator = None # type: ignore GenesisStream = None # type: ignore -__all__ = [ - 'IsaacSimulator', - 'IsaacStream', - 'GenesisSimulator', - 'GenesisStream' -] \ No newline at end of file +__all__ = ["IsaacSimulator", "IsaacStream", "GenesisSimulator", "GenesisStream"] diff --git a/dimos/simulation/base/simulator_base.py b/dimos/simulation/base/simulator_base.py index 8fd048b026..717e8e1719 100644 --- a/dimos/simulation/base/simulator_base.py +++ b/dimos/simulation/base/simulator_base.py @@ -1,19 +1,19 @@ from typing import Optional, Union, List, Dict from abc import ABC, abstractmethod -from pathlib import Path + class SimulatorBase(ABC): """Base class for simulators.""" - + @abstractmethod def __init__( - self, + self, headless: bool = True, open_usd: Optional[str] = None, # Keep for Isaac compatibility - entities: Optional[List[Dict[str, Union[str, dict]]]] = None # Add for Genesis + entities: Optional[List[Dict[str, Union[str, dict]]]] = None, # Add for Genesis ): """Initialize the simulator. - + Args: headless: Whether to run without visualization open_usd: Path to USD file (for Isaac) @@ -22,13 +22,13 @@ def __init__( self.headless = headless self.open_usd = open_usd self.stage = None - + @abstractmethod def get_stage(self): """Get the current stage/scene.""" pass - + @abstractmethod def close(self): """Close the simulation.""" - pass \ No newline at end of file + pass diff --git a/dimos/simulation/base/stream_base.py b/dimos/simulation/base/stream_base.py index 6308207419..3fea3c54d9 100644 --- a/dimos/simulation/base/stream_base.py +++ b/dimos/simulation/base/stream_base.py @@ -3,12 +3,13 @@ from pathlib import Path import subprocess -AnnotatorType = Literal['rgb', 'normals', 'bounding_box_3d', 'motion_vectors'] -TransportType = Literal['tcp', 'udp'] +AnnotatorType = Literal["rgb", "normals", "bounding_box_3d", "motion_vectors"] +TransportType = Literal["tcp", "udp"] + class StreamBase(ABC): """Base class for simulation streaming.""" - + @abstractmethod def __init__( self, @@ -17,13 +18,13 @@ def __init__( height: int = 1080, fps: int = 60, camera_path: str = "/World/camera", - annotator_type: AnnotatorType = 'rgb', - transport: TransportType = 'tcp', + annotator_type: AnnotatorType = "rgb", + transport: TransportType = "tcp", rtsp_url: str = "rtsp://mediamtx:8554/stream", - usd_path: Optional[Union[str, Path]] = None + usd_path: Optional[Union[str, Path]] = None, ): """Initialize the stream. - + Args: simulator: Simulator instance width: Stream width in pixels @@ -44,48 +45,58 @@ def __init__( self.transport = transport self.rtsp_url = rtsp_url self.proc = None - + @abstractmethod def _load_stage(self, usd_path: Union[str, Path]): """Load stage from file.""" pass - + @abstractmethod def _setup_camera(self): """Setup and validate camera.""" pass - + def _setup_ffmpeg(self): """Setup FFmpeg process for streaming.""" command = [ - 'ffmpeg', - '-y', - '-f', 'rawvideo', - '-vcodec', 'rawvideo', - '-pix_fmt', 'bgr24', - '-s', f"{self.width}x{self.height}", - '-r', str(self.fps), - '-i', '-', - '-an', - '-c:v', 'h264_nvenc', - '-preset', 'fast', - '-f', 'rtsp', - '-rtsp_transport', self.transport, - self.rtsp_url + "ffmpeg", + "-y", + "-f", + "rawvideo", + "-vcodec", + "rawvideo", + "-pix_fmt", + "bgr24", + "-s", + f"{self.width}x{self.height}", + "-r", + str(self.fps), + "-i", + "-", + "-an", + "-c:v", + "h264_nvenc", + "-preset", + "fast", + "-f", + "rtsp", + "-rtsp_transport", + self.transport, + self.rtsp_url, ] self.proc = subprocess.Popen(command, stdin=subprocess.PIPE) - + @abstractmethod def _setup_annotator(self): """Setup annotator.""" pass - + @abstractmethod def stream(self): """Start streaming.""" pass - + @abstractmethod def cleanup(self): """Cleanup resources.""" - pass \ No newline at end of file + pass diff --git a/dimos/simulation/genesis/__init__.py b/dimos/simulation/genesis/__init__.py index f1d88ebc9f..5657d9167b 100644 --- a/dimos/simulation/genesis/__init__.py +++ b/dimos/simulation/genesis/__init__.py @@ -1,7 +1,4 @@ from .simulator import GenesisSimulator from .stream import GenesisStream -__all__ = [ - 'GenesisSimulator', - 'GenesisStream' -] \ No newline at end of file +__all__ = ["GenesisSimulator", "GenesisStream"] diff --git a/dimos/simulation/genesis/simulator.py b/dimos/simulation/genesis/simulator.py index 7982a9f810..fc3958f297 100644 --- a/dimos/simulation/genesis/simulator.py +++ b/dimos/simulation/genesis/simulator.py @@ -1,19 +1,19 @@ from typing import Optional, Union, List, Dict import genesis as gs # type: ignore -from pathlib import Path from ..base.simulator_base import SimulatorBase + class GenesisSimulator(SimulatorBase): """Genesis simulator implementation.""" - + def __init__( - self, + self, headless: bool = True, open_usd: Optional[str] = None, # Keep for compatibility - entities: Optional[List[Dict[str, Union[str, dict]]]] = None + entities: Optional[List[Dict[str, Union[str, dict]]]] = None, ): """Initialize the Genesis simulation. - + Args: headless: Whether to run without visualization open_usd: Path to USD file (for Isaac) @@ -23,10 +23,10 @@ def __init__( - params: dict (parameters for primitives or loading options) """ super().__init__(headless, open_usd, entities) - + # Initialize Genesis gs.init() - + # Create scene with viewer options self.scene = gs.Scene( show_viewer=not headless, @@ -47,98 +47,98 @@ def __init__( ), renderer=gs.renderers.Rasterizer(), ) - + # Handle USD parameter for compatibility if open_usd: print(f"[Warning] USD files not supported in Genesis. Ignoring: {open_usd}") - + # Load entities if provided if entities: self._load_entities(entities) - + # Don't build scene yet - let stream add camera first self.is_built = False - + def _load_entities(self, entities: List[Dict[str, Union[str, dict]]]): """Load multiple entities into the scene.""" for entity in entities: - entity_type = entity.get('type', '').lower() - path = entity.get('path', '') - params = entity.get('params', {}) - + entity_type = entity.get("type", "").lower() + path = entity.get("path", "") + params = entity.get("params", {}) + try: - if entity_type == 'mesh': + if entity_type == "mesh": mesh = gs.morphs.Mesh( file=path, # Explicit file argument - **params + **params, ) self.scene.add_entity(mesh) print(f"[Genesis] Added mesh from {path}") - - elif entity_type == 'urdf': + + elif entity_type == "urdf": robot = gs.morphs.URDF( file=path, # Explicit file argument - **params + **params, ) self.scene.add_entity(robot) print(f"[Genesis] Added URDF robot from {path}") - - elif entity_type == 'mjcf': + + elif entity_type == "mjcf": mujoco = gs.morphs.MJCF( file=path, # Explicit file argument - **params + **params, ) self.scene.add_entity(mujoco) print(f"[Genesis] Added MJCF model from {path}") - - elif entity_type == 'primitive': - shape_type = params.pop('shape', 'plane') - if shape_type == 'plane': + + elif entity_type == "primitive": + shape_type = params.pop("shape", "plane") + if shape_type == "plane": morph = gs.morphs.Plane(**params) - elif shape_type == 'box': + elif shape_type == "box": morph = gs.morphs.Box(**params) - elif shape_type == 'sphere': + elif shape_type == "sphere": morph = gs.morphs.Sphere(**params) else: raise ValueError(f"Unsupported primitive shape: {shape_type}") - + # Add position if not specified - if 'pos' not in params: - if shape_type == 'plane': + if "pos" not in params: + if shape_type == "plane": morph.pos = [0, 0, 0] else: morph.pos = [0, 0, 1] # Lift objects above ground - + self.scene.add_entity(morph) print(f"[Genesis] Added {shape_type} at position {morph.pos}") - + else: raise ValueError(f"Unsupported entity type: {entity_type}") - + except Exception as e: print(f"[Warning] Failed to load entity {entity}: {str(e)}") - - def add_entity(self, entity_type: str, path: str = '', **params): + + def add_entity(self, entity_type: str, path: str = "", **params): """Add a single entity to the scene. - + Args: entity_type: Type of entity ('mesh', 'urdf', 'mjcf', 'primitive') path: File path for mesh/urdf/mjcf entities **params: Additional parameters for entity creation """ - self._load_entities([{'type': entity_type, 'path': path, 'params': params}]) - + self._load_entities([{"type": entity_type, "path": path, "params": params}]) + def get_stage(self): """Get the current stage/scene.""" return self.scene - + def build(self): """Build the scene if not already built.""" if not self.is_built: self.scene.build() self.is_built = True - + def close(self): """Close the simulation.""" # Genesis handles cleanup automatically - pass \ No newline at end of file + pass diff --git a/dimos/simulation/genesis/stream.py b/dimos/simulation/genesis/stream.py index 7ff6b44f7f..b553f29fa2 100644 --- a/dimos/simulation/genesis/stream.py +++ b/dimos/simulation/genesis/stream.py @@ -1,14 +1,14 @@ import cv2 import numpy as np import time -import subprocess -from typing import Literal, Optional, Union +from typing import Optional, Union from pathlib import Path from ..base.stream_base import StreamBase, AnnotatorType, TransportType + class GenesisStream(StreamBase): """Genesis stream implementation.""" - + def __init__( self, simulator, @@ -16,10 +16,10 @@ def __init__( height: int = 1080, fps: int = 60, camera_path: str = "/camera", - annotator_type: AnnotatorType = 'rgb', - transport: TransportType = 'tcp', + annotator_type: AnnotatorType = "rgb", + transport: TransportType = "tcp", rtsp_url: str = "rtsp://mediamtx:8554/stream", - usd_path: Optional[Union[str, Path]] = None + usd_path: Optional[Union[str, Path]] = None, ): """Initialize the Genesis stream.""" super().__init__( @@ -31,26 +31,26 @@ def __init__( annotator_type=annotator_type, transport=transport, rtsp_url=rtsp_url, - usd_path=usd_path + usd_path=usd_path, ) - + self.scene = simulator.get_stage() - + # Initialize components if usd_path: self._load_stage(usd_path) self._setup_camera() self._setup_ffmpeg() self._setup_annotator() - + # Build scene after camera is set up simulator.build() - + def _load_stage(self, usd_path: Union[str, Path]): """Load stage from file.""" # Genesis handles stage loading through simulator pass - + def _setup_camera(self): """Setup and validate camera.""" self.camera = self.scene.add_camera( @@ -60,63 +60,65 @@ def _setup_camera(self): fov=30, GUI=False, ) - + def _setup_annotator(self): """Setup the specified annotator.""" # Genesis handles different render types through camera.render() pass - + def stream(self): """Start the streaming loop.""" try: print("[Stream] Starting Genesis camera stream...") frame_count = 0 start_time = time.time() - + while True: frame_start = time.time() - + # Step simulation and get frame step_start = time.time() self.scene.step() step_time = time.time() - step_start - print(f"[Stream] Simulation step took {step_time*1000:.2f}ms") + print(f"[Stream] Simulation step took {step_time * 1000:.2f}ms") # Get frame based on annotator type - if self.annotator_type == 'rgb': + if self.annotator_type == "rgb": frame, _, _, _ = self.camera.render(rgb=True) - elif self.annotator_type == 'normals': + elif self.annotator_type == "normals": _, _, _, frame = self.camera.render(normal=True) else: frame, _, _, _ = self.camera.render(rgb=True) # Default to RGB - + # Convert frame format if needed if isinstance(frame, np.ndarray): frame = cv2.cvtColor(frame, cv2.COLOR_RGB2BGR) - + # Write to FFmpeg self.proc.stdin.write(frame.tobytes()) self.proc.stdin.flush() - + # Log metrics frame_time = time.time() - frame_start - print(f"[Stream] Total frame processing took {frame_time*1000:.2f}ms") + print(f"[Stream] Total frame processing took {frame_time * 1000:.2f}ms") frame_count += 1 - + if frame_count % 100 == 0: elapsed_time = time.time() - start_time current_fps = frame_count / elapsed_time - print(f"[Stream] Processed {frame_count} frames | Current FPS: {current_fps:.2f}") - + print( + f"[Stream] Processed {frame_count} frames | Current FPS: {current_fps:.2f}" + ) + except KeyboardInterrupt: print("\n[Stream] Received keyboard interrupt, stopping stream...") finally: self.cleanup() - + def cleanup(self): """Cleanup resources.""" print("[Cleanup] Stopping FFmpeg process...") - if hasattr(self, 'proc'): + if hasattr(self, "proc"): self.proc.stdin.close() self.proc.wait() print("[Cleanup] Closing simulation...") @@ -124,4 +126,4 @@ def cleanup(self): self.simulator.close() except AttributeError: print("[Cleanup] Warning: Could not close simulator properly") - print("[Cleanup] Successfully cleaned up resources") \ No newline at end of file + print("[Cleanup] Successfully cleaned up resources") diff --git a/dimos/simulation/isaac/__init__.py b/dimos/simulation/isaac/__init__.py index 85e42aa9c1..2b9bdc082d 100644 --- a/dimos/simulation/isaac/__init__.py +++ b/dimos/simulation/isaac/__init__.py @@ -1,7 +1,4 @@ from .simulator import IsaacSimulator from .stream import IsaacStream -__all__ = [ - 'IsaacSimulator', - 'IsaacStream' -] \ No newline at end of file +__all__ = ["IsaacSimulator", "IsaacStream"] diff --git a/dimos/simulation/isaac/simulator.py b/dimos/simulation/isaac/simulator.py index 050c12c80b..99d23b4361 100644 --- a/dimos/simulation/isaac/simulator.py +++ b/dimos/simulation/isaac/simulator.py @@ -2,29 +2,28 @@ from isaacsim import SimulationApp from ..base.simulator_base import SimulatorBase + class IsaacSimulator(SimulatorBase): """Isaac Sim simulator implementation.""" - + def __init__( - self, - headless: bool = True, + self, + headless: bool = True, open_usd: Optional[str] = None, - entities: Optional[List[Dict[str, Union[str, dict]]]] = None # Add but ignore -): + entities: Optional[List[Dict[str, Union[str, dict]]]] = None, # Add but ignore + ): """Initialize the Isaac Sim simulation.""" super().__init__(headless, open_usd) - self.app = SimulationApp({ - "headless": headless, - "open_usd": open_usd - }) - + self.app = SimulationApp({"headless": headless, "open_usd": open_usd}) + def get_stage(self): """Get the current USD stage.""" import omni.usd + self.stage = omni.usd.get_context().get_stage() return self.stage - + def close(self): """Close the simulation.""" - if hasattr(self, 'app'): - self.app.close() \ No newline at end of file + if hasattr(self, "app"): + self.app.close() diff --git a/dimos/simulation/isaac/stream.py b/dimos/simulation/isaac/stream.py index b535b35608..44560783bd 100644 --- a/dimos/simulation/isaac/stream.py +++ b/dimos/simulation/isaac/stream.py @@ -12,17 +12,16 @@ # See the License for the specific language governing permissions and # limitations under the License. -from isaacsim import SimulationApp import cv2 -import numpy as np import time -from typing import Literal, Optional, Union +from typing import Optional, Union from pathlib import Path from ..base.stream_base import StreamBase, AnnotatorType, TransportType + class IsaacStream(StreamBase): """Isaac Sim stream implementation.""" - + def __init__( self, simulator, @@ -30,10 +29,10 @@ def __init__( height: int = 1080, fps: int = 60, camera_path: str = "/World/alfred_parent_prim/alfred_base_descr/chest_cam_rgb_camera_frame/chest_cam", - annotator_type: AnnotatorType = 'rgb', - transport: TransportType = 'tcp', + annotator_type: AnnotatorType = "rgb", + transport: TransportType = "tcp", rtsp_url: str = "rtsp://mediamtx:8554/stream", - usd_path: Optional[Union[str, Path]] = None + usd_path: Optional[Union[str, Path]] = None, ): """Initialize the Isaac Sim stream.""" super().__init__( @@ -45,90 +44,93 @@ def __init__( annotator_type=annotator_type, transport=transport, rtsp_url=rtsp_url, - usd_path=usd_path + usd_path=usd_path, ) - + # Import omni.replicator after SimulationApp initialization import omni.replicator.core as rep + self.rep = rep - + # Initialize components if usd_path: self._load_stage(usd_path) self._setup_camera() self._setup_ffmpeg() self._setup_annotator() - + def _load_stage(self, usd_path: Union[str, Path]): """Load USD stage from file.""" import omni.usd + abs_path = str(Path(usd_path).resolve()) omni.usd.get_context().open_stage(abs_path) self.stage = self.simulator.get_stage() if not self.stage: raise RuntimeError(f"Failed to load stage: {abs_path}") - + def _setup_camera(self): """Setup and validate camera.""" self.stage = self.simulator.get_stage() camera_prim = self.stage.GetPrimAtPath(self.camera_path) if not camera_prim: raise RuntimeError(f"Failed to find camera at path: {self.camera_path}") - + self.render_product = self.rep.create.render_product( - self.camera_path, - resolution=(self.width, self.height) + self.camera_path, resolution=(self.width, self.height) ) - + def _setup_annotator(self): """Setup the specified annotator.""" self.annotator = self.rep.AnnotatorRegistry.get_annotator(self.annotator_type) self.annotator.attach(self.render_product) - + def stream(self): """Start the streaming loop.""" try: print("[Stream] Starting camera stream loop...") frame_count = 0 start_time = time.time() - + while True: frame_start = time.time() - + # Step simulation and get frame step_start = time.time() self.rep.orchestrator.step() step_time = time.time() - step_start - print(f"[Stream] Simulation step took {step_time*1000:.2f}ms") - + print(f"[Stream] Simulation step took {step_time * 1000:.2f}ms") + frame = self.annotator.get_data() frame = cv2.cvtColor(frame, cv2.COLOR_RGBA2BGR) - + # Write to FFmpeg self.proc.stdin.write(frame.tobytes()) self.proc.stdin.flush() - + # Log metrics frame_time = time.time() - frame_start - print(f"[Stream] Total frame processing took {frame_time*1000:.2f}ms") + print(f"[Stream] Total frame processing took {frame_time * 1000:.2f}ms") frame_count += 1 - + if frame_count % 100 == 0: elapsed_time = time.time() - start_time current_fps = frame_count / elapsed_time - print(f"[Stream] Processed {frame_count} frames | Current FPS: {current_fps:.2f}") - + print( + f"[Stream] Processed {frame_count} frames | Current FPS: {current_fps:.2f}" + ) + except KeyboardInterrupt: print("\n[Stream] Received keyboard interrupt, stopping stream...") finally: self.cleanup() - + def cleanup(self): """Cleanup resources.""" print("[Cleanup] Stopping FFmpeg process...") - if hasattr(self, 'proc'): + if hasattr(self, "proc"): self.proc.stdin.close() self.proc.wait() print("[Cleanup] Closing simulation...") self.simulator.close() - print("[Cleanup] Successfully cleaned up resources") \ No newline at end of file + print("[Cleanup] Successfully cleaned up resources") diff --git a/dimos/skills/kill_skill.py b/dimos/skills/kill_skill.py index 1ca050484f..f7eb63e807 100644 --- a/dimos/skills/kill_skill.py +++ b/dimos/skills/kill_skill.py @@ -19,8 +19,7 @@ particularly those running in separate threads like the monitor skill. """ -import logging -from typing import Optional, Dict, Any, List +from typing import Optional from pydantic import Field from dimos.skills.skills import AbstractSkill, SkillLibrary @@ -28,35 +27,36 @@ logger = setup_logger("dimos.skills.kill_skill") + class KillSkill(AbstractSkill): """ A skill that terminates other running skills. - + This skill can be used to stop long-running or background skills like the monitor skill. It uses the centralized process management in the SkillLibrary to track and terminate skills. """ - + skill_name: str = Field(..., description="Name of the skill to terminate") - + def __init__(self, skill_library: Optional[SkillLibrary] = None, **data): """ Initialize the kill skill. - + Args: skill_library: The skill library instance **data: Additional data for configuration """ super().__init__(**data) self._skill_library = skill_library - + def __call__(self): """ Terminate the specified skill. - + Returns: A message indicating whether the skill was successfully terminated - """ + """ print("running skills", self._skill_library.get_running_skills()) # Terminate the skill using the skill library - return self._skill_library.terminate_skill(self.skill_name) \ No newline at end of file + return self._skill_library.terminate_skill(self.skill_name) diff --git a/dimos/skills/navigation.py b/dimos/skills/navigation.py index b4aea42416..adb4d0e980 100644 --- a/dimos/skills/navigation.py +++ b/dimos/skills/navigation.py @@ -21,73 +21,67 @@ """ import os -import sys import time import threading -import logging -import numpy as np -import json -from typing import Optional, Dict, Tuple, Any +from typing import Optional, Tuple from dimos.utils.threadpool import get_scheduler -import chromadb from reactivex import operators as ops -from reactivex.subject import Subject from pydantic import Field from dimos.skills.skills import AbstractRobotSkill -from dimos.perception.spatial_perception import SpatialMemory -from dimos.agents.memory.visual_memory import VisualMemory from dimos.types.robot_location import RobotLocation -from dimos.utils.threadpool import get_scheduler from dimos.utils.logging_config import setup_logger from dimos.models.qwen.video_query import get_bbox_from_qwen_frame -from dimos.utils.generic_subscriber import GenericSubscriber from dimos.utils.ros_utils import distance_angle_to_goal_xy from dimos.robot.local_planner.local_planner import navigate_to_goal_local logger = setup_logger("dimos.skills.semantic_map_skills") + def get_dimos_base_path(): """ Get the DiMOS base path from DIMOS_PATH environment variable or default to user's home directory. - + Returns: Base path to use for DiMOS assets """ - dimos_path = os.environ.get('DIMOS_PATH') + dimos_path = os.environ.get("DIMOS_PATH") if dimos_path: return dimos_path # Get the current user's username - user = os.environ.get('USER', os.path.basename(os.path.expanduser('~'))) + user = os.environ.get("USER", os.path.basename(os.path.expanduser("~"))) return f"/home/{user}/dimos" class NavigateWithText(AbstractRobotSkill): """ A skill that queries an existing semantic map using natural language or tries to navigate to an object in view. - + This skill first attempts to locate an object in the robot's camera view using vision. - If the object is found, it navigates to it. If not, it falls back to querying the - semantic map for a location matching the description. For example, "Find the kitchen" - will first look for a kitchen in view, then check the semantic map coordinates where + If the object is found, it navigates to it. If not, it falls back to querying the + semantic map for a location matching the description. For example, "Find the kitchen" + will first look for a kitchen in view, then check the semantic map coordinates where a kitchen was previously observed. CALL THIS SKILL FOR ONE SUBJECT AT A TIME. For example: "Go to the person wearing a blue shirt in the living room", you should call this skill twice, once for the person wearing a blue shirt and once for the living room. """ - + query: str = Field("", description="Text query to search for in the semantic map") limit: int = Field(1, description="Maximum number of results to return") distance: float = Field(1.0, description="Desired distance to maintain from object in meters") timeout: float = Field(40.0, description="Maximum time to spend navigating in seconds") - similarity_threshold: float = Field(0.25, description="Minimum similarity score required for semantic map results to be considered valid") - + similarity_threshold: float = Field( + 0.25, + description="Minimum similarity score required for semantic map results to be considered valid", + ) + def __init__(self, robot=None, **data): """ Initialize the Navigate skill. - + Args: robot: The robot instance **data: Additional data for configuration @@ -98,20 +92,22 @@ def __init__(self, robot=None, **data): self._scheduler = get_scheduler() # Use the shared DiMOS thread pool self._navigation_disposable = None # Disposable returned by scheduler.schedule() self._tracking_subscriber = None # For object tracking - + def _navigate_to_object(self): """ Helper method that attempts to navigate to an object visible in the camera view. - + Returns: dict: Result dictionary with success status and details """ # Stop any existing operation self._stop_event.clear() - + try: - logger.warning(f"Attempting to navigate to visible object: {self.query} with desired distance {self.distance}m, timeout {self.timeout} seconds...") - + logger.warning( + f"Attempting to navigate to visible object: {self.query} with desired distance {self.distance}m, timeout {self.timeout} seconds..." + ) + # Try to get a bounding box from Qwen - only try once bbox = None try: @@ -121,38 +117,54 @@ def _navigate_to_object(self): bbox, object_size = get_bbox_from_qwen_frame(frame, object_name=self.query) except Exception as e: logger.error(f"Error querying Qwen: {e}") - return {"success": False, "failure_reason": "Perception", "error": f"Could not detect {self.query} in view: {e}"} - + return { + "success": False, + "failure_reason": "Perception", + "error": f"Could not detect {self.query} in view: {e}", + } + if bbox is None or self._stop_event.is_set(): logger.error(f"Failed to get bounding box for {self.query}") - return {"success": False, "failure_reason": "Perception", "error": f"Could not find {self.query} in view"} - + return { + "success": False, + "failure_reason": "Perception", + "error": f"Could not find {self.query} in view", + } + logger.info(f"Found {self.query} at {bbox} with size {object_size}") - + # Start the object tracker with the detected bbox self._robot.object_tracker.track(bbox, frame=frame) - + # Get the first tracking data with valid distance and angle start_time = time.time() target_acquired = False goal_x_robot = 0 goal_y_robot = 0 goal_angle = 0 - - while time.time() - start_time < 10.0 and not self._stop_event.is_set() and not target_acquired: + + while ( + time.time() - start_time < 10.0 + and not self._stop_event.is_set() + and not target_acquired + ): # Get the latest tracking data tracking_data = self._robot.object_tracking_stream.pipe(ops.take(1)).run() - + if tracking_data and tracking_data.get("targets") and tracking_data["targets"]: target = tracking_data["targets"][0] - + if "distance" in target and "angle" in target: # Convert target distance and angle to xy coordinates in robot frame - goal_distance = target["distance"] - self.distance # Subtract desired distance to stop short + goal_distance = ( + target["distance"] - self.distance + ) # Subtract desired distance to stop short goal_angle = -target["angle"] logger.info(f"Target distance: {goal_distance}, Target angle: {goal_angle}") - - goal_x_robot, goal_y_robot = distance_angle_to_goal_xy(goal_distance, goal_angle) + + goal_x_robot, goal_y_robot = distance_angle_to_goal_xy( + goal_distance, goal_angle + ) target_acquired = True break @@ -160,16 +172,24 @@ def _navigate_to_object(self): logger.warning(f"No valid target tracking data found. target: {target}") else: - logger.warning(f"No valid target tracking data found. tracking_data: {tracking_data}") - + logger.warning( + f"No valid target tracking data found. tracking_data: {tracking_data}" + ) + time.sleep(0.1) - + if not target_acquired: logger.error("Failed to acquire valid target tracking data") - return {"success": False, "failure_reason": "Perception", "error": "Failed to track object"} - - logger.info(f"Navigating to target at local coordinates: ({goal_x_robot:.2f}, {goal_y_robot:.2f}), angle: {goal_angle:.2f}") - + return { + "success": False, + "failure_reason": "Perception", + "error": "Failed to track object", + } + + logger.info( + f"Navigating to target at local coordinates: ({goal_x_robot:.2f}, {goal_y_robot:.2f}), angle: {goal_angle:.2f}" + ) + # Use navigate_to_goal_local instead of directly controlling the local planner success = navigate_to_goal_local( robot=self._robot, @@ -177,25 +197,27 @@ def _navigate_to_object(self): goal_theta=goal_angle, distance=0.0, # We already accounted for desired distance timeout=self.timeout, - stop_event=self._stop_event + stop_event=self._stop_event, ) - + if success: logger.info(f"Successfully navigated to {self.query}") return { "success": True, "failure_reason": None, "query": self.query, - "message": f"Successfully navigated to {self.query} in view" + "message": f"Successfully navigated to {self.query} in view", } else: - logger.warning(f"Failed to reach {self.query} within timeout or operation was stopped") + logger.warning( + f"Failed to reach {self.query} within timeout or operation was stopped" + ) return { - "success": False, + "success": False, "failure_reason": "Navigation", - "error": f"Failed to reach {self.query} within timeout" + "error": f"Failed to reach {self.query} within timeout", } - + except Exception as e: logger.error(f"Error in navigate to object: {e}") return {"success": False, "failure_reason": "Code Error", "error": f"Error: {e}"} @@ -203,78 +225,93 @@ def _navigate_to_object(self): # Clean up self._robot.ros_control.stop() self._robot.object_tracker.cleanup() - + def _navigate_using_semantic_map(self): """ Helper method that attempts to navigate using the semantic map query. - + Returns: dict: Result dictionary with success status and details """ logger.info(f"Querying semantic map for: '{self.query}'") - + try: self._spatial_memory = self._robot.get_spatial_memory() - + # Run the query results = self._spatial_memory.query_by_text(self.query, limit=self.limit) - + if not results: logger.warning(f"No results found for query: '{self.query}'") return { "success": False, "query": self.query, - "error": "No matching location found in semantic map" + "error": "No matching location found in semantic map", } - + # Get the best match best_match = results[0] - metadata = best_match.get('metadata', {}) - + metadata = best_match.get("metadata", {}) + if isinstance(metadata, list) and metadata: metadata = metadata[0] - + # Extract coordinates from metadata - if isinstance(metadata, dict) and 'pos_x' in metadata and 'pos_y' in metadata and 'rot_z' in metadata: - pos_x = metadata.get('pos_x', 0) - pos_y = metadata.get('pos_y', 0) - theta = metadata.get('rot_z', 0) - + if ( + isinstance(metadata, dict) + and "pos_x" in metadata + and "pos_y" in metadata + and "rot_z" in metadata + ): + pos_x = metadata.get("pos_x", 0) + pos_y = metadata.get("pos_y", 0) + theta = metadata.get("rot_z", 0) + # Calculate similarity score (distance is inverse of similarity) - similarity = 1.0 - (best_match.get('distance', 0) if best_match.get('distance') is not None else 0) - - logger.info(f"Found match for '{self.query}' at ({pos_x:.2f}, {pos_y:.2f}, rotation {theta:.2f}) with similarity: {similarity:.4f}") - + similarity = 1.0 - ( + best_match.get("distance", 0) if best_match.get("distance") is not None else 0 + ) + + logger.info( + f"Found match for '{self.query}' at ({pos_x:.2f}, {pos_y:.2f}, rotation {theta:.2f}) with similarity: {similarity:.4f}" + ) + # Check if similarity is below the threshold if similarity < self.similarity_threshold: - logger.warning(f"Match found but similarity score ({similarity:.4f}) is below threshold ({self.similarity_threshold})") + logger.warning( + f"Match found but similarity score ({similarity:.4f}) is below threshold ({self.similarity_threshold})" + ) return { "success": False, "query": self.query, "position": (pos_x, pos_y), "rotation": theta, "similarity": similarity, - "error": f"Match found but similarity score ({similarity:.4f}) is below threshold ({self.similarity_threshold})" + "error": f"Match found but similarity score ({similarity:.4f}) is below threshold ({self.similarity_threshold})", } - + # Reset the stop event before starting navigation self._stop_event.clear() - + # The scheduler approach isn't working, switch to direct threading # Define a navigation function that will run on a separate thread def run_navigation(): skill_library = self._robot.get_skills() self.register_as_running("Navigate", skill_library) - + try: - logger.info(f"Starting navigation to ({pos_x:.2f}, {pos_y:.2f}) with rotation {theta:.2f}") + logger.info( + f"Starting navigation to ({pos_x:.2f}, {pos_y:.2f}) with rotation {theta:.2f}" + ) # Pass our stop_event to allow cancellation result = False try: - result = self._robot.global_planner.set_goal((pos_x, pos_y), goal_theta = theta, stop_event=self._stop_event) + result = self._robot.global_planner.set_goal( + (pos_x, pos_y), goal_theta=theta, stop_event=self._stop_event + ) except Exception as e: logger.error(f"Error calling global_planner.set_goal: {e}") - + if result: logger.info("Navigation completed successfully") else: @@ -285,13 +322,13 @@ def run_navigation(): return False finally: self.stop() - + # Cancel any existing navigation before starting a new one # Signal stop to any running navigation self._stop_event.set() # Clear stop event for new navigation self._stop_event.clear() - + # Run the navigation in the main thread run_navigation() @@ -301,125 +338,131 @@ def run_navigation(): "position": (pos_x, pos_y), "rotation": theta, "similarity": similarity, - "metadata": metadata + "metadata": metadata, } else: logger.warning(f"No valid position data found for query: '{self.query}'") return { "success": False, "query": self.query, - "error": "No valid position data found in semantic map" + "error": "No valid position data found in semantic map", } except Exception as e: logger.error(f"Error in semantic map navigation: {e}") return {"success": False, "error": f"Semantic map error: {e}"} - + def __call__(self): """ First attempts to navigate to an object in view, then falls back to querying the semantic map. - + Returns: A dictionary with the result of the navigation attempt """ super().__call__() - + if not self.query: error_msg = "No query provided to Navigate skill" logger.error(error_msg) return {"success": False, "error": error_msg} - + # First, try to find and navigate to the object in camera view logger.info(f"First attempting to find and navigate to visible object: '{self.query}'") object_result = self._navigate_to_object() - - if object_result and object_result['success']: + + if object_result and object_result["success"]: logger.info(f"Successfully navigated to {self.query} in view") return object_result - - elif object_result and object_result['failure_reason'] == "Navigation": - logger.info(f"Failed to navigate to {self.query} in view: {object_result.get('error', 'Unknown error')}") + + elif object_result and object_result["failure_reason"] == "Navigation": + logger.info( + f"Failed to navigate to {self.query} in view: {object_result.get('error', 'Unknown error')}" + ) return object_result # If object navigation failed, fall back to semantic map - logger.info(f"Object not found in view. Falling back to semantic map query for: '{self.query}'") - - return self._navigate_using_semantic_map() + logger.info( + f"Object not found in view. Falling back to semantic map query for: '{self.query}'" + ) + return self._navigate_using_semantic_map() def stop(self): """ Stop the navigation skill and clean up resources. - + Returns: A message indicating whether the navigation was stopped successfully """ logger.info("Stopping Navigate skill") - + # Signal any running processes to stop via the shared event self._stop_event.set() - + skill_library = self._robot.get_skills() self.unregister_as_running("Navigate", skill_library) - + # Dispose of any existing navigation task - if hasattr(self, '_navigation_disposable') and self._navigation_disposable: + if hasattr(self, "_navigation_disposable") and self._navigation_disposable: logger.info("Disposing navigation task") try: self._navigation_disposable.dispose() except Exception as e: logger.error(f"Error disposing navigation task: {e}") self._navigation_disposable = None - + # Clean up spatial memory if it exists - if hasattr(self, '_spatial_memory') and self._spatial_memory is not None: + if hasattr(self, "_spatial_memory") and self._spatial_memory is not None: logger.info("Cleaning up spatial memory") self._spatial_memory.cleanup() self._spatial_memory = None - + # Stop robot motion self._robot.ros_control.stop() - + return "Navigate skill stopped successfully." + class GetPose(AbstractRobotSkill): """ A skill that returns the current position and orientation of the robot. This skill is useful for getting the current pose of the robot in the map frame. You call this skill if you want to remember a location, for example, "remember this is where my favorite chair is" and then - call this skill to get the position and rotation of approximately where the chair is. You can then use + call this skill to get the position and rotation of approximately where the chair is. You can then use the position to navigate to the chair. - + When location_name is provided, this skill will also remember the current location with that name, allowing you to navigate back to it later using the Navigate skill. """ - - location_name: str = Field("", description="Optional name to assign to this location (e.g., 'kitchen', 'office')") - + + location_name: str = Field( + "", description="Optional name to assign to this location (e.g., 'kitchen', 'office')" + ) + def __init__(self, robot=None, **data): """ Initialize the GetPose skill. - + Args: robot: The robot instance **data: Additional data for configuration """ super().__init__(robot=robot, **data) - + def __call__(self): """ Get the current pose of the robot. - + Returns: A dictionary containing the position and rotation of the robot """ super().__call__() - + if self._robot is None: error_msg = "No robot instance provided to GetPose skill" logger.error(error_msg) return {"success": False, "error": error_msg} - + try: # Get the current pose using the robot's get_pose method position, rotation = self._robot.get_pose() @@ -430,27 +473,21 @@ def __call__(self): "position": { "x": position[0], "y": position[1], - "z": position[2] if len(position) > 2 else 0.0 + "z": position[2] if len(position) > 2 else 0.0, }, - "rotation": { - "roll": rotation[0], - "pitch": rotation[1], - "yaw": rotation[2] - } + "rotation": {"roll": rotation[0], "pitch": rotation[1], "yaw": rotation[2]}, } - + # If location_name is provided, remember this location if self.location_name: # Get the spatial memory instance spatial_memory = self._robot.get_spatial_memory() - + # Create a RobotLocation object location = RobotLocation( - name=self.location_name, - position=position, - rotation=rotation + name=self.location_name, position=position, rotation=rotation ) - + # Add to spatial memory if spatial_memory.add_robot_location(location): result["location_saved"] = True @@ -459,78 +496,80 @@ def __call__(self): else: result["location_saved"] = False logger.error(f"Failed to save location '{self.location_name}'") - + return result except Exception as e: error_msg = f"Error getting robot pose: {e}" logger.error(error_msg) return {"success": False, "error": error_msg} - + class NavigateToGoal(AbstractRobotSkill): """ A skill that navigates the robot to a specified position and orientation. - + This skill uses the global planner to generate a path to the target position and then uses navigate_path_local to follow that path, achieving the desired orientation at the goal position. """ - - position: Tuple[float, float] = Field((0.0, 0.0), description="Target position (x, y) in map frame") + + position: Tuple[float, float] = Field( + (0.0, 0.0), description="Target position (x, y) in map frame" + ) rotation: Optional[float] = Field(None, description="Target orientation (yaw) in radians") frame: str = Field("map", description="Reference frame for the position and rotation") timeout: float = Field(120.0, description="Maximum time (in seconds) allowed for navigation") - + def __init__(self, robot=None, **data): """ Initialize the NavigateToGoal skill. - + Args: robot: The robot instance **data: Additional data for configuration """ super().__init__(robot=robot, **data) self._stop_event = threading.Event() - + def __call__(self): """ Navigate to the specified goal position and orientation. - + Returns: A dictionary containing the result of the navigation attempt """ super().__call__() - + if self._robot is None: error_msg = "No robot instance provided to NavigateToGoal skill" logger.error(error_msg) return {"success": False, "error": error_msg} - + # Reset stop event to make sure we don't immediately abort self._stop_event.clear() skill_library = self._robot.get_skills() self.register_as_running("NavigateToGoal", skill_library) - - logger.info(f"Starting navigation to position=({self.position[0]:.2f}, {self.position[1]:.2f}) " - f"with rotation={self.rotation if self.rotation is not None else 'None'} " - f"in frame={self.frame}") - + + logger.info( + f"Starting navigation to position=({self.position[0]:.2f}, {self.position[1]:.2f}) " + f"with rotation={self.rotation if self.rotation is not None else 'None'} " + f"in frame={self.frame}" + ) + try: # Use the global planner to set the goal and generate a path result = self._robot.global_planner.set_goal( - self.position, - goal_theta=self.rotation, - stop_event=self._stop_event + self.position, goal_theta=self.rotation, stop_event=self._stop_event ) - + if result: logger.info("Navigation completed successfully") return { "success": True, "position": self.position, "rotation": self.rotation, - "message": "Goal reached successfully" + "message": "Goal reached successfully", } else: logger.warning("Navigation did not complete successfully") @@ -538,9 +577,9 @@ def __call__(self): "success": False, "position": self.position, "rotation": self.rotation, - "message": "Goal could not be reached" + "message": "Goal could not be reached", } - + except Exception as e: error_msg = f"Error during navigation: {e}" logger.error(error_msg) @@ -548,16 +587,15 @@ def __call__(self): "success": False, "position": self.position, "rotation": self.rotation, - "error": error_msg + "error": error_msg, } finally: self.stop() - - + def stop(self): """ Stop the navigation. - + Returns: A message indicating that the navigation was stopped """ diff --git a/dimos/skills/observe_stream.py b/dimos/skills/observe_stream.py index e0e12e0b9f..dc38052508 100644 --- a/dimos/skills/observe_stream.py +++ b/dimos/skills/observe_stream.py @@ -15,14 +15,13 @@ """ Observer skill for an agent. -This module provides a skill that periodically sends images from any +This module provides a skill that periodically sends images from any Robot Data Stream to an agent for inference. """ -import logging import time import threading -from typing import Optional, Any, Dict +from typing import Optional import base64 import cv2 import reactivex as rx @@ -36,24 +35,31 @@ logger = setup_logger("dimos.skills.observe_stream") + class ObserveStream(AbstractRobotSkill): """ A skill that periodically Observes a Robot Video Stream and sends images to current instance of an agent for context. - + This skill runs in a non-halting manner, allowing other skills to run concurrently. - It can be used for continuous perception and passive monitoring, such as waiting for a person to enter a room + It can be used for continuous perception and passive monitoring, such as waiting for a person to enter a room or to monitor changes in the environment. """ - - timestep: float = Field(60.0, description="Time interval in seconds between observation queries") - query_text: str = Field("What do you see in this image? Alert me if you see any people or important changes.", - description="Query text to send to agent with each image") - max_duration: float = Field(0.0, description="Maximum duration to run the observer in seconds (0 for indefinite)") - - def __init__(self, robot=None, agent: Optional[LLMAgent] = None, video_stream = None, **data): + + timestep: float = Field( + 60.0, description="Time interval in seconds between observation queries" + ) + query_text: str = Field( + "What do you see in this image? Alert me if you see any people or important changes.", + description="Query text to send to agent with each image", + ) + max_duration: float = Field( + 0.0, description="Maximum duration to run the observer in seconds (0 for indefinite)" + ) + + def __init__(self, robot=None, agent: Optional[LLMAgent] = None, video_stream=None, **data): """ Initialize the ObserveStream skill. - + Args: robot: The robot instance agent: The agent to send queries to @@ -72,54 +78,54 @@ def __init__(self, robot=None, agent: Optional[LLMAgent] = None, video_stream = if self._video_stream is None: logger.error("Failed to get video stream from robot") return - + def __call__(self): """ Start the observing process in a separate thread using the threadpool. - + Returns: A message indicating the observer has started """ super().__call__() - + if self._agent is None: error_msg = "No agent provided to ObserveStream" logger.error(error_msg) return error_msg - + if self._robot is None: error_msg = "No robot instance provided to ObserveStream" logger.error(error_msg) return error_msg - + self.stop() - + self._stop_event.clear() - + # Initialize start time for duration tracking self._start_time = time.time() - + interval_observable = rx.interval(self.timestep, scheduler=self._scheduler).pipe( ops.take_while(lambda _: not self._stop_event.is_set()) ) - + # Subscribe to the interval observable self._subscription = interval_observable.subscribe( on_next=self._monitor_iteration, on_error=lambda e: logger.error(f"Error in monitor observable: {e}"), - on_completed=lambda: logger.info("Monitor observable completed") + on_completed=lambda: logger.info("Monitor observable completed"), ) - + skill_library = self._robot.get_skills() self.register_as_running("ObserveStream", skill_library, self._subscription) - + logger.info(f"Observer started with timestep={self.timestep}s, query='{self.query_text}'") return f"Observer started with timestep={self.timestep}s, query='{self.query_text}'" - + def _monitor_iteration(self, iteration): """ Execute a single observer iteration. - + Args: iteration: The iteration number (provided by rx.interval) """ @@ -130,91 +136,91 @@ def _monitor_iteration(self, iteration): logger.info(f"Observer reached maximum duration of {self.max_duration}s") self.stop() return - + logger.info(f"Observer iteration {iteration} executing") - + # Get a frame from the video stream frame = self._get_frame_from_stream() - + if frame is not None: self._process_frame(frame) else: logger.warning("Failed to get frame from video stream") - + except Exception as e: logger.error(f"Error in monitor iteration {iteration}: {e}") - + def _get_frame_from_stream(self): """ Get a single frame from the video stream. - + Args: video_stream: The ROS video stream observable - + Returns: A single frame from the video stream, or None if no frame is available """ frame = None - + frame_subject = rx.subject.Subject() - + subscription = self._video_stream.pipe( ops.take(1) # Take just one frame ).subscribe( on_next=lambda x: frame_subject.on_next(x), - on_error=lambda e: logger.error(f"Error getting frame: {e}") + on_error=lambda e: logger.error(f"Error getting frame: {e}"), ) - + timeout = 5.0 # 5 seconds timeout start_time = time.time() - + def on_frame(f): nonlocal frame frame = f - + frame_subject.subscribe(on_frame) - + while frame is None and time.time() - start_time < timeout: time.sleep(0.1) - + subscription.dispose() - + return frame - + def _process_frame(self, frame): """ Process a frame with the Claude agent. - + Args: frame: The video frame to process """ logger.info("Processing frame with Claude agent") - + try: - _, buffer = cv2.imencode('.jpg', frame) - base64_image = base64.b64encode(buffer).decode('utf-8') - + _, buffer = cv2.imencode(".jpg", frame) + base64_image = base64.b64encode(buffer).decode("utf-8") + observable = self._agent.run_observable_query( f"{self.query_text}\n\nHere is the current camera view from the robot:", base64_image=base64_image, thinking_budget_tokens=0, ) - + # Simple subscription to make sure the query executes # The actual response content isn't important observable.subscribe( on_next=lambda x: logger.info(f"Got response from _observable_query: {x}"), on_error=lambda e: logger.error(f"Error: {e}"), - on_completed=lambda: logger.info("ObserveStream query completed") + on_completed=lambda: logger.info("ObserveStream query completed"), ) - + except Exception as e: logger.error(f"Error processing frame with agent: {e}") - + def stop(self): """ Stop the ObserveStream monitoring process. - + Returns: A message indicating the observer has stopped """ @@ -223,6 +229,6 @@ def stop(self): self._stop_event.set() self._subscription.dispose() self._subscription = None - + return "Observer stopped" return "Observer was not running" diff --git a/dimos/skills/rest/rest.py b/dimos/skills/rest/rest.py index a88429fba2..3e7c7426cc 100644 --- a/dimos/skills/rest/rest.py +++ b/dimos/skills/rest/rest.py @@ -14,11 +14,12 @@ import requests from dimos.skills.skills import AbstractSkill -from typing import Optional, Dict, Any from pydantic import Field import logging + logger = logging.getLogger(__name__) + class GenericRestSkill(AbstractSkill): """Performs a configurable REST API call. @@ -29,9 +30,10 @@ class GenericRestSkill(AbstractSkill): url: The target URL for the API call. method: The HTTP method (e.g., 'GET', 'POST'). Case-insensitive. timeout: Request timeout in seconds. - """ + """ + # TODO: Add query parameters, request body data (form-encoded or JSON), and headers. - #, query + # , query # parameters, request body data (form-encoded or JSON), and headers. # params: Optional dictionary of URL query parameters. # data: Optional dictionary for form-encoded request body data. @@ -46,7 +48,6 @@ class GenericRestSkill(AbstractSkill): # json_payload: Optional[Dict[str, Any]] = Field(default=None, alias="json", description="JSON request body.") # headers: Optional[Dict[str, str]] = Field(default=None, description="HTTP headers.") - def __call__(self) -> str: """Executes the configured REST API call. @@ -68,27 +69,31 @@ def __call__(self) -> str: try: logger.debug( f"Executing {self.method.upper()} request to {self.url} " - f"with timeout={self.timeout}" # , params={self.params}, " + f"with timeout={self.timeout}" # , params={self.params}, " # f"data={self.data}, json={self.json_payload}, headers={self.headers}" ) response = requests.request( - method=self.method.upper(), # Normalize method to uppercase + method=self.method.upper(), # Normalize method to uppercase url=self.url, # params=self.params, # data=self.data, # json=self.json_payload, # Use the attribute name defined in Pydantic # headers=self.headers, - timeout=self.timeout + timeout=self.timeout, ) response.raise_for_status() # Raises HTTPError for bad responses (4xx or 5xx) - logger.debug(f"Request successful. Status: {response.status_code}, Response: {response.text[:100]}...") - return response.text # Return text content directly + logger.debug( + f"Request successful. Status: {response.status_code}, Response: {response.text[:100]}..." + ) + return response.text # Return text content directly except requests.exceptions.HTTPError as http_err: - logger.error(f"HTTP error occurred: {http_err} - Status Code: {http_err.response.status_code}") + logger.error( + f"HTTP error occurred: {http_err} - Status Code: {http_err.response.status_code}" + ) return f"HTTP error making {self.method.upper()} request to {self.url}: {http_err.response.status_code} {http_err.response.reason}" except requests.exceptions.RequestException as req_err: logger.error(f"Request exception occurred: {req_err}") return f"Error making {self.method.upper()} request to {self.url}: {req_err}" except Exception as e: - logger.exception(f"An unexpected error occurred: {e}") # Log the full traceback + logger.exception(f"An unexpected error occurred: {e}") # Log the full traceback return f"An unexpected error occurred: {type(e).__name__}: {e}" diff --git a/dimos/skills/skills.py b/dimos/skills/skills.py index 8ea7262229..559f9b0e36 100644 --- a/dimos/skills/skills.py +++ b/dimos/skills/skills.py @@ -26,8 +26,8 @@ # region SkillLibrary -class SkillLibrary: +class SkillLibrary: # ==== Flat Skill Library ==== def __init__(self): @@ -36,7 +36,7 @@ def __init__(self): self._running_skills = {} # {skill_name: (instance, subscription)} self.init() - + def init(self): # Collect all skills from the parent class and update self.skills self.refresh_class_skills() @@ -46,28 +46,32 @@ def init(self): def get_class_skills(self) -> list["AbstractSkill"]: """Extract all AbstractSkill subclasses from a class. - + Returns: List of skill classes found within the class """ skills = [] - + # Loop through all attributes of the class for attr_name in dir(self.__class__): # Skip special/dunder attributes - if attr_name.startswith('__'): + if attr_name.startswith("__"): continue - + try: attr = getattr(self.__class__, attr_name) - + # Check if it's a class and inherits from AbstractSkill - if isinstance(attr, type) and issubclass(attr, AbstractSkill) and attr is not AbstractSkill: + if ( + isinstance(attr, type) + and issubclass(attr, AbstractSkill) + and attr is not AbstractSkill + ): skills.append(attr) except (AttributeError, TypeError): # Skip attributes that can't be accessed or aren't classes continue - + return skills def refresh_class_skills(self): @@ -97,18 +101,18 @@ def __len__(self) -> int: def __contains__(self, skill: "AbstractSkill") -> bool: return skill in self.registered_skills - + def __getitem__(self, index): return self.registered_skills[index] - + # ==== Calling a Function ==== - _instances: dict[str, dict] = {} + _instances: dict[str, dict] = {} def create_instance(self, name, **kwargs): # Key based only on the name key = name - + print(f"Preparing to create instance with name: {name} and args: {kwargs}") if key not in self._instances: @@ -136,25 +140,24 @@ def call(self, name, **args): # Initialize the instance with the merged arguments instance = skill_class(**complete_args) print(f"Instance created and function called for: {name} with args: {complete_args}") - + # Call the instance directly return instance() - + # ==== Tools ==== def get_tools(self) -> Any: tools_json = self.get_list_of_skills_as_json(list_of_skills=self.registered_skills) # print(f"{Colors.YELLOW_PRINT_COLOR}Tools JSON: {tools_json}{Colors.RESET_COLOR}") return tools_json - + def get_list_of_skills_as_json(self, list_of_skills: list["AbstractSkill"]) -> list[str]: return list(map(pydantic_function_tool, list_of_skills)) - - + def register_running_skill(self, name: str, instance: Any, subscription=None): """ Register a running skill with its subscription. - + Args: name: Name of the skill (will be converted to lowercase) instance: Instance of the running skill @@ -163,14 +166,14 @@ def register_running_skill(self, name: str, instance: Any, subscription=None): name = name.lower() self._running_skills[name] = (instance, subscription) logger.info(f"Registered running skill: {name}") - + def unregister_running_skill(self, name: str): """ Unregister a running skill. - + Args: name: Name of the skill to remove (will be converted to lowercase) - + Returns: True if the skill was found and removed, False otherwise """ @@ -180,49 +183,53 @@ def unregister_running_skill(self, name: str): logger.info(f"Unregistered running skill: {name}") return True return False - + def get_running_skills(self): """ Get all running skills. - + Returns: A dictionary of running skill names and their (instance, subscription) tuples """ return self._running_skills.copy() - + def terminate_skill(self, name: str): """ Terminate a running skill. - + Args: name: Name of the skill to terminate (will be converted to lowercase) - + Returns: A message indicating whether the skill was successfully terminated """ name = name.lower() if name in self._running_skills: instance, subscription = self._running_skills[name] - + try: # Call the stop method if it exists - if hasattr(instance, 'stop') and callable(instance.stop): + if hasattr(instance, "stop") and callable(instance.stop): result = instance.stop() logger.info(f"Stopped skill: {name}") else: logger.warning(f"Skill {name} does not have a stop method") - + # Also dispose the subscription if it exists - if subscription is not None and hasattr(subscription, 'dispose') and callable(subscription.dispose): + if ( + subscription is not None + and hasattr(subscription, "dispose") + and callable(subscription.dispose) + ): subscription.dispose() logger.info(f"Disposed subscription for skill: {name}") elif subscription is not None: logger.warning(f"Skill {name} has a subscription but it's not disposable") - + # unregister the skill self.unregister_running_skill(name) return f"Successfully terminated skill: {name}" - + except Exception as e: error_msg = f"Error terminating skill {name}: {e}" logger.error(error_msg) @@ -232,12 +239,13 @@ def terminate_skill(self, name: str): else: return f"No running skill found with name: {name}" + # endregion SkillLibrary # region AbstractSkill -class AbstractSkill(BaseModel): +class AbstractSkill(BaseModel): def __init__(self, *args, **kwargs): print("Initializing AbstractSkill Class") super().__init__(*args, **kwargs) @@ -247,23 +255,22 @@ def __init__(self, *args, **kwargs): def clone(self) -> "AbstractSkill": return AbstractSkill() - - + def register_as_running(self, name: str, skill_library: SkillLibrary, subscription=None): """ Register this skill as running in the skill library. - + Args: name: Name of the skill (will be converted to lowercase) skill_library: The skill library to register with subscription: Optional subscription associated with the skill """ skill_library.register_running_skill(name, self, subscription) - + def unregister_as_running(self, name: str, skill_library: SkillLibrary): """ Unregister this skill from the skill library. - + Args: name: Name of the skill to remove (will be converted to lowercase) skill_library: The skill library to unregister from @@ -279,30 +286,32 @@ def get_tools(self) -> Any: def get_list_of_skills_as_json(self, list_of_skills: list["AbstractSkill"]) -> list[str]: return list(map(pydantic_function_tool, list_of_skills)) + # endregion AbstractSkill # region Abstract Robot Skill -from typing import Optional, TYPE_CHECKING +from typing import TYPE_CHECKING + if TYPE_CHECKING: from dimos.robot.robot import Robot else: - Robot = 'Robot' + Robot = "Robot" -class AbstractRobotSkill(AbstractSkill): +class AbstractRobotSkill(AbstractSkill): _robot: Robot = None - + def __init__(self, *args, robot: Optional[Robot] = None, **kwargs): super().__init__(*args, **kwargs) self._robot = robot - print(f"{Colors.BLUE_PRINT_COLOR}" - f"Robot Skill Initialized with Robot: {robot}" - f"{Colors.RESET_COLOR}") + print( + f"{Colors.BLUE_PRINT_COLOR}Robot Skill Initialized with Robot: {robot}{Colors.RESET_COLOR}" + ) def set_robot(self, robot: Robot) -> None: """Set the robot reference for this skills instance. - + Args: robot: The robot instance to associate with these skills. """ @@ -313,8 +322,12 @@ def __call__(self): raise RuntimeError( f"{Colors.RED_PRINT_COLOR}" f"No Robot instance provided to Robot Skill: {self.__class__.__name__}" - f"{Colors.RESET_COLOR}") + f"{Colors.RESET_COLOR}" + ) else: - print(f"{Colors.BLUE_PRINT_COLOR}Robot Instance provided to Robot Skill: {self.__class__.__name__}{Colors.RESET_COLOR}") - + print( + f"{Colors.BLUE_PRINT_COLOR}Robot Instance provided to Robot Skill: {self.__class__.__name__}{Colors.RESET_COLOR}" + ) + + # endregion Abstract Robot Skill diff --git a/dimos/skills/speak.py b/dimos/skills/speak.py index 4e3bbbac9b..4abada72bb 100644 --- a/dimos/skills/speak.py +++ b/dimos/skills/speak.py @@ -1,6 +1,4 @@ from dimos.skills.skills import AbstractSkill -from dimos.stream.audio.pipelines import tts -from dimos.stream.audio.node_output import SounddeviceAudioOutput from pydantic import Field from reactivex import Subject from typing import Optional, Any, List @@ -23,18 +21,18 @@ def _process_audio_queue(): """Background thread to process audio requests sequentially""" global _queue_running - + while _queue_running: try: # Get the next queued audio task with a timeout task = _audio_queue.get(timeout=1.0) if task is None: # Sentinel value to stop the thread break - + # Execute the task (which is a function to be called) task() _audio_queue.task_done() - + except queue.Empty: # No tasks in queue, just continue waiting continue @@ -46,13 +44,11 @@ def _process_audio_queue(): def start_audio_queue_processor(): """Start the background thread for processing audio requests""" global _queue_processor_thread, _queue_running - + if _queue_processor_thread is None or not _queue_processor_thread.is_alive(): _queue_running = True _queue_processor_thread = threading.Thread( - target=_process_audio_queue, - daemon=True, - name="AudioQueueProcessor" + target=_process_audio_queue, daemon=True, name="AudioQueueProcessor" ) _queue_processor_thread.start() logger.info("Started audio queue processor thread") @@ -61,6 +57,7 @@ def start_audio_queue_processor(): # Start the queue processor when module is imported start_audio_queue_processor() + class Speak(AbstractSkill): """Speak text out loud to humans nearby or to other robots.""" @@ -77,10 +74,10 @@ def __call__(self): if not self._tts_node: logger.error("No TTS node provided to Speak skill") return "Error: No TTS node available" - + # Create a result queue to get the result back from the audio thread result_queue = queue.Queue(1) - + # Define the speech task to run in the audio queue def speak_task(): try: @@ -89,67 +86,67 @@ def speak_task(): text_subject = Subject() self._audio_complete.clear() self._subscriptions = [] - + # This function will be called when audio processing is complete def on_complete(): logger.info(f"TTS audio playback completed for: {self.text}") self._audio_complete.set() - + # This function will be called if there's an error def on_error(error): logger.error(f"Error in TTS processing: {error}") self._audio_complete.set() - + # Connect the Subject to the TTS node and keep the subscription self._tts_node.consume_text(text_subject) - + # Subscribe to the audio output to know when it's done self._subscription = self._tts_node.emit_text().subscribe( on_next=lambda text: logger.debug(f"TTS processing: {text}"), on_completed=on_complete, - on_error=on_error + on_error=on_error, ) self._subscriptions.append(self._subscription) - + # Emit the text to the Subject text_subject.on_next(self.text) text_subject.on_completed() # Signal that we're done sending text - + # Wait for audio playback to complete with a timeout # Using a dynamic timeout based on text length timeout = max(5, len(self.text) * 0.1) logger.debug(f"Waiting for TTS completion with timeout {timeout:.1f}s") - + if not self._audio_complete.wait(timeout=timeout): logger.warning(f"TTS timeout reached for: {self.text}") else: # Add a small delay after audio completes to ensure buffers are fully flushed time.sleep(0.3) - + # Clean up all subscriptions for sub in self._subscriptions: if sub: sub.dispose() self._subscriptions = [] - + # Successfully completed result_queue.put(f"Spoke: {self.text} successfully") except Exception as e: logger.error(f"Error in speak task: {e}") result_queue.put(f"Error speaking text: {str(e)}") - + # Add our speech task to the global queue for sequential processing - display_text = self.text[:50] + '...' if len(self.text) > 50 else self.text + display_text = self.text[:50] + "..." if len(self.text) > 50 else self.text logger.info(f"Queueing speech task: '{display_text}'") _audio_queue.put(speak_task) - + # Wait for the result with a timeout try: # Use a longer timeout than the audio playback itself text_len_timeout = len(self.text) * 0.15 # 150ms per character max_timeout = max(10, text_len_timeout) # At least 10 seconds - + return result_queue.get(timeout=max_timeout) except queue.Empty: logger.error("Timed out waiting for speech task to complete") - return f"Error: Timed out while speaking: {self.text}" \ No newline at end of file + return f"Error: Timed out while speaking: {self.text}" diff --git a/dimos/skills/visual_navigation_skills.py b/dimos/skills/visual_navigation_skills.py index 1bc6d91341..72696f0427 100644 --- a/dimos/skills/visual_navigation_skills.py +++ b/dimos/skills/visual_navigation_skills.py @@ -31,70 +31,83 @@ logger = setup_logger("dimos.skills.visual_navigation", level=logging.DEBUG) + class FollowHuman(AbstractRobotSkill): """ - A skill that makes the robot follow a human using visual servoing continuously. - + A skill that makes the robot follow a human using visual servoing continuously. + This skill uses the robot's person tracking stream to follow a human while maintaining a specified distance. It will keep following the human until the timeout is reached or the skill is stopped. Don't use this skill if you want to navigate to a specific person, use NavigateTo instead. """ - - distance: float = Field(1.5, description="Desired distance to maintain from the person in meters") + + distance: float = Field( + 1.5, description="Desired distance to maintain from the person in meters" + ) timeout: float = Field(20.0, description="Maximum time to follow the person in seconds") - point: Optional[Tuple[int, int]] = Field(None, description="Optional point to start tracking (x,y pixel coordinates)") - + point: Optional[Tuple[int, int]] = Field( + None, description="Optional point to start tracking (x,y pixel coordinates)" + ) + def __init__(self, robot=None, **data): super().__init__(robot=robot, **data) self._stop_event = threading.Event() self._visual_servoing = None - + def __call__(self): """ Start following a human using visual servoing. - + Returns: bool: True if successful, False otherwise """ super().__call__() - - if not hasattr(self._robot, 'person_tracking_stream') or self._robot.person_tracking_stream is None: + + if ( + not hasattr(self._robot, "person_tracking_stream") + or self._robot.person_tracking_stream is None + ): logger.error("Robot does not have a person tracking stream") return False - + # Stop any existing operation self.stop() self._stop_event.clear() - + success = False - + try: # Initialize visual servoing - self._visual_servoing = VisualServoing(tracking_stream=self._robot.person_tracking_stream) - + self._visual_servoing = VisualServoing( + tracking_stream=self._robot.person_tracking_stream + ) + logger.warning(f"Following human for {self.timeout} seconds...") start_time = time.time() - + # Start tracking - track_success = self._visual_servoing.start_tracking(point=self.point, desired_distance=self.distance) - + track_success = self._visual_servoing.start_tracking( + point=self.point, desired_distance=self.distance + ) + if not track_success: logger.error("Failed to start tracking") return False - + # Main follow loop - while (self._visual_servoing.running and - time.time() - start_time < self.timeout and - not self._stop_event.is_set()): - + while ( + self._visual_servoing.running + and time.time() - start_time < self.timeout + and not self._stop_event.is_set() + ): output = self._visual_servoing.updateTracking() x_vel = output.get("linear_vel") z_vel = output.get("angular_vel") logger.debug(f"Following human: x_vel: {x_vel}, z_vel: {z_vel}") self._robot.ros_control.move_vel_control(x=x_vel, y=0, yaw=z_vel) time.sleep(0.05) - + # If we completed the full timeout duration, consider it success if time.time() - start_time >= self.timeout: success = True @@ -103,9 +116,9 @@ def __call__(self): logger.info("Human following stopped externally") else: logger.info("Human following stopped due to tracking loss") - + return success - + except Exception as e: logger.error(f"Error in follow human: {e}") return False @@ -115,24 +128,24 @@ def __call__(self): self._visual_servoing.stop_tracking() self._visual_servoing = None self._robot.ros_control.stop() - + def stop(self): """ Stop the human following process. - + Returns: bool: True if stopped, False if it wasn't running """ if self._visual_servoing is not None: logger.info("Stopping FollowHuman skill") self._stop_event.set() - + # Clean up visual servoing if it exists self._visual_servoing.stop_tracking() self._visual_servoing = None - + # Stop the robot self._robot.ros_control.stop() - + return True - return False \ No newline at end of file + return False diff --git a/dimos/stream/audio/base.py b/dimos/stream/audio/base.py index ab368c476c..71ac7886ae 100644 --- a/dimos/stream/audio/base.py +++ b/dimos/stream/audio/base.py @@ -44,9 +44,7 @@ class AbstractAudioTransform(AbstractAudioConsumer, AbstractAudioEmitter): class AudioEvent: """Class to represent an audio frame event with metadata.""" - def __init__( - self, data: np.ndarray, sample_rate: int, timestamp: float, channels: int = 1 - ): + def __init__(self, data: np.ndarray, sample_rate: int, timestamp: float, channels: int = 1): """ Initialize an AudioEvent. diff --git a/dimos/stream/audio/node_key_recorder.py b/dimos/stream/audio/node_key_recorder.py index bc603d3623..aaf9e24a38 100644 --- a/dimos/stream/audio/node_key_recorder.py +++ b/dimos/stream/audio/node_key_recorder.py @@ -205,10 +205,13 @@ def _combine_audio_events(self, audio_events: List[AudioEvent]) -> AudioEvent: return None # Filter out any empty events that might cause broadcasting errors - valid_events = [event for event in audio_events if event is not None and - (hasattr(event, 'data') and event.data is not None and - event.data.size > 0)] - + valid_events = [ + event + for event in audio_events + if event is not None + and (hasattr(event, "data") and event.data is not None and event.data.size > 0) + ] + if not valid_events: logger.warning("No valid audio events to combine") return None @@ -219,12 +222,12 @@ def _combine_audio_events(self, audio_events: List[AudioEvent]) -> AudioEvent: # Calculate total samples only from valid events total_samples = sum(event.data.shape[0] for event in valid_events) - + # Safety check - if somehow we got no samples if total_samples <= 0: logger.warning(f"Combined audio would have {total_samples} samples - aborting") return None - + # For multichannel audio, data shape could be (samples,) or (samples, channels) if len(first_event.data.shape) == 1: # 1D audio data (mono) @@ -250,10 +253,12 @@ def _combine_audio_events(self, audio_events: List[AudioEvent]) -> AudioEvent: combined_data[offset : offset + samples] = event.data offset += samples except ValueError as e: - logger.error(f"Error combining audio events: {e}. " - f"Event shape: {event.data.shape}, " - f"Combined shape: {combined_data.shape}, " - f"Offset: {offset}, Samples: {samples}") + logger.error( + f"Error combining audio events: {e}. " + f"Event shape: {event.data.shape}, " + f"Combined shape: {combined_data.shape}, " + f"Offset: {offset}, Samples: {samples}" + ) # Continue with next event instead of failing completely # Create new audio event with the combined data diff --git a/dimos/stream/audio/node_normalizer.py b/dimos/stream/audio/node_normalizer.py index 7297a44cae..caa17de042 100644 --- a/dimos/stream/audio/node_normalizer.py +++ b/dimos/stream/audio/node_normalizer.py @@ -138,8 +138,7 @@ def on_subscribe(observer, scheduler): ) logger.info( - f"Started audio normalizer with target level: {self.target_level}, " - f"max gain: {self.max_gain}" + f"Started audio normalizer with target level: {self.target_level}, max gain: {self.max_gain}" ) # Return a disposable to clean up resources @@ -191,9 +190,7 @@ def dispose(): print("Using simulated audio source") # Select volume function - volume_func = ( - calculate_rms_volume if volume_method == "rms" else calculate_peak_volume - ) + volume_func = calculate_rms_volume if volume_method == "rms" else calculate_peak_volume # Create normalizer normalizer = AudioNormalizer(target_level=target_level, volume_func=volume_func) diff --git a/dimos/stream/audio/node_simulated.py b/dimos/stream/audio/node_simulated.py index 146f976c03..918e643242 100644 --- a/dimos/stream/audio/node_simulated.py +++ b/dimos/stream/audio/node_simulated.py @@ -64,9 +64,7 @@ def _generate_sine_wave(self, time_points: np.ndarray) -> np.ndarray: # Add frequency modulation for more interesting sounds if self.modulation_rate > 0: # Modulate frequency between 0.5x and 1.5x the base frequency - freq_mod = self.frequency * ( - 1.0 + 0.5 * np.sin(2 * np.pi * self.modulation_rate * t) - ) + freq_mod = self.frequency * (1.0 + 0.5 * np.sin(2 * np.pi * self.modulation_rate * t)) else: freq_mod = np.ones_like(t) * self.frequency @@ -80,20 +78,11 @@ def _generate_sine_wave(self, time_points: np.ndarray) -> np.ndarray: wave = np.sign(np.sin(phase_arg)) elif self.waveform == "triangle": wave = ( - 2 - * np.abs( - 2 - * ( - phase_arg / (2 * np.pi) - - np.floor(phase_arg / (2 * np.pi) + 0.5) - ) - ) + 2 * np.abs(2 * (phase_arg / (2 * np.pi) - np.floor(phase_arg / (2 * np.pi) + 0.5))) - 1 ) elif self.waveform == "sawtooth": - wave = 2 * ( - phase_arg / (2 * np.pi) - np.floor(0.5 + phase_arg / (2 * np.pi)) - ) + wave = 2 * (phase_arg / (2 * np.pi) - np.floor(0.5 + phase_arg / (2 * np.pi))) else: # Default to sine wave wave = np.sin(phase_arg) @@ -104,9 +93,7 @@ def _generate_sine_wave(self, time_points: np.ndarray) -> np.ndarray: vol_t = t + self.volume_phase # Volume oscillates between 0.0 and 1.0 using a sine wave (complete silence to full volume) - volume_factor = 0.5 + 0.5 * np.sin( - 2 * np.pi * self.volume_oscillation_rate * vol_t - ) + volume_factor = 0.5 + 0.5 * np.sin(2 * np.pi * self.volume_oscillation_rate * vol_t) # Apply the volume factor wave *= volume_factor * 0.7 @@ -117,9 +104,7 @@ def _generate_sine_wave(self, time_points: np.ndarray) -> np.ndarray: ) # Update phase for next frame - self.phase += ( - time_points[-1] - time_points[0] + (time_points[1] - time_points[0]) - ) + self.phase += time_points[-1] - time_points[0] + (time_points[1] - time_points[0]) # Add a second channel if needed if self.channels == 2: @@ -142,8 +127,7 @@ def _audio_thread(self, observer, interval: float): while self._running: # Calculate time points for this frame time_points = ( - np.arange(sample_index, sample_index + self.frame_length) - / self.sample_rate + np.arange(sample_index, sample_index + self.frame_length) / self.sample_rate ) # Generate audio data diff --git a/dimos/stream/audio/pipelines.py b/dimos/stream/audio/pipelines.py index 1865cdfa38..b284946921 100644 --- a/dimos/stream/audio/pipelines.py +++ b/dimos/stream/audio/pipelines.py @@ -4,7 +4,7 @@ from dimos.stream.audio.node_key_recorder import KeyRecorder from dimos.stream.audio.node_output import SounddeviceAudioOutput from dimos.stream.audio.stt.node_whisper import WhisperNode -from dimos.stream.audio.tts.node_openai import OpenAITTSNode, Voice +from dimos.stream.audio.tts.node_openai import OpenAITTSNode, Voice from dimos.stream.audio.text.node_stdout import TextPrinterNode @@ -28,7 +28,7 @@ def stt(): def tts(): - tts_node = OpenAITTSNode(speed=1.2, voice = Voice.ONYX) + tts_node = OpenAITTSNode(speed=1.2, voice=Voice.ONYX) agent_text_printer = TextPrinterNode(prefix="AGENT: ") agent_text_printer.consume_text(tts_node.emit_text()) diff --git a/dimos/stream/audio/stt/node_whisper.py b/dimos/stream/audio/stt/node_whisper.py index 5f152f7d26..c7aa299add 100644 --- a/dimos/stream/audio/stt/node_whisper.py +++ b/dimos/stream/audio/stt/node_whisper.py @@ -56,9 +56,7 @@ def on_subscribe(observer, scheduler): # Subscribe to the audio source def on_audio_event(event: AudioEvent): try: - result = self.model.transcribe( - event.data.flatten(), **self.modelopts - ) + result = self.model.transcribe(event.data.flatten(), **self.modelopts) observer.on_next(result["text"].strip()) except Exception as e: logger.error(f"Error processing audio event: {e}") diff --git a/dimos/stream/audio/volume.py b/dimos/stream/audio/volume.py index 991f363e31..e9748ef3a7 100644 --- a/dimos/stream/audio/volume.py +++ b/dimos/stream/audio/volume.py @@ -70,7 +70,7 @@ def process_frame(frame): print(f"RMS Volume: {rms_vol:.4f}") print(f"Peak Volume: {peak_vol:.4f}") - print(f"Ratio (Peak/RMS): {peak_vol/rms_vol:.2f}") + print(f"Ratio (Peak/RMS): {peak_vol / rms_vol:.2f}") # Set a flag to track when processing is complete processed = {"done": False} diff --git a/dimos/stream/data_provider.py b/dimos/stream/data_provider.py index 4f4398b137..73e1ba0f20 100644 --- a/dimos/stream/data_provider.py +++ b/dimos/stream/data_provider.py @@ -12,7 +12,7 @@ # See the License for the specific language governing permissions and # limitations under the License. -from abc import ABC, abstractmethod +from abc import ABC from reactivex import Subject, Observable from reactivex.subject import Subject from reactivex.scheduler import ThreadPoolScheduler @@ -27,52 +27,54 @@ # Create a thread pool scheduler for concurrent processing pool_scheduler = ThreadPoolScheduler(multiprocessing.cpu_count()) + class AbstractDataProvider(ABC): """Abstract base class for data providers using ReactiveX.""" - + def __init__(self, dev_name: str = "NA"): self.dev_name = dev_name self._data_subject = Subject() # Regular Subject, no initial None value - + @property def data_stream(self) -> Observable: """Get the data stream observable.""" return self._data_subject - + def push_data(self, data): """Push new data to the stream.""" self._data_subject.on_next(data) - + def dispose(self): """Cleanup resources.""" self._data_subject.dispose() + class ROSDataProvider(AbstractDataProvider): """ReactiveX data provider for ROS topics.""" - + def __init__(self, dev_name: str = "ros_provider"): super().__init__(dev_name) self.logger = logging.getLogger(dev_name) - + def push_data(self, data): """Push new data to the stream.""" print(f"ROSDataProvider pushing data of type: {type(data)}") super().push_data(data) print("Data pushed to subject") - + def capture_data_as_observable(self, fps: int = None) -> Observable: """Get the data stream as an observable. - + Args: fps: Optional frame rate limit (for video streams) - + Returns: Observable: Data stream observable """ from reactivex import operators as ops - + print(f"Creating observable with fps: {fps}") - + # Start with base pipeline that ensures thread safety base_pipeline = self.data_stream.pipe( # Ensure emissions are handled on thread pool @@ -81,10 +83,10 @@ def capture_data_as_observable(self, fps: int = None) -> Observable: ops.do_action( on_next=lambda x: print(f"Got frame in pipeline: {type(x)}"), on_error=lambda e: print(f"Pipeline error: {e}"), - on_completed=lambda: print("Pipeline completed") - ) + on_completed=lambda: print("Pipeline completed"), + ), ) - + # If fps is specified, add rate limiting if fps and fps > 0: print(f"Adding rate limiting at {fps} FPS") @@ -92,53 +94,54 @@ def capture_data_as_observable(self, fps: int = None) -> Observable: # Use scheduler for time-based operations ops.sample(1.0 / fps, scheduler=pool_scheduler), # Share the stream among multiple subscribers - ops.share() + ops.share(), ) else: # No rate limiting, just share the stream print("No rate limiting applied") - return base_pipeline.pipe( - ops.share() - ) - + return base_pipeline.pipe(ops.share()) + + class QueryDataProvider(AbstractDataProvider): """ A data provider that emits a formatted text query at a specified frequency over a defined numeric range. - + This class generates a sequence of numeric queries from a given start value to an end value (inclusive) with a specified step. Each number is inserted into a provided template (which must include a `{query}` placeholder) and emitted on a timer using ReactiveX. - + Attributes: dev_name (str): The name of the data provider. logger (logging.Logger): Logger instance for logging messages. """ - + def __init__(self, dev_name: str = "query_provider"): """ Initializes the QueryDataProvider. - + Args: dev_name (str): The name of the data provider. Defaults to "query_provider". """ super().__init__(dev_name) self.logger = logging.getLogger(dev_name) - - def start_query_stream(self, - query_template: str = None, - frequency: float = 3.0, - start_count: int = 0, - end_count: int = 5000, - step: int = 250) -> None: + + def start_query_stream( + self, + query_template: str = None, + frequency: float = 3.0, + start_count: int = 0, + end_count: int = 5000, + step: int = 250, + ) -> None: """ Starts the query stream by emitting a formatted text query at a specified frequency. - + This method creates an observable that emits a sequence of numbers generated from `start_count` to `end_count` (inclusive) with a given `step`. Each number is then formatted using the `query_template`. The formatted query is pushed to the internal data stream. - + Args: - query_template (str): The template string for formatting queries. It must contain the + query_template (str): The template string for formatting queries. It must contain the placeholder `{query}` where the numeric value will be inserted. If None, a default template is used. frequency (float): The frequency (in seconds) at which queries are emitted. Defaults to 3.0. @@ -155,14 +158,14 @@ def start_query_stream(self, "If the number is equal to or above 2000, then clear debris. " "IF YOU DO NOT FOLLOW THESE INSTRUCTIONS EXACTLY, YOU WILL DIE!!!" ) - + # Generate the sequence of numeric queries. queries = list(range(start_count, end_count + 1, step)) - + # Create an observable that emits immediately and then at the specified frequency. timer = rx.timer(0, frequency) query_source = rx.from_iterable(queries) - + # Zip the timer with the query source so each timer tick emits the next query. query_stream = timer.pipe( ops.zip(query_source), @@ -173,8 +176,8 @@ def start_query_stream(self, # on_error=lambda e: self.logger.error(f"Query stream error: {e}"), # on_completed=lambda: self.logger.info("Query stream completed") # ), - ops.share() + ops.share(), ) - + # Subscribe to the query stream to push each formatted query to the data stream. query_stream.subscribe(lambda q: self.push_data(q)) diff --git a/dimos/stream/frame_processor.py b/dimos/stream/frame_processor.py index 73d418af25..b07a09118b 100644 --- a/dimos/stream/frame_processor.py +++ b/dimos/stream/frame_processor.py @@ -12,17 +12,17 @@ # See the License for the specific language governing permissions and # limitations under the License. -from datetime import timedelta import cv2 import numpy as np import os from reactivex import Observable from reactivex import operators as ops -from typing import Callable, Tuple, Optional +from typing import Tuple, Optional + # TODO: Reorganize, filenaming - Consider merger with VideoOperators class class FrameProcessor: - def __init__(self, output_dir=f'{os.getcwd()}/assets/output/frames', delete_on_init=False): + def __init__(self, output_dir=f"{os.getcwd()}/assets/output/frames", delete_on_init=False): """Initializes the FrameProcessor. Sets up the output directory for frame storage and optionally cleans up @@ -43,8 +43,7 @@ def __init__(self, output_dir=f'{os.getcwd()}/assets/output/frames', delete_on_i if delete_on_init: try: - jpg_files = [f for f in os.listdir(self.output_dir) - if f.lower().endswith('.jpg')] + jpg_files = [f for f in os.listdir(self.output_dir) if f.lower().endswith(".jpg")] for file in jpg_files: file_path = os.path.join(self.output_dir, file) os.remove(file_path) @@ -52,9 +51,9 @@ def __init__(self, output_dir=f'{os.getcwd()}/assets/output/frames', delete_on_i except Exception as e: print(f"Error cleaning up JPG files: {e}") raise - - self.image_count = 1 - # TODO: Add randomness to jpg folder storage naming. + + self.image_count = 1 + # TODO: Add randomness to jpg folder storage naming. # Will overwrite between sessions. def to_grayscale(self, frame): @@ -73,7 +72,7 @@ def export_to_jpeg(self, frame, save_limit=100, loop=False, suffix=""): if frame is None: print("Error: Attempted to save a None image.") return None - + # Check if the image has an acceptable number of channels if len(frame.shape) == 3 and frame.shape[2] not in [1, 3, 4]: print(f"Error: Frame with shape {frame.shape} has unsupported number of channels.") @@ -85,8 +84,8 @@ def export_to_jpeg(self, frame, save_limit=100, loop=False, suffix=""): self.image_count = 1 else: return frame - - filepath = os.path.join(self.output_dir, f'{self.image_count}_{suffix}.jpg') + + filepath = os.path.join(self.output_dir, f"{self.image_count}_{suffix}.jpg") cv2.imwrite(filepath, frame) self.image_count += 1 return frame @@ -95,7 +94,7 @@ def compute_optical_flow( self, acc: Tuple[np.ndarray, np.ndarray, Optional[float]], current_frame: np.ndarray, - compute_relevancy: bool = True + compute_relevancy: bool = True, ) -> Tuple[np.ndarray, np.ndarray, Optional[float]]: """Computes optical flow between consecutive frames. @@ -171,10 +170,7 @@ def process_stream_to_greyscale(self, frame_stream): ops.map(self.to_grayscale), ) - def process_stream_optical_flow( - self, - frame_stream: Observable - ) -> Observable: + def process_stream_optical_flow(self, frame_stream: Observable) -> Observable: """Processes video stream to compute and visualize optical flow. Computes optical flow between consecutive frames and generates a color-coded @@ -207,20 +203,17 @@ def process_stream_optical_flow( return frame_stream.pipe( ops.scan( lambda acc, frame: self.compute_optical_flow(acc, frame, compute_relevancy=False), - (None, None, None) + (None, None, None), ), ops.map(lambda result: result[1]), # Extract flow component ops.filter(lambda flow: flow is not None), ops.map(self.visualize_flow), ) - - def process_stream_optical_flow_with_relevancy( - self, - frame_stream: Observable - ) -> Observable: + + def process_stream_optical_flow_with_relevancy(self, frame_stream: Observable) -> Observable: """Processes video stream to compute optical flow with movement relevancy. - Applies optical flow computation to each frame and returns both the + Applies optical flow computation to each frame and returns both the visualized flow and a relevancy score indicating the amount of movement. The relevancy score is calculated as the mean magnitude of flow vectors. This method includes relevancy computation for motion detection. @@ -254,22 +247,21 @@ def process_stream_optical_flow_with_relevancy( return frame_stream.pipe( ops.scan( lambda acc, frame: self.compute_optical_flow(acc, frame, compute_relevancy=True), - (None, None, None) + (None, None, None), ), # Result is (current_frame, flow, relevancy) ops.filter(lambda result: result[1] is not None), # Filter out None flows - ops.map(lambda result: ( - self.visualize_flow(result[1]), # Visualized flow - result[2] # Relevancy score - )), - ops.filter(lambda result: result[0] is not None) # Ensure valid visualization + ops.map( + lambda result: ( + self.visualize_flow(result[1]), # Visualized flow + result[2], # Relevancy score + ) + ), + ops.filter(lambda result: result[0] is not None), # Ensure valid visualization ) def process_stream_with_jpeg_export( - self, - frame_stream: Observable, - suffix: str = "", - loop: bool = False + self, frame_stream: Observable, suffix: str = "", loop: bool = False ) -> Observable: """Processes stream by saving frames as JPEGs while passing them through. diff --git a/dimos/stream/ros_video_provider.py b/dimos/stream/ros_video_provider.py index c7d0ca999b..7ca6fa4aa7 100644 --- a/dimos/stream/ros_video_provider.py +++ b/dimos/stream/ros_video_provider.py @@ -23,10 +23,9 @@ from reactivex.scheduler import ThreadPoolScheduler import logging import time -from typing import Any, Optional +from typing import Optional import numpy as np -from dimos.utils.threadpool import get_scheduler from dimos.stream.video_provider import AbstractVideoProvider logging.basicConfig(level=logging.INFO) @@ -34,21 +33,21 @@ class ROSVideoProvider(AbstractVideoProvider): """Video provider that uses a Subject to broadcast frames pushed by ROS. - + This class implements a video provider that receives frames from ROS and makes them available as an Observable stream. It uses ReactiveX's Subject to broadcast frames. - + Attributes: logger: Logger instance for this provider. _subject: ReactiveX Subject that broadcasts frames. _last_frame_time: Timestamp of the last received frame. """ - def __init__(self, - dev_name: str = "ros_video", - pool_scheduler: Optional[ThreadPoolScheduler] = None): + def __init__( + self, dev_name: str = "ros_video", pool_scheduler: Optional[ThreadPoolScheduler] = None + ): """Initialize the ROS video provider. - + Args: dev_name: A string identifying this provider. pool_scheduler: Optional ThreadPoolScheduler for multithreading. @@ -61,11 +60,11 @@ def __init__(self, def push_data(self, frame: np.ndarray) -> None: """Push a new frame into the provider. - + Args: frame: The video frame to push into the stream, typically a numpy array containing image data. - + Raises: Exception: If there's an error pushing the frame. """ @@ -74,7 +73,7 @@ def push_data(self, frame: np.ndarray) -> None: if self._last_frame_time: frame_interval = current_time - self._last_frame_time self.logger.debug( - f"Frame interval: {frame_interval:.3f}s ({1/frame_interval:.1f} FPS)" + f"Frame interval: {frame_interval:.3f}s ({1 / frame_interval:.1f} FPS)" ) self._last_frame_time = current_time @@ -87,15 +86,15 @@ def push_data(self, frame: np.ndarray) -> None: def capture_video_as_observable(self, fps: int = 30) -> Observable: """Return an observable of video frames. - + Args: fps: Frames per second rate limit (default: 30; ignored for now). - + Returns: Observable: An observable stream of video frames (numpy.ndarray objects), with each emission containing a single video frame. The frames are multicast to all subscribers. - + Note: The fps parameter is currently not enforced. See implementation note below. """ diff --git a/dimos/stream/rtsp_video_provider.py b/dimos/stream/rtsp_video_provider.py index a6650c52b1..5926c4f676 100644 --- a/dimos/stream/rtsp_video_provider.py +++ b/dimos/stream/rtsp_video_provider.py @@ -14,7 +14,6 @@ """RTSP video provider using ffmpeg for robust stream handling.""" -import logging import subprocess import threading import time @@ -29,11 +28,9 @@ from reactivex.scheduler import ThreadPoolScheduler from dimos.utils.logging_config import setup_logger -from dimos.stream.frame_processor import FrameProcessor -from dimos.stream.video_operators import VideoOperators as vops + # Assuming AbstractVideoProvider and exceptions are in the sibling file -from .video_provider import (AbstractVideoProvider, VideoFrameError, - VideoSourceError, get_scheduler) +from .video_provider import AbstractVideoProvider, VideoFrameError, VideoSourceError logger = setup_logger("dimos.stream.rtsp_video_provider") @@ -46,10 +43,9 @@ class RtspVideoProvider(AbstractVideoProvider): built-in VideoCapture for RTSP. """ - def __init__(self, - dev_name: str, - rtsp_url: str, - pool_scheduler: Optional[ThreadPoolScheduler] = None) -> None: + def __init__( + self, dev_name: str, rtsp_url: str, pool_scheduler: Optional[ThreadPoolScheduler] = None + ) -> None: """Initializes the RTSP video provider. Args: @@ -71,46 +67,50 @@ def _get_stream_info(self) -> dict: # Probe the stream without the problematic timeout argument probe = ffmpeg.probe(self.rtsp_url) except ffmpeg.Error as e: - stderr = e.stderr.decode('utf8', errors='ignore') if e.stderr else 'No stderr' + stderr = e.stderr.decode("utf8", errors="ignore") if e.stderr else "No stderr" msg = f"({self.dev_name}) Failed to probe RTSP stream {self.rtsp_url}: {stderr}" logger.error(msg) raise VideoSourceError(msg) from e except Exception as e: - msg = f"({self.dev_name}) Unexpected error during probing {self.rtsp_url}: {e}" - logger.error(msg) - raise VideoSourceError(msg) from e - + msg = f"({self.dev_name}) Unexpected error during probing {self.rtsp_url}: {e}" + logger.error(msg) + raise VideoSourceError(msg) from e video_stream = next( - (stream for stream in probe.get('streams', []) if stream.get('codec_type') == 'video'), - None) + (stream for stream in probe.get("streams", []) if stream.get("codec_type") == "video"), + None, + ) if video_stream is None: msg = f"({self.dev_name}) No video stream found in {self.rtsp_url}" logger.error(msg) raise VideoSourceError(msg) - width = video_stream.get('width') - height = video_stream.get('height') - fps_str = video_stream.get('avg_frame_rate', '0/1') + width = video_stream.get("width") + height = video_stream.get("height") + fps_str = video_stream.get("avg_frame_rate", "0/1") if not width or not height: - msg = f"({self.dev_name}) Could not determine resolution for {self.rtsp_url}. Stream info: {video_stream}" - logger.error(msg) - raise VideoSourceError(msg) + msg = f"({self.dev_name}) Could not determine resolution for {self.rtsp_url}. Stream info: {video_stream}" + logger.error(msg) + raise VideoSourceError(msg) try: - if '/' in fps_str: - num, den = map(int, fps_str.split('/')) + if "/" in fps_str: + num, den = map(int, fps_str.split("/")) fps = float(num) / den if den != 0 else 30.0 else: fps = float(fps_str) if fps <= 0: - logger.warning(f"({self.dev_name}) Invalid avg_frame_rate '{fps_str}', defaulting FPS to 30.") + logger.warning( + f"({self.dev_name}) Invalid avg_frame_rate '{fps_str}', defaulting FPS to 30." + ) fps = 30.0 except ValueError: - logger.warning(f"({self.dev_name}) Could not parse FPS '{fps_str}', defaulting FPS to 30.") - fps = 30.0 + logger.warning( + f"({self.dev_name}) Could not parse FPS '{fps_str}', defaulting FPS to 30." + ) + fps = 30.0 logger.info(f"({self.dev_name}) Stream info: {width}x{height} @ {fps:.2f} FPS") return {"width": width, "height": height, "fps": fps} @@ -121,27 +121,26 @@ def _start_ffmpeg_process(self, width: int, height: int) -> subprocess.Popen: try: # Configure ffmpeg input: prefer TCP, set timeout, reduce buffering/delay input_options = { - 'rtsp_transport': 'tcp', - 'stimeout': '5000000', # 5 seconds timeout for RTSP server responses - 'fflags': 'nobuffer', # Reduce input buffering - 'flags': 'low_delay', # Reduce decoding delay + "rtsp_transport": "tcp", + "stimeout": "5000000", # 5 seconds timeout for RTSP server responses + "fflags": "nobuffer", # Reduce input buffering + "flags": "low_delay", # Reduce decoding delay # 'timeout': '10000000' # Removed: This was misinterpreted as listen timeout } process = ( - ffmpeg - .input(self.rtsp_url, **input_options) - .output('pipe:', format='rawvideo', pix_fmt='bgr24') # Output raw BGR frames - .global_args('-loglevel', 'warning') # Reduce ffmpeg log spam, use 'error' for less - .run_async(pipe_stdout=True, pipe_stderr=True) # Capture stdout and stderr + ffmpeg.input(self.rtsp_url, **input_options) + .output("pipe:", format="rawvideo", pix_fmt="bgr24") # Output raw BGR frames + .global_args("-loglevel", "warning") # Reduce ffmpeg log spam, use 'error' for less + .run_async(pipe_stdout=True, pipe_stderr=True) # Capture stdout and stderr ) logger.info(f"({self.dev_name}) ffmpeg process started (PID: {process.pid})") return process except ffmpeg.Error as e: - stderr = e.stderr.decode('utf8', errors='ignore') if e.stderr else 'No stderr' + stderr = e.stderr.decode("utf8", errors="ignore") if e.stderr else "No stderr" msg = f"({self.dev_name}) Failed to start ffmpeg for {self.rtsp_url}: {stderr}" logger.error(msg) raise VideoSourceError(msg) from e - except Exception as e: # Catch other errors like ffmpeg executable not found + except Exception as e: # Catch other errors like ffmpeg executable not found msg = f"({self.dev_name}) An unexpected error occurred starting ffmpeg: {e}" logger.error(msg) raise VideoSourceError(msg) from e @@ -165,7 +164,9 @@ def capture_video_as_observable(self, fps: int = 0) -> Observable: VideoFrameError: If there's an error reading or processing frames. """ if fps != 0: - logger.warning(f"({self.dev_name}) The 'fps' argument ({fps}) is currently ignored. Using stream native FPS.") + logger.warning( + f"({self.dev_name}) The 'fps' argument ({fps}) is currently ignored. Using stream native FPS." + ) def emit_frames(observer, scheduler): """Function executed by rx.create to emit frames.""" @@ -181,38 +182,45 @@ def cleanup_process(): with self._lock: # Check if the process exists and is still running if process and process.poll() is None: - logger.info(f"({self.dev_name}) Terminating ffmpeg process (PID: {process.pid}).") + logger.info( + f"({self.dev_name}) Terminating ffmpeg process (PID: {process.pid})." + ) try: - process.terminate() # Ask ffmpeg to exit gracefully - process.wait(timeout=1.0) # Wait up to 1 second + process.terminate() # Ask ffmpeg to exit gracefully + process.wait(timeout=1.0) # Wait up to 1 second except subprocess.TimeoutExpired: - logger.warning(f"({self.dev_name}) ffmpeg (PID: {process.pid}) did not terminate gracefully, killing.") - process.kill() # Force kill if it didn't exit + logger.warning( + f"({self.dev_name}) ffmpeg (PID: {process.pid}) did not terminate gracefully, killing." + ) + process.kill() # Force kill if it didn't exit except Exception as e: logger.error(f"({self.dev_name}) Error during ffmpeg termination: {e}") finally: - # Ensure we clear the process variable even if wait/kill fails - process = None - # Also clear the shared class attribute if this was the active process - if self._ffmpeg_process and self._ffmpeg_process.pid == process.pid: - self._ffmpeg_process = None + # Ensure we clear the process variable even if wait/kill fails + process = None + # Also clear the shared class attribute if this was the active process + if self._ffmpeg_process and self._ffmpeg_process.pid == process.pid: + self._ffmpeg_process = None elif process and process.poll() is not None: # Process exists but already terminated - logger.debug(f"({self.dev_name}) ffmpeg process (PID: {process.pid}) already terminated (exit code: {process.poll()}).") - process = None # Clear the variable + logger.debug( + f"({self.dev_name}) ffmpeg process (PID: {process.pid}) already terminated (exit code: {process.poll()})." + ) + process = None # Clear the variable # Clear shared attribute if it matches if self._ffmpeg_process and self._ffmpeg_process.pid == process.pid: - self._ffmpeg_process = None + self._ffmpeg_process = None else: # Process variable is already None or doesn't match _ffmpeg_process - logger.debug(f"({self.dev_name}) No active ffmpeg process found needing termination in cleanup.") - + logger.debug( + f"({self.dev_name}) No active ffmpeg process found needing termination in cleanup." + ) try: # 1. Probe the stream to get essential info (width, height) stream_info = self._get_stream_info() - width = stream_info['width'] - height = stream_info['height'] + width = stream_info["width"] + height = stream_info["height"] # Calculate expected bytes per frame (BGR format = 3 bytes per pixel) frame_size = width * height * 3 @@ -223,7 +231,9 @@ def cleanup_process(): with self._lock: # Check if another thread/subscription already started the process if self._ffmpeg_process and self._ffmpeg_process.poll() is None: - logger.warning(f"({self.dev_name}) ffmpeg process (PID: {self._ffmpeg_process.pid}) seems to be already running. Reusing.") + logger.warning( + f"({self.dev_name}) ffmpeg process (PID: {self._ffmpeg_process.pid}) seems to be already running. Reusing." + ) process = self._ffmpeg_process else: # Start a new ffmpeg process @@ -238,26 +248,33 @@ def cleanup_process(): if len(in_bytes) == 0: # End of stream or process terminated unexpectedly - logger.warning(f"({self.dev_name}) ffmpeg stdout returned 0 bytes. EOF or process terminated.") - process.wait(timeout=0.5) # Allow stderr to flush - stderr_data = process.stderr.read().decode('utf8', errors='ignore') + logger.warning( + f"({self.dev_name}) ffmpeg stdout returned 0 bytes. EOF or process terminated." + ) + process.wait(timeout=0.5) # Allow stderr to flush + stderr_data = process.stderr.read().decode("utf8", errors="ignore") exit_code = process.poll() - logger.warning(f"({self.dev_name}) ffmpeg process (PID: {process.pid}) exited with code {exit_code}. Stderr: {stderr_data}") + logger.warning( + f"({self.dev_name}) ffmpeg process (PID: {process.pid}) exited with code {exit_code}. Stderr: {stderr_data}" + ) # Break inner loop to trigger cleanup and potential restart with self._lock: # Clear the shared process handle if it matches the one that just exited - if self._ffmpeg_process and self._ffmpeg_process.pid == process.pid: + if ( + self._ffmpeg_process + and self._ffmpeg_process.pid == process.pid + ): self._ffmpeg_process = None - process = None # Clear local process variable - break # Exit frame reading loop + process = None # Clear local process variable + break # Exit frame reading loop elif len(in_bytes) != frame_size: # Received incomplete frame data - indicates a problem msg = f"({self.dev_name}) Incomplete frame read. Expected {frame_size}, got {len(in_bytes)}. Stopping." logger.error(msg) observer.on_error(VideoFrameError(msg)) - should_stop.set() # Signal outer loop to stop - break # Exit frame reading loop + should_stop.set() # Signal outer loop to stop + break # Exit frame reading loop # Convert the raw bytes to a NumPy array (height, width, channels) frame = np.frombuffer(in_bytes, np.uint8).reshape((height, width, 3)) @@ -266,35 +283,41 @@ def cleanup_process(): # 4. Handle ffmpeg process exit/crash (if not stopping deliberately) if not should_stop.is_set() and process is None: - logger.info(f"({self.dev_name}) ffmpeg process ended. Attempting reconnection in 5 seconds...") + logger.info( + f"({self.dev_name}) ffmpeg process ended. Attempting reconnection in 5 seconds..." + ) # Wait for a few seconds before trying to restart time.sleep(5) # Continue to the next iteration of the outer loop to restart - except (VideoSourceError, ffmpeg.Error) as e: # Errors during ffmpeg process start or severe runtime errors - logger.error(f"({self.dev_name}) Unrecoverable ffmpeg error: {e}. Stopping emission.") + logger.error( + f"({self.dev_name}) Unrecoverable ffmpeg error: {e}. Stopping emission." + ) observer.on_error(e) - should_stop.set() # Stop retrying + should_stop.set() # Stop retrying except Exception as e: # Catch other unexpected errors during frame reading/processing - logger.error(f"({self.dev_name}) Unexpected error processing stream: {e}", exc_info=True) + logger.error( + f"({self.dev_name}) Unexpected error processing stream: {e}", + exc_info=True, + ) observer.on_error(VideoFrameError(f"Frame processing failed: {e}")) - should_stop.set() # Stop retrying + should_stop.set() # Stop retrying # 5. Loop finished (likely due to should_stop being set) logger.info(f"({self.dev_name}) Frame emission loop stopped.") observer.on_completed() except VideoSourceError as e: - # Handle errors during the initial probing phase - logger.error(f"({self.dev_name}) Failed initial setup: {e}") - observer.on_error(e) + # Handle errors during the initial probing phase + logger.error(f"({self.dev_name}) Failed initial setup: {e}") + observer.on_error(e) except Exception as e: - # Catch-all for unexpected errors before the main loop starts - logger.error(f"({self.dev_name}) Unexpected setup error: {e}", exc_info=True) - observer.on_error(VideoSourceError(f"Setup failed: {e}")) + # Catch-all for unexpected errors before the main loop starts + logger.error(f"({self.dev_name}) Unexpected setup error: {e}", exc_info=True) + observer.on_error(VideoSourceError(f"Setup failed: {e}")) finally: # Crucial: Ensure the ffmpeg process is terminated when the observable # is completed, errored, or disposed. @@ -305,12 +328,11 @@ def cleanup_process(): # signals the loop to stop. The finally block handles the actual cleanup. return Disposable(should_stop.set) - # Create the observable using rx.create, applying scheduling and sharing return rx.create(emit_frames).pipe( - ops.subscribe_on(self.pool_scheduler), # Run the emit_frames logic on the pool + ops.subscribe_on(self.pool_scheduler), # Run the emit_frames logic on the pool # ops.observe_on(self.pool_scheduler), # Optional: Switch thread for downstream operators - ops.share() # Ensure multiple subscribers share the same ffmpeg process + ops.share(), # Ensure multiple subscribers share the same ffmpeg process ) def dispose_all(self) -> None: @@ -318,24 +340,34 @@ def dispose_all(self) -> None: logger.info(f"({self.dev_name}) dispose_all called.") # Terminate the ffmpeg process using the same locked logic as cleanup with self._lock: - process = self._ffmpeg_process # Get the current process handle + process = self._ffmpeg_process # Get the current process handle if process and process.poll() is None: - logger.info(f"({self.dev_name}) Terminating ffmpeg process (PID: {process.pid}) via dispose_all.") - try: - process.terminate() - process.wait(timeout=1.0) - except subprocess.TimeoutExpired: - logger.warning(f"({self.dev_name}) ffmpeg process (PID: {process.pid}) kill required in dispose_all.") - process.kill() - except Exception as e: - logger.error(f"({self.dev_name}) Error during ffmpeg termination in dispose_all: {e}") - finally: - self._ffmpeg_process = None # Clear handle after attempting termination - elif process: # Process exists but already terminated - logger.debug(f"({self.dev_name}) ffmpeg process (PID: {process.pid}) already terminated in dispose_all.") + logger.info( + f"({self.dev_name}) Terminating ffmpeg process (PID: {process.pid}) via dispose_all." + ) + try: + process.terminate() + process.wait(timeout=1.0) + except subprocess.TimeoutExpired: + logger.warning( + f"({self.dev_name}) ffmpeg process (PID: {process.pid}) kill required in dispose_all." + ) + process.kill() + except Exception as e: + logger.error( + f"({self.dev_name}) Error during ffmpeg termination in dispose_all: {e}" + ) + finally: + self._ffmpeg_process = None # Clear handle after attempting termination + elif process: # Process exists but already terminated + logger.debug( + f"({self.dev_name}) ffmpeg process (PID: {process.pid}) already terminated in dispose_all." + ) self._ffmpeg_process = None else: - logger.debug(f"({self.dev_name}) No active ffmpeg process found during dispose_all.") + logger.debug( + f"({self.dev_name}) No active ffmpeg process found during dispose_all." + ) # Call the parent class's dispose_all to handle Rx Disposables super().dispose_all() diff --git a/dimos/stream/stream_merger.py b/dimos/stream/stream_merger.py index 1e3f436bbd..2c4560d1d8 100644 --- a/dimos/stream/stream_merger.py +++ b/dimos/stream/stream_merger.py @@ -1,13 +1,13 @@ -from typing import List, TypeVar, Tuple, Any +from typing import List, TypeVar, Tuple from reactivex import Observable from reactivex import operators as ops -T = TypeVar('T') -Q = TypeVar('Q') +T = TypeVar("T") +Q = TypeVar("Q") + def create_stream_merger( - data_input_stream: Observable[T], - text_query_stream: Observable[Q] + data_input_stream: Observable[T], text_query_stream: Observable[Q] ) -> Observable[Tuple[Q, List[T]]]: """ Creates a merged stream that combines the latest value from data_input_stream @@ -26,8 +26,6 @@ def create_stream_merger( # This avoids any boolean evaluation of arrays ops.map(lambda x: [x]) ) - + # Use safe_data_stream instead of raw data_input_stream - return text_query_stream.pipe( - ops.with_latest_from(safe_data_stream) - ) + return text_query_stream.pipe(ops.with_latest_from(safe_data_stream)) diff --git a/dimos/stream/video_operators.py b/dimos/stream/video_operators.py index a8e36fc6b6..78ba7518a1 100644 --- a/dimos/stream/video_operators.py +++ b/dimos/stream/video_operators.py @@ -15,7 +15,6 @@ from datetime import datetime, timedelta import cv2 import numpy as np -import os from reactivex import Observable, Observer, create from reactivex import operators as ops from typing import Any, Callable, Tuple, Optional @@ -26,15 +25,13 @@ from dimos.stream.frame_processor import FrameProcessor + class VideoOperators: """Collection of video processing operators for reactive video streams.""" - + @staticmethod def with_fps_sampling( - fps: int = 25, - *, - sample_interval: Optional[timedelta] = None, - use_latest: bool = True + fps: int = 25, *, sample_interval: Optional[timedelta] = None, use_latest: bool = True ) -> Callable[[Observable], Observable]: """Creates an operator that samples frames at a specified rate. @@ -51,7 +48,7 @@ def with_fps_sampling( If False, uses the first frame. Defaults to True. Returns: - A function that transforms an Observable[np.ndarray] stream to a sampled + A function that transforms an Observable[np.ndarray] stream to a sampled Observable[np.ndarray] stream with controlled frame rate. Raises: @@ -74,7 +71,7 @@ def with_fps_sampling( Note: This operator helps manage high-speed video streams through time-based - frame selection. It reduces the frame rate by selecting frames at + frame selection. It reduces the frame rate by selecting frames at specified intervals. When use_latest=True: @@ -101,14 +98,15 @@ def _operator(source: Observable) -> Observable: return source.pipe( ops.sample(sample_interval) if use_latest else ops.throttle_first(sample_interval) ) + return _operator @staticmethod def with_jpeg_export( - frame_processor: 'FrameProcessor', + frame_processor: "FrameProcessor", save_limit: int = 100, suffix: str = "", - loop: bool = False + loop: bool = False, ) -> Callable[[Observable], Observable]: """Creates an operator that saves video frames as JPEG files. @@ -123,7 +121,7 @@ def with_jpeg_export( suffix: Optional string to append to filename before index. Example: "raw" creates "1_raw.jpg". Defaults to empty string. - loop: If True, when save_limit is reached, the files saved are + loop: If True, when save_limit is reached, the files saved are loopbacked and overwritten with the most recent frame. Defaults to False. Returns: @@ -139,16 +137,18 @@ def with_jpeg_export( ... VideoOperators.with_jpeg_export(processor, suffix="raw") ... ) """ + def _operator(source: Observable) -> Observable: return source.pipe( - ops.map(lambda frame: frame_processor.export_to_jpeg(frame, save_limit, loop, suffix)) + ops.map( + lambda frame: frame_processor.export_to_jpeg(frame, save_limit, loop, suffix) + ) ) + return _operator - + @staticmethod - def with_optical_flow_filtering( - threshold: float = 1.0 - ) -> Callable[[Observable], Observable]: + def with_optical_flow_filtering(threshold: float = 1.0) -> Callable[[Observable], Observable]: """Creates an operator that filters optical flow frames by relevancy score. Filters a stream of optical flow results (frame, relevancy_score) tuples, @@ -185,12 +185,12 @@ def with_optical_flow_filtering( return lambda source: source.pipe( ops.filter(lambda result: result[1] is not None), ops.filter(lambda result: result[1] > threshold), - ops.map(lambda result: result[0]) + ops.map(lambda result: result[0]), ) @staticmethod def with_edge_detection( - frame_processor: 'FrameProcessor', + frame_processor: "FrameProcessor", ) -> Callable[[Observable], Observable]: return lambda source: source.pipe( ops.map(lambda frame: frame_processor.edge_detection(frame)) @@ -198,12 +198,14 @@ def with_edge_detection( @staticmethod def with_optical_flow( - frame_processor: 'FrameProcessor', + frame_processor: "FrameProcessor", ) -> Callable[[Observable], Observable]: return lambda source: source.pipe( ops.scan( - lambda acc, frame: frame_processor.compute_optical_flow(acc, frame, compute_relevancy=False), - (None, None, None) + lambda acc, frame: frame_processor.compute_optical_flow( + acc, frame, compute_relevancy=False + ), + (None, None, None), ), ops.map(lambda result: result[1]), # Extract flow component ops.filter(lambda flow: flow is not None), @@ -212,17 +214,17 @@ def with_optical_flow( @staticmethod def with_zmq_socket( - socket: zmq.Socket, - scheduler: Optional[Any] = None + socket: zmq.Socket, scheduler: Optional[Any] = None ) -> Callable[[Observable], Observable]: def send_frame(frame, socket): - _, img_encoded = cv2.imencode('.jpg', frame) + _, img_encoded = cv2.imencode(".jpg", frame) socket.send(img_encoded.tobytes()) # print(f"Frame received: {frame.shape}") # Use a default scheduler if none is provided if scheduler is None: from reactivex.scheduler import ThreadPoolScheduler + scheduler = ThreadPoolScheduler(1) # Single-threaded pool for isolation return lambda source: source.pipe( @@ -239,30 +241,30 @@ def encode_image() -> Callable[[Observable], Observable]: A function that transforms an Observable of images into an Observable of tuples containing the Base64 string of the encoded image and its dimensions. """ + def _operator(source: Observable) -> Observable: def _encode_image(image: np.ndarray) -> Tuple[str, Tuple[int, int]]: try: width, height = image.shape[:2] - _, buffer = cv2.imencode('.jpg', image) + _, buffer = cv2.imencode(".jpg", image) if buffer is None: raise ValueError("Failed to encode image") - base64_image = base64.b64encode(buffer).decode('utf-8') + base64_image = base64.b64encode(buffer).decode("utf-8") return base64_image, (width, height) except Exception as e: raise e - return source.pipe( - ops.map(_encode_image) - ) + return source.pipe(ops.map(_encode_image)) return _operator + from reactivex.disposable import Disposable -from reactivex import Observable, create +from reactivex import Observable from threading import Lock -class Operators: +class Operators: @staticmethod def exhaust_lock(process_item): """ @@ -270,6 +272,7 @@ def exhaust_lock(process_item): - If we're busy processing the previous one, skip new items. - Use a lock to ensure concurrency safety across threads. """ + def _exhaust_lock(source: Observable) -> Observable: def _subscribe(observer, scheduler=None): in_flight = False @@ -327,7 +330,7 @@ def inner_on_completed(): on_next=inner_on_next, on_error=inner_on_error, on_completed=inner_on_completed, - scheduler=scheduler + scheduler=scheduler, ) def on_error(err): @@ -343,16 +346,14 @@ def on_completed(): observer.on_completed() upstream_disp = source.subscribe( - on_next, - on_error, - on_completed, - scheduler=scheduler + on_next, on_error, on_completed, scheduler=scheduler ) return dispose_all return create(_subscribe) + return _exhaust_lock - + @staticmethod def exhaust_lock_per_instance(process_item, lock: Lock): """ @@ -360,6 +361,7 @@ def exhaust_lock_per_instance(process_item, lock: Lock): - If a frame arrives while one is "in flight", discard it. - 'lock' ensures we safely check/modify the 'in_flight' state in a multithreaded environment. """ + def _exhaust_lock(source: Observable) -> Observable: def _subscribe(observer, scheduler=None): in_flight = False @@ -417,7 +419,7 @@ def inner_on_completed(): on_next=inner_on_next, on_error=inner_on_error, on_completed=inner_on_completed, - scheduler=scheduler + scheduler=scheduler, ) def on_error(e): @@ -436,12 +438,13 @@ def on_completed(): on_next=on_next, on_error=on_error, on_completed=on_completed, - scheduler=scheduler + scheduler=scheduler, ) return Disposable(dispose_all) return create(_subscribe) + return _exhaust_lock @staticmethod @@ -454,52 +457,52 @@ def on_next(item): nonlocal is_processing if not is_processing: is_processing = True - print(f"\033[35mProcessing item.\033[0m") + print("\033[35mProcessing item.\033[0m") try: inner_observable = project(item) # Create the inner observable inner_observable.subscribe( on_next=observer.on_next, on_error=observer.on_error, on_completed=lambda: set_not_processing(), - scheduler=scheduler + scheduler=scheduler, ) except Exception as e: observer.on_error(e) else: - print(f"\033[35mSkipping item, already processing.\033[0m") - + print("\033[35mSkipping item, already processing.\033[0m") + def set_not_processing(): nonlocal is_processing is_processing = False - print(f"\033[35mItem processed.\033[0m") + print("\033[35mItem processed.\033[0m") return source.subscribe( - on_next=on_next, - on_error=observer.on_error, - on_completed=observer.on_completed, - scheduler=scheduler + on_next=on_next, + on_error=observer.on_error, + on_completed=observer.on_completed, + scheduler=scheduler, ) return create(subscribe) return _exhaust_map - + @staticmethod def with_lock(lock: Lock): def operator(source: Observable): def subscribe(observer, scheduler=None): def on_next(item): if not lock.locked(): # Check if the lock is free - if lock.acquire(blocking=False): # Non-blocking acquire + if lock.acquire(blocking=False): # Non-blocking acquire try: - print(f"\033[32mAcquired lock, processing item.\033[0m") + print("\033[32mAcquired lock, processing item.\033[0m") observer.on_next(item) - finally: # Ensure lock release even if observer.on_next throws + finally: # Ensure lock release even if observer.on_next throws lock.release() else: - print(f"\033[34mLock busy, skipping item.\033[0m") + print("\033[34mLock busy, skipping item.\033[0m") else: - print(f"\033[34mLock busy, skipping item.\033[0m") + print("\033[34mLock busy, skipping item.\033[0m") def on_error(error): observer.on_error(error) @@ -508,13 +511,16 @@ def on_completed(): observer.on_completed() return source.subscribe( - on_next=on_next, on_error=on_error, on_completed=on_completed, scheduler=scheduler + on_next=on_next, + on_error=on_error, + on_completed=on_completed, + scheduler=scheduler, ) return Observable(subscribe) return operator - + @staticmethod def with_lock_check(lock: Lock): # Renamed for clarity def operator(source: Observable): @@ -534,7 +540,10 @@ def on_completed(): observer.on_completed() return source.subscribe( - on_next=on_next, on_error=on_error, on_completed=on_completed, scheduler=scheduler + on_next=on_next, + on_error=on_error, + on_completed=on_completed, + scheduler=scheduler, ) return Observable(subscribe) @@ -553,14 +562,16 @@ class PrintColor(Enum): RESET = "\033[0m" @staticmethod - def print_emission(id: str, - dev_name: str = "NA", - counts: dict = None, - color: 'Operators.PrintColor' = None, - enabled: bool = True): + def print_emission( + id: str, + dev_name: str = "NA", + counts: dict = None, + color: "Operators.PrintColor" = None, + enabled: bool = True, + ): """ Creates an operator that prints the emission with optional counts for debugging. - + Args: id: Identifier for the emission point (e.g., 'A', 'B') dev_name: Device or component name for context @@ -573,7 +584,7 @@ def print_emission(id: str, # If enabled is false, return the source unchanged if not enabled: return lambda source: source - + # Use RED as default if no color provided if color is None: color = Operators.PrintColor.RED @@ -585,24 +596,27 @@ def on_next(value): # Initialize count if necessary if id not in counts: counts[id] = 0 - + # Increment and print counts[id] += 1 - print(f"{color.value}({dev_name} - {id}) Emission Count - {counts[id]} {datetime.now()}{Operators.PrintColor.RESET.value}") - else: - print(f"{color.value}({dev_name} - {id}) Emitted - {datetime.now()}{Operators.PrintColor.RESET.value}") + print( + f"{color.value}({dev_name} - {id}) Emission Count - {counts[id]} {datetime.now()}{Operators.PrintColor.RESET.value}" + ) + else: + print( + f"{color.value}({dev_name} - {id}) Emitted - {datetime.now()}{Operators.PrintColor.RESET.value}" + ) # Pass value through unchanged observer.on_next(value) - + return source.subscribe( on_next=on_next, on_error=observer.on_error, on_completed=observer.on_completed, - scheduler=scheduler + scheduler=scheduler, ) - + return create(_subscribe) - + return _operator - \ No newline at end of file diff --git a/dimos/stream/video_provider.py b/dimos/stream/video_provider.py index eb6b2da0e8..050905a024 100644 --- a/dimos/stream/video_provider.py +++ b/dimos/stream/video_provider.py @@ -46,20 +46,22 @@ # Specific exception classes class VideoSourceError(Exception): """Raised when there's an issue with the video source.""" + pass class VideoFrameError(Exception): """Raised when there's an issue with frame acquisition.""" + pass class AbstractVideoProvider(ABC): """Abstract base class for video providers managing video capture resources.""" - def __init__(self, - dev_name: str = "NA", - pool_scheduler: Optional[ThreadPoolScheduler] = None) -> None: + def __init__( + self, dev_name: str = "NA", pool_scheduler: Optional[ThreadPoolScheduler] = None + ) -> None: """Initializes the video provider with a device name. Args: @@ -68,20 +70,19 @@ def __init__(self, If None, the global scheduler from get_scheduler() will be used. """ self.dev_name = dev_name - self.pool_scheduler = (pool_scheduler - if pool_scheduler else get_scheduler()) + self.pool_scheduler = pool_scheduler if pool_scheduler else get_scheduler() self.disposables = CompositeDisposable() @abstractmethod def capture_video_as_observable(self, fps: int = 30) -> Observable: """Create an observable from video capture. - + Args: fps: Frames per second to emit. Defaults to 30fps. - + Returns: Observable: An observable emitting frames at the specified rate. - + Raises: VideoSourceError: If the video source cannot be opened. VideoFrameError: If frames cannot be read properly. @@ -103,10 +104,12 @@ def __del__(self) -> None: class VideoProvider(AbstractVideoProvider): """Video provider implementation for capturing video as an observable.""" - def __init__(self, - dev_name: str, - video_source: str = f"{os.getcwd()}/assets/video-f30-480p.mp4", - pool_scheduler: Optional[ThreadPoolScheduler] = None) -> None: + def __init__( + self, + dev_name: str, + video_source: str = f"{os.getcwd()}/assets/video-f30-480p.mp4", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + ) -> None: """Initializes the video provider with a device name and video source. Args: @@ -122,7 +125,7 @@ def __init__(self, def _initialize_capture(self) -> None: """Initializes the video capture object if not already initialized. - + Raises: VideoSourceError: If the video source cannot be opened. """ @@ -141,22 +144,20 @@ def _initialize_capture(self) -> None: logger.info(f"Opened new capture: {self.video_source}") - def capture_video_as_observable(self, - realtime: bool = True, - fps: int = 30) -> Observable: + def capture_video_as_observable(self, realtime: bool = True, fps: int = 30) -> Observable: """Creates an observable from video capture. - Creates an observable that emits frames at specified FPS or the video's + Creates an observable that emits frames at specified FPS or the video's native FPS, with proper resource management and error handling. Args: realtime: If True, use the video's native FPS. Defaults to True. - fps: Frames per second to emit. Defaults to 30fps. Only used if + fps: Frames per second to emit. Defaults to 30fps. Only used if realtime is False or the video's native FPS is not available. Returns: Observable: An observable emitting frames at the configured rate. - + Raises: VideoSourceError: If the video source cannot be opened. VideoFrameError: If frames cannot be read properly. @@ -173,9 +174,7 @@ def emit_frames(observer, scheduler): if native_fps > 0: local_fps = native_fps else: - logger.warning( - "Native FPS not available, defaulting to specified FPS" - ) + logger.warning("Native FPS not available, defaulting to specified FPS") frame_interval: float = 1.0 / local_fps frame_time: float = time.monotonic() @@ -187,8 +186,7 @@ def emit_frames(observer, scheduler): if not ret: # Loop video when we reach the end - logger.warning( - "End of video reached, restarting playback") + logger.warning("End of video reached, restarting playback") with self.lock: self.cap.set(cv2.CAP_PROP_POS_FRAMES, 0) continue @@ -209,8 +207,7 @@ def emit_frames(observer, scheduler): observer.on_error(e) except Exception as e: logger.error(f"Unexpected error during frame emission: {e}") - observer.on_error( - VideoFrameError(f"Frame acquisition failed: {e}")) + observer.on_error(VideoFrameError(f"Frame acquisition failed: {e}")) finally: # Clean up resources regardless of success or failure with self.lock: diff --git a/dimos/stream/video_providers/unitree.py b/dimos/stream/video_providers/unitree.py index fefbf669f3..e1a7587146 100644 --- a/dimos/stream/video_providers/unitree.py +++ b/dimos/stream/video_providers/unitree.py @@ -15,8 +15,7 @@ from dimos.stream.video_provider import AbstractVideoProvider from queue import Queue -from dimos.robot.unitree.external.go2_webrtc_connect.go2_webrtc_driver.constants import RTC_TOPIC, SPORT_CMD, WebRTCConnectionMethod -from dimos.robot.unitree.external.go2_webrtc_connect.go2_webrtc_driver.webrtc_driver import Go2WebRTCConnection +from go2_webrtc_driver.webrtc_driver import Go2WebRTCConnection, WebRTCConnectionMethod from aiortc import MediaStreamTrack import asyncio from reactivex import Observable, create, operators as ops @@ -24,10 +23,17 @@ import threading import time + class UnitreeVideoProvider(AbstractVideoProvider): - def __init__(self, dev_name: str = "UnitreeGo2", connection_method: WebRTCConnectionMethod = WebRTCConnectionMethod.LocalSTA, serial_number: str = None, ip: str = None): + def __init__( + self, + dev_name: str = "UnitreeGo2", + connection_method: WebRTCConnectionMethod = WebRTCConnectionMethod.LocalSTA, + serial_number: str = None, + ip: str = None, + ): """Initialize the Unitree video stream with WebRTC connection. - + Args: dev_name: Name of the device connection_method: WebRTC connection method (LocalSTA, LocalAP, Remote) @@ -38,7 +44,7 @@ def __init__(self, dev_name: str = "UnitreeGo2", connection_method: WebRTCConnec self.frame_queue = Queue() self.loop = None self.asyncio_thread = None - + # Initialize WebRTC connection based on method if connection_method == WebRTCConnectionMethod.LocalSTA: if serial_number: @@ -46,7 +52,9 @@ def __init__(self, dev_name: str = "UnitreeGo2", connection_method: WebRTCConnec elif ip: self.conn = Go2WebRTCConnection(connection_method, ip=ip) else: - raise ValueError("Either serial_number or ip must be provided for LocalSTA connection") + raise ValueError( + "Either serial_number or ip must be provided for LocalSTA connection" + ) elif connection_method == WebRTCConnectionMethod.LocalAP: self.conn = Go2WebRTCConnection(connection_method) else: @@ -63,7 +71,7 @@ async def _recv_camera_stream(self, track: MediaStreamTrack): def _run_asyncio_loop(self, loop): """Run the asyncio event loop in a separate thread.""" asyncio.set_event_loop(loop) - + async def setup(): try: await self.conn.connect() @@ -78,17 +86,17 @@ async def setup(): # await self.conn.datachannel.sendDamp() # await asyncio.sleep(5) # await self.conn.datachannel.sendStandUp() - # await asyncio.sleep(5) + # await asyncio.sleep(5) # Wiggle the robot # await self.conn.datachannel.switchToNormalMode() # await self.conn.datachannel.sendWiggle() - #await asyncio.sleep(3) + # await asyncio.sleep(3) # Stretch the robot # await self.conn.datachannel.sendStretch() # await asyncio.sleep(3) - + except Exception as e: logging.error(f"Error in WebRTC connection: {e}") raise @@ -98,10 +106,10 @@ async def setup(): def capture_video_as_observable(self, fps: int = 30) -> Observable: """Create an observable that emits video frames at the specified FPS. - + Args: fps: Frames per second to emit (default: 30) - + Returns: Observable emitting video frames """ @@ -113,25 +121,24 @@ def emit_frames(observer, scheduler): if not self.loop: self.loop = asyncio.new_event_loop() self.asyncio_thread = threading.Thread( - target=self._run_asyncio_loop, - args=(self.loop,) + target=self._run_asyncio_loop, args=(self.loop,) ) self.asyncio_thread.start() frame_time = time.monotonic() - + while True: if not self.frame_queue.empty(): frame = self.frame_queue.get() - + # Control frame rate now = time.monotonic() next_frame_time = frame_time + frame_interval sleep_time = next_frame_time - now - + if sleep_time > 0: time.sleep(sleep_time) - + observer.on_next(frame) frame_time = next_frame_time else: diff --git a/dimos/stream/videostream.py b/dimos/stream/videostream.py index e2262120fb..ee63261ae6 100644 --- a/dimos/stream/videostream.py +++ b/dimos/stream/videostream.py @@ -14,11 +14,12 @@ import cv2 + class VideoStream: def __init__(self, source=0): """ Initialize the video stream from a camera source. - + Args: source (int or str): Camera index or video file path. """ diff --git a/dimos/types/constants.py b/dimos/types/constants.py index ec8dbb0a4e..b1044a8c34 100644 --- a/dimos/types/constants.py +++ b/dimos/types/constants.py @@ -1,4 +1,3 @@ - class Colors: GREEN_PRINT_COLOR: str = "\033[32m" YELLOW_PRINT_COLOR: str = "\033[33m" diff --git a/dimos/types/costmap.py b/dimos/types/costmap.py index de80b2d6a6..177733ff03 100644 --- a/dimos/types/costmap.py +++ b/dimos/types/costmap.py @@ -124,7 +124,9 @@ def from_pickle(cls, pickle_path: str) -> "Costmap": return costmap @classmethod - def create_empty(cls, width: int = 100, height: int = 100, resolution: float = 0.1) -> "Costmap": + def create_empty( + cls, width: int = 100, height: int = 100, resolution: float = 0.1 + ) -> "Costmap": """Create an empty costmap with specified dimensions.""" return cls( grid=np.zeros((height, width), dtype=np.int8), @@ -241,7 +243,9 @@ def smudge( for i in range(iterations): # Dilate the binary map - dilated = ndimage.binary_dilation(dilated_map > 0, structure=kernel, iterations=1).astype(np.uint8) + dilated = ndimage.binary_dilation( + dilated_map > 0, structure=kernel, iterations=1 + ).astype(np.uint8) # Calculate the new layer (cells that were just added in this iteration) new_layer = (dilated - (dilated_map > 0).astype(np.uint8)) * 100 @@ -321,6 +325,8 @@ def __str__(self) -> str: print(costmap) # Create a smudged version of the costmap for better planning - smudged_costmap = costmap.smudge(kernel_size=10, iterations=10, threshold=80, preserve_unknown=False) + smudged_costmap = costmap.smudge( + kernel_size=10, iterations=10, threshold=80, preserve_unknown=False + ) print(costmap) diff --git a/dimos/types/depth_map.py b/dimos/types/depth_map.py index 5f7e003933..a076f6dd6b 100644 --- a/dimos/types/depth_map.py +++ b/dimos/types/depth_map.py @@ -15,6 +15,7 @@ from typing import Any import numpy as np + class DepthMapType: def __init__(self, depth_data: np.ndarray, metadata: Any = None): """ @@ -35,4 +36,4 @@ def normalize(self): def save_to_file(self, filepath: str): """Save the depth map to a file.""" - np.save(filepath, self.depth_data) \ No newline at end of file + np.save(filepath, self.depth_data) diff --git a/dimos/types/label.py b/dimos/types/label.py index 1a5acd8324..ce037aed7a 100644 --- a/dimos/types/label.py +++ b/dimos/types/label.py @@ -14,6 +14,7 @@ from typing import Dict, Any + class LabelType: def __init__(self, labels: Dict[str, Any], metadata: Any = None): """ @@ -24,14 +25,15 @@ def __init__(self, labels: Dict[str, Any], metadata: Any = None): metadata (Any, optional): Additional metadata related to the labels. """ self.labels = labels - self.metadata = metadata + self.metadata = metadata def get_label_descriptions(self): """Return a list of label descriptions.""" - return [desc['description'] for desc in self.labels.values()] + return [desc["description"] for desc in self.labels.values()] def save_to_json(self, filepath: str): """Save the labels to a JSON file.""" import json - with open(filepath, 'w') as f: - json.dump(self.labels, f, indent=4) \ No newline at end of file + + with open(filepath, "w") as f: + json.dump(self.labels, f, indent=4) diff --git a/dimos/types/path.py b/dimos/types/path.py index 2e20924f4d..c87658182f 100644 --- a/dimos/types/path.py +++ b/dimos/types/path.py @@ -134,7 +134,9 @@ def remove(self, index: int) -> np.ndarray: def clear(self) -> None: """Remove all points from the path.""" - self._points = np.zeros((0, self._points.shape[1] if len(self._points) > 0 else 0), dtype=float) + self._points = np.zeros( + (0, self._points.shape[1] if len(self._points) > 0 else 0), dtype=float + ) def length(self) -> float: """Calculate the total length of the path. diff --git a/dimos/types/pointcloud.py b/dimos/types/pointcloud.py index 7fbdaa0203..55c1aebc4a 100644 --- a/dimos/types/pointcloud.py +++ b/dimos/types/pointcloud.py @@ -15,6 +15,7 @@ import open3d as o3d from typing import Any + class PointCloudType: def __init__(self, point_cloud: o3d.geometry.PointCloud, metadata: Any = None): """ @@ -25,7 +26,7 @@ def __init__(self, point_cloud: o3d.geometry.PointCloud, metadata: Any = None): metadata (Any, optional): Additional metadata related to the point cloud. """ self.point_cloud = point_cloud - self.metadata = metadata + self.metadata = metadata def downsample(self, voxel_size: float): """Downsample the point cloud using a voxel grid filter.""" @@ -33,4 +34,4 @@ def downsample(self, voxel_size: float): def save_to_file(self, filepath: str): """Save the point cloud to a file.""" - o3d.io.write_point_cloud(filepath, self.point_cloud) \ No newline at end of file + o3d.io.write_point_cloud(filepath, self.point_cloud) diff --git a/dimos/types/position.py b/dimos/types/position.py index d32820b92c..37515d3990 100644 --- a/dimos/types/position.py +++ b/dimos/types/position.py @@ -1,14 +1,126 @@ -from dataclasses import dataclass -from dimos.types.vector import Vector +# 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 typing import TypeVar, Union, Sequence +import numpy as np +from plum import dispatch -@dataclass -class Position: - pos: Vector - rot: Vector +from dimos.types.vector import Vector, to_vector, to_numpy, VectorLike + + +T = TypeVar("T", bound="Position") + +PositionLike = Union["Position", VectorLike, Sequence[VectorLike]] + + +class Position(Vector): + """A position in 3D space, consisting of a position vector and a rotation vector. + + Position inherits from Vector and behaves like a vector for the position component. + The rotation vector is stored separately and can be accessed via the rot property. + """ + + _rot: Vector = None + + @dispatch + def __init__(self, pos: VectorLike): + self._data = to_numpy(pos) + self._rot = None + + @dispatch + def __init__(self, pos: VectorLike, rot: VectorLike): + self._data = to_numpy(pos) + self._rot = to_vector(rot) def __repr__(self) -> str: - return f"pos({self.pos}), rot({self.rot})" + return f"Position({self.pos.__repr__()}, {self.rot.__repr__()})" def __str__(self) -> str: return self.__repr__() + + def is_zero(self) -> bool: + return super().is_zero() and self.rot.is_zero() + + def __bool__(self) -> bool: + return not self.is_zero() + + def serialize(self): + """Serialize the position to a dictionary.""" + return {"type": "position", "pos": self.to_list(), "rot": self.rot.to_list()} + + def __eq__(self, other) -> bool: + """Check if two positions are equal using numpy's allclose for floating point comparison.""" + if not isinstance(other, Position): + return False + return np.allclose(self.pos._data, other.pos._data) and np.allclose( + self.rot._data, other.rot._data + ) + + @property + def rot(self) -> Vector: + if self._rot: + return self._rot + else: + return Vector(0, 0, 0) + + @property + def pos(self) -> Vector: + """Get the position vector (self).""" + return to_vector(self._data) + + def __add__(self: T, other) -> T: + """Override Vector's __add__ to handle Position objects specially. + + When adding two Position objects, both position and rotation components are added. + """ + if isinstance(other, Position): + # Add both position and rotation components + result = super().__add__(other) + result._rot = self.rot + other.rot + return result + else: + # For other types, just use Vector's addition + return Position(super().__add__(other), self.rot) + + def __sub__(self: T, other) -> T: + """Override Vector's __sub__ to handle Position objects specially. + + When subtracting two Position objects, both position and rotation components are subtracted. + """ + if isinstance(other, Position): + # Subtract both position and rotation components + result = super().__sub__(other) + result._rot = self.rot - other.rot + return result + else: + # For other types, just use Vector's subtraction + return super().__sub__(other) + + def __mul__(self: T, scalar: float) -> T: + return Position(self.pos * scalar, self.rot) + + +@dispatch +def to_position(pos: Position) -> Position: + return pos + + +@dispatch +def to_position(pos: VectorLike) -> Position: + return Position(pos) + + +@dispatch +def to_position(pos: Sequence[VectorLike]) -> Position: + return Position(*pos) diff --git a/dimos/types/robot_location.py b/dimos/types/robot_location.py index 6a7796193c..c69d131a04 100644 --- a/dimos/types/robot_location.py +++ b/dimos/types/robot_location.py @@ -21,14 +21,15 @@ import time import uuid + @dataclass class RobotLocation: """ Represents a named location in the robot's spatial memory. - + This class stores the position, rotation, and descriptive metadata for locations that the robot can remember and navigate to. - + Attributes: name: Human-readable name of the location (e.g., "kitchen", "office") position: 3D position coordinates (x, y, z) @@ -38,6 +39,7 @@ class RobotLocation: location_id: Unique identifier for this location metadata: Additional metadata for the location """ + name: str position: Tuple[float, float, float] rotation: Tuple[float, float, float] @@ -45,7 +47,7 @@ class RobotLocation: timestamp: float = field(default_factory=time.time) location_id: str = field(default_factory=lambda: f"loc_{uuid.uuid4().hex[:8]}") metadata: Dict[str, Any] = field(default_factory=dict) - + def __post_init__(self): """Validate and normalize the position and rotation tuples.""" # Ensure position is a tuple of 3 floats @@ -53,17 +55,17 @@ def __post_init__(self): self.position = (self.position[0], self.position[1], 0.0) else: self.position = tuple(float(x) for x in self.position) - + # Ensure rotation is a tuple of 3 floats if len(self.rotation) == 1: self.rotation = (0.0, 0.0, self.rotation[0]) else: self.rotation = tuple(float(x) for x in self.rotation) - + def to_vector_metadata(self) -> Dict[str, Any]: """ Convert the location to metadata format for storing in a vector database. - + Returns: Dictionary with metadata fields compatible with vector DB storage """ @@ -78,17 +80,17 @@ def to_vector_metadata(self) -> Dict[str, Any]: "location_id": self.location_id, "frame_id": self.frame_id, "location_name": self.name, - "description": self.name # Makes it searchable by text + "description": self.name, # Makes it searchable by text } - + @classmethod - def from_vector_metadata(cls, metadata: Dict[str, Any]) -> 'RobotLocation': + def from_vector_metadata(cls, metadata: Dict[str, Any]) -> "RobotLocation": """ Create a RobotLocation object from vector database metadata. - + Args: metadata: Dictionary with metadata from vector database - + Returns: RobotLocation object """ @@ -97,18 +99,32 @@ def from_vector_metadata(cls, metadata: Dict[str, Any]) -> 'RobotLocation': position=( metadata.get("pos_x", 0.0), metadata.get("pos_y", 0.0), - metadata.get("pos_z", 0.0) + metadata.get("pos_z", 0.0), ), rotation=( metadata.get("rot_x", 0.0), metadata.get("rot_y", 0.0), - metadata.get("rot_z", 0.0) + metadata.get("rot_z", 0.0), ), frame_id=metadata.get("frame_id"), timestamp=metadata.get("timestamp", time.time()), location_id=metadata.get("location_id", f"loc_{uuid.uuid4().hex[:8]}"), - metadata={k: v for k, v in metadata.items() if k not in [ - "pos_x", "pos_y", "pos_z", "rot_x", "rot_y", "rot_z", - "timestamp", "location_id", "frame_id", "location_name", "description" - ]} + metadata={ + k: v + for k, v in metadata.items() + if k + not in [ + "pos_x", + "pos_y", + "pos_z", + "rot_x", + "rot_y", + "rot_z", + "timestamp", + "location_id", + "frame_id", + "location_name", + "description", + ] + }, ) diff --git a/dimos/types/sample.py b/dimos/types/sample.py index d21ae240c6..5665f7a640 100644 --- a/dimos/types/sample.py +++ b/dimos/types/sample.py @@ -196,7 +196,9 @@ def flatten_recursive(obj, path=""): flatten_recursive(self) accumulator = accumulator.values() if output_type == "dict" else accumulator - if non_numerical == "forbid" and any(not isinstance(v, int | float | bool) for v in accumulator): + if non_numerical == "forbid" and any( + not isinstance(v, int | float | bool) for v in accumulator + ): raise ValueError("Non-numerical values found in flattened data.") if output_type == "np": return np.array(accumulator) @@ -216,7 +218,10 @@ def obj_to_schema(value: Any) -> Dict: dict: A simplified JSON schema representing the structure of the dictionary. """ if isinstance(value, dict): - return {"type": "object", "properties": {k: Sample.obj_to_schema(v) for k, v in value.items()}} + return { + "type": "object", + "properties": {k: Sample.obj_to_schema(v) for k, v in value.items()}, + } if isinstance(value, list | tuple | np.ndarray): if len(value) > 0: return {"type": "array", "items": Sample.obj_to_schema(value[0])} @@ -260,7 +265,9 @@ def schema(self, resolve_refs: bool = True, include_descriptions=False) -> Dict: if key not in properties: properties[key] = Sample.obj_to_schema(value) if isinstance(value, Sample): - properties[key] = value.schema(resolve_refs=resolve_refs, include_descriptions=include_descriptions) + properties[key] = value.schema( + resolve_refs=resolve_refs, include_descriptions=include_descriptions + ) else: properties[key] = Sample.obj_to_schema(value) return schema @@ -497,7 +504,9 @@ def unpack(self, to_dicts=False) -> List[Union["Sample", Dict]]: return [] # Ensure all attributes are lists and have the same length - list_sizes = {len(getattr(self, attr)) for attr in attributes if isinstance(getattr(self, attr), list)} + list_sizes = { + len(getattr(self, attr)) for attr in attributes if isinstance(getattr(self, attr), list) + } if len(list_sizes) != 1: raise ValueError("Not all attribute lists have the same length.") list_size = list_sizes.pop() @@ -505,7 +514,10 @@ def unpack(self, to_dicts=False) -> List[Union["Sample", Dict]]: if to_dicts: return [{key: getattr(self, key)[i] for key in attributes} for i in range(list_size)] - return [self.__class__(**{key: getattr(self, key)[i] for key in attributes}) for i in range(list_size)] + return [ + self.__class__(**{key: getattr(self, key)[i] for key in attributes}) + for i in range(list_size) + ] @classmethod def default_space(cls) -> spaces.Dict: @@ -543,7 +555,9 @@ def space(self) -> spaces.Dict: logging.debug("Generating space for key: '%s', value: %s", key, value) info = self.model_field_info(key) value = getattr(self, key) if hasattr(self, key) else value # noqa: PLW2901 - space_dict[key] = value.space() if isinstance(value, Sample) else self.space_for(value, info=info) + space_dict[key] = ( + value.space() if isinstance(value, Sample) else self.space_for(value, info=info) + ) return spaces.Dict(space_dict) def random_sample(self) -> "Sample": @@ -555,4 +569,4 @@ def random_sample(self) -> "Sample": if __name__ == "__main__": - sample = Sample(x=1, y=2, z={"a": 3, "b": 4}, extra_field=5) \ No newline at end of file + sample = Sample(x=1, y=2, z={"a": 3, "b": 4}, extra_field=5) diff --git a/dimos/types/segmentation.py b/dimos/types/segmentation.py index 4b2c53f3a4..5995f302f9 100644 --- a/dimos/types/segmentation.py +++ b/dimos/types/segmentation.py @@ -15,6 +15,7 @@ from typing import List, Any import numpy as np + class SegmentationType: def __init__(self, masks: List[np.ndarray], metadata: Any = None): """ @@ -25,7 +26,7 @@ def __init__(self, masks: List[np.ndarray], metadata: Any = None): metadata (Any, optional): Additional metadata related to the segmentations. """ self.masks = masks - self.metadata = metadata + self.metadata = metadata def combine_masks(self): """Combine all masks into a single mask.""" @@ -37,6 +38,7 @@ def combine_masks(self): def save_masks(self, directory: str): """Save each mask to a separate file.""" import os + os.makedirs(directory, exist_ok=True) for i, mask in enumerate(self.masks): - np.save(os.path.join(directory, f"mask_{i}.npy"), mask) \ No newline at end of file + np.save(os.path.join(directory, f"mask_{i}.npy"), mask) diff --git a/dimos/types/test_position.py b/dimos/types/test_position.py new file mode 100644 index 0000000000..c2dec9bf5f --- /dev/null +++ b/dimos/types/test_position.py @@ -0,0 +1,317 @@ +# 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 numpy as np + +from dimos.types.position import Position, to_position +from dimos.types.vector import Vector + + +def test_position_default_init(): + """Test that default initialization of Position() has zero vectors for pos and rot.""" + position = Position() + + # Check that pos is a zero vector + assert isinstance(position.pos, Vector) + assert position.pos.is_zero() + assert position.pos.x == 0.0 + assert position.pos.y == 0.0 + assert position.pos.z == 0.0 + + # Check that rot is a zero vector + assert isinstance(position.rot, Vector) + assert position.rot.is_zero() + assert position.rot.x == 0.0 + assert position.rot.y == 0.0 + assert position.rot.z == 0.0 + + assert position.is_zero() + + assert not position + + +def test_position_vector_init(): + """Test initialization with custom vectors.""" + pos = Vector(1.0, 2.0, 3.0) + rot = Vector(4.0, 5.0, 6.0) + + position = Position(pos, rot) + + # Check pos vector + assert position.pos == pos + assert position.pos.x == 1.0 + assert position.pos.y == 2.0 + assert position.pos.z == 3.0 + + # Check rot vector + assert position.rot == rot + assert position.rot.x == 4.0 + assert position.rot.y == 5.0 + assert position.rot.z == 6.0 + + # even if pos has the same xyz as pos vector + # it shouldn't accept equality comparisons + # as both are not the same type + assert not position == pos + + +def test_position_partial_init(): + """Test initialization with only one custom vector.""" + pos = Vector(1.0, 2.0, 3.0) + assert pos + + # Only specify pos + position1 = Position(pos) + assert position1.pos == pos + assert position1.pos.x == 1.0 + assert position1.pos.y == 2.0 + assert position1.pos.z == 3.0 + assert not position1.pos.is_zero() + + assert isinstance(position1.rot, Vector) + assert position1.rot.is_zero() + assert position1.rot.x == 0.0 + assert position1.rot.y == 0.0 + assert position1.rot.z == 0.0 + + +def test_position_equality(): + """Test equality comparison between positions.""" + pos1 = Position(Vector(1.0, 2.0, 3.0), Vector(4.0, 5.0, 6.0)) + pos2 = Position(Vector(1.0, 2.0, 3.0), Vector(4.0, 5.0, 6.0)) + pos3 = Position(Vector(1.0, 2.0, 3.0), Vector(7.0, 8.0, 9.0)) + pos4 = Position(Vector(7.0, 8.0, 9.0), Vector(4.0, 5.0, 6.0)) + + # Same pos and rot values should be equal + assert pos1 == pos2 + + # Different rot values should not be equal + assert pos1 != pos3 + + # Different pos values should not be equal + assert pos1 != pos4 + + # Position should not equal a vector even if values match + assert pos1 != Vector(1.0, 2.0, 3.0) + + +def test_position_vector_operations(): + """Test that Position inherits Vector operations.""" + pos1 = Position(Vector(1.0, 2.0, 3.0), Vector(4.0, 5.0, 6.0)) + pos2 = Position(Vector(2.0, 3.0, 4.0), Vector(7.0, 8.0, 9.0)) + + # Addition should work on both position and rotation components + sum_pos = pos1 + pos2 + assert isinstance(sum_pos, Position) + assert sum_pos.x == 3.0 + assert sum_pos.y == 5.0 + assert sum_pos.z == 7.0 + # Rotation should be added as well + assert sum_pos.rot.x == 11.0 # 4.0 + 7.0 + assert sum_pos.rot.y == 13.0 # 5.0 + 8.0 + assert sum_pos.rot.z == 15.0 # 6.0 + 9.0 + + # Subtraction should work on both position and rotation components + diff_pos = pos2 - pos1 + assert isinstance(diff_pos, Position) + assert diff_pos.x == 1.0 + assert diff_pos.y == 1.0 + assert diff_pos.z == 1.0 + # Rotation should be subtracted as well + assert diff_pos.rot.x == 3.0 # 7.0 - 4.0 + assert diff_pos.rot.y == 3.0 # 8.0 - 5.0 + assert diff_pos.rot.z == 3.0 # 9.0 - 6.0 + + # Scalar multiplication + scaled_pos = pos1 * 2.0 + assert isinstance(scaled_pos, Position) + assert scaled_pos.x == 2.0 + assert scaled_pos.y == 4.0 + assert scaled_pos.z == 6.0 + assert scaled_pos.rot == pos1.rot # Rotation not affected by scalar multiplication + + # Adding a Vector to a Position (only affects position component) + vec = Vector(5.0, 6.0, 7.0) + pos_plus_vec = pos1 + vec + assert isinstance(pos_plus_vec, Position) + assert pos_plus_vec.x == 6.0 + assert pos_plus_vec.y == 8.0 + assert pos_plus_vec.z == 10.0 + assert pos_plus_vec.rot == pos1.rot # Rotation unchanged + + +def test_position_serialization(): + """Test position serialization.""" + pos = Position(Vector(1.0, 2.0, 3.0), Vector(4.0, 5.0, 6.0)) + serialized = pos.serialize() + + assert serialized["type"] == "position" + assert serialized["pos"] == [1.0, 2.0, 3.0] + assert serialized["rot"] == [4.0, 5.0, 6.0] + + +def test_position_initialization_with_arrays(): + """Test initialization with numpy arrays, lists and tuples.""" + # Test with numpy arrays + np_pos = np.array([1.0, 2.0, 3.0]) + np_rot = np.array([4.0, 5.0, 6.0]) + + pos1 = Position(np_pos, np_rot) + + assert pos1.x == 1.0 + assert pos1.y == 2.0 + assert pos1.z == 3.0 + assert pos1.rot.x == 4.0 + assert pos1.rot.y == 5.0 + assert pos1.rot.z == 6.0 + + # Test with lists + list_pos = [7.0, 8.0, 9.0] + list_rot = [10.0, 11.0, 12.0] + pos2 = Position(list_pos, list_rot) + + assert pos2.x == 7.0 + assert pos2.y == 8.0 + assert pos2.z == 9.0 + assert pos2.rot.x == 10.0 + assert pos2.rot.y == 11.0 + assert pos2.rot.z == 12.0 + + # Test with tuples + tuple_pos = (13.0, 14.0, 15.0) + tuple_rot = (16.0, 17.0, 18.0) + pos3 = Position(tuple_pos, tuple_rot) + + assert pos3.x == 13.0 + assert pos3.y == 14.0 + assert pos3.z == 15.0 + assert pos3.rot.x == 16.0 + assert pos3.rot.y == 17.0 + assert pos3.rot.z == 18.0 + + +def test_to_position_with_position(): + """Test to_position with Position input.""" + # Create a position + original_pos = Position(Vector(1.0, 2.0, 3.0), Vector(4.0, 5.0, 6.0)) + + # Convert using to_position + converted_pos = to_position(original_pos) + + # Should return the exact same object + assert converted_pos is original_pos + assert converted_pos == original_pos + + # Check values + assert converted_pos.x == 1.0 + assert converted_pos.y == 2.0 + assert converted_pos.z == 3.0 + assert converted_pos.rot.x == 4.0 + assert converted_pos.rot.y == 5.0 + assert converted_pos.rot.z == 6.0 + + +def test_to_position_with_vector(): + """Test to_position with Vector input.""" + # Create a vector + vec = Vector(1.0, 2.0, 3.0) + + # Convert using to_position + pos = to_position(vec) + + # Should return a Position with the vector as position and zero rotation + assert isinstance(pos, Position) + assert pos.pos == vec + assert pos.x == 1.0 + assert pos.y == 2.0 + assert pos.z == 3.0 + + # Rotation should be zero + assert isinstance(pos.rot, Vector) + assert pos.rot.is_zero() + assert pos.rot.x == 0.0 + assert pos.rot.y == 0.0 + assert pos.rot.z == 0.0 + + +def test_to_position_with_vectorlike(): + """Test to_position with VectorLike inputs (arrays, lists, tuples).""" + # Test with numpy arrays + np_arr = np.array([1.0, 2.0, 3.0]) + pos1 = to_position(np_arr) + + assert isinstance(pos1, Position) + assert pos1.x == 1.0 + assert pos1.y == 2.0 + assert pos1.z == 3.0 + assert pos1.rot.is_zero() + + # Test with lists + list_val = [4.0, 5.0, 6.0] + pos2 = to_position(list_val) + + assert isinstance(pos2, Position) + assert pos2.x == 4.0 + assert pos2.y == 5.0 + assert pos2.z == 6.0 + assert pos2.rot.is_zero() + + # Test with tuples + tuple_val = (7.0, 8.0, 9.0) + pos3 = to_position(tuple_val) + + assert isinstance(pos3, Position) + assert pos3.x == 7.0 + assert pos3.y == 8.0 + assert pos3.z == 9.0 + assert pos3.rot.is_zero() + + +def test_to_position_with_sequence(): + """Test to_position with Sequence of VectorLike inputs.""" + # Test with sequence of two vectors + pos_vec = Vector(1.0, 2.0, 3.0) + rot_vec = Vector(4.0, 5.0, 6.0) + pos1 = to_position([pos_vec, rot_vec]) + + assert isinstance(pos1, Position) + assert pos1.pos == pos_vec + assert pos1.rot == rot_vec + assert pos1.x == 1.0 + assert pos1.y == 2.0 + assert pos1.z == 3.0 + assert pos1.rot.x == 4.0 + assert pos1.rot.y == 5.0 + assert pos1.rot.z == 6.0 + + # Test with sequence of lists + pos2 = to_position([[7.0, 8.0, 9.0], [10.0, 11.0, 12.0]]) + + assert isinstance(pos2, Position) + assert pos2.x == 7.0 + assert pos2.y == 8.0 + assert pos2.z == 9.0 + assert pos2.rot.x == 10.0 + assert pos2.rot.y == 11.0 + assert pos2.rot.z == 12.0 + + # Test with mixed sequence (tuple and numpy array) + pos3 = to_position([(13.0, 14.0, 15.0), np.array([16.0, 17.0, 18.0])]) + + assert isinstance(pos3, Position) + assert pos3.x == 13.0 + assert pos3.y == 14.0 + assert pos3.z == 15.0 + assert pos3.rot.x == 16.0 + assert pos3.rot.y == 17.0 + assert pos3.rot.z == 18.0 diff --git a/dimos/types/test_vector.py b/dimos/types/test_vector.py new file mode 100644 index 0000000000..b448620145 --- /dev/null +++ b/dimos/types/test_vector.py @@ -0,0 +1,353 @@ +# 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 numpy as np +import pytest + +from dimos.types.vector import Vector + + +def test_vector_default_init(): + """Test that default initialization of Vector() has x,y,z components all zero.""" + v = Vector() + assert v.x == 0.0 + assert v.y == 0.0 + assert v.z == 0.0 + assert v.dim == 0 + assert len(v.data) == 0 + assert v.to_list() == [] + assert v.is_zero() == True # Empty vector should be considered zero + + +def test_vector_specific_init(): + """Test initialization with specific values.""" + # 2D vector + v1 = Vector(1.0, 2.0) + assert v1.x == 1.0 + assert v1.y == 2.0 + assert v1.z == 0.0 + assert v1.dim == 2 + + # 3D vector + v2 = Vector(3.0, 4.0, 5.0) + assert v2.x == 3.0 + assert v2.y == 4.0 + assert v2.z == 5.0 + assert v2.dim == 3 + + # From list + v3 = Vector([6.0, 7.0, 8.0]) + assert v3.x == 6.0 + assert v3.y == 7.0 + assert v3.z == 8.0 + assert v3.dim == 3 + + # From numpy array + v4 = Vector(np.array([9.0, 10.0, 11.0])) + assert v4.x == 9.0 + assert v4.y == 10.0 + assert v4.z == 11.0 + assert v4.dim == 3 + + +def test_vector_addition(): + """Test vector addition.""" + v1 = Vector(1.0, 2.0, 3.0) + v2 = Vector(4.0, 5.0, 6.0) + + v_add = v1 + v2 + assert v_add.x == 5.0 + assert v_add.y == 7.0 + assert v_add.z == 9.0 + + +def test_vector_subtraction(): + """Test vector subtraction.""" + v1 = Vector(1.0, 2.0, 3.0) + v2 = Vector(4.0, 5.0, 6.0) + + v_sub = v2 - v1 + assert v_sub.x == 3.0 + assert v_sub.y == 3.0 + assert v_sub.z == 3.0 + + +def test_vector_scalar_multiplication(): + """Test vector multiplication by a scalar.""" + v1 = Vector(1.0, 2.0, 3.0) + + v_mul = v1 * 2.0 + assert v_mul.x == 2.0 + assert v_mul.y == 4.0 + assert v_mul.z == 6.0 + + # Test right multiplication + v_rmul = 2.0 * v1 + assert v_rmul.x == 2.0 + assert v_rmul.y == 4.0 + assert v_rmul.z == 6.0 + + +def test_vector_scalar_division(): + """Test vector division by a scalar.""" + v2 = Vector(4.0, 5.0, 6.0) + + v_div = v2 / 2.0 + assert v_div.x == 2.0 + assert v_div.y == 2.5 + assert v_div.z == 3.0 + + +def test_vector_dot_product(): + """Test vector dot product.""" + v1 = Vector(1.0, 2.0, 3.0) + v2 = Vector(4.0, 5.0, 6.0) + + dot = v1.dot(v2) + assert dot == 32.0 + + +def test_vector_length(): + """Test vector length calculation.""" + # 2D vector with length 5 + v1 = Vector(3.0, 4.0) + assert v1.length() == 5.0 + + # 3D vector + v2 = Vector(2.0, 3.0, 6.0) + assert v2.length() == pytest.approx(7.0, 0.001) + + # Test length_squared + assert v1.length_squared() == 25.0 + assert v2.length_squared() == 49.0 + + +def test_vector_normalize(): + """Test vector normalization.""" + v = Vector(2.0, 3.0, 6.0) + assert v.is_zero() == False + + v_norm = v.normalize() + length = v.length() + expected_x = 2.0 / length + expected_y = 3.0 / length + expected_z = 6.0 / length + + assert np.isclose(v_norm.x, expected_x) + assert np.isclose(v_norm.y, expected_y) + assert np.isclose(v_norm.z, expected_z) + assert np.isclose(v_norm.length(), 1.0) + assert v_norm.is_zero() == False + + # Test normalizing a zero vector + v_zero = Vector(0.0, 0.0, 0.0) + assert v_zero.is_zero() == True + v_zero_norm = v_zero.normalize() + assert v_zero_norm.x == 0.0 + assert v_zero_norm.y == 0.0 + assert v_zero_norm.z == 0.0 + assert v_zero_norm.is_zero() == True + + +def test_vector_to_2d(): + """Test conversion to 2D vector.""" + v = Vector(2.0, 3.0, 6.0) + + v_2d = v.to_2d() + assert v_2d.x == 2.0 + assert v_2d.y == 3.0 + assert v_2d.z == 0.0 + assert v_2d.dim == 2 + + # Already 2D vector + v2 = Vector(4.0, 5.0) + v2_2d = v2.to_2d() + assert v2_2d.x == 4.0 + assert v2_2d.y == 5.0 + assert v2_2d.dim == 2 + + +def test_vector_distance(): + """Test distance calculations between vectors.""" + v1 = Vector(1.0, 2.0, 3.0) + v2 = Vector(4.0, 6.0, 8.0) + + # Distance + dist = v1.distance(v2) + expected_dist = np.sqrt(9.0 + 16.0 + 25.0) # sqrt((4-1)² + (6-2)² + (8-3)²) + assert dist == pytest.approx(expected_dist) + + # Distance squared + dist_sq = v1.distance_squared(v2) + assert dist_sq == 50.0 # 9 + 16 + 25 + + +def test_vector_cross_product(): + """Test vector cross product.""" + v1 = Vector(1.0, 0.0, 0.0) # Unit x vector + v2 = Vector(0.0, 1.0, 0.0) # Unit y vector + + # v1 × v2 should be unit z vector + cross = v1.cross(v2) + assert cross.x == 0.0 + assert cross.y == 0.0 + assert cross.z == 1.0 + + # Test with more complex vectors + a = Vector(2.0, 3.0, 4.0) + b = Vector(5.0, 6.0, 7.0) + c = a.cross(b) + + # Cross product manually calculated: + # (3*7-4*6, 4*5-2*7, 2*6-3*5) + assert c.x == -3.0 + assert c.y == 6.0 + assert c.z == -3.0 + + # Test with 2D vectors (should raise error) + v_2d = Vector(1.0, 2.0) + with pytest.raises(ValueError): + v_2d.cross(v2) + + +def test_vector_zeros(): + """Test Vector.zeros class method.""" + # 3D zero vector + v_zeros = Vector.zeros(3) + assert v_zeros.x == 0.0 + assert v_zeros.y == 0.0 + assert v_zeros.z == 0.0 + assert v_zeros.dim == 3 + assert v_zeros.is_zero() == True + + # 2D zero vector + v_zeros_2d = Vector.zeros(2) + assert v_zeros_2d.x == 0.0 + assert v_zeros_2d.y == 0.0 + assert v_zeros_2d.z == 0.0 + assert v_zeros_2d.dim == 2 + assert v_zeros_2d.is_zero() == True + + +def test_vector_ones(): + """Test Vector.ones class method.""" + # 3D ones vector + v_ones = Vector.ones(3) + assert v_ones.x == 1.0 + assert v_ones.y == 1.0 + assert v_ones.z == 1.0 + assert v_ones.dim == 3 + + # 2D ones vector + v_ones_2d = Vector.ones(2) + assert v_ones_2d.x == 1.0 + assert v_ones_2d.y == 1.0 + assert v_ones_2d.z == 0.0 + assert v_ones_2d.dim == 2 + + +def test_vector_conversion_methods(): + """Test vector conversion methods (to_list, to_tuple, to_numpy).""" + v = Vector(1.0, 2.0, 3.0) + + # to_list + assert v.to_list() == [1.0, 2.0, 3.0] + + # to_tuple + assert v.to_tuple() == (1.0, 2.0, 3.0) + + # to_numpy + np_array = v.to_numpy() + assert isinstance(np_array, np.ndarray) + assert np.array_equal(np_array, np.array([1.0, 2.0, 3.0])) + + +def test_vector_equality(): + """Test vector equality.""" + v1 = Vector(1, 2, 3) + v2 = Vector(1, 2, 3) + v3 = Vector(4, 5, 6) + + assert v1 == v2 + assert v1 != v3 + assert v1 != Vector(1, 2) # Different dimensions + assert v1 != Vector(1.1, 2, 3) # Different values + assert v1 != [1, 2, 3] + + +def test_vector_is_zero(): + """Test is_zero method for vectors.""" + # Default empty vector + v0 = Vector() + assert v0.is_zero() == True + + # Explicit zero vector + v1 = Vector(0.0, 0.0, 0.0) + assert v1.is_zero() == True + + # Zero vector with different dimensions + v2 = Vector(0.0, 0.0) + assert v2.is_zero() == True + + # Non-zero vectors + v3 = Vector(1.0, 0.0, 0.0) + assert v3.is_zero() == False + + v4 = Vector(0.0, 2.0, 0.0) + assert v4.is_zero() == False + + v5 = Vector(0.0, 0.0, 3.0) + assert v5.is_zero() == False + + # Almost zero (within tolerance) + v6 = Vector(1e-10, 1e-10, 1e-10) + assert v6.is_zero() == True + + # Almost zero (outside tolerance) + v7 = Vector(1e-6, 1e-6, 1e-6) + assert v7.is_zero() == False + + +def test_vector_bool_conversion(): + """Test boolean conversion of vectors.""" + # Zero vectors should be False + v0 = Vector() + assert bool(v0) == False + + v1 = Vector(0.0, 0.0, 0.0) + assert bool(v1) == False + + # Almost zero vectors should be False + v2 = Vector(1e-10, 1e-10, 1e-10) + assert bool(v2) == False + + # Non-zero vectors should be True + v3 = Vector(1.0, 0.0, 0.0) + assert bool(v3) == True + + v4 = Vector(0.0, 2.0, 0.0) + assert bool(v4) == True + + v5 = Vector(0.0, 0.0, 3.0) + assert bool(v5) == True + + # Direct use in if statements + if v0: + assert False, "Zero vector should be False in boolean context" + else: + pass # Expected path + + if v3: + pass # Expected path + else: + assert False, "Non-zero vector should be True in boolean context" diff --git a/dimos/types/vector.py b/dimos/types/vector.py index e8bb5b8308..8d3ae1ef91 100644 --- a/dimos/types/vector.py +++ b/dimos/types/vector.py @@ -12,23 +12,21 @@ # See the License for the specific language governing permissions and # limitations under the License. +from typing import List, Tuple, TypeVar, Union, Sequence + import numpy as np from geometry_msgs.msg import Vector3 -from typing import ( - Tuple, - List, - TypeVar, - Protocol, - runtime_checkable, -) T = TypeVar("T", bound="Vector") +# Vector-like types that can be converted to/from Vector +VectorLike = Union[Sequence[Union[int, float]], Vector3, "Vector", np.ndarray] + class Vector: """A wrapper around numpy arrays for vector operations with intuitive syntax.""" - def __init__(self, *args): + def __init__(self, *args: VectorLike): """Initialize a vector from components or another iterable. Examples: @@ -39,6 +37,7 @@ def __init__(self, *args): """ if len(args) == 1 and hasattr(args[0], "__iter__"): self._data = np.array(args[0], dtype=float) + elif len(args) == 1: self._data = np.array([args[0].x, args[0].y, args[0].z], dtype=float) @@ -79,18 +78,11 @@ def data(self) -> np.ndarray: """Get the underlying numpy array.""" return self._data - def __len__(self) -> int: - return len(self._data) - def __getitem__(self, idx): return self._data[idx] - def __iter__(self): - return iter(self._data) - def __repr__(self) -> str: - components = ",".join(f"{x:.6g}" for x in self._data) - return f"({components})" + return f"Vector({self.data})" def __str__(self) -> str: if self.dim < 2: @@ -99,7 +91,7 @@ def __str__(self) -> str: def getArrow(): repr = ["←", "↖", "↑", "↗", "→", "↘", "↓", "↙"] - if self.y == 0 and self.x == 0: + if self.x == 0 and self.y == 0: return "·" # Calculate angle in radians and convert to directional index @@ -115,10 +107,17 @@ def serialize(self) -> Tuple: """Serialize the vector to a tuple.""" return {"type": "vector", "c": self._data.tolist()} + def __len__(self) -> int: + """Return the dimension of the vector.""" + return len(self._data) + def __eq__(self, other) -> bool: - if isinstance(other, Vector): - return np.array_equal(self._data, other._data) - return np.array_equal(self._data, np.array(other, dtype=float)) + """Check if two vectors are equal using numpy's allclose for floating point comparison.""" + if not isinstance(other, Vector): + return False + if len(self._data) != len(other._data): + return False + return np.allclose(self._data, other._data) def __add__(self: T, other) -> T: if isinstance(other, Vector): @@ -207,7 +206,8 @@ def angle(self, other) -> float: other_data = np.array(other, dtype=float) cos_angle = np.clip( - np.dot(self._data, other_data) / (np.linalg.norm(self._data) * np.linalg.norm(other_data)), + np.dot(self._data, other_data) + / (np.linalg.norm(self._data) * np.linalg.norm(other_data)), -1.0, 1.0, ) @@ -277,14 +277,24 @@ def to_numpy(self) -> np.ndarray: """Convert the vector to a numpy array.""" return self._data + def is_zero(self) -> bool: + """Check if this is a zero vector (all components are zero). + + Returns: + True if all components are zero, False otherwise + """ + return np.allclose(self._data, 0.0) + + def __bool__(self) -> bool: + """Boolean conversion for Vector. -# Protocol approach for static type checking -@runtime_checkable -class VectorLike(Protocol): - """Protocol for types that can be treated as vectors.""" + A Vector is considered False if it's a zero vector (all components are zero), + and True otherwise. - def __getitem__(self, key: int) -> float: ... - def __len__(self) -> int: ... + Returns: + False if vector is zero, True otherwise + """ + return not self.is_zero() def to_numpy(value: VectorLike) -> np.ndarray: @@ -452,143 +462,3 @@ def z(value: VectorLike) -> float: else: arr = to_numpy(value) return float(arr[2]) if len(arr) > 2 else 0.0 - - -if __name__ == "__main__": - # Test vectors in various directions - test_vectors = [ - Vector(1, 0), # Right - Vector(1, 1), # Up-Right - Vector(0, 1), # Up - Vector(-1, 1), # Up-Left - Vector(-1, 0), # Left - Vector(-1, -1), # Down-Left - Vector(0, -1), # Down - Vector(1, -1), # Down-Right - Vector(0.5, 0.5), # Up-Right (shorter) - Vector(-3, 4), # Up-Left (longer) - Vector(Vector3(x=2.0, y=3.0, z=4.0)), - ] - - for v in test_vectors: - print(str(v)) - - # Test the vector compatibility functions - print("Testing vectortypes.py conversion functions\n") - - # Create test vectors in different formats - vector_obj = Vector(1.0, 2.0, 3.0) - numpy_arr = np.array([4.0, 5.0, 6.0]) - tuple_vec = (7.0, 8.0, 9.0) - list_vec = [10.0, 11.0, 12.0] - - print("Original values:") - print(f"Vector: {vector_obj}") - print(f"NumPy: {numpy_arr}") - print(f"Tuple: {tuple_vec}") - print(f"List: {list_vec}") - print() - - # Test to_numpy - print("to_numpy() conversions:") - print(f"Vector → NumPy: {to_numpy(vector_obj)}") - print(f"NumPy → NumPy: {to_numpy(numpy_arr)}") - print(f"Tuple → NumPy: {to_numpy(tuple_vec)}") - print(f"List → NumPy: {to_numpy(list_vec)}") - print() - - # Test to_vector - print("to_vector() conversions:") - print(f"Vector → Vector: {to_vector(vector_obj)}") - print(f"NumPy → Vector: {to_vector(numpy_arr)}") - print(f"Tuple → Vector: {to_vector(tuple_vec)}") - print(f"List → Vector: {to_vector(list_vec)}") - print() - - # Test to_tuple - print("to_tuple() conversions:") - print(f"Vector → Tuple: {to_tuple(vector_obj)}") - print(f"NumPy → Tuple: {to_tuple(numpy_arr)}") - print(f"Tuple → Tuple: {to_tuple(tuple_vec)}") - print(f"List → Tuple: {to_tuple(list_vec)}") - print() - - # Test to_list - print("to_list() conversions:") - print(f"Vector → List: {to_list(vector_obj)}") - print(f"NumPy → List: {to_list(numpy_arr)}") - print(f"Tuple → List: {to_list(tuple_vec)}") - print(f"List → List: {to_list(list_vec)}") - print() - - # Test component extraction - print("Component extraction:") - print("x() function:") - print(f"x(Vector): {x(vector_obj)}") - print(f"x(NumPy): {x(numpy_arr)}") - print(f"x(Tuple): {x(tuple_vec)}") - print(f"x(List): {x(list_vec)}") - print() - - print("y() function:") - print(f"y(Vector): {y(vector_obj)}") - print(f"y(NumPy): {y(numpy_arr)}") - print(f"y(Tuple): {y(tuple_vec)}") - print(f"y(List): {y(list_vec)}") - print() - - print("z() function:") - print(f"z(Vector): {z(vector_obj)}") - print(f"z(NumPy): {z(numpy_arr)}") - print(f"z(Tuple): {z(tuple_vec)}") - print(f"z(List): {z(list_vec)}") - print() - - # Test dimension checking - print("Dimension checking:") - vec2d = Vector(1.0, 2.0) - vec3d = Vector(1.0, 2.0, 3.0) - arr2d = np.array([1.0, 2.0]) - arr3d = np.array([1.0, 2.0, 3.0]) - - print(f"is_2d(Vector(1,2)): {is_2d(vec2d)}") - print(f"is_2d(Vector(1,2,3)): {is_2d(vec3d)}") - print(f"is_2d(np.array([1,2])): {is_2d(arr2d)}") - print(f"is_2d(np.array([1,2,3])): {is_2d(arr3d)}") - print(f"is_2d((1,2)): {is_2d((1.0, 2.0))}") - print(f"is_2d((1,2,3)): {is_2d((1.0, 2.0, 3.0))}") - print() - - print(f"is_3d(Vector(1,2)): {is_3d(vec2d)}") - print(f"is_3d(Vector(1,2,3)): {is_3d(vec3d)}") - print(f"is_3d(np.array([1,2])): {is_3d(arr2d)}") - print(f"is_3d(np.array([1,2,3])): {is_3d(arr3d)}") - print(f"is_3d((1,2)): {is_3d((1.0, 2.0))}") - print(f"is_3d((1,2,3)): {is_3d((1.0, 2.0, 3.0))}") - print() - - # Test the Protocol interface - print("Testing VectorLike Protocol:") - print(f"isinstance(Vector(1,2), VectorLike): {isinstance(vec2d, VectorLike)}") - print(f"isinstance(np.array([1,2]), VectorLike): {isinstance(arr2d, VectorLike)}") - print(f"isinstance((1,2), VectorLike): {isinstance((1.0, 2.0), VectorLike)}") - print(f"isinstance([1,2], VectorLike): {isinstance([1.0, 2.0], VectorLike)}") - print() - - # Test mixed operations using different vector types - # These functions aren't defined in vectortypes, but demonstrate the concept - def distance(a, b): - a_np = to_numpy(a) - b_np = to_numpy(b) - diff = a_np - b_np - return np.sqrt(np.sum(diff * diff)) - - def midpoint(a, b): - a_np = to_numpy(a) - b_np = to_numpy(b) - return (a_np + b_np) / 2 - - print("Mixed operations between different vector types:") - print(f"distance(Vector(1,2,3), [4,5,6]): {distance(vec3d, [4.0, 5.0, 6.0])}") - print(f"distance(np.array([1,2,3]), (4,5,6)): {distance(arr3d, (4.0, 5.0, 6.0))}") - print(f"midpoint(Vector(1,2,3), np.array([4,5,6])): {midpoint(vec3d, numpy_arr)}") diff --git a/dimos/utils/extract_frames.py b/dimos/utils/extract_frames.py index d5a564930e..ddff12f189 100644 --- a/dimos/utils/extract_frames.py +++ b/dimos/utils/extract_frames.py @@ -13,10 +13,10 @@ # limitations under the License. import cv2 -import os import argparse from pathlib import Path + def extract_frames(video_path, output_dir, frame_rate): """ Extract frames from a video file at a specified frame rate. @@ -63,11 +63,19 @@ def extract_frames(video_path, output_dir, frame_rate): cap.release() print(f"Extracted {saved_frame_count} frames to {output_dir}") + if __name__ == "__main__": parser = argparse.ArgumentParser(description="Extract frames from a video file.") parser.add_argument("video_path", type=str, help="Path to the input .mov or .mp4 video file.") - parser.add_argument("--output_dir", type=str, default="frames", help="Directory to save extracted frames.") - parser.add_argument("--frame_rate", type=float, default=1.0, help="Frame rate at which to extract frames (frames per second).") + parser.add_argument( + "--output_dir", type=str, default="frames", help="Directory to save extracted frames." + ) + parser.add_argument( + "--frame_rate", + type=float, + default=1.0, + help="Frame rate at which to extract frames (frames per second).", + ) args = parser.parse_args() diff --git a/dimos/utils/generic_subscriber.py b/dimos/utils/generic_subscriber.py index fd0cb5841f..96fb0d3f5b 100644 --- a/dimos/utils/generic_subscriber.py +++ b/dimos/utils/generic_subscriber.py @@ -27,14 +27,12 @@ def __init__(self, stream: Observable): if stream is not None: try: self._subscription = stream.subscribe( - on_next=self._on_next, - on_error=self._on_error, - on_completed=self._on_completed + on_next=self._on_next, on_error=self._on_error, on_completed=self._on_completed ) logger.debug(f"Subscribed to stream {stream}") except Exception as e: logger.error(f"Error subscribing to stream {stream}: {e}") - self._stream_error = e # Store error if subscription fails immediately + self._stream_error = e # Store error if subscription fails immediately else: logger.warning("Initialized GenericSubscriber with a None stream.") @@ -49,7 +47,7 @@ def _on_error(self, error: Exception): logger.error(f"Stream error: {error}") with self._lock: self._stream_error = error - self._stream_completed.set() # Signal completion/error + self._stream_completed.set() # Signal completion/error def _on_completed(self): """Callback for stream completion.""" @@ -86,7 +84,7 @@ def dispose(self): self._subscription = None except Exception as e: logger.error(f"Error disposing subscription: {e}") - self._stream_completed.set() # Ensure completed flag is set on manual dispose + self._stream_completed.set() # Ensure completed flag is set on manual dispose def __del__(self): """Ensure cleanup on object deletion.""" diff --git a/dimos/utils/logging_config.py b/dimos/utils/logging_config.py index 66877658ef..a1e1a25ca4 100644 --- a/dimos/utils/logging_config.py +++ b/dimos/utils/logging_config.py @@ -25,7 +25,9 @@ logging.basicConfig(format="%(name)s - %(levelname)s - %(message)s") -def setup_logger(name: str, level: Optional[int] = None, log_format: Optional[str] = None) -> logging.Logger: +def setup_logger( + name: str, level: Optional[int] = None, log_format: Optional[str] = None +) -> logging.Logger: """Set up a logger with color output. Args: diff --git a/dimos/utils/reactive.py b/dimos/utils/reactive.py index 0a609dd23e..4836e18987 100644 --- a/dimos/utils/reactive.py +++ b/dimos/utils/reactive.py @@ -71,7 +71,9 @@ def getter_ondemand(observable: Observable[T], timeout: Optional[float] = 30.0) def getter(): try: # Wait for first value with optional timeout - value = observable.pipe(ops.first(), *([ops.timeout(timeout)] if timeout is not None else [])).run() + value = observable.pipe( + ops.first(), *([ops.timeout(timeout)] if timeout is not None else []) + ).run() return value except Exception as e: raise Exception(f"No value received after {timeout} seconds") from e diff --git a/dimos/utils/ros_utils.py b/dimos/utils/ros_utils.py index 9423dfe6a1..33f26e38fb 100644 --- a/dimos/utils/ros_utils.py +++ b/dimos/utils/ros_utils.py @@ -1,16 +1,15 @@ -import math import numpy as np from typing import Tuple -from scipy.spatial.transform import Rotation as R import logging logger = logging.getLogger(__name__) + def normalize_angle(angle: float) -> float: """Normalize angle to [-pi, pi] range""" return np.arctan2(np.sin(angle), np.cos(angle)) + def distance_angle_to_goal_xy(distance: float, angle: float) -> Tuple[float, float]: """Convert distance and angle to goal x, y in robot frame""" return distance * np.cos(angle), distance * np.sin(angle) - diff --git a/dimos/utils/s3_utils.py b/dimos/utils/s3_utils.py index efca0eb2fb..b8f2c32b86 100644 --- a/dimos/utils/s3_utils.py +++ b/dimos/utils/s3_utils.py @@ -14,15 +14,16 @@ import boto3 import os -from io import BytesIO + try: import open3d as o3d except Exception as e: print(f"Open3D not importing, assuming to be running outside of docker. {e}") + class S3Utils: def __init__(self, bucket_name): - self.s3 = boto3.client('s3') + self.s3 = boto3.client("s3") self.bucket_name = bucket_name def download_file(self, s3_key, local_path): @@ -40,11 +41,10 @@ def upload_file(self, local_path, s3_key): print(f"Error uploading {local_path}: {e}") def save_pointcloud_to_s3(self, inlier_cloud, s3_key): - try: temp_pcd_file = "/tmp/temp_pointcloud.pcd" o3d.io.write_point_cloud(temp_pcd_file, inlier_cloud) - with open(temp_pcd_file, 'rb') as pcd_file: + with open(temp_pcd_file, "rb") as pcd_file: self.s3.put_object(Bucket=self.bucket_name, Key=s3_key, Body=pcd_file.read()) os.remove(temp_pcd_file) print(f"Saved pointcloud to {s3_key}") @@ -57,11 +57,11 @@ def restore_pointcloud_from_s3(self, pointcloud_paths): for path in pointcloud_paths: # Download the point cloud file from S3 to memory pcd_obj = self.s3.get_object(Bucket=self.bucket_name, Key=path) - pcd_data = pcd_obj['Body'].read() + pcd_data = pcd_obj["Body"].read() # Save the point cloud data to a temporary file temp_pcd_file = "/tmp/temp_pointcloud.pcd" - with open(temp_pcd_file, 'wb') as f: + with open(temp_pcd_file, "wb") as f: f.write(pcd_data) # Read the point cloud from the temporary file @@ -72,22 +72,23 @@ def restore_pointcloud_from_s3(self, pointcloud_paths): os.remove(temp_pcd_file) return restored_pointclouds + @staticmethod def upload_text_file(bucket_name, local_path, s3_key): - s3 = boto3.client('s3') + s3 = boto3.client("s3") try: - with open(local_path, 'r') as file: + with open(local_path, "r") as file: content = file.read() # Ensure the s3_key includes the file name - if not s3_key.endswith('/'): - s3_key = s3_key + '/' + if not s3_key.endswith("/"): + s3_key = s3_key + "/" # Extract the file name from the local_path - file_name = local_path.split('/')[-1] + file_name = local_path.split("/")[-1] full_s3_key = s3_key + file_name s3.put_object(Bucket=bucket_name, Key=full_s3_key, Body=content) print(f"Uploaded text file {local_path} to {full_s3_key}") except Exception as e: - print(f"Error uploading text file {local_path}: {e}") \ No newline at end of file + print(f"Error uploading text file {local_path}: {e}") diff --git a/dimos/utils/simple_controller.py b/dimos/utils/simple_controller.py index f2b2d8ba03..f30155c419 100644 --- a/dimos/utils/simple_controller.py +++ b/dimos/utils/simple_controller.py @@ -1,17 +1,29 @@ import math + def normalize_angle(angle): """Normalize angle to the range [-pi, pi].""" return math.atan2(math.sin(angle), math.cos(angle)) + # ---------------------------- # PID Controller Class # ---------------------------- class PIDController: - def __init__(self, kp, ki=0.0, kd=0.0, output_limits=(None, None), integral_limit=None, deadband=0.0, output_deadband=0.0, inverse_output=False): + def __init__( + self, + kp, + ki=0.0, + kd=0.0, + output_limits=(None, None), + integral_limit=None, + deadband=0.0, + output_deadband=0.0, + inverse_output=False, + ): """ Initialize the PID controller. - + Args: kp (float): Proportional gain. ki (float): Integral gain. @@ -39,7 +51,7 @@ def update(self, error, dt): self.integral += error * dt if self.integral_limit is not None: self.integral = max(-self.integral_limit, min(self.integral, self.integral_limit)) - + # Compute derivative term. derivative = (error - self.prev_error) / dt if dt > 0 else 0.0 @@ -47,34 +59,34 @@ def update(self, error, dt): # Prevent integral windup by not increasing integral term when error is small. self.integral = 0.0 derivative = 0.0 - + # Compute raw output. output = self.kp * error + self.ki * self.integral + self.kd * derivative - + # Apply deadband compensation to the output output = self._apply_output_deadband_compensation(output) - + # Apply output limits if specified. if self.max_output is not None: output = min(self.max_output, output) if self.min_output is not None: output = max(self.min_output, output) - + self.prev_error = error if self.inverse_output: return -output return output - + def _apply_output_deadband_compensation(self, output): """ Apply deadband compensation to the output. - + This simply adds the deadband value to the magnitude of the output while preserving the sign, ensuring we overcome the physical deadband. """ if self.output_deadband == 0.0 or output == 0.0: return output - + if output > self.max_output * 0.05: # For positive output, add the deadband return output + self.output_deadband @@ -83,16 +95,17 @@ def _apply_output_deadband_compensation(self, output): return output - self.output_deadband else: return output - + def _apply_deadband_compensation(self, error): """ Apply deadband compensation to the error. - + This maintains the original error value, as the deadband compensation will be applied to the output, not the error. """ return error + # ---------------------------- # Visual Servoing Controller Class # ---------------------------- @@ -100,7 +113,7 @@ class VisualServoingController: def __init__(self, distance_pid_params, angle_pid_params): """ Initialize the visual servoing controller using enhanced PID controllers. - + Args: distance_pid_params (tuple): (kp, ki, kd, output_limits, integral_limit, deadband) for distance. angle_pid_params (tuple): (kp, ki, kd, output_limits, integral_limit, deadband) for angle. @@ -109,30 +122,32 @@ def __init__(self, distance_pid_params, angle_pid_params): self.angle_pid = PIDController(*angle_pid_params) self.prev_measured_angle = 0.0 # Used for angular feed-forward damping - def compute_control(self, measured_distance, measured_angle, desired_distance, desired_angle, dt): + def compute_control( + self, measured_distance, measured_angle, desired_distance, desired_angle, dt + ): """ Compute the forward (x) and angular (z) commands. - + Args: measured_distance (float): Current distance to target (from camera). measured_angle (float): Current angular offset to target (radians). desired_distance (float): Desired distance to target. desired_angle (float): Desired angular offset (e.g., 0 for centered). dt (float): Timestep. - + Returns: tuple: (forward_command, angular_command) """ # Compute the errors. error_distance = measured_distance - desired_distance error_angle = normalize_angle(measured_angle - desired_angle) - + # Get raw PID outputs. forward_command_raw = self.distance_pid.update(error_distance, dt) angular_command_raw = self.angle_pid.update(error_angle, dt) - #print("forward: {} angular: {}".format(forward_command_raw, angular_command_raw)) - + # print("forward: {} angular: {}".format(forward_command_raw, angular_command_raw)) + angular_command = angular_command_raw # Couple forward command to angular error: @@ -140,4 +155,4 @@ def compute_control(self, measured_distance, measured_angle, desired_distance, d scaling_factor = max(0.0, min(1.0, math.exp(-2.0 * abs(error_angle)))) forward_command = forward_command_raw * scaling_factor - return forward_command, angular_command \ No newline at end of file + return forward_command, angular_command diff --git a/dimos/utils/test_reactive.py b/dimos/utils/test_reactive.py index 977863826a..a5c5e87527 100644 --- a/dimos/utils/test_reactive.py +++ b/dimos/utils/test_reactive.py @@ -5,7 +5,12 @@ from reactivex import operators as ops from typing import Callable, TypeVar, Any from reactivex.disposable import Disposable -from dimos.utils.reactive import backpressure, getter_streaming, getter_ondemand, callback_to_observable +from dimos.utils.reactive import ( + backpressure, + getter_streaming, + getter_ondemand, + callback_to_observable, +) def measure_time(func: Callable[[], Any], iterations: int = 1) -> float: @@ -16,7 +21,9 @@ def measure_time(func: Callable[[], Any], iterations: int = 1) -> float: return result, total_time -def assert_time(func: Callable[[], Any], assertion: Callable[[int], bool], assert_fail_msg=None) -> None: +def assert_time( + func: Callable[[], Any], assertion: Callable[[int], bool], assert_fail_msg=None +) -> None: [result, total_time] = measure_time(func) assert assertion(total_time), assert_fail_msg + f", took {round(total_time, 2)}s" return result @@ -56,7 +63,9 @@ def test_backpressure_handling(): received_fast = [] received_slow = [] # Create an observable that emits numpy arrays instead of integers - source = dispose_spy(rx.interval(0.1).pipe(ops.map(lambda i: np.array([i, i + 1, i + 2])), ops.take(50))) + source = dispose_spy( + rx.interval(0.1).pipe(ops.map(lambda i: np.array([i, i + 1, i + 2])), ops.take(50)) + ) # Wrap with backpressure handling safe_source = backpressure(source) @@ -80,10 +89,14 @@ def test_backpressure_handling(): print("Slow observer received:", len(received_slow), [arr[0] for arr in received_slow]) # Fast observer should get all or nearly all items - assert len(received_fast) > 15, f"Expected fast observer to receive most items, got {len(received_fast)}" + assert len(received_fast) > 15, ( + f"Expected fast observer to receive most items, got {len(received_fast)}" + ) # Slow observer should get fewer items due to backpressure handling - assert len(received_slow) < len(received_fast), "Slow observer should receive fewer items than fast observer" + assert len(received_slow) < len(received_fast), ( + "Slow observer should receive fewer items than fast observer" + ) # Specifically, processing at 0.25s means ~4 items per second, so expect 8-10 items assert 7 <= len(received_slow) <= 11, f"Expected 7-11 items, got {len(received_slow)}" @@ -98,11 +111,19 @@ def test_backpressure_handling(): def test_getter_streaming_blocking(): - source = dispose_spy(rx.interval(0.2).pipe(ops.map(lambda i: np.array([i, i + 1, i + 2])), ops.take(50))) + source = dispose_spy( + rx.interval(0.2).pipe(ops.map(lambda i: np.array([i, i + 1, i + 2])), ops.take(50)) + ) assert source.is_disposed() - getter = min_time(lambda: getter_streaming(source), 0.2, "Latest getter needs to block until first msg is ready") - assert np.array_equal(getter(), np.array([0, 1, 2])), f"Expected to get the first array [0,1,2], got {getter()}" + getter = min_time( + lambda: getter_streaming(source), + 0.2, + "Latest getter needs to block until first msg is ready", + ) + assert np.array_equal(getter(), np.array([0, 1, 2])), ( + f"Expected to get the first array [0,1,2], got {getter()}" + ) time.sleep(0.5) assert getter()[0] >= 2, f"Expected array with first value >= 2, got {getter()}" @@ -125,7 +146,9 @@ def test_getter_streaming_nonblocking(): source = dispose_spy(rx.interval(0.2).pipe(ops.take(50))) getter = max_time( - lambda: getter_streaming(source, nonblocking=True), 0.1, "nonblocking getter init shouldn't block" + lambda: getter_streaming(source, nonblocking=True), + 0.1, + "nonblocking getter init shouldn't block", ) min_time(getter, 0.2, "Expected for first value call to block if cache is empty") assert getter() == 0 diff --git a/dimos/utils/test_testing.py b/dimos/utils/test_testing.py new file mode 100644 index 0000000000..c1c0c10072 --- /dev/null +++ b/dimos/utils/test_testing.py @@ -0,0 +1,110 @@ +import hashlib +import os +import subprocess +from dimos.utils import testing + + +def test_pull_file(): + repo_root = testing._get_repo_root() + test_file_name = "cafe.jpg" + test_file_compressed = testing._get_lfs_dir() / (test_file_name + ".tar.gz") + test_file_decompressed = testing._get_data_dir() / test_file_name + + # delete decompressed test file if it exists + if test_file_decompressed.exists(): + test_file_decompressed.unlink() + + # delete lfs archive file if it exists + if test_file_compressed.exists(): + test_file_compressed.unlink() + + assert not test_file_compressed.exists() + assert not test_file_decompressed.exists() + + # pull the lfs file reference from git + env = os.environ.copy() + env["GIT_LFS_SKIP_SMUDGE"] = "1" + subprocess.run( + ["git", "checkout", "HEAD", "--", test_file_compressed], + cwd=repo_root, + env=env, + check=True, + capture_output=True, + ) + + # ensure we have a pointer file from git (small ASCII text file) + assert test_file_compressed.exists() + assert test_file_compressed.stat().st_size < 200 + + # trigger a data file pull + assert testing.testData(test_file_name) == test_file_decompressed + + # validate data is received + assert test_file_compressed.exists() + assert test_file_decompressed.exists() + + # validate hashes + with test_file_compressed.open("rb") as f: + assert test_file_compressed.stat().st_size > 200 + compressed_sha256 = hashlib.sha256(f.read()).hexdigest() + assert ( + compressed_sha256 == "b8cf30439b41033ccb04b09b9fc8388d18fb544d55b85c155dbf85700b9e7603" + ) + + with test_file_decompressed.open("rb") as f: + decompressed_sha256 = hashlib.sha256(f.read()).hexdigest() + assert ( + decompressed_sha256 + == "55d451dde49b05e3ad386fdd4ae9e9378884b8905bff1ca8aaea7d039ff42ddd" + ) + + +def test_pull_dir(): + repo_root = testing._get_repo_root() + test_dir_name = "ab_lidar_frames" + test_dir_compressed = testing._get_lfs_dir() / (test_dir_name + ".tar.gz") + test_dir_decompressed = testing._get_data_dir() / test_dir_name + + # delete decompressed test directory if it exists + if test_dir_decompressed.exists(): + for item in test_dir_decompressed.iterdir(): + item.unlink() + test_dir_decompressed.rmdir() + + # delete lfs archive file if it exists + if test_dir_compressed.exists(): + test_dir_compressed.unlink() + + # pull the lfs file reference from git + env = os.environ.copy() + env["GIT_LFS_SKIP_SMUDGE"] = "1" + subprocess.run( + ["git", "checkout", "HEAD", "--", test_dir_compressed], + cwd=repo_root, + env=env, + check=True, + capture_output=True, + ) + + # ensure we have a pointer file from git (small ASCII text file) + assert test_dir_compressed.exists() + assert test_dir_compressed.stat().st_size < 200 + + # trigger a data file pull + assert testing.testData(test_dir_name) == test_dir_decompressed + assert test_dir_compressed.stat().st_size > 200 + + # validate data is received + assert test_dir_compressed.exists() + assert test_dir_decompressed.exists() + + for [file, expected_hash] in zip( + sorted(test_dir_decompressed.iterdir()), + [ + "6c3aaa9a79853ea4a7453c7db22820980ceb55035777f7460d05a0fa77b3b1b3", + "456cc2c23f4ffa713b4e0c0d97143c27e48bbe6ef44341197b31ce84b3650e74", + ], + ): + with file.open("rb") as f: + sha256 = hashlib.sha256(f.read()).hexdigest() + assert sha256 == expected_hash diff --git a/dimos/utils/testing.py b/dimos/utils/testing.py new file mode 100644 index 0000000000..53b9849718 --- /dev/null +++ b/dimos/utils/testing.py @@ -0,0 +1,142 @@ +import subprocess +import tarfile +from functools import cache +from pathlib import Path +from typing import Union + + +def _check_git_lfs_available() -> None: + try: + subprocess.run(["git", "lfs", "version"], capture_output=True, check=True, text=True) + except (subprocess.CalledProcessError, FileNotFoundError): + raise RuntimeError( + "Git LFS is not installed. Please install git-lfs to use test data utilities.\n" + "Installation instructions: https://git-lfs.github.io/" + ) + return True + + +@cache +def _get_repo_root() -> Path: + try: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], capture_output=True, check=True, text=True + ) + return Path(result.stdout.strip()) + except subprocess.CalledProcessError: + raise RuntimeError("Not in a Git repository") + + +@cache +def _get_data_dir() -> Path: + return _get_repo_root() / "tests" / "data" + + +@cache +def _get_lfs_dir() -> Path: + return _get_data_dir() / ".lfs" + + +def _is_lfs_pointer_file(file_path: Path) -> bool: + try: + # LFS pointer files are small (typically < 200 bytes) and start with specific text + if file_path.stat().st_size > 1024: # LFS pointers are much smaller + return False + + with open(file_path, "r", encoding="utf-8") as f: + first_line = f.readline().strip() + return first_line.startswith("version https://git-lfs.github.com/spec/") + + except (UnicodeDecodeError, OSError): + return False + + +def _lfs_pull(file_path: Path, repo_root: Path) -> None: + try: + relative_path = file_path.relative_to(repo_root) + + subprocess.run( + ["git", "lfs", "pull", "--include", str(relative_path)], + cwd=repo_root, + check=True, + capture_output=True, + ) + except subprocess.CalledProcessError as e: + raise RuntimeError(f"Failed to pull LFS file {file_path}: {e}") + + +def _pull_lfs_archive(filename: Union[str, Path]) -> Path: + # Check Git LFS availability first + _check_git_lfs_available() + + # Find repository root + repo_root = _get_repo_root() + + # Construct path to test data file + file_path = _get_lfs_dir() / (filename + ".tar.gz") + + # Check if file exists + if not file_path.exists(): + raise FileNotFoundError( + f"Test file '{filename}' not found at {file_path}. " + f"Make sure the file is committed to Git LFS in the tests/data directory." + ) + + # If it's an LFS pointer file, ensure LFS is set up and pull the file + if _is_lfs_pointer_file(file_path): + _lfs_pull(file_path, repo_root) + + # Verify the file was actually downloaded + if _is_lfs_pointer_file(file_path): + raise RuntimeError( + f"Failed to download LFS file '{filename}'. The file is still a pointer after attempting to pull." + ) + + return file_path + + +def _decompress_archive(filename: Union[str, Path]) -> Path: + target_dir = _get_data_dir() + filename_path = Path(filename) + with tarfile.open(filename_path, "r:gz") as tar: + tar.extractall(target_dir) + return target_dir / filename_path.name.replace(".tar.gz", "") + + +def testData(filename: Union[str, Path]) -> Path: + """ + Get the path to a test data, downloading from LFS if needed. + + This function will: + 1. Check that Git LFS is available + 2. Locate the file in the tests/data directory + 3. Initialize Git LFS if needed + 4. Download the file from LFS if it's a pointer file + 5. Return the Path object to the actual file or dir + + Args: + filename: Name of the test file (e.g., "lidar_sample.bin") + + Returns: + Path: Path object to the test file + + Raises: + RuntimeError: If Git LFS is not available or LFS operations fail + FileNotFoundError: If the test file doesn't exist + + Usage: + # As string path + file_path = str(testFile("sample.bin")) + + # As context manager for file operations + with testFile("sample.bin").open('rb') as f: + data = f.read() + """ + data_dir = _get_data_dir() + file_path = data_dir / filename + + # already pulled and decompressed, return it directly + if file_path.exists(): + return file_path + + return _decompress_archive(_pull_lfs_archive(filename)) diff --git a/dimos/utils/threadpool.py b/dimos/utils/threadpool.py index 53b6f0de1f..cd2e7b16e5 100644 --- a/dimos/utils/threadpool.py +++ b/dimos/utils/threadpool.py @@ -31,7 +31,7 @@ def get_max_workers() -> int: int: The number of workers, configurable via the DIMOS_MAX_WORKERS environment variable, defaulting to 4 times the CPU count. """ - env_value = os.getenv('DIMOS_MAX_WORKERS', '') + env_value = os.getenv("DIMOS_MAX_WORKERS", "") return int(env_value) if env_value.strip() else multiprocessing.cpu_count() * 4 @@ -57,6 +57,7 @@ def get_scheduler() -> ThreadPoolScheduler: """ return scheduler + def make_single_thread_scheduler() -> ThreadPoolScheduler: """Create a new ThreadPoolScheduler with a single worker. diff --git a/dimos/web/dimos_interface/__init__.py b/dimos/web/dimos_interface/__init__.py index d3aa928a0d..5ca28b30e5 100644 --- a/dimos/web/dimos_interface/__init__.py +++ b/dimos/web/dimos_interface/__init__.py @@ -4,4 +4,4 @@ from .api.server import FastAPIServer -__all__ = ['FastAPIServer'] +__all__ = ["FastAPIServer"] diff --git a/dimos/web/dimos_interface/api/server.py b/dimos/web/dimos_interface/api/server.py index 14007ca4f4..812973e300 100644 --- a/dimos/web/dimos_interface/api/server.py +++ b/dimos/web/dimos_interface/api/server.py @@ -27,7 +27,7 @@ # Fast Api & Uvicorn import cv2 from dimos.web.edge_io import EdgeIO -from fastapi import FastAPI, Request, Response, Form, HTTPException +from fastapi import FastAPI, Request, Form, HTTPException from fastapi.responses import HTMLResponse, StreamingResponse, JSONResponse from sse_starlette.sse import EventSourceResponse from fastapi.templating import Jinja2Templates @@ -46,20 +46,19 @@ class FastAPIServer(EdgeIO): - - - - def __init__(self, - dev_name="FastAPI Server", - edge_type="Bidirectional", - host="0.0.0.0", - port=5555, - text_streams=None, - **streams): + def __init__( + self, + dev_name="FastAPI Server", + edge_type="Bidirectional", + host="0.0.0.0", + port=5555, + text_streams=None, + **streams, + ): print("Starting FastAPIServer initialization...") # Debug print super().__init__(dev_name, edge_type) self.app = FastAPI() - + # Add CORS middleware with more permissive settings for development self.app.add_middleware( CORSMiddleware, @@ -67,13 +66,13 @@ def __init__(self, allow_credentials=True, allow_methods=["*"], allow_headers=["*"], - expose_headers=["*"] + expose_headers=["*"], ) - + self.port = port self.host = host BASE_DIR = Path(__file__).resolve().parent - self.templates = Jinja2Templates(directory=str(BASE_DIR / 'templates')) + self.templates = Jinja2Templates(directory=str(BASE_DIR / "templates")) self.streams = streams self.active_streams = {} self.stream_locks = {key: Lock() for key in self.streams} @@ -93,17 +92,17 @@ def __init__(self, for key in self.streams: if self.streams[key] is not None: self.active_streams[key] = self.streams[key].pipe( - ops.map(self.process_frame_fastapi), ops.share()) + ops.map(self.process_frame_fastapi), ops.share() + ) # Set up text stream subscriptions for key, stream in self.text_streams.items(): if stream is not None: self.text_queues[key] = Queue(maxsize=100) disposable = stream.subscribe( - lambda text, k=key: self.text_queues[k].put(text) - if text is not None else None, + lambda text, k=key: self.text_queues[k].put(text) if text is not None else None, lambda e, k=key: self.text_queues[k].put(None), - lambda k=key: self.text_queues[k].put(None) + lambda k=key: self.text_queues[k].put(None), ) self.text_disposables[key] = disposable self.disposables.add(disposable) @@ -114,7 +113,7 @@ def __init__(self, def process_frame_fastapi(self, frame): """Convert frame to JPEG format for streaming.""" - _, buffer = cv2.imencode('.jpg', frame) + _, buffer = cv2.imencode(".jpg", frame) return buffer.tobytes() def stream_generator(self, key): @@ -144,10 +143,10 @@ def generate(): break disposable.disposable = self.active_streams[key].subscribe( - lambda frame: frame_queue.put(frame) - if frame is not None else None, + lambda frame: frame_queue.put(frame) if frame is not None else None, lambda e: frame_queue.put(None), - lambda: frame_queue.put(None)) + lambda: frame_queue.put(None), + ) try: while True: @@ -155,9 +154,7 @@ def generate(): frame = frame_queue.get(timeout=1) if frame is None: break - yield (b'--frame\r\n' - b'Content-Type: image/jpeg\r\n\r\n' + frame + - b'\r\n') + yield (b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + frame + b"\r\n") except Empty: # Instead of breaking, continue waiting for new frames continue @@ -172,8 +169,8 @@ def create_video_feed_route(self, key): async def video_feed(): return StreamingResponse( - self.stream_generator(key)(), - media_type="multipart/x-mixed-replace; boundary=frame") + self.stream_generator(key)(), media_type="multipart/x-mixed-replace; boundary=frame" + ) return video_feed @@ -181,22 +178,18 @@ async def text_stream_generator(self, key): """Generate SSE events for text stream.""" client_id = id(object()) self.text_clients.add(client_id) - + try: while True: if key not in self.text_queues: yield {"event": "ping", "data": ""} await asyncio.sleep(0.1) continue - + try: text = self.text_queues[key].get_nowait() if text is not None: - yield { - "event": "message", - "id": key, - "data": text - } + yield {"event": "message", "id": key, "data": text} else: break except Empty: @@ -222,12 +215,15 @@ async def get_text_streams(): async def index(request: Request): stream_keys = list(self.streams.keys()) text_stream_keys = list(self.text_streams.keys()) - return self.templates.TemplateResponse("index_fastapi.html", { - "request": request, - "stream_keys": stream_keys, - "text_stream_keys": text_stream_keys - }) - + return self.templates.TemplateResponse( + "index_fastapi.html", + { + "request": request, + "stream_keys": stream_keys, + "text_stream_keys": text_stream_keys, + }, + ) + @self.app.post("/submit_query") async def submit_query(query: str = Form(...)): # Using Form directly as a dependency ensures proper form handling @@ -235,29 +231,20 @@ async def submit_query(query: str = Form(...)): if query: # Emit the query through our Subject self.query_subject.on_next(query) - return JSONResponse({ - "success": True, - "message": "Query received" - }) - return JSONResponse({ - "success": False, - "message": "No query provided" - }) + return JSONResponse({"success": True, "message": "Query received"}) + return JSONResponse({"success": False, "message": "No query provided"}) except Exception as e: # Ensure we always return valid JSON even on error - return JSONResponse(status_code=500, - content={ - "success": False, - "message": f"Server error: {str(e)}" - }) + return JSONResponse( + status_code=500, + content={"success": False, "message": f"Server error: {str(e)}"}, + ) + # Unitree API endpoints @self.app.get("/unitree/status") async def unitree_status(): """Check the status of the Unitree API server""" - return JSONResponse({ - "status": "online", - "service": "unitree" - }) + return JSONResponse({"status": "online", "service": "unitree"}) @self.app.post("/unitree/command") async def unitree_command(request: Request): @@ -265,25 +252,22 @@ async def unitree_command(request: Request): try: data = await request.json() command_text = data.get("command", "") - + # Emit the command through the query_subject self.query_subject.on_next(command_text) - + response = { "success": True, "command": command_text, - "result": f"Processed command: {command_text}" + "result": f"Processed command: {command_text}", } - + return JSONResponse(response) except Exception as e: - print(f"Error processing command: {str(e)}") + print(f"Error processing command: {str(e)}") return JSONResponse( status_code=500, - content={ - "success": False, - "message": f"Error processing command: {str(e)}" - } + content={"success": False, "message": f"Error processing command: {str(e)}"}, ) @self.app.get("/text_stream/{key}") @@ -292,16 +276,16 @@ async def text_stream(key: str): raise HTTPException(status_code=404, detail=f"Text stream '{key}' not found") return EventSourceResponse(self.text_stream_generator(key)) - for key in self.streams: - self.app.get(f"/video_feed/{key}")( - self.create_video_feed_route(key)) + self.app.get(f"/video_feed/{key}")(self.create_video_feed_route(key)) def run(self): """Run the FastAPI server.""" - uvicorn.run(self.app, host=self.host, port=self.port - ) # TODO: Translate structure to enable in-built workers' - + uvicorn.run( + self.app, host=self.host, port=self.port + ) # TODO: Translate structure to enable in-built workers' + + if __name__ == "__main__": server = FastAPIServer() - server.run() \ No newline at end of file + server.run() diff --git a/dimos/web/dimos_interface/tsconfig.json b/dimos/web/dimos_interface/tsconfig.json index 772ce46b79..4bf29f39d2 100644 --- a/dimos/web/dimos_interface/tsconfig.json +++ b/dimos/web/dimos_interface/tsconfig.json @@ -5,17 +5,21 @@ "useDefineForClassFields": true, "module": "ESNext", "resolveJsonModule": true, - /** - * Typecheck JS in `.svelte` and `.js` files by default. - * Disable checkJs if you'd like to use dynamic types in JS. - * Note that setting allowJs false does not prevent the use - * of JS in `.svelte` files. - */ "allowJs": true, "checkJs": true, "isolatedModules": true, - "types": ["node"] + "types": [ + "node" + ] }, - "include": ["src/**/*.ts", "src/**/*.js", "src/**/*.svelte"], - "references": [{ "path": "./tsconfig.node.json" }] + "include": [ + "src/**/*.ts", + "src/**/*.js", + "src/**/*.svelte" + ], + "references": [ + { + "path": "./tsconfig.node.json" + } + ] } diff --git a/dimos/web/dimos_interface/tsconfig.node.json b/dimos/web/dimos_interface/tsconfig.node.json index 494bfe0835..ad883d0eb4 100644 --- a/dimos/web/dimos_interface/tsconfig.node.json +++ b/dimos/web/dimos_interface/tsconfig.node.json @@ -5,5 +5,7 @@ "module": "ESNext", "moduleResolution": "bundler" }, - "include": ["vite.config.ts"] + "include": [ + "vite.config.ts" + ] } diff --git a/dimos/web/edge_io.py b/dimos/web/edge_io.py index de17f0220f..8511df2ce3 100644 --- a/dimos/web/edge_io.py +++ b/dimos/web/edge_io.py @@ -14,8 +14,9 @@ from reactivex.disposable import CompositeDisposable -class EdgeIO(): - def __init__(self, dev_name:str="NA", edge_type:str="Base"): + +class EdgeIO: + def __init__(self, dev_name: str = "NA", edge_type: str = "Base"): self.dev_name = dev_name self.edge_type = edge_type self.disposables = CompositeDisposable() diff --git a/dimos/web/fastapi_server.py b/dimos/web/fastapi_server.py index d639510150..7dcd0f6d73 100644 --- a/dimos/web/fastapi_server.py +++ b/dimos/web/fastapi_server.py @@ -25,7 +25,7 @@ # Fast Api & Uvicorn import cv2 from dimos.web.edge_io import EdgeIO -from fastapi import FastAPI, Request, Response, Form, HTTPException +from fastapi import FastAPI, Request, Form, HTTPException from fastapi.responses import HTMLResponse, StreamingResponse, JSONResponse from sse_starlette.sse import EventSourceResponse from fastapi.templating import Jinja2Templates @@ -43,26 +43,27 @@ class FastAPIServer(EdgeIO): - - def __init__(self, - dev_name="FastAPI Server", - edge_type="Bidirectional", - host="0.0.0.0", - port=5555, - text_streams=None, - **streams): + def __init__( + self, + dev_name="FastAPI Server", + edge_type="Bidirectional", + host="0.0.0.0", + port=5555, + text_streams=None, + **streams, + ): super().__init__(dev_name, edge_type) self.app = FastAPI() self.port = port self.host = host BASE_DIR = Path(__file__).resolve().parent - self.templates = Jinja2Templates(directory=str(BASE_DIR / 'templates')) + self.templates = Jinja2Templates(directory=str(BASE_DIR / "templates")) self.streams = streams self.active_streams = {} self.stream_locks = {key: Lock() for key in self.streams} self.stream_queues = {} self.stream_disposables = {} - + # Initialize text streams self.text_streams = text_streams or {} self.text_queues = {} @@ -76,17 +77,17 @@ def __init__(self, for key in self.streams: if self.streams[key] is not None: self.active_streams[key] = self.streams[key].pipe( - ops.map(self.process_frame_fastapi), ops.share()) - + ops.map(self.process_frame_fastapi), ops.share() + ) + # Set up text stream subscriptions for key, stream in self.text_streams.items(): if stream is not None: self.text_queues[key] = Queue(maxsize=100) disposable = stream.subscribe( - lambda text, k=key: self.text_queues[k].put(text) - if text is not None else None, + lambda text, k=key: self.text_queues[k].put(text) if text is not None else None, lambda e, k=key: self.text_queues[k].put(None), - lambda k=key: self.text_queues[k].put(None) + lambda k=key: self.text_queues[k].put(None), ) self.text_disposables[key] = disposable self.disposables.add(disposable) @@ -95,7 +96,7 @@ def __init__(self, def process_frame_fastapi(self, frame): """Convert frame to JPEG format for streaming.""" - _, buffer = cv2.imencode('.jpg', frame) + _, buffer = cv2.imencode(".jpg", frame) return buffer.tobytes() def stream_generator(self, key): @@ -125,10 +126,10 @@ def generate(): break disposable.disposable = self.active_streams[key].subscribe( - lambda frame: frame_queue.put(frame) - if frame is not None else None, + lambda frame: frame_queue.put(frame) if frame is not None else None, lambda e: frame_queue.put(None), - lambda: frame_queue.put(None)) + lambda: frame_queue.put(None), + ) try: while True: @@ -136,9 +137,7 @@ def generate(): frame = frame_queue.get(timeout=1) if frame is None: break - yield (b'--frame\r\n' - b'Content-Type: image/jpeg\r\n\r\n' + frame + - b'\r\n') + yield (b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + frame + b"\r\n") except Empty: # Instead of breaking, continue waiting for new frames continue @@ -153,8 +152,8 @@ def create_video_feed_route(self, key): async def video_feed(): return StreamingResponse( - self.stream_generator(key)(), - media_type="multipart/x-mixed-replace; boundary=frame") + self.stream_generator(key)(), media_type="multipart/x-mixed-replace; boundary=frame" + ) return video_feed @@ -162,28 +161,21 @@ async def text_stream_generator(self, key): """Generate SSE events for text stream.""" client_id = id(object()) self.text_clients.add(client_id) - + try: while True: if key in self.text_queues: try: text = self.text_queues[key].get(timeout=1) if text is not None: - yield { - "event": "message", - "id": key, - "data": text - } + yield {"event": "message", "id": key, "data": text} except Empty: # Send a keep-alive comment - yield { - "event": "ping", - "data": "" - } + yield {"event": "ping", "data": ""} await asyncio.sleep(0.1) finally: self.text_clients.remove(client_id) - + def setup_routes(self): """Set up FastAPI routes.""" @@ -191,11 +183,14 @@ def setup_routes(self): async def index(request: Request): stream_keys = list(self.streams.keys()) text_stream_keys = list(self.text_streams.keys()) - return self.templates.TemplateResponse("index_fastapi.html", { - "request": request, - "stream_keys": stream_keys, - "text_stream_keys": text_stream_keys - }) + return self.templates.TemplateResponse( + "index_fastapi.html", + { + "request": request, + "stream_keys": stream_keys, + "text_stream_keys": text_stream_keys, + }, + ) @self.app.post("/submit_query") async def submit_query(query: str = Form(...)): @@ -204,21 +199,14 @@ async def submit_query(query: str = Form(...)): if query: # Emit the query through our Subject self.query_subject.on_next(query) - return JSONResponse({ - "success": True, - "message": "Query received" - }) - return JSONResponse({ - "success": False, - "message": "No query provided" - }) + return JSONResponse({"success": True, "message": "Query received"}) + return JSONResponse({"success": False, "message": "No query provided"}) except Exception as e: # Ensure we always return valid JSON even on error - return JSONResponse(status_code=500, - content={ - "success": False, - "message": f"Server error: {str(e)}" - }) + return JSONResponse( + status_code=500, + content={"success": False, "message": f"Server error: {str(e)}"}, + ) @self.app.get("/text_stream/{key}") async def text_stream(key: str): @@ -227,10 +215,10 @@ async def text_stream(key: str): return EventSourceResponse(self.text_stream_generator(key)) for key in self.streams: - self.app.get(f"/video_feed/{key}")( - self.create_video_feed_route(key)) + self.app.get(f"/video_feed/{key}")(self.create_video_feed_route(key)) def run(self): """Run the FastAPI server.""" - uvicorn.run(self.app, host=self.host, port=self.port - ) # TODO: Translate structure to enable in-built workers' + uvicorn.run( + self.app, host=self.host, port=self.port + ) # TODO: Translate structure to enable in-built workers' diff --git a/dimos/web/flask_server.py b/dimos/web/flask_server.py index a7a5c59acf..01d79f63cd 100644 --- a/dimos/web/flask_server.py +++ b/dimos/web/flask_server.py @@ -20,6 +20,7 @@ from dimos.web.edge_io import EdgeIO + class FlaskServer(EdgeIO): def __init__(self, dev_name="Flask Server", edge_type="Bidirectional", port=5555, **streams): super().__init__(dev_name, edge_type) @@ -33,22 +34,21 @@ def __init__(self, dev_name="Flask Server", edge_type="Bidirectional", port=5555 if self.streams[key] is not None: # Apply share and ref_count to manage subscriptions self.active_streams[key] = self.streams[key].pipe( - ops.map(self.process_frame_flask), - ops.share() + ops.map(self.process_frame_flask), ops.share() ) self.setup_routes() - + def process_frame_flask(self, frame): """Convert frame to JPEG format for streaming.""" - _, buffer = cv2.imencode('.jpg', frame) + _, buffer = cv2.imencode(".jpg", frame) return buffer.tobytes() def setup_routes(self): - @self.app.route('/') + @self.app.route("/") def index(): stream_keys = list(self.streams.keys()) # Get the keys from the streams dictionary - return render_template('index_flask.html', stream_keys=stream_keys) + return render_template("index_flask.html", stream_keys=stream_keys) # Function to create a streaming response def stream_generator(key): @@ -61,7 +61,7 @@ def generate(): disposable.disposable = self.active_streams[key].subscribe( lambda frame: frame_queue.put(frame) if frame is not None else None, lambda e: frame_queue.put(None), - lambda: frame_queue.put(None) + lambda: frame_queue.put(None), ) try: @@ -69,24 +69,27 @@ def generate(): frame = frame_queue.get() if frame is None: break - yield (b'--frame\r\n' - b'Content-Type: image/jpeg\r\n\r\n' + frame + b'\r\n') + yield (b"--frame\r\nContent-Type: image/jpeg\r\n\r\n" + frame + b"\r\n") finally: disposable.dispose() return generate - + def make_response_generator(key): def response_generator(): - return Response(stream_generator(key)(), mimetype='multipart/x-mixed-replace; boundary=frame') + return Response( + stream_generator(key)(), mimetype="multipart/x-mixed-replace; boundary=frame" + ) + return response_generator # Dynamically adding routes using add_url_rule for key in self.streams: - endpoint = f'video_feed_{key}' + endpoint = f"video_feed_{key}" self.app.add_url_rule( - f'/video_feed/{key}', endpoint, view_func=make_response_generator(key)) + f"/video_feed/{key}", endpoint, view_func=make_response_generator(key) + ) - def run(self, host='0.0.0.0', port=5555, threaded=True): + def run(self, host="0.0.0.0", port=5555, threaded=True): self.port = port self.app.run(host=host, port=self.port, debug=False, threaded=threaded) diff --git a/dimos/web/robot_web_interface.py b/dimos/web/robot_web_interface.py index ea773994d9..72dcce9d29 100644 --- a/dimos/web/robot_web_interface.py +++ b/dimos/web/robot_web_interface.py @@ -17,14 +17,12 @@ Provides a clean interface to the dimensional-interface FastAPI server. """ -import os -import sys - from dimos.web.dimos_interface.api.server import FastAPIServer + class RobotWebInterface(FastAPIServer): """Wrapper class for the dimos-interface FastAPI server.""" - + def __init__(self, port=5555, text_streams=None, **streams): super().__init__( dev_name="Robot Web Interface", @@ -32,5 +30,5 @@ def __init__(self, port=5555, text_streams=None, **streams): host="0.0.0.0", port=port, text_streams=text_streams, - **streams - ) \ No newline at end of file + **streams, + ) diff --git a/dimos/web/websocket_vis/deno.json b/dimos/web/websocket_vis/deno.json index 401e578474..453c7a4a80 100644 --- a/dimos/web/websocket_vis/deno.json +++ b/dimos/web/websocket_vis/deno.json @@ -1,22 +1,26 @@ { - "nodeModulesDir": "auto", - "tasks": { - "build": "deno run -A build.ts", - "watch": "deno run -A build.ts --watch" - }, - "lint": { - "rules": { - "exclude": ["require-await", "ban-ts-comment"] - } - }, - "fmt": { - "indentWidth": 4, - "useTabs": false, - "semiColons": false - }, - - "compilerOptions": { - "lib": ["dom", "deno.ns"] + "nodeModulesDir": "auto", + "tasks": { + "build": "deno run -A build.ts", + "watch": "deno run -A build.ts --watch" + }, + "lint": { + "rules": { + "exclude": [ + "require-await", + "ban-ts-comment" + ] } + }, + "fmt": { + "indentWidth": 4, + "useTabs": false, + "semiColons": false + }, + "compilerOptions": { + "lib": [ + "dom", + "deno.ns" + ] + } } - diff --git a/dimos/web/websocket_vis/helpers.py b/dimos/web/websocket_vis/helpers.py index af77380c1a..25ac9e13ce 100644 --- a/dimos/web/websocket_vis/helpers.py +++ b/dimos/web/websocket_vis/helpers.py @@ -1,8 +1,5 @@ -import threading -import time -from dataclasses import dataclass, field from abc import ABC -from typing import Tuple, Callable, Optional +from typing import Tuple, Callable from dimos.types.path import Path from dimos.types.vector import Vector diff --git a/docker/dev/Dockerfile b/docker/dev/Dockerfile index 058221cfe1..a210fd4e15 100644 --- a/docker/dev/Dockerfile +++ b/docker/dev/Dockerfile @@ -6,6 +6,7 @@ ARG GIT_BRANCH=unknown RUN apt-get install -y \ git \ + git-lfs \ nano \ vim \ ccze \ @@ -15,6 +16,12 @@ RUN apt-get install -y \ iputils-ping \ wget +# Configure git to trust any directory (resolves dubious ownership issues in containers) +RUN git config --global --add safe.directory '*' + +COPY docker/dev/dev-requirements.txt /app/ +RUN --mount=type=cache,target=/root/.cache/pip pip install -r dev-requirements.txt + # Copy files and add version to motd COPY motd /etc/motd COPY /docker/dev/bash.sh /root/.bash.sh diff --git a/docker/dev/dev-requirements.txt b/docker/dev/dev-requirements.txt new file mode 100644 index 0000000000..9633816cf2 --- /dev/null +++ b/docker/dev/dev-requirements.txt @@ -0,0 +1,3 @@ +ruff==0.11.10 +mypy==1.15.0 +pre_commit==4.2.0 diff --git a/pyproject.toml b/pyproject.toml index 1ffe5399bc..bbee605a7f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -7,10 +7,27 @@ version = "0.0.2" description = "Powering agentive generalist robotics" [tool.ruff] -line-length = 120 +line-length = 100 +exclude = [ + ".git", + ".pytest_cache", + ".ruff_cache", + ".venv", + ".vscode", + "__pypackages__", + "_build", + "build", + "dist", + "node_modules", + "site-packages", + "venv", + "libs", + "external", + "src" +] [tool.pytest.ini_options] -testpaths = ["dimos/robot"] +testpaths = ["dimos"] norecursedirs = ["dimos/robot/unitree/external"] markers = [ "vis: marks tests that run visuals and require a visual check by dev", diff --git a/requirements.txt b/requirements.txt index d48e6089c6..79b6393265 100644 --- a/requirements.txt +++ b/requirements.txt @@ -10,6 +10,7 @@ typeguard empy==3.3.4 catkin_pkg lark +plum-dispatch==2.5.7 # pycolmap ffmpeg-python diff --git a/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py b/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py new file mode 100644 index 0000000000..9dcffd7a45 --- /dev/null +++ b/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py @@ -0,0 +1,37 @@ +from dimos.utils.threadpool import get_scheduler +import os +from dimos.robot.unitree.unitree_go2 import UnitreeGo2 +from dimos.robot.unitree.unitree_skills import MyUnitreeSkills +from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl +from dimos.agents.agent import OpenAIAgent +from dimos.stream.audio.pipelines import tts, stt +from dimos.stream.audio.utils import keepalive + + +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/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py new file mode 100644 index 0000000000..665135cb69 --- /dev/null +++ b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py @@ -0,0 +1,32 @@ +# 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 test_header + +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent + +# Load API key from environment +load_dotenv() + +# Create a CerebrasAgent instance +agent = CerebrasAgent( + 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 Cerebras Agent: {response}") \ No newline at end of file diff --git a/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py new file mode 100644 index 0000000000..0304b0272d --- /dev/null +++ b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py @@ -0,0 +1,110 @@ +# 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 +import os +from dimos.robot.robot import MockRobot +import tests.test_header + +import time +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent +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.web.robot_web_interface import RobotWebInterface +from dimos.skills.observe_stream import ObserveStream +from dimos.skills.kill_skill import KillSkill +from dimos.skills.navigation import NavigateWithText, GetPose, NavigateToGoal +from dimos.skills.visual_navigation_skills import FollowHuman +import reactivex as rx +import reactivex.operators as ops +from dimos.stream.audio.pipelines import tts, stt +from dimos.web.websocket_vis.server import WebsocketVis +import threading +from dimos.types.vector import Vector +from dimos.skills.speak import Speak + +# Load API key from environment +load_dotenv() + +robot = MockRobot() + +# 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=5556, text_streams=text_streams,) + +# stt_node = stt() +robot_skills = MyUnitreeSkills() + + +# Create a CerebrasAgent instance +agent = CerebrasAgent( + dev_name="test_cerebras_agent", + # input_query_stream=stt_node.emit_text(), + input_query_stream=web_interface.query_stream, + skills=robot_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="llama-4-scout-17b-16e-instruct" +) + +# tts_node = tts() +# tts_node.consume_text(agent.get_response_observable()) + +robot_skills.add(ObserveStream) +robot_skills.add(KillSkill) +robot_skills.add(NavigateWithText) +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("NavigateWithText", 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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") +print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") + +web_interface.run() \ No newline at end of file diff --git a/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py new file mode 100644 index 0000000000..547ee7e139 --- /dev/null +++ b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py @@ -0,0 +1,186 @@ +import os +import sys +import time +import cv2 +import numpy as np +import queue +import threading +import json +from reactivex import Subject, operators as RxOps +from openai import OpenAI +import tests.test_header + +from dimos.stream.video_provider import VideoProvider +from dimos.perception.object_tracker import ObjectTrackingStream +from dimos.models.qwen.video_query import get_bbox_from_qwen +from dimos.utils.logging_config import logger + +# 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") \ No newline at end of file diff --git a/tests/agent_manip_flow_fastapi_test.py b/tests/agent_manip_flow_fastapi_test.py index d9bc9ef2f9..d802dd5663 100644 --- a/tests/agent_manip_flow_fastapi_test.py +++ b/tests/agent_manip_flow_fastapi_test.py @@ -19,7 +19,7 @@ from reactivex.scheduler import ThreadPoolScheduler, CurrentThreadScheduler, ImmediateScheduler # Local application imports -from dimos.agents.agent import OpenAIAgent +from dimos.agents.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 @@ -28,6 +28,7 @@ # Load environment variables load_dotenv() + def main(): """ Initializes and runs the video processing pipeline with web server output. @@ -42,7 +43,9 @@ def main(): """ disposables = CompositeDisposable() - processor = FrameProcessor(output_dir=f"{os.getcwd()}/assets/output/frames", delete_on_init=True) + 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) @@ -53,14 +56,16 @@ def main(): 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" + "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]) + 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), @@ -86,37 +91,39 @@ def main(): vops.with_jpeg_export(processor, suffix="edge"), ) - optical_flow_relevancy_stream_obs = processor.process_stream_optical_flow_with_relevancy(video_stream_obs) + 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(f"Optical Flow Passed Threshold.")), - vops.with_jpeg_export(processor, suffix="optical") + vops.with_jpeg_export(processor, suffix="optical"), ) # - # ====== Agent Orchastrator (Qu.s Awareness, Temporality, Routing) ====== + # ====== Agent Orchastrator (Qu.s Awareness, Temporality, Routing) ====== # # Agent 1 # my_agent = OpenAIAgent( - # "Agent 1", + # "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", + # "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 ====== + # ====== Create and start the FastAPI server ====== # - + # Will be visible at http://[host]:[port]/video_feed/[key] streams = { "video_one": video_stream_obs, @@ -127,6 +134,6 @@ def main(): 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 index e7cf0cfb61..aecf4049a5 100644 --- a/tests/agent_manip_flow_flask_test.py +++ b/tests/agent_manip_flow_flask_test.py @@ -20,7 +20,7 @@ from reactivex.scheduler import ThreadPoolScheduler, CurrentThreadScheduler, ImmediateScheduler # Local application imports -from dimos.agents.agent import PromptBuilder, OpenAIAgent +from dimos.agents.agent import PromptBuilder, OpenAIAgent from dimos.stream.frame_processor import FrameProcessor from dimos.stream.video_operators import VideoOperators as vops from dimos.stream.video_provider import VideoProvider @@ -31,6 +31,7 @@ app = Flask(__name__) + def main(): """ Initializes and runs the video processing pipeline with web server output. @@ -45,7 +46,9 @@ def main(): """ disposables = CompositeDisposable() - processor = FrameProcessor(output_dir=f"{os.getcwd()}/assets/output/frames", delete_on_init=True) + 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) @@ -58,7 +61,7 @@ def main(): 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" + f"{os.getcwd()}/assets/people_1080p_24fps.mp4", ] VIDEO_SOURCE_INDEX = 4 @@ -85,28 +88,28 @@ def main(): # 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") + # vops.with_jpeg_export(processor, suffix="optical") ) # - # ====== Agent Orchastrator (Qu.s Awareness, Temporality, Routing) ====== + # ====== 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.map(lambda x: f"Second {x + 1}"), # ops.take(30) ) # Agent 1 my_agent = OpenAIAgent( - "Agent 1", + "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 + 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. + + # 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), @@ -118,20 +121,20 @@ def main(): 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", + "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), @@ -143,7 +146,6 @@ def main(): ai_2_repeat_obs = ai_2_obs.pipe(ops.repeat()) - # Combine emissions using zip ai_1_secondly_repeating_obs = zip(secondly_emission, ai_1_repeat_obs).pipe( # ops.do_action(lambda s: print(f"AI 1 - Emission Count: {s[0]}")), @@ -156,12 +158,11 @@ def main(): 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 ====== + # ====== Create and start the Flask server ====== # # Will be visible at http://[host]:[port]/video_feed/[key] @@ -172,9 +173,9 @@ def main(): 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 index 5ebe40e5d7..e77cbc2821 100644 --- a/tests/agent_memory_test.py +++ b/tests/agent_memory_test.py @@ -44,4 +44,4 @@ 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).") \ No newline at end of file +print("Done querying agent memory (n_results=19, similarity_threshold=0.45).") diff --git a/tests/data/.lfs/ab_lidar_frames.tar.gz b/tests/data/.lfs/ab_lidar_frames.tar.gz new file mode 100644 index 0000000000..38c61cd506 --- /dev/null +++ b/tests/data/.lfs/ab_lidar_frames.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:ab4efaf5d7d4303424868fecaf10083378007adf20244fd17ed934e37f2996da +size 116271 diff --git a/tests/data/.lfs/cafe.jpg.tar.gz b/tests/data/.lfs/cafe.jpg.tar.gz new file mode 100644 index 0000000000..dbb2d970a1 --- /dev/null +++ b/tests/data/.lfs/cafe.jpg.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:b8cf30439b41033ccb04b09b9fc8388d18fb544d55b85c155dbf85700b9e7603 +size 136165 diff --git a/tests/data/.lfs/office_lidar.tar.gz b/tests/data/.lfs/office_lidar.tar.gz new file mode 100644 index 0000000000..849e9e3d49 --- /dev/null +++ b/tests/data/.lfs/office_lidar.tar.gz @@ -0,0 +1,3 @@ +version https://git-lfs.github.com/spec/v1 +oid sha256:f4958965334660c4765553afa38081f00a769c8adf81e599e63fabc866c490fd +size 28576272 diff --git a/tests/genesissim/stream_camera.py b/tests/genesissim/stream_camera.py index c7a439232f..4a820851cf 100644 --- a/tests/genesissim/stream_camera.py +++ b/tests/genesissim/stream_camera.py @@ -1,27 +1,19 @@ import os 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' - } + {"type": "primitive", "params": {"shape": "plane"}}, + {"type": "mjcf", "path": "xml/franka_emika_panda/panda.xml"}, ] # Initialize simulator - sim = GenesisSimulator( - headless=True, - entities=entities - ) + 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]) - + 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, @@ -29,11 +21,11 @@ def main(): 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" + annotator_type="rgb", # Can be 'rgb' or 'normals' + transport="tcp", + rtsp_url="rtsp://mediamtx:8554/stream", ) - + # Start streaming try: stream.stream() @@ -45,5 +37,6 @@ def main(): finally: sim.close() + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/tests/isaacsim/stream_camera.py b/tests/isaacsim/stream_camera.py index 31952dc671..a6eecd93d9 100644 --- a/tests/isaacsim/stream_camera.py +++ b/tests/isaacsim/stream_camera.py @@ -2,10 +2,11 @@ from dimos.simulation.isaac import IsaacSimulator from dimos.simulation.isaac import IsaacStream + def main(): # Initialize simulator sim = IsaacSimulator(headless=True) - + # Create stream with custom settings stream = IsaacStream( simulator=sim, @@ -13,14 +14,15 @@ def main(): 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', + annotator_type="rgb", + transport="tcp", rtsp_url="rtsp://mediamtx:8554/stream", - usd_path=f"{os.getcwd()}/assets/TestSim3.usda" + usd_path=f"{os.getcwd()}/assets/TestSim3.usda", ) - + # Start streaming stream.stream() + if __name__ == "__main__": main() diff --git a/tests/run.py b/tests/run.py index d62c3a1103..4c4bfc036e 100644 --- a/tests/run.py +++ b/tests/run.py @@ -43,21 +43,31 @@ # 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('--new-memory', action='store_true', help='Create a new spatial memory from scratch') - parser.add_argument('--spatial-memory-dir', type=str, help='Directory for storing spatial memory data') + parser = argparse.ArgumentParser( + description="Run the robot with optional spatial memory parameters" + ) + parser.add_argument( + "--new-memory", action="store_true", help="Create a new spatial memory from scratch" + ) + parser.add_argument( + "--spatial-memory-dir", type=str, help="Directory for storing spatial memory data" + ) 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, - spatial_memory_dir=args.spatial_memory_dir, # Will use default if None - new_memory=args.new_memory, # Create a new memory if specified - mode = "ai") +robot = UnitreeGo2( + ip=os.getenv("ROBOT_IP"), + skills=MyUnitreeSkills(), + mock_connection=False, + spatial_memory_dir=args.spatial_memory_dir, # Will use default if None + new_memory=args.new_memory, # Create a new memory if specified + mode="ai", +) # Create a subject for agent responses agent_response_subject = rx.subject.Subject() @@ -79,7 +89,7 @@ def parse_arguments(): class_filter=class_filter, transform_to_map=robot.ros_control.transform_pose, detector=detector, - video_stream=video_stream + video_stream=video_stream, ) # Create visualization stream for web interface @@ -94,12 +104,13 @@ def parse_arguments(): 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: @@ -108,22 +119,22 @@ def combine_with_locations(object_detections): 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() -) +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} +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, } @@ -145,7 +156,7 @@ def combine_with_locations(object_detections): skills=robot.get_skills(), system_query="What do you see", model_name="claude-3-7-sonnet-latest", - thinking_budget_tokens=0 + thinking_budget_tokens=0, ) # tts_node = tts() @@ -168,11 +179,9 @@ def combine_with_locations(object_detections): 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) -) +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() \ No newline at end of file +web_interface.run() diff --git a/tests/run_go2_ros.py b/tests/run_go2_ros.py index 459fa54b0c..2fcc74dcb1 100644 --- a/tests/run_go2_ros.py +++ b/tests/run_go2_ros.py @@ -6,10 +6,11 @@ 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 == '': + if value == "": value = default if required and not value: raise ValueError(f"{var_name} environment variable is required") @@ -21,8 +22,7 @@ def get_env_var(var_name, default=None, required=False): 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")) + 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) @@ -45,16 +45,17 @@ def get_env_var(var_name, default=None, required=False): 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) + 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...") @@ -72,14 +73,15 @@ def handle_frame(frame): 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}") + # 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): @@ -94,7 +96,8 @@ def handle_completion(): subscription = processed_stream.subscribe( on_next=handle_frame, on_error=lambda e: print(f"Subscription error: {e}"), - on_completed=lambda: print("Subscription completed")) + on_completed=lambda: print("Subscription completed"), + ) print("Subscription created successfully") except Exception as e: print(f"Error creating subscription: {e}") @@ -109,38 +112,37 @@ def handle_completion(): print("\n🤖 QUEUEING WEBRTC COMMANDS BACK-TO-BACK FOR TESTING UnitreeGo2🤖\n") # Dance 1 - robot.webrtc_req(api_id=1033) + 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) + 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) + 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) + 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.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) + robot.spin(degrees=90.0, speed=45.0) print("Queued: Spin left 90 degrees at 45 degrees/s") # To prevent termination @@ -149,14 +151,14 @@ def handle_completion(): except KeyboardInterrupt: print("\nStopping perception...") - if 'subscription' in locals(): + 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(): + 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 index 0b7f64bac9..a5506f820a 100644 --- a/tests/simple_agent_test.py +++ b/tests/simple_agent_test.py @@ -7,19 +7,19 @@ import os # Initialize robot -robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills()) +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!" - ) + 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...") \ No newline at end of file + print("\nExiting...") diff --git a/tests/test_agent.py b/tests/test_agent.py index d05b18bb34..1319533d78 100644 --- a/tests/test_agent.py +++ b/tests/test_agent.py @@ -6,6 +6,7 @@ from dotenv import load_dotenv + # Sanity check for dotenv def test_dotenv(): print("test_dotenv:") @@ -13,9 +14,11 @@ def test_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( @@ -38,5 +41,6 @@ def test_openai_connection(): ) 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 index 6d39efe85a..9519387b7b 100644 --- a/tests/test_agent_alibaba.py +++ b/tests/test_agent_alibaba.py @@ -32,9 +32,9 @@ # 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'), - ) + base_url="https://dashscope-intl.aliyuncs.com/compatible-mode/v1", + api_key=os.getenv("ALIBABA_API_KEY"), +) # Initialize Unitree skills myUnitreeSkills = MyUnitreeSkills() @@ -42,18 +42,18 @@ # 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, - ) + 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...") \ No newline at end of file + print("\nExiting...") diff --git a/tests/test_agent_ctransformers_gguf.py b/tests/test_agent_ctransformers_gguf.py index a48fa3c68e..6cd3405239 100644 --- a/tests/test_agent_ctransformers_gguf.py +++ b/tests/test_agent_ctransformers_gguf.py @@ -35,10 +35,10 @@ agent.run_observable_query(test_query).subscribe( on_next=lambda response: print(f"One-off query response: {response}"), on_error=lambda error: print(f"Error: {error}"), - on_completed=lambda: print("Query completed") + on_completed=lambda: print("Query completed"), ) try: input("Press ESC to exit...") except KeyboardInterrupt: - print("\nExiting...") \ No newline at end of file + print("\nExiting...") diff --git a/tests/test_agent_huggingface_local.py b/tests/test_agent_huggingface_local.py index d94b6a0470..4c4536a197 100644 --- a/tests/test_agent_huggingface_local.py +++ b/tests/test_agent_huggingface_local.py @@ -42,7 +42,7 @@ # Initialize agent agent = HuggingFaceLocalAgent( dev_name="HuggingFaceLLMAgent", - model_name= "Qwen/Qwen2.5-3B", + model_name="Qwen/Qwen2.5-3B", agent_type="HF-LLM", system_query=system_query, input_query_stream=query_provider.data_stream, @@ -59,14 +59,14 @@ # 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}; User: travel forward by 10 meters", + query_template="{query}; User: travel forward by 10 meters", frequency=10, start_count=1, end_count=10000, - step=1) + step=1, +) try: input("Press ESC to exit...") except KeyboardInterrupt: - print("\nExiting...") \ No newline at end of file + print("\nExiting...") diff --git a/tests/test_agent_huggingface_local_jetson.py b/tests/test_agent_huggingface_local_jetson.py index eb260dcc90..6d29b3903f 100644 --- a/tests/test_agent_huggingface_local_jetson.py +++ b/tests/test_agent_huggingface_local_jetson.py @@ -43,7 +43,7 @@ agent = HuggingFaceLocalAgent( dev_name="HuggingFaceLLMAgent", model_name="Qwen/Qwen2.5-0.5B", - #model_name="HuggingFaceTB/SmolLM2-135M", + # model_name="HuggingFaceTB/SmolLM2-135M", agent_type="HF-LLM", system_query=system_query, input_query_stream=query_provider.data_stream, @@ -60,12 +60,12 @@ # 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}; User: Hello how are you!", + query_template="{query}; User: Hello how are you!", frequency=30, start_count=1, end_count=10000, - step=1) + step=1, +) try: input("Press ESC to exit...") diff --git a/tests/test_agent_huggingface_remote.py b/tests/test_agent_huggingface_remote.py index dd533b2e78..7129523bf0 100644 --- a/tests/test_agent_huggingface_remote.py +++ b/tests/test_agent_huggingface_remote.py @@ -39,26 +39,26 @@ # Initialize agent agent = HuggingFaceRemoteAgent( - dev_name="HuggingFaceRemoteAgent", - model_name="meta-llama/Meta-Llama-3-8B-Instruct", - tokenizer=HuggingFaceTokenizer(model_name="meta-llama/Meta-Llama-3-8B-Instruct"), - max_output_tokens_per_request=8192, - input_query_stream=query_provider.data_stream, - # input_video_stream=video_stream, - system_query="You are a helpful assistant that can answer questions and help with tasks.", - ) + dev_name="HuggingFaceRemoteAgent", + model_name="meta-llama/Meta-Llama-3-8B-Instruct", + tokenizer=HuggingFaceTokenizer(model_name="meta-llama/Meta-Llama-3-8B-Instruct"), + max_output_tokens_per_request=8192, + input_query_stream=query_provider.data_stream, + # input_video_stream=video_stream, + system_query="You are a helpful assistant that can answer questions and help with tasks.", +) # Start the query stream. # Queries will be pushed every 1 second, in a count from 100 to 5000. 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.", + 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.", frequency=5, start_count=1, end_count=10000, - step=1) + step=1, +) try: input("Press ESC to exit...") except KeyboardInterrupt: - print("\nExiting...") \ No newline at end of file + print("\nExiting...") diff --git a/tests/test_audio_agent.py b/tests/test_audio_agent.py index debdee11a6..61c30031fb 100644 --- a/tests/test_audio_agent.py +++ b/tests/test_audio_agent.py @@ -5,7 +5,6 @@ def main(): - stt_node = stt() agent = OpenAIAgent( diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index b389f885ea..0304b0272d 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -14,6 +14,7 @@ import sys import os +from dimos.robot.robot import MockRobot import tests.test_header import time @@ -38,32 +39,36 @@ # Load API key from environment load_dotenv() -robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - mock_connection=False) +robot = MockRobot() + +# 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()) +# 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} +# 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=5556, text_streams=text_streams, **streams) +web_interface = RobotWebInterface(port=5556, text_streams=text_streams,) + +# stt_node = stt() +robot_skills = MyUnitreeSkills() -stt_node = stt() # Create a CerebrasAgent instance agent = CerebrasAgent( dev_name="test_cerebras_agent", - input_query_stream=stt_node.emit_text(), - # input_query_stream=web_interface.query_stream, - skills=robot.get_skills(), + # input_query_stream=stt_node.emit_text(), + input_query_stream=web_interface.query_stream, + skills=robot_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: @@ -76,16 +81,15 @@ model_name="llama-4-scout-17b-16e-instruct" ) -tts_node = tts() +# 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(NavigateWithText) robot_skills.add(FollowHuman) robot_skills.add(GetPose) -robot_skills.add(Speak) +# 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) @@ -93,34 +97,14 @@ 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) +# 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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") +# print(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") -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() \ No newline at end of file diff --git a/tests/test_claude_agent_query.py b/tests/test_claude_agent_query.py index 96319d760b..aabd85bc12 100644 --- a/tests/test_claude_agent_query.py +++ b/tests/test_claude_agent_query.py @@ -21,12 +21,9 @@ load_dotenv() # Create a ClaudeAgent instance -agent = ClaudeAgent( - dev_name="test_agent", - query="What is the capital of France?" -) +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}") \ No newline at end of file +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 index 2f1e34ec73..1aaeb795f1 100644 --- a/tests/test_claude_agent_skills_query.py +++ b/tests/test_claude_agent_skills_query.py @@ -37,18 +37,22 @@ # Load API key from environment load_dotenv() -robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - mock_connection=False) +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} +streams = { + "unitree_video": robot.get_ros_video_stream(), + "local_planner_viz": local_planner_viz_stream, +} text_streams = { "agent_responses": agent_response_stream, } @@ -73,7 +77,7 @@ 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 + thinking_budget_tokens=2000, ) tts_node = tts() @@ -100,9 +104,7 @@ 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) -) +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") @@ -120,11 +122,14 @@ def msg_handler(msgtype, data): 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 index 2311593a28..0537f5c446 100644 --- a/tests/test_command_pose_unitree.py +++ b/tests/test_command_pose_unitree.py @@ -1,5 +1,6 @@ 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__)))) @@ -11,9 +12,10 @@ import math # Initialize robot -robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills()) +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): @@ -21,7 +23,8 @@ def send_pose_for_duration(roll, pitch, yaw, duration, hz=10): 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 + time.sleep(1.0 / hz) # Sleep to achieve the desired frequency + # Test pose commands @@ -62,4 +65,4 @@ def send_pose_for_duration(roll, pitch, yaw, duration, hz=10): while True: time.sleep(1) except KeyboardInterrupt: - print("Test terminated by user") \ No newline at end of file + print("Test terminated by user") diff --git a/tests/test_header.py b/tests/test_header.py index 8ae057208d..48ea6dd509 100644 --- a/tests/test_header.py +++ b/tests/test_header.py @@ -26,31 +26,33 @@ # 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 "= self.print_interval: self.last_print_time = current_time - + if not objects: print("\n[No objects detected]") return - - print("\n" + "="*50) + + print("\n" + "=" * 50) print(f"Detected {len(objects)} objects at {time.strftime('%H:%M:%S')}:") - print("="*50) - + 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"{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['yaw']:.2f} rad") print(f" Size: width={size['width']:.2f}, height={size['height']:.2f} m") @@ -70,7 +82,7 @@ def print_results(self, objects: List[Dict[str, Any]]): def main(): # Get command line arguments args = parse_args() - + # Set up the result printer for console output result_printer = ResultPrinter(print_interval=1.0) @@ -78,20 +90,20 @@ def main(): 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') + 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, @@ -108,99 +120,92 @@ def main(): class_filter=class_filter, transform_to_map=robot.ros_control.transform_pose, detector=detector, - video_stream=video_stream + 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) - + 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)) + 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 + 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 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 + 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 - ) - + 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: @@ -209,16 +214,16 @@ def on_completed(): # 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(): + if "video_provider" in locals(): video_provider.dispose_all() - + print("Test completed") diff --git a/tests/test_object_tracking_webcam.py b/tests/test_object_tracking_webcam.py index e72912ed93..ed72d76e34 100644 --- a/tests/test_object_tracking_webcam.py +++ b/tests/test_object_tracking_webcam.py @@ -16,20 +16,21 @@ 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 @@ -40,49 +41,49 @@ def mouse_callback(event, x, y, flags, param): # 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)) + 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_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) + 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(): @@ -90,55 +91,74 @@ def on_next(result): # 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) - + 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) - + 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 + 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}) - + 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 @@ -149,35 +169,35 @@ def on_completed(): 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'): + 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'): + 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() @@ -185,4 +205,4 @@ def on_completed(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/tests/test_object_tracking_with_qwen.py b/tests/test_object_tracking_with_qwen.py index 547ee7e139..c2cb004f90 100644 --- a/tests/test_object_tracking_with_qwen.py +++ b/tests/test_object_tracking_with_qwen.py @@ -29,7 +29,7 @@ # 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_width_mm = 4.8 # mm (1/4" sensor) sensor_height_mm = 3.6 # mm # Calculate focal length in pixels @@ -43,9 +43,7 @@ # 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 + camera_intrinsics=camera_intrinsics, camera_pitch=0.0, camera_height=0.5 ) # Create video streams @@ -53,8 +51,11 @@ 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.") +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): @@ -64,38 +65,55 @@ def on_next(result): # 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) - + 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) - + 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) - + 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 @@ -105,14 +123,12 @@ def on_completed(): 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 + 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 @@ -129,14 +145,14 @@ def detection_task(): 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() @@ -150,37 +166,37 @@ def detection_task(): # 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'): + 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'): + 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") \ No newline at end of file + print("Cleanup complete") diff --git a/tests/test_observe_stream_skill.py b/tests/test_observe_stream_skill.py index d0b87d4ff7..10532c8d2e 100644 --- a/tests/test_observe_stream_skill.py +++ b/tests/test_observe_stream_skill.py @@ -23,32 +23,28 @@ from dimos.web.robot_web_interface import RobotWebInterface from dimos.utils.logging_config import setup_logger import tests.test_header + logger = setup_logger("tests.test_observe_stream_skill") load_dotenv() + def main(): # Initialize the robot with mock connection for testing robot = UnitreeGo2( - ip=os.getenv('ROBOT_IP', '192.168.123.161'), - skills=MyUnitreeSkills(), - mock_connection=True + ip=os.getenv("ROBOT_IP", "192.168.123.161"), skills=MyUnitreeSkills(), mock_connection=True ) - + agent_response_subject = rx.subject.Subject() agent_response_stream = agent_response_subject.pipe(ops.share()) - + streams = {"unitree_video": robot.get_ros_video_stream()} text_streams = { "agent_responses": agent_response_stream, } - - web_interface = RobotWebInterface( - port=5555, - text_streams=text_streams, - **streams - ) - + + web_interface = RobotWebInterface(port=5555, text_streams=text_streams, **streams) + agent = ClaudeAgent( dev_name="test_agent", input_query_stream=web_interface.query_stream, @@ -57,62 +53,65 @@ def main(): When you see an image, describe what you see and alert if you notice any people or important changes. Be concise but thorough in your observations.""", model_name="claude-3-7-sonnet-latest", - thinking_budget_tokens=10000 - ) - - agent.get_response_observable().subscribe( - lambda x: agent_response_subject.on_next(x) + thinking_budget_tokens=10000, ) - + + agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) + robot_skills = robot.get_skills() - + robot_skills.add(ObserveStream) robot_skills.add(KillSkill) - + robot_skills.create_instance("ObserveStream", robot=robot, agent=agent) robot_skills.create_instance("KillSkill", skill_library=robot_skills) - + web_interface_thread = threading.Thread(target=web_interface.run) web_interface_thread.daemon = True web_interface_thread.start() - + logger.info("Starting monitor skill...") - + memory_file = os.path.join(agent.output_dir, "memory.txt") with open(memory_file, "a") as f: - f.write("SKILL CALL: ObserveStream(timestep=10.0, query_text='What do you see in this image? Alert me if you see any people.', max_duration=120.0)") - - result = robot_skills.call("ObserveStream", - timestep=10.0, # 20 seconds between monitoring queries - query_text="What do you see in this image? Alert me if you see any people.", - max_duration=120.0) # Run for 120 seconds + f.write( + "SKILL CALL: ObserveStream(timestep=10.0, query_text='What do you see in this image? Alert me if you see any people.', max_duration=120.0)" + ) + + result = robot_skills.call( + "ObserveStream", + timestep=10.0, # 20 seconds between monitoring queries + query_text="What do you see in this image? Alert me if you see any people.", + max_duration=120.0, + ) # Run for 120 seconds logger.info(f"Monitor skill result: {result}") - + logger.info(f"Running skills: {robot_skills.get_running_skills().keys()}") - + try: logger.info("Observer running. Will stop after 35 seconds...") time.sleep(20.0) logger.info(f"Running skills before kill: {robot_skills.get_running_skills().keys()}") logger.info("Killing the observer skill...") - + memory_file = os.path.join(agent.output_dir, "memory.txt") with open(memory_file, "a") as f: f.write("\n\nSKILL CALL: KillSkill(skill_name='observer')\n\n") - + kill_result = robot_skills.call("KillSkill", skill_name="observer") logger.info(f"Kill skill result: {kill_result}") - + logger.info(f"Running skills after kill: {robot_skills.get_running_skills().keys()}") - + # Keep test running until user interrupts while True: time.sleep(1.0) except KeyboardInterrupt: logger.info("Test interrupted by user") - + logger.info("Test completed") + if __name__ == "__main__": main() diff --git a/tests/test_person_following_robot.py b/tests/test_person_following_robot.py index 22a51e0670..c082cb1b57 100644 --- a/tests/test_person_following_robot.py +++ b/tests/test_person_following_robot.py @@ -16,12 +16,12 @@ 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'), + ip=os.getenv("ROBOT_IP"), ros_control=UnitreeROSControl(), skills=MyUnitreeSkills(), ) @@ -33,58 +33,59 @@ def main(): 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 - ) - + 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 - + 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 + 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}") + 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 + 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: diff --git a/tests/test_person_following_webcam.py b/tests/test_person_following_webcam.py index 09ca7f9319..11d2739504 100644 --- a/tests/test_person_following_webcam.py +++ b/tests/test_person_following_webcam.py @@ -17,52 +17,50 @@ def main(): 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 + 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 + 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(): @@ -71,63 +69,61 @@ def on_next(result): # 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 + 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 @@ -136,56 +132,79 @@ def mouse_callback(event, x, y, flags, param): 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 - + + 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) - + 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'): + 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'): + 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() diff --git a/tests/test_planning_agent_web_interface.py b/tests/test_planning_agent_web_interface.py index 46f58c9e4e..68bc711075 100644 --- a/tests/test_planning_agent_web_interface.py +++ b/tests/test_planning_agent_web_interface.py @@ -27,18 +27,19 @@ from dimos.robot.unitree.unitree_go2 import UnitreeGo2 from dimos.robot.unitree.unitree_skills import MyUnitreeSkills from dimos.utils.logging_config import logger + # from dimos.web.fastapi_server import FastAPIServer from dimos.web.robot_web_interface import RobotWebInterface from dimos.utils.threadpool import make_single_thread_scheduler + 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")) + connection_method = os.getenv("CONN_TYPE") or "webrtc" + output_dir = os.getenv("ROS_OUTPUT_DIR", os.path.join(os.getcwd(), "assets/output/ros")) # Initialize components as None for proper cleanup robot = None @@ -49,11 +50,13 @@ def main(): try: # Initialize robot logger.info("Initializing Unitree Robot") - robot = UnitreeGo2(ip=robot_ip, - connection_method=connection_method, - output_dir=output_dir, - mock_connection=False, - skills=MyUnitreeSkills()) + robot = UnitreeGo2( + ip=robot_ip, + connection_method=connection_method, + output_dir=output_dir, + mock_connection=False, + skills=MyUnitreeSkills(), + ) # Set up video stream logger.info("Starting video stream") video_stream = robot.get_ros_video_stream() @@ -65,10 +68,10 @@ def main(): logger.info("Creating response streams") planner_response_subject = rx.subject.Subject() planner_response_stream = planner_response_subject.pipe(ops.share()) - + executor_response_subject = rx.subject.Subject() executor_response_stream = executor_response_subject.pipe(ops.share()) - + # Web interface mode with FastAPI server logger.info("Initializing FastAPI server") streams = {"unitree_video": video_stream} @@ -76,36 +79,33 @@ def main(): "planner_responses": planner_response_stream, "executor_responses": executor_response_stream, } - - web_interface = RobotWebInterface( - port=5555, text_streams=text_streams, **streams) + + web_interface = RobotWebInterface(port=5555, text_streams=text_streams, **streams) logger.info("Starting planning agent with web interface") planner = PlanningAgent( dev_name="TaskPlanner", model_name="gpt-4o", input_query_stream=web_interface.query_stream, - skills=robot.get_skills() + skills=robot.get_skills(), ) - + # Get planner's response observable logger.info("Setting up agent response streams") planner_responses = planner.get_response_observable() - + # Connect planner to its subject - planner_responses.subscribe( - lambda x: planner_response_subject.on_next(x) - ) + planner_responses.subscribe(lambda x: planner_response_subject.on_next(x)) planner_responses.subscribe( on_next=lambda x: logger.info(f"Planner response: {x}"), on_error=lambda e: logger.error(f"Planner error: {e}"), - on_completed=lambda: logger.info("Planner completed") + on_completed=lambda: logger.info("Planner completed"), ) - + # Initialize execution agent with robot skills logger.info("Starting execution agent") - system_query=dedent( + system_query = dedent( """ You are a robot execution agent that can execute tasks on a virtual robot. The sole text you will be given is the task to execute. @@ -119,7 +119,7 @@ def main(): output_dir=output_dir, skills=robot.get_skills(), system_query=system_query, - pool_scheduler=make_single_thread_scheduler() + pool_scheduler=make_single_thread_scheduler(), ) # Get executor's response observable @@ -129,13 +129,11 @@ def main(): executor_responses.subscribe( on_next=lambda x: logger.info(f"Executor response: {x}"), on_error=lambda e: logger.error(f"Executor error: {e}"), - on_completed=lambda: logger.info("Executor completed") + on_completed=lambda: logger.info("Executor completed"), ) - + # Connect executor to its subject - executor_responses.subscribe( - lambda x: executor_response_subject.on_next(x) - ) + executor_responses.subscribe(lambda x: executor_response_subject.on_next(x)) # Start web server (blocking call) logger.info("Starting FastAPI server") diff --git a/tests/test_planning_robot_agent.py b/tests/test_planning_robot_agent.py index 3b7b95cea2..b2d27ba3a5 100644 --- a/tests/test_planning_robot_agent.py +++ b/tests/test_planning_robot_agent.py @@ -29,14 +29,14 @@ from dimos.web.robot_web_interface import RobotWebInterface from dimos.utils.threadpool import make_single_thread_scheduler + 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")) + connection_method = os.getenv("CONN_TYPE") or "webrtc" + output_dir = os.getenv("ROS_OUTPUT_DIR", os.path.join(os.getcwd(), "assets/output/ros")) use_terminal = os.getenv("USE_TERMINAL", "").lower() == "true" use_terminal = True @@ -49,10 +49,12 @@ def main(): try: # Initialize robot logger.info("Initializing Unitree Robot") - robot = UnitreeGo2(ip=robot_ip, - connection_method=connection_method, - output_dir=output_dir, - mock_connection=True) + robot = UnitreeGo2( + ip=robot_ip, + connection_method=connection_method, + output_dir=output_dir, + mock_connection=True, + ) # Set up video stream logger.info("Starting video stream") @@ -69,7 +71,7 @@ def main(): dev_name="TaskPlanner", model_name="gpt-4o", use_terminal=True, - skills=skills_instance + skills=skills_instance, ) else: # Web interface mode @@ -82,16 +84,16 @@ def main(): dev_name="TaskPlanner", model_name="gpt-4o", input_query_stream=web_interface.query_stream, - skills=skills_instance + skills=skills_instance, ) - + # Get planner's response observable logger.info("Setting up agent response streams") planner_responses = planner.get_response_observable() - + # Initialize execution agent with robot skills logger.info("Starting execution agent") - system_query=dedent( + system_query = dedent( """ You are a robot execution agent that can execute tasks on a virtual robot. You are given a task to execute and a list of skills that @@ -105,7 +107,7 @@ def main(): output_dir=output_dir, skills=skills_instance, system_query=system_query, - pool_scheduler=make_single_thread_scheduler() + pool_scheduler=make_single_thread_scheduler(), ) # Get executor's response observable @@ -115,7 +117,7 @@ def main(): executor_responses.subscribe( on_next=lambda x: logger.info(f"Executor response: {x}"), on_error=lambda e: logger.error(f"Executor error: {e}"), - on_completed=lambda: logger.info("Executor completed") + on_completed=lambda: logger.info("Executor completed"), ) if use_terminal: @@ -158,4 +160,4 @@ def main(): if __name__ == "__main__": sys.exit(main()) -# Example Task: Move the robot forward by 1 meter, then turn 90 degrees clockwise, then move backward by 1 meter, then turn a random angle counterclockwise, then repeat this sequence 5 times. \ No newline at end of file +# Example Task: Move the robot forward by 1 meter, then turn 90 degrees clockwise, then move backward by 1 meter, then turn a random angle counterclockwise, then repeat this sequence 5 times. diff --git a/tests/test_qwen_image_query.py b/tests/test_qwen_image_query.py index 6032430f2d..feaa8c0096 100644 --- a/tests/test_qwen_image_query.py +++ b/tests/test_qwen_image_query.py @@ -4,30 +4,32 @@ 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'): + 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") image = Image.open(image_path) - + # 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." + 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)" + 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() \ No newline at end of file + test_qwen_image_query() diff --git a/tests/test_robot.py b/tests/test_robot.py index b452100c85..011850b04e 100644 --- a/tests/test_robot.py +++ b/tests/test_robot.py @@ -9,19 +9,20 @@ from reactivex import operators as RxOps import tests.test_header + def main(): print("Initializing Unitree Go2 robot with local planner visualization...") - + # Initialize the robot with ROS control and skills robot = UnitreeGo2( - ip=os.getenv('ROBOT_IP'), + ip=os.getenv("ROBOT_IP"), ros_control=UnitreeROSControl(), skills=MyUnitreeSkills(), ) # Get the camera stream video_stream = robot.get_ros_video_stream() - + # The local planner visualization stream is created during robot initialization local_planner_stream = robot.local_planner_viz_stream @@ -30,21 +31,15 @@ def main(): RxOps.map(lambda x: x if x is not None else None), RxOps.filter(lambda x: x is not None), ) - + goal_following_thread = None try: # Set up web interface with both streams - streams = { - "camera": video_stream, - "local_planner": local_planner_stream - } - + streams = {"camera": video_stream, "local_planner": local_planner_stream} + # Create and start the web interface - web_interface = RobotWebInterface( - port=5555, - **streams - ) - + web_interface = RobotWebInterface(port=5555, **streams) + # Wait for initialization print("Waiting for camera and systems to initialize...") time.sleep(2) @@ -53,23 +48,18 @@ def main(): print("Starting navigation to local goal (2m ahead) in a separate thread...") goal_following_thread = threading.Thread( target=navigate_to_goal_local, - kwargs={ - 'robot': robot, - 'goal_xy_robot': (3.0, 0.0), - 'distance': 0.0, - 'timeout': 300 - }, - daemon=True + kwargs={"robot": robot, "goal_xy_robot": (3.0, 0.0), "distance": 0.0, "timeout": 300}, + daemon=True, ) goal_following_thread.start() print("Robot streams running") print("Web interface available at http://localhost:5555") print("Press Ctrl+C to exit") - + # Start web server (blocking call) web_interface.run() - + except KeyboardInterrupt: print("\nInterrupted by user") except Exception as e: diff --git a/tests/test_rtsp_video_provider.py b/tests/test_rtsp_video_provider.py index 0afa7b95cf..e3824740a6 100644 --- a/tests/test_rtsp_video_provider.py +++ b/tests/test_rtsp_video_provider.py @@ -36,17 +36,20 @@ # 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 + 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) + 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(f"Attempting to connect to provided RTSP URL.") provider = RtspVideoProvider(dev_name="TestRtspCam", rtsp_url=RTSP_URL) @@ -56,34 +59,40 @@ 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 +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 + 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 + 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 + 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 + 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( @@ -91,22 +100,16 @@ def handle_completion(): 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 -} +).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 +web_interface.run() # This may block the main thread # TODO: Redo disposal / keep-alive loop @@ -135,9 +138,9 @@ def handle_completion(): print("Cleanup finished.") # Final check (optional, for debugging) -time.sleep(1) # Give background threads a moment +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!") + print(f"WARNING: ffmpeg process (PID: {final_process.pid}) may still be running after cleanup!") else: - print("ffmpeg process appears terminated.") \ No newline at end of file + print("ffmpeg process appears terminated.") diff --git a/tests/test_semantic_seg_robot.py b/tests/test_semantic_seg_robot.py index 88f40b6755..eccc5dc84e 100644 --- a/tests/test_semantic_seg_robot.py +++ b/tests/test_semantic_seg_robot.py @@ -23,25 +23,29 @@ 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) + "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) - + # 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(): @@ -53,7 +57,7 @@ def on_next(segmentation): height, width = vis_frame.shape[:2] depth_height, depth_width = depth_viz.shape[:2] - # Resize depth visualization to match segmentation height + # 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)) @@ -63,7 +67,9 @@ def on_next(segmentation): # 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) + 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: @@ -71,18 +77,18 @@ def on_next(segmentation): 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 = { @@ -91,7 +97,6 @@ def on_completed(): "counts": {}, } - frame_processor = FrameProcessor(delete_on_init=True) subscription = segmentation_stream.pipe( MyOps.print_emission(id="A", **print_emission_args), @@ -101,7 +106,7 @@ def on_completed(): 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_"), + # MyVideoOps.with_jpeg_export(frame_processor=frame_processor, suffix="_frame_"), MyOps.print_emission(id="E", **print_emission_args), ) @@ -112,21 +117,21 @@ def on_completed(): } 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() \ No newline at end of file + main() diff --git a/tests/test_semantic_seg_robot_agent.py b/tests/test_semantic_seg_robot_agent.py index 527d1286a3..8aa102e16a 100644 --- a/tests/test_semantic_seg_robot_agent.py +++ b/tests/test_semantic_seg_robot_agent.py @@ -15,28 +15,29 @@ from dimos.agents.agent import OpenAIAgent from dimos.utils.threadpool import get_scheduler + 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) + "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) - + + 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=.5) - ) + video_stream.pipe(MyVideoOps.with_fps_sampling(fps=0.5)) ) - # Throttling to slowdown SegmentationAgent calls + # Throttling to slowdown SegmentationAgent calls # TODO: add Agent parameter to handle this called api_call_interval frame_processor = FrameProcessor(delete_on_init=True) @@ -57,25 +58,33 @@ def main(): 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."), + 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 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:]]), + 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( @@ -85,7 +94,7 @@ def main(): input_query_stream=enriched_query_stream, process_all_inputs=False, pool_scheduler=get_scheduler(), - skills=robot.get_skills() + skills=robot.get_skills(), ) agent_response_stream = segmentation_agent.get_response_observable() @@ -104,7 +113,7 @@ def main(): 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.query_stream.subscribe(lambda x: text_query_stream.on_next(x)) fast_api_server.run() except KeyboardInterrupt: print("\nKeyboard interrupt received. Stopping...") @@ -113,5 +122,6 @@ def main(): cv2.destroyAllWindows() print("Cleanup complete") + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/tests/test_semantic_seg_webcam.py b/tests/test_semantic_seg_webcam.py index 7e387ae597..444e4cd629 100644 --- a/tests/test_semantic_seg_webcam.py +++ b/tests/test_semantic_seg_webcam.py @@ -11,26 +11,29 @@ from dimos.stream.video_provider import VideoProvider from dimos.perception.semantic_seg import SemanticSegmentationStream + 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) + "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) - + 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(): @@ -43,7 +46,7 @@ def on_next(segmentation): height, width = vis_frame.shape[:2] depth_height, depth_width = depth_viz.shape[:2] - # Resize depth visualization to match segmentation height + # 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)) @@ -53,7 +56,9 @@ def on_next(segmentation): # 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) + 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: @@ -61,58 +66,56 @@ def on_next(segmentation): 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 + 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'): + 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'): + 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() @@ -120,4 +123,4 @@ def on_completed(): if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/tests/test_skills.py b/tests/test_skills.py index ae77facc38..0d4b7f2ff8 100644 --- a/tests/test_skills.py +++ b/tests/test_skills.py @@ -31,10 +31,10 @@ class TestSkill(AbstractSkill): _called: bool = False - def __init__(self, *args, **kwargs): + def __init__(self, *args, **kwargs): super().__init__(*args, **kwargs) self._called = False - + def __call__(self): self._called = True return "TestSkill executed successfully" @@ -48,31 +48,31 @@ def setUp(self): 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(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: @@ -80,7 +80,7 @@ def test_skill_registration(self): 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() @@ -88,19 +88,19 @@ def test_skill_direct_execution(self): 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: + 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): @@ -115,34 +115,34 @@ def setUp(self): 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 + skills=self.skill_library, ) - - @mock.patch('dimos.agents.agent.OpenAIAgent.run_observable_query') + + @mock.patch("dimos.agents.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.agent.OpenAIAgent.run_observable_query') + + @mock.patch.object(TestSkill, "__call__") + @mock.patch("dimos.agents.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 @@ -150,30 +150,31 @@ def test_agent_skill_execution(self, mock_query, mock_skill_call): 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) diff --git a/tests/test_skills_rest.py b/tests/test_skills_rest.py index 36ca9dc366..70a15fcfd5 100644 --- a/tests/test_skills_rest.py +++ b/tests/test_skills_rest.py @@ -54,21 +54,20 @@ 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 + 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) -) +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. +# +# Make a web request to nist to get the current time. # You should use http://worldclockapi.com/api/json/utc/now -# \ No newline at end of file +# diff --git a/tests/test_spatial_memory.py b/tests/test_spatial_memory.py index c520674b9f..b400749cb4 100644 --- a/tests/test_spatial_memory.py +++ b/tests/test_spatial_memory.py @@ -32,70 +32,67 @@ from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl from dimos.perception.spatial_perception import SpatialMemory + def extract_position(transform): """Extract position coordinates from a transform message""" if transform is None: return (0, 0, 0) - + pos = transform.transform.translation return (pos.x, pos.y, pos.z) + 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...") - + # Initialize ROS control and robot - ros_control = UnitreeROSControl( - node_name="spatial_memory_test", - mock_connection=False - ) - - robot = UnitreeGo2( - ros_control=ros_control, - ip=os.getenv('ROBOT_IP') - ) - + ros_control = UnitreeROSControl(node_name="spatial_memory_test", mock_connection=False) + + robot = UnitreeGo2(ros_control=ros_control, ip=os.getenv("ROBOT_IP")) + # Create counters for tracking frame_count = 0 transform_count = 0 stored_count = 0 - + print("Setting up video stream...") - video_stream = robot.get_ros_video_stream() - + video_stream = robot.get_ros_video_stream() + # Create transform stream at 1 Hz print("Setting up transform stream...") transform_stream = ros_control.get_transform_stream( child_frame="map", parent_frame="base_link", - rate_hz=1.0 # 1 transform per second + rate_hz=1.0, # 1 transform per second ) - + # 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: @@ -108,10 +105,10 @@ def main(): 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( @@ -119,167 +116,182 @@ def main(): 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 + 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_position(pair[1]) # Second element is the transform - }) + ops.map( + lambda pair: { + "frame": pair[0], # First element is the frame + "position": extract_position(pair[1]), # Second element is the transform + } + ) ) - + # 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 result.get('stored', True) == False: + if not result.get("stored", True) == False: stored_count += 1 - pos = result['position'] + pos = result["position"] print(f"\nStored frame #{stored_count} at ({pos[0]:.2f}, {pos[1]:.2f}, {pos[2]:.2f})") - + # Save the frame to the assets directory - if 'frame' in result: + 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']) + 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) + 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(): + 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" + 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}") - -def visualize_spatial_memory_with_objects(spatial_memory, objects, output_filename="spatial_memory_map.png"): + + +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'] - + 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 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) - + # 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') - + 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'] - + metadata = result["metadata"] + # Extract coordinates from the first metadata item 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) - + + if isinstance(metadata, dict) and "x" in metadata and "y" in metadata: + x = metadata.get("x", 0) + 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') - + 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: + 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() + 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.axis("equal") plt.legend() - + # Add origin circle - plt.gca().add_patch(Circle((0, 0), 1.0, fill=False, color='blue', linestyle='--')) - + 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 - + # Final cleanup print("Performing final cleanup...") spatial_memory.cleanup() - + try: robot.cleanup() except Exception as e: print(f"Error during robot cleanup: {e}") - + print("Test completed successfully") + if __name__ == "__main__": main() diff --git a/tests/test_spatial_memory_query.py b/tests/test_spatial_memory_query.py index 2919575428..a0e77e9444 100644 --- a/tests/test_spatial_memory_query.py +++ b/tests/test_spatial_memory_query.py @@ -19,6 +19,7 @@ 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 os import sys import argparse @@ -32,45 +33,59 @@ from dimos.perception.spatial_perception import SpatialMemory from dimos.agents.memory.visual_memory import VisualMemory + 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") + 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): @@ -79,40 +94,41 @@ def main(): 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 + 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" + "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" + 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}") @@ -120,153 +136,162 @@ def main(): 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) + 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) + 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', {}) + 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"\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) + 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: + if "timestamp" in metadata: print(f"Timestamp: {metadata['timestamp']}") - if 'frame_id' in metadata: + 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: + 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" - + 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: + 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('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"): + +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'] - + 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) - + # Create figure plt.figure(figsize=(12, 10)) - plt.scatter(x_coords, y_coords, c='blue', s=50, alpha=0.5, label='All Frames') - + 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'] - + 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) - + + 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') - + 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() + 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.axis("equal") plt.legend() - + # Add origin marker - plt.gca().add_patch(plt.Circle((0, 0), 1.0, fill=False, color='blue', linestyle='--')) - + 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 index da9ef9e691..067303b572 100644 --- a/tests/test_standalone_chromadb.py +++ b/tests/test_standalone_chromadb.py @@ -24,6 +24,7 @@ embedding_function=embeddings, ) + def add_vector(vector_id, vector_data): """Add a vector to the ChromaDB collection.""" if not db_connection: @@ -34,6 +35,7 @@ def add_vector(vector_id, vector_data): metadatas=[{"name": vector_id}], ) + add_vector("id0", "Food") add_vector("id1", "Cat") add_vector("id2", "Mouse") @@ -50,22 +52,22 @@ def add_vector(vector_id, vector_data): def get_vector(vector_id): """Retrieve a vector from the ChromaDB by its identifier.""" - result = db_connection.get(include=['embeddings'], ids=[vector_id]) + 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 - ) + 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 index 86775930a1..8cfec64ae0 100644 --- a/tests/test_standalone_fastapi.py +++ b/tests/test_standalone_fastapi.py @@ -2,6 +2,7 @@ import os import logging + logging.basicConfig(level=logging.DEBUG) from fastapi import FastAPI, Response @@ -11,25 +12,29 @@ app = FastAPI() -# Note: Chrome does not allow for loading more than 6 simultaneous -# video streams. Use Safari or another browser for utilizing +# 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 + 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') + yield (b"--frame\r\nContent-Type: text/plain\r\n\r\n" + b"Could not open video source\r\n") return try: @@ -38,20 +43,25 @@ def video_stream_generator(): # 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) + 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\n' - b'Content-Type: image/jpeg\r\n\r\n' + buffer.tobytes() + b'\r\n') + _, 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') + 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 index baa81f0d2d..d0b2e68e61 100644 --- a/tests/test_standalone_hugging_face.py +++ b/tests/test_standalone_hugging_face.py @@ -129,25 +129,19 @@ from huggingface_hub import InferenceClient # Use environment variable for API key -api_key = os.getenv('HUGGINGFACE_ACCESS_TOKEN') +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\"" - } -] +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, + 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 index dd6e4b9bbf..c4531808fb 100644 --- a/tests/test_standalone_openai_json.py +++ b/tests/test_standalone_openai_json.py @@ -4,6 +4,7 @@ # ----- import dotenv + dotenv.load_dotenv() import json @@ -13,18 +14,19 @@ MODEL = "gpt-4o-2024-08-06" -math_tutor_prompt = ''' +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 = ''' +bad_prompt = """ Follow the instructions. -''' +""" client = OpenAI() + class MathReasoning(BaseModel): class Step(BaseModel): explanation: str @@ -33,6 +35,7 @@ class Step(BaseModel): steps: list[Step] final_answer: str + def get_math_solution(question: str): completion = client.beta.chat.completions.parse( model=MODEL, @@ -44,6 +47,7 @@ def get_math_solution(question: str): ) return completion.choices[0].message + # Web Server import http.server import socketserver @@ -51,6 +55,7 @@ def get_math_solution(question: str): PORT = 5555 + class CustomHandler(http.server.SimpleHTTPRequestHandler): def do_GET(self): # Parse query parameters from the URL @@ -58,27 +63,32 @@ def do_GET(self): 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 + 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."}) + 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.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 index 27d11fc964..88301728c0 100644 --- a/tests/test_standalone_openai_json_struct.py +++ b/tests/test_standalone_openai_json_struct.py @@ -6,6 +6,7 @@ from typing import List, Union, Dict import dotenv + dotenv.load_dotenv() from textwrap import dedent @@ -14,18 +15,19 @@ MODEL = "gpt-4o-2024-08-06" -math_tutor_prompt = ''' +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 = ''' +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 @@ -34,6 +36,7 @@ class Step(BaseModel): steps: list[Step] final_answer: str + def get_math_solution(question: str): prompt = general_prompt completion = client.beta.chat.completions.parse( @@ -46,6 +49,7 @@ def get_math_solution(question: str): ) return completion.choices[0].message + # Define Problem problem = "What is the derivative of 3x^2" print(f"Problem: {problem}") @@ -63,7 +67,7 @@ def get_math_solution(question: str): if not parsed_solution: print(f"Unable to Parse Solution") exit() - + # Print solution from class definitions print(f"Parsed: {parsed_solution}") diff --git a/tests/test_standalone_openai_json_struct_func.py b/tests/test_standalone_openai_json_struct_func.py index 5d5e67cd23..fe6bb21844 100644 --- a/tests/test_standalone_openai_json_struct_func.py +++ b/tests/test_standalone_openai_json_struct_func.py @@ -6,6 +6,7 @@ from typing import List, Union, Dict import dotenv + dotenv.load_dotenv() import json @@ -16,18 +17,19 @@ MODEL = "gpt-4o-2024-08-06" -math_tutor_prompt = ''' +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 = ''' +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 @@ -36,26 +38,28 @@ class Step(BaseModel): 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" - ) + 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") + 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'] + 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}") @@ -67,7 +71,8 @@ def call_function(name, 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.") @@ -83,14 +88,11 @@ def callback(message, messages, response_message, tool_calls): 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 - }) - + + 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.") @@ -106,19 +108,18 @@ def callback(message, messages, response_message, tool_calls): 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}, - ] + {"role": "system", "content": dedent(prompt)}, + {"role": "user", "content": question}, + ] response = client.beta.chat.completions.parse( - model=MODEL, - messages=messages, - response_format=MathReasoning, - tools=tools + model=MODEL, messages=messages, response_format=MathReasoning, tools=tools ) response_message = response.choices[0].message @@ -128,11 +129,9 @@ def get_math_solution(question: str): 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?" -] +problems = ["What is the derivative of 3x^2", "What's the weather like in San Fran today?"] problem = problems[0] for problem in problems: @@ -153,7 +152,7 @@ def get_math_solution(question: str): print(f"Unable to Parse Solution") print(f"Solution: {solution}") break - + # Print solution from class definitions print(f"Parsed: {parsed_solution}") diff --git a/tests/test_standalone_openai_json_struct_func_playground.py b/tests/test_standalone_openai_json_struct_func_playground.py index 62f905a4a0..62374da0be 100644 --- a/tests/test_standalone_openai_json_struct_func_playground.py +++ b/tests/test_standalone_openai_json_struct_func_playground.py @@ -105,32 +105,35 @@ import requests from dotenv import load_dotenv + 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] - + current_data = weather_data.get("dataseries", [{}])[0] + result = { "latitude": latitude, "longitude": longitude, - "temp": current_data.get('temp2m', {'max': 'Unknown', 'min': 'Unknown'}), - "humidity": "Unknown" + "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 = [ @@ -192,15 +195,14 @@ def run_conversation(content): ) second_response = client.chat.completions.create( - model="gpt-3.5-turbo-0125", - messages=messages, - stream=True + 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 \ No newline at end of file + 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 index 3ae8a15515..15c5e4f480 100644 --- a/tests/test_standalone_project_out.py +++ b/tests/test_standalone_project_out.py @@ -9,13 +9,14 @@ import types import sys + def extract_function_info(filename): with open(filename, "r") as f: source = f.read() tree = ast.parse(source, filename=filename) - + function_info = [] - + # Use a dictionary to track functions module_globals = {} @@ -25,79 +26,92 @@ def extract_function_info(filename): 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 - }) + 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 - }) + 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): + 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 - }) + 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 - }) + 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 - } + 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/memory/base.py" @@ -110,4 +124,4 @@ def extract_function_info(filename): file_path = "./dimos/agents/agent.py" extracted_info = extract_function_info(file_path) -print(extracted_info) \ No newline at end of file +print(extracted_info) diff --git a/tests/test_standalone_rxpy_01.py b/tests/test_standalone_rxpy_01.py index d68b6fef82..1f65f3a468 100644 --- a/tests/test_standalone_rxpy_01.py +++ b/tests/test_standalone_rxpy_01.py @@ -40,7 +40,7 @@ def emission_process(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.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 ) @@ -50,7 +50,7 @@ def emission_process(value): on_next=lambda x: print(x), on_error=lambda e: print(e), on_completed=lambda: print("Emission completed."), - scheduler=pool_scheduler + scheduler=pool_scheduler, ) elif which_test == 2: @@ -92,19 +92,16 @@ def emission_process(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) + 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() - ) + 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}")) + ops.do_action(lambda s: print(f"Combined emission: {s}")), ) # Subscribe to the combined emissions @@ -113,10 +110,10 @@ def emission_process(value): on_error=lambda e: print(f"Error: {e}"), on_completed=lambda: { print("Combined emission completed."), - completed_event.set() # Set the event to signal completion + completed_event.set(), # Set the event to signal completion }, - scheduler=pool_scheduler + scheduler=pool_scheduler, ) # Wait for the observable to complete - completed_event.wait() \ No newline at end of file + completed_event.wait() diff --git a/tests/test_unitree_agent.py b/tests/test_unitree_agent.py index 835bb34ff8..fa0aa6b8e3 100644 --- a/tests/test_unitree_agent.py +++ b/tests/test_unitree_agent.py @@ -17,7 +17,6 @@ class UnitreeAgentDemo: - def __init__(self): self.robot_ip = None self.connection_method = None @@ -39,7 +38,8 @@ def get_env_var(var_name, default=None, required=False): 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")) + "ROS_OUTPUT_DIR", os.path.join(os.getcwd(), "assets/output/ros") + ) def _initialize_robot(self, with_video_stream=True): print( @@ -83,12 +83,12 @@ def run_with_queries(self): # 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!!!", + 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) + step=1, + ) def run_with_test_video(self): # Initialize robot @@ -96,9 +96,9 @@ def run_with_test_video(self): # 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" + dev_name="UnitreeGo2", video_source=f"{os.getcwd()}/assets/framecount.mp4" ).capture_video_as_observable(realtime=False, fps=1) # Get Skills @@ -111,8 +111,7 @@ def run_with_test_video(self): 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!!!", + 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, @@ -150,9 +149,8 @@ def run_with_ros_video(self): 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="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, @@ -168,9 +166,9 @@ def run_with_multiple_query_and_test_video_agents(self): # 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" + 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. @@ -203,8 +201,7 @@ def run_with_multiple_query_and_test_video_agents(self): 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!!!", + 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, @@ -216,8 +213,7 @@ def run_with_multiple_query_and_test_video_agents(self): 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!!!", + 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, @@ -228,12 +224,12 @@ def run_with_multiple_query_and_test_video_agents(self): # 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!!!", + 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) + step=1, + ) def run_with_queries_and_fast_api(self): # Initialize robot diff --git a/tests/test_unitree_agent_queries_fastapi.py b/tests/test_unitree_agent_queries_fastapi.py index 73feea6a9a..74517e2ec5 100644 --- a/tests/test_unitree_agent_queries_fastapi.py +++ b/tests/test_unitree_agent_queries_fastapi.py @@ -29,17 +29,18 @@ def main(): 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")) + 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()) + robot = UnitreeGo2( + ip=robot_ip, + connection_method=connection_method, + output_dir=output_dir, + skills=MyUnitreeSkills(), + ) # Set up video stream logger.info("Starting video stream") @@ -48,15 +49,15 @@ def main(): # 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") @@ -66,11 +67,9 @@ def main(): 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) - ) + agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) # Start server (blocking call) logger.info("Starting FastAPI server") diff --git a/tests/test_unitree_ros_v0.0.4.py b/tests/test_unitree_ros_v0.0.4.py new file mode 100644 index 0000000000..79f47dfef0 --- /dev/null +++ b/tests/test_unitree_ros_v0.0.4.py @@ -0,0 +1,202 @@ +# 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 tests.test_header +import os + +import time +from dotenv import load_dotenv +from dimos.agents.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.web.robot_web_interface import RobotWebInterface +from dimos.skills.observe_stream import ObserveStream +from dimos.skills.kill_skill import KillSkill +from dimos.skills.navigation import NavigateWithText, GetPose, NavigateToGoal +from dimos.skills.visual_navigation_skills import FollowHuman +import reactivex as rx +import reactivex.operators as ops +from dimos.stream.audio.pipelines import tts, stt +import threading +import json +from dimos.types.vector import Vector +from dimos.skills.speak import Speak +from dimos.perception.object_detection_stream import ObjectDetectionStream +from dimos.perception.detection2d.detic_2d_det import Detic2DDetector +from dimos.utils.reactive import backpressure + +# 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( + "--spatial-memory-dir", type=str, help="Directory for storing spatial memory data" + ) + 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, + spatial_memory_dir=args.spatial_memory_dir, # Will use default if None + 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"), "r" +) 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 index 8a01a9da3a..305298c13a 100644 --- a/tests/test_webrtc_queue.py +++ b/tests/test_webrtc_queue.py @@ -7,127 +7,124 @@ import os 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")) - + connection_method = getattr(WebRTCConnectionMethod, os.getenv("CONNECTION_METHOD", "LocalSTA")) + # Initialize ROS control - ros_control = UnitreeROSControl( - node_name="unitree_go2_test", - use_raw=True - ) - + 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 + 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: @@ -140,5 +137,6 @@ def main(): robot.cleanup() print("Test completed.") + if __name__ == "__main__": - main() \ No newline at end of file + main() diff --git a/tests/test_websocketvis.py b/tests/test_websocketvis.py index dd39e59f68..d3e798fa20 100644 --- a/tests/test_websocketvis.py +++ b/tests/test_websocketvis.py @@ -31,28 +31,26 @@ def 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 + port=port, robot_video=video_stream, local_planner=local_planner_stream ) - + return web_interface @@ -61,7 +59,7 @@ def main(): websocket_vis = WebsocketVis() websocket_vis.start() - + web_interface = None if args.live: @@ -69,13 +67,17 @@ def main(): 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]))) - + 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'): + 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() diff --git a/untitled.md b/untitled.md new file mode 100644 index 0000000000..e69de29bb2 From 854455f8eb7da3b4dfd2cd3a0de45242db6a964a Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Thu, 29 May 2025 03:45:23 +0000 Subject: [PATCH 06/46] CI code cleanup --- .../cerebras_agent-checkpoint.py | 2 +- dimos/agents/cerebras_agent.py | 2 +- .../test_cerebras_agent_query-checkpoint.py | 7 +- .../test_cerebras_agent_skills-checkpoint.py | 13 +-- ...st_object_tracking_with_qwen-checkpoint.py | 86 +++++++++++-------- tests/test_cerebras_agent_query.py | 7 +- tests/test_cerebras_agent_skills.py | 13 +-- 7 files changed, 71 insertions(+), 59 deletions(-) diff --git a/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py index 2c32453ed6..e886238fb6 100644 --- a/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py +++ b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py @@ -268,7 +268,7 @@ def _send_query(self, messages: list) -> Any: tools = self.skill_library.get_tools() api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - + # Make the API call response = self.client.chat.completions.create(**api_params) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 2c32453ed6..e886238fb6 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -268,7 +268,7 @@ def _send_query(self, messages: list) -> Any: tools = self.skill_library.get_tools() api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - + # Make the API call response = self.client.chat.completions.create(**api_params) diff --git a/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py index 665135cb69..5ed4007eed 100644 --- a/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py +++ b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py @@ -21,12 +21,9 @@ load_dotenv() # Create a CerebrasAgent instance -agent = CerebrasAgent( - dev_name="test_agent", - query="What is the capital of France?" -) +agent = CerebrasAgent(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 Cerebras Agent: {response}") \ No newline at end of file +print(f"Response from Cerebras Agent: {response}") diff --git a/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py index 0304b0272d..c6dead4570 100644 --- a/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py +++ b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py @@ -57,7 +57,10 @@ "agent_responses": agent_response_stream, } -web_interface = RobotWebInterface(port=5556, text_streams=text_streams,) +web_interface = RobotWebInterface( + port=5556, + text_streams=text_streams, +) # stt_node = stt() robot_skills = MyUnitreeSkills() @@ -78,7 +81,7 @@ 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="llama-4-scout-17b-16e-instruct" + model_name="llama-4-scout-17b-16e-instruct", ) # tts_node = tts() @@ -100,11 +103,9 @@ # 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) -) +agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) # print(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") -web_interface.run() \ No newline at end of file +web_interface.run() diff --git a/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py index 547ee7e139..c2cb004f90 100644 --- a/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py +++ b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py @@ -29,7 +29,7 @@ # 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_width_mm = 4.8 # mm (1/4" sensor) sensor_height_mm = 3.6 # mm # Calculate focal length in pixels @@ -43,9 +43,7 @@ # 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 + camera_intrinsics=camera_intrinsics, camera_pitch=0.0, camera_height=0.5 ) # Create video streams @@ -53,8 +51,11 @@ 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.") +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): @@ -64,38 +65,55 @@ def on_next(result): # 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) - + 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) - + 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) - + 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 @@ -105,14 +123,12 @@ def on_completed(): 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 + 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 @@ -129,14 +145,14 @@ def detection_task(): 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() @@ -150,37 +166,37 @@ def detection_task(): # 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'): + 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'): + 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") \ No newline at end of file + print("Cleanup complete") diff --git a/tests/test_cerebras_agent_query.py b/tests/test_cerebras_agent_query.py index 665135cb69..5ed4007eed 100644 --- a/tests/test_cerebras_agent_query.py +++ b/tests/test_cerebras_agent_query.py @@ -21,12 +21,9 @@ load_dotenv() # Create a CerebrasAgent instance -agent = CerebrasAgent( - dev_name="test_agent", - query="What is the capital of France?" -) +agent = CerebrasAgent(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 Cerebras Agent: {response}") \ No newline at end of file +print(f"Response from Cerebras Agent: {response}") diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index 0304b0272d..c6dead4570 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -57,7 +57,10 @@ "agent_responses": agent_response_stream, } -web_interface = RobotWebInterface(port=5556, text_streams=text_streams,) +web_interface = RobotWebInterface( + port=5556, + text_streams=text_streams, +) # stt_node = stt() robot_skills = MyUnitreeSkills() @@ -78,7 +81,7 @@ 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="llama-4-scout-17b-16e-instruct" + model_name="llama-4-scout-17b-16e-instruct", ) # tts_node = tts() @@ -100,11 +103,9 @@ # 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) -) +agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) # print(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") -web_interface.run() \ No newline at end of file +web_interface.run() From ed9820915634fc7e36396718f388e540eadddb55 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 00:20:39 -0700 Subject: [PATCH 07/46] updated cerebras_agent --- dimos/agents/cerebras_agent.py | 224 +++++++++++++++------------------ 1 file changed, 102 insertions(+), 122 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index e886238fb6..c9f7863b5a 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -51,32 +51,30 @@ class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. - + This class implements the _send_query method to interact with Cerebras API using their official SDK, allowing most of the LLMAgent logic to be reused. """ - def __init__( - self, - dev_name: str, - agent_type: str = "Vision", - query: str = "What do you see?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_input_tokens_per_request: int = 128000, - max_output_tokens_per_request: int = 16384, - model_name: str = "llama-4-scout-17b-16e-instruct", - skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, - response_model: Optional[BaseModel] = None, - frame_processor: Optional[FrameProcessor] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None, - ): + def __init__(self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "llama-4-scout-17b-16e-instruct", + skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None): """ Initializes a new instance of the CerebrasAgent. @@ -112,7 +110,7 @@ def __init__( process_all_inputs = True else: process_all_inputs = False - + super().__init__( dev_name=dev_name, agent_type=agent_type, @@ -122,12 +120,12 @@ def __init__( system_query=system_query, input_query_stream=input_query_stream, input_video_stream=input_video_stream, - input_data_stream=input_data_stream, + input_data_stream=input_data_stream ) - + # Initialize Cerebras client self.client = Cerebras() - + self.query = query self.output_dir = output_dir os.makedirs(self.output_dir, exist_ok=True) @@ -148,8 +146,8 @@ def __init__( elif isinstance(self.skills, AbstractSkill): self.skill_library = SkillLibrary() self.skill_library.add(self.skills) - - self.response_model = response_model + + self.response_model = response_model if response_model is not None else NOT_GIVEN self.model_name = model_name self.image_detail = image_detail self.max_output_tokens_per_request = max_output_tokens_per_request @@ -163,35 +161,28 @@ def __init__( def _add_context_to_memory(self): """Adds initial context to the agent's memory.""" context_data = [ - ( - "id0", - "Optical Flow is a technique used to track the movement of objects in a video sequence.", - ), - ( - "id1", - "Edge Detection is a technique used to identify the boundaries of objects in an image.", - ), - ("id2", "Video is a sequence of frames captured at regular intervals."), - ( - "id3", - "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", - ), - ( - "id4", - "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", - ), + ("id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence." + ), + ("id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image." + ), + ("id2", + "Video is a sequence of frames captured at regular intervals."), + ("id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects." + ), + ("id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate." + ), ] for doc_id, text in context_data: self.agent_memory.add_vector(doc_id, text) - def _build_prompt( - self, - messages: list, - base64_image: Optional[Union[str, List[str]]] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - condensed_results: str = "", - ) -> list: + def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[str]]] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + condensed_results: str = "") -> list: """Builds a prompt message specifically for Cerebras API. Args: @@ -204,41 +195,44 @@ def _build_prompt( Returns: list: Messages formatted for Cerebras API. """ - + # Add system message if provided and not already in history if self.system_query and (not messages or messages[0].get("role") != "system"): messages.insert(0, {"role": "system", "content": self.system_query}) logger.info("Added system message to conversation") - + # Append user query while handling RAG if condensed_results: user_message = {"role": "user", "content": f"{condensed_results}\n\n{self.query}"} logger.info("Created user message with RAG context") - else: + else: user_message = {"role": "user", "content": self.query} - + messages.append(user_message) - + if base64_image is not None: # Handle both single image (str) and multiple images (List[str]) images = [base64_image] if isinstance(base64_image, str) else base64_image - + # For Cerebras, we'll add images inline with text (OpenAI-style format) for img in images: img_content = [ - {"type": "text", "text": "Here is an image to analyze:"}, + { + "type": "text", + "text": "Here is an image to analyze:" + }, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{img}", - "detail": self.image_detail, - }, - }, + "detail": self.image_detail + } + } ] messages.append({"role": "user", "content": img_content}) - + logger.info(f"Added {len(images)} image(s) to conversation") - + return messages def _send_query(self, messages: list) -> Any: @@ -262,23 +256,23 @@ def _send_query(self, messages: list) -> Any: "messages": messages, "max_tokens": self.max_output_tokens_per_request, } - + # Add tools if available if self.skill_library and self.skill_library.get_tools(): tools = self.skill_library.get_tools() api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - + # Make the API call response = self.client.chat.completions.create(**api_params) - + response_message = response.choices[0].message if response_message is None: logger.error("Response message does not exist.") raise Exception("Response message does not exist.") - + return response_message - + except ConnectionError as ce: logger.error(f"Connection error with Cerebras API: {ce}") raise @@ -289,19 +283,17 @@ def _send_query(self, messages: list) -> Any: logger.error(f"Unexpected error in Cerebras API call: {e}") raise - def _observable_query( - self, - observer: Observer, - base64_image: Optional[str] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - incoming_query: Optional[str] = None, - reset_conversation: bool = False, - ): + def _observable_query(self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + reset_conversation: bool = False): """Main query handler that manages conversation history and Cerebras interactions. - + This method follows ClaudeAgent's pattern for efficient conversation history management. - + Args: observer (Observer): The observer to emit responses to. base64_image (str): Optional Base64-encoded image. @@ -325,15 +317,13 @@ def _observable_query( _, condensed_results = self._get_rag_context() # Build prompt - messages = self._build_prompt( - messages, base64_image, dimensions, override_token_limit, condensed_results - ) - + messages = self._build_prompt(messages, base64_image, dimensions, override_token_limit, condensed_results) + # Send query and get response logger.info("Sending Query.") response_message = self._send_query(messages) logger.info(f"Received Response: {response_message}") - + if response_message is None: logger.error("Received None response from Cerebras API") observer.on_next("") @@ -342,50 +332,44 @@ def _observable_query( # Add assistant response to local messages (always) assistant_message = {"role": "assistant"} - + if response_message.content: assistant_message["content"] = response_message.content else: assistant_message["content"] = "" # Ensure content is never None - - if hasattr(response_message, "tool_calls") and response_message.tool_calls: + + if hasattr(response_message, 'tool_calls') and response_message.tool_calls: assistant_message["tool_calls"] = [] for tool_call in response_message.tool_calls: - assistant_message["tool_calls"].append( - { - "id": tool_call.id, - "type": "function", - "function": { - "name": tool_call.function.name, - "arguments": tool_call.function.arguments, - }, + assistant_message["tool_calls"].append({ + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments } - ) - logger.info( - f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" - ) - + }) + logger.info(f"Assistant response includes {len(response_message.tool_calls)} tool call(s)") + messages.append(assistant_message) # Handle tool calls if present (add tool messages to conversation) self._handle_tooling(response_message, messages) # At the end, append only new messages to the global conversation history under a lock - if not hasattr(self, "_history_lock"): + if not hasattr(self, '_history_lock'): self._history_lock = threading.Lock() with self._history_lock: for msg in messages[base_len:]: self.conversation_history.append(msg) - logger.info( - f"Updated conversation history (total: {len(self.conversation_history)} messages)" - ) + logger.info(f"Updated conversation history (total: {len(self.conversation_history)} messages)") # Send response to observers result = response_message.content or "" observer.on_next(result) self.response_subject.on_next(result) observer.on_completed() - + except Exception as e: logger.error(f"Query failed in {self.dev_name}: {e}") observer.on_error(e) @@ -393,30 +377,26 @@ def _observable_query( def _handle_tooling(self, response_message, messages): """Executes tools and appends tool-use/result blocks to messages.""" - if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: + if not hasattr(response_message, 'tool_calls') or not response_message.tool_calls: logger.info("No tool calls found in response message") return None - + if len(response_message.tool_calls) > 1: - logger.warning( - "Multiple tool calls detected in response message. Not a tested feature." - ) + logger.warning("Multiple tool calls detected in response message. Not a tested feature.") # Execute all tools and add their results to messages for tool_call in response_message.tool_calls: logger.info(f"Processing tool call: {tool_call.function.name}") - + # Execute the tool args = json.loads(tool_call.function.arguments) tool_result = self.skill_library.call(tool_call.function.name, **args) logger.info(f"Function Call Results: {tool_result}") - + # Add tool result to conversation history (OpenAI format) - messages.append( - { - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(tool_result), - "name": tool_call.function.name, - } - ) + messages.append({ + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(tool_result), + "name": tool_call.function.name + }) \ No newline at end of file From 050e34ccbd402904d1995e2208e9eb762acc7047 Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Thu, 29 May 2025 07:21:57 +0000 Subject: [PATCH 08/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 222 ++++++++++++++++++--------------- 1 file changed, 121 insertions(+), 101 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index c9f7863b5a..63f21a00de 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -51,30 +51,32 @@ class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. - + This class implements the _send_query method to interact with Cerebras API using their official SDK, allowing most of the LLMAgent logic to be reused. """ - def __init__(self, - dev_name: str, - agent_type: str = "Vision", - query: str = "What do you see?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_input_tokens_per_request: int = 128000, - max_output_tokens_per_request: int = 16384, - model_name: str = "llama-4-scout-17b-16e-instruct", - skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, - response_model: Optional[BaseModel] = None, - frame_processor: Optional[FrameProcessor] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None): + def __init__( + self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "llama-4-scout-17b-16e-instruct", + skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + ): """ Initializes a new instance of the CerebrasAgent. @@ -110,7 +112,7 @@ def __init__(self, process_all_inputs = True else: process_all_inputs = False - + super().__init__( dev_name=dev_name, agent_type=agent_type, @@ -120,12 +122,12 @@ def __init__(self, system_query=system_query, input_query_stream=input_query_stream, input_video_stream=input_video_stream, - input_data_stream=input_data_stream + input_data_stream=input_data_stream, ) - + # Initialize Cerebras client self.client = Cerebras() - + self.query = query self.output_dir = output_dir os.makedirs(self.output_dir, exist_ok=True) @@ -146,7 +148,7 @@ def __init__(self, elif isinstance(self.skills, AbstractSkill): self.skill_library = SkillLibrary() self.skill_library.add(self.skills) - + self.response_model = response_model if response_model is not None else NOT_GIVEN self.model_name = model_name self.image_detail = image_detail @@ -161,28 +163,35 @@ def __init__(self, def _add_context_to_memory(self): """Adds initial context to the agent's memory.""" context_data = [ - ("id0", - "Optical Flow is a technique used to track the movement of objects in a video sequence." - ), - ("id1", - "Edge Detection is a technique used to identify the boundaries of objects in an image." - ), - ("id2", - "Video is a sequence of frames captured at regular intervals."), - ("id3", - "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects." - ), - ("id4", - "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate." - ), + ( + "id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence.", + ), + ( + "id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image.", + ), + ("id2", "Video is a sequence of frames captured at regular intervals."), + ( + "id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", + ), + ( + "id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", + ), ] for doc_id, text in context_data: self.agent_memory.add_vector(doc_id, text) - def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[str]]] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - condensed_results: str = "") -> list: + def _build_prompt( + self, + messages: list, + base64_image: Optional[Union[str, List[str]]] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + condensed_results: str = "", + ) -> list: """Builds a prompt message specifically for Cerebras API. Args: @@ -195,44 +204,41 @@ def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[s Returns: list: Messages formatted for Cerebras API. """ - + # Add system message if provided and not already in history if self.system_query and (not messages or messages[0].get("role") != "system"): messages.insert(0, {"role": "system", "content": self.system_query}) logger.info("Added system message to conversation") - + # Append user query while handling RAG if condensed_results: user_message = {"role": "user", "content": f"{condensed_results}\n\n{self.query}"} logger.info("Created user message with RAG context") - else: + else: user_message = {"role": "user", "content": self.query} - + messages.append(user_message) - + if base64_image is not None: # Handle both single image (str) and multiple images (List[str]) images = [base64_image] if isinstance(base64_image, str) else base64_image - + # For Cerebras, we'll add images inline with text (OpenAI-style format) for img in images: img_content = [ - { - "type": "text", - "text": "Here is an image to analyze:" - }, + {"type": "text", "text": "Here is an image to analyze:"}, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{img}", - "detail": self.image_detail - } - } + "detail": self.image_detail, + }, + }, ] messages.append({"role": "user", "content": img_content}) - + logger.info(f"Added {len(images)} image(s) to conversation") - + return messages def _send_query(self, messages: list) -> Any: @@ -256,23 +262,23 @@ def _send_query(self, messages: list) -> Any: "messages": messages, "max_tokens": self.max_output_tokens_per_request, } - + # Add tools if available if self.skill_library and self.skill_library.get_tools(): tools = self.skill_library.get_tools() api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - + # Make the API call response = self.client.chat.completions.create(**api_params) - + response_message = response.choices[0].message if response_message is None: logger.error("Response message does not exist.") raise Exception("Response message does not exist.") - + return response_message - + except ConnectionError as ce: logger.error(f"Connection error with Cerebras API: {ce}") raise @@ -283,17 +289,19 @@ def _send_query(self, messages: list) -> Any: logger.error(f"Unexpected error in Cerebras API call: {e}") raise - def _observable_query(self, - observer: Observer, - base64_image: Optional[str] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - incoming_query: Optional[str] = None, - reset_conversation: bool = False): + def _observable_query( + self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + reset_conversation: bool = False, + ): """Main query handler that manages conversation history and Cerebras interactions. - + This method follows ClaudeAgent's pattern for efficient conversation history management. - + Args: observer (Observer): The observer to emit responses to. base64_image (str): Optional Base64-encoded image. @@ -317,13 +325,15 @@ def _observable_query(self, _, condensed_results = self._get_rag_context() # Build prompt - messages = self._build_prompt(messages, base64_image, dimensions, override_token_limit, condensed_results) - + messages = self._build_prompt( + messages, base64_image, dimensions, override_token_limit, condensed_results + ) + # Send query and get response logger.info("Sending Query.") response_message = self._send_query(messages) logger.info(f"Received Response: {response_message}") - + if response_message is None: logger.error("Received None response from Cerebras API") observer.on_next("") @@ -332,44 +342,50 @@ def _observable_query(self, # Add assistant response to local messages (always) assistant_message = {"role": "assistant"} - + if response_message.content: assistant_message["content"] = response_message.content else: assistant_message["content"] = "" # Ensure content is never None - - if hasattr(response_message, 'tool_calls') and response_message.tool_calls: + + if hasattr(response_message, "tool_calls") and response_message.tool_calls: assistant_message["tool_calls"] = [] for tool_call in response_message.tool_calls: - assistant_message["tool_calls"].append({ - "id": tool_call.id, - "type": "function", - "function": { - "name": tool_call.function.name, - "arguments": tool_call.function.arguments + assistant_message["tool_calls"].append( + { + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments, + }, } - }) - logger.info(f"Assistant response includes {len(response_message.tool_calls)} tool call(s)") - + ) + logger.info( + f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" + ) + messages.append(assistant_message) # Handle tool calls if present (add tool messages to conversation) self._handle_tooling(response_message, messages) # At the end, append only new messages to the global conversation history under a lock - if not hasattr(self, '_history_lock'): + if not hasattr(self, "_history_lock"): self._history_lock = threading.Lock() with self._history_lock: for msg in messages[base_len:]: self.conversation_history.append(msg) - logger.info(f"Updated conversation history (total: {len(self.conversation_history)} messages)") + logger.info( + f"Updated conversation history (total: {len(self.conversation_history)} messages)" + ) # Send response to observers result = response_message.content or "" observer.on_next(result) self.response_subject.on_next(result) observer.on_completed() - + except Exception as e: logger.error(f"Query failed in {self.dev_name}: {e}") observer.on_error(e) @@ -377,26 +393,30 @@ def _observable_query(self, def _handle_tooling(self, response_message, messages): """Executes tools and appends tool-use/result blocks to messages.""" - if not hasattr(response_message, 'tool_calls') or not response_message.tool_calls: + if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: logger.info("No tool calls found in response message") return None - + if len(response_message.tool_calls) > 1: - logger.warning("Multiple tool calls detected in response message. Not a tested feature.") + logger.warning( + "Multiple tool calls detected in response message. Not a tested feature." + ) # Execute all tools and add their results to messages for tool_call in response_message.tool_calls: logger.info(f"Processing tool call: {tool_call.function.name}") - + # Execute the tool args = json.loads(tool_call.function.arguments) tool_result = self.skill_library.call(tool_call.function.name, **args) logger.info(f"Function Call Results: {tool_result}") - + # Add tool result to conversation history (OpenAI format) - messages.append({ - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(tool_result), - "name": tool_call.function.name - }) \ No newline at end of file + messages.append( + { + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(tool_result), + "name": tool_call.function.name, + } + ) From 3dc29a49243f643485e165eeb6378e9d236ddf34 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 23:23:30 -0400 Subject: [PATCH 09/46] remove unsupported fields in cerebras_agent --- dimos/agents/cerebras_agent.py | 37 ++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 63f21a00de..93b8ea1de9 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -149,7 +149,7 @@ def __init__( self.skill_library = SkillLibrary() self.skill_library.add(self.skills) - self.response_model = response_model if response_model is not None else NOT_GIVEN + self.response_model = response_model self.model_name = model_name self.image_detail = image_detail self.max_output_tokens_per_request = max_output_tokens_per_request @@ -241,6 +241,30 @@ def _build_prompt( return messages + def clean_cerebras_schema(self, schema: dict) -> dict: + """Simple schema cleaner that removes unsupported fields for Cerebras API.""" + if not isinstance(schema, dict): + return schema + + # Removing the problematic fields that pydantic generates + cleaned = {} + unsupported_fields = { + 'minItems', 'maxItems', 'uniqueItems', + 'exclusiveMinimum', 'exclusiveMaximum', 'minimum', 'maximum' + } + + for key, value in schema.items(): + if key in unsupported_fields: + continue # Skip unsupported fields + elif isinstance(value, dict): + cleaned[key] = self.clean_cerebras_schema(value) + elif isinstance(value, list): + cleaned[key] = [self.clean_cerebras_schema(item) if isinstance(item, dict) else item for item in value] + else: + cleaned[key] = value + + return cleaned + def _send_query(self, messages: list) -> Any: """Sends the query to Cerebras API using the official Cerebras SDK. @@ -266,9 +290,18 @@ def _send_query(self, messages: list) -> Any: # Add tools if available if self.skill_library and self.skill_library.get_tools(): tools = self.skill_library.get_tools() - api_params["tools"] = tools # No conversion needed + for tool in tools: + if "function" in tool and "parameters" in tool["function"]: + tool["function"]["parameters"] = self.clean_cerebras_schema(tool["function"]["parameters"]) + api_params["tools"] = tools api_params["tool_choice"] = "auto" + if self.response_model is not None: + api_params["response_format"] = { + "type": "json_object", + "schema": schema + } + # Make the API call response = self.client.chat.completions.create(**api_params) From 13aa49263735c616ac0e0eca7695b675ea51ef2f Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Fri, 30 May 2025 03:24:03 +0000 Subject: [PATCH 10/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 93b8ea1de9..5b3b94a8a4 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -245,24 +245,32 @@ def clean_cerebras_schema(self, schema: dict) -> dict: """Simple schema cleaner that removes unsupported fields for Cerebras API.""" if not isinstance(schema, dict): return schema - + # Removing the problematic fields that pydantic generates cleaned = {} unsupported_fields = { - 'minItems', 'maxItems', 'uniqueItems', - 'exclusiveMinimum', 'exclusiveMaximum', 'minimum', 'maximum' + "minItems", + "maxItems", + "uniqueItems", + "exclusiveMinimum", + "exclusiveMaximum", + "minimum", + "maximum", } - + for key, value in schema.items(): if key in unsupported_fields: continue # Skip unsupported fields elif isinstance(value, dict): cleaned[key] = self.clean_cerebras_schema(value) elif isinstance(value, list): - cleaned[key] = [self.clean_cerebras_schema(item) if isinstance(item, dict) else item for item in value] + cleaned[key] = [ + self.clean_cerebras_schema(item) if isinstance(item, dict) else item + for item in value + ] else: cleaned[key] = value - + return cleaned def _send_query(self, messages: list) -> Any: @@ -292,15 +300,14 @@ def _send_query(self, messages: list) -> Any: tools = self.skill_library.get_tools() for tool in tools: if "function" in tool and "parameters" in tool["function"]: - tool["function"]["parameters"] = self.clean_cerebras_schema(tool["function"]["parameters"]) + tool["function"]["parameters"] = self.clean_cerebras_schema( + tool["function"]["parameters"] + ) api_params["tools"] = tools api_params["tool_choice"] = "auto" if self.response_model is not None: - api_params["response_format"] = { - "type": "json_object", - "schema": schema - } + api_params["response_format"] = {"type": "json_object", "schema": schema} # Make the API call response = self.client.chat.completions.create(**api_params) From 1ae2fd5facf9384cdc6f00e56f7e507ccddf1bb1 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 20:32:31 -0700 Subject: [PATCH 11/46] minor changes --- dimos/agents/cerebras_agent.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 5b3b94a8a4..6f00baf137 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -33,7 +33,6 @@ from reactivex import Observable from reactivex.observer import Observer from reactivex.scheduler import ThreadPoolScheduler -from openai._types import NOT_GIVEN # Local imports from dimos.agents.agent import LLMAgent @@ -307,7 +306,7 @@ def _send_query(self, messages: list) -> Any: api_params["tool_choice"] = "auto" if self.response_model is not None: - api_params["response_format"] = {"type": "json_object", "schema": schema} + api_params["response_format"] = {"type": "json_object", "schema": self.response_model} # Make the API call response = self.client.chat.completions.create(**api_params) From 2c09553dc6106a2ac26c2726fae67572a9900157 Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Fri, 30 May 2025 03:33:09 +0000 Subject: [PATCH 12/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 6f00baf137..6040e78d2c 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -306,7 +306,10 @@ def _send_query(self, messages: list) -> Any: api_params["tool_choice"] = "auto" if self.response_model is not None: - api_params["response_format"] = {"type": "json_object", "schema": self.response_model} + api_params["response_format"] = { + "type": "json_object", + "schema": self.response_model, + } # Make the API call response = self.client.chat.completions.create(**api_params) From e8e3be99c570e131a7c39130c850ce5edcc85d62 Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Fri, 30 May 2025 06:24:12 +0000 Subject: [PATCH 13/46] CI code cleanup --- dimos/robot/unitree_webrtc/type/vector.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/dimos/robot/unitree_webrtc/type/vector.py b/dimos/robot/unitree_webrtc/type/vector.py index 0289d9ca0e..a84cb44708 100644 --- a/dimos/robot/unitree_webrtc/type/vector.py +++ b/dimos/robot/unitree_webrtc/type/vector.py @@ -187,9 +187,7 @@ def distance_squared(self, other: Union["Vector", Iterable[float]]) -> float: def angle(self, other: Union["Vector", Iterable[float]]) -> float: """Compute the angle (in radians) between this vector and another.""" - if self.length() < 1e-10 or ( - isinstance(other, Vector) and other.length() < 1e-10 - ): + if self.length() < 1e-10 or (isinstance(other, Vector) and other.length() < 1e-10): return 0.0 if isinstance(other, Vector): @@ -552,12 +550,8 @@ def z(value: VectorLike) -> float: print("Testing VectorLike Protocol:") print(f"isinstance(Vector(1,2), VectorLike): {isinstance(vec2d, VectorLike)}") print(f"isinstance(np.array([1,2]), VectorLike): {isinstance(arr2d, VectorLike)}") - print( - f"isinstance((1,2), VectorLike): {isinstance((1.0, 2.0), VectorLike)}" - ) - print( - f"isinstance([1,2], VectorLike): {isinstance([1.0, 2.0], VectorLike)}" - ) + print(f"isinstance((1,2), VectorLike): {isinstance((1.0, 2.0), VectorLike)}") + print(f"isinstance([1,2], VectorLike): {isinstance([1.0, 2.0], VectorLike)}") print() # Test mixed operations using different vector types @@ -574,10 +568,6 @@ def midpoint(a: VectorLike, b: VectorLike) -> NDArray[np.float64]: return (a_np + b_np) / 2 print("Mixed operations between different vector types:") - print( - f"distance(Vector(1,2,3), [4,5,6]): {distance(vec3d, [4.0, 5.0, 6.0])}" - ) - print( - f"distance(np.array([1,2,3]), (4,5,6)): {distance(arr3d, (4.0, 5.0, 6.0))}" - ) + print(f"distance(Vector(1,2,3), [4,5,6]): {distance(vec3d, [4.0, 5.0, 6.0])}") + print(f"distance(np.array([1,2,3]), (4,5,6)): {distance(arr3d, (4.0, 5.0, 6.0))}") print(f"midpoint(Vector(1,2,3), np.array([4,5,6])): {midpoint(vec3d, numpy_arr)}") From 58dd0d6de386e09c258c62eff8ed8d34a644f236 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Wed, 28 May 2025 18:07:00 -0700 Subject: [PATCH 14/46] remove validation --- dimos/agents/cerebras_agent.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 8aebf0f509..73d4659b46 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -268,29 +268,26 @@ def _send_query(self, messages: list) -> Any: tools = self.skill_library.get_tools() api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - + # Add response format for structured output if specified if self.response_model is not None: # Convert Pydantic model to JSON schema for Cerebras from pydantic import TypeAdapter - schema = TypeAdapter(self.response_model).json_schema() - + # Ensure additionalProperties is set to False for strict mode if "additionalProperties" not in schema: schema["additionalProperties"] = False - + api_params["response_format"] = { "type": "json_schema", "json_schema": { - "name": self.response_model.__name__ - if hasattr(self.response_model, "__name__") - else "response", + "name": self.response_model.__name__ if hasattr(self.response_model, '__name__') else "response", "strict": True, - "schema": schema, - }, + "schema": schema + } } - + # Make the API call response = self.client.chat.completions.create(**api_params) From 5ad6307f2fbae2835c014b98747d60a7c2a0776c Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Wed, 28 May 2025 18:07:35 -0700 Subject: [PATCH 15/46] add tests --- tests/test_cerebras_agent_query.py | 32 +++++++ tests/test_cerebras_agent_skills.py | 130 ++++++++++++++++++++++++++++ 2 files changed, 162 insertions(+) create mode 100644 tests/test_cerebras_agent_query.py create mode 100644 tests/test_cerebras_agent_skills.py diff --git a/tests/test_cerebras_agent_query.py b/tests/test_cerebras_agent_query.py new file mode 100644 index 0000000000..665135cb69 --- /dev/null +++ b/tests/test_cerebras_agent_query.py @@ -0,0 +1,32 @@ +# 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 test_header + +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent + +# Load API key from environment +load_dotenv() + +# Create a CerebrasAgent instance +agent = CerebrasAgent( + 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 Cerebras Agent: {response}") \ No newline at end of file diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py new file mode 100644 index 0000000000..16b00c6c57 --- /dev/null +++ b/tests/test_cerebras_agent_skills.py @@ -0,0 +1,130 @@ +# 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 +import os +import tests.test_header + +import time +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent +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.web.robot_web_interface import RobotWebInterface +from dimos.skills.observe_stream import ObserveStream +from dimos.skills.kill_skill import KillSkill +from dimos.skills.navigation import Navigate, BuildSemanticMap, GetPose, NavigateToGoal +from dimos.skills.visual_navigation_skills import NavigateToObject, FollowHuman +import reactivex as rx +import reactivex.operators as ops +from dimos.stream.audio.pipelines import tts, stt +from dimos.web.websocket_vis.server import WebsocketVis +import threading +from dimos.types.vector import Vector +from dimos.skills.speak import Speak + +# 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=5556, text_streams=text_streams, **streams) + +stt_node = stt() + +# Create a CerebrasAgent instance +agent = CerebrasAgent( + dev_name="test_cerebras_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="llama-4-scout-17b-16e-instruct" +) + +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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") +print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") + +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() \ No newline at end of file From 817d95d803f862c5568cbd97db9e2b882a19e609 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Wed, 28 May 2025 19:34:20 -0700 Subject: [PATCH 16/46] update deprecated docker files --- docker/deprecated/unitree/agents/Dockerfile | 4 ++-- docker/deprecated/unitree/agents/docker-compose.yml | 9 +++++---- 2 files changed, 7 insertions(+), 6 deletions(-) diff --git a/docker/deprecated/unitree/agents/Dockerfile b/docker/deprecated/unitree/agents/Dockerfile index c46fdd66e6..ea8cf63bd8 100644 --- a/docker/deprecated/unitree/agents/Dockerfile +++ b/docker/deprecated/unitree/agents/Dockerfile @@ -122,10 +122,10 @@ RUN echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /root/.bashrc && \ COPY docker /app/docker/ # Setup supervisor configuration -COPY docker/unitree/agents/supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY docker/deprecated/unitree/agents/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # Copy entrypoint script -COPY docker/unitree/agents/entrypoint.sh /entrypoint.sh +COPY docker/deprecated/unitree/agents/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # Copy dimos and tests diff --git a/docker/deprecated/unitree/agents/docker-compose.yml b/docker/deprecated/unitree/agents/docker-compose.yml index 6cde23e98e..6c86ee5ff0 100644 --- a/docker/deprecated/unitree/agents/docker-compose.yml +++ b/docker/deprecated/unitree/agents/docker-compose.yml @@ -3,10 +3,10 @@ services: dimos-unitree-agents: image: dimos-unitree-agents:latest build: - context: ../../../ - dockerfile: docker/unitree/agents/Dockerfile + context: ../../../../ + dockerfile: docker/deprecated/unitree/agents/Dockerfile env_file: - - ../../../.env + - ../../../../.env environment: PYTHONUNBUFFERED: 1 ROBOT_IP: ${ROBOT_IP} @@ -15,10 +15,11 @@ services: WEBRTC_SERVER_PORT: ${WEBRTC_SERVER_PORT:-9991} DISPLAY: ${DISPLAY:-} # For GUI applications like rviz2 ROS_OUTPUT_DIR: /app/assets/output/ros # Change output directory + CUDA_VISIBLE_DEVICES: "" # Force CPU-only mode # DIMOS_MAX_WORKERS: ${DIMOS_MAX_WORKERS} # TODO: ipc: host volumes: - - ../../../assets:/app/assets + - ../../../../assets:/app/assets ports: - "5555:5555" mem_limit: 8048m From 838ced0169cf1fc27b1c90ff71caf5dfa55a9ea9 Mon Sep 17 00:00:00 2001 From: stash Date: Wed, 28 May 2025 20:06:09 -0700 Subject: [PATCH 17/46] Fix deprecated skills --- tests/test_cerebras_agent_skills.py | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index 16b00c6c57..b389f885ea 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -25,8 +25,8 @@ from dimos.web.robot_web_interface import RobotWebInterface from dimos.skills.observe_stream import ObserveStream from dimos.skills.kill_skill import KillSkill -from dimos.skills.navigation import Navigate, BuildSemanticMap, GetPose, NavigateToGoal -from dimos.skills.visual_navigation_skills import NavigateToObject, FollowHuman +from dimos.skills.navigation import NavigateWithText, GetPose, NavigateToGoal +from dimos.skills.visual_navigation_skills import FollowHuman import reactivex as rx import reactivex.operators as ops from dimos.stream.audio.pipelines import tts, stt @@ -82,18 +82,14 @@ 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(NavigateWithText) 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("NavigateWithText", robot=robot) robot_skills.create_instance("FollowHuman", robot=robot) robot_skills.create_instance("GetPose", robot=robot) robot_skills.create_instance("NavigateToGoal", robot=robot) From 9302a549c35d5e2dcdab8a5c44ed48e661ba462b Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 03:41:24 +0000 Subject: [PATCH 18/46] initial commit --- .ipynb_checkpoints/untitled-checkpoint.md | 0 .../cerebras_agent-checkpoint.py | 422 ++++++++++++++++++ dimos/robot/unitree_webrtc/type/vector.py | 147 ++++++ dimos/utils/test_testing.py | 129 ------ dimos/utils/testing.py | 224 ---------- .../test_audio_robot_agent-checkpoint.py | 37 ++ .../test_cerebras_agent_query-checkpoint.py | 32 ++ .../test_cerebras_agent_skills-checkpoint.py | 110 +++++ ...st_object_tracking_with_qwen-checkpoint.py | 186 ++++++++ tests/test_cerebras_agent_skills.py | 58 +-- untitled.md | 0 11 files changed, 955 insertions(+), 390 deletions(-) create mode 100644 .ipynb_checkpoints/untitled-checkpoint.md create mode 100644 dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py create mode 100644 tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py create mode 100644 tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py create mode 100644 tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py create mode 100644 tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py create mode 100644 untitled.md diff --git a/.ipynb_checkpoints/untitled-checkpoint.md b/.ipynb_checkpoints/untitled-checkpoint.md new file mode 100644 index 0000000000..e69de29bb2 diff --git a/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py new file mode 100644 index 0000000000..2c32453ed6 --- /dev/null +++ b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py @@ -0,0 +1,422 @@ +# 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. + +"""Cerebras agent implementation for the DIMOS agent framework. + +This module provides a CerebrasAgent class that implements the LLMAgent interface +for Cerebras inference API using the official Cerebras Python SDK. +""" + +from __future__ import annotations + +import os +import threading +import copy +from typing import Any, Dict, List, Optional, Union, Tuple +import logging +import json + +from cerebras.cloud.sdk import Cerebras +from dotenv import load_dotenv +from pydantic import BaseModel +from reactivex import Observable +from reactivex.observer import Observer +from reactivex.scheduler import ThreadPoolScheduler +from openai._types import NOT_GIVEN + +# Local imports +from dimos.agents.agent import LLMAgent +from dimos.agents.memory.base import AbstractAgentSemanticMemory +from dimos.skills.skills import AbstractSkill, SkillLibrary +from dimos.stream.frame_processor import FrameProcessor +from dimos.utils.logging_config import setup_logger + +# Initialize environment variables +load_dotenv() + +# Initialize logger for the Cerebras agent +logger = setup_logger("dimos.agents.cerebras") + + +class CerebrasAgent(LLMAgent): + """Cerebras agent implementation using the official Cerebras Python SDK. + + This class implements the _send_query method to interact with Cerebras API + using their official SDK, allowing most of the LLMAgent logic to be reused. + """ + + def __init__( + self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "llama-4-scout-17b-16e-instruct", + skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + ): + """ + Initializes a new instance of the CerebrasAgent. + + Args: + dev_name (str): The device name of the agent. + agent_type (str): The type of the agent. + query (str): The default query text. + input_query_stream (Observable): An observable for query input. + input_video_stream (Observable): An observable for video frames. + input_data_stream (Observable): An observable for data input. + output_dir (str): Directory for output files. + agent_memory (AbstractAgentSemanticMemory): The memory system. + system_query (str): The system prompt to use with RAG context. + max_input_tokens_per_request (int): Maximum tokens for input. + max_output_tokens_per_request (int): Maximum tokens for output. + model_name (str): The Cerebras model name to use. Available options: + - llama-4-scout-17b-16e-instruct (default, fastest) + - llama3.1-8b + - llama-3.3-70b + - qwen-3-32b + - deepseek-r1-distill-llama-70b (private preview) + skills (Union[AbstractSkill, List[AbstractSkill], SkillLibrary]): Skills available to the agent. + response_model (BaseModel): Optional Pydantic model for structured responses. + frame_processor (FrameProcessor): Custom frame processor. + image_detail (str): Detail level for images ("low", "high", "auto"). + pool_scheduler (ThreadPoolScheduler): The scheduler to use for thread pool operations. + process_all_inputs (bool): Whether to process all inputs or skip when busy. + """ + # Determine appropriate default for process_all_inputs if not provided + if process_all_inputs is None: + # Default to True for text queries, False for video streams + if input_query_stream is not None and input_video_stream is None: + process_all_inputs = True + else: + process_all_inputs = False + + super().__init__( + dev_name=dev_name, + agent_type=agent_type, + agent_memory=agent_memory, + pool_scheduler=pool_scheduler, + process_all_inputs=process_all_inputs, + system_query=system_query, + input_query_stream=input_query_stream, + input_video_stream=input_video_stream, + input_data_stream=input_data_stream, + ) + + # Initialize Cerebras client + self.client = Cerebras() + + self.query = query + self.output_dir = output_dir + os.makedirs(self.output_dir, exist_ok=True) + + # Initialize conversation history for multi-turn conversations + self.conversation_history = [] + self._history_lock = threading.Lock() + + # Configure skills + self.skills = skills + self.skill_library = None + if isinstance(self.skills, SkillLibrary): + self.skill_library = self.skills + elif isinstance(self.skills, list): + self.skill_library = SkillLibrary() + for skill in self.skills: + self.skill_library.add(skill) + elif isinstance(self.skills, AbstractSkill): + self.skill_library = SkillLibrary() + self.skill_library.add(self.skills) + + self.response_model = response_model + self.model_name = model_name + self.image_detail = image_detail + self.max_output_tokens_per_request = max_output_tokens_per_request + self.max_input_tokens_per_request = max_input_tokens_per_request + + # Add static context to memory. + self._add_context_to_memory() + + logger.info("Cerebras Agent Initialized.") + + def _add_context_to_memory(self): + """Adds initial context to the agent's memory.""" + context_data = [ + ( + "id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence.", + ), + ( + "id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image.", + ), + ("id2", "Video is a sequence of frames captured at regular intervals."), + ( + "id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", + ), + ( + "id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", + ), + ] + for doc_id, text in context_data: + self.agent_memory.add_vector(doc_id, text) + + def _build_prompt( + self, + messages: list, + base64_image: Optional[Union[str, List[str]]] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + condensed_results: str = "", + ) -> list: + """Builds a prompt message specifically for Cerebras API. + + Args: + messages (list): Existing messages list to build upon. + base64_image (Union[str, List[str]]): Optional Base64-encoded image(s). + dimensions (Tuple[int, int]): Optional image dimensions. + override_token_limit (bool): Whether to override token limits. + condensed_results (str): The condensed RAG context. + + Returns: + list: Messages formatted for Cerebras API. + """ + + # Add system message if provided and not already in history + if self.system_query and (not messages or messages[0].get("role") != "system"): + messages.insert(0, {"role": "system", "content": self.system_query}) + logger.info("Added system message to conversation") + + # Append user query while handling RAG + if condensed_results: + user_message = {"role": "user", "content": f"{condensed_results}\n\n{self.query}"} + logger.info("Created user message with RAG context") + else: + user_message = {"role": "user", "content": self.query} + + messages.append(user_message) + + if base64_image is not None: + # Handle both single image (str) and multiple images (List[str]) + images = [base64_image] if isinstance(base64_image, str) else base64_image + + # For Cerebras, we'll add images inline with text (OpenAI-style format) + for img in images: + img_content = [ + {"type": "text", "text": "Here is an image to analyze:"}, + { + "type": "image_url", + "image_url": { + "url": f"data:image/jpeg;base64,{img}", + "detail": self.image_detail, + }, + }, + ] + messages.append({"role": "user", "content": img_content}) + + logger.info(f"Added {len(images)} image(s) to conversation") + + return messages + + def _send_query(self, messages: list) -> Any: + """Sends the query to Cerebras API using the official Cerebras SDK. + + Args: + messages (list): The prompt messages to send. + + Returns: + The response message from Cerebras. + + Raises: + Exception: If no response message is returned. + ConnectionError: If there's an issue connecting to the API. + ValueError: If the messages or other parameters are invalid. + """ + try: + # Prepare API call parameters + api_params = { + "model": self.model_name, + "messages": messages, + "max_tokens": self.max_output_tokens_per_request, + } + + # Add tools if available + if self.skill_library and self.skill_library.get_tools(): + tools = self.skill_library.get_tools() + api_params["tools"] = tools # No conversion needed + api_params["tool_choice"] = "auto" + + # Make the API call + response = self.client.chat.completions.create(**api_params) + + response_message = response.choices[0].message + if response_message is None: + logger.error("Response message does not exist.") + raise Exception("Response message does not exist.") + + return response_message + + except ConnectionError as ce: + logger.error(f"Connection error with Cerebras API: {ce}") + raise + except ValueError as ve: + logger.error(f"Invalid parameters for Cerebras API: {ve}") + raise + except Exception as e: + logger.error(f"Unexpected error in Cerebras API call: {e}") + raise + + def _observable_query( + self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + reset_conversation: bool = False, + ): + """Main query handler that manages conversation history and Cerebras interactions. + + This method follows ClaudeAgent's pattern for efficient conversation history management. + + Args: + observer (Observer): The observer to emit responses to. + base64_image (str): Optional Base64-encoded image. + dimensions (Tuple[int, int]): Optional image dimensions. + override_token_limit (bool): Whether to override token limits. + incoming_query (str): Optional query to update the agent's query. + reset_conversation (bool): Whether to reset the conversation history. + """ + try: + # Reset conversation history if requested + if reset_conversation: + self.conversation_history = [] + logger.info("Conversation history reset") + + # Create a local copy of conversation history and record its length + messages = copy.deepcopy(self.conversation_history) + base_len = len(messages) + + # Update query and get context + self._update_query(incoming_query) + _, condensed_results = self._get_rag_context() + + # Build prompt + messages = self._build_prompt( + messages, base64_image, dimensions, override_token_limit, condensed_results + ) + + # Send query and get response + logger.info("Sending Query.") + response_message = self._send_query(messages) + logger.info(f"Received Response: {response_message}") + + if response_message is None: + logger.error("Received None response from Cerebras API") + observer.on_next("") + observer.on_completed() + return + + # Add assistant response to local messages (always) + assistant_message = {"role": "assistant"} + + if response_message.content: + assistant_message["content"] = response_message.content + else: + assistant_message["content"] = "" # Ensure content is never None + + if hasattr(response_message, "tool_calls") and response_message.tool_calls: + assistant_message["tool_calls"] = [] + for tool_call in response_message.tool_calls: + assistant_message["tool_calls"].append( + { + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments, + }, + } + ) + logger.info( + f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" + ) + + messages.append(assistant_message) + + # Handle tool calls if present (add tool messages to conversation) + self._handle_tooling(response_message, messages) + + # At the end, append only new messages to the global conversation history under a lock + if not hasattr(self, "_history_lock"): + self._history_lock = threading.Lock() + with self._history_lock: + for msg in messages[base_len:]: + self.conversation_history.append(msg) + logger.info( + f"Updated conversation history (total: {len(self.conversation_history)} messages)" + ) + + # Send response to observers + result = response_message.content or "" + observer.on_next(result) + self.response_subject.on_next(result) + observer.on_completed() + + except Exception as e: + logger.error(f"Query failed in {self.dev_name}: {e}") + observer.on_error(e) + self.response_subject.on_error(e) + + def _handle_tooling(self, response_message, messages): + """Executes tools and appends tool-use/result blocks to messages.""" + if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: + logger.info("No tool calls found in response message") + return None + + if len(response_message.tool_calls) > 1: + logger.warning( + "Multiple tool calls detected in response message. Not a tested feature." + ) + + # Execute all tools and add their results to messages + for tool_call in response_message.tool_calls: + logger.info(f"Processing tool call: {tool_call.function.name}") + + # Execute the tool + args = json.loads(tool_call.function.arguments) + tool_result = self.skill_library.call(tool_call.function.name, **args) + logger.info(f"Function Call Results: {tool_result}") + + # Add tool result to conversation history (OpenAI format) + messages.append( + { + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(tool_result), + "name": tool_call.function.name, + } + ) diff --git a/dimos/robot/unitree_webrtc/type/vector.py b/dimos/robot/unitree_webrtc/type/vector.py index 0343a71118..1ecb1aa070 100644 --- a/dimos/robot/unitree_webrtc/type/vector.py +++ b/dimos/robot/unitree_webrtc/type/vector.py @@ -432,3 +432,150 @@ def z(value: VectorLike) -> float: else: arr = to_numpy(value) return float(arr[2]) if len(arr) > 2 else 0.0 + + +if __name__ == "__main__": + # Test vectors in various directions + test_vectors = [ + Vector(1, 0), # Right + Vector(1, 1), # Up-Right + Vector(0, 1), # Up + Vector(-1, 1), # Up-Left + Vector(-1, 0), # Left + Vector(-1, -1), # Down-Left + Vector(0, -1), # Down + Vector(1, -1), # Down-Right + Vector(0.5, 0.5), # Up-Right (shorter) + Vector(-3, 4), # Up-Left (longer) + ] + + for v in test_vectors: + print(str(v)) + + # Test the vector compatibility functions + print("Testing vectortypes.py conversion functions\n") + + # Create test vectors in different formats + vector_obj = Vector(1.0, 2.0, 3.0) + numpy_arr = np.array([4.0, 5.0, 6.0]) + tuple_vec = (7.0, 8.0, 9.0) + list_vec = [10.0, 11.0, 12.0] + + print("Original values:") + print(f"Vector: {vector_obj}") + print(f"NumPy: {numpy_arr}") + print(f"Tuple: {tuple_vec}") + print(f"List: {list_vec}") + print() + + # Test to_numpy + print("to_numpy() conversions:") + print(f"Vector → NumPy: {to_numpy(vector_obj)}") + print(f"NumPy → NumPy: {to_numpy(numpy_arr)}") + print(f"Tuple → NumPy: {to_numpy(tuple_vec)}") + print(f"List → NumPy: {to_numpy(list_vec)}") + print() + + # Test to_vector + print("to_vector() conversions:") + print(f"Vector → Vector: {to_vector(vector_obj)}") + print(f"NumPy → Vector: {to_vector(numpy_arr)}") + print(f"Tuple → Vector: {to_vector(tuple_vec)}") + print(f"List → Vector: {to_vector(list_vec)}") + print() + + # Test to_tuple + print("to_tuple() conversions:") + print(f"Vector → Tuple: {to_tuple(vector_obj)}") + print(f"NumPy → Tuple: {to_tuple(numpy_arr)}") + print(f"Tuple → Tuple: {to_tuple(tuple_vec)}") + print(f"List → Tuple: {to_tuple(list_vec)}") + print() + + # Test to_list + print("to_list() conversions:") + print(f"Vector → List: {to_list(vector_obj)}") + print(f"NumPy → List: {to_list(numpy_arr)}") + print(f"Tuple → List: {to_list(tuple_vec)}") + print(f"List → List: {to_list(list_vec)}") + print() + + # Test component extraction + print("Component extraction:") + print("x() function:") + print(f"x(Vector): {x(vector_obj)}") + print(f"x(NumPy): {x(numpy_arr)}") + print(f"x(Tuple): {x(tuple_vec)}") + print(f"x(List): {x(list_vec)}") + print() + + print("y() function:") + print(f"y(Vector): {y(vector_obj)}") + print(f"y(NumPy): {y(numpy_arr)}") + print(f"y(Tuple): {y(tuple_vec)}") + print(f"y(List): {y(list_vec)}") + print() + + print("z() function:") + print(f"z(Vector): {z(vector_obj)}") + print(f"z(NumPy): {z(numpy_arr)}") + print(f"z(Tuple): {z(tuple_vec)}") + print(f"z(List): {z(list_vec)}") + print() + + # Test dimension checking + print("Dimension checking:") + vec2d = Vector(1.0, 2.0) + vec3d = Vector(1.0, 2.0, 3.0) + arr2d = np.array([1.0, 2.0]) + arr3d = np.array([1.0, 2.0, 3.0]) + + print(f"is_2d(Vector(1,2)): {is_2d(vec2d)}") + print(f"is_2d(Vector(1,2,3)): {is_2d(vec3d)}") + print(f"is_2d(np.array([1,2])): {is_2d(arr2d)}") + print(f"is_2d(np.array([1,2,3])): {is_2d(arr3d)}") + print(f"is_2d((1,2)): {is_2d((1.0, 2.0))}") + print(f"is_2d((1,2,3)): {is_2d((1.0, 2.0, 3.0))}") + print() + + print(f"is_3d(Vector(1,2)): {is_3d(vec2d)}") + print(f"is_3d(Vector(1,2,3)): {is_3d(vec3d)}") + print(f"is_3d(np.array([1,2])): {is_3d(arr2d)}") + print(f"is_3d(np.array([1,2,3])): {is_3d(arr3d)}") + print(f"is_3d((1,2)): {is_3d((1.0, 2.0))}") + print(f"is_3d((1,2,3)): {is_3d((1.0, 2.0, 3.0))}") + print() + + # Test the Protocol interface + print("Testing VectorLike Protocol:") + print(f"isinstance(Vector(1,2), VectorLike): {isinstance(vec2d, VectorLike)}") + print(f"isinstance(np.array([1,2]), VectorLike): {isinstance(arr2d, VectorLike)}") + print( + f"isinstance((1,2), VectorLike): {isinstance((1.0, 2.0), VectorLike)}" + ) + print( + f"isinstance([1,2], VectorLike): {isinstance([1.0, 2.0], VectorLike)}" + ) + print() + + # Test mixed operations using different vector types + # These functions aren't defined in vectortypes, but demonstrate the concept + def distance(a: VectorLike, b: VectorLike) -> float: + a_np = to_numpy(a) + b_np = to_numpy(b) + diff = a_np - b_np + return float(np.sqrt(np.sum(diff * diff))) + + def midpoint(a: VectorLike, b: VectorLike) -> NDArray[np.float64]: + a_np = to_numpy(a) + b_np = to_numpy(b) + return (a_np + b_np) / 2 + + print("Mixed operations between different vector types:") + print( + f"distance(Vector(1,2,3), [4,5,6]): {distance(vec3d, [4.0, 5.0, 6.0])}" + ) + print( + f"distance(np.array([1,2,3]), (4,5,6)): {distance(arr3d, (4.0, 5.0, 6.0))}" + ) + print(f"midpoint(Vector(1,2,3), np.array([4,5,6])): {midpoint(vec3d, numpy_arr)}") diff --git a/dimos/utils/test_testing.py b/dimos/utils/test_testing.py index 796c190c8a..e69de29bb2 100644 --- a/dimos/utils/test_testing.py +++ b/dimos/utils/test_testing.py @@ -1,129 +0,0 @@ -import hashlib -import os -import subprocess -from dimos.utils import testing -from dimos.robot.unitree_webrtc.type.lidar import LidarMessage - - -def test_pull_file(): - repo_root = testing._get_repo_root() - test_file_name = "cafe.jpg" - test_file_compressed = testing._get_lfs_dir() / (test_file_name + ".tar.gz") - test_file_decompressed = testing._get_data_dir() / test_file_name - - # delete decompressed test file if it exists - if test_file_decompressed.exists(): - test_file_decompressed.unlink() - - # delete lfs archive file if it exists - if test_file_compressed.exists(): - test_file_compressed.unlink() - - assert not test_file_compressed.exists() - assert not test_file_decompressed.exists() - - # pull the lfs file reference from git - env = os.environ.copy() - env["GIT_LFS_SKIP_SMUDGE"] = "1" - subprocess.run( - ["git", "checkout", "HEAD", "--", test_file_compressed], - cwd=repo_root, - env=env, - check=True, - capture_output=True, - ) - - # ensure we have a pointer file from git (small ASCII text file) - assert test_file_compressed.exists() - assert test_file_compressed.stat().st_size < 200 - - # trigger a data file pull - assert testing.testData(test_file_name) == test_file_decompressed - - # validate data is received - assert test_file_compressed.exists() - assert test_file_decompressed.exists() - - # validate hashes - with test_file_compressed.open("rb") as f: - assert test_file_compressed.stat().st_size > 200 - compressed_sha256 = hashlib.sha256(f.read()).hexdigest() - assert ( - compressed_sha256 == "b8cf30439b41033ccb04b09b9fc8388d18fb544d55b85c155dbf85700b9e7603" - ) - - with test_file_decompressed.open("rb") as f: - decompressed_sha256 = hashlib.sha256(f.read()).hexdigest() - assert ( - decompressed_sha256 - == "55d451dde49b05e3ad386fdd4ae9e9378884b8905bff1ca8aaea7d039ff42ddd" - ) - - -def test_pull_dir(): - repo_root = testing._get_repo_root() - test_dir_name = "ab_lidar_frames" - test_dir_compressed = testing._get_lfs_dir() / (test_dir_name + ".tar.gz") - test_dir_decompressed = testing._get_data_dir() / test_dir_name - - # delete decompressed test directory if it exists - if test_dir_decompressed.exists(): - for item in test_dir_decompressed.iterdir(): - item.unlink() - test_dir_decompressed.rmdir() - - # delete lfs archive file if it exists - if test_dir_compressed.exists(): - test_dir_compressed.unlink() - - # pull the lfs file reference from git - env = os.environ.copy() - env["GIT_LFS_SKIP_SMUDGE"] = "1" - subprocess.run( - ["git", "checkout", "HEAD", "--", test_dir_compressed], - cwd=repo_root, - env=env, - check=True, - capture_output=True, - ) - - # ensure we have a pointer file from git (small ASCII text file) - assert test_dir_compressed.exists() - assert test_dir_compressed.stat().st_size < 200 - - # trigger a data file pull - assert testing.testData(test_dir_name) == test_dir_decompressed - assert test_dir_compressed.stat().st_size > 200 - - # validate data is received - assert test_dir_compressed.exists() - assert test_dir_decompressed.exists() - - for [file, expected_hash] in zip( - sorted(test_dir_decompressed.iterdir()), - [ - "6c3aaa9a79853ea4a7453c7db22820980ceb55035777f7460d05a0fa77b3b1b3", - "456cc2c23f4ffa713b4e0c0d97143c27e48bbe6ef44341197b31ce84b3650e74", - ], - ): - with file.open("rb") as f: - sha256 = hashlib.sha256(f.read()).hexdigest() - assert sha256 == expected_hash - - -def test_sensor_replay(): - counter = 0 - for message in testing.SensorReplay(name="office_lidar").iterate(): - counter += 1 - assert isinstance(message, dict) - assert counter == 500 - - -def test_sensor_replay_cast(): - counter = 0 - for message in testing.SensorReplay( - name="office_lidar", autocast=lambda x: LidarMessage.from_msg(x) - ).iterate(): - counter += 1 - assert isinstance(message, LidarMessage) - assert counter == 500 diff --git a/dimos/utils/testing.py b/dimos/utils/testing.py index bd9a37d00a..e69de29bb2 100644 --- a/dimos/utils/testing.py +++ b/dimos/utils/testing.py @@ -1,224 +0,0 @@ -import subprocess -import tarfile -import glob -import os -import pickle -from functools import cache -from pathlib import Path -from typing import Union, Iterator, TypeVar, Generic, Optional, Any, Type, Callable - -from reactivex import operators as ops -from reactivex import interval, from_iterable -from reactivex.observable import Observable - - -def _check_git_lfs_available() -> None: - try: - subprocess.run(["git", "lfs", "version"], capture_output=True, check=True, text=True) - except (subprocess.CalledProcessError, FileNotFoundError): - raise RuntimeError( - "Git LFS is not installed. Please install git-lfs to use test data utilities.\n" - "Installation instructions: https://git-lfs.github.io/" - ) - return True - - -@cache -def _get_repo_root() -> Path: - try: - result = subprocess.run( - ["git", "rev-parse", "--show-toplevel"], capture_output=True, check=True, text=True - ) - return Path(result.stdout.strip()) - except subprocess.CalledProcessError: - raise RuntimeError("Not in a Git repository") - - -@cache -def _get_data_dir() -> Path: - return _get_repo_root() / "tests" / "data" - - -@cache -def _get_lfs_dir() -> Path: - return _get_data_dir() / ".lfs" - - -def _is_lfs_pointer_file(file_path: Path) -> bool: - try: - # LFS pointer files are small (typically < 200 bytes) and start with specific text - if file_path.stat().st_size > 1024: # LFS pointers are much smaller - return False - - with open(file_path, "r", encoding="utf-8") as f: - first_line = f.readline().strip() - return first_line.startswith("version https://git-lfs.github.com/spec/") - - except (UnicodeDecodeError, OSError): - return False - - -def _lfs_pull(file_path: Path, repo_root: Path) -> None: - try: - relative_path = file_path.relative_to(repo_root) - - subprocess.run( - ["git", "lfs", "pull", "--include", str(relative_path)], - cwd=repo_root, - check=True, - capture_output=True, - ) - except subprocess.CalledProcessError as e: - raise RuntimeError(f"Failed to pull LFS file {file_path}: {e}") - - -def _pull_lfs_archive(filename: Union[str, Path]) -> Path: - # Check Git LFS availability first - _check_git_lfs_available() - - # Find repository root - repo_root = _get_repo_root() - - # Construct path to test data file - file_path = _get_lfs_dir() / (filename + ".tar.gz") - - # Check if file exists - if not file_path.exists(): - raise FileNotFoundError( - f"Test file '{filename}' not found at {file_path}. " - f"Make sure the file is committed to Git LFS in the tests/data directory." - ) - - # If it's an LFS pointer file, ensure LFS is set up and pull the file - if _is_lfs_pointer_file(file_path): - _lfs_pull(file_path, repo_root) - - # Verify the file was actually downloaded - if _is_lfs_pointer_file(file_path): - raise RuntimeError( - f"Failed to download LFS file '{filename}'. The file is still a pointer after attempting to pull." - ) - - return file_path - - -def _decompress_archive(filename: Union[str, Path]) -> Path: - target_dir = _get_data_dir() - filename_path = Path(filename) - with tarfile.open(filename_path, "r:gz") as tar: - tar.extractall(target_dir) - return target_dir / filename_path.name.replace(".tar.gz", "") - - -def testData(filename: Union[str, Path]) -> Path: - """ - Get the path to a test data, downloading from LFS if needed. - - This function will: - 1. Check that Git LFS is available - 2. Locate the file in the tests/data directory - 3. Initialize Git LFS if needed - 4. Download the file from LFS if it's a pointer file - 5. Return the Path object to the actual file or dir - - Args: - filename: Name of the test file (e.g., "lidar_sample.bin") - - Returns: - Path: Path object to the test file - - Raises: - RuntimeError: If Git LFS is not available or LFS operations fail - FileNotFoundError: If the test file doesn't exist - - Usage: - # As string path - file_path = str(testFile("sample.bin")) - - # As context manager for file operations - with testFile("sample.bin").open('rb') as f: - data = f.read() - """ - data_dir = _get_data_dir() - file_path = data_dir / filename - - # already pulled and decompressed, return it directly - if file_path.exists(): - return file_path - - return _decompress_archive(_pull_lfs_archive(filename)) - - -T = TypeVar("T") - - -class SensorReplay(Generic[T]): - """Generic sensor data replay utility. - - Args: - name: The name of the test dataset - autocast: Optional function that takes unpickled data and returns a processed result. - For example: lambda data: LidarMessage.from_msg(data) - """ - - def __init__(self, name: str, autocast: Optional[Callable[[Any], T]] = None): - self.root_dir = testData(name) - self.autocast = autocast - self.cnt = 0 - - def load(self, *names: Union[int, str]) -> Union[T, Any, list[T], list[Any]]: - if len(names) == 1: - return self.load_one(names[0]) - return list(map(lambda name: self.load_one(name), names)) - - def load_one(self, name: Union[int, str, Path]) -> Union[T, Any]: - if isinstance(name, int): - full_path = self.root_dir / f"/{name:03d}.pickle" - elif isinstance(name, Path): - full_path = self.root_dir / f"/{name}.pickle" - else: - full_path = name - - with open(full_path, "rb") as f: - data = pickle.load(f) - if self.autocast: - return self.autocast(data) - return data - - def iterate(self) -> Iterator[Union[T, Any]]: - pattern = os.path.join(self.root_dir, "*") - for file_path in sorted(glob.glob(pattern)): - yield self.load_one(file_path) - - def stream(self, rate_hz: float = 10.0) -> Observable[Union[T, Any]]: - sleep_time = 1.0 / rate_hz - - return from_iterable(self.iterate()).pipe( - ops.zip(interval(sleep_time)), - ops.map(lambda x: x[0] if isinstance(x, tuple) else x), - ) - - def save_stream(self, observable: Observable[Union[T, Any]]) -> Observable[int]: - return observable.pipe(ops.map(lambda frame: self.save_one(frame))) - - def save(self, *frames) -> int: - [self.save_one(frame) for frame in frames] - return self.cnt - - def save_one(self, frame) -> int: - file_name = f"/{self.cnt:03d}.pickle" - full_path = self.root_dir + file_name - - self.cnt += 1 - - if os.path.isfile(full_path): - raise Exception(f"file {full_path} exists") - - # Convert to raw message if frame has a raw_msg attribute - if hasattr(frame, "raw_msg"): - frame = frame.raw_msg - - with open(full_path, "wb") as f: - pickle.dump(frame, f) - - return self.cnt diff --git a/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py b/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py new file mode 100644 index 0000000000..9dcffd7a45 --- /dev/null +++ b/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py @@ -0,0 +1,37 @@ +from dimos.utils.threadpool import get_scheduler +import os +from dimos.robot.unitree.unitree_go2 import UnitreeGo2 +from dimos.robot.unitree.unitree_skills import MyUnitreeSkills +from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl +from dimos.agents.agent import OpenAIAgent +from dimos.stream.audio.pipelines import tts, stt +from dimos.stream.audio.utils import keepalive + + +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/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py new file mode 100644 index 0000000000..665135cb69 --- /dev/null +++ b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py @@ -0,0 +1,32 @@ +# 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 test_header + +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent + +# Load API key from environment +load_dotenv() + +# Create a CerebrasAgent instance +agent = CerebrasAgent( + 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 Cerebras Agent: {response}") \ No newline at end of file diff --git a/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py new file mode 100644 index 0000000000..0304b0272d --- /dev/null +++ b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py @@ -0,0 +1,110 @@ +# 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 +import os +from dimos.robot.robot import MockRobot +import tests.test_header + +import time +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent +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.web.robot_web_interface import RobotWebInterface +from dimos.skills.observe_stream import ObserveStream +from dimos.skills.kill_skill import KillSkill +from dimos.skills.navigation import NavigateWithText, GetPose, NavigateToGoal +from dimos.skills.visual_navigation_skills import FollowHuman +import reactivex as rx +import reactivex.operators as ops +from dimos.stream.audio.pipelines import tts, stt +from dimos.web.websocket_vis.server import WebsocketVis +import threading +from dimos.types.vector import Vector +from dimos.skills.speak import Speak + +# Load API key from environment +load_dotenv() + +robot = MockRobot() + +# 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=5556, text_streams=text_streams,) + +# stt_node = stt() +robot_skills = MyUnitreeSkills() + + +# Create a CerebrasAgent instance +agent = CerebrasAgent( + dev_name="test_cerebras_agent", + # input_query_stream=stt_node.emit_text(), + input_query_stream=web_interface.query_stream, + skills=robot_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="llama-4-scout-17b-16e-instruct" +) + +# tts_node = tts() +# tts_node.consume_text(agent.get_response_observable()) + +robot_skills.add(ObserveStream) +robot_skills.add(KillSkill) +robot_skills.add(NavigateWithText) +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("NavigateWithText", 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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") +print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") + +web_interface.run() \ No newline at end of file diff --git a/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py new file mode 100644 index 0000000000..547ee7e139 --- /dev/null +++ b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py @@ -0,0 +1,186 @@ +import os +import sys +import time +import cv2 +import numpy as np +import queue +import threading +import json +from reactivex import Subject, operators as RxOps +from openai import OpenAI +import tests.test_header + +from dimos.stream.video_provider import VideoProvider +from dimos.perception.object_tracker import ObjectTrackingStream +from dimos.models.qwen.video_query import get_bbox_from_qwen +from dimos.utils.logging_config import logger + +# 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") \ No newline at end of file diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index b389f885ea..0304b0272d 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -14,6 +14,7 @@ import sys import os +from dimos.robot.robot import MockRobot import tests.test_header import time @@ -38,32 +39,36 @@ # Load API key from environment load_dotenv() -robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - mock_connection=False) +robot = MockRobot() + +# 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()) +# 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} +# 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=5556, text_streams=text_streams, **streams) +web_interface = RobotWebInterface(port=5556, text_streams=text_streams,) + +# stt_node = stt() +robot_skills = MyUnitreeSkills() -stt_node = stt() # Create a CerebrasAgent instance agent = CerebrasAgent( dev_name="test_cerebras_agent", - input_query_stream=stt_node.emit_text(), - # input_query_stream=web_interface.query_stream, - skills=robot.get_skills(), + # input_query_stream=stt_node.emit_text(), + input_query_stream=web_interface.query_stream, + skills=robot_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: @@ -76,16 +81,15 @@ model_name="llama-4-scout-17b-16e-instruct" ) -tts_node = tts() +# 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(NavigateWithText) robot_skills.add(FollowHuman) robot_skills.add(GetPose) -robot_skills.add(Speak) +# 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) @@ -93,34 +97,14 @@ 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) +# 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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") +# print(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") -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() \ No newline at end of file diff --git a/untitled.md b/untitled.md new file mode 100644 index 0000000000..e69de29bb2 From f44797a4efd9e3d450353be066532a020e4a7cd5 Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Thu, 29 May 2025 03:45:23 +0000 Subject: [PATCH 19/46] CI code cleanup --- .../cerebras_agent-checkpoint.py | 2 +- dimos/agents/cerebras_agent.py | 19 ---- .../test_cerebras_agent_query-checkpoint.py | 7 +- .../test_cerebras_agent_skills-checkpoint.py | 13 +-- ...st_object_tracking_with_qwen-checkpoint.py | 86 +++++++++++-------- tests/test_cerebras_agent_query.py | 7 +- tests/test_cerebras_agent_skills.py | 13 +-- 7 files changed, 70 insertions(+), 77 deletions(-) diff --git a/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py index 2c32453ed6..e886238fb6 100644 --- a/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py +++ b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py @@ -268,7 +268,7 @@ def _send_query(self, messages: list) -> Any: tools = self.skill_library.get_tools() api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - + # Make the API call response = self.client.chat.completions.create(**api_params) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 73d4659b46..2c32453ed6 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -269,25 +269,6 @@ def _send_query(self, messages: list) -> Any: api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - # Add response format for structured output if specified - if self.response_model is not None: - # Convert Pydantic model to JSON schema for Cerebras - from pydantic import TypeAdapter - schema = TypeAdapter(self.response_model).json_schema() - - # Ensure additionalProperties is set to False for strict mode - if "additionalProperties" not in schema: - schema["additionalProperties"] = False - - api_params["response_format"] = { - "type": "json_schema", - "json_schema": { - "name": self.response_model.__name__ if hasattr(self.response_model, '__name__') else "response", - "strict": True, - "schema": schema - } - } - # Make the API call response = self.client.chat.completions.create(**api_params) diff --git a/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py index 665135cb69..5ed4007eed 100644 --- a/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py +++ b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py @@ -21,12 +21,9 @@ load_dotenv() # Create a CerebrasAgent instance -agent = CerebrasAgent( - dev_name="test_agent", - query="What is the capital of France?" -) +agent = CerebrasAgent(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 Cerebras Agent: {response}") \ No newline at end of file +print(f"Response from Cerebras Agent: {response}") diff --git a/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py index 0304b0272d..c6dead4570 100644 --- a/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py +++ b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py @@ -57,7 +57,10 @@ "agent_responses": agent_response_stream, } -web_interface = RobotWebInterface(port=5556, text_streams=text_streams,) +web_interface = RobotWebInterface( + port=5556, + text_streams=text_streams, +) # stt_node = stt() robot_skills = MyUnitreeSkills() @@ -78,7 +81,7 @@ 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="llama-4-scout-17b-16e-instruct" + model_name="llama-4-scout-17b-16e-instruct", ) # tts_node = tts() @@ -100,11 +103,9 @@ # 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) -) +agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) # print(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") -web_interface.run() \ No newline at end of file +web_interface.run() diff --git a/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py index 547ee7e139..c2cb004f90 100644 --- a/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py +++ b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py @@ -29,7 +29,7 @@ # 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_width_mm = 4.8 # mm (1/4" sensor) sensor_height_mm = 3.6 # mm # Calculate focal length in pixels @@ -43,9 +43,7 @@ # 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 + camera_intrinsics=camera_intrinsics, camera_pitch=0.0, camera_height=0.5 ) # Create video streams @@ -53,8 +51,11 @@ 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.") +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): @@ -64,38 +65,55 @@ def on_next(result): # 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) - + 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) - + 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) - + 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 @@ -105,14 +123,12 @@ def on_completed(): 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 + 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 @@ -129,14 +145,14 @@ def detection_task(): 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() @@ -150,37 +166,37 @@ def detection_task(): # 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'): + 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'): + 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") \ No newline at end of file + print("Cleanup complete") diff --git a/tests/test_cerebras_agent_query.py b/tests/test_cerebras_agent_query.py index 665135cb69..5ed4007eed 100644 --- a/tests/test_cerebras_agent_query.py +++ b/tests/test_cerebras_agent_query.py @@ -21,12 +21,9 @@ load_dotenv() # Create a CerebrasAgent instance -agent = CerebrasAgent( - dev_name="test_agent", - query="What is the capital of France?" -) +agent = CerebrasAgent(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 Cerebras Agent: {response}") \ No newline at end of file +print(f"Response from Cerebras Agent: {response}") diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index 0304b0272d..c6dead4570 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -57,7 +57,10 @@ "agent_responses": agent_response_stream, } -web_interface = RobotWebInterface(port=5556, text_streams=text_streams,) +web_interface = RobotWebInterface( + port=5556, + text_streams=text_streams, +) # stt_node = stt() robot_skills = MyUnitreeSkills() @@ -78,7 +81,7 @@ 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="llama-4-scout-17b-16e-instruct" + model_name="llama-4-scout-17b-16e-instruct", ) # tts_node = tts() @@ -100,11 +103,9 @@ # 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) -) +agent.get_response_observable().subscribe(lambda x: agent_response_subject.on_next(x)) # print(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") -web_interface.run() \ No newline at end of file +web_interface.run() From e164f38eace0574a96cdfcf3836cc34aeab1d03c Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 00:20:39 -0700 Subject: [PATCH 20/46] updated cerebras_agent --- dimos/agents/cerebras_agent.py | 222 +++++++++++++++------------------ 1 file changed, 101 insertions(+), 121 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 2c32453ed6..c9f7863b5a 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -51,32 +51,30 @@ class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. - + This class implements the _send_query method to interact with Cerebras API using their official SDK, allowing most of the LLMAgent logic to be reused. """ - def __init__( - self, - dev_name: str, - agent_type: str = "Vision", - query: str = "What do you see?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_input_tokens_per_request: int = 128000, - max_output_tokens_per_request: int = 16384, - model_name: str = "llama-4-scout-17b-16e-instruct", - skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, - response_model: Optional[BaseModel] = None, - frame_processor: Optional[FrameProcessor] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None, - ): + def __init__(self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "llama-4-scout-17b-16e-instruct", + skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None): """ Initializes a new instance of the CerebrasAgent. @@ -112,7 +110,7 @@ def __init__( process_all_inputs = True else: process_all_inputs = False - + super().__init__( dev_name=dev_name, agent_type=agent_type, @@ -122,12 +120,12 @@ def __init__( system_query=system_query, input_query_stream=input_query_stream, input_video_stream=input_video_stream, - input_data_stream=input_data_stream, + input_data_stream=input_data_stream ) - + # Initialize Cerebras client self.client = Cerebras() - + self.query = query self.output_dir = output_dir os.makedirs(self.output_dir, exist_ok=True) @@ -148,8 +146,8 @@ def __init__( elif isinstance(self.skills, AbstractSkill): self.skill_library = SkillLibrary() self.skill_library.add(self.skills) - - self.response_model = response_model + + self.response_model = response_model if response_model is not None else NOT_GIVEN self.model_name = model_name self.image_detail = image_detail self.max_output_tokens_per_request = max_output_tokens_per_request @@ -163,35 +161,28 @@ def __init__( def _add_context_to_memory(self): """Adds initial context to the agent's memory.""" context_data = [ - ( - "id0", - "Optical Flow is a technique used to track the movement of objects in a video sequence.", - ), - ( - "id1", - "Edge Detection is a technique used to identify the boundaries of objects in an image.", - ), - ("id2", "Video is a sequence of frames captured at regular intervals."), - ( - "id3", - "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", - ), - ( - "id4", - "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", - ), + ("id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence." + ), + ("id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image." + ), + ("id2", + "Video is a sequence of frames captured at regular intervals."), + ("id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects." + ), + ("id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate." + ), ] for doc_id, text in context_data: self.agent_memory.add_vector(doc_id, text) - def _build_prompt( - self, - messages: list, - base64_image: Optional[Union[str, List[str]]] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - condensed_results: str = "", - ) -> list: + def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[str]]] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + condensed_results: str = "") -> list: """Builds a prompt message specifically for Cerebras API. Args: @@ -204,41 +195,44 @@ def _build_prompt( Returns: list: Messages formatted for Cerebras API. """ - + # Add system message if provided and not already in history if self.system_query and (not messages or messages[0].get("role") != "system"): messages.insert(0, {"role": "system", "content": self.system_query}) logger.info("Added system message to conversation") - + # Append user query while handling RAG if condensed_results: user_message = {"role": "user", "content": f"{condensed_results}\n\n{self.query}"} logger.info("Created user message with RAG context") - else: + else: user_message = {"role": "user", "content": self.query} - + messages.append(user_message) - + if base64_image is not None: # Handle both single image (str) and multiple images (List[str]) images = [base64_image] if isinstance(base64_image, str) else base64_image - + # For Cerebras, we'll add images inline with text (OpenAI-style format) for img in images: img_content = [ - {"type": "text", "text": "Here is an image to analyze:"}, + { + "type": "text", + "text": "Here is an image to analyze:" + }, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{img}", - "detail": self.image_detail, - }, - }, + "detail": self.image_detail + } + } ] messages.append({"role": "user", "content": img_content}) - + logger.info(f"Added {len(images)} image(s) to conversation") - + return messages def _send_query(self, messages: list) -> Any: @@ -262,7 +256,7 @@ def _send_query(self, messages: list) -> Any: "messages": messages, "max_tokens": self.max_output_tokens_per_request, } - + # Add tools if available if self.skill_library and self.skill_library.get_tools(): tools = self.skill_library.get_tools() @@ -271,14 +265,14 @@ def _send_query(self, messages: list) -> Any: # Make the API call response = self.client.chat.completions.create(**api_params) - + response_message = response.choices[0].message if response_message is None: logger.error("Response message does not exist.") raise Exception("Response message does not exist.") - + return response_message - + except ConnectionError as ce: logger.error(f"Connection error with Cerebras API: {ce}") raise @@ -289,19 +283,17 @@ def _send_query(self, messages: list) -> Any: logger.error(f"Unexpected error in Cerebras API call: {e}") raise - def _observable_query( - self, - observer: Observer, - base64_image: Optional[str] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - incoming_query: Optional[str] = None, - reset_conversation: bool = False, - ): + def _observable_query(self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + reset_conversation: bool = False): """Main query handler that manages conversation history and Cerebras interactions. - + This method follows ClaudeAgent's pattern for efficient conversation history management. - + Args: observer (Observer): The observer to emit responses to. base64_image (str): Optional Base64-encoded image. @@ -325,15 +317,13 @@ def _observable_query( _, condensed_results = self._get_rag_context() # Build prompt - messages = self._build_prompt( - messages, base64_image, dimensions, override_token_limit, condensed_results - ) - + messages = self._build_prompt(messages, base64_image, dimensions, override_token_limit, condensed_results) + # Send query and get response logger.info("Sending Query.") response_message = self._send_query(messages) logger.info(f"Received Response: {response_message}") - + if response_message is None: logger.error("Received None response from Cerebras API") observer.on_next("") @@ -342,50 +332,44 @@ def _observable_query( # Add assistant response to local messages (always) assistant_message = {"role": "assistant"} - + if response_message.content: assistant_message["content"] = response_message.content else: assistant_message["content"] = "" # Ensure content is never None - - if hasattr(response_message, "tool_calls") and response_message.tool_calls: + + if hasattr(response_message, 'tool_calls') and response_message.tool_calls: assistant_message["tool_calls"] = [] for tool_call in response_message.tool_calls: - assistant_message["tool_calls"].append( - { - "id": tool_call.id, - "type": "function", - "function": { - "name": tool_call.function.name, - "arguments": tool_call.function.arguments, - }, + assistant_message["tool_calls"].append({ + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments } - ) - logger.info( - f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" - ) - + }) + logger.info(f"Assistant response includes {len(response_message.tool_calls)} tool call(s)") + messages.append(assistant_message) # Handle tool calls if present (add tool messages to conversation) self._handle_tooling(response_message, messages) # At the end, append only new messages to the global conversation history under a lock - if not hasattr(self, "_history_lock"): + if not hasattr(self, '_history_lock'): self._history_lock = threading.Lock() with self._history_lock: for msg in messages[base_len:]: self.conversation_history.append(msg) - logger.info( - f"Updated conversation history (total: {len(self.conversation_history)} messages)" - ) + logger.info(f"Updated conversation history (total: {len(self.conversation_history)} messages)") # Send response to observers result = response_message.content or "" observer.on_next(result) self.response_subject.on_next(result) observer.on_completed() - + except Exception as e: logger.error(f"Query failed in {self.dev_name}: {e}") observer.on_error(e) @@ -393,30 +377,26 @@ def _observable_query( def _handle_tooling(self, response_message, messages): """Executes tools and appends tool-use/result blocks to messages.""" - if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: + if not hasattr(response_message, 'tool_calls') or not response_message.tool_calls: logger.info("No tool calls found in response message") return None - + if len(response_message.tool_calls) > 1: - logger.warning( - "Multiple tool calls detected in response message. Not a tested feature." - ) + logger.warning("Multiple tool calls detected in response message. Not a tested feature.") # Execute all tools and add their results to messages for tool_call in response_message.tool_calls: logger.info(f"Processing tool call: {tool_call.function.name}") - + # Execute the tool args = json.loads(tool_call.function.arguments) tool_result = self.skill_library.call(tool_call.function.name, **args) logger.info(f"Function Call Results: {tool_result}") - + # Add tool result to conversation history (OpenAI format) - messages.append( - { - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(tool_result), - "name": tool_call.function.name, - } - ) + messages.append({ + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(tool_result), + "name": tool_call.function.name + }) \ No newline at end of file From bf7efaca2086cbd34335c84ee90655cc04fafaae Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Thu, 29 May 2025 07:21:57 +0000 Subject: [PATCH 21/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 222 ++++++++++++++++++--------------- 1 file changed, 121 insertions(+), 101 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index c9f7863b5a..63f21a00de 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -51,30 +51,32 @@ class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. - + This class implements the _send_query method to interact with Cerebras API using their official SDK, allowing most of the LLMAgent logic to be reused. """ - def __init__(self, - dev_name: str, - agent_type: str = "Vision", - query: str = "What do you see?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_input_tokens_per_request: int = 128000, - max_output_tokens_per_request: int = 16384, - model_name: str = "llama-4-scout-17b-16e-instruct", - skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, - response_model: Optional[BaseModel] = None, - frame_processor: Optional[FrameProcessor] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None): + def __init__( + self, + dev_name: str, + agent_type: str = "Vision", + query: str = "What do you see?", + input_query_stream: Optional[Observable] = None, + input_video_stream: Optional[Observable] = None, + input_data_stream: Optional[Observable] = None, + output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), + agent_memory: Optional[AbstractAgentSemanticMemory] = None, + system_query: Optional[str] = None, + max_input_tokens_per_request: int = 128000, + max_output_tokens_per_request: int = 16384, + model_name: str = "llama-4-scout-17b-16e-instruct", + skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, + response_model: Optional[BaseModel] = None, + frame_processor: Optional[FrameProcessor] = None, + image_detail: str = "low", + pool_scheduler: Optional[ThreadPoolScheduler] = None, + process_all_inputs: Optional[bool] = None, + ): """ Initializes a new instance of the CerebrasAgent. @@ -110,7 +112,7 @@ def __init__(self, process_all_inputs = True else: process_all_inputs = False - + super().__init__( dev_name=dev_name, agent_type=agent_type, @@ -120,12 +122,12 @@ def __init__(self, system_query=system_query, input_query_stream=input_query_stream, input_video_stream=input_video_stream, - input_data_stream=input_data_stream + input_data_stream=input_data_stream, ) - + # Initialize Cerebras client self.client = Cerebras() - + self.query = query self.output_dir = output_dir os.makedirs(self.output_dir, exist_ok=True) @@ -146,7 +148,7 @@ def __init__(self, elif isinstance(self.skills, AbstractSkill): self.skill_library = SkillLibrary() self.skill_library.add(self.skills) - + self.response_model = response_model if response_model is not None else NOT_GIVEN self.model_name = model_name self.image_detail = image_detail @@ -161,28 +163,35 @@ def __init__(self, def _add_context_to_memory(self): """Adds initial context to the agent's memory.""" context_data = [ - ("id0", - "Optical Flow is a technique used to track the movement of objects in a video sequence." - ), - ("id1", - "Edge Detection is a technique used to identify the boundaries of objects in an image." - ), - ("id2", - "Video is a sequence of frames captured at regular intervals."), - ("id3", - "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects." - ), - ("id4", - "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate." - ), + ( + "id0", + "Optical Flow is a technique used to track the movement of objects in a video sequence.", + ), + ( + "id1", + "Edge Detection is a technique used to identify the boundaries of objects in an image.", + ), + ("id2", "Video is a sequence of frames captured at regular intervals."), + ( + "id3", + "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", + ), + ( + "id4", + "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", + ), ] for doc_id, text in context_data: self.agent_memory.add_vector(doc_id, text) - def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[str]]] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - condensed_results: str = "") -> list: + def _build_prompt( + self, + messages: list, + base64_image: Optional[Union[str, List[str]]] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + condensed_results: str = "", + ) -> list: """Builds a prompt message specifically for Cerebras API. Args: @@ -195,44 +204,41 @@ def _build_prompt(self, messages: list, base64_image: Optional[Union[str, List[s Returns: list: Messages formatted for Cerebras API. """ - + # Add system message if provided and not already in history if self.system_query and (not messages or messages[0].get("role") != "system"): messages.insert(0, {"role": "system", "content": self.system_query}) logger.info("Added system message to conversation") - + # Append user query while handling RAG if condensed_results: user_message = {"role": "user", "content": f"{condensed_results}\n\n{self.query}"} logger.info("Created user message with RAG context") - else: + else: user_message = {"role": "user", "content": self.query} - + messages.append(user_message) - + if base64_image is not None: # Handle both single image (str) and multiple images (List[str]) images = [base64_image] if isinstance(base64_image, str) else base64_image - + # For Cerebras, we'll add images inline with text (OpenAI-style format) for img in images: img_content = [ - { - "type": "text", - "text": "Here is an image to analyze:" - }, + {"type": "text", "text": "Here is an image to analyze:"}, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{img}", - "detail": self.image_detail - } - } + "detail": self.image_detail, + }, + }, ] messages.append({"role": "user", "content": img_content}) - + logger.info(f"Added {len(images)} image(s) to conversation") - + return messages def _send_query(self, messages: list) -> Any: @@ -256,23 +262,23 @@ def _send_query(self, messages: list) -> Any: "messages": messages, "max_tokens": self.max_output_tokens_per_request, } - + # Add tools if available if self.skill_library and self.skill_library.get_tools(): tools = self.skill_library.get_tools() api_params["tools"] = tools # No conversion needed api_params["tool_choice"] = "auto" - + # Make the API call response = self.client.chat.completions.create(**api_params) - + response_message = response.choices[0].message if response_message is None: logger.error("Response message does not exist.") raise Exception("Response message does not exist.") - + return response_message - + except ConnectionError as ce: logger.error(f"Connection error with Cerebras API: {ce}") raise @@ -283,17 +289,19 @@ def _send_query(self, messages: list) -> Any: logger.error(f"Unexpected error in Cerebras API call: {e}") raise - def _observable_query(self, - observer: Observer, - base64_image: Optional[str] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - incoming_query: Optional[str] = None, - reset_conversation: bool = False): + def _observable_query( + self, + observer: Observer, + base64_image: Optional[str] = None, + dimensions: Optional[Tuple[int, int]] = None, + override_token_limit: bool = False, + incoming_query: Optional[str] = None, + reset_conversation: bool = False, + ): """Main query handler that manages conversation history and Cerebras interactions. - + This method follows ClaudeAgent's pattern for efficient conversation history management. - + Args: observer (Observer): The observer to emit responses to. base64_image (str): Optional Base64-encoded image. @@ -317,13 +325,15 @@ def _observable_query(self, _, condensed_results = self._get_rag_context() # Build prompt - messages = self._build_prompt(messages, base64_image, dimensions, override_token_limit, condensed_results) - + messages = self._build_prompt( + messages, base64_image, dimensions, override_token_limit, condensed_results + ) + # Send query and get response logger.info("Sending Query.") response_message = self._send_query(messages) logger.info(f"Received Response: {response_message}") - + if response_message is None: logger.error("Received None response from Cerebras API") observer.on_next("") @@ -332,44 +342,50 @@ def _observable_query(self, # Add assistant response to local messages (always) assistant_message = {"role": "assistant"} - + if response_message.content: assistant_message["content"] = response_message.content else: assistant_message["content"] = "" # Ensure content is never None - - if hasattr(response_message, 'tool_calls') and response_message.tool_calls: + + if hasattr(response_message, "tool_calls") and response_message.tool_calls: assistant_message["tool_calls"] = [] for tool_call in response_message.tool_calls: - assistant_message["tool_calls"].append({ - "id": tool_call.id, - "type": "function", - "function": { - "name": tool_call.function.name, - "arguments": tool_call.function.arguments + assistant_message["tool_calls"].append( + { + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments, + }, } - }) - logger.info(f"Assistant response includes {len(response_message.tool_calls)} tool call(s)") - + ) + logger.info( + f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" + ) + messages.append(assistant_message) # Handle tool calls if present (add tool messages to conversation) self._handle_tooling(response_message, messages) # At the end, append only new messages to the global conversation history under a lock - if not hasattr(self, '_history_lock'): + if not hasattr(self, "_history_lock"): self._history_lock = threading.Lock() with self._history_lock: for msg in messages[base_len:]: self.conversation_history.append(msg) - logger.info(f"Updated conversation history (total: {len(self.conversation_history)} messages)") + logger.info( + f"Updated conversation history (total: {len(self.conversation_history)} messages)" + ) # Send response to observers result = response_message.content or "" observer.on_next(result) self.response_subject.on_next(result) observer.on_completed() - + except Exception as e: logger.error(f"Query failed in {self.dev_name}: {e}") observer.on_error(e) @@ -377,26 +393,30 @@ def _observable_query(self, def _handle_tooling(self, response_message, messages): """Executes tools and appends tool-use/result blocks to messages.""" - if not hasattr(response_message, 'tool_calls') or not response_message.tool_calls: + if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: logger.info("No tool calls found in response message") return None - + if len(response_message.tool_calls) > 1: - logger.warning("Multiple tool calls detected in response message. Not a tested feature.") + logger.warning( + "Multiple tool calls detected in response message. Not a tested feature." + ) # Execute all tools and add their results to messages for tool_call in response_message.tool_calls: logger.info(f"Processing tool call: {tool_call.function.name}") - + # Execute the tool args = json.loads(tool_call.function.arguments) tool_result = self.skill_library.call(tool_call.function.name, **args) logger.info(f"Function Call Results: {tool_result}") - + # Add tool result to conversation history (OpenAI format) - messages.append({ - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(tool_result), - "name": tool_call.function.name - }) \ No newline at end of file + messages.append( + { + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(tool_result), + "name": tool_call.function.name, + } + ) From 6a7735d6ac84e6c16c533d3e4b1d2920999ded6d Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 23:23:30 -0400 Subject: [PATCH 22/46] remove unsupported fields in cerebras_agent --- dimos/agents/cerebras_agent.py | 37 ++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 63f21a00de..93b8ea1de9 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -149,7 +149,7 @@ def __init__( self.skill_library = SkillLibrary() self.skill_library.add(self.skills) - self.response_model = response_model if response_model is not None else NOT_GIVEN + self.response_model = response_model self.model_name = model_name self.image_detail = image_detail self.max_output_tokens_per_request = max_output_tokens_per_request @@ -241,6 +241,30 @@ def _build_prompt( return messages + def clean_cerebras_schema(self, schema: dict) -> dict: + """Simple schema cleaner that removes unsupported fields for Cerebras API.""" + if not isinstance(schema, dict): + return schema + + # Removing the problematic fields that pydantic generates + cleaned = {} + unsupported_fields = { + 'minItems', 'maxItems', 'uniqueItems', + 'exclusiveMinimum', 'exclusiveMaximum', 'minimum', 'maximum' + } + + for key, value in schema.items(): + if key in unsupported_fields: + continue # Skip unsupported fields + elif isinstance(value, dict): + cleaned[key] = self.clean_cerebras_schema(value) + elif isinstance(value, list): + cleaned[key] = [self.clean_cerebras_schema(item) if isinstance(item, dict) else item for item in value] + else: + cleaned[key] = value + + return cleaned + def _send_query(self, messages: list) -> Any: """Sends the query to Cerebras API using the official Cerebras SDK. @@ -266,9 +290,18 @@ def _send_query(self, messages: list) -> Any: # Add tools if available if self.skill_library and self.skill_library.get_tools(): tools = self.skill_library.get_tools() - api_params["tools"] = tools # No conversion needed + for tool in tools: + if "function" in tool and "parameters" in tool["function"]: + tool["function"]["parameters"] = self.clean_cerebras_schema(tool["function"]["parameters"]) + api_params["tools"] = tools api_params["tool_choice"] = "auto" + if self.response_model is not None: + api_params["response_format"] = { + "type": "json_object", + "schema": schema + } + # Make the API call response = self.client.chat.completions.create(**api_params) From c45106628f6989a671392952eb3499761c1885d4 Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Fri, 30 May 2025 03:24:03 +0000 Subject: [PATCH 23/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 29 ++++++++++++++++++----------- 1 file changed, 18 insertions(+), 11 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 93b8ea1de9..5b3b94a8a4 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -245,24 +245,32 @@ def clean_cerebras_schema(self, schema: dict) -> dict: """Simple schema cleaner that removes unsupported fields for Cerebras API.""" if not isinstance(schema, dict): return schema - + # Removing the problematic fields that pydantic generates cleaned = {} unsupported_fields = { - 'minItems', 'maxItems', 'uniqueItems', - 'exclusiveMinimum', 'exclusiveMaximum', 'minimum', 'maximum' + "minItems", + "maxItems", + "uniqueItems", + "exclusiveMinimum", + "exclusiveMaximum", + "minimum", + "maximum", } - + for key, value in schema.items(): if key in unsupported_fields: continue # Skip unsupported fields elif isinstance(value, dict): cleaned[key] = self.clean_cerebras_schema(value) elif isinstance(value, list): - cleaned[key] = [self.clean_cerebras_schema(item) if isinstance(item, dict) else item for item in value] + cleaned[key] = [ + self.clean_cerebras_schema(item) if isinstance(item, dict) else item + for item in value + ] else: cleaned[key] = value - + return cleaned def _send_query(self, messages: list) -> Any: @@ -292,15 +300,14 @@ def _send_query(self, messages: list) -> Any: tools = self.skill_library.get_tools() for tool in tools: if "function" in tool and "parameters" in tool["function"]: - tool["function"]["parameters"] = self.clean_cerebras_schema(tool["function"]["parameters"]) + tool["function"]["parameters"] = self.clean_cerebras_schema( + tool["function"]["parameters"] + ) api_params["tools"] = tools api_params["tool_choice"] = "auto" if self.response_model is not None: - api_params["response_format"] = { - "type": "json_object", - "schema": schema - } + api_params["response_format"] = {"type": "json_object", "schema": schema} # Make the API call response = self.client.chat.completions.create(**api_params) From 9879f6de33c23220c7f8997abe1c297842a44549 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 20:32:31 -0700 Subject: [PATCH 24/46] minor changes --- dimos/agents/cerebras_agent.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 5b3b94a8a4..6f00baf137 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -33,7 +33,6 @@ from reactivex import Observable from reactivex.observer import Observer from reactivex.scheduler import ThreadPoolScheduler -from openai._types import NOT_GIVEN # Local imports from dimos.agents.agent import LLMAgent @@ -307,7 +306,7 @@ def _send_query(self, messages: list) -> Any: api_params["tool_choice"] = "auto" if self.response_model is not None: - api_params["response_format"] = {"type": "json_object", "schema": schema} + api_params["response_format"] = {"type": "json_object", "schema": self.response_model} # Make the API call response = self.client.chat.completions.create(**api_params) From 2a98f5c8ad0c5c9770c549c3697605ff0565a673 Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Fri, 30 May 2025 03:33:09 +0000 Subject: [PATCH 25/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 6f00baf137..6040e78d2c 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -306,7 +306,10 @@ def _send_query(self, messages: list) -> Any: api_params["tool_choice"] = "auto" if self.response_model is not None: - api_params["response_format"] = {"type": "json_object", "schema": self.response_model} + api_params["response_format"] = { + "type": "json_object", + "schema": self.response_model, + } # Make the API call response = self.client.chat.completions.create(**api_params) From 2b587613695ef9bf5555d5e744c3474f135a6044 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 23:35:39 -0700 Subject: [PATCH 26/46] merge dev --- .ipynb_checkpoints/untitled-checkpoint.md | 0 .../cerebras_agent-checkpoint.py | 422 ------------------ dimos/utils/test_testing.py | 129 ++++++ dimos/utils/testing.py | 224 ++++++++++ docker/deprecated/unitree/agents/Dockerfile | 6 +- .../unitree/agents/docker-compose.yml | 9 +- .../test_audio_robot_agent-checkpoint.py | 37 -- .../test_cerebras_agent_query-checkpoint.py | 29 -- .../test_cerebras_agent_skills-checkpoint.py | 111 ----- ...st_object_tracking_with_qwen-checkpoint.py | 202 --------- untitled.md | 0 11 files changed, 360 insertions(+), 809 deletions(-) delete mode 100644 .ipynb_checkpoints/untitled-checkpoint.md delete mode 100644 dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py delete mode 100644 tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py delete mode 100644 tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py delete mode 100644 tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py delete mode 100644 tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py delete mode 100644 untitled.md diff --git a/.ipynb_checkpoints/untitled-checkpoint.md b/.ipynb_checkpoints/untitled-checkpoint.md deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py b/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py deleted file mode 100644 index e886238fb6..0000000000 --- a/dimos/agents/.ipynb_checkpoints/cerebras_agent-checkpoint.py +++ /dev/null @@ -1,422 +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. - -"""Cerebras agent implementation for the DIMOS agent framework. - -This module provides a CerebrasAgent class that implements the LLMAgent interface -for Cerebras inference API using the official Cerebras Python SDK. -""" - -from __future__ import annotations - -import os -import threading -import copy -from typing import Any, Dict, List, Optional, Union, Tuple -import logging -import json - -from cerebras.cloud.sdk import Cerebras -from dotenv import load_dotenv -from pydantic import BaseModel -from reactivex import Observable -from reactivex.observer import Observer -from reactivex.scheduler import ThreadPoolScheduler -from openai._types import NOT_GIVEN - -# Local imports -from dimos.agents.agent import LLMAgent -from dimos.agents.memory.base import AbstractAgentSemanticMemory -from dimos.skills.skills import AbstractSkill, SkillLibrary -from dimos.stream.frame_processor import FrameProcessor -from dimos.utils.logging_config import setup_logger - -# Initialize environment variables -load_dotenv() - -# Initialize logger for the Cerebras agent -logger = setup_logger("dimos.agents.cerebras") - - -class CerebrasAgent(LLMAgent): - """Cerebras agent implementation using the official Cerebras Python SDK. - - This class implements the _send_query method to interact with Cerebras API - using their official SDK, allowing most of the LLMAgent logic to be reused. - """ - - def __init__( - self, - dev_name: str, - agent_type: str = "Vision", - query: str = "What do you see?", - input_query_stream: Optional[Observable] = None, - input_video_stream: Optional[Observable] = None, - input_data_stream: Optional[Observable] = None, - output_dir: str = os.path.join(os.getcwd(), "assets", "agent"), - agent_memory: Optional[AbstractAgentSemanticMemory] = None, - system_query: Optional[str] = None, - max_input_tokens_per_request: int = 128000, - max_output_tokens_per_request: int = 16384, - model_name: str = "llama-4-scout-17b-16e-instruct", - skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, - response_model: Optional[BaseModel] = None, - frame_processor: Optional[FrameProcessor] = None, - image_detail: str = "low", - pool_scheduler: Optional[ThreadPoolScheduler] = None, - process_all_inputs: Optional[bool] = None, - ): - """ - Initializes a new instance of the CerebrasAgent. - - Args: - dev_name (str): The device name of the agent. - agent_type (str): The type of the agent. - query (str): The default query text. - input_query_stream (Observable): An observable for query input. - input_video_stream (Observable): An observable for video frames. - input_data_stream (Observable): An observable for data input. - output_dir (str): Directory for output files. - agent_memory (AbstractAgentSemanticMemory): The memory system. - system_query (str): The system prompt to use with RAG context. - max_input_tokens_per_request (int): Maximum tokens for input. - max_output_tokens_per_request (int): Maximum tokens for output. - model_name (str): The Cerebras model name to use. Available options: - - llama-4-scout-17b-16e-instruct (default, fastest) - - llama3.1-8b - - llama-3.3-70b - - qwen-3-32b - - deepseek-r1-distill-llama-70b (private preview) - skills (Union[AbstractSkill, List[AbstractSkill], SkillLibrary]): Skills available to the agent. - response_model (BaseModel): Optional Pydantic model for structured responses. - frame_processor (FrameProcessor): Custom frame processor. - image_detail (str): Detail level for images ("low", "high", "auto"). - pool_scheduler (ThreadPoolScheduler): The scheduler to use for thread pool operations. - process_all_inputs (bool): Whether to process all inputs or skip when busy. - """ - # Determine appropriate default for process_all_inputs if not provided - if process_all_inputs is None: - # Default to True for text queries, False for video streams - if input_query_stream is not None and input_video_stream is None: - process_all_inputs = True - else: - process_all_inputs = False - - super().__init__( - dev_name=dev_name, - agent_type=agent_type, - agent_memory=agent_memory, - pool_scheduler=pool_scheduler, - process_all_inputs=process_all_inputs, - system_query=system_query, - input_query_stream=input_query_stream, - input_video_stream=input_video_stream, - input_data_stream=input_data_stream, - ) - - # Initialize Cerebras client - self.client = Cerebras() - - self.query = query - self.output_dir = output_dir - os.makedirs(self.output_dir, exist_ok=True) - - # Initialize conversation history for multi-turn conversations - self.conversation_history = [] - self._history_lock = threading.Lock() - - # Configure skills - self.skills = skills - self.skill_library = None - if isinstance(self.skills, SkillLibrary): - self.skill_library = self.skills - elif isinstance(self.skills, list): - self.skill_library = SkillLibrary() - for skill in self.skills: - self.skill_library.add(skill) - elif isinstance(self.skills, AbstractSkill): - self.skill_library = SkillLibrary() - self.skill_library.add(self.skills) - - self.response_model = response_model - self.model_name = model_name - self.image_detail = image_detail - self.max_output_tokens_per_request = max_output_tokens_per_request - self.max_input_tokens_per_request = max_input_tokens_per_request - - # Add static context to memory. - self._add_context_to_memory() - - logger.info("Cerebras Agent Initialized.") - - def _add_context_to_memory(self): - """Adds initial context to the agent's memory.""" - context_data = [ - ( - "id0", - "Optical Flow is a technique used to track the movement of objects in a video sequence.", - ), - ( - "id1", - "Edge Detection is a technique used to identify the boundaries of objects in an image.", - ), - ("id2", "Video is a sequence of frames captured at regular intervals."), - ( - "id3", - "Colors in Optical Flow are determined by the movement of light, and can be used to track the movement of objects.", - ), - ( - "id4", - "Json is a data interchange format that is easy for humans to read and write, and easy for machines to parse and generate.", - ), - ] - for doc_id, text in context_data: - self.agent_memory.add_vector(doc_id, text) - - def _build_prompt( - self, - messages: list, - base64_image: Optional[Union[str, List[str]]] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - condensed_results: str = "", - ) -> list: - """Builds a prompt message specifically for Cerebras API. - - Args: - messages (list): Existing messages list to build upon. - base64_image (Union[str, List[str]]): Optional Base64-encoded image(s). - dimensions (Tuple[int, int]): Optional image dimensions. - override_token_limit (bool): Whether to override token limits. - condensed_results (str): The condensed RAG context. - - Returns: - list: Messages formatted for Cerebras API. - """ - - # Add system message if provided and not already in history - if self.system_query and (not messages or messages[0].get("role") != "system"): - messages.insert(0, {"role": "system", "content": self.system_query}) - logger.info("Added system message to conversation") - - # Append user query while handling RAG - if condensed_results: - user_message = {"role": "user", "content": f"{condensed_results}\n\n{self.query}"} - logger.info("Created user message with RAG context") - else: - user_message = {"role": "user", "content": self.query} - - messages.append(user_message) - - if base64_image is not None: - # Handle both single image (str) and multiple images (List[str]) - images = [base64_image] if isinstance(base64_image, str) else base64_image - - # For Cerebras, we'll add images inline with text (OpenAI-style format) - for img in images: - img_content = [ - {"type": "text", "text": "Here is an image to analyze:"}, - { - "type": "image_url", - "image_url": { - "url": f"data:image/jpeg;base64,{img}", - "detail": self.image_detail, - }, - }, - ] - messages.append({"role": "user", "content": img_content}) - - logger.info(f"Added {len(images)} image(s) to conversation") - - return messages - - def _send_query(self, messages: list) -> Any: - """Sends the query to Cerebras API using the official Cerebras SDK. - - Args: - messages (list): The prompt messages to send. - - Returns: - The response message from Cerebras. - - Raises: - Exception: If no response message is returned. - ConnectionError: If there's an issue connecting to the API. - ValueError: If the messages or other parameters are invalid. - """ - try: - # Prepare API call parameters - api_params = { - "model": self.model_name, - "messages": messages, - "max_tokens": self.max_output_tokens_per_request, - } - - # Add tools if available - if self.skill_library and self.skill_library.get_tools(): - tools = self.skill_library.get_tools() - api_params["tools"] = tools # No conversion needed - api_params["tool_choice"] = "auto" - - # Make the API call - response = self.client.chat.completions.create(**api_params) - - response_message = response.choices[0].message - if response_message is None: - logger.error("Response message does not exist.") - raise Exception("Response message does not exist.") - - return response_message - - except ConnectionError as ce: - logger.error(f"Connection error with Cerebras API: {ce}") - raise - except ValueError as ve: - logger.error(f"Invalid parameters for Cerebras API: {ve}") - raise - except Exception as e: - logger.error(f"Unexpected error in Cerebras API call: {e}") - raise - - def _observable_query( - self, - observer: Observer, - base64_image: Optional[str] = None, - dimensions: Optional[Tuple[int, int]] = None, - override_token_limit: bool = False, - incoming_query: Optional[str] = None, - reset_conversation: bool = False, - ): - """Main query handler that manages conversation history and Cerebras interactions. - - This method follows ClaudeAgent's pattern for efficient conversation history management. - - Args: - observer (Observer): The observer to emit responses to. - base64_image (str): Optional Base64-encoded image. - dimensions (Tuple[int, int]): Optional image dimensions. - override_token_limit (bool): Whether to override token limits. - incoming_query (str): Optional query to update the agent's query. - reset_conversation (bool): Whether to reset the conversation history. - """ - try: - # Reset conversation history if requested - if reset_conversation: - self.conversation_history = [] - logger.info("Conversation history reset") - - # Create a local copy of conversation history and record its length - messages = copy.deepcopy(self.conversation_history) - base_len = len(messages) - - # Update query and get context - self._update_query(incoming_query) - _, condensed_results = self._get_rag_context() - - # Build prompt - messages = self._build_prompt( - messages, base64_image, dimensions, override_token_limit, condensed_results - ) - - # Send query and get response - logger.info("Sending Query.") - response_message = self._send_query(messages) - logger.info(f"Received Response: {response_message}") - - if response_message is None: - logger.error("Received None response from Cerebras API") - observer.on_next("") - observer.on_completed() - return - - # Add assistant response to local messages (always) - assistant_message = {"role": "assistant"} - - if response_message.content: - assistant_message["content"] = response_message.content - else: - assistant_message["content"] = "" # Ensure content is never None - - if hasattr(response_message, "tool_calls") and response_message.tool_calls: - assistant_message["tool_calls"] = [] - for tool_call in response_message.tool_calls: - assistant_message["tool_calls"].append( - { - "id": tool_call.id, - "type": "function", - "function": { - "name": tool_call.function.name, - "arguments": tool_call.function.arguments, - }, - } - ) - logger.info( - f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" - ) - - messages.append(assistant_message) - - # Handle tool calls if present (add tool messages to conversation) - self._handle_tooling(response_message, messages) - - # At the end, append only new messages to the global conversation history under a lock - if not hasattr(self, "_history_lock"): - self._history_lock = threading.Lock() - with self._history_lock: - for msg in messages[base_len:]: - self.conversation_history.append(msg) - logger.info( - f"Updated conversation history (total: {len(self.conversation_history)} messages)" - ) - - # Send response to observers - result = response_message.content or "" - observer.on_next(result) - self.response_subject.on_next(result) - observer.on_completed() - - except Exception as e: - logger.error(f"Query failed in {self.dev_name}: {e}") - observer.on_error(e) - self.response_subject.on_error(e) - - def _handle_tooling(self, response_message, messages): - """Executes tools and appends tool-use/result blocks to messages.""" - if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: - logger.info("No tool calls found in response message") - return None - - if len(response_message.tool_calls) > 1: - logger.warning( - "Multiple tool calls detected in response message. Not a tested feature." - ) - - # Execute all tools and add their results to messages - for tool_call in response_message.tool_calls: - logger.info(f"Processing tool call: {tool_call.function.name}") - - # Execute the tool - args = json.loads(tool_call.function.arguments) - tool_result = self.skill_library.call(tool_call.function.name, **args) - logger.info(f"Function Call Results: {tool_result}") - - # Add tool result to conversation history (OpenAI format) - messages.append( - { - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(tool_result), - "name": tool_call.function.name, - } - ) diff --git a/dimos/utils/test_testing.py b/dimos/utils/test_testing.py index e69de29bb2..e588962680 100644 --- a/dimos/utils/test_testing.py +++ b/dimos/utils/test_testing.py @@ -0,0 +1,129 @@ +import hashlib +import os +import subprocess +from dimos.utils import testing +from dimos.robot.unitree_webrtc.type.lidar import LidarMessage + + +def test_pull_file(): + repo_root = testing._get_repo_root() + test_file_name = "cafe.jpg" + test_file_compressed = testing._get_lfs_dir() / (test_file_name + ".tar.gz") + test_file_decompressed = testing._get_data_dir() / test_file_name + + # delete decompressed test file if it exists + if test_file_decompressed.exists(): + test_file_decompressed.unlink() + + # delete lfs archive file if it exists + if test_file_compressed.exists(): + test_file_compressed.unlink() + + assert not test_file_compressed.exists() + assert not test_file_decompressed.exists() + + # pull the lfs file reference from git + env = os.environ.copy() + env["GIT_LFS_SKIP_SMUDGE"] = "1" + subprocess.run( + ["git", "checkout", "HEAD", "--", test_file_compressed], + cwd=repo_root, + env=env, + check=True, + capture_output=True, + ) + + # ensure we have a pointer file from git (small ASCII text file) + assert test_file_compressed.exists() + assert test_file_compressed.stat().st_size < 200 + + # trigger a data file pull + assert testing.testData(test_file_name) == test_file_decompressed + + # validate data is received + assert test_file_compressed.exists() + assert test_file_decompressed.exists() + + # validate hashes + with test_file_compressed.open("rb") as f: + assert test_file_compressed.stat().st_size > 200 + compressed_sha256 = hashlib.sha256(f.read()).hexdigest() + assert ( + compressed_sha256 == "b8cf30439b41033ccb04b09b9fc8388d18fb544d55b85c155dbf85700b9e7603" + ) + + with test_file_decompressed.open("rb") as f: + decompressed_sha256 = hashlib.sha256(f.read()).hexdigest() + assert ( + decompressed_sha256 + == "55d451dde49b05e3ad386fdd4ae9e9378884b8905bff1ca8aaea7d039ff42ddd" + ) + + +def test_pull_dir(): + repo_root = testing._get_repo_root() + test_dir_name = "ab_lidar_frames" + test_dir_compressed = testing._get_lfs_dir() / (test_dir_name + ".tar.gz") + test_dir_decompressed = testing._get_data_dir() / test_dir_name + + # delete decompressed test directory if it exists + if test_dir_decompressed.exists(): + for item in test_dir_decompressed.iterdir(): + item.unlink() + test_dir_decompressed.rmdir() + + # delete lfs archive file if it exists + if test_dir_compressed.exists(): + test_dir_compressed.unlink() + + # pull the lfs file reference from git + env = os.environ.copy() + env["GIT_LFS_SKIP_SMUDGE"] = "1" + subprocess.run( + ["git", "checkout", "HEAD", "--", test_dir_compressed], + cwd=repo_root, + env=env, + check=True, + capture_output=True, + ) + + # ensure we have a pointer file from git (small ASCII text file) + assert test_dir_compressed.exists() + assert test_dir_compressed.stat().st_size < 200 + + # trigger a data file pull + assert testing.testData(test_dir_name) == test_dir_decompressed + assert test_dir_compressed.stat().st_size > 200 + + # validate data is received + assert test_dir_compressed.exists() + assert test_dir_decompressed.exists() + + for [file, expected_hash] in zip( + sorted(test_dir_decompressed.iterdir()), + [ + "6c3aaa9a79853ea4a7453c7db22820980ceb55035777f7460d05a0fa77b3b1b3", + "456cc2c23f4ffa713b4e0c0d97143c27e48bbe6ef44341197b31ce84b3650e74", + ], + ): + with file.open("rb") as f: + sha256 = hashlib.sha256(f.read()).hexdigest() + assert sha256 == expected_hash + + +def test_sensor_replay(): + counter = 0 + for message in testing.SensorReplay(name="office_lidar").iterate(): + counter += 1 + assert isinstance(message, dict) + assert counter == 500 + + +def test_sensor_replay_cast(): + counter = 0 + for message in testing.SensorReplay( + name="office_lidar", autocast=lambda x: LidarMessage.from_msg(x) + ).iterate(): + counter += 1 + assert isinstance(message, LidarMessage) + assert counter == 500 \ No newline at end of file diff --git a/dimos/utils/testing.py b/dimos/utils/testing.py index e69de29bb2..a92b884a5f 100644 --- a/dimos/utils/testing.py +++ b/dimos/utils/testing.py @@ -0,0 +1,224 @@ +import subprocess +import tarfile +import glob +import os +import pickle +from functools import cache +from pathlib import Path +from typing import Union, Iterator, TypeVar, Generic, Optional, Any, Type, Callable + +from reactivex import operators as ops +from reactivex import interval, from_iterable +from reactivex.observable import Observable + + +def _check_git_lfs_available() -> None: + try: + subprocess.run(["git", "lfs", "version"], capture_output=True, check=True, text=True) + except (subprocess.CalledProcessError, FileNotFoundError): + raise RuntimeError( + "Git LFS is not installed. Please install git-lfs to use test data utilities.\n" + "Installation instructions: https://git-lfs.github.io/" + ) + return True + + +@cache +def _get_repo_root() -> Path: + try: + result = subprocess.run( + ["git", "rev-parse", "--show-toplevel"], capture_output=True, check=True, text=True + ) + return Path(result.stdout.strip()) + except subprocess.CalledProcessError: + raise RuntimeError("Not in a Git repository") + + +@cache +def _get_data_dir() -> Path: + return _get_repo_root() / "tests" / "data" + + +@cache +def _get_lfs_dir() -> Path: + return _get_data_dir() / ".lfs" + + +def _is_lfs_pointer_file(file_path: Path) -> bool: + try: + # LFS pointer files are small (typically < 200 bytes) and start with specific text + if file_path.stat().st_size > 1024: # LFS pointers are much smaller + return False + + with open(file_path, "r", encoding="utf-8") as f: + first_line = f.readline().strip() + return first_line.startswith("version https://git-lfs.github.com/spec/") + + except (UnicodeDecodeError, OSError): + return False + + +def _lfs_pull(file_path: Path, repo_root: Path) -> None: + try: + relative_path = file_path.relative_to(repo_root) + + subprocess.run( + ["git", "lfs", "pull", "--include", str(relative_path)], + cwd=repo_root, + check=True, + capture_output=True, + ) + except subprocess.CalledProcessError as e: + raise RuntimeError(f"Failed to pull LFS file {file_path}: {e}") + + +def _pull_lfs_archive(filename: Union[str, Path]) -> Path: + # Check Git LFS availability first + _check_git_lfs_available() + + # Find repository root + repo_root = _get_repo_root() + + # Construct path to test data file + file_path = _get_lfs_dir() / (filename + ".tar.gz") + + # Check if file exists + if not file_path.exists(): + raise FileNotFoundError( + f"Test file '{filename}' not found at {file_path}. " + f"Make sure the file is committed to Git LFS in the tests/data directory." + ) + + # If it's an LFS pointer file, ensure LFS is set up and pull the file + if _is_lfs_pointer_file(file_path): + _lfs_pull(file_path, repo_root) + + # Verify the file was actually downloaded + if _is_lfs_pointer_file(file_path): + raise RuntimeError( + f"Failed to download LFS file '{filename}'. The file is still a pointer after attempting to pull." + ) + + return file_path + + +def _decompress_archive(filename: Union[str, Path]) -> Path: + target_dir = _get_data_dir() + filename_path = Path(filename) + with tarfile.open(filename_path, "r:gz") as tar: + tar.extractall(target_dir) + return target_dir / filename_path.name.replace(".tar.gz", "") + + +def testData(filename: Union[str, Path]) -> Path: + """ + Get the path to a test data, downloading from LFS if needed. + + This function will: + 1. Check that Git LFS is available + 2. Locate the file in the tests/data directory + 3. Initialize Git LFS if needed + 4. Download the file from LFS if it's a pointer file + 5. Return the Path object to the actual file or dir + + Args: + filename: Name of the test file (e.g., "lidar_sample.bin") + + Returns: + Path: Path object to the test file + + Raises: + RuntimeError: If Git LFS is not available or LFS operations fail + FileNotFoundError: If the test file doesn't exist + + Usage: + # As string path + file_path = str(testFile("sample.bin")) + + # As context manager for file operations + with testFile("sample.bin").open('rb') as f: + data = f.read() + """ + data_dir = _get_data_dir() + file_path = data_dir / filename + + # already pulled and decompressed, return it directly + if file_path.exists(): + return file_path + + return _decompress_archive(_pull_lfs_archive(filename)) + + +T = TypeVar("T") + + +class SensorReplay(Generic[T]): + """Generic sensor data replay utility. + + Args: + name: The name of the test dataset + autocast: Optional function that takes unpickled data and returns a processed result. + For example: lambda data: LidarMessage.from_msg(data) + """ + + def __init__(self, name: str, autocast: Optional[Callable[[Any], T]] = None): + self.root_dir = testData(name) + self.autocast = autocast + self.cnt = 0 + + def load(self, *names: Union[int, str]) -> Union[T, Any, list[T], list[Any]]: + if len(names) == 1: + return self.load_one(names[0]) + return list(map(lambda name: self.load_one(name), names)) + + def load_one(self, name: Union[int, str, Path]) -> Union[T, Any]: + if isinstance(name, int): + full_path = self.root_dir / f"/{name:03d}.pickle" + elif isinstance(name, Path): + full_path = self.root_dir / f"/{name}.pickle" + else: + full_path = name + + with open(full_path, "rb") as f: + data = pickle.load(f) + if self.autocast: + return self.autocast(data) + return data + + def iterate(self) -> Iterator[Union[T, Any]]: + pattern = os.path.join(self.root_dir, "*") + for file_path in sorted(glob.glob(pattern)): + yield self.load_one(file_path) + + def stream(self, rate_hz: float = 10.0) -> Observable[Union[T, Any]]: + sleep_time = 1.0 / rate_hz + + return from_iterable(self.iterate()).pipe( + ops.zip(interval(sleep_time)), + ops.map(lambda x: x[0] if isinstance(x, tuple) else x), + ) + + def save_stream(self, observable: Observable[Union[T, Any]]) -> Observable[int]: + return observable.pipe(ops.map(lambda frame: self.save_one(frame))) + + def save(self, *frames) -> int: + [self.save_one(frame) for frame in frames] + return self.cnt + + def save_one(self, frame) -> int: + file_name = f"/{self.cnt:03d}.pickle" + full_path = self.root_dir + file_name + + self.cnt += 1 + + if os.path.isfile(full_path): + raise Exception(f"file {full_path} exists") + + # Convert to raw message if frame has a raw_msg attribute + if hasattr(frame, "raw_msg"): + frame = frame.raw_msg + + with open(full_path, "wb") as f: + pickle.dump(frame, f) + + return self.cnt \ No newline at end of file diff --git a/docker/deprecated/unitree/agents/Dockerfile b/docker/deprecated/unitree/agents/Dockerfile index ea8cf63bd8..18c8c2bc4a 100644 --- a/docker/deprecated/unitree/agents/Dockerfile +++ b/docker/deprecated/unitree/agents/Dockerfile @@ -122,10 +122,10 @@ RUN echo "source /opt/ros/${ROS_DISTRO}/setup.bash" >> /root/.bashrc && \ COPY docker /app/docker/ # Setup supervisor configuration -COPY docker/deprecated/unitree/agents/supervisord.conf /etc/supervisor/conf.d/supervisord.conf +COPY docker/unitree/agents/supervisord.conf /etc/supervisor/conf.d/supervisord.conf # Copy entrypoint script -COPY docker/deprecated/unitree/agents/entrypoint.sh /entrypoint.sh +COPY docker/unitree/agents/entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh # Copy dimos and tests @@ -143,4 +143,4 @@ RUN mkdir -p /app/assets/output/ros # TODO: Cleanup multiple working directories and seprate the dockerfiles for each service. ENTRYPOINT ["/entrypoint.sh"] -CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] +CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] \ No newline at end of file diff --git a/docker/deprecated/unitree/agents/docker-compose.yml b/docker/deprecated/unitree/agents/docker-compose.yml index 6c86ee5ff0..6cde23e98e 100644 --- a/docker/deprecated/unitree/agents/docker-compose.yml +++ b/docker/deprecated/unitree/agents/docker-compose.yml @@ -3,10 +3,10 @@ services: dimos-unitree-agents: image: dimos-unitree-agents:latest build: - context: ../../../../ - dockerfile: docker/deprecated/unitree/agents/Dockerfile + context: ../../../ + dockerfile: docker/unitree/agents/Dockerfile env_file: - - ../../../../.env + - ../../../.env environment: PYTHONUNBUFFERED: 1 ROBOT_IP: ${ROBOT_IP} @@ -15,11 +15,10 @@ services: WEBRTC_SERVER_PORT: ${WEBRTC_SERVER_PORT:-9991} DISPLAY: ${DISPLAY:-} # For GUI applications like rviz2 ROS_OUTPUT_DIR: /app/assets/output/ros # Change output directory - CUDA_VISIBLE_DEVICES: "" # Force CPU-only mode # DIMOS_MAX_WORKERS: ${DIMOS_MAX_WORKERS} # TODO: ipc: host volumes: - - ../../../../assets:/app/assets + - ../../../assets:/app/assets ports: - "5555:5555" mem_limit: 8048m diff --git a/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py b/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py deleted file mode 100644 index 9dcffd7a45..0000000000 --- a/tests/.ipynb_checkpoints/test_audio_robot_agent-checkpoint.py +++ /dev/null @@ -1,37 +0,0 @@ -from dimos.utils.threadpool import get_scheduler -import os -from dimos.robot.unitree.unitree_go2 import UnitreeGo2 -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.robot.unitree.unitree_ros_control import UnitreeROSControl -from dimos.agents.agent import OpenAIAgent -from dimos.stream.audio.pipelines import tts, stt -from dimos.stream.audio.utils import keepalive - - -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/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py deleted file mode 100644 index 5ed4007eed..0000000000 --- a/tests/.ipynb_checkpoints/test_cerebras_agent_query-checkpoint.py +++ /dev/null @@ -1,29 +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 test_header - -from dotenv import load_dotenv -from dimos.agents.cerebras_agent import CerebrasAgent - -# Load API key from environment -load_dotenv() - -# Create a CerebrasAgent instance -agent = CerebrasAgent(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 Cerebras Agent: {response}") diff --git a/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py b/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py deleted file mode 100644 index c6dead4570..0000000000 --- a/tests/.ipynb_checkpoints/test_cerebras_agent_skills-checkpoint.py +++ /dev/null @@ -1,111 +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 -import os -from dimos.robot.robot import MockRobot -import tests.test_header - -import time -from dotenv import load_dotenv -from dimos.agents.cerebras_agent import CerebrasAgent -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.web.robot_web_interface import RobotWebInterface -from dimos.skills.observe_stream import ObserveStream -from dimos.skills.kill_skill import KillSkill -from dimos.skills.navigation import NavigateWithText, GetPose, NavigateToGoal -from dimos.skills.visual_navigation_skills import FollowHuman -import reactivex as rx -import reactivex.operators as ops -from dimos.stream.audio.pipelines import tts, stt -from dimos.web.websocket_vis.server import WebsocketVis -import threading -from dimos.types.vector import Vector -from dimos.skills.speak import Speak - -# Load API key from environment -load_dotenv() - -robot = MockRobot() - -# 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=5556, - text_streams=text_streams, -) - -# stt_node = stt() -robot_skills = MyUnitreeSkills() - - -# Create a CerebrasAgent instance -agent = CerebrasAgent( - dev_name="test_cerebras_agent", - # input_query_stream=stt_node.emit_text(), - input_query_stream=web_interface.query_stream, - skills=robot_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="llama-4-scout-17b-16e-instruct", -) - -# tts_node = tts() -# tts_node.consume_text(agent.get_response_observable()) - -robot_skills.add(ObserveStream) -robot_skills.add(KillSkill) -robot_skills.add(NavigateWithText) -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("NavigateWithText", 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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") -print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") - -web_interface.run() diff --git a/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py b/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py deleted file mode 100644 index c2cb004f90..0000000000 --- a/tests/.ipynb_checkpoints/test_object_tracking_with_qwen-checkpoint.py +++ /dev/null @@ -1,202 +0,0 @@ -import os -import sys -import time -import cv2 -import numpy as np -import queue -import threading -import json -from reactivex import Subject, operators as RxOps -from openai import OpenAI -import tests.test_header - -from dimos.stream.video_provider import VideoProvider -from dimos.perception.object_tracker import ObjectTrackingStream -from dimos.models.qwen.video_query import get_bbox_from_qwen -from dimos.utils.logging_config import logger - -# 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/untitled.md b/untitled.md deleted file mode 100644 index e69de29bb2..0000000000 From d5294ab8c995fb98728aa5219bd776a0ace8382a Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Fri, 30 May 2025 06:36:12 +0000 Subject: [PATCH 27/46] CI code cleanup --- dimos/utils/test_testing.py | 2 +- dimos/utils/testing.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/dimos/utils/test_testing.py b/dimos/utils/test_testing.py index e588962680..796c190c8a 100644 --- a/dimos/utils/test_testing.py +++ b/dimos/utils/test_testing.py @@ -126,4 +126,4 @@ def test_sensor_replay_cast(): ).iterate(): counter += 1 assert isinstance(message, LidarMessage) - assert counter == 500 \ No newline at end of file + assert counter == 500 diff --git a/dimos/utils/testing.py b/dimos/utils/testing.py index a92b884a5f..bd9a37d00a 100644 --- a/dimos/utils/testing.py +++ b/dimos/utils/testing.py @@ -221,4 +221,4 @@ def save_one(self, frame) -> int: with open(full_path, "wb") as f: pickle.dump(frame, f) - return self.cnt \ No newline at end of file + return self.cnt From 49268314d9abd1227e44e2289f85ae909d570bac Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Thu, 29 May 2025 23:44:19 -0700 Subject: [PATCH 28/46] removes newline change --- docker/deprecated/unitree/agents/Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/docker/deprecated/unitree/agents/Dockerfile b/docker/deprecated/unitree/agents/Dockerfile index 18c8c2bc4a..c46fdd66e6 100644 --- a/docker/deprecated/unitree/agents/Dockerfile +++ b/docker/deprecated/unitree/agents/Dockerfile @@ -143,4 +143,4 @@ RUN mkdir -p /app/assets/output/ros # TODO: Cleanup multiple working directories and seprate the dockerfiles for each service. ENTRYPOINT ["/entrypoint.sh"] -CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] \ No newline at end of file +CMD ["/usr/bin/supervisord", "-n", "-c", "/etc/supervisor/conf.d/supervisord.conf"] From cb49cb08444f002fd0e1968fe6a9cc81537c9d2e Mon Sep 17 00:00:00 2001 From: stash Date: Fri, 30 May 2025 01:13:11 -0700 Subject: [PATCH 29/46] Fixed lack of ResponseMessage pydantic type for Tooling Callback --- dimos/agents/cerebras_agent.py | 60 +++++++++++++++++++++++++++-- tests/test_cerebras_agent_skills.py | 44 ++++++++++----------- 2 files changed, 79 insertions(+), 25 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 6040e78d2c..bda4aa29fd 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -41,6 +41,28 @@ from dimos.stream.frame_processor import FrameProcessor from dimos.utils.logging_config import setup_logger +# Response object compatible with LLMAgent +class CerebrasResponseMessage: + def __init__(self, content="", tool_calls=None,): + self.content = content + self.tool_calls = tool_calls or [] + self.parsed = None + + def __str__(self): + # Return a string representation for logging + parts = [] + + # Include content if available + if self.content: + parts.append(self.content) + + # Include tool calls if available + if self.tool_calls: + tool_names = [tc.function.name for tc in self.tool_calls] + parts.append(f"[Tools called: {', '.join(tool_names)}]") + + return "\n".join(parts) if parts else "[No content]" + # Initialize environment variables load_dotenv() @@ -279,7 +301,7 @@ def _send_query(self, messages: list) -> Any: messages (list): The prompt messages to send. Returns: - The response message from Cerebras. + The response message from Cerebras wrapped in our CerebrasResponseMessage class. Raises: Exception: If no response message is returned. @@ -314,10 +336,16 @@ def _send_query(self, messages: list) -> Any: # Make the API call response = self.client.chat.completions.create(**api_params) - response_message = response.choices[0].message - if response_message is None: + cerebras_message = response.choices[0].message + if cerebras_message is None: logger.error("Response message does not exist.") raise Exception("Response message does not exist.") + + # Convert to our CerebrasResponseMessage format - only pass content + # Tool calls will be parsed in _observable_query + response_message = CerebrasResponseMessage( + content=cerebras_message.content + ) return response_message @@ -381,6 +409,32 @@ def _observable_query( observer.on_next("") observer.on_completed() return + + # Try to parse structured response if response_model is defined + if response_message.content: + try: + parsed_content = json.loads(response_message.content) + if isinstance(parsed_content, dict) and "name" in parsed_content and "arguments" in parsed_content: + # Create tool call object from parsed JSON + tool_call_obj = type( + "ToolCall", + (), + { + "id": f"call_{threading.get_ident()}", + "function": type( + "Function", + (), + { + "name": parsed_content["name"], + "arguments": json.dumps(parsed_content["arguments"]), + }, + ), + }, + ) + response_message.tool_calls = [tool_call_obj] + logger.info(f"Parsed structured JSON response into a tool call: {parsed_content['name']}") + except (json.JSONDecodeError, TypeError, KeyError) as e: + logger.warning(f"Failed to parse response as JSON tool call: {e}") # Add assistant response to local messages (always) assistant_message = {"role": "assistant"} diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index c6dead4570..fea17736f9 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -39,12 +39,12 @@ # Load API key from environment load_dotenv() -robot = MockRobot() - -# robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), -# ros_control=UnitreeROSControl(), -# skills=MyUnitreeSkills(), -# mock_connection=False) +# robot = MockRobot() +robot_skills = MyUnitreeSkills() +robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), + ros_control=UnitreeROSControl(), + skills=robot_skills, + mock_connection=False) # Create a subject for agent responses agent_response_subject = rx.subject.Subject() @@ -63,8 +63,6 @@ ) # stt_node = stt() -robot_skills = MyUnitreeSkills() - # Create a CerebrasAgent instance agent = CerebrasAgent( @@ -80,26 +78,28 @@ 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""", +When you need to call a skill or tool, ALWAYS respond ONLY with a JSON object in this exact format: {"name": "SkillName", "arguments": {"arg1": "value1", "arg2": "value2"}} + +Example: If the user asks to spin right by 90 degrees, output ONLY the following: {"name": "SpinRight", "arguments": {"degrees": 90}}""", model_name="llama-4-scout-17b-16e-instruct", ) # tts_node = tts() # tts_node.consume_text(agent.get_response_observable()) -robot_skills.add(ObserveStream) -robot_skills.add(KillSkill) -robot_skills.add(NavigateWithText) -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("NavigateWithText", 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.add(ObserveStream) +# robot_skills.add(KillSkill) +# robot_skills.add(NavigateWithText) +# 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("NavigateWithText", 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 From 56b4443e46b23245e1528aca544319b698202752 Mon Sep 17 00:00:00 2001 From: spomichter <12108168+spomichter@users.noreply.github.com> Date: Fri, 30 May 2025 08:13:50 +0000 Subject: [PATCH 30/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 26 ++++++++++++++++++-------- tests/test_cerebras_agent_skills.py | 10 ++++++---- 2 files changed, 24 insertions(+), 12 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index bda4aa29fd..8577a67883 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -41,9 +41,14 @@ from dimos.stream.frame_processor import FrameProcessor from dimos.utils.logging_config import setup_logger + # Response object compatible with LLMAgent class CerebrasResponseMessage: - def __init__(self, content="", tool_calls=None,): + def __init__( + self, + content="", + tool_calls=None, + ): self.content = content self.tool_calls = tool_calls or [] self.parsed = None @@ -63,6 +68,7 @@ def __str__(self): return "\n".join(parts) if parts else "[No content]" + # Initialize environment variables load_dotenv() @@ -340,12 +346,10 @@ def _send_query(self, messages: list) -> Any: if cerebras_message is None: logger.error("Response message does not exist.") raise Exception("Response message does not exist.") - + # Convert to our CerebrasResponseMessage format - only pass content # Tool calls will be parsed in _observable_query - response_message = CerebrasResponseMessage( - content=cerebras_message.content - ) + response_message = CerebrasResponseMessage(content=cerebras_message.content) return response_message @@ -409,12 +413,16 @@ def _observable_query( observer.on_next("") observer.on_completed() return - + # Try to parse structured response if response_model is defined if response_message.content: try: parsed_content = json.loads(response_message.content) - if isinstance(parsed_content, dict) and "name" in parsed_content and "arguments" in parsed_content: + if ( + isinstance(parsed_content, dict) + and "name" in parsed_content + and "arguments" in parsed_content + ): # Create tool call object from parsed JSON tool_call_obj = type( "ToolCall", @@ -432,7 +440,9 @@ def _observable_query( }, ) response_message.tool_calls = [tool_call_obj] - logger.info(f"Parsed structured JSON response into a tool call: {parsed_content['name']}") + logger.info( + f"Parsed structured JSON response into a tool call: {parsed_content['name']}" + ) except (json.JSONDecodeError, TypeError, KeyError) as e: logger.warning(f"Failed to parse response as JSON tool call: {e}") diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index fea17736f9..d589a35f39 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -41,10 +41,12 @@ # robot = MockRobot() robot_skills = MyUnitreeSkills() -robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), - ros_control=UnitreeROSControl(), - skills=robot_skills, - mock_connection=False) +robot = UnitreeGo2( + ip=os.getenv("ROBOT_IP"), + ros_control=UnitreeROSControl(), + skills=robot_skills, + mock_connection=False, +) # Create a subject for agent responses agent_response_subject = rx.subject.Subject() From 9ec509801fc5b2c0278fd84ed9f7170a457f62c7 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Sat, 31 May 2025 04:01:02 +0000 Subject: [PATCH 31/46] update test --- tests/test_cerebras_agent_skills.py | 41 +++++++++-------------------- 1 file changed, 12 insertions(+), 29 deletions(-) diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index d589a35f39..b3f532eb5f 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -35,18 +35,17 @@ import threading from dimos.types.vector import Vector from dimos.skills.speak import Speak +from dimos.utils.logging_config import setup_logger # Load API key from environment load_dotenv() -# robot = MockRobot() -robot_skills = MyUnitreeSkills() -robot = UnitreeGo2( - ip=os.getenv("ROBOT_IP"), - ros_control=UnitreeROSControl(), - skills=robot_skills, - mock_connection=False, -) +robot = MockRobot() + +# 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() @@ -59,12 +58,11 @@ "agent_responses": agent_response_stream, } -web_interface = RobotWebInterface( - port=5556, - text_streams=text_streams, -) +web_interface = RobotWebInterface(port=5556, text_streams=text_streams,) # stt_node = stt() +robot_skills = MyUnitreeSkills(robot) +robot_skills.initialize_skills() # Create a CerebrasAgent instance agent = CerebrasAgent( @@ -80,28 +78,13 @@ 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 -When you need to call a skill or tool, ALWAYS respond ONLY with a JSON object in this exact format: {"name": "SkillName", "arguments": {"arg1": "value1", "arg2": "value2"}} - -Example: If the user asks to spin right by 90 degrees, output ONLY the following: {"name": "SpinRight", "arguments": {"degrees": 90}}""", - model_name="llama-4-scout-17b-16e-instruct", +Example: If the user asks to move forward 1 meter, call the Move function with distance=1""", + model_name="llama-4-scout-17b-16e-instruct" ) # tts_node = tts() # tts_node.consume_text(agent.get_response_observable()) -# robot_skills.add(ObserveStream) -# robot_skills.add(KillSkill) -# robot_skills.add(NavigateWithText) -# 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("NavigateWithText", 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 From c2e707d9952ae7e2cf4139938228b7817305a206 Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Sat, 31 May 2025 04:01:41 +0000 Subject: [PATCH 32/46] CI code cleanup --- tests/test_cerebras_agent_skills.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index b3f532eb5f..03c8bd582f 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -58,7 +58,10 @@ "agent_responses": agent_response_stream, } -web_interface = RobotWebInterface(port=5556, text_streams=text_streams,) +web_interface = RobotWebInterface( + port=5556, + text_streams=text_streams, +) # stt_node = stt() robot_skills = MyUnitreeSkills(robot) @@ -79,7 +82,7 @@ 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="llama-4-scout-17b-16e-instruct" + model_name="llama-4-scout-17b-16e-instruct", ) # tts_node = tts() From 3c34b9242051b33ae844179899fc516e51ea1baf Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Sat, 31 May 2025 08:23:00 +0000 Subject: [PATCH 33/46] updated changes --- dimos/agents/cerebras_agent.py | 270 +++++++++++++++++----------- tests/test_cerebras_agent_skills.py | 31 +++- 2 files changed, 190 insertions(+), 111 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 8577a67883..4e6c75f1bc 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -41,6 +41,11 @@ from dimos.stream.frame_processor import FrameProcessor from dimos.utils.logging_config import setup_logger +# Initialize environment variables +load_dotenv() + +# Initialize logger for the Cerebras agent +logger = setup_logger("dimos.agents.cerebras") # Response object compatible with LLMAgent class CerebrasResponseMessage: @@ -55,26 +60,39 @@ def __init__( def __str__(self): # Return a string representation for logging - parts = [] - - # Include content if available if self.content: - parts.append(self.content) - - # Include tool calls if available + return self.content + elif self.tool_calls: + # Return JSON representation of the first tool call + if self.tool_calls: + tool_call = self.tool_calls[0] + tool_json = { + "name": tool_call.function.name, + "arguments": json.loads(tool_call.function.arguments) + } + return json.dumps(tool_json) + return "[No content]" + + def to_dict(self): + """Convert to dictionary format for JSON serialization.""" + result = { + "role": "assistant", + "content": self.content or "" + } + if self.tool_calls: - tool_names = [tc.function.name for tc in self.tool_calls] - parts.append(f"[Tools called: {', '.join(tool_names)}]") - - return "\n".join(parts) if parts else "[No content]" - - -# Initialize environment variables -load_dotenv() - -# Initialize logger for the Cerebras agent -logger = setup_logger("dimos.agents.cerebras") - + result["tool_calls"] = [] + for tool_call in self.tool_calls: + result["tool_calls"].append({ + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments, + }, + }) + + return result class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. @@ -300,7 +318,35 @@ def clean_cerebras_schema(self, schema: dict) -> dict: return cleaned - def _send_query(self, messages: list) -> Any: + def create_tool_call(self, name: str = None, arguments: dict = None, call_id: str = None, content: str = None): + """Create a tool call object from either direct parameters or JSON content.""" + # If content is provided, parse it as JSON + if content: + try: + content_json = json.loads(content) + if isinstance(content_json, dict) and "name" in content_json and "arguments" in content_json: + name = content_json["name"] + arguments = content_json["arguments"] + else: + return None + except json.JSONDecodeError: + logger.warning("Content appears to be JSON but failed to parse") + return None + + # Create the tool call object + if name and arguments is not None: + + return type("ToolCall", (), { + "id": call_id, + "function": type("Function", (), { + "name": name, + "arguments": json.dumps(arguments) + }) + }) + + return None + + def _send_query(self, messages: list) -> CerebrasResponseMessage: """Sends the query to Cerebras API using the official Cerebras SDK. Args: @@ -310,7 +356,7 @@ def _send_query(self, messages: list) -> Any: The response message from Cerebras wrapped in our CerebrasResponseMessage class. Raises: - Exception: If no response message is returned. + Exception: If no response message is returned from the API. ConnectionError: If there's an issue connecting to the API. ValueError: If the messages or other parameters are invalid. """ @@ -334,24 +380,28 @@ def _send_query(self, messages: list) -> Any: api_params["tool_choice"] = "auto" if self.response_model is not None: - api_params["response_format"] = { - "type": "json_object", - "schema": self.response_model, - } + api_params["response_format"] = {"type": "json_object", "schema": self.response_model} # Make the API call response = self.client.chat.completions.create(**api_params) - cerebras_message = response.choices[0].message - if cerebras_message is None: + raw_message = response.choices[0].message + if raw_message is None: logger.error("Response message does not exist.") raise Exception("Response message does not exist.") - # Convert to our CerebrasResponseMessage format - only pass content - # Tool calls will be parsed in _observable_query - response_message = CerebrasResponseMessage(content=cerebras_message.content) + # Process response into final format + content = raw_message.content + tool_calls = getattr(raw_message, 'tool_calls', None) + + # If no structured tool calls from API, try parsing content as JSON tool call + if not tool_calls and content and content.strip().startswith('{'): + parsed_tool_call = self.create_tool_call(content=content) + if parsed_tool_call: + tool_calls = [parsed_tool_call] + content = None - return response_message + return CerebrasResponseMessage(content=content, tool_calls=tool_calls) except ConnectionError as ce: logger.error(f"Connection error with Cerebras API: {ce}") @@ -414,38 +464,6 @@ def _observable_query( observer.on_completed() return - # Try to parse structured response if response_model is defined - if response_message.content: - try: - parsed_content = json.loads(response_message.content) - if ( - isinstance(parsed_content, dict) - and "name" in parsed_content - and "arguments" in parsed_content - ): - # Create tool call object from parsed JSON - tool_call_obj = type( - "ToolCall", - (), - { - "id": f"call_{threading.get_ident()}", - "function": type( - "Function", - (), - { - "name": parsed_content["name"], - "arguments": json.dumps(parsed_content["arguments"]), - }, - ), - }, - ) - response_message.tool_calls = [tool_call_obj] - logger.info( - f"Parsed structured JSON response into a tool call: {parsed_content['name']}" - ) - except (json.JSONDecodeError, TypeError, KeyError) as e: - logger.warning(f"Failed to parse response as JSON tool call: {e}") - # Add assistant response to local messages (always) assistant_message = {"role": "assistant"} @@ -473,23 +491,50 @@ def _observable_query( messages.append(assistant_message) - # Handle tool calls if present (add tool messages to conversation) - self._handle_tooling(response_message, messages) + # If no skill library is provided or there are no tool calls, emit the response directly + if ( + self.skill_library is None + or self.skill_library.get_tools() is None + or not hasattr(response_message, "tool_calls") + or response_message.tool_calls is None + ): + # Just use the content directly since JSON parsing is already handled in _send_query + final_msg = response_message.content or "" + + observer.on_next(final_msg) + self.response_subject.on_next(final_msg) + else: + # Handle tool calls if present + response_message_2 = self._handle_tooling(response_message, messages) + + # Update conversation history + if not hasattr(self, "_history_lock"): + self._history_lock = threading.Lock() + with self._history_lock: + for msg in messages[base_len:]: + self.conversation_history.append(msg) + logger.info( + f"Updated conversation history (total: {len(self.conversation_history)} messages)" + ) - # At the end, append only new messages to the global conversation history under a lock - if not hasattr(self, "_history_lock"): - self._history_lock = threading.Lock() - with self._history_lock: - for msg in messages[base_len:]: - self.conversation_history.append(msg) - logger.info( - f"Updated conversation history (total: {len(self.conversation_history)} messages)" - ) + # For tool call responses, show what was executed + if response_message_2 is not None: + # Handle different types of responses from skill execution + if hasattr(response_message_2, "content"): + final_msg = response_message_2.content + else: + # Skill result is not a response object, just convert to string + final_msg = f"Skill executed successfully. Result: {response_message_2}" + else: + # Create a summary of executed commands + final_msg = "Executed commands: " + ", ".join( + f"{tc.function.name}({tc.function.arguments})" + for tc in response_message.tool_calls + ) + + observer.on_next(final_msg) + self.response_subject.on_next(final_msg) - # Send response to observers - result = response_message.content or "" - observer.on_next(result) - self.response_subject.on_next(result) observer.on_completed() except Exception as e: @@ -498,31 +543,50 @@ def _observable_query( self.response_subject.on_error(e) def _handle_tooling(self, response_message, messages): - """Executes tools and appends tool-use/result blocks to messages.""" - if not hasattr(response_message, "tool_calls") or not response_message.tool_calls: - logger.info("No tool calls found in response message") - return None + """Handles tooling callbacks in the response message. - if len(response_message.tool_calls) > 1: - logger.warning( - "Multiple tool calls detected in response message. Not a tested feature." - ) + If tool calls are present, the corresponding functions are executed and + a follow-up query is sent. - # Execute all tools and add their results to messages - for tool_call in response_message.tool_calls: - logger.info(f"Processing tool call: {tool_call.function.name}") - - # Execute the tool - args = json.loads(tool_call.function.arguments) - tool_result = self.skill_library.call(tool_call.function.name, **args) - logger.info(f"Function Call Results: {tool_result}") - - # Add tool result to conversation history (OpenAI format) - messages.append( - { - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(tool_result), - "name": tool_call.function.name, - } - ) + Args: + response_message: The response message containing tool calls. + messages (list): The original list of messages sent. + + Returns: + The final response message after processing tool calls, if any. + """ + + def _tooling_callback(message, messages, response_message, skill_library: SkillLibrary): + has_called_tools = False + new_messages = [] + for tool_call in message.tool_calls: + has_called_tools = True + name = tool_call.function.name + args = json.loads(tool_call.function.arguments) + result = skill_library.call(name, **args) + logger.info(f"Function Call Results: {result}") + new_messages.append( + { + "role": "tool", + "tool_call_id": tool_call.id, + "content": str(result), + "name": name, + } + ) + + if has_called_tools: + # Convert response_message to dict format for JSON serialization + response_dict = response_message.to_dict() + messages.append(response_dict) + messages.extend(new_messages) + + logger.info("Sending Another Query.") + try: + response_2 = self._send_query(messages) + return response_2 + except Exception as e: + logger.error(f"Error in follow-up query: {e}") + return None + return None + + return _tooling_callback(response_message, messages, response_message, self.skill_library) diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index 03c8bd582f..9575884e7c 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -35,17 +35,16 @@ import threading from dimos.types.vector import Vector from dimos.skills.speak import Speak -from dimos.utils.logging_config import setup_logger # Load API key from environment load_dotenv() -robot = MockRobot() +# robot = MockRobot() -# robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), -# ros_control=UnitreeROSControl(), -# skills=MyUnitreeSkills(), -# mock_connection=False) +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() @@ -65,7 +64,6 @@ # stt_node = stt() robot_skills = MyUnitreeSkills(robot) -robot_skills.initialize_skills() # Create a CerebrasAgent instance agent = CerebrasAgent( @@ -81,13 +79,30 @@ 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""", +When you need to call a skill or tool, ALWAYS respond ONLY with a JSON object in this exact format: {"name": "SkillName", "arguments": {"arg1": "value1", "arg2": "value2"}} + +Example: If the user asks to spin right by 90 degrees, output ONLY the following: {"name": "SpinRight", "arguments": {"degrees": 90}}""", model_name="llama-4-scout-17b-16e-instruct", ) # tts_node = tts() # tts_node.consume_text(agent.get_response_observable()) +# robot_skills.add(ObserveStream) +# robot_skills.add(KillSkill) +# robot_skills.add(NavigateWithText) +# 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("NavigateWithText", 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 From 195c0f734756806f6da355c82f4d875bc95c1ebb Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Sat, 31 May 2025 08:23:43 +0000 Subject: [PATCH 34/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 76 +++++++++++++++++------------ tests/test_cerebras_agent_skills.py | 10 ++-- 2 files changed, 50 insertions(+), 36 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 4e6c75f1bc..9e7327b769 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -47,6 +47,7 @@ # Initialize logger for the Cerebras agent logger = setup_logger("dimos.agents.cerebras") + # Response object compatible with LLMAgent class CerebrasResponseMessage: def __init__( @@ -68,32 +69,32 @@ def __str__(self): tool_call = self.tool_calls[0] tool_json = { "name": tool_call.function.name, - "arguments": json.loads(tool_call.function.arguments) + "arguments": json.loads(tool_call.function.arguments), } return json.dumps(tool_json) return "[No content]" def to_dict(self): """Convert to dictionary format for JSON serialization.""" - result = { - "role": "assistant", - "content": self.content or "" - } - + result = {"role": "assistant", "content": self.content or ""} + if self.tool_calls: result["tool_calls"] = [] for tool_call in self.tool_calls: - result["tool_calls"].append({ - "id": tool_call.id, - "type": "function", - "function": { - "name": tool_call.function.name, - "arguments": tool_call.function.arguments, - }, - }) - + result["tool_calls"].append( + { + "id": tool_call.id, + "type": "function", + "function": { + "name": tool_call.function.name, + "arguments": tool_call.function.arguments, + }, + } + ) + return result + class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. @@ -318,13 +319,19 @@ def clean_cerebras_schema(self, schema: dict) -> dict: return cleaned - def create_tool_call(self, name: str = None, arguments: dict = None, call_id: str = None, content: str = None): + def create_tool_call( + self, name: str = None, arguments: dict = None, call_id: str = None, content: str = None + ): """Create a tool call object from either direct parameters or JSON content.""" # If content is provided, parse it as JSON if content: try: content_json = json.loads(content) - if isinstance(content_json, dict) and "name" in content_json and "arguments" in content_json: + if ( + isinstance(content_json, dict) + and "name" in content_json + and "arguments" in content_json + ): name = content_json["name"] arguments = content_json["arguments"] else: @@ -332,18 +339,20 @@ def create_tool_call(self, name: str = None, arguments: dict = None, call_id: st except json.JSONDecodeError: logger.warning("Content appears to be JSON but failed to parse") return None - + # Create the tool call object if name and arguments is not None: - - return type("ToolCall", (), { - "id": call_id, - "function": type("Function", (), { - "name": name, - "arguments": json.dumps(arguments) - }) - }) - + return type( + "ToolCall", + (), + { + "id": call_id, + "function": type( + "Function", (), {"name": name, "arguments": json.dumps(arguments)} + ), + }, + ) + return None def _send_query(self, messages: list) -> CerebrasResponseMessage: @@ -380,7 +389,10 @@ def _send_query(self, messages: list) -> CerebrasResponseMessage: api_params["tool_choice"] = "auto" if self.response_model is not None: - api_params["response_format"] = {"type": "json_object", "schema": self.response_model} + api_params["response_format"] = { + "type": "json_object", + "schema": self.response_model, + } # Make the API call response = self.client.chat.completions.create(**api_params) @@ -392,10 +404,10 @@ def _send_query(self, messages: list) -> CerebrasResponseMessage: # Process response into final format content = raw_message.content - tool_calls = getattr(raw_message, 'tool_calls', None) + tool_calls = getattr(raw_message, "tool_calls", None) # If no structured tool calls from API, try parsing content as JSON tool call - if not tool_calls and content and content.strip().startswith('{'): + if not tool_calls and content and content.strip().startswith("{"): parsed_tool_call = self.create_tool_call(content=content) if parsed_tool_call: tool_calls = [parsed_tool_call] @@ -500,7 +512,7 @@ def _observable_query( ): # Just use the content directly since JSON parsing is already handled in _send_query final_msg = response_message.content or "" - + observer.on_next(final_msg) self.response_subject.on_next(final_msg) else: @@ -531,7 +543,7 @@ def _observable_query( f"{tc.function.name}({tc.function.arguments})" for tc in response_message.tool_calls ) - + observer.on_next(final_msg) self.response_subject.on_next(final_msg) diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py index 9575884e7c..4e926bfd3c 100644 --- a/tests/test_cerebras_agent_skills.py +++ b/tests/test_cerebras_agent_skills.py @@ -41,10 +41,12 @@ # robot = MockRobot() -robot = UnitreeGo2(ip=os.getenv('ROBOT_IP'), - ros_control=UnitreeROSControl(), - skills=MyUnitreeSkills(), - mock_connection=False) +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() From f1d0f74aadc12b480095d638c9160cb2c76c52b5 Mon Sep 17 00:00:00 2001 From: stash Date: Sat, 31 May 2025 02:37:28 -0700 Subject: [PATCH 35/46] Claude-specific code incorrecly used in observestream --- dimos/skills/observe_stream.py | 1 - 1 file changed, 1 deletion(-) diff --git a/dimos/skills/observe_stream.py b/dimos/skills/observe_stream.py index dc38052508..4449de2995 100644 --- a/dimos/skills/observe_stream.py +++ b/dimos/skills/observe_stream.py @@ -203,7 +203,6 @@ def _process_frame(self, frame): observable = self._agent.run_observable_query( f"{self.query_text}\n\nHere is the current camera view from the robot:", base64_image=base64_image, - thinking_budget_tokens=0, ) # Simple subscription to make sure the query executes From e7c5bfe0304cbf2e4f6640b6f6f6b0eb470279e1 Mon Sep 17 00:00:00 2001 From: stash Date: Sat, 31 May 2025 02:43:28 -0700 Subject: [PATCH 36/46] Fix Cerebras tooling ID error - Cerebras one-off queries working --- dimos/agents/cerebras_agent.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 9e7327b769..22fb17b1c6 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -325,6 +325,7 @@ def create_tool_call( """Create a tool call object from either direct parameters or JSON content.""" # If content is provided, parse it as JSON if content: + logger.info(f"Creating tool call from content: {content}") try: content_json = json.loads(content) if ( @@ -346,7 +347,7 @@ def create_tool_call( "ToolCall", (), { - "id": call_id, + "id": "1", "function": type( "Function", (), {"name": name, "arguments": json.dumps(arguments)} ), From 63ea9b91e0435966108c36950741bcfd70db6884 Mon Sep 17 00:00:00 2001 From: stash Date: Sun, 1 Jun 2025 22:51:20 -0700 Subject: [PATCH 37/46] Added Unitree-ROS testfile for cerebras --- tests/test_cerebras_unitree_ros.py | 120 +++++++++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 tests/test_cerebras_unitree_ros.py diff --git a/tests/test_cerebras_unitree_ros.py b/tests/test_cerebras_unitree_ros.py new file mode 100644 index 0000000000..5ac9011baa --- /dev/null +++ b/tests/test_cerebras_unitree_ros.py @@ -0,0 +1,120 @@ +# 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 +import os +from dimos.robot.robot import MockRobot +import tests.test_header + +import time +from dotenv import load_dotenv +from dimos.agents.cerebras_agent import CerebrasAgent +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.web.robot_web_interface import RobotWebInterface +from dimos.skills.observe_stream import ObserveStream +from dimos.skills.kill_skill import KillSkill +from dimos.skills.navigation import NavigateWithText, GetPose, NavigateToGoal +from dimos.skills.visual_navigation_skills import FollowHuman +import reactivex as rx +import reactivex.operators as ops +from dimos.stream.audio.pipelines import tts, stt +from dimos.web.websocket_vis.server import WebsocketVis +import threading +from dimos.types.vector import Vector +from dimos.skills.speak import Speak + +# Load API key from environment +load_dotenv() + +# robot = MockRobot() +robot_skills = MyUnitreeSkills() + +robot = UnitreeGo2( + ip=os.getenv("ROBOT_IP"), + ros_control=UnitreeROSControl(), + skills=robot_skills, + 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()) + +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 CerebrasAgent instance +agent = CerebrasAgent( + dev_name="test_cerebras_agent", + input_query_stream=stt_node.emit_text(), + # input_query_stream=web_interface.query_stream, + skills=robot_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 + +When you need to call a skill or tool, ALWAYS respond ONLY with a JSON object in this exact format: {"name": "SkillName", "arguments": {"arg1": "value1", "arg2": "value2"}} + +Example: If the user asks to spin right by 90 degrees, output ONLY the following: {"name": "SpinRight", "arguments": {"degrees": 90}}""", + model_name="llama-4-scout-17b-16e-instruct", +) + +tts_node = tts() +tts_node.consume_text(agent.get_response_observable()) + +robot_skills.add(ObserveStream) +robot_skills.add(KillSkill) +robot_skills.add(NavigateWithText) +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("NavigateWithText", 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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") +print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") + +web_interface.run() From 168e8362d5af706ded2cbe3b1d8afb9fcaa9903a Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Tue, 3 Jun 2025 13:50:01 -0700 Subject: [PATCH 38/46] Support Multi-Tooling --- dimos/agents/cerebras_agent.py | 43 +++++++++++++++++++++++++++------- 1 file changed, 35 insertions(+), 8 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 22fb17b1c6..0b2059c1b7 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -26,6 +26,8 @@ from typing import Any, Dict, List, Optional, Union, Tuple import logging import json +import re +import time from cerebras.cloud.sdk import Cerebras from dotenv import load_dotenv @@ -343,11 +345,15 @@ def create_tool_call( # Create the tool call object if name and arguments is not None: + timestamp = int(time.time() * 1000000) # microsecond precision + tool_id = f"call_{timestamp}" + + logger.info(f"Creating tool call with timestamp ID: {tool_id}") return type( "ToolCall", (), { - "id": "1", + "id": tool_id, "function": type( "Function", (), {"name": name, "arguments": json.dumps(arguments)} ), @@ -408,11 +414,22 @@ def _send_query(self, messages: list) -> CerebrasResponseMessage: tool_calls = getattr(raw_message, "tool_calls", None) # If no structured tool calls from API, try parsing content as JSON tool call - if not tool_calls and content and content.strip().startswith("{"): - parsed_tool_call = self.create_tool_call(content=content) - if parsed_tool_call: - tool_calls = [parsed_tool_call] - content = None + if not tool_calls and content and content.strip(): + # Look for JSON tool call anywhere in the content + json_pattern = r'\{"name":\s*"[^"]+",\s*"arguments":\s*\{[^}]+\}\}' + json_matches = re.findall(json_pattern, content) + + if json_matches: + tool_calls = [] + for json_content in json_matches: # Handle multiple JSON objects + logger.info(f"Found JSON tool call in content: {json_content}") + parsed_tool_call = self.create_tool_call(content=json_content) + if parsed_tool_call: + tool_calls.append(parsed_tool_call) + content = content.replace(json_content, "").strip() + + if not content: + content = None return CerebrasResponseMessage(content=content, tool_calls=tool_calls) @@ -509,7 +526,7 @@ def _observable_query( self.skill_library is None or self.skill_library.get_tools() is None or not hasattr(response_message, "tool_calls") - or response_message.tool_calls is None + or not response_message.tool_calls ): # Just use the content directly since JSON parsing is already handled in _send_query final_msg = response_message.content or "" @@ -596,7 +613,17 @@ def _tooling_callback(message, messages, response_message, skill_library: SkillL logger.info("Sending Another Query.") try: response_2 = self._send_query(messages) - return response_2 + + # Check if the follow-up response also has tool calls + if (hasattr(response_2, 'tool_calls') and + response_2.tool_calls and + len(response_2.tool_calls) > 0): + logger.info("Follow-up response has more tool calls, processing recursively...") + return self._handle_tooling(response_2, messages) + else: + # No more tool calls, return the final response + return response_2 + except Exception as e: logger.error(f"Error in follow-up query: {e}") return None From 6900c2150bf71681a72932ae7e41927c57ea2bcc Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Tue, 3 Jun 2025 20:50:58 +0000 Subject: [PATCH 39/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 0b2059c1b7..6b2ae77111 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -347,7 +347,7 @@ def create_tool_call( if name and arguments is not None: timestamp = int(time.time() * 1000000) # microsecond precision tool_id = f"call_{timestamp}" - + logger.info(f"Creating tool call with timestamp ID: {tool_id}") return type( "ToolCall", @@ -418,7 +418,7 @@ def _send_query(self, messages: list) -> CerebrasResponseMessage: # Look for JSON tool call anywhere in the content json_pattern = r'\{"name":\s*"[^"]+",\s*"arguments":\s*\{[^}]+\}\}' json_matches = re.findall(json_pattern, content) - + if json_matches: tool_calls = [] for json_content in json_matches: # Handle multiple JSON objects @@ -427,7 +427,7 @@ def _send_query(self, messages: list) -> CerebrasResponseMessage: if parsed_tool_call: tool_calls.append(parsed_tool_call) content = content.replace(json_content, "").strip() - + if not content: content = None @@ -613,17 +613,21 @@ def _tooling_callback(message, messages, response_message, skill_library: SkillL logger.info("Sending Another Query.") try: response_2 = self._send_query(messages) - + # Check if the follow-up response also has tool calls - if (hasattr(response_2, 'tool_calls') and - response_2.tool_calls and - len(response_2.tool_calls) > 0): - logger.info("Follow-up response has more tool calls, processing recursively...") + if ( + hasattr(response_2, "tool_calls") + and response_2.tool_calls + and len(response_2.tool_calls) > 0 + ): + logger.info( + "Follow-up response has more tool calls, processing recursively..." + ) return self._handle_tooling(response_2, messages) else: # No more tool calls, return the final response return response_2 - + except Exception as e: logger.error(f"Error in follow-up query: {e}") return None From ed5739be819dbddf2498a851f3566185e0347046 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Sat, 7 Jun 2025 23:37:10 -0700 Subject: [PATCH 40/46] parse right tool calls --- dimos/agents/cerebras_agent.py | 23 ++++++----------------- 1 file changed, 6 insertions(+), 17 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 6b2ae77111..c40a4fa5d3 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -381,7 +381,7 @@ def _send_query(self, messages: list) -> CerebrasResponseMessage: api_params = { "model": self.model_name, "messages": messages, - "max_tokens": self.max_output_tokens_per_request, + # "max_tokens": self.max_output_tokens_per_request, } # Add tools if available @@ -414,22 +414,11 @@ def _send_query(self, messages: list) -> CerebrasResponseMessage: tool_calls = getattr(raw_message, "tool_calls", None) # If no structured tool calls from API, try parsing content as JSON tool call - if not tool_calls and content and content.strip(): - # Look for JSON tool call anywhere in the content - json_pattern = r'\{"name":\s*"[^"]+",\s*"arguments":\s*\{[^}]+\}\}' - json_matches = re.findall(json_pattern, content) - - if json_matches: - tool_calls = [] - for json_content in json_matches: # Handle multiple JSON objects - logger.info(f"Found JSON tool call in content: {json_content}") - parsed_tool_call = self.create_tool_call(content=json_content) - if parsed_tool_call: - tool_calls.append(parsed_tool_call) - content = content.replace(json_content, "").strip() - - if not content: - content = None + if not tool_calls and content and content.strip().startswith("{"): + parsed_tool_call = self.create_tool_call(content=content) + if parsed_tool_call: + tool_calls = [parsed_tool_call] + content = None return CerebrasResponseMessage(content=content, tool_calls=tool_calls) From 707ba9900960590daeef3415e7807b9fc0491938 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Mon, 9 Jun 2025 14:55:02 -0700 Subject: [PATCH 41/46] add truncation logic --- dimos/agents/cerebras_agent.py | 34 ++++++++++++++++++++++++++++++---- 1 file changed, 30 insertions(+), 4 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index c40a4fa5d3..108bc8d19b 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -35,10 +35,13 @@ from reactivex import Observable from reactivex.observer import Observer from reactivex.scheduler import ThreadPoolScheduler +from dimos.agents.prompt_builder.impl import PromptBuilder +from dimos.agents.tokenizer.base import AbstractTokenizer # Local imports from dimos.agents.agent import LLMAgent from dimos.agents.memory.base import AbstractAgentSemanticMemory +from dimos.agents.tokenizer.huggingface_tokenizer import HuggingFaceTokenizer from dimos.skills.skills import AbstractSkill, SkillLibrary from dimos.stream.frame_processor import FrameProcessor from dimos.utils.logging_config import setup_logger @@ -118,6 +121,8 @@ def __init__( max_input_tokens_per_request: int = 128000, max_output_tokens_per_request: int = 16384, model_name: str = "llama-4-scout-17b-16e-instruct", + prompt_builder: Optional[PromptBuilder] = None, + tokenizer: Optional[AbstractTokenizer] = None, skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, response_model: Optional[BaseModel] = None, frame_processor: Optional[FrameProcessor] = None, @@ -199,9 +204,14 @@ def __init__( self.response_model = response_model self.model_name = model_name + self.tokenizer = tokenizer or HuggingFaceTokenizer(model_name=self.model_name) + self.prompt_builder = prompt_builder or PromptBuilder( + self.model_name, tokenizer=self.tokenizer + ) self.image_detail = image_detail self.max_output_tokens_per_request = max_output_tokens_per_request self.max_input_tokens_per_request = max_input_tokens_per_request + self.max_tokens_per_request = max_input_tokens_per_request + max_output_tokens_per_request # Add static context to memory. self._add_context_to_memory() @@ -429,6 +439,8 @@ def _send_query(self, messages: list) -> CerebrasResponseMessage: logger.error(f"Invalid parameters for Cerebras API: {ve}") raise except Exception as e: + # Print the raw API parameters when an error occurs + logger.error(f"Raw API parameters: {json.dumps(api_params, indent=2)}") logger.error(f"Unexpected error in Cerebras API call: {e}") raise @@ -565,7 +577,8 @@ def _handle_tooling(self, response_message, messages): """Handles tooling callbacks in the response message. If tool calls are present, the corresponding functions are executed and - a follow-up query is sent. + a follow-up query is sent. Tool calls are executed sequentially, waiting + for each one to complete before starting the next. Args: response_message: The response message containing tool calls. @@ -578,12 +591,19 @@ def _handle_tooling(self, response_message, messages): def _tooling_callback(message, messages, response_message, skill_library: SkillLibrary): has_called_tools = False new_messages = [] + + # Process tool calls sequentially for tool_call in message.tool_calls: has_called_tools = True name = tool_call.function.name args = json.loads(tool_call.function.arguments) + + # Execute the tool call + logger.info(f"Executing tool call: {name} with args: {args}") result = skill_library.call(name, **args) - logger.info(f"Function Call Results: {result}") + logger.info(f"Tool call completed: {name} with result: {result}") + + # Add the result to messages new_messages.append( { "role": "tool", @@ -592,6 +612,11 @@ def _tooling_callback(message, messages, response_message, skill_library: SkillL "name": name, } ) + + # Wait for the tool call to complete by running a follow-up query + self.run_observable_query( + query_text=f"Tool {name}, ID: {tool_call.id} execution complete. Please summarize the results and continue." + ).run() if has_called_tools: # Convert response_message to dict format for JSON serialization @@ -599,7 +624,7 @@ def _tooling_callback(message, messages, response_message, skill_library: SkillL messages.append(response_dict) messages.extend(new_messages) - logger.info("Sending Another Query.") + logger.info("Sending follow-up query after tool calls completed.") try: response_2 = self._send_query(messages) @@ -614,6 +639,7 @@ def _tooling_callback(message, messages, response_message, skill_library: SkillL ) return self._handle_tooling(response_2, messages) else: + logger.info(f"No more tool calls, returning final response: {response_2}") # No more tool calls, return the final response return response_2 @@ -621,5 +647,5 @@ def _tooling_callback(message, messages, response_message, skill_library: SkillL logger.error(f"Error in follow-up query: {e}") return None return None - return _tooling_callback(response_message, messages, response_message, self.skill_library) + From d92b10c09d6e7dd23e7ea2cdc6cd9f32658c5643 Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Mon, 9 Jun 2025 21:55:42 +0000 Subject: [PATCH 42/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 108bc8d19b..2ae43eb1a0 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -591,18 +591,18 @@ def _handle_tooling(self, response_message, messages): def _tooling_callback(message, messages, response_message, skill_library: SkillLibrary): has_called_tools = False new_messages = [] - + # Process tool calls sequentially for tool_call in message.tool_calls: has_called_tools = True name = tool_call.function.name args = json.loads(tool_call.function.arguments) - + # Execute the tool call logger.info(f"Executing tool call: {name} with args: {args}") result = skill_library.call(name, **args) logger.info(f"Tool call completed: {name} with result: {result}") - + # Add the result to messages new_messages.append( { @@ -612,7 +612,7 @@ def _tooling_callback(message, messages, response_message, skill_library: SkillL "name": name, } ) - + # Wait for the tool call to complete by running a follow-up query self.run_observable_query( query_text=f"Tool {name}, ID: {tool_call.id} execution complete. Please summarize the results and continue." @@ -647,5 +647,5 @@ def _tooling_callback(message, messages, response_message, skill_library: SkillL logger.error(f"Error in follow-up query: {e}") return None return None - return _tooling_callback(response_message, messages, response_message, self.skill_library) + return _tooling_callback(response_message, messages, response_message, self.skill_library) From 381b73c9d03880fa4c543ff7f4e372de3b7121c2 Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Tue, 10 Jun 2025 00:53:10 -0700 Subject: [PATCH 43/46] add latest changes --- dimos/agents/agent.py | 2 +- dimos/agents/cerebras_agent.py | 278 ++++++++++++---------------- tests/test_cerebras_agent_mock.py | 292 ++++++++++++++++++++++++++++++ 3 files changed, 409 insertions(+), 163 deletions(-) create mode 100644 tests/test_cerebras_agent_mock.py diff --git a/dimos/agents/agent.py b/dimos/agents/agent.py index c5d7195585..1ce2216fe7 100644 --- a/dimos/agents/agent.py +++ b/dimos/agents/agent.py @@ -581,7 +581,7 @@ def subscribe_to_query_processing(self, query_observable: Observable) -> Disposa Returns: Disposable: A disposable representing the subscription. """ - print_emission_args = {"enabled": True, "dev_name": self.dev_name, "counts": {}} + print_emission_args = {"enabled": False, "dev_name": self.dev_name, "counts": {}} def _process_query(query) -> Observable: """ diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 108bc8d19b..069a64f9e9 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -35,16 +35,16 @@ from reactivex import Observable from reactivex.observer import Observer from reactivex.scheduler import ThreadPoolScheduler -from dimos.agents.prompt_builder.impl import PromptBuilder -from dimos.agents.tokenizer.base import AbstractTokenizer # Local imports from dimos.agents.agent import LLMAgent from dimos.agents.memory.base import AbstractAgentSemanticMemory -from dimos.agents.tokenizer.huggingface_tokenizer import HuggingFaceTokenizer +from dimos.agents.prompt_builder.impl import PromptBuilder +from dimos.agents.tokenizer.base import AbstractTokenizer from dimos.skills.skills import AbstractSkill, SkillLibrary from dimos.stream.frame_processor import FrameProcessor from dimos.utils.logging_config import setup_logger +from dimos.agents.tokenizer.openai_tokenizer import OpenAITokenizer # Initialize environment variables load_dotenv() @@ -54,7 +54,7 @@ # Response object compatible with LLMAgent -class CerebrasResponseMessage: +class CerebrasResponseMessage(dict): def __init__( self, content="", @@ -63,6 +63,9 @@ def __init__( self.content = content self.tool_calls = tool_calls or [] self.parsed = None + + # Initialize as dict with the proper structure + super().__init__(self.to_dict()) def __str__(self): # Return a string representation for logging @@ -99,7 +102,6 @@ def to_dict(self): return result - class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. @@ -121,14 +123,14 @@ def __init__( max_input_tokens_per_request: int = 128000, max_output_tokens_per_request: int = 16384, model_name: str = "llama-4-scout-17b-16e-instruct", - prompt_builder: Optional[PromptBuilder] = None, - tokenizer: Optional[AbstractTokenizer] = None, skills: Optional[Union[AbstractSkill, list[AbstractSkill], SkillLibrary]] = None, response_model: Optional[BaseModel] = None, frame_processor: Optional[FrameProcessor] = None, image_detail: str = "low", pool_scheduler: Optional[ThreadPoolScheduler] = None, process_all_inputs: Optional[bool] = None, + tokenizer: Optional[AbstractTokenizer] = None, + prompt_builder: Optional[PromptBuilder] = None, ): """ Initializes a new instance of the CerebrasAgent. @@ -157,6 +159,8 @@ def __init__( image_detail (str): Detail level for images ("low", "high", "auto"). pool_scheduler (ThreadPoolScheduler): The scheduler to use for thread pool operations. process_all_inputs (bool): Whether to process all inputs or skip when busy. + tokenizer (AbstractTokenizer): The tokenizer for the agent. + prompt_builder (PromptBuilder): The prompt builder for the agent. """ # Determine appropriate default for process_all_inputs if not provided if process_all_inputs is None: @@ -204,10 +208,6 @@ def __init__( self.response_model = response_model self.model_name = model_name - self.tokenizer = tokenizer or HuggingFaceTokenizer(model_name=self.model_name) - self.prompt_builder = prompt_builder or PromptBuilder( - self.model_name, tokenizer=self.tokenizer - ) self.image_detail = image_detail self.max_output_tokens_per_request = max_output_tokens_per_request self.max_input_tokens_per_request = max_input_tokens_per_request @@ -216,6 +216,14 @@ def __init__( # Add static context to memory. self._add_context_to_memory() + # Initialize tokenizer and prompt builder + self.tokenizer = tokenizer or OpenAITokenizer(model_name="gpt-4o") # Use GPT-4 tokenizer for better accuracy + self.prompt_builder = prompt_builder or PromptBuilder( + model_name=self.model_name, + max_tokens=self.max_input_tokens_per_request, + tokenizer=self.tokenizer + ) + logger.info("Cerebras Agent Initialized.") def _add_context_to_memory(self): @@ -262,7 +270,6 @@ def _build_prompt( Returns: list: Messages formatted for Cerebras API. """ - # Add system message if provided and not already in history if self.system_query and (not messages or messages[0].get("role") != "system"): messages.insert(0, {"role": "system", "content": self.system_query}) @@ -297,6 +304,67 @@ def _build_prompt( logger.info(f"Added {len(images)} image(s) to conversation") + # Use new truncation function + messages = self._truncate_messages(messages, override_token_limit) + + return messages + + def _truncate_messages(self, messages: list, override_token_limit: bool = False) -> list: + """Truncate messages if total tokens exceed 16k using existing truncate_tokens method. + + Args: + messages (list): List of message dictionaries + override_token_limit (bool): Whether to skip truncation + + Returns: + list: Messages with content truncated if needed + """ + if override_token_limit: + return messages + + total_tokens = 0 + for message in messages: + if isinstance(message.get("content"), str): + total_tokens += self.prompt_builder.tokenizer.token_count(message["content"]) + elif isinstance(message.get("content"), list): + for item in message["content"]: + if item.get("type") == "text": + total_tokens += self.prompt_builder.tokenizer.token_count(item["text"]) + elif item.get("type") == "image_url": + total_tokens += 85 + + if total_tokens > 16000: + excess_tokens = total_tokens - 16000 + current_tokens = total_tokens + + # Start from oldest messages and truncate until under 16k + for i in range(len(messages)): + if current_tokens <= 16000: + break + + msg = messages[i] + if msg.get("role") == "system": + continue + + if isinstance(msg.get("content"), str): + original_tokens = self.prompt_builder.tokenizer.token_count(msg["content"]) + # Calculate how much to truncate from this message + tokens_to_remove = min(excess_tokens, original_tokens // 3) + new_max_tokens = max(50, original_tokens - tokens_to_remove) + + msg["content"] = self.prompt_builder.truncate_tokens( + msg["content"], new_max_tokens, "truncate_end" + ) + + new_tokens = self.prompt_builder.tokenizer.token_count(msg["content"]) + tokens_saved = original_tokens - new_tokens + current_tokens -= tokens_saved + excess_tokens -= tokens_saved + + logger.info(f"Truncated older messages using truncate_tokens, final tokens: {current_tokens}") + else: + logger.info(f"No truncation needed, total tokens: {total_tokens}") + return messages def clean_cerebras_schema(self, schema: dict) -> dict: @@ -473,7 +541,6 @@ def _observable_query( # Create a local copy of conversation history and record its length messages = copy.deepcopy(self.conversation_history) - base_len = len(messages) # Update query and get context self._update_query(incoming_query) @@ -484,88 +551,50 @@ def _observable_query( messages, base64_image, dimensions, override_token_limit, condensed_results ) - # Send query and get response - logger.info("Sending Query.") - response_message = self._send_query(messages) - logger.info(f"Received Response: {response_message}") - - if response_message is None: - logger.error("Received None response from Cerebras API") - observer.on_next("") - observer.on_completed() - return + while True: + logger.info("Sending Query.") + response_message = self._send_query(messages) + logger.info(f"Received Response: {response_message}") - # Add assistant response to local messages (always) - assistant_message = {"role": "assistant"} + if response_message is None: + raise Exception("Response message does not exist.") - if response_message.content: - assistant_message["content"] = response_message.content - else: - assistant_message["content"] = "" # Ensure content is never None - - if hasattr(response_message, "tool_calls") and response_message.tool_calls: - assistant_message["tool_calls"] = [] - for tool_call in response_message.tool_calls: - assistant_message["tool_calls"].append( - { - "id": tool_call.id, - "type": "function", - "function": { - "name": tool_call.function.name, - "arguments": tool_call.function.arguments, - }, - } + # If no skill library or no tool calls, we're done + if ( + self.skill_library is None + or self.skill_library.get_tools() is None + or response_message.tool_calls is None + ): + final_msg = ( + response_message.parsed + if hasattr(response_message, "parsed") and response_message.parsed + else ( + response_message.content + if hasattr(response_message, "content") + else response_message + ) ) - logger.info( - f"Assistant response includes {len(response_message.tool_calls)} tool call(s)" - ) - - messages.append(assistant_message) + messages.append(response_message) + break - # If no skill library is provided or there are no tool calls, emit the response directly - if ( - self.skill_library is None - or self.skill_library.get_tools() is None - or not hasattr(response_message, "tool_calls") - or not response_message.tool_calls - ): - # Just use the content directly since JSON parsing is already handled in _send_query - final_msg = response_message.content or "" + logger.info(f"Assistant requested {len(response_message.tool_calls)} tool call(s)") + next_response = self._handle_tooling(response_message, messages) + + if next_response is None: + final_msg = response_message.content or "" + break - observer.on_next(final_msg) - self.response_subject.on_next(final_msg) - else: - # Handle tool calls if present - response_message_2 = self._handle_tooling(response_message, messages) - - # Update conversation history - if not hasattr(self, "_history_lock"): - self._history_lock = threading.Lock() - with self._history_lock: - for msg in messages[base_len:]: - self.conversation_history.append(msg) - logger.info( - f"Updated conversation history (total: {len(self.conversation_history)} messages)" - ) - - # For tool call responses, show what was executed - if response_message_2 is not None: - # Handle different types of responses from skill execution - if hasattr(response_message_2, "content"): - final_msg = response_message_2.content - else: - # Skill result is not a response object, just convert to string - final_msg = f"Skill executed successfully. Result: {response_message_2}" - else: - # Create a summary of executed commands - final_msg = "Executed commands: " + ", ".join( - f"{tc.function.name}({tc.function.arguments})" - for tc in response_message.tool_calls - ) + response_message = next_response + with self._history_lock: + self.conversation_history = messages + logger.info( + f"Updated conversation history (total: {len(self.conversation_history)} messages)" + ) + + # Emit the final message content to the observer observer.on_next(final_msg) self.response_subject.on_next(final_msg) - observer.on_completed() except Exception as e: @@ -573,79 +602,4 @@ def _observable_query( observer.on_error(e) self.response_subject.on_error(e) - def _handle_tooling(self, response_message, messages): - """Handles tooling callbacks in the response message. - - If tool calls are present, the corresponding functions are executed and - a follow-up query is sent. Tool calls are executed sequentially, waiting - for each one to complete before starting the next. - - Args: - response_message: The response message containing tool calls. - messages (list): The original list of messages sent. - - Returns: - The final response message after processing tool calls, if any. - """ - - def _tooling_callback(message, messages, response_message, skill_library: SkillLibrary): - has_called_tools = False - new_messages = [] - - # Process tool calls sequentially - for tool_call in message.tool_calls: - has_called_tools = True - name = tool_call.function.name - args = json.loads(tool_call.function.arguments) - - # Execute the tool call - logger.info(f"Executing tool call: {name} with args: {args}") - result = skill_library.call(name, **args) - logger.info(f"Tool call completed: {name} with result: {result}") - - # Add the result to messages - new_messages.append( - { - "role": "tool", - "tool_call_id": tool_call.id, - "content": str(result), - "name": name, - } - ) - - # Wait for the tool call to complete by running a follow-up query - self.run_observable_query( - query_text=f"Tool {name}, ID: {tool_call.id} execution complete. Please summarize the results and continue." - ).run() - - if has_called_tools: - # Convert response_message to dict format for JSON serialization - response_dict = response_message.to_dict() - messages.append(response_dict) - messages.extend(new_messages) - - logger.info("Sending follow-up query after tool calls completed.") - try: - response_2 = self._send_query(messages) - - # Check if the follow-up response also has tool calls - if ( - hasattr(response_2, "tool_calls") - and response_2.tool_calls - and len(response_2.tool_calls) > 0 - ): - logger.info( - "Follow-up response has more tool calls, processing recursively..." - ) - return self._handle_tooling(response_2, messages) - else: - logger.info(f"No more tool calls, returning final response: {response_2}") - # No more tool calls, return the final response - return response_2 - - except Exception as e: - logger.error(f"Error in follow-up query: {e}") - return None - return None - return _tooling_callback(response_message, messages, response_message, self.skill_library) diff --git a/tests/test_cerebras_agent_mock.py b/tests/test_cerebras_agent_mock.py new file mode 100644 index 0000000000..548a37b384 --- /dev/null +++ b/tests/test_cerebras_agent_mock.py @@ -0,0 +1,292 @@ +# 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. + +"""Complete mock test for CerebrasAgent with proper MockRobot setup.""" + +import unittest +from unittest import mock +import tests.test_header +from typing import Optional + +from dimos.robot.robot import MockRobot +from dimos.robot.unitree.unitree_skills import MyUnitreeSkills +from dimos.agents.cerebras_agent import CerebrasAgent, CerebrasResponseMessage +from dimos.skills.skills import AbstractSkill +from pydantic import Field + + +class MockSkill(AbstractSkill): + """A mock skill for testing.""" + + execution_count: int = Field(default=0, description="Number of times skill has been executed") + last_params: Optional[dict] = Field(default=None, description="Last parameters passed to skill") + + # Class-level tracking to persist across instances for testing + _class_execution_count: int = 0 + _class_last_params: Optional[dict] = None + + def __call__(self, **kwargs): + # Update instance values + self.execution_count += 1 + self.last_params = kwargs + + # Update class-level tracking for tests + MockSkill._class_execution_count += 1 + MockSkill._class_last_params = kwargs + + return f"MockSkill executed with params: {kwargs}" + + @classmethod + def reset_tracking(cls): + """Reset class-level tracking for clean tests.""" + cls._class_execution_count = 0 + cls._class_last_params = None + + +class TestCerebrasAgentMock(unittest.TestCase): + """Complete mock test suite for CerebrasAgent with MockRobot.""" + + def setUp(self): + """Set up test fixtures with proper MockRobot integration.""" + # Reset MockSkill tracking for clean tests + MockSkill.reset_tracking() + + # Create mock robot (properly initialized) + self.robot = MockRobot() + + # Create skill library with the robot + self.skill_library = MyUnitreeSkills(robot=self.robot) + self.skill_library.initialize_skills() + + # Add our custom mock skill + self.mock_skill = MockSkill + self.skill_library.add(self.mock_skill) + + # Create skill instance with robot reference + self.skill_library.create_instance("MockSkill", robot=self.robot) + + # Create agent with the skill library + self.agent = CerebrasAgent( + dev_name="MockTestAgent", + system_query="You are a test agent. Use the MockSkill when asked.", + skills=self.skill_library, + ) + + def get_skill_instance(self, name): + """Helper method to create skill instances since get_instance doesn't exist.""" + # Get the stored args if available; otherwise, use an empty dict + stored_args = self.skill_library._instances.get(name, {}) + + # Find the skill class + skill_class = None + for skill in self.skill_library.get(): + if name == skill.__name__: + skill_class = skill + break + + if skill_class is None: + raise ValueError(f"Skill class not found: {name}") + + # Initialize the instance with the stored arguments + return skill_class(**stored_args) + + @mock.patch("cerebras.cloud.sdk.Cerebras") + def test_complete_interaction_with_mockrobot(self, mock_cerebras_client): + """Test a complete interaction flow with MockRobot and real agent logic.""" + # Create mock Cerebras client + mock_client_instance = mock.MagicMock() + mock_cerebras_client.return_value = mock_client_instance + + # Create mock response for tool call + mock_tool_call = mock.MagicMock() + mock_tool_call.id = "call_123" + mock_tool_call.function.name = "MockSkill" + mock_tool_call.function.arguments = '{"param1": "test_value"}' + + # First response with tool call + mock_response_1 = mock.MagicMock() + mock_response_1.choices = [mock.MagicMock()] + mock_response_1.choices[0].message.content = "I'll execute the MockSkill" + mock_response_1.choices[0].message.tool_calls = [mock_tool_call] + + # Second response after tool execution + mock_response_2 = mock.MagicMock() + mock_response_2.choices = [mock.MagicMock()] + mock_response_2.choices[0].message.content = "Task completed successfully!" + mock_response_2.choices[0].message.tool_calls = None + + # Set up client to return our mock responses + mock_client_instance.chat.completions.create.side_effect = [ + mock_response_1, + mock_response_2 + ] + + # Replace the client in our agent + self.agent.client = mock_client_instance + + # Execute the test + response = self.agent.run_observable_query("Execute MockSkill with param1=test_value").run() + + # Verify the response + self.assertEqual(response, "Task completed successfully!") + + # Verify the skill was executed with correct parameters + skill_instance = self.get_skill_instance("MockSkill") + self.assertEqual(MockSkill._class_execution_count, 1) + self.assertEqual(MockSkill._class_last_params, {"param1": "test_value"}) + + def test_mockrobot_integration(self): + """Test that MockRobot is properly integrated with skills.""" + # Verify robot is properly set up + self.assertIsInstance(self.robot, MockRobot) + self.assertIsNotNone(self.robot.skill_library) + + # Verify skill library has the robot reference + self.assertEqual(self.skill_library._robot, self.robot) + + # Verify skill instance can be created + skill_instance = self.get_skill_instance("MockSkill") + self.assertIsInstance(skill_instance, MockSkill) + + @mock.patch("cerebras.cloud.sdk.Cerebras") + def test_multi_tooling_with_mockrobot(self, mock_cerebras_client): + """Test multi-tooling capability with MockRobot.""" + # Setup mock client + mock_client_instance = mock.MagicMock() + mock_cerebras_client.return_value = mock_client_instance + + # Create tool calls for multi-tooling test + mock_tool_call_1 = mock.MagicMock() + mock_tool_call_1.id = "call_1" + mock_tool_call_1.function.name = "MockSkill" + mock_tool_call_1.function.arguments = '{"step": 1}' + + mock_tool_call_2 = mock.MagicMock() + mock_tool_call_2.id = "call_2" + mock_tool_call_2.function.name = "MockSkill" + mock_tool_call_2.function.arguments = '{"step": 2}' + + # Response sequence for multi-tooling + responses = [ + # First response: tool call 1 + self._create_mock_response("Executing step 1", [mock_tool_call_1]), + # Second response: tool call 2 + self._create_mock_response("Executing step 2", [mock_tool_call_2]), + # Final response: no more tools + self._create_mock_response("All steps completed!", None) + ] + + mock_client_instance.chat.completions.create.side_effect = responses + self.agent.client = mock_client_instance + + # Execute multi-tool test + response = self.agent.run_observable_query("Execute MockSkill in multiple steps").run() + + # Verify multi-tooling worked + self.assertEqual(response, "All steps completed!") + skill_instance = self.get_skill_instance("MockSkill") + self.assertEqual(MockSkill._class_execution_count, 2) + + @mock.patch("cerebras.cloud.sdk.Cerebras") + def test_infinite_loop_protection(self, mock_cerebras_client): + """Test that infinite loop protection works.""" + # Setup mock client + mock_client_instance = mock.MagicMock() + mock_cerebras_client.return_value = mock_client_instance + + # Create a tool call that would loop infinitely + mock_tool_call = mock.MagicMock() + mock_tool_call.id = "call_loop" + mock_tool_call.function.name = "MockSkill" + mock_tool_call.function.arguments = '{"loop": "forever"}' + + # Create response that always has tool calls (would loop forever) + loop_response = self._create_mock_response("Looping...", [mock_tool_call]) + + # Set up client to always return the looping response + mock_client_instance.chat.completions.create.return_value = loop_response + self.agent.client = mock_client_instance + + # Execute test - should stop due to max iterations + response = self.agent.run_observable_query("Start infinite loop").run() + + # Verify it stopped with the safety message + self.assertEqual(response, "Tool execution stopped due to maximum iteration limit.") + + def _create_mock_response(self, content, tool_calls): + """Helper to create mock Cerebras responses.""" + mock_response = mock.MagicMock() + mock_response.choices = [mock.MagicMock()] + mock_response.choices[0].message.content = content + mock_response.choices[0].message.tool_calls = tool_calls + return mock_response + + def test_cerebras_response_message_serialization(self): + """Test that CerebrasResponseMessage serializes properly.""" + # Create a mock tool call + mock_tool_call = mock.MagicMock() + mock_tool_call.id = "call_123" + mock_tool_call.function.name = "test_function" + mock_tool_call.function.arguments = '{"test": "value"}' + + # Create CerebrasResponseMessage + response_msg = CerebrasResponseMessage( + content="Test content", + tool_calls=[mock_tool_call] + ) + + # Test serialization + serialized = response_msg.to_dict() + self.assertEqual(serialized["role"], "assistant") + self.assertEqual(serialized["content"], "Test content") + self.assertEqual(len(serialized["tool_calls"]), 1) + self.assertEqual(serialized["tool_calls"][0]["id"], "call_123") + + # Test that it inherits from dict + self.assertIsInstance(response_msg, dict) + + @mock.patch("cerebras.cloud.sdk.Cerebras") + def test_error_handling_with_mockrobot(self, mock_cerebras_client): + """Test error handling in the agent with MockRobot.""" + # Setup mock client to raise an exception + mock_client_instance = mock.MagicMock() + mock_cerebras_client.return_value = mock_client_instance + mock_client_instance.chat.completions.create.side_effect = Exception("API Error") + + self.agent.client = mock_client_instance + + # Test error handling + with self.assertRaises(Exception) as context: + self.agent.run_observable_query("Execute MockSkill").run() + + self.assertEqual(str(context.exception), "API Error") + + def test_skill_library_integration(self): + """Test that skill library is properly integrated.""" + # Verify skill library setup + self.assertIsNotNone(self.agent.skill_library) + self.assertEqual(self.agent.skill_library, self.skill_library) + + # Verify tools are available + tools = self.skill_library.get_tools() + self.assertIsNotNone(tools) + self.assertGreater(len(tools), 0) + + # Verify MockSkill is in the tools + skill_names = [tool["function"]["name"] for tool in tools] + self.assertIn("MockSkill", skill_names) + + +if __name__ == "__main__": + unittest.main() \ No newline at end of file From b70c2259b283ff677c2b7461b276fdd0b4b7f1be Mon Sep 17 00:00:00 2001 From: Joshua Jerin Date: Tue, 10 Jun 2025 00:56:19 -0700 Subject: [PATCH 44/46] Complete merge From 5b6abcedb56d304bf9db0f190a5ce0258711ab1c Mon Sep 17 00:00:00 2001 From: joshuajerin <82904511+joshuajerin@users.noreply.github.com> Date: Tue, 10 Jun 2025 07:59:01 +0000 Subject: [PATCH 45/46] CI code cleanup --- dimos/agents/cerebras_agent.py | 49 ++++++++-------- tests/test_cerebras_agent_mock.py | 93 +++++++++++++++---------------- 2 files changed, 71 insertions(+), 71 deletions(-) diff --git a/dimos/agents/cerebras_agent.py b/dimos/agents/cerebras_agent.py index 069a64f9e9..854beb848d 100644 --- a/dimos/agents/cerebras_agent.py +++ b/dimos/agents/cerebras_agent.py @@ -63,7 +63,7 @@ def __init__( self.content = content self.tool_calls = tool_calls or [] self.parsed = None - + # Initialize as dict with the proper structure super().__init__(self.to_dict()) @@ -102,6 +102,7 @@ def to_dict(self): return result + class CerebrasAgent(LLMAgent): """Cerebras agent implementation using the official Cerebras Python SDK. @@ -217,11 +218,13 @@ def __init__( self._add_context_to_memory() # Initialize tokenizer and prompt builder - self.tokenizer = tokenizer or OpenAITokenizer(model_name="gpt-4o") # Use GPT-4 tokenizer for better accuracy + self.tokenizer = tokenizer or OpenAITokenizer( + model_name="gpt-4o" + ) # Use GPT-4 tokenizer for better accuracy self.prompt_builder = prompt_builder or PromptBuilder( model_name=self.model_name, max_tokens=self.max_input_tokens_per_request, - tokenizer=self.tokenizer + tokenizer=self.tokenizer, ) logger.info("Cerebras Agent Initialized.") @@ -306,22 +309,22 @@ def _build_prompt( # Use new truncation function messages = self._truncate_messages(messages, override_token_limit) - + return messages def _truncate_messages(self, messages: list, override_token_limit: bool = False) -> list: """Truncate messages if total tokens exceed 16k using existing truncate_tokens method. - + Args: messages (list): List of message dictionaries override_token_limit (bool): Whether to skip truncation - + Returns: list: Messages with content truncated if needed """ if override_token_limit: return messages - + total_tokens = 0 for message in messages: if isinstance(message.get("content"), str): @@ -332,39 +335,41 @@ def _truncate_messages(self, messages: list, override_token_limit: bool = False) total_tokens += self.prompt_builder.tokenizer.token_count(item["text"]) elif item.get("type") == "image_url": total_tokens += 85 - + if total_tokens > 16000: excess_tokens = total_tokens - 16000 current_tokens = total_tokens - + # Start from oldest messages and truncate until under 16k for i in range(len(messages)): if current_tokens <= 16000: break - + msg = messages[i] if msg.get("role") == "system": - continue - + continue + if isinstance(msg.get("content"), str): original_tokens = self.prompt_builder.tokenizer.token_count(msg["content"]) # Calculate how much to truncate from this message - tokens_to_remove = min(excess_tokens, original_tokens // 3) - new_max_tokens = max(50, original_tokens - tokens_to_remove) - + tokens_to_remove = min(excess_tokens, original_tokens // 3) + new_max_tokens = max(50, original_tokens - tokens_to_remove) + msg["content"] = self.prompt_builder.truncate_tokens( msg["content"], new_max_tokens, "truncate_end" ) - + new_tokens = self.prompt_builder.tokenizer.token_count(msg["content"]) tokens_saved = original_tokens - new_tokens current_tokens -= tokens_saved excess_tokens -= tokens_saved - - logger.info(f"Truncated older messages using truncate_tokens, final tokens: {current_tokens}") + + logger.info( + f"Truncated older messages using truncate_tokens, final tokens: {current_tokens}" + ) else: logger.info(f"No truncation needed, total tokens: {total_tokens}") - + return messages def clean_cerebras_schema(self, schema: dict) -> dict: @@ -579,7 +584,7 @@ def _observable_query( logger.info(f"Assistant requested {len(response_message.tool_calls)} tool call(s)") next_response = self._handle_tooling(response_message, messages) - + if next_response is None: final_msg = response_message.content or "" break @@ -591,7 +596,7 @@ def _observable_query( logger.info( f"Updated conversation history (total: {len(self.conversation_history)} messages)" ) - + # Emit the final message content to the observer observer.on_next(final_msg) self.response_subject.on_next(final_msg) @@ -601,5 +606,3 @@ def _observable_query( logger.error(f"Query failed in {self.dev_name}: {e}") observer.on_error(e) self.response_subject.on_error(e) - - diff --git a/tests/test_cerebras_agent_mock.py b/tests/test_cerebras_agent_mock.py index 548a37b384..4836060e4d 100644 --- a/tests/test_cerebras_agent_mock.py +++ b/tests/test_cerebras_agent_mock.py @@ -28,10 +28,10 @@ class MockSkill(AbstractSkill): """A mock skill for testing.""" - + execution_count: int = Field(default=0, description="Number of times skill has been executed") last_params: Optional[dict] = Field(default=None, description="Last parameters passed to skill") - + # Class-level tracking to persist across instances for testing _class_execution_count: int = 0 _class_last_params: Optional[dict] = None @@ -40,13 +40,13 @@ def __call__(self, **kwargs): # Update instance values self.execution_count += 1 self.last_params = kwargs - + # Update class-level tracking for tests MockSkill._class_execution_count += 1 MockSkill._class_last_params = kwargs - + return f"MockSkill executed with params: {kwargs}" - + @classmethod def reset_tracking(cls): """Reset class-level tracking for clean tests.""" @@ -61,21 +61,21 @@ def setUp(self): """Set up test fixtures with proper MockRobot integration.""" # Reset MockSkill tracking for clean tests MockSkill.reset_tracking() - + # Create mock robot (properly initialized) self.robot = MockRobot() - + # Create skill library with the robot self.skill_library = MyUnitreeSkills(robot=self.robot) self.skill_library.initialize_skills() - + # Add our custom mock skill self.mock_skill = MockSkill self.skill_library.add(self.mock_skill) - + # Create skill instance with robot reference self.skill_library.create_instance("MockSkill", robot=self.robot) - + # Create agent with the skill library self.agent = CerebrasAgent( dev_name="MockTestAgent", @@ -94,7 +94,7 @@ def get_skill_instance(self, name): if name == skill.__name__: skill_class = skill break - + if skill_class is None: raise ValueError(f"Skill class not found: {name}") @@ -107,40 +107,40 @@ def test_complete_interaction_with_mockrobot(self, mock_cerebras_client): # Create mock Cerebras client mock_client_instance = mock.MagicMock() mock_cerebras_client.return_value = mock_client_instance - + # Create mock response for tool call mock_tool_call = mock.MagicMock() mock_tool_call.id = "call_123" mock_tool_call.function.name = "MockSkill" mock_tool_call.function.arguments = '{"param1": "test_value"}' - + # First response with tool call mock_response_1 = mock.MagicMock() mock_response_1.choices = [mock.MagicMock()] mock_response_1.choices[0].message.content = "I'll execute the MockSkill" mock_response_1.choices[0].message.tool_calls = [mock_tool_call] - + # Second response after tool execution mock_response_2 = mock.MagicMock() mock_response_2.choices = [mock.MagicMock()] mock_response_2.choices[0].message.content = "Task completed successfully!" mock_response_2.choices[0].message.tool_calls = None - + # Set up client to return our mock responses mock_client_instance.chat.completions.create.side_effect = [ mock_response_1, - mock_response_2 + mock_response_2, ] - + # Replace the client in our agent self.agent.client = mock_client_instance - + # Execute the test response = self.agent.run_observable_query("Execute MockSkill with param1=test_value").run() - + # Verify the response self.assertEqual(response, "Task completed successfully!") - + # Verify the skill was executed with correct parameters skill_instance = self.get_skill_instance("MockSkill") self.assertEqual(MockSkill._class_execution_count, 1) @@ -151,10 +151,10 @@ def test_mockrobot_integration(self): # Verify robot is properly set up self.assertIsInstance(self.robot, MockRobot) self.assertIsNotNone(self.robot.skill_library) - + # Verify skill library has the robot reference self.assertEqual(self.skill_library._robot, self.robot) - + # Verify skill instance can be created skill_instance = self.get_skill_instance("MockSkill") self.assertIsInstance(skill_instance, MockSkill) @@ -165,34 +165,34 @@ def test_multi_tooling_with_mockrobot(self, mock_cerebras_client): # Setup mock client mock_client_instance = mock.MagicMock() mock_cerebras_client.return_value = mock_client_instance - + # Create tool calls for multi-tooling test mock_tool_call_1 = mock.MagicMock() mock_tool_call_1.id = "call_1" mock_tool_call_1.function.name = "MockSkill" mock_tool_call_1.function.arguments = '{"step": 1}' - + mock_tool_call_2 = mock.MagicMock() mock_tool_call_2.id = "call_2" mock_tool_call_2.function.name = "MockSkill" mock_tool_call_2.function.arguments = '{"step": 2}' - + # Response sequence for multi-tooling responses = [ # First response: tool call 1 self._create_mock_response("Executing step 1", [mock_tool_call_1]), - # Second response: tool call 2 + # Second response: tool call 2 self._create_mock_response("Executing step 2", [mock_tool_call_2]), # Final response: no more tools - self._create_mock_response("All steps completed!", None) + self._create_mock_response("All steps completed!", None), ] - + mock_client_instance.chat.completions.create.side_effect = responses self.agent.client = mock_client_instance - + # Execute multi-tool test response = self.agent.run_observable_query("Execute MockSkill in multiple steps").run() - + # Verify multi-tooling worked self.assertEqual(response, "All steps completed!") skill_instance = self.get_skill_instance("MockSkill") @@ -204,23 +204,23 @@ def test_infinite_loop_protection(self, mock_cerebras_client): # Setup mock client mock_client_instance = mock.MagicMock() mock_cerebras_client.return_value = mock_client_instance - + # Create a tool call that would loop infinitely mock_tool_call = mock.MagicMock() mock_tool_call.id = "call_loop" mock_tool_call.function.name = "MockSkill" mock_tool_call.function.arguments = '{"loop": "forever"}' - + # Create response that always has tool calls (would loop forever) loop_response = self._create_mock_response("Looping...", [mock_tool_call]) - + # Set up client to always return the looping response mock_client_instance.chat.completions.create.return_value = loop_response self.agent.client = mock_client_instance - + # Execute test - should stop due to max iterations response = self.agent.run_observable_query("Start infinite loop").run() - + # Verify it stopped with the safety message self.assertEqual(response, "Tool execution stopped due to maximum iteration limit.") @@ -239,20 +239,17 @@ def test_cerebras_response_message_serialization(self): mock_tool_call.id = "call_123" mock_tool_call.function.name = "test_function" mock_tool_call.function.arguments = '{"test": "value"}' - + # Create CerebrasResponseMessage - response_msg = CerebrasResponseMessage( - content="Test content", - tool_calls=[mock_tool_call] - ) - + response_msg = CerebrasResponseMessage(content="Test content", tool_calls=[mock_tool_call]) + # Test serialization serialized = response_msg.to_dict() self.assertEqual(serialized["role"], "assistant") self.assertEqual(serialized["content"], "Test content") self.assertEqual(len(serialized["tool_calls"]), 1) self.assertEqual(serialized["tool_calls"][0]["id"], "call_123") - + # Test that it inherits from dict self.assertIsInstance(response_msg, dict) @@ -263,13 +260,13 @@ def test_error_handling_with_mockrobot(self, mock_cerebras_client): mock_client_instance = mock.MagicMock() mock_cerebras_client.return_value = mock_client_instance mock_client_instance.chat.completions.create.side_effect = Exception("API Error") - + self.agent.client = mock_client_instance - + # Test error handling with self.assertRaises(Exception) as context: self.agent.run_observable_query("Execute MockSkill").run() - + self.assertEqual(str(context.exception), "API Error") def test_skill_library_integration(self): @@ -277,16 +274,16 @@ def test_skill_library_integration(self): # Verify skill library setup self.assertIsNotNone(self.agent.skill_library) self.assertEqual(self.agent.skill_library, self.skill_library) - + # Verify tools are available tools = self.skill_library.get_tools() self.assertIsNotNone(tools) self.assertGreater(len(tools), 0) - + # Verify MockSkill is in the tools skill_names = [tool["function"]["name"] for tool in tools] self.assertIn("MockSkill", skill_names) if __name__ == "__main__": - unittest.main() \ No newline at end of file + unittest.main() From e29bd0601d324bf53809d1d5d5ca0fa64f4817d6 Mon Sep 17 00:00:00 2001 From: stash Date: Tue, 10 Jun 2025 21:05:47 -0700 Subject: [PATCH 46/46] Removed non-functioning tests --- tests/test_cerebras_agent_mock.py | 289 ---------------------------- tests/test_cerebras_agent_skills.py | 116 ----------- tests/test_cerebras_unitree_ros.py | 2 - 3 files changed, 407 deletions(-) delete mode 100644 tests/test_cerebras_agent_mock.py delete mode 100644 tests/test_cerebras_agent_skills.py diff --git a/tests/test_cerebras_agent_mock.py b/tests/test_cerebras_agent_mock.py deleted file mode 100644 index 4836060e4d..0000000000 --- a/tests/test_cerebras_agent_mock.py +++ /dev/null @@ -1,289 +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. - -"""Complete mock test for CerebrasAgent with proper MockRobot setup.""" - -import unittest -from unittest import mock -import tests.test_header -from typing import Optional - -from dimos.robot.robot import MockRobot -from dimos.robot.unitree.unitree_skills import MyUnitreeSkills -from dimos.agents.cerebras_agent import CerebrasAgent, CerebrasResponseMessage -from dimos.skills.skills import AbstractSkill -from pydantic import Field - - -class MockSkill(AbstractSkill): - """A mock skill for testing.""" - - execution_count: int = Field(default=0, description="Number of times skill has been executed") - last_params: Optional[dict] = Field(default=None, description="Last parameters passed to skill") - - # Class-level tracking to persist across instances for testing - _class_execution_count: int = 0 - _class_last_params: Optional[dict] = None - - def __call__(self, **kwargs): - # Update instance values - self.execution_count += 1 - self.last_params = kwargs - - # Update class-level tracking for tests - MockSkill._class_execution_count += 1 - MockSkill._class_last_params = kwargs - - return f"MockSkill executed with params: {kwargs}" - - @classmethod - def reset_tracking(cls): - """Reset class-level tracking for clean tests.""" - cls._class_execution_count = 0 - cls._class_last_params = None - - -class TestCerebrasAgentMock(unittest.TestCase): - """Complete mock test suite for CerebrasAgent with MockRobot.""" - - def setUp(self): - """Set up test fixtures with proper MockRobot integration.""" - # Reset MockSkill tracking for clean tests - MockSkill.reset_tracking() - - # Create mock robot (properly initialized) - self.robot = MockRobot() - - # Create skill library with the robot - self.skill_library = MyUnitreeSkills(robot=self.robot) - self.skill_library.initialize_skills() - - # Add our custom mock skill - self.mock_skill = MockSkill - self.skill_library.add(self.mock_skill) - - # Create skill instance with robot reference - self.skill_library.create_instance("MockSkill", robot=self.robot) - - # Create agent with the skill library - self.agent = CerebrasAgent( - dev_name="MockTestAgent", - system_query="You are a test agent. Use the MockSkill when asked.", - skills=self.skill_library, - ) - - def get_skill_instance(self, name): - """Helper method to create skill instances since get_instance doesn't exist.""" - # Get the stored args if available; otherwise, use an empty dict - stored_args = self.skill_library._instances.get(name, {}) - - # Find the skill class - skill_class = None - for skill in self.skill_library.get(): - if name == skill.__name__: - skill_class = skill - break - - if skill_class is None: - raise ValueError(f"Skill class not found: {name}") - - # Initialize the instance with the stored arguments - return skill_class(**stored_args) - - @mock.patch("cerebras.cloud.sdk.Cerebras") - def test_complete_interaction_with_mockrobot(self, mock_cerebras_client): - """Test a complete interaction flow with MockRobot and real agent logic.""" - # Create mock Cerebras client - mock_client_instance = mock.MagicMock() - mock_cerebras_client.return_value = mock_client_instance - - # Create mock response for tool call - mock_tool_call = mock.MagicMock() - mock_tool_call.id = "call_123" - mock_tool_call.function.name = "MockSkill" - mock_tool_call.function.arguments = '{"param1": "test_value"}' - - # First response with tool call - mock_response_1 = mock.MagicMock() - mock_response_1.choices = [mock.MagicMock()] - mock_response_1.choices[0].message.content = "I'll execute the MockSkill" - mock_response_1.choices[0].message.tool_calls = [mock_tool_call] - - # Second response after tool execution - mock_response_2 = mock.MagicMock() - mock_response_2.choices = [mock.MagicMock()] - mock_response_2.choices[0].message.content = "Task completed successfully!" - mock_response_2.choices[0].message.tool_calls = None - - # Set up client to return our mock responses - mock_client_instance.chat.completions.create.side_effect = [ - mock_response_1, - mock_response_2, - ] - - # Replace the client in our agent - self.agent.client = mock_client_instance - - # Execute the test - response = self.agent.run_observable_query("Execute MockSkill with param1=test_value").run() - - # Verify the response - self.assertEqual(response, "Task completed successfully!") - - # Verify the skill was executed with correct parameters - skill_instance = self.get_skill_instance("MockSkill") - self.assertEqual(MockSkill._class_execution_count, 1) - self.assertEqual(MockSkill._class_last_params, {"param1": "test_value"}) - - def test_mockrobot_integration(self): - """Test that MockRobot is properly integrated with skills.""" - # Verify robot is properly set up - self.assertIsInstance(self.robot, MockRobot) - self.assertIsNotNone(self.robot.skill_library) - - # Verify skill library has the robot reference - self.assertEqual(self.skill_library._robot, self.robot) - - # Verify skill instance can be created - skill_instance = self.get_skill_instance("MockSkill") - self.assertIsInstance(skill_instance, MockSkill) - - @mock.patch("cerebras.cloud.sdk.Cerebras") - def test_multi_tooling_with_mockrobot(self, mock_cerebras_client): - """Test multi-tooling capability with MockRobot.""" - # Setup mock client - mock_client_instance = mock.MagicMock() - mock_cerebras_client.return_value = mock_client_instance - - # Create tool calls for multi-tooling test - mock_tool_call_1 = mock.MagicMock() - mock_tool_call_1.id = "call_1" - mock_tool_call_1.function.name = "MockSkill" - mock_tool_call_1.function.arguments = '{"step": 1}' - - mock_tool_call_2 = mock.MagicMock() - mock_tool_call_2.id = "call_2" - mock_tool_call_2.function.name = "MockSkill" - mock_tool_call_2.function.arguments = '{"step": 2}' - - # Response sequence for multi-tooling - responses = [ - # First response: tool call 1 - self._create_mock_response("Executing step 1", [mock_tool_call_1]), - # Second response: tool call 2 - self._create_mock_response("Executing step 2", [mock_tool_call_2]), - # Final response: no more tools - self._create_mock_response("All steps completed!", None), - ] - - mock_client_instance.chat.completions.create.side_effect = responses - self.agent.client = mock_client_instance - - # Execute multi-tool test - response = self.agent.run_observable_query("Execute MockSkill in multiple steps").run() - - # Verify multi-tooling worked - self.assertEqual(response, "All steps completed!") - skill_instance = self.get_skill_instance("MockSkill") - self.assertEqual(MockSkill._class_execution_count, 2) - - @mock.patch("cerebras.cloud.sdk.Cerebras") - def test_infinite_loop_protection(self, mock_cerebras_client): - """Test that infinite loop protection works.""" - # Setup mock client - mock_client_instance = mock.MagicMock() - mock_cerebras_client.return_value = mock_client_instance - - # Create a tool call that would loop infinitely - mock_tool_call = mock.MagicMock() - mock_tool_call.id = "call_loop" - mock_tool_call.function.name = "MockSkill" - mock_tool_call.function.arguments = '{"loop": "forever"}' - - # Create response that always has tool calls (would loop forever) - loop_response = self._create_mock_response("Looping...", [mock_tool_call]) - - # Set up client to always return the looping response - mock_client_instance.chat.completions.create.return_value = loop_response - self.agent.client = mock_client_instance - - # Execute test - should stop due to max iterations - response = self.agent.run_observable_query("Start infinite loop").run() - - # Verify it stopped with the safety message - self.assertEqual(response, "Tool execution stopped due to maximum iteration limit.") - - def _create_mock_response(self, content, tool_calls): - """Helper to create mock Cerebras responses.""" - mock_response = mock.MagicMock() - mock_response.choices = [mock.MagicMock()] - mock_response.choices[0].message.content = content - mock_response.choices[0].message.tool_calls = tool_calls - return mock_response - - def test_cerebras_response_message_serialization(self): - """Test that CerebrasResponseMessage serializes properly.""" - # Create a mock tool call - mock_tool_call = mock.MagicMock() - mock_tool_call.id = "call_123" - mock_tool_call.function.name = "test_function" - mock_tool_call.function.arguments = '{"test": "value"}' - - # Create CerebrasResponseMessage - response_msg = CerebrasResponseMessage(content="Test content", tool_calls=[mock_tool_call]) - - # Test serialization - serialized = response_msg.to_dict() - self.assertEqual(serialized["role"], "assistant") - self.assertEqual(serialized["content"], "Test content") - self.assertEqual(len(serialized["tool_calls"]), 1) - self.assertEqual(serialized["tool_calls"][0]["id"], "call_123") - - # Test that it inherits from dict - self.assertIsInstance(response_msg, dict) - - @mock.patch("cerebras.cloud.sdk.Cerebras") - def test_error_handling_with_mockrobot(self, mock_cerebras_client): - """Test error handling in the agent with MockRobot.""" - # Setup mock client to raise an exception - mock_client_instance = mock.MagicMock() - mock_cerebras_client.return_value = mock_client_instance - mock_client_instance.chat.completions.create.side_effect = Exception("API Error") - - self.agent.client = mock_client_instance - - # Test error handling - with self.assertRaises(Exception) as context: - self.agent.run_observable_query("Execute MockSkill").run() - - self.assertEqual(str(context.exception), "API Error") - - def test_skill_library_integration(self): - """Test that skill library is properly integrated.""" - # Verify skill library setup - self.assertIsNotNone(self.agent.skill_library) - self.assertEqual(self.agent.skill_library, self.skill_library) - - # Verify tools are available - tools = self.skill_library.get_tools() - self.assertIsNotNone(tools) - self.assertGreater(len(tools), 0) - - # Verify MockSkill is in the tools - skill_names = [tool["function"]["name"] for tool in tools] - self.assertIn("MockSkill", skill_names) - - -if __name__ == "__main__": - unittest.main() diff --git a/tests/test_cerebras_agent_skills.py b/tests/test_cerebras_agent_skills.py deleted file mode 100644 index 4e926bfd3c..0000000000 --- a/tests/test_cerebras_agent_skills.py +++ /dev/null @@ -1,116 +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 -import os -from dimos.robot.robot import MockRobot -import tests.test_header - -import time -from dotenv import load_dotenv -from dimos.agents.cerebras_agent import CerebrasAgent -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.web.robot_web_interface import RobotWebInterface -from dimos.skills.observe_stream import ObserveStream -from dimos.skills.kill_skill import KillSkill -from dimos.skills.navigation import NavigateWithText, GetPose, NavigateToGoal -from dimos.skills.visual_navigation_skills import FollowHuman -import reactivex as rx -import reactivex.operators as ops -from dimos.stream.audio.pipelines import tts, stt -from dimos.web.websocket_vis.server import WebsocketVis -import threading -from dimos.types.vector import Vector -from dimos.skills.speak import Speak - -# Load API key from environment -load_dotenv() - -# robot = MockRobot() - -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=5556, - text_streams=text_streams, -) - -# stt_node = stt() -robot_skills = MyUnitreeSkills(robot) - -# Create a CerebrasAgent instance -agent = CerebrasAgent( - dev_name="test_cerebras_agent", - # input_query_stream=stt_node.emit_text(), - input_query_stream=web_interface.query_stream, - skills=robot_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 - -When you need to call a skill or tool, ALWAYS respond ONLY with a JSON object in this exact format: {"name": "SkillName", "arguments": {"arg1": "value1", "arg2": "value2"}} - -Example: If the user asks to spin right by 90 degrees, output ONLY the following: {"name": "SpinRight", "arguments": {"degrees": 90}}""", - model_name="llama-4-scout-17b-16e-instruct", -) - -# tts_node = tts() -# tts_node.consume_text(agent.get_response_observable()) - -# robot_skills.add(ObserveStream) -# robot_skills.add(KillSkill) -# robot_skills.add(NavigateWithText) -# 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("NavigateWithText", 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(f"Registered skills: {', '.join([skill.__name__ for skill in robot_skills.skills])}") -print("Cerebras agent demo initialized. You can now interact with the agent via the web interface.") - -web_interface.run() diff --git a/tests/test_cerebras_unitree_ros.py b/tests/test_cerebras_unitree_ros.py index 5ac9011baa..cbb7c130db 100644 --- a/tests/test_cerebras_unitree_ros.py +++ b/tests/test_cerebras_unitree_ros.py @@ -53,11 +53,9 @@ # 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,