PointcloudEpisodeAnnotation

class PointcloudEpisodeAnnotation[source]

Bases: object

PointcloudEpisodeAnnotation for point cloud episodes. PointcloudEpisodeAnnotation object is immutable.

Parameters
frames_count : int, optional

Number of PointcloudEpisodeFrame objects.

objects : PointcloudEpisodeObjectCollection, optional

PointcloudEpisodeObjectCollection object

frames : PointcloudEpisodeFrameCollection, optional

PointcloudEpisodeFrameCollection object

tags : PointcloudEpisodeTagCollection, optional

PointcloudEpisodeTagCollection object

description : str, optional

Description text

key : uuid.UUID, optional

uuid class object

Usage example
import supervisely as sly

from supervisely.video_annotation.key_id_map import KeyIdMap

# PointcloudEpisodeAnnotation example 1
pointcloud_episodes_ann = sly.PointcloudEpisodeAnnotation()
print(pointcloud_episodes_ann.to_json())
# Output: {
#     "description": "",
#     "frames": [],
#     "framesCount": None,
#     "key": "494f67984d714c1eaf7a65e5df289ac6",
#     "objects": [],
#     "tags": []
# }


# PointcloudEpisodeAnnotation example 2
pointcloud_id = 19481098
key_id_map = KeyIdMap()
pcd_info = api.pointcloud_episode.get_info_by_id(pointcloud_id)
project_meta_json = api.project.get_meta(pcd_info.project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)
ann_json = api.pointcloud_episode.annotation.download(pcd_info.dataset_id)
ann = sly.PointcloudEpisodeAnnotation.from_json(
    data=ann_json, project_meta=project_meta, key_id_map=key_id_map
)

Methods

clone

Makes a copy of PointcloudEpisodeAnnotation with new fields, if fields are given, otherwise it will use fields of the original PointcloudEpisodeAnnotation.

from_json

Create a PointcloudEpisodeAnnotation object from a JSON representation.

get_figures_on_frame

Retrieve figures associated with a specific frame in a PointcloudEpisodeAnnotation.

get_objects_on_frame

Retrieve objects associated with a specific frame in a PointcloudEpisodeAnnotation.

get_tags_on_frame

Retrieve tags associated with a specific frame in a PointcloudEpisodeAnnotation.

is_empty

Check whether point cloud episodes annotation contains objects or tags, or not.

key

PointcloudEpisodeAnnotation key value.

load_json_file

Loads json file and converts it to PointcloudEpisodeAnnotation.

to_json

Convert PointcloudEpisodeAnnotation to JSON format.

Attributes

description

Description text for PointcloudEpisodeAnnotation object.

figures

PointcloudFigure objects.

frames

PointcloudEpisodeFrameCollection collection.

frames_count

Number of frames.

objects

PointcloudEpisodeObject objects collection.

tags

PointcloudEpisodeTag objects collection.

clone(frames_count=None, objects=None, frames=None, tags=None, description='')[source]

Makes a copy of PointcloudEpisodeAnnotation with new fields, if fields are given, otherwise it will use fields of the original PointcloudEpisodeAnnotation.

Parameters
frames_count : int, optional

Number of PointcloudEpisodeFrame objects

objects : PointcloudEpisodeObjectCollection, optional

PointcloudEpisodeObjectCollection object

frames : PointcloudEpisodeFrameCollection, optional

PointcloudEpisodeFrameCollection object

tags : PointcloudEpisodeTagCollection, optional

PointcloudEpisodeTagCollection object

description : str, optional

Description text

Return type

PointcloudEpisodeAnnotation

Returns

PointcloudAnnotation class object

Usage example
import supervisely as sly
from supervisely.video_annotation.key_id_map import KeyIdMap

address = 'https://app.supervise.ly/'
token = 'Your Supervisely API Token'
api = sly.Api(address, token)

key_id_map = KeyIdMap()
pointcloud_id = 19481098
pcd_info = api.pointcloud_episode.get_info_by_id(pointcloud_id)
project_meta_json = api.project.get_meta(pcd_info.project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)
ann_json = api.pointcloud_episode.annotation.download(pcd_info.dataset_id)
ann = sly.PointcloudAnnotation.from_json(
    data=ann_json, project_meta=project_meta, key_id_map=key_id_map
)

obj_class_car = sly.ObjClass('car', sly.Cuboid)
pointcloud_obj_car = sly.PointcloudEpisodeObject(obj_class_car)
new_objects = ann.objects.add(pointcloud_obj_car)

