Skip to content

Commit f74df8a

Browse files
authored
Merge pull request #14 from superannotateai/develop
Develop
2 parents 0eb11e7 + fbbf0af commit f74df8a

File tree

10 files changed

+88
-24
lines changed

10 files changed

+88
-24
lines changed

pytest.ini

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
minversion = 3.0
33
log_cli=true
44
python_files = test_*.py
5-
;addopts = -n auto --dist=loadscope
5+
addopts = -n auto --dist=loadscope

src/superannotate_schemas/schemas/base.py

Lines changed: 10 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@
2626
from superannotate_schemas.schemas.enums import BaseImageRoleEnum
2727
from superannotate_schemas.schemas.enums import VectorAnnotationTypeEnum
2828
from superannotate_schemas.schemas.enums import AnnotationStatusEnum
29+
from superannotate_schemas.schemas.enums import ClassTypeEnum
2930
from superannotate_schemas.schemas.constances import DATE_REGEX
3031
from superannotate_schemas.schemas.constances import DATE_TIME_FORMAT_ERROR_MESSAGE
3132
from superannotate_schemas.schemas.constances import POINT_LABEL_VALUE_FORMAT_ERROR_MESSAGE
@@ -64,20 +65,14 @@ class AxisPoint(BaseModel):
6465
class BaseAttribute(BaseModel):
6566
id: Optional[StrictInt]
6667
group_id: Optional[StrictInt] = Field(alias="groupId")
67-
name: NotEmptyStr
68-
group_name: NotEmptyStr = Field(alias="groupName")
68+
name: Optional[NotEmptyStr]
69+
group_name: Optional[NotEmptyStr] = Field(alias="groupName")
6970

7071

7172
class Tag(BaseModel):
7273
__root__: NotEmptyStr
7374

7475

75-
class AttributeGroup(BaseModel):
76-
name: NotEmptyStr
77-
is_multiselect: Optional[bool] = Field(False)
78-
attributes: List[BaseAttribute]
79-
80-
8176
class BboxPoints(BaseModel):
8277
x1: StrictNumber
8378
x2: StrictNumber
@@ -126,6 +121,12 @@ class BaseInstance(TrackableModel, TimedBaseModel):
126121
class_name: Optional[NotEmptyStr] = Field(None, alias="className")
127122

128123

124+
class BaseInstanceTag(BaseInstance):
125+
type: ClassTypeEnum
126+
probability: Optional[StrictInt] = Field(100)
127+
attributes: Optional[List[BaseAttribute]] = Field(list())
128+
129+
129130
class BaseMetadata(BaseModel):
130131
name: NotEmptyStr
131132
url: Optional[StrictStr]
@@ -220,15 +221,8 @@ class BaseVectorInstance(BaseImageAnnotationInstance):
220221
tracking_id: Optional[str] = Field(alias="trackingId")
221222
group_id: Optional[int] = Field(alias="groupId")
222223

223-
#
224-
# class Metadata(BaseMetadata):
225-
# name: NotEmptyStr
226-
# status: Optional[AnnotationStatusEnum]
227-
# pinned: Optional[StrictBool]
228-
# is_predicted: Optional[StrictBool] = Field(None, alias="isPredicted")
229-
230224

231-
class PixelColor(BaseModel):
225+
class HexColor(BaseModel):
232226
__root__: ColorType
233227

234228
@validator("__root__")
Lines changed: 48 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,48 @@
1+
from typing import Optional
2+
from typing import List
3+
4+
from superannotate_schemas.schemas.base import BaseModel
5+
from superannotate_schemas.schemas.base import TimedBaseModel
6+
from superannotate_schemas.schemas.base import StrictInt
7+
from superannotate_schemas.schemas.base import StrictStr
8+
from superannotate_schemas.schemas.base import HexColor
9+
from superannotate_schemas.schemas.enums import ClassTypeEnum
10+
11+
12+
class Attribute(TimedBaseModel):
13+
id: Optional[StrictInt]
14+
group_id: Optional[StrictInt]
15+
project_id: Optional[StrictInt]
16+
name: StrictStr
17+
count: Optional[StrictInt]
18+
19+
def __hash__(self):
20+
return hash(f"{self.id}{self.group_id}{self.name}")
21+
22+
23+
class AttributeGroup(TimedBaseModel):
24+
id: Optional[StrictInt]
25+
class_id: Optional[StrictInt]
26+
name: StrictStr
27+
is_multiselect: Optional[bool]
28+
attributes: List[Attribute]
29+
30+
def __hash__(self):
31+
return hash(f"{self.id}{self.class_id}{self.name}")
32+
33+
34+
class AnnotationClass(TimedBaseModel):
35+
id: Optional[StrictInt]
36+
project_id: Optional[StrictInt]
37+
type: ClassTypeEnum = ClassTypeEnum.OBJECT
38+
name: StrictStr
39+
color: HexColor
40+
count: Optional[StrictInt]
41+
attribute_groups: List[AttributeGroup]
42+
43+
def __hash__(self):
44+
return hash(f"{self.id}{self.type}{self.name}")
45+
46+
47+
class AnnotationClasses(BaseModel):
48+
__root__: List[AnnotationClass]

src/superannotate_schemas/schemas/enums.py

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class VectorAnnotationTypeEnum(str, Enum):
1010
POLYGON = "polygon"
1111
POINT = "point"
1212
RBBOX = "rbbox"
13+
TAG = "tag"
1314

1415

1516
class CreationTypeEnum(str, Enum):
@@ -38,3 +39,8 @@ class BaseImageRoleEnum(str, Enum):
3839
ADMIN = "Admin"
3940
ANNOTATOR = "Annotator"
4041
QA = "QA"
42+
43+
44+
class ClassTypeEnum(str, Enum):
45+
OBJECT = "object"
46+
TAG = "tag"

