Skip to content

Commit 7272af8

Browse files
committed
refactor upload_priority_scores
1 parent 2e82afe commit 7272af8

File tree

8 files changed

+61
-56
lines changed

8 files changed

+61
-56
lines changed

src/superannotate/__init__.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -99,13 +99,13 @@
9999
from superannotate.lib.app.interface.sdk_interface import (
100100
upload_images_from_public_urls_to_project,
101101
)
102-
from superannotate.lib.app.interface.sdk_interface import (
103-
upload_priority_scores,
104-
)
105102
from superannotate.lib.app.interface.sdk_interface import upload_images_to_project
106103
from superannotate.lib.app.interface.sdk_interface import (
107104
upload_preannotations_from_folder_to_project,
108105
)
106+
from superannotate.lib.app.interface.sdk_interface import (
107+
upload_priority_scores,
108+
)
109109
from superannotate.lib.app.interface.sdk_interface import upload_video_to_project
110110
from superannotate.lib.app.interface.sdk_interface import (
111111
upload_videos_from_folder_to_project,

src/superannotate/lib/app/interface/sdk_interface.py

Lines changed: 7 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,8 @@
3939
from lib.core.exceptions import AppException
4040
from lib.core.types import AttributeGroup
4141
from lib.core.types import MLModel
42-
from lib.core.types import Project
4342
from lib.core.types import PriorityScore
43+
from lib.core.types import Project
4444
from lib.infrastructure.controller import Controller
4545
from pydantic import conlist
4646
from pydantic import parse_obj_as
@@ -2902,11 +2902,11 @@ def get_annotations_per_frame(project: NotEmptyStr, video: NotEmptyStr, fps: int
29022902
raise AppException(response.errors)
29032903
return response.data
29042904

2905+
29052906
@Trackable
29062907
@validate_arguments
29072908
def upload_priority_scores(project: NotEmptyStr, scores: List[PriorityScore]):
2908-
"""
2909-
Returns per frame annotations for the given video.
2909+
"""Returns per frame annotations for the given video.
29102910
29112911
:param project: project name or folder path (e.g., “project1/folder1”)
29122912
:type project: str
@@ -2919,14 +2919,7 @@ def upload_priority_scores(project: NotEmptyStr, scores: List[PriorityScore]):
29192919
"""
29202920
project_name, folder_name = extract_project_folder(project)
29212921
project_folder_name = project
2922-
use_case = Controller.get_default().upload_priority_scores(project_name, folder_name, scores, project_folder_name)
2923-
logger.info(f"Uploading priority scores for {len(scores)} item(s) from {project_folder_name}.")
2924-
with tqdm(
2925-
total=len(scores), desc="Uploading priority scores"
2926-
) as progress_bar:
2927-
for uploaded_count in use_case.execute():
2928-
progress_bar.update(uploaded_count)
2929-
progress_bar.close()
2930-
if use_case.response.errors:
2931-
raise AppException(use_case.errors)
2932-
return use_case.response.data
2922+
response = Controller.get_default().upload_priority_scores(project_name, folder_name, scores, project_folder_name)
2923+
if response.errors:
2924+
raise AppException(response.errors)
2925+
return response.data

src/superannotate/lib/app/mixp/utils/parsers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1237,4 +1237,4 @@ def upload_priority_scores(*args, **kwargs):
12371237
return {
12381238
"event_name": "upload_priority_scores",
12391239
"properties": {"Score Count": len(scores)},
1240-
}
1240+
}

src/superannotate/lib/core/serviceproviders.py

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -316,7 +316,6 @@ def get_annotations(
316316
raise NotImplementedError
317317

318318
def upload_priority_scores(
319-
self, team_id: int, project_id: int, folder_id: int, priorities: list = []
320-
) -> ServiceResponse:
319+
self, team_id: int, project_id: int, folder_id: int, priorities: list
320+
) -> dict:
321321
raise NotImplementedError
322-

src/superannotate/lib/core/usecases/annotations.py

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,16 @@
2424
from lib.core.exceptions import AppException
2525
from lib.core.reporter import Reporter
2626
from lib.core.repositories import BaseManageableRepository
27-
from lib.core.usecases.base import BaseInteractiveUseCase
2827
from lib.core.service_types import UploadAnnotationAuthData
2928
from lib.core.serviceproviders import SuerannotateServiceProvider
29+
from lib.core.types import PriorityScore
3030
from lib.core.usecases.base import BaseReportableUseCae
3131
from lib.core.usecases.images import GetBulkImages
3232
from lib.core.usecases.images import ValidateAnnotationUseCase
3333
from lib.core.video_convertor import VideoFrameGenerator
3434
from superannotate.logger import get_default_logger
3535
from superannotate_schemas.validators import AnnotationValidators
36-
from lib.core.types import PriorityScore
36+
3737

3838
logger = get_default_logger()
3939

@@ -626,19 +626,20 @@ def execute(self):
626626
return self._response
627627

628628

629-
class UploadPriorityScoresUseCase(BaseInteractiveUseCase):
629+
class UploadPriorityScoresUseCase(BaseReportableUseCae):
630630

631631
CHUNK_SIZE = 100
632632

633633
def __init__(
634634
self,
635+
reporter,
635636
project: ProjectEntity,
636637
folder: FolderEntity,
637638
scores: List[PriorityScore],
638639
project_folder_name: str,
639640
backend_service_provider: SuerannotateServiceProvider
640641
):
641-
super().__init__()
642+
super().__init__(reporter)
642643
self._project = project
643644
self._folder = folder
644645
self._scores = scores
@@ -658,29 +659,37 @@ def get_clean_priority(priority):
658659
priority = float(str(float(priority)).split('.')[0] + '.' + str(float(priority)).split('.')[1][:5])
659660
return priority
660661

661-
def execute(self):
662-
priorities = []
663-
to_send = []
664-
for i in self._scores:
665-
priorities.append({
666-
"name": i.name,
667-
"entropy_value": self.get_clean_priority(i.priority)
668-
})
669-
to_send.append(i.name)
670-
671-
uploaded = []
672-
for i in range(0, len(priorities), self.CHUNK_SIZE):
673-
res = self._client.upload_priority_scores(
674-
team_id=self._project.team_id,
675-
project_id=self._project.uuid,
676-
folder_id=self._folder.uuid,
677-
priorities=priorities[i : i + self.CHUNK_SIZE], # noqa: E203
678-
)
679-
uploaded += res["data"]
680-
yield len(to_send[:i + self.CHUNK_SIZE])
662+
@property
663+
def folder_path(self):
664+
return f"{self._project.name}{f'/{self._folder.name}'if self._folder.name != 'root' else ''}"
681665

682-
uploaded = [i["name"] for i in uploaded]
683-
skipped = list(set(to_send) - set(uploaded))
684-
self._response.data = (uploaded, skipped)
666+
def execute(self):
667+
if self.is_valid():
668+
priorities = []
669+
initial_scores = []
670+
for i in self._scores:
671+
priorities.append({
672+
"name": i.name,
673+
"entropy_value": self.get_clean_priority(i.priority)
674+
})
675+
initial_scores.append(i.name)
676+
uploaded_score_names = []
677+
self.reporter.log_info(f"Uploading priority scores for {len(priorities)} item(s) from {self.folder_path}.")
678+
iterations = range(0, len(priorities), self.CHUNK_SIZE)
679+
self.reporter.start_progress(iterations, "Uploading priority scores")
680+
if iterations:
681+
for i in iterations:
682+
priorities_to_upload = priorities[i : i + self.CHUNK_SIZE] # noqa: E203
683+
res = self._client.upload_priority_scores(
684+
team_id=self._project.team_id,
685+
project_id=self._project.uuid,
686+
folder_id=self._folder.uuid,
687+
priorities=priorities_to_upload
688+
)
689+
self.reporter.update_progress(len(priorities_to_upload))
690+
uploaded_score_names.extend(list(map(lambda x: x["name"], res.get("data", []))))
691+
skipped_score_names = list(set(initial_scores) - set(uploaded_score_names))
692+
self._response.data = (uploaded_score_names, skipped_score_names)
693+
else:
694+
self.reporter.warning_messages("Empty scores.")
685695
return self._response
686-

src/superannotate/lib/infrastructure/controller.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838

3939

4040
class BaseController(metaclass=ABCMeta):
41+
4142
def __init__(self, config_path: str = None, token: str = None):
4243
self._team_data = None
4344
self._token = None
@@ -1652,10 +1653,11 @@ def upload_priority_scores(self, project_name, folder_name, scores, project_fold
16521653
project = self._get_project(project_name)
16531654
folder = self._get_folder(project, folder_name)
16541655
use_case = usecases.UploadPriorityScoresUseCase(
1656+
reporter=self.default_reporter,
16551657
project=project,
16561658
folder=folder,
16571659
scores=scores,
16581660
backend_service_provider=self.backend_client,
16591661
project_folder_name=project_folder_name
16601662
)
1661-
return use_case
1663+
return use_case.execute()

src/superannotate/lib/infrastructure/services.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -227,8 +227,8 @@ class SuperannotateBackendService(BaseBackendService):
227227
URL_UPLOAD_PRIORITY_SCORES = "images/updateEntropy"
228228

229229
def upload_priority_scores(
230-
self, team_id: int, project_id: int, folder_id: int, priorities: list = []
231-
) -> ServiceResponse:
230+
self, team_id: int, project_id: int, folder_id: int, priorities: list
231+
) -> dict:
232232
upload_priority_score_url = urljoin(self.api_url, self.URL_UPLOAD_PRIORITY_SCORES)
233233
res = self._request(
234234
upload_priority_score_url,

tests/integration/test_upload_priority_scores.py

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,9 @@
11
import os
2+
from pathlib import Path
3+
24
import src.superannotate as sa
35
from tests.integration.base import BaseTestCase
4-
from pathlib import Path
6+
57

68
class TestUploadPriorityScores(BaseTestCase):
79
PROJECT_NAME = "TestUploadPriorityScores"
@@ -17,7 +19,7 @@ def test_upload_priority_scores(self):
1719
sa.upload_images_from_folder_to_project(
1820
self.PROJECT_NAME, self.folder_path, annotation_status="InProgress"
1921
)
20-
uploaded, skipped = sa.upload_priority_scores(self.PROJECT_NAME, scores=[{
22+
uploaded, skipped = sa.upload_priority_2scores(self.PROJECT_NAME, scores=[{
2123
"name": "example_image_1.jpg",
2224
"priority": 1
2325
}])
@@ -39,5 +41,5 @@ def test_upload_priority_scores(self):
3941
"name": "example_image_4.jpg",
4042
"priority": 100000000
4143
}])
42-
self.assertEqual(sa.get_image_metadata(self.PROJECT_NAME,"example_image_4.jpg")['entropy_value'], 1000000)
43-
self.assertEqual(sa.get_image_metadata(self.PROJECT_NAME,"example_image_3.jpg")['entropy_value'], 1.12345)
44+
self.assertEqual(sa.get_image_metadata(self.PROJECT_NAME, "example_image_4.jpg")['entropy_value'], 1000000)
45+
self.assertEqual(sa.get_image_metadata(self.PROJECT_NAME, "example_image_3.jpg")['entropy_value'], 1.12345)

0 commit comments

Comments
 (0)