new_ann = ann.clone(objects=new_objects)

print(new_ann.to_json())
# Output:
# {
#     'datasetId': 60988,
#     'description': '',
#     'frames': [{'figures': [{'classId': None,
#                             'createdAt': '2023-03-16T06:38:45.004Z',
#                             'description': '',
#                             'geometry': {'dimensions': {'x': 2.3652234,
#                                                         'y': 23.291742,
#                                                         'z': 3.326648},
#                                         'position': {'x': 86.29707472161449,
#                                                         'y': -14.472597682830635,
#                                                         'z': 0.8842007608554671},
#                                         'rotation': {'x': 0,
#                                                         'y': 0,
#                                                         'z': -1.6962800995995606}},
#                             'geometryType': 'cuboid_3d',
#                             'id': 87536496,
#                             'labelerLogin': 'almaz',
#                             'objectId': 5531328,
#                             'updatedAt': '2023-03-16T06:38:45.004Z'}],
#                 'index': 0,
#                 'pointCloudId': 19481098}],
#                 'index': 1,
#                 'pointCloudId': 19481100},
#                 ...],
#     'framesCount': 54,
#     'objects': [{
#                     'classId': 666944,
#                     'classTitle': 'Car',
#                     'createdAt': '2023-03-16T06:38:44.934Z',
#                     'datasetId': 60988,
#                     'entityId': None,
#                     'id': 5531324,
#                     'labelerLogin': 'almaz',
#                     'tags': [],
#                     'updatedAt': '2023-03-16T06:38:44.934Z'}
#                 {
#                     'classTitle': 'Car',
#                     'createdAt': '2023-03-16T06:38:44.934Z',
#                     'key': 'fc149a8f3e3a413c807a6b4ba474645c',
#                     'labelerLogin': 'almaz',
#                     'tags': [],
#                     'updatedAt': '2023-03-16T06:38:44.934Z
#                 }],
#     'tags': []
# }
# Output: {
#     "description": "",
#     "figures": [],
#     "key": "2cc443272aca4cfa9c4f404614938aa7",
#     "objects": [
#         {
#         "classTitle": "Pole",
#         "createdAt": "2023-03-16T06:38:44.934Z",
#         "key": "eff2ec5e3cda47968f45bc51b36a0dc1",
#         "labelerLogin": "almaz",
#         "tags": [],
#         "updatedAt": "2023-03-16T06:38:44.934Z"
#         },
#         {
#         "classTitle": "Tram",
#         "createdAt": "2023-03-16T06:38:44.934Z",
#         "key": "6baa92e09ceb413ba8fbfcfae74be1c7",
#         "labelerLogin": "almaz",
#         "tags": [],
#         "updatedAt": "2023-03-16T06:38:44.934Z"
#         },
#         {
#         "classTitle": "car",
#         "key": "6b1bced23061437b8ddbcdd267548c96",
#         "tags": []
#         }
#     ],
#     "tags": []
# }
classmethod from_json(data, project_meta, key_id_map=None)[source]

Create a PointcloudEpisodeAnnotation object from a JSON representation.

Parameters
data : Dict

JSON data representing the PointcloudEpisodeAnnotation.

project_meta : ProjectMeta

Project metadata.

Returns

PointcloudEpisodeAnnotation object

Return type

PointcloudEpisodeAnnotation

Usage example
import supervisely as sly
from supervisely.video_annotation.key_id_map import KeyIdMap

key_id_map = KeyIdMap()
pointcloud_id = 19481098
pcd_info = api.pointcloud_episode.get_info_by_id(pointcloud_id)
project_meta_json = api.project.get_meta(pcd_info.project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)
ann_json = api.pointcloud_episode.annotation.download(pcd_info.dataset_id)

ann = sly.PointcloudEpisodeAnnotation.from_json(
    data=ann_json, project_meta=project_meta, key_id_map=key_id_map
)
get_figures_on_frame(frame_index)[source]

Retrieve figures associated with a specific frame in a PointcloudEpisodeAnnotation.

Parameters
frame_index : int

The index of the frame for which figures need to be retrieved.

Returns

List of PointcloudFigure objects containing the retrieved figures associated with the specified frame.

Return type

List[PointcloudFigure]

Usage example
import supervisely as sly
from supervisely.video_annotation.key_id_map import KeyIdMap