src/superannotate_schemas/schemas/external/pixel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@
66
from superannotate_schemas.schemas.base import BaseImageMetadata
77
from superannotate_schemas.schemas.base import NotEmptyStr
88
from superannotate_schemas.schemas.base import StrictStr
9-
from superannotate_schemas.schemas.base import PixelColor
9+
from superannotate_schemas.schemas.base import HexColor
1010
from superannotate_schemas.schemas.base import Tag
1111
from superannotate_schemas.schemas.base import Comment
1212

@@ -25,7 +25,7 @@ class MetaData(BaseImageMetadata):
2525

2626

2727
class AnnotationPart(BaseModel):
28-
color: PixelColor
28+
color: HexColor
2929

3030

3131
class AnnotationInstance(BaseImageAnnotationInstance):

src/superannotate_schemas/schemas/external/vector.py

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,14 @@
2121
from superannotate_schemas.schemas.base import NotEmptyStr
2222
from superannotate_schemas.schemas.base import StrictNumber
2323
from superannotate_schemas.schemas.base import Tag
24+
from superannotate_schemas.schemas.base import BaseInstanceTag
2425
from superannotate_schemas.schemas.enums import VectorAnnotationTypeEnum
2526

2627

28+
class InstanceTag(BaseInstanceTag):
29+
class_name: NotEmptyStr
30+
31+
2732
class Attribute(BaseAttribute):
2833
name: NotEmptyStr
2934
group_name: NotEmptyStr = Field(alias="groupName")
@@ -115,12 +120,13 @@ class Cuboid(VectorInstance):
115120
VectorAnnotationTypeEnum.POLYLINE: PolyLine,
116121
VectorAnnotationTypeEnum.ELLIPSE: Ellipse,
117122
VectorAnnotationTypeEnum.RBBOX: RotatedBox,
123+
VectorAnnotationTypeEnum.TAG: InstanceTag,
118124
}
119125

120126

121127
class AnnotationInstance(BaseModel):
122128
__root__: Union[
123-
Template, Cuboid, Point, PolyLine, Polygon, Bbox, Ellipse, RotatedBox
129+
Template, Cuboid, Point, PolyLine, Polygon, Bbox, Ellipse, RotatedBox, InstanceTag
124130
]
125131

126132
@classmethod

src/superannotate_schemas/schemas/internal/pixel.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from typing import Optional
33

44
from superannotate_schemas.schemas.base import BaseImageMetadata as Metadata
5-
from superannotate_schemas.schemas.base import PixelColor
5+
from superannotate_schemas.schemas.base import HexColor
66
from superannotate_schemas.schemas.base import BaseAttribute
77
from superannotate_schemas.schemas.base import BaseImageAnnotationInstance
88
from superannotate_schemas.schemas.base import Tag
@@ -19,7 +19,7 @@ class Attribute(BaseAttribute):
1919

2020

2121
class AnnotationPart(BaseModel):
22-
color: PixelColor
22+
color: HexColor
2323

2424

2525
class AnnotationInstance(BaseImageAnnotationInstance):

src/superannotate_schemas/schemas/internal/vector.py

Lines changed: 9 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
from superannotate_schemas.schemas.base import Tag
1111
from superannotate_schemas.schemas.base import AxisPoint
1212
from superannotate_schemas.schemas.base import VectorAnnotationTypeEnum
13+
from superannotate_schemas.schemas.base import BaseInstanceTag
1314
from superannotate_schemas.schemas.base import StrictNumber
1415
from superannotate_schemas.schemas.base import INVALID_DICT_MESSAGE
1516
from superannotate_schemas.schemas.base import BaseModel
@@ -24,6 +25,11 @@
2425
from pydantic.error_wrappers import ErrorWrapper
2526

2627

28+
29+
class InstanceTag(BaseInstanceTag):
30+
class_id: StrictInt
31+
32+
2733
class Attribute(BaseAttribute):
2834
id: StrictInt
2935
group_id: StrictInt = Field(alias="groupId")
@@ -110,11 +116,13 @@ class Cuboid(VectorInstance):
110116
VectorAnnotationTypeEnum.POLYLINE: PolyLine,
111117
VectorAnnotationTypeEnum.ELLIPSE: Ellipse,
112118
VectorAnnotationTypeEnum.RBBOX: RotatedBox,
119+
VectorAnnotationTypeEnum.TAG: InstanceTag,
113120
}
114121

122+
115123
class AnnotationInstance(BaseModel):
116124
__root__: Union[
117-
Template, Cuboid, Point, PolyLine, Polygon, Bbox, Ellipse, RotatedBox
125+
Template, Cuboid, Point, PolyLine, Polygon, Bbox, Ellipse, RotatedBox, InstanceTag
118126
]
119127

120128
@classmethod

src/superannotate_schemas/validators.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
from superannotate_schemas.schemas.internal import VectorAnnotation as InternalVectorAnnotation
1616
from superannotate_schemas.schemas.internal import VideoAnnotation as InternalVideoAnnotation
1717
from superannotate_schemas.schemas.internal import DocumentAnnotation as InternalDocumentAnnotation
18+
from superannotate_schemas.schemas.classes import AnnotationClass
1819

1920

2021
from superannotate_schemas.schemas.base import BaseModel

tests/test_cli.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -82,4 +82,5 @@ def test_(self):
8282
# pass
8383
# print(time.time() - s)
8484
import datetime
85-
print((datetime.datetime.now(datetime.timezone.utc)).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + 'Z')
85+
print((datetime.datetime.now(datetime.timezone.utc)).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + 'Z')
86+

0 commit comments

Comments
 (0)