Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion pytest.ini
Original file line number Diff line number Diff line change
Expand Up @@ -2,4 +2,4 @@
minversion = 3.0
log_cli=true
python_files = test_*.py
;addopts = -n auto --dist=loadscope
addopts = -n auto --dist=loadscope
3 changes: 2 additions & 1 deletion src/superannotate_schemas/bin/interface.py
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import os
from os.path import expanduser
import json
import errno
from pathlib import Path
Expand Down Expand Up @@ -61,7 +62,7 @@ def validate(*paths, project_type, internal=False, verbose=False, report_path=No
if verbose:
print(f"{'-'* 4}{path}\n{report}")
if report_path:
with open(f"{report_path}/{uniquify(Path(path).name)}") as validation_report:
with open(uniquify(f"{report_path}/{(Path(path).name)}"), "w") as validation_report:
validation_report.write(report)
else:
validation_result.append({path: False})
Expand Down
26 changes: 10 additions & 16 deletions src/superannotate_schemas/schemas/base.py
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,7 @@
from superannotate_schemas.schemas.enums import BaseImageRoleEnum
from superannotate_schemas.schemas.enums import VectorAnnotationTypeEnum
from superannotate_schemas.schemas.enums import AnnotationStatusEnum
from superannotate_schemas.schemas.enums import ClassTypeEnum
from superannotate_schemas.schemas.constances import DATE_REGEX
from superannotate_schemas.schemas.constances import DATE_TIME_FORMAT_ERROR_MESSAGE
from superannotate_schemas.schemas.constances import POINT_LABEL_VALUE_FORMAT_ERROR_MESSAGE
Expand Down Expand Up @@ -64,20 +65,14 @@ class AxisPoint(BaseModel):
class BaseAttribute(BaseModel):
id: Optional[StrictInt]
group_id: Optional[StrictInt] = Field(alias="groupId")
name: NotEmptyStr
group_name: NotEmptyStr = Field(alias="groupName")
name: Optional[NotEmptyStr]
group_name: Optional[NotEmptyStr] = Field(alias="groupName")


class Tag(BaseModel):
__root__: NotEmptyStr


class AttributeGroup(BaseModel):
name: NotEmptyStr
is_multiselect: Optional[bool] = Field(False)
attributes: List[BaseAttribute]


class BboxPoints(BaseModel):
x1: StrictNumber
x2: StrictNumber
Expand Down Expand Up @@ -126,6 +121,12 @@ class BaseInstance(TrackableModel, TimedBaseModel):
class_name: Optional[NotEmptyStr] = Field(None, alias="className")


class BaseInstanceTag(BaseInstance):
type: ClassTypeEnum
probability: Optional[StrictInt] = Field(100)
attributes: Optional[List[BaseAttribute]] = Field(list())


class BaseMetadata(BaseModel):
name: NotEmptyStr
url: Optional[StrictStr]
Expand Down Expand Up @@ -220,15 +221,8 @@ class BaseVectorInstance(BaseImageAnnotationInstance):
tracking_id: Optional[str] = Field(alias="trackingId")
group_id: Optional[int] = Field(alias="groupId")

#
# class Metadata(BaseMetadata):
# name: NotEmptyStr
# status: Optional[AnnotationStatusEnum]
# pinned: Optional[StrictBool]
# is_predicted: Optional[StrictBool] = Field(None, alias="isPredicted")


class PixelColor(BaseModel):
class HexColor(BaseModel):
__root__: ColorType

@validator("__root__")
Expand Down
48 changes: 48 additions & 0 deletions src/superannotate_schemas/schemas/classes.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
from typing import Optional
from typing import List

from superannotate_schemas.schemas.base import BaseModel
from superannotate_schemas.schemas.base import TimedBaseModel
from superannotate_schemas.schemas.base import StrictInt
from superannotate_schemas.schemas.base import StrictStr
from superannotate_schemas.schemas.base import HexColor
from superannotate_schemas.schemas.enums import ClassTypeEnum


class Attribute(TimedBaseModel):
id: Optional[StrictInt]
group_id: Optional[StrictInt]
project_id: Optional[StrictInt]
name: StrictStr
count: Optional[StrictInt]

def __hash__(self):
return hash(f"{self.id}{self.group_id}{self.name}")


class AttributeGroup(TimedBaseModel):
id: Optional[StrictInt]
class_id: Optional[StrictInt]
name: StrictStr
is_multiselect: Optional[bool]
attributes: List[Attribute]

def __hash__(self):
return hash(f"{self.id}{self.class_id}{self.name}")


class AnnotationClass(TimedBaseModel):
id: Optional[StrictInt]
project_id: Optional[StrictInt]
type: ClassTypeEnum = ClassTypeEnum.OBJECT
name: StrictStr
color: HexColor
count: Optional[StrictInt]
attribute_groups: List[AttributeGroup]

def __hash__(self):
return hash(f"{self.id}{self.type}{self.name}")


class AnnotationClasses(BaseModel):
__root__: List[AnnotationClass]
6 changes: 6 additions & 0 deletions src/superannotate_schemas/schemas/enums.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ class VectorAnnotationTypeEnum(str, Enum):
POLYGON = "polygon"
POINT = "point"
RBBOX = "rbbox"
TAG = "tag"


class CreationTypeEnum(str, Enum):
Expand Down Expand Up @@ -38,3 +39,8 @@ class BaseImageRoleEnum(str, Enum):
ADMIN = "Admin"
ANNOTATOR = "Annotator"
QA = "QA"


class ClassTypeEnum(str, Enum):
OBJECT = "object"
TAG = "tag"
4 changes: 2 additions & 2 deletions src/superannotate_schemas/schemas/external/pixel.py
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
from superannotate_schemas.schemas.base import BaseImageMetadata
from superannotate_schemas.schemas.base import NotEmptyStr
from superannotate_schemas.schemas.base import StrictStr
from superannotate_schemas.schemas.base import PixelColor
from superannotate_schemas.schemas.base import HexColor
from superannotate_schemas.schemas.base import Tag
from superannotate_schemas.schemas.base import Comment

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


class AnnotationPart(BaseModel):
color: PixelColor
color: HexColor


class AnnotationInstance(BaseImageAnnotationInstance):
Expand Down
8 changes: 7 additions & 1 deletion src/superannotate_schemas/schemas/external/vector.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,14 @@
from superannotate_schemas.schemas.base import NotEmptyStr
from superannotate_schemas.schemas.base import StrictNumber
from superannotate_schemas.schemas.base import Tag
from superannotate_schemas.schemas.base import BaseInstanceTag
from superannotate_schemas.schemas.enums import VectorAnnotationTypeEnum


class InstanceTag(BaseInstanceTag):
class_name: NotEmptyStr


class Attribute(BaseAttribute):
name: NotEmptyStr
group_name: NotEmptyStr = Field(alias="groupName")
Expand Down Expand Up @@ -115,12 +120,13 @@ class Cuboid(VectorInstance):
VectorAnnotationTypeEnum.POLYLINE: PolyLine,
VectorAnnotationTypeEnum.ELLIPSE: Ellipse,
VectorAnnotationTypeEnum.RBBOX: RotatedBox,
VectorAnnotationTypeEnum.TAG: InstanceTag,
}


