supervisely 6.73.256__py3-none-any.whl → 6.73.258__py3-none-any.whl
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Potentially problematic release.
This version of supervisely might be problematic. Click here for more details.
- supervisely/api/api.py +7 -4
- supervisely/app/widgets/__init__.py +1 -0
- supervisely/app/widgets/bokeh/__init__.py +0 -0
- supervisely/app/widgets/bokeh/bokeh.py +278 -0
- supervisely/app/widgets/bokeh/template.html +2 -0
- supervisely/app/widgets/iframe/iframe.py +2 -0
- supervisely/app/widgets/select_dataset_tree/select_dataset_tree.py +1 -2
- supervisely/project/pointcloud_episode_project.py +14 -3
- supervisely/project/pointcloud_project.py +7 -0
- supervisely/project/project.py +6 -1
- supervisely/project/volume_project.py +9 -0
- {supervisely-6.73.256.dist-info → supervisely-6.73.258.dist-info}/METADATA +1 -1
- {supervisely-6.73.256.dist-info → supervisely-6.73.258.dist-info}/RECORD +17 -14
- {supervisely-6.73.256.dist-info → supervisely-6.73.258.dist-info}/LICENSE +0 -0
- {supervisely-6.73.256.dist-info → supervisely-6.73.258.dist-info}/WHEEL +0 -0
- {supervisely-6.73.256.dist-info → supervisely-6.73.258.dist-info}/entry_points.txt +0 -0
- {supervisely-6.73.256.dist-info → supervisely-6.73.258.dist-info}/top_level.txt +0 -0
supervisely/api/api.py
CHANGED
|
@@ -1631,11 +1631,14 @@ class Api:
|
|
|
1631
1631
|
else:
|
|
1632
1632
|
self._check_https_redirect()
|
|
1633
1633
|
if self.server_address.startswith("https://"):
|
|
1634
|
-
|
|
1635
|
-
|
|
1634
|
+
size = 10
|
|
1635
|
+
if "app.supervise" in self.server_address:
|
|
1636
|
+
size = 7
|
|
1637
|
+
logger.debug(f"Setting global API semaphore size to {size} for HTTPS")
|
|
1636
1638
|
else:
|
|
1637
|
-
|
|
1638
|
-
logger.debug("Setting global API semaphore size to
|
|
1639
|
+
size = 5
|
|
1640
|
+
logger.debug(f"Setting global API semaphore size to {size} for HTTP")
|
|
1641
|
+
self._semaphore = asyncio.Semaphore(size)
|
|
1639
1642
|
|
|
1640
1643
|
def set_semaphore_size(self, size: int = None):
|
|
1641
1644
|
"""
|
|
@@ -148,3 +148,4 @@ from supervisely.app.widgets.select_dataset_tree.select_dataset_tree import Sele
|
|
|
148
148
|
from supervisely.app.widgets.grid_gallery_v2.grid_gallery_v2 import GridGalleryV2
|
|
149
149
|
from supervisely.app.widgets.report_thumbnail.report_thumbnail import ReportThumbnail
|
|
150
150
|
from supervisely.app.widgets.experiment_selector.experiment_selector import ExperimentSelector
|
|
151
|
+
from supervisely.app.widgets.bokeh.bokeh import Bokeh
|
|
File without changes
|
|
@@ -0,0 +1,278 @@
|
|
|
1
|
+
from __future__ import annotations
|
|
2
|
+
|
|
3
|
+
import re
|
|
4
|
+
from abc import ABC, abstractmethod
|
|
5
|
+
from datetime import datetime
|
|
6
|
+
from typing import Any, Callable, Dict, List, Literal, Optional, Union
|
|
7
|
+
|
|
8
|
+
from fastapi.responses import HTMLResponse
|
|
9
|
+
from pydantic import BaseModel
|
|
10
|
+
from supervisely.app.widgets import Widget
|
|
11
|
+
from supervisely._utils import is_production
|
|
12
|
+
from supervisely.io.env import task_id
|
|
13
|
+
from supervisely.api.api import Api
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
class SelectedIds(BaseModel):
|
|
17
|
+
selected_ids: List[Any]
|
|
18
|
+
|
|
19
|
+
|
|
20
|
+
class Bokeh(Widget):
|
|
21
|
+
class Routes:
|
|
22
|
+
VALUE_CHANGED = "value_changed"
|
|
23
|
+
HTML_ROUTE = "bokeh.html"
|
|
24
|
+
|
|
25
|
+
class Plot(ABC):
|
|
26
|
+
@abstractmethod
|
|
27
|
+
def add(self, plot) -> None:
|
|
28
|
+
pass
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
def register(self, route_path: str) -> None:
|
|
32
|
+
pass
|
|
33
|
+
|
|
34
|
+
class Circle(Plot):
|
|
35
|
+
def __init__(
|
|
36
|
+
self,
|
|
37
|
+
x_coordinates: List[Union[int, float]],
|
|
38
|
+
y_coordinates: List[Union[int, float]],
|
|
39
|
+
radii: Optional[Union[Union[int, float], List[Union[int, float]]]] = None,
|
|
40
|
+
colors: Optional[Union[str, List[str]]] = None,
|
|
41
|
+
data: Optional[List[Any]] = None,
|
|
42
|
+
dynamic_selection: bool = False,
|
|
43
|
+
fill_alpha: float = 0.5,
|
|
44
|
+
line_color: Optional[str] = None,
|
|
45
|
+
):
|
|
46
|
+
if not colors:
|
|
47
|
+
colors = Bokeh._generate_colors(x_coordinates, y_coordinates)
|
|
48
|
+
elif isinstance(colors, str):
|
|
49
|
+
colors = [colors] * len(x_coordinates)
|
|
50
|
+
|
|
51
|
+
if not radii:
|
|
52
|
+
radii = Bokeh._generate_radii(x_coordinates, y_coordinates)
|
|
53
|
+
elif isinstance(radii, (int, float)):
|
|
54
|
+
radii = [radii] * len(x_coordinates)
|
|
55
|
+
|
|
56
|
+
if not len(x_coordinates) == len(y_coordinates) == len(radii) == len(colors):
|
|
57
|
+
raise ValueError(
|
|
58
|
+
"x_coordinates, y_coordinates, radii, and colors must have the same length"
|
|
59
|
+
)
|
|
60
|
+
|
|
61
|
+
if data is not None and len(data) != len(x_coordinates):
|
|
62
|
+
raise ValueError("data must have the same length as x_coordinates")
|
|
63
|
+
|
|
64
|
+
if data is None:
|
|
65
|
+
data = list(range(len(x_coordinates)))
|
|
66
|
+
|
|
67
|
+
self._x_coordinates = x_coordinates
|
|
68
|
+
self._y_coordinates = y_coordinates
|
|
69
|
+
self._radii = radii
|
|
70
|
+
self._colors = colors
|
|
71
|
+
self._data = data
|
|
72
|
+
self._source = None
|
|
73
|
+
self._dynamic_selection = dynamic_selection
|
|
74
|
+
self._fill_alpha = fill_alpha
|
|
75
|
+
self._line_color = line_color
|
|
76
|
+
|
|
77
|
+
def add(self, plot) -> None:
|
|
78
|
+
from bokeh.models import ( # pylint: disable=import-error
|
|
79
|
+
ColumnDataSource,
|
|
80
|
+
LassoSelectTool,
|
|
81
|
+
)
|
|
82
|
+
|
|
83
|
+
data = dict(
|
|
84
|
+
x=self._x_coordinates,
|
|
85
|
+
y=self._y_coordinates,
|
|
86
|
+
radius=self._radii,
|
|
87
|
+
colors=self._colors,
|
|
88
|
+
ids=self._data,
|
|
89
|
+
)
|
|
90
|
+
self._source = ColumnDataSource(data=data)
|
|
91
|
+
|
|
92
|
+
renderer = plot.circle(
|
|
93
|
+
"x",
|
|
94
|
+
"y",
|
|
95
|
+
radius="radius",
|
|
96
|
+
fill_color="colors",
|
|
97
|
+
fill_alpha=self._fill_alpha,
|
|
98
|
+
line_color=self._line_color,
|
|
99
|
+
source=self._source,
|
|
100
|
+
)
|
|
101
|
+
if not self._dynamic_selection:
|
|
102
|
+
for tool in plot.tools:
|
|
103
|
+
if isinstance(tool, (LassoSelectTool)):
|
|
104
|
+
tool.continuous = False
|
|
105
|
+
|
|
106
|
+
return renderer
|
|
107
|
+
|
|
108
|
+
def register(self, route_path: str) -> None:
|
|
109
|
+
from bokeh.models import CustomJS # pylint: disable=import-error
|
|
110
|
+
|
|
111
|
+
if not hasattr(self, "_source"):
|
|
112
|
+
raise ValueError("Plot must be added to a Bokeh plot before registering")
|
|
113
|
+
|
|
114
|
+
if is_production():
|
|
115
|
+
api = Api()
|
|
116
|
+
task_info = api.task.get_info_by_id(task_id())
|
|
117
|
+
if task_info is not None:
|
|
118
|
+
route_path = f"/net/{task_info['meta']['sessionToken']}{route_path}"
|
|
119
|
+
callback = CustomJS(
|
|
120
|
+
args=dict(source=self._source),
|
|
121
|
+
code="""
|
|
122
|
+
var indices = source.selected.indices;
|
|
123
|
+
var selected_ids = [];
|
|
124
|
+
for (var i = 0; i < indices.length; i++) {{
|
|
125
|
+
selected_ids.push(source.data['ids'][indices[i]]);
|
|
126
|
+
}}
|
|
127
|
+
var xhr = new XMLHttpRequest();
|
|
128
|
+
xhr.open("POST", "{route_path}", true);
|
|
129
|
+
xhr.setRequestHeader("Content-Type", "application/json");
|
|
130
|
+
xhr.send(JSON.stringify({{selected_ids: selected_ids}}));
|
|
131
|
+
""".format(
|
|
132
|
+
route_path=route_path
|
|
133
|
+
),
|
|
134
|
+
)
|
|
135
|
+
self._source.selected.js_on_change("indices", callback)
|
|
136
|
+
|
|
137
|
+
def __init__(
|
|
138
|
+
self,
|
|
139
|
+
plots: List[Plot],
|
|
140
|
+
width: int = 1000,
|
|
141
|
+
height: int = 600,
|
|
142
|
+
tools: List[str] = [
|
|
143
|
+
"pan",
|
|
144
|
+
"wheel_zoom",
|
|
145
|
+
"box_zoom",
|
|
146
|
+
"reset",
|
|
147
|
+
"save",
|
|
148
|
+
"poly_select",
|
|
149
|
+
"tap",
|
|
150
|
+
"lasso_select",
|
|
151
|
+
],
|
|
152
|
+
toolbar_location: Literal["above", "below", "left", "right"] = "above",
|
|
153
|
+
x_axis_visible: bool = False,
|
|
154
|
+
y_axis_visible: bool = False,
|
|
155
|
+
grid_visible: bool = False,
|
|
156
|
+
widget_id: Optional[str] = None,
|
|
157
|
+
**kwargs,
|
|
158
|
+
):
|
|
159
|
+
from bokeh.plotting import figure # pylint: disable=import-error
|
|
160
|
+
|
|
161
|
+
self.widget_id = widget_id
|
|
162
|
+
self._plots = plots
|
|
163
|
+
self._plot = figure(width=width, height=height, tools=tools, toolbar_location="above")
|
|
164
|
+
self._renderers = []
|
|
165
|
+
|
|
166
|
+
self._plot.xaxis.visible = x_axis_visible
|
|
167
|
+
self._plot.yaxis.visible = y_axis_visible
|
|
168
|
+
self._plot.grid.visible = grid_visible
|
|
169
|
+
super().__init__(widget_id=widget_id, file_path=__file__)
|
|
170
|
+
|
|
171
|
+
self._process_plots(plots)
|
|
172
|
+
self._update_html()
|
|
173
|
+
|
|
174
|
+
server = self._sly_app.get_server()
|
|
175
|
+
|
|
176
|
+
@server.get(self.html_route)
|
|
177
|
+
def _html_response() -> None:
|
|
178
|
+
return HTMLResponse(content=self.get_html())
|
|
179
|
+
|
|
180
|
+
# JinjaWidgets().context.pop(self.widget_id, None) # remove the widget from index.html
|
|
181
|
+
|
|
182
|
+
@property
|
|
183
|
+
def route_path(self) -> str:
|
|
184
|
+
return self.get_route_path(Bokeh.Routes.VALUE_CHANGED)
|
|
185
|
+
|
|
186
|
+
@property
|
|
187
|
+
def html_route(self) -> str:
|
|
188
|
+
return self.get_route_path(Bokeh.Routes.HTML_ROUTE)
|
|
189
|
+
|
|
190
|
+
@property
|
|
191
|
+
def html_route_with_timestamp(self) -> str:
|
|
192
|
+
return f".{self.html_route}?t={datetime.now().timestamp()}"
|
|
193
|
+
|
|
194
|
+
def add_plots(self, plots: List[Plot]) -> None:
|
|
195
|
+
self._plots.extend(plots)
|
|
196
|
+
self._process_plots(plots)
|
|
197
|
+
self._update_html()
|
|
198
|
+
|
|
199
|
+
def clear(self) -> None:
|
|
200
|
+
self._plots = []
|
|
201
|
+
self._renderers = []
|
|
202
|
+
self._plot.renderers = []
|
|
203
|
+
self._update_html()
|
|
204
|
+
|
|
205
|
+
def remove_plot(self, idx: int) -> None:
|
|
206
|
+
renderer = self._renderers.pop(idx)
|
|
207
|
+
self._plot.renderers.remove(renderer)
|
|
208
|
+
self._update_html()
|
|
209
|
+
|
|
210
|
+
def _process_plots(self, plots: List[Plot]) -> None:
|
|
211
|
+
for plot in plots:
|
|
212
|
+
renderer = plot.add(self._plot)
|
|
213
|
+
plot.register(self.route_path)
|
|
214
|
+
self._renderers.append(renderer)
|
|
215
|
+
|
|
216
|
+
def _update_html(self) -> None:
|
|
217
|
+
from bokeh.embed import components # pylint: disable=import-error
|
|
218
|
+
|
|
219
|
+
script, self._div = components(self._plot, wrap_script=False)
|
|
220
|
+
self._div_id = self._get_div_id(self._div)
|
|
221
|
+
self._script = self._update_script(script)
|
|
222
|
+
|
|
223
|
+
@staticmethod
|
|
224
|
+
def _generate_colors(x_coordinates: List[int], y_coordinates: List[int]) -> List[str]:
|
|
225
|
+
colors = [
|
|
226
|
+
"#%02x%02x%02x" % (int(r), int(g), 150)
|
|
227
|
+
for r, g in zip(
|
|
228
|
+
[50 + 2 * xi for xi in x_coordinates], [30 + 2 * yi for yi in y_coordinates]
|
|
229
|
+
)
|
|
230
|
+
]
|
|
231
|
+
return colors
|
|
232
|
+
|
|
233
|
+
@staticmethod
|
|
234
|
+
def _generate_radii(x_coordinates: List[int], y_coordinates: List[int]) -> List[int]:
|
|
235
|
+
return [1] * len(x_coordinates)
|
|
236
|
+
|
|
237
|
+
def _get_div_id(self, div: str) -> str:
|
|
238
|
+
match = re.search(r'id="([^"]+)"', div)
|
|
239
|
+
if match:
|
|
240
|
+
return match.group(1)
|
|
241
|
+
raise ValueError(f"No div id found in {div}")
|
|
242
|
+
|
|
243
|
+
def _update_script(self, script: str) -> str:
|
|
244
|
+
# TODO: Reimplement using regex.
|
|
245
|
+
insert_after = "const fn = function() {"
|
|
246
|
+
updated_script = ""
|
|
247
|
+
for line in script.split("\n"):
|
|
248
|
+
if line.strip().startswith(insert_after):
|
|
249
|
+
line = line + f"\n const el = document.querySelector('#{self._div_id}');"
|
|
250
|
+
line += "\n if (el === null) {"
|
|
251
|
+
line += "\n setTimeout(fn, 500);"
|
|
252
|
+
line += "\n return;"
|
|
253
|
+
line += "\n }"
|
|
254
|
+
updated_script += line + "\n"
|
|
255
|
+
return updated_script
|
|
256
|
+
|
|
257
|
+
def get_json_data(self):
|
|
258
|
+
return {}
|
|
259
|
+
|
|
260
|
+
def get_json_state(self):
|
|
261
|
+
return {}
|
|
262
|
+
|
|
263
|
+
def value_changed(self, func: Callable) -> Callable:
|
|
264
|
+
server = self._sly_app.get_server()
|
|
265
|
+
self._changes_handled = True
|
|
266
|
+
|
|
267
|
+
@server.post(self.route_path)
|
|
268
|
+
def _click(selected_ids: SelectedIds) -> None:
|
|
269
|
+
func(selected_ids.selected_ids)
|
|
270
|
+
|
|
271
|
+
return _click
|
|
272
|
+
|
|
273
|
+
def get_html(self) -> str:
|
|
274
|
+
return f"""<div>
|
|
275
|
+
<script type="text/javascript" src="https://cdn.bokeh.org/bokeh/release/bokeh-3.1.1.min.js"></script>
|
|
276
|
+
<script type="text/javascript"> {self._script} </script>
|
|
277
|
+
{self._div}
|
|
278
|
+
</div>"""
|
|
@@ -56,6 +56,8 @@ class IFrame(Widget):
|
|
|
56
56
|
height: Optional[Union[int, str]] = None,
|
|
57
57
|
width: Optional[Union[int, str]] = None,
|
|
58
58
|
):
|
|
59
|
+
height = height or self._height
|
|
60
|
+
width = width or self._width
|
|
59
61
|
self._update(path_to_html=path_to_html, height=height, width=width)
|
|
60
62
|
|
|
61
63
|
def clean_up(self):
|
|
@@ -120,6 +120,7 @@ class SelectDatasetTree(Widget):
|
|
|
120
120
|
|
|
121
121
|
# Extract values from Enum to match the .type property of the ProjectInfo object.
|
|
122
122
|
|
|
123
|
+
self._project_types = None
|
|
123
124
|
if allowed_project_types is not None:
|
|
124
125
|
if all(allowed_project_types) is isinstance(allowed_project_types, ProjectType):
|
|
125
126
|
self._project_types = (
|
|
@@ -129,8 +130,6 @@ class SelectDatasetTree(Widget):
|
|
|
129
130
|
)
|
|
130
131
|
elif all(allowed_project_types) is isinstance(allowed_project_types, str):
|
|
131
132
|
self._project_types = allowed_project_types
|
|
132
|
-
else:
|
|
133
|
-
self._project_types = None
|
|
134
133
|
|
|
135
134
|
# Widget components.
|
|
136
135
|
self._select_team = None
|
|
@@ -31,6 +31,9 @@ from supervisely.video_annotation.frame import Frame
|
|
|
31
31
|
from supervisely.video_annotation.key_id_map import KeyIdMap
|
|
32
32
|
|
|
33
33
|
|
|
34
|
+
KITTI_ITEM_DIR_NAME = "velodyne"
|
|
35
|
+
|
|
36
|
+
|
|
34
37
|
class EpisodeItemPaths(NamedTuple):
|
|
35
38
|
#: :class:`str`: Full pointcloud file path of item
|
|
36
39
|
pointcloud_path: str
|
|
@@ -153,9 +156,10 @@ class PointcloudEpisodeDataset(PointcloudDataset):
|
|
|
153
156
|
|
|
154
157
|
def _read(self):
|
|
155
158
|
if not dir_exists(self.item_dir):
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
+
message = f"Cannot read dataset '{self.name}': '{self.item_dir}' directory not found"
|
|
160
|
+
if dir_exists(os.path.join(self.directory, KITTI_ITEM_DIR_NAME)):
|
|
161
|
+
message = f"Cannot read dataset '{self.name}'. The item directory '{KITTI_ITEM_DIR_NAME}' was found. This appears to be a KITTI dataset and will be skipped."
|
|
162
|
+
raise NotADirectoryError(message)
|
|
159
163
|
|
|
160
164
|
try:
|
|
161
165
|
item_paths = sorted(list_files(self.item_dir, filter_fn=self._has_valid_ext))
|
|
@@ -504,6 +508,7 @@ class PointcloudEpisodeProject(PointcloudProject):
|
|
|
504
508
|
batch_size: Optional[int] = 10,
|
|
505
509
|
log_progress: bool = True,
|
|
506
510
|
progress_cb: Optional[Union[tqdm, Callable]] = None,
|
|
511
|
+
**kwargs,
|
|
507
512
|
) -> None:
|
|
508
513
|
"""
|
|
509
514
|
Download pointcloud episodes project from Supervisely to the given directory.
|
|
@@ -626,6 +631,12 @@ class PointcloudEpisodeProject(PointcloudProject):
|
|
|
626
631
|
progress_cb=progress_cb,
|
|
627
632
|
)
|
|
628
633
|
|
|
634
|
+
@staticmethod
|
|
635
|
+
async def download_async(*args, **kwargs):
|
|
636
|
+
raise NotImplementedError(
|
|
637
|
+
f"Static method 'download_async()' is not supported for PointcloudEpisodeProject class now."
|
|
638
|
+
)
|
|
639
|
+
|
|
629
640
|
|
|
630
641
|
def download_pointcloud_episode_project(
|
|
631
642
|
api: Api,
|
|
@@ -737,6 +737,7 @@ class PointcloudProject(VideoProject):
|
|
|
737
737
|
batch_size: Optional[int] = 10,
|
|
738
738
|
log_progress: bool = True,
|
|
739
739
|
progress_cb: Optional[Union[tqdm, Callable]] = None,
|
|
740
|
+
**kwargs,
|
|
740
741
|
) -> PointcloudProject:
|
|
741
742
|
"""
|
|
742
743
|
Download pointcloud project from Supervisely to the given directory.
|
|
@@ -858,6 +859,12 @@ class PointcloudProject(VideoProject):
|
|
|
858
859
|
progress_cb=progress_cb,
|
|
859
860
|
)
|
|
860
861
|
|
|
862
|
+
@staticmethod
|
|
863
|
+
async def download_async(*args, **kwargs):
|
|
864
|
+
raise NotImplementedError(
|
|
865
|
+
f"Static method 'download_async()' is not supported for PointcloudProject class now."
|
|
866
|
+
)
|
|
867
|
+
|
|
861
868
|
|
|
862
869
|
def download_pointcloud_project(
|
|
863
870
|
api: Api,
|
supervisely/project/project.py
CHANGED
|
@@ -2091,7 +2091,12 @@ class Project:
|
|
|
2091
2091
|
OpenMode.READ,
|
|
2092
2092
|
parents=parents,
|
|
2093
2093
|
)
|
|
2094
|
-
|
|
2094
|
+
if current_dataset.name not in self._datasets._collection:
|
|
2095
|
+
self._datasets = self._datasets.add(current_dataset)
|
|
2096
|
+
else:
|
|
2097
|
+
logger.debug(
|
|
2098
|
+
f"Dataset '{current_dataset.name}' already exists in project '{self.name}'. Skip adding to collection."
|
|
2099
|
+
)
|
|
2095
2100
|
except Exception as ex:
|
|
2096
2101
|
logger.warning(ex)
|
|
2097
2102
|
|
|
@@ -33,7 +33,9 @@ VolumeItemPaths = namedtuple("VolumeItemPaths", ["volume_path", "ann_path"])
|
|
|
33
33
|
class VolumeDataset(VideoDataset):
|
|
34
34
|
item_dir_name = "volume"
|
|
35
35
|
interpolation_dir = "interpolation"
|
|
36
|
+
interpolation_dir_name = interpolation_dir
|
|
36
37
|
mask_dir = "mask"
|
|
38
|
+
mask_dir_name = mask_dir
|
|
37
39
|
annotation_class = VolumeAnnotation
|
|
38
40
|
item_module = sly_volume
|
|
39
41
|
paths_tuple = VolumeItemPaths
|
|
@@ -147,6 +149,7 @@ class VolumeProject(VideoProject):
|
|
|
147
149
|
download_volumes: Optional[bool] = True,
|
|
148
150
|
log_progress: bool = False,
|
|
149
151
|
progress_cb: Optional[Union[tqdm, Callable]] = None,
|
|
152
|
+
**kwargs,
|
|
150
153
|
) -> None:
|
|
151
154
|
"""
|
|
152
155
|
Download volume project from Supervisely to the given directory.
|
|
@@ -297,6 +300,12 @@ class VolumeProject(VideoProject):
|
|
|
297
300
|
f"Static method 'get_train_val_splits_by_tag()' is not supported for VolumeProject class now."
|
|
298
301
|
)
|
|
299
302
|
|
|
303
|
+
@staticmethod
|
|
304
|
+
async def download_async(*args, **kwargs):
|
|
305
|
+
raise NotImplementedError(
|
|
306
|
+
f"Static method 'download_async()' is not supported for VolumeProject class now."
|
|
307
|
+
)
|
|
308
|
+
|
|
300
309
|
|
|
301
310
|
def download_volume_project(
|
|
302
311
|
api: Api,
|
|
@@ -22,7 +22,7 @@ supervisely/api/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
|
22
22
|
supervisely/api/advanced_api.py,sha256=Nd5cCnHFWc3PSUrCtENxTGtDjS37_lCHXsgXvUI3Ti8,2054
|
|
23
23
|
supervisely/api/agent_api.py,sha256=ShWAIlXcWXcyI9fqVuP5GZVCigCMJmjnvdGUfLspD6Y,8890
|
|
24
24
|
supervisely/api/annotation_api.py,sha256=kB9l0NhQEkunGDC9fWjNzf5DdhqRF1tv-RRnIbkV2k0,64941
|
|
25
|
-
supervisely/api/api.py,sha256=
|
|
25
|
+
supervisely/api/api.py,sha256=0dgPx_eizoCEFzfT8YH9uh1kq-OJwjrV5fBGD7uZ7E4,65840
|
|
26
26
|
supervisely/api/app_api.py,sha256=-T4sISQ7POyR2yirf1kEWj4JaJFpJxCyRWqbf_99Jak,67036
|
|
27
27
|
supervisely/api/dataset_api.py,sha256=eovT6l62jgjlRyCZ6IvoudUBfDxv9Hjj3Ap8IuCLd7I,41290
|
|
28
28
|
supervisely/api/file_api.py,sha256=7yWt8lRQ4UfLmnMZ9T18UXzu8jihrtHtcqi6GZJG-0w,83414
|
|
@@ -110,7 +110,7 @@ supervisely/app/v1/widgets/grid_gallery.py,sha256=hEMC0MNfZ4xG2N118Mou_hptLhrikg
|
|
|
110
110
|
supervisely/app/v1/widgets/predictions_dynamics_gallery.py,sha256=l6Ee8-c14yeSnlu4qFsLbmZ5Su63zacO3wmdtH86TMM,8079
|
|
111
111
|
supervisely/app/v1/widgets/progress_bar.py,sha256=8gvQbAUHXPU8_JgC0JZkEBSRCccvg2l4Gtg8DeBCgC8,3184
|
|
112
112
|
supervisely/app/v1/widgets/single_image_gallery.py,sha256=fyuC4jfCHC5rNL1JrHJCE8NaneH0nv0k-0iVkOnY0Wc,2958
|
|
113
|
-
supervisely/app/widgets/__init__.py,sha256=
|
|
113
|
+
supervisely/app/widgets/__init__.py,sha256=ilrM0pr7RVbw05cvke4dnXYXsDAKSod9ZcUb7lc-2Ps,10101
|
|
114
114
|
supervisely/app/widgets/select_sly_utils.py,sha256=gBenYkJyCl3Fa4u2GI6BKXul-AqnzvGK32Y6hxXKccA,288
|
|
115
115
|
supervisely/app/widgets/widget.py,sha256=e9tyZj7XhqDWiN5Wwk2xScXOmf__vRCoHflpGtv1RS0,9820
|
|
116
116
|
supervisely/app/widgets/agent_selector/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -128,6 +128,9 @@ supervisely/app/widgets/badge/template.html,sha256=B77SyKHTaoIPrvjJtAxQfBzCs7Y8v
|
|
|
128
128
|
supervisely/app/widgets/binded_input_number/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
129
129
|
supervisely/app/widgets/binded_input_number/binded_input_number.py,sha256=RXTAGaMXtGOl4pprVLyQosr61t2rI_U_U8VNHhSyBhA,6251
|
|
130
130
|
supervisely/app/widgets/binded_input_number/template.html,sha256=uCEZ54BNC2itr39wxxThXw62WlJ9659cuz8osCm0WZE,162
|
|
131
|
+
supervisely/app/widgets/bokeh/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
132
|
+
supervisely/app/widgets/bokeh/bokeh.py,sha256=9s9Vx8f-NI-2hr9xjuYapFMsZkFF_n65WAWeMXgqTWY,9563
|
|
133
|
+
supervisely/app/widgets/bokeh/template.html,sha256=ntsh7xx4q9OHG62sa_r3INDxsXgvdPFIWTtYaWn_0t8,12
|
|
131
134
|
supervisely/app/widgets/button/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
132
135
|
supervisely/app/widgets/button/button.py,sha256=zDQinhOOjNNxdP2GIFrwTmVfGAeJJoKV6CT6C8KzQNI,10405
|
|
133
136
|
supervisely/app/widgets/button/style.css,sha256=ya4kKrQGwVhVtBydftudgjPpDdN3rcUvKSlrY-2h1Kw,93
|
|
@@ -299,7 +302,7 @@ supervisely/app/widgets/identity/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRk
|
|
|
299
302
|
supervisely/app/widgets/identity/identity.py,sha256=a_JihO_iXGILBfB4WVKvMPqywS9kmheO6c_f2YtaKok,328
|
|
300
303
|
supervisely/app/widgets/identity/template.html,sha256=stmCHZRUnUMu1b6ocPHtRsJ48JmX5yCZIuROPISvlJM,33
|
|
301
304
|
supervisely/app/widgets/iframe/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
302
|
-
supervisely/app/widgets/iframe/iframe.py,sha256=
|
|
305
|
+
supervisely/app/widgets/iframe/iframe.py,sha256=9D18tg2DpTix7ZBG6uS8Qff_1i-ArRFsLYvesICVYSo,2806
|
|
303
306
|
supervisely/app/widgets/iframe/template.html,sha256=5JFK7OY2zfvd9MxLRqBVq1RjWlQ9vHud_Ylk2tG_0yk,268
|
|
304
307
|
supervisely/app/widgets/image/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
305
308
|
supervisely/app/widgets/image/image.py,sha256=PJYzWfFAfMSnfuoAxJZ51n1blWLsimBwRT3UWDnkKFc,2592
|
|
@@ -433,7 +436,7 @@ supervisely/app/widgets/select_dataset/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JC
|
|
|
433
436
|
supervisely/app/widgets/select_dataset/select_dataset.py,sha256=2bltbJ70plGFoF8mpLxAU2huVBce8D6CsCcX9wxO5KU,9713
|
|
434
437
|
supervisely/app/widgets/select_dataset/template.html,sha256=7O_ZgmRs0vOL8tng6QvYbI_0o6A4yMAPB2MlfzWHeHQ,984
|
|
435
438
|
supervisely/app/widgets/select_dataset_tree/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
436
|
-
supervisely/app/widgets/select_dataset_tree/select_dataset_tree.py,sha256=
|
|
439
|
+
supervisely/app/widgets/select_dataset_tree/select_dataset_tree.py,sha256=abFPT8MJv6a7oPZzwCvak6q4HB72ijpW7axJHjoJvH0,22319
|
|
437
440
|
supervisely/app/widgets/select_dataset_tree/template.html,sha256=_uvKCMP0nkpSl3FiTUxqy10JZw3q8-9hXCv22W3BDF0,38
|
|
438
441
|
supervisely/app/widgets/select_item/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
439
442
|
supervisely/app/widgets/select_item/select_item.py,sha256=dcB0UN46rn3nFQybgrGpLRfwB6xnPo-GGrv9rsMeCbA,3833
|
|
@@ -990,16 +993,16 @@ supervisely/pointcloud_episodes/pointcloud_episodes.py,sha256=cRXdtw7bMsbsdVQjxf
|
|
|
990
993
|
supervisely/project/__init__.py,sha256=hlzdj9Pgy53Q3qdP8LMtGTChvZHQuuShdtui2eRUQeE,2601
|
|
991
994
|
supervisely/project/data_version.py,sha256=nknaWJSUCwoDyNG9_d1KA-GjzidhV9zd9Cn8cg15DOU,19270
|
|
992
995
|
supervisely/project/download.py,sha256=zb8sb4XZ6Qi3CP7fmtLRUAYzaxs_W0WnOfe2x3ZVRMs,24639
|
|
993
|
-
supervisely/project/pointcloud_episode_project.py,sha256=
|
|
994
|
-
supervisely/project/pointcloud_project.py,sha256=
|
|
995
|
-
supervisely/project/project.py,sha256=
|
|
996
|
+
supervisely/project/pointcloud_episode_project.py,sha256=yiWdNBQiI6f1O9sr1pg8JHW6O-w3XUB1rikJNn3Oung,41866
|
|
997
|
+
supervisely/project/pointcloud_project.py,sha256=Kx1Vaes-krwG3BiRRtHRLQxb9G5m5bTHPN9IzRqmNWo,49399
|
|
998
|
+
supervisely/project/project.py,sha256=bC6qY1M93pa7kzxOxOuSbCTkzIKXfiKO-ecJrbAX_Ag,188673
|
|
996
999
|
supervisely/project/project_meta.py,sha256=26s8IiHC5Pg8B1AQi6_CrsWteioJP2in00cRNe8QlW0,51423
|
|
997
1000
|
supervisely/project/project_settings.py,sha256=NLThzU_DCynOK6hkHhVdFyezwprn9UqlnrLDe_3qhkY,9347
|
|
998
1001
|
supervisely/project/project_type.py,sha256=_3RqW2CnDBKFOvSIrQT1RJQaiHirs34_jiQS8CkwCpo,530
|
|
999
1002
|
supervisely/project/readme_template.md,sha256=rGmSLRVUSGjvorjpzl0sZ7YA4sKfDexl95NFtMISj3I,9128
|
|
1000
1003
|
supervisely/project/upload.py,sha256=AjgHYgVZwUE25ygC5pqvFjdAladbyB8T78mlet5Qpho,3750
|
|
1001
1004
|
supervisely/project/video_project.py,sha256=8fJeicVWNMbek24PmNRBtbnFhvXsnxPg5dpNrL5VNW4,63739
|
|
1002
|
-
supervisely/project/volume_project.py,sha256=
|
|
1005
|
+
supervisely/project/volume_project.py,sha256=Kn9VEvWuKKZvL2nx6B6bjSvHuoZhAOxEc6DvPRexUco,22666
|
|
1003
1006
|
supervisely/pyscripts_utils/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
1004
1007
|
supervisely/pyscripts_utils/utils.py,sha256=scEwHJvHRQa8NHIOn2eTwH6-Zc8CGdLoxM-WzH9jcRo,314
|
|
1005
1008
|
supervisely/report/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
|
@@ -1054,9 +1057,9 @@ supervisely/worker_proto/__init__.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZ
|
|
|
1054
1057
|
supervisely/worker_proto/worker_api_pb2.py,sha256=VQfi5JRBHs2pFCK1snec3JECgGnua3Xjqw_-b3aFxuM,59142
|
|
1055
1058
|
supervisely/worker_proto/worker_api_pb2_grpc.py,sha256=3BwQXOaP9qpdi0Dt9EKG--Lm8KGN0C5AgmUfRv77_Jk,28940
|
|
1056
1059
|
supervisely_lib/__init__.py,sha256=7-3QnN8Zf0wj8NCr2oJmqoQWMKKPKTECvjH9pd2S5vY,159
|
|
1057
|
-
supervisely-6.73.
|
|
1058
|
-
supervisely-6.73.
|
|
1059
|
-
supervisely-6.73.
|
|
1060
|
-
supervisely-6.73.
|
|
1061
|
-
supervisely-6.73.
|
|
1062
|
-
supervisely-6.73.
|
|
1060
|
+
supervisely-6.73.258.dist-info/LICENSE,sha256=xx0jnfkXJvxRnG63LTGOxlggYnIysveWIZ6H3PNdCrQ,11357
|
|
1061
|
+
supervisely-6.73.258.dist-info/METADATA,sha256=uPJIk_UXG49MKoa1f7pszlICBQGZ7qLTvgTUC0aLbJk,33573
|
|
1062
|
+
supervisely-6.73.258.dist-info/WHEEL,sha256=P9jw-gEje8ByB7_hXoICnHtVCrEwMQh-630tKvQWehc,91
|
|
1063
|
+
supervisely-6.73.258.dist-info/entry_points.txt,sha256=U96-5Hxrp2ApRjnCoUiUhWMqijqh8zLR03sEhWtAcms,102
|
|
1064
|
+
supervisely-6.73.258.dist-info/top_level.txt,sha256=kcFVwb7SXtfqZifrZaSE3owHExX4gcNYe7Q2uoby084,28
|
|
1065
|
+
supervisely-6.73.258.dist-info/RECORD,,
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|