key_id_map = KeyIdMap()
pointcloud_id = 19481098
pcd_info = api.pointcloud_episode.get_info_by_id(pointcloud_id)
project_meta_json = api.project.get_meta(pcd_info.project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)
ann_json = api.pointcloud_episode.annotation.download(pcd_info.dataset_id)
ann = sly.PointcloudEpisodeAnnotation.from_json(
    data=ann_json, project_meta=project_meta, key_id_map=key_id_map
)
frame_index = 0
figures_on_frame = ann.get_figures_on_frame(frame_index)

print(figures_on_frame)
# Output:
# [<supervisely.pointcloud_annotation.pointcloud_figure.PointcloudFigure object at 0x7fc83895a4d0>,
# <supervisely.pointcloud_annotation.pointcloud_figure.PointcloudFigure object at 0x7fc83895a810>,
# <supervisely.pointcloud_annotation.pointcloud_figure.PointcloudFigure object at 0x7fc8389410d0>]
get_objects_on_frame(frame_index)[source]

Retrieve objects associated with a specific frame in a PointcloudEpisodeAnnotation.

Parameters
frame_index : int

The index of the frame for which objects need to be retrieved.

Returns

PointcloudEpisodeObjectCollection containing the retrieved objects associated with the specified frame.

Return type

Raises

ValueError – If no frame with the given frame_index exists in the annotation.

Usage example
import supervisely as sly
from supervisely.video_annotation.key_id_map import KeyIdMap

key_id_map = KeyIdMap()
pointcloud_id = 19481098
pcd_info = api.pointcloud_episode.get_info_by_id(pointcloud_id)
project_meta_json = api.project.get_meta(pcd_info.project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)
ann_json = api.pointcloud_episode.annotation.download(pcd_info.dataset_id)
ann = sly.PointcloudEpisodeAnnotation.from_json(
    data=ann_json, project_meta=project_meta, key_id_map=key_id_map
)
frame_index = 0
objects_on_frame = ann.get_objects_on_frame(frame_index)

print(objects_on_frame.to_json())
# Output:
# [
#     {
#         "key": "687784c3d4d64ec4811948fec245514a",
#         "classTitle": "Tram",
#         "tags": [],
#         "labelerLogin": "almaz",
#         "updatedAt": "2023-03-16T06:38:44.934Z",
#         "createdAt": "2023-03-16T06:38:44.934Z"
#     },
#     {
#         "key": "b8b23b6712444f0fbfb320b0b4acd09a",
#         "classTitle": "Car",
#         "tags": [],
#         "labelerLogin": "almaz",
#         "updatedAt": "2023-03-16T06:38:44.934Z",
#         "createdAt": "2023-03-16T06:38:44.934Z"
#     }
# ]
get_tags_on_frame(frame_index)[source]

Retrieve tags associated with a specific frame in a PointcloudEpisodeAnnotation.

Parameters
frame_index : int

The index of the frame for which tags need to be retrieved.

Returns

PointcloudEpisodeTagCollection containing the retrieved tags associated with the specified frame.

Return type

PointcloudEpisodeTagCollection

Raises

ValueError – If no frame with the given frame_index exists in the annotation.

Usage example
import supervisely as sly
from supervisely.video_annotation.key_id_map import KeyIdMap

key_id_map = KeyIdMap()
pointcloud_id = 19481098
pcd_info = api.pointcloud_episode.get_info_by_id(pointcloud_id)
project_meta_json = api.project.get_meta(pcd_info.project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)
ann_json = api.pointcloud_episode.annotation.download(pcd_info.dataset_id)
ann = sly.PointcloudEpisodeAnnotation.from_json(
    data=ann_json, project_meta=project_meta, key_id_map=key_id_map
)
frame_index = 0
tags_on_frame = ann.get_tags_on_frame(frame_index)

print(tags_on_frame)
# Output:
Tags:
+-------+------------+-------+-------------+
|  Name | Value type | Value | Frame range |
+-------+------------+-------+-------------+
| color | any_string |  red  |   [0, 0]   |
+-------+------------+-------+-------------+
is_empty()[source]

Check whether point cloud episodes annotation contains objects or tags, or not.

Returns

True if point cloud episodes annotation is empty, False otherwise.

Return type

bool

Usage example
import supervisely as sly
from supervisely.video_annotation.key_id_map import KeyIdMap

address = 'https://app.supervise.ly/'
token = 'Your Supervisely API Token'
api = sly.Api(address, token)

