From f8debb015c043dfe32da6441ec5973160deeeeb3 Mon Sep 17 00:00:00 2001 From: Narek Mkhitaryan Date: Fri, 19 Jul 2024 19:04:14 +0400 Subject: [PATCH] added priority_scores interface --- src/superannotate_core/app/__init__.py | 19 ++++++++++++ src/superannotate_core/core/utils.py | 17 +++++++++++ .../repositories/item_repository.py | 29 +++++++++++++++++++ 3 files changed, 65 insertions(+) diff --git a/src/superannotate_core/app/__init__.py b/src/superannotate_core/app/__init__.py index 01ea25c..9794d79 100644 --- a/src/superannotate_core/app/__init__.py +++ b/src/superannotate_core/app/__init__.py @@ -584,6 +584,17 @@ def bulk_unassign( ) return count + @classmethod + def upload_priority_scores( + cls, + session: Session, + project_id: int, + folder_id: int, + scores: List[dict[str, float]], + ): + repo = ItemRepository(session) + return repo.upload_priority_scores(project_id, folder_id, scores) + class ImageItem(Item, ImageEntity): ... @@ -1006,6 +1017,14 @@ def delete_custom_field_values(self, item_fields_map: Dict[Item, List[str]]): item_name_fields_map={i.name: v for i, v in item_fields_map.items()}, ) + def upload_priority_scores(self, scores: List[dict[str, float]]): + return Item.upload_priority_scores( + session=self.session, + project_id=self.project_id, + folder_id=self.id, + scores=scores, + ) + class Project(ProjectEntity): @classmethod diff --git a/src/superannotate_core/core/utils.py b/src/superannotate_core/core/utils.py index e19b427..dbc9e8d 100644 --- a/src/superannotate_core/core/utils.py +++ b/src/superannotate_core/core/utils.py @@ -45,3 +45,20 @@ def get_dict_size(data: dict) -> int: file.write(json.dumps(data).encode()) file.seek(0) return file.getbuffer().nbytes + + +def get_clean_priority(priority: float): + if len(str(priority)) > 8: + priority = float(str(priority)[:8]) + if priority > 1000000: + priority = 1000000 + if priority < 0: + priority = 0 + if str(float(priority)).split(".")[1:2]: + if len(str(float(priority)).split(".")[1]) > 5: + priority = float( + str(float(priority)).split(".")[0] + + "." + + str(float(priority)).split(".")[1][:5] + ) + return priority diff --git a/src/superannotate_core/infrastructure/repositories/item_repository.py b/src/superannotate_core/infrastructure/repositories/item_repository.py index 109ebf1..b73c263 100644 --- a/src/superannotate_core/infrastructure/repositories/item_repository.py +++ b/src/superannotate_core/infrastructure/repositories/item_repository.py @@ -12,6 +12,7 @@ from superannotate_core.core.enums import UploadStateEnum from superannotate_core.core.exceptions import SAValidationException from superannotate_core.core.utils import chunkify +from superannotate_core.core.utils import get_clean_priority from superannotate_core.infrastructure.repositories.base import BaseHttpRepository from superannotate_core.infrastructure.repositories.limits_repository import ( LimitsRepository, @@ -57,6 +58,7 @@ class ItemRepository(BaseHttpRepository): ASSIGN_CHUNK_SIZE = ATTACH_CHUNK_SIZE BACK_OFF_FACTOR = 0.3 SAQUL_CHUNK_SIZE = 50 + SCORE_CHUNK_SIZE = 100 URL_LIST = "items" URL_ATTACH = "image/ext-create" @@ -72,6 +74,7 @@ class ItemRepository(BaseHttpRepository): URL_ASSIGN_ITEMS = "images/editAssignment/" URL_VALIDATE_SAQUL_QUERY = "/images/parse/query/advanced" URL_SAQUL_QUERY = "/images/search/advanced" + URL_UPLOAD_PRIORITY_SCORES = "images/updateEntropy" def _validate_limitations( self, @@ -519,3 +522,29 @@ def unassign_items( }, ) response.raise_for_status() + + def upload_priority_scores( + self, project_id: int, folder_id: int, scores: List[dict[str, float]] + ): + scores_to_upload = [] + for i in scores: + scores_to_upload.append( + { + "name": i["name"], + "entropy_value": get_clean_priority(i["priority"]), + } + ) + chunked_scores_to_upload = chunkify(scores_to_upload, self.SCORE_CHUNK_SIZE) + uploaded_score_names: List[str] = [] + for chunk in chunked_scores_to_upload: + response = self._session.request( + self.URL_UPLOAD_PRIORITY_SCORES, + "post", + params={"project_id": project_id, "folder_id": folder_id}, + json={"image_entropies": chunk}, + ) + response.raise_for_status() + uploaded = response.json().get("data") + if uploaded: + uploaded_score_names.extend([i["name"] for i in uploaded]) + return uploaded_score_names