Skip to content

Commit 7dd2873

Browse files
committed
refactor upload_priority_scores
1 parent 52de468 commit 7dd2873

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
@@ -2895,11 +2895,11 @@ def get_annotations_per_frame(project: NotEmptyStr, video: NotEmptyStr, fps: int
28952895
raise AppException(response.errors)
28962896
return response.data
28972897

2898+
28982899
@Trackable
28992900
@validate_arguments
29002901
def upload_priority_scores(project: NotEmptyStr, scores: List[PriorityScore]):
2901-
"""
2902-
Returns per frame annotations for the given video.
2902+
"""Returns per frame annotations for the given video.
29032903
29042904
:param project: project name or folder path (e.g., “project1/folder1”)
29052905
:type project: str
@@ -2912,14 +2912,7 @@ def upload_priority_scores(project: NotEmptyStr, scores: List[PriorityScore]):
29122912
"""
29132913
project_name, folder_name = extract_project_folder(project)
29142914
project_folder_name = project
2915-
use_case = Controller.get_default().upload_priority_scores(project_name, folder_name, scores, project_folder_name)
2916-
logger.info(f"Uploading priority scores for {len(scores)} item(s) from {project_folder_name}.")
2917-
with tqdm(
2918-
total=len(scores), desc="Uploading priority scores"
2919-
) as progress_bar:
2920-
for uploaded_count in use_case.execute():
2921-
progress_bar.update(uploaded_count)
2922-
progress_bar.close()
2923-
if use_case.response.errors:
2924-
raise AppException(use_case.errors)
2925-
return use_case.response.data
2915+
response = Controller.get_default().upload_priority_scores(project_name, folder_name, scores, project_folder_name)
2916+
if response.errors:
2917+
raise AppException(response.errors)
2918+
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
@@ -1234,4 +1234,4 @@ def upload_priority_scores(*args, **kwargs):
12341234
return {
12351235
"event_name": "upload_priority_scores",
12361236
"properties": {"Score Count": len(scores)},
1237-
}
1237+
}

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

@@ -597,19 +597,20 @@ def execute(self):
597597
return self._response
598598

599599

600-
class UploadPriorityScoresUseCase(BaseInteractiveUseCase):
600+
class UploadPriorityScoresUseCase(BaseReportableUseCae):
601601

602602
CHUNK_SIZE = 100
603603

604604
def __init__(
605605
self,
606+
reporter,
606607
project: ProjectEntity,
607608
folder: FolderEntity,
608609
scores: List[PriorityScore],
609610
project_folder_name: str,
610611
backend_service_provider: SuerannotateServiceProvider
611612
):
612-
super().__init__()
613+
super().__init__(reporter)
613614
self._project = project
614615
self._folder = folder
615616
self._scores = scores
@@ -629,29 +630,37 @@ def get_clean_priority(priority):
629630
priority = float(str(float(priority)).split('.')[0] + '.' + str(float(priority)).split('.')[1][:5])
630631
return priority
631632

632-
def execute(self):
633-
priorities = []
634-
to_send = []
635-
for i in self._scores:
636-
priorities.append({
637-
"name": i.name,
638-
"entropy_value": self.get_clean_priority(i.priority)
639-
})
640-
to_send.append(i.name)
641-
642-
uploaded = []
643-
for i in range(0, len(priorities), self.CHUNK_SIZE):
644-
res = self._client.upload_priority_scores(
645-
team_id=self._project.team_id,
646-
project_id=self._project.uuid,
647-
folder_id=self._folder.uuid,
648-
priorities=priorities[i : i + self.CHUNK_SIZE], # noqa: E203
649-
)
650-
uploaded += res["data"]
651-
yield len(to_send[:i + self.CHUNK_SIZE])
633+
@property
634+
def folder_path(self):
635+
return f"{self._project.name}{f'/{self._folder.name}'if self._folder.name != 'root' else ''}"
652636

653-
uploaded = [i["name"] for i in uploaded]
654-
skipped = list(set(to_send) - set(uploaded))
655-
self._response.data = (uploaded, skipped)
637+
def execute(self):
638+
if self.is_valid():
639+
priorities = []
640+
initial_scores = []
641+
for i in self._scores:
642+
priorities.append({
643+
"name": i.name,
644+
"entropy_value": self.get_clean_priority(i.priority)
645+
})
646+
initial_scores.append(i.name)
647+
uploaded_score_names = []
648+
self.reporter.log_info(f"Uploading priority scores for {len(priorities)} item(s) from {self.folder_path}.")
649+
iterations = range(0, len(priorities), self.CHUNK_SIZE)
650+
self.reporter.start_progress(iterations, "Uploading priority scores")
651+
if iterations:
652+
for i in iterations:
653+
priorities_to_upload = priorities[i : i + self.CHUNK_SIZE] # noqa: E203
654+
res = self._client.upload_priority_scores(
655+
team_id=self._project.team_id,
656+
project_id=self._project.uuid,
657+
folder_id=self._folder.uuid,
658+
priorities=priorities_to_upload
659+
)
660+
self.reporter.update_progress(len(priorities_to_upload))
661+
uploaded_score_names.extend(list(map(lambda x: x["name"], res.get("data", []))))
662+
skipped_score_names = list(set(initial_scores) - set(uploaded_score_names))
663+
self._response.data = (uploaded_score_names, skipped_score_names)
664+
else:
665+
self.reporter.warning_messages("Empty scores.")
656666
return self._response
657-

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)