project_id = 18428
dataset_id = 60988
key_id_map = KeyIdMap()
meta_json = api.project.get_meta(project_id)
meta = sly.ProjectMeta.from_json(meta_json)

ann_json = api.pointcloud_episode.annotation.download(dataset_id)
ann = sly.PointcloudEpisodeAnnotation.from_json(ann_json, meta, key_id_map)

print(ann.is_empty()) # False
key()[source]

PointcloudEpisodeAnnotation key value.

Returns

Key value of point cloud episodes annotation object.

Return type

str

Usage example

import supervisely as sly

ann = sly.PointcloudEpisodeAnnotation()

print(ann.key())
# Output: 93ab6292-c661-4a53-b407-85ed34f5b68a'
classmethod load_json_file(path, project_meta, key_id_map=None)[source]

Loads json file and converts it to PointcloudEpisodeAnnotation.

Parameters
path : str

Path to the json file.

project_meta : ProjectMeta

Input ProjectMeta.

key_id_map : KeyIdMap, optional

KeyIdMap object.

Returns

PointcloudEpisodeAnnotation object

Return type

PointcloudEpisodeAnnotation

Usage example
import supervisely as sly

address = 'https://app.supervise.ly/'
token = 'Your Supervisely API Token'
api = sly.Api(address, token)

team_name = 'Vehicle Detection'
workspace_name = 'Cities'
project_name =  'London'

project_id = 19441
project_meta_json = api.project.get_meta(project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)

# Load json file
path = "/home/admin/work/docs/my_dataset/ann/annotation.json"
ann = sly.PointcloudEpisodeAnnotation.load_json_file(path, project_meta)
to_json(key_id_map=None)[source]

Convert PointcloudEpisodeAnnotation to JSON format.

Parameters
key_id_map : KeyIdMap, optional

KeyIdMap object.

Returns

PointcloudEpisodeAnnotation in JSON format.

Return type

Dict

Usage example
import supervisely as sly
pointcloud_id = 19481098
pcd_info = api.pointcloud_episode.get_info_by_id(pointcloud_id)
project_path = "Downloads/pointcloud_api/project"
sly.PointcloudEpisodeProject.download(
    api=api,
    project_id=pcd_info.project_id,
    dest_dir=project_path,
    dataset_ids=[pcd_info.dataset_id],
    download_pointclouds=True,
)
project_fs = sly.PointcloudEpisodeProject(project_path, sly.OpenMode.READ)
project_meta_json = api.project.get_meta(pcd_info.project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)
ds = project_fs.datasets.items()[0]:
ann = ds.get_ann(project_meta)

print(ann.to_json())
# Output:
# {
#     'datasetId': 60988,
#     'description': '',
#     'frames': [{'figures': [{'classId': None,
#                             'createdAt': '2023-03-16T06:38:45.004Z',
#                             'description': '',
#                             'geometry': {'dimensions': {'x': 2.3652234,
#                                                         'y': 23.291742,
#                                                         'z': 3.326648},
#                                         'position': {'x': 86.29707472161449,
#                                                         'y': -14.472597682830635,
#                                                         'z': 0.8842007608554671},
#                                         'rotation': {'x': 0,
#                                                         'y': 0,
#                                                         'z': -1.6962800995995606}},
#                             'geometryType': 'cuboid_3d',
#                             'id': 87536496,
#                             'labelerLogin': 'almaz',
#                             'objectId': 5531328,
#                             'updatedAt': '2023-03-16T06:38:45.004Z'}],
#                 'index': 0,
#                 'pointCloudId': 19481098}],
#                 'index': 1,
#                 'pointCloudId': 19481100},
#                 ...],
#     'framesCount': 54,
#     'objects': [{'classId': 666944,
#                 'classTitle': 'Car',
#                 'createdAt': '2023-03-16T06:38:44.934Z',
#                 'datasetId': 60988,
#                 'entityId': None,
#                 'id': 5531324,
#                 'labelerLogin': 'almaz',
#                 'tags': [],
#                 'updatedAt': '2023-03-16T06:38:44.934Z'}],
#     'tags': []
# }
property description

Description text for PointcloudEpisodeAnnotation object.

Returns

PointcloudEpisodeAnnotation description

Return type

str

Usage example
import supervisely as sly

descr = 'example'
ann = sly.PointcloudEpisodeAnnotation(description=descr)
print(ann.description) # example
property figures

PointcloudFigure objects.

Returns

List of PointcloudFigure objects from PointcloudEpisodeAnnotation object.

