From 459d6a20774812c94eb3c07d2efa3de725a6fb61 Mon Sep 17 00:00:00 2001 From: Shabin Dilanchian Date: Thu, 20 Jan 2022 12:40:33 +0400 Subject: [PATCH 1/2] Update base schema --- src/superannotate_schemas/schemas/base.py | 4 ++-- tests/test_validators.py | 10 +++++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/src/superannotate_schemas/schemas/base.py b/src/superannotate_schemas/schemas/base.py index 0290f48..d8522a4 100644 --- a/src/superannotate_schemas/schemas/base.py +++ b/src/superannotate_schemas/schemas/base.py @@ -64,8 +64,8 @@ class AxisPoint(BaseModel): class BaseAttribute(BaseModel): id: Optional[StrictInt] group_id: Optional[StrictInt] = Field(alias="groupId") - name: Optional[NotEmptyStr] - group_name: Optional[NotEmptyStr] = Field(alias="groupName") + name: NotEmptyStr + group_name: NotEmptyStr = Field(alias="groupName") class Tag(BaseModel): diff --git a/tests/test_validators.py b/tests/test_validators.py index 1962ba7..facd2cd 100644 --- a/tests/test_validators.py +++ b/tests/test_validators.py @@ -310,7 +310,12 @@ def test_validate_document_annotation_wrong_class_id(self, mock_print): "email": "some.email@gmail.com", "role": "Admin" }, - "attributes": [], + "attributes": [ + { + "id": 1175876, + "groupId": 338357 + } + ], "creationType": "Manual", "className": "vid" }], @@ -324,8 +329,7 @@ def test_validate_document_annotation_wrong_class_id(self, mock_print): data = json.loads(f.read()) validator = AnnotationValidators.get_validator("document")(data) self.assertFalse(validator.is_valid()) - self.assertEqual(validator.generate_report(), - "instances[0].classId integer type expected") + self.assertEqual(len(validator.generate_report()), 198) def test_validate_document_annotation_with_null_created_at(self): with tempfile.TemporaryDirectory() as tmpdir_name: From 15d855754f02372aee3774442ed414f91d43d076 Mon Sep 17 00:00:00 2001 From: Vaghinak Basentsyan Date: Mon, 24 Jan 2022 16:36:02 +0400 Subject: [PATCH 2/2] Created annotation classes schemas --- src/superannotate_schemas/schemas/base.py | 2 +- src/superannotate_schemas/schemas/classes.py | 49 +++++++++++++++++++ src/superannotate_schemas/schemas/enums.py | 5 ++ .../schemas/external/pixel.py | 4 +- .../schemas/internal/pixel.py | 4 +- src/superannotate_schemas/validators.py | 1 + 6 files changed, 60 insertions(+), 5 deletions(-) create mode 100644 src/superannotate_schemas/schemas/classes.py diff --git a/src/superannotate_schemas/schemas/base.py b/src/superannotate_schemas/schemas/base.py index d8522a4..84ef8ee 100644 --- a/src/superannotate_schemas/schemas/base.py +++ b/src/superannotate_schemas/schemas/base.py @@ -228,7 +228,7 @@ class BaseVectorInstance(BaseImageAnnotationInstance): # is_predicted: Optional[StrictBool] = Field(None, alias="isPredicted") -class PixelColor(BaseModel): +class HexColor(BaseModel): __root__: ColorType @validator("__root__") diff --git a/src/superannotate_schemas/schemas/classes.py b/src/superannotate_schemas/schemas/classes.py new file mode 100644 index 0000000..638f876 --- /dev/null +++ b/src/superannotate_schemas/schemas/classes.py @@ -0,0 +1,49 @@ +from typing import Optional +from typing import List + +from superannotate_schemas.schemas.base import BaseModel +from superannotate_schemas.schemas.base import TrackableModel +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] diff --git a/src/superannotate_schemas/schemas/enums.py b/src/superannotate_schemas/schemas/enums.py index 0b8557b..d7be2f0 100644 --- a/src/superannotate_schemas/schemas/enums.py +++ b/src/superannotate_schemas/schemas/enums.py @@ -38,3 +38,8 @@ class BaseImageRoleEnum(str, Enum): ADMIN = "Admin" ANNOTATOR = "Annotator" QA = "QA" + + +class ClassTypeEnum(str, Enum): + OBJECT = "object" + TAG = "tag" diff --git a/src/superannotate_schemas/schemas/external/pixel.py b/src/superannotate_schemas/schemas/external/pixel.py index b21b3d5..23de3a1 100644 --- a/src/superannotate_schemas/schemas/external/pixel.py +++ b/src/superannotate_schemas/schemas/external/pixel.py @@ -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 @@ -25,7 +25,7 @@ class MetaData(BaseImageMetadata): class AnnotationPart(BaseModel): - color: PixelColor + color: HexColor class AnnotationInstance(BaseImageAnnotationInstance): diff --git a/src/superannotate_schemas/schemas/internal/pixel.py b/src/superannotate_schemas/schemas/internal/pixel.py index 3d73ec1..0b4d981 100644 --- a/src/superannotate_schemas/schemas/internal/pixel.py +++ b/src/superannotate_schemas/schemas/internal/pixel.py @@ -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 @@ -19,7 +19,7 @@ class Attribute(BaseAttribute): class AnnotationPart(BaseModel): - color: PixelColor + color: HexColor class AnnotationInstance(BaseImageAnnotationInstance): diff --git a/src/superannotate_schemas/validators.py b/src/superannotate_schemas/validators.py index a093e03..3072b3d 100644 --- a/src/superannotate_schemas/validators.py +++ b/src/superannotate_schemas/validators.py @@ -95,6 +95,7 @@ class AnnotationValidators: ValidatorFactory.get_validator(ExternalDocumentAnnotation), ValidatorFactory.get_validator(InternalDocumentAnnotation) ) + } @classmethod