Skip to content

Commit 347ba2a

Browse files
authored
feat: load 3D box visibility from dataset (#152)
* feat: add attribute for 3D box visibility Signed-off-by: ktro2828 <kotaro.uetake@tier4.jp> * feat: update to load num_points and visibility in get_box3d Signed-off-by: ktro2828 <kotaro.uetake@tier4.jp> * feat: set default value of visibility to VisibilityLevel.UNAVAILABLE Signed-off-by: ktro2828 <kotaro.uetake@tier4.jp> --------- Signed-off-by: ktro2828 <kotaro.uetake@tier4.jp>
1 parent 79e88fe commit 347ba2a

3 files changed

Lines changed: 25 additions & 10 deletions

File tree

t4_devkit/dataclass/box.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,13 +3,13 @@
33
from typing import TYPE_CHECKING, TypeVar
44

55
import numpy as np
6-
from attrs import define, field, validators
7-
from attrs.converters import optional
6+
from attrs import converters, define, field, validators
87
from shapely.geometry import Polygon
98
from typing_extensions import Self
109

1110
from t4_devkit.common.converter import to_quaternion
1211
from t4_devkit.common.validator import is_vector3
12+
from t4_devkit.schema import VisibilityLevel
1313

1414
from .label import SemanticLabel
1515
from .roi import Roi
@@ -89,6 +89,7 @@ class Box3D(BaseBox):
8989
shape (Shape): `Shape` object.
9090
velocity (Vector3Like | None, optional): Box velocity (vx, vy, vz).
9191
num_points (int | None, optional): The number of points inside the box.
92+
visibility (VisibilityLevel, optional): Box visibility.
9293
future (Future | None, optional): Box trajectory in the future of each mode.
9394
9495
Examples:
@@ -116,13 +117,18 @@ class Box3D(BaseBox):
116117
shape: Shape = field(validator=validators.instance_of(Shape))
117118
velocity: Vector3Like | None = field(
118119
default=None,
119-
converter=optional(np.array),
120+
converter=converters.optional(np.array),
120121
validator=validators.optional(is_vector3),
121122
)
122123
num_points: int | None = field(
123124
default=None,
124125
validator=validators.optional((validators.instance_of(int), validators.ge(0))),
125126
)
127+
visibility: VisibilityLevel = field(
128+
default=VisibilityLevel.UNAVAILABLE,
129+
converter=converters.optional(VisibilityLevel),
130+
validator=validators.optional(validators.instance_of(VisibilityLevel)),
131+
)
126132

127133
# additional attributes: set by `with_**`
128134
future: Future | None = field(

t4_devkit/tier4.py

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,7 @@
99
from pyquaternion import Quaternion
1010

1111
from t4_devkit.common.geometry import is_box_in_image
12-
from t4_devkit.dataclass import (
13-
Box2D,
14-
Box3D,
15-
SemanticLabel,
16-
Shape,
17-
ShapeType,
18-
)
12+
from t4_devkit.dataclass import Box2D, Box3D, SemanticLabel, Shape, ShapeType
1913
from t4_devkit.helper import RenderingHelper, TimeseriesHelper
2014
from t4_devkit.schema import SchemaName, SensorModality, VisibilityLevel, build_schema
2115

@@ -416,6 +410,7 @@ def get_box3d(self, sample_annotation_token: str, *, future_seconds: float = 0.0
416410
ann: SampleAnnotation = self.get("sample_annotation", sample_annotation_token)
417411
instance: Instance = self.get("instance", ann.instance_token)
418412
sample: Sample = self.get("sample", ann.sample_token)
413+
visibility: Visibility = self.get("visibility", ann.visibility_token)
419414

420415
# semantic label
421416
semantic_label = self.get_semantic_label(
@@ -438,6 +433,8 @@ def get_box3d(self, sample_annotation_token: str, *, future_seconds: float = 0.0
438433
velocity=velocity,
439434
confidence=1.0,
440435
uuid=instance.token, # TODO(ktro2828): extract uuid from `instance_name`.
436+
num_points=ann.num_lidar_pts,
437+
visibility=visibility.level,
441438
)
442439

443440
if future_seconds > 0.0:
@@ -549,6 +546,7 @@ def get_box3ds(self, sample_data_token: str, *, future_seconds: float = 0.0) ->
549546
instance.category_token, curr_ann.attribute_tokens
550547
)
551548
velocity = self.box_velocity(curr_ann.token)
549+
visibility: Visibility = self.get("visibility", curr_ann.visibility_token)
552550

553551
box = Box3D(
554552
unix_time=t,
@@ -560,6 +558,8 @@ def get_box3ds(self, sample_data_token: str, *, future_seconds: float = 0.0) ->
560558
velocity=velocity,
561559
confidence=1.0,
562560
uuid=instance.token, # TODO(ktro2828): extract uuid from `instance_name`.
561+
num_points=curr_ann.num_lidar_pts,
562+
visibility=visibility.level,
563563
)
564564
else:
565565
# If not, simply grab the current annotation.

tests/conftest.py

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
ShapeType,
1717
TransformBuffer,
1818
)
19+
from t4_devkit.schema import VisibilityLevel
1920

2021
if TYPE_CHECKING:
2122
from t4_devkit.typing import NDArrayFloat
@@ -58,6 +59,8 @@ def dummy_box3d() -> Box3D:
5859
velocity=(1.0, 1.0, 1.0),
5960
confidence=1.0,
6061
uuid="car3d_0",
62+
num_points=1,
63+
visibility=VisibilityLevel.FULL,
6164
).with_future(
6265
timestamps=[101, 102, 103, 104],
6366
confidences=[1.0, 0.5],
@@ -100,6 +103,8 @@ def dummy_box3ds() -> list[Box3D]:
100103
velocity=(1.0, 1.0, 1.0),
101104
confidence=1.0,
102105
uuid="car3d_1",
106+
num_points=1,
107+
visibility=VisibilityLevel.FULL,
103108
).with_future(
104109
timestamps=[101, 102, 103, 104],
105110
confidences=[1.0],
@@ -124,6 +129,8 @@ def dummy_box3ds() -> list[Box3D]:
124129
velocity=(1.0, 1.0, 1.0),
125130
confidence=1.0,
126131
uuid="bicycle3d_1",
132+
num_points=1,
133+
visibility=VisibilityLevel.FULL,
127134
).with_future(
128135
timestamps=[101, 102, 103, 104],
129136
confidences=[1.0, 0.5],
@@ -156,6 +163,8 @@ def dummy_box3ds() -> list[Box3D]:
156163
velocity=(1.0, 1.0, 1.0),
157164
confidence=1.0,
158165
uuid="pedestrian3d_1",
166+
num_points=1,
167+
visibility="full",
159168
).with_future(
160169
timestamps=[101, 102, 103, 104],
161170
confidences=[1.0, 0.5, 0.2],

0 commit comments

Comments
 (0)