class AnnotationInstance(BaseModel):
__root__: Union[
Template, Cuboid, Point, PolyLine, Polygon, Bbox, Ellipse, RotatedBox
Template, Cuboid, Point, PolyLine, Polygon, Bbox, Ellipse, RotatedBox, InstanceTag
]

@classmethod
Expand Down
4 changes: 2 additions & 2 deletions src/superannotate_schemas/schemas/internal/pixel.py
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
from typing import Optional

from superannotate_schemas.schemas.base import BaseImageMetadata as Metadata
from superannotate_schemas.schemas.base import PixelColor
from superannotate_schemas.schemas.base import HexColor
from superannotate_schemas.schemas.base import BaseAttribute
from superannotate_schemas.schemas.base import BaseImageAnnotationInstance
from superannotate_schemas.schemas.base import Tag
Expand All @@ -19,7 +19,7 @@ class Attribute(BaseAttribute):


class AnnotationPart(BaseModel):
color: PixelColor
color: HexColor


class AnnotationInstance(BaseImageAnnotationInstance):
Expand Down
10 changes: 9 additions & 1 deletion src/superannotate_schemas/schemas/internal/vector.py
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
from superannotate_schemas.schemas.base import Tag
from superannotate_schemas.schemas.base import AxisPoint
from superannotate_schemas.schemas.base import VectorAnnotationTypeEnum
from superannotate_schemas.schemas.base import BaseInstanceTag
from superannotate_schemas.schemas.base import StrictNumber
from superannotate_schemas.schemas.base import INVALID_DICT_MESSAGE
from superannotate_schemas.schemas.base import BaseModel
Expand All @@ -24,6 +25,11 @@
from pydantic.error_wrappers import ErrorWrapper



class InstanceTag(BaseInstanceTag):
class_id: StrictInt


class Attribute(BaseAttribute):
id: StrictInt
group_id: StrictInt = Field(alias="groupId")
Expand Down Expand Up @@ -110,11 +116,13 @@ class Cuboid(VectorInstance):
VectorAnnotationTypeEnum.POLYLINE: PolyLine,
VectorAnnotationTypeEnum.ELLIPSE: Ellipse,
VectorAnnotationTypeEnum.RBBOX: RotatedBox,
VectorAnnotationTypeEnum.TAG: InstanceTag,
}


class AnnotationInstance(BaseModel):
__root__: Union[
Template, Cuboid, Point, PolyLine, Polygon, Bbox, Ellipse, RotatedBox
Template, Cuboid, Point, PolyLine, Polygon, Bbox, Ellipse, RotatedBox, InstanceTag
]

@classmethod
Expand Down
1 change: 1 addition & 0 deletions src/superannotate_schemas/validators.py
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,7 @@
from superannotate_schemas.schemas.internal import VectorAnnotation as InternalVectorAnnotation
from superannotate_schemas.schemas.internal import VideoAnnotation as InternalVideoAnnotation
from superannotate_schemas.schemas.internal import DocumentAnnotation as InternalDocumentAnnotation
from superannotate_schemas.schemas.classes import AnnotationClass


from superannotate_schemas.schemas.base import BaseModel
Expand Down
3 changes: 2 additions & 1 deletion tests/test_cli.py
Original file line number Diff line number Diff line change
Expand Up @@ -82,4 +82,5 @@ def test_(self):
# pass
# print(time.time() - s)
import datetime
print((datetime.datetime.now(datetime.timezone.utc)).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + 'Z')
print((datetime.datetime.now(datetime.timezone.utc)).strftime("%Y-%m-%dT%H:%M:%S.%f")[:-3] + 'Z')