diff --git a/notebooks/.gitkeep b/notebooks/.gitkeep deleted file mode 100644 index e69de29..0000000 diff --git a/notebooks/demo_inference.ipynb b/notebooks/demo_inference.ipynb deleted file mode 100644 index 5d87789..0000000 --- a/notebooks/demo_inference.ipynb +++ /dev/null @@ -1,171 +0,0 @@ -{ - "cells": [ - { - "cell_type": "code", - "execution_count": 11, - "metadata": {}, - "outputs": [], - "source": [ - "import requests\n", - "from maskrcnn_benchmark.data.datasets.utils.load_files import load_labelmap_file\n", - "\n", - "from emma_perception.utils.visualizing_image import SingleImageViz\n", - "import PIL.Image as Image\n", - "from io import BytesIO\n", - "import numpy as np\n", - "\n", - "import os\n", - "\n", - "# sets the correct classmap for the object detector\n", - "os.environ[\"CLASSMAP_TYPE\"] = \"original\"\n", - "\n", - "from emma_perception.constants import OBJECT_CLASSMAP\n", - "\n", - "id2obj = {int(obj_id): obj_label for obj_id, obj_label in OBJECT_CLASSMAP[\"idx_to_label\"].items()}" - ] - }, - { - "cell_type": "code", - "execution_count": 5, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "0" - ] - }, - "execution_count": 5, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "# Specify the image to use\n", - "\n", - "image_url = (\n", - " \"https://production-media.paperswithcode.com/thumbnails/task/task-0000000901-8d3933f5.jpg\"\n", - ")\n", - "\n", - "response = requests.get(image_url)\n", - "image = BytesIO(response.content)\n", - "image_array = np.array(Image.open(image))\n", - "image.seek(0)" - ] - }, - { - "cell_type": "code", - "execution_count": 6, - "metadata": {}, - "outputs": [], - "source": [ - "url = \"http://127.0.0.1:5500/features\"\n", - "files = {\"input_file\": image}\n", - "response = requests.post(url, files=files)\n", - "data = response.json()" - ] - }, - { - "cell_type": "code", - "execution_count": 13, - "metadata": {}, - "outputs": [ - { - "data": { - "text/plain": [ - "dict_keys(['bbox_features', 'bbox_coords', 'bbox_probas', 'cnn_features', 'class_labels'])" - ] - }, - "execution_count": 13, - "metadata": {}, - "output_type": "execute_result" - } - ], - "source": [ - "data.keys()" - ] - }, - { - "cell_type": "code", - "execution_count": 15, - "metadata": {}, - "outputs": [], - "source": [ - "from IPython.display import clear_output, display\n", - "from IPython.display import Image as DisplayImage\n", - "\n", - "# for visualizing output\n", - "def showarray(a, fmt=\"jpeg\"):\n", - " a = np.uint8(np.clip(a, 0, 255))\n", - " f = BytesIO()\n", - " Image.fromarray(a).save(f, fmt)\n", - " display(DisplayImage(data=f.getvalue()))" - ] - }, - { - "cell_type": "code", - "execution_count": 16, - "metadata": {}, - "outputs": [], - "source": [ - "image_visualizer = SingleImageViz(image_array, id2obj=id2obj)\n", - "boxes = np.array(data[\"bbox_coords\"])\n", - "obj_scores = np.array(data[\"bbox_probas\"])\n", - "obj_ids = np.argmax(obj_scores, -1)\n", - "image_visualizer.draw_boxes(boxes, obj_ids, obj_scores)" - ] - }, - { - "cell_type": "code", - "execution_count": 17, - "metadata": {}, - "outputs": [ - { - "data": { - "image/jpeg": "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", - "text/plain": [ - "" - ] - }, - "metadata": {}, - "output_type": "display_data" - } - ], - "source": [ - "showarray(image_visualizer._get_buffer())" - ] - }, - { - "cell_type": "code", - "execution_count": null, - "metadata": {}, - "outputs": [], - "source": [] - } - ], - "metadata": { - "interpreter": { - "hash": "5a6ef758c6e273a8c7fd886459e8f4b63e4ba873597a8df2912e4a5df84a41e0" - }, - "kernelspec": { - "display_name": "Python (devel)", - "language": "python", - "name": "devel" - }, - "language_info": { - "codemirror_mode": { - "name": "ipython", - "version": 3 - }, - "file_extension": ".py", - "mimetype": "text/x-python", - "name": "python", - "nbconvert_exporter": "python", - "pygments_lexer": "ipython3", - "version": "3.9.12" - }, - "orig_nbformat": 4 - }, - "nbformat": 4, - "nbformat_minor": 2 -} diff --git a/src/emma_perception/api/datamodels.py b/src/emma_perception/api/datamodels.py index 1656488..3427d7c 100644 --- a/src/emma_perception/api/datamodels.py +++ b/src/emma_perception/api/datamodels.py @@ -1,10 +1,17 @@ import argparse +import json from dataclasses import dataclass -from typing import Literal, Optional +from typing import Literal, Optional, TypedDict import torch from pydantic import BaseSettings +from emma_perception.constants import ( + VINVL_ALFRED_CLASS_MAP_PATH, + VINVL_CLASS_MAP_PATH, + VINVL_SIMBOT_CLASS_MAP_PATH, + VINVL_SIMBOT_CONFIG_PATH, +) from emma_perception.models.simbot_entity_classifier import SimBotMLPEntityClassifier from emma_perception.models.vinvl_extractor import VinVLExtractor, VinVLTransform @@ -12,6 +19,13 @@ ClassmapType = Literal["alfred", "original", "simbot"] +class AlfredClassMap(TypedDict): + """Classmap for class to idx.""" + + label_to_idx: dict[str, int] + idx_to_label: dict[str, str] + + class ApiSettings(BaseSettings): """Common settings, which can also be got from the environment vars.""" @@ -26,6 +40,20 @@ class ApiSettings(BaseSettings): # batch size used to extract visual features batch_size: int = 2 + def object_classmap(self) -> AlfredClassMap: + """Get the mapping of objects to class indices.""" + if self.classmap_type == "alfred": + classmap_file = VINVL_ALFRED_CLASS_MAP_PATH + elif self.classmap_type == "original": + classmap_file = VINVL_CLASS_MAP_PATH + elif self.classmap_type == "simbot": + classmap_file = VINVL_SIMBOT_CLASS_MAP_PATH + else: + raise ValueError(f"Invalid classmap type: {self.classmap_type}") + + with open(classmap_file) as in_file: + return json.load(in_file) + @dataclass(init=False) class ApiStore: @@ -41,7 +69,10 @@ def parse_api_args() -> argparse.Namespace: """Defines arguments.""" parser = argparse.ArgumentParser() parser.add_argument( - "--config_file", required=True, metavar="FILE", help="path to VinVL config file" + "--config_file", + metavar="FILE", + help="path to VinVL config file", + default=VINVL_SIMBOT_CONFIG_PATH.as_posix(), ) parser.add_argument( "opts", diff --git a/src/emma_perception/api/extract_features.py b/src/emma_perception/api/extract_features.py index 4c49744..8f9d44e 100644 --- a/src/emma_perception/api/extract_features.py +++ b/src/emma_perception/api/extract_features.py @@ -7,12 +7,15 @@ from torch.utils.data import DataLoader from emma_perception.api.api_dataset import ApiDataset -from emma_perception.api.datamodels import ApiStore -from emma_perception.constants import OBJECT_CLASSMAP +from emma_perception.api.datamodels import ApiSettings, ApiStore from emma_perception.models.simbot_entity_classifier import SimBotMLPEntityClassifier from emma_perception.models.vinvl_extractor import VinVLExtractor +settings = ApiSettings() +object_classmap = settings.object_classmap() + + @torch.inference_mode() def get_batch_features( extractor: VinVLExtractor, @@ -40,7 +43,7 @@ def get_batch_features( bbox_probas = predictions.get_field("scores_all") idx_labels = bbox_probas.argmax(dim=1) - class_labels = [OBJECT_CLASSMAP["idx_to_label"][str(idx.item())] for idx in idx_labels] + class_labels = [object_classmap["idx_to_label"][str(idx.item())] for idx in idx_labels] entity_labels = None bbox_features = predictions.get_field("box_features") diff --git a/src/emma_perception/commands/download_checkpoints.py b/src/emma_perception/commands/download_checkpoints.py index 294510f..54d885b 100644 --- a/src/emma_perception/commands/download_checkpoints.py +++ b/src/emma_perception/commands/download_checkpoints.py @@ -12,6 +12,6 @@ def download_vinvl_checkpoint( *, hf_repo_id: str = HF_REPO_ID, file_name: str = CHECKPOINT_NAME ) -> Path: """Download the checkpoint from VinVL and put it where we expect it.""" - file_path = download_file(hf_repo_id=hf_repo_id, file_name=file_name) + file_path = download_file(repo_id=hf_repo_id, repo_type="model", filename=file_name) logger.info(f"Downloaded {file_name}") return file_path diff --git a/src/emma_perception/constants/__init__.py b/src/emma_perception/constants/__init__.py index 0ea3bb1..05e8ef4 100644 --- a/src/emma_perception/constants/__init__.py +++ b/src/emma_perception/constants/__init__.py @@ -1,8 +1,4 @@ -import json from pathlib import Path -from typing import TypedDict - -from emma_perception.api.datamodels import ApiSettings, ClassmapType CONSTANTS_DIR_PATH = Path(__file__).parent.resolve() @@ -10,11 +6,7 @@ VINVL_CONFIG_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4.yaml") VINVL_ALFRED_CONFIG_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_alfred.yaml") - - -class AlfredClassMap(TypedDict): - label_to_idx: dict[str, int] - idx_to_label: dict[str, str] +VINVL_SIMBOT_CONFIG_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_simbot_customised.yaml") VINVL_ALFRED_CLASS_MAP_PATH = CONSTANTS_DIR_PATH.joinpath("vinvl_x152c4_alfred_classmap.json") @@ -29,23 +21,3 @@ class AlfredClassMap(TypedDict): SIMBOT_ENTITY_MLPCLASSIFIER_CLASSMAP_PATH = CONSTANTS_DIR_PATH.joinpath( "entity_classlabel_map.json" ) - - -def _classmap(classmap_type: ClassmapType) -> AlfredClassMap: - # Returns the map that will be used by the object detector to determine the object class. - if classmap_type == "alfred": - classmap_file = VINVL_ALFRED_CLASS_MAP_PATH - elif classmap_type == "original": - classmap_file = VINVL_CLASS_MAP_PATH - elif classmap_type == "simbot": - classmap_file = VINVL_SIMBOT_CLASS_MAP_PATH - else: - raise ValueError(f"Invalid classmap type: {classmap_type}") - - with open(classmap_file) as in_file: - return json.load(in_file) - - -settings = ApiSettings() - -OBJECT_CLASSMAP = _classmap(settings.classmap_type)