Return type

list

Usage example

import supervisely as sly

address = 'https://app.supervise.ly/'
token = 'Your Supervisely API Token'
api = sly.Api(address, token)

project_id = 19441
project_meta_json = api.project.get_meta(project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)

# Load json file
path = "/home/admin/work/docs/my_dataset/ann/annotation.json"
ann = sly.PointcloudEpisodeAnnotation.load_json_file(path, project_meta)

for figure in ann.figures:
    print(figure.to_json())

# Output:
# {
#     "geometry": {
#         "dimensions": { "x": 1.8, "y": 3.9, "z": 1.6 },
#         "position": { "x": -3.4, "y": 28.9, "z": -0.7 },
#         "rotation": { "x": 0.0, "y": 0, "z": -0.03 }
#     },
#     "geometryType": "cuboid_3d",
#     "key": "01836c294c514250a11889f56cf210e9",
#     "objectKey": "737c4df19c0c4cccbc48cf69b72abe36"
# }
property frames

PointcloudEpisodeFrameCollection collection.

Returns

PointcloudEpisodeFrameCollection object

Return type

PointcloudEpisodeFrameCollection

Usage example
import supervisely as sly
from supervisely.geometry.cuboid_3d import Cuboid3d, Vector3d
from supervisely.pointcloud_annotation.pointcloud_episode_object_collection import PointcloudEpisodeObjectCollection

obj_class_car = sly.ObjClass('car', Cuboid3d)
pointcloud_obj_car = sly.PointcloudEpisodeObject(obj_class_car)
objects = sly.PointcloudEpisodeObjectCollection([pointcloud_obj_car])

position, rotation, dimension = Vector3d(-3.4, 28.9, -0.7), Vector3d(0., 0, -0.03), Vector3d(1.8, 3.9, 1.6)
cuboid = Cuboid3d(position, rotation, dimension)
frame_index = 10
figure = sly.PointcloudFigure(pointcloud_obj_car, cuboid, frame_index=frame_index)
frame = sly.PointcloudEpisodeFrame(frame_index, figures=[figure])
frames = sly.PointcloudEpisodeFrameCollection([frame])

pointcloud_episodes_ann = sly.PointcloudEpisodeAnnotation(frames_count, objects, frames)
print(pointcloud_episodes_ann.frames.to_json())
# Output:
# [
#     {
#         "figures": [
#         {
#             "geometry": {
#             "dimensions": { "x": 1.8, "y": 3.9, "z": 1.6 },
#             "position": { "x": -3.4, "y": 28.9, "z": -0.7 },
#             "rotation": { "x": 0.0, "y": 0, "z": -0.03 }
#             },
#             "geometryType": "cuboid_3d",
#             "key": "030b9aafa97642e887e2be544ef7a7ee",
#             "objectKey": "95c473a6cff44afda127ffb40d2bac5b"
#         }
#         ],
#         "index": 0
#     }
# ]
property frames_count

Number of frames.

Returns

Frames count

Return type

int

Usage example
import supervisely as sly

frames_count = 15
video_ann = sly.PointcloudEpisodeAnnotation(frames_count=frames_count)
print(video_ann.frames_count)
# Output: 15
property objects

PointcloudEpisodeObject objects collection.

Returns

PointcloudEpisodeObjectCollection object.

Return type

PointcloudEpisodeObjectCollection

Usage example

import supervisely as sly

address = 'https://app.supervise.ly/'
token = 'Your Supervisely API Token'
api = sly.Api(address, token)

project_id = 19441
project_meta_json = api.project.get_meta(project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)

# Load json file
path = "/home/admin/work/docs/my_dataset/ann/annotation.json"
ann = sly.PointcloudEpisodeAnnotation.load_json_file(path, project_meta)

objects = ann.objects
property tags

PointcloudEpisodeTag objects collection.

Returns

PointcloudEpisodeTagCollection object.

Return type

PointcloudEpisodeTagCollection

Usage example

import supervisely as sly

address = 'https://app.supervise.ly/'
token = 'Your Supervisely API Token'
api = sly.Api(address, token)

project_id = 19441
project_meta_json = api.project.get_meta(project_id)
project_meta = sly.ProjectMeta.from_json(project_meta_json)

# Load json file
path = "/home/admin/work/docs/my_dataset/ann/annotation.json"
ann = sly.PointcloudEpisodeAnnotation.load_json_file(path, project_meta)

tags = ann.tags