Source code for supervisely.api.object_class_api

# coding: utf-8
"""get list of :class:`objects<supervisely.annotation.obj_class.ObjClass>` from supervisely project"""

from __future__ import annotations
from typing import NamedTuple, List, Dict, Optional

from supervisely.api.module_api import ModuleApi
from supervisely.api.module_api import ApiField
from supervisely.video_annotation.key_id_map import KeyIdMap


[docs]class ObjectClassApi(ModuleApi): """ API for working with :class:`ObjClass<supervisely.annotation.obj_class.ObjClass>`. :class:`ObjectClassApi<ObjectClassApi>` object is immutable. :param api: API connection to the server. :type api: Api :Usage example: .. code-block:: python import os from dotenv import load_dotenv import supervisely as sly # Load secrets and create API object from .env file (recommended) # Learn more here: https://developer.supervisely.com/getting-started/basics-of-authentication if sly.is_development(): load_dotenv(os.path.expanduser("~/supervisely.env")) api = sly.Api.from_env() # Pass values into the API constructor (optional, not recommended) # api = sly.Api(server_address="https://app.supervise.ly", token="4r47N...xaTatb") project_id = 1951 obj_class_infos = api.object_class.get_list(project_id) """
[docs] @staticmethod def info_sequence(): """ NamedTuple ObjectClassInfo information about ObjectClass. :Example: .. code-block:: python ObjectClassInfo(id=22309, name='lemon', description='', shape='bitmap', color='#51C6AA', settings={}, created_at='2021-03-02T10:04:33.973Z', updated_at='2021-03-11T09:37:07.111Z') """ return [ ApiField.ID, ApiField.NAME, ApiField.DESCRIPTION, ApiField.SHAPE, ApiField.COLOR, ApiField.SETTINGS, ApiField.CREATED_AT, ApiField.UPDATED_AT, ]
[docs] @staticmethod def info_tuple_name(): """ NamedTuple name - **ObjectClassInfo**. """ return "ObjectClassInfo"
[docs] def get_list( self, project_id: int, filters: Optional[List[Dict[str, str]]] = None ) -> List[NamedTuple]: """ List of ObjClasses in the given Project. :param project_id: Project ID in which the ObjClasses are located. :type project_id: int :param filters: List of params to sort output ObjClasses. :type filters: List[dict], optional :return: List of ObjClasses with information from the given Project. See :class:`info_sequence<info_sequence>` :rtype: :class:`List[NamedTuple]` :Usage example: .. code-block:: python import supervisely as sly os.environ['SERVER_ADDRESS'] = 'https://app.supervise.ly' os.environ['API_TOKEN'] = 'Your Supervisely API Token' api = sly.Api.from_env() project_id = 1951 obj_class_infos = api.object_class.get_list(project_id) print(obj_class_infos) # Output: [ObjectClassInfo(id=22309, # name='lemon', # description='', # shape='bitmap', # color='#51C6AA', # settings={}, # created_at='2021-03-02T10:04:33.973Z', # updated_at='2021-03-11T09:37:07.111Z'), # ObjectClassInfo(id=22310, # name='kiwi', # description='', # shape='bitmap', # color='#FF0000', # settings={}, # created_at='2021-03-02T10:04:33.973Z', # updated_at='2021-03-11T09:37:07.111Z') # ] obj_class_list = api.object_class.get_list(1951, filters=[{'field': 'name', 'operator': '=', 'value': 'lemon' }]) print(obj_class_list) # Output: [ # [ # 22309, # "lemon", # "", # "bitmap", # "#51C6AA", # {}, # "2021-03-02T10:04:33.973Z", # "2021-03-11T09:37:07.111Z" # ] # ] """ return self.get_list_all_pages( "advanced.object_classes.list", {ApiField.PROJECT_ID: project_id, "filter": filters or []}, )
[docs] def get_name_to_id_map(self, project_id: int) -> Dict[str, int]: """ :param project_id: Project ID in which the ObjClasses are located. :type project_id: int :return: Dictionary Key ID Map {'key': id} :rtype: :class:`KeyIdMap<supervisely.video_annotation.key_id_map.KeyIdMap>` :Usage example: .. code-block:: python import supervisely as sly os.environ['SERVER_ADDRESS'] = 'https://app.supervise.ly' os.environ['API_TOKEN'] = 'Your Supervisely API Token' api = sly.Api.from_env() obj_class_map = api.object_class.get_name_to_id_map(1951) print(obj_class_map) # Output: {'lemon': 22309, 'kiwi': 22310, 'cucumber': 22379} """ objects_infos = self.get_list(project_id) return {object_info.name: object_info.id for object_info in objects_infos}
def _get_info_by_id(self, id, method, fields=None): response = self._get_response_by_id(id, method, id_field=ApiField.ID, fields=fields) return ( self._convert_json_info(response.json(), skip_missing=True) if (response is not None) else None ) def get_info_by_id(self, id): return self._get_info_by_id( id, "advanced.object_classes.info", )
# def _object_classes_to_json(self, object_classes: KeyIndexedCollection, objclasses_name_id_map=None, project_id=None): # pass #@TODO: implement # # if objclasses_name_id_map is None and project_id is None: # # raise RuntimeError("Impossible to get ids for projectTags") # # if objclasses_name_id_map is None: # # objclasses_name_id_map = self.get_name_to_id_map(project_id) # # tags_json = [] # # for tag in tags: # # tag_json = tag.to_json() # # tag_json[ApiField.TAG_ID] = tag_name_id_map[tag.name] # # tags_json.append(tag_json) # # return tags_json # # def append_to_video(self, video_id, tags: KeyIndexedCollection, key_id_map: KeyIdMap = None): # if len(tags) == 0: # return [] # video_info = self._api.video.get_info_by_id(video_id) # tags_json = self._tags_to_json(tags, project_id=video_info.project_id) # ids = self.append_to_video_json(video_id, tags_json) # KeyIdMap.add_tags_to(key_id_map, [tag.key() for tag in tags], ids) # return ids # # def append_to_video_json(self, video_id, tags_json): # if len(tags_json) == 0: # return # response = self._api.post('videos.tags.bulk.add', {ApiField.VIDEO_ID: video_id, ApiField.TAGS: tags_json}) # ids = [obj[ApiField.ID] for obj in response.json()] # return ids