Skip to content

Commit 800e8f9

Browse files
authored
Merge pull request #228 from roboflow/ordered-uploading
ordered-uploading
2 parents 8daa6de + 481af6a commit 800e8f9

File tree

6 files changed

+40
-5
lines changed

6 files changed

+40
-5
lines changed

roboflow/__init__.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
from roboflow.models import CLIPModel, GazeModel # noqa: F401
1515
from roboflow.util.general import write_line
1616

17-
__version__ = "1.1.18"
17+
__version__ = "1.1.19"
1818

1919

2020
def check_key(api_key, model, notebook, num_retries=0):

roboflow/adapters/rfapi.py

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,8 @@ def upload_image(
4343
split: str = "train",
4444
batch_name: str = DEFAULT_BATCH_NAME,
4545
tag_names: list = [],
46+
sequence_number: int = None,
47+
sequence_size: int = None,
4648
**kwargs,
4749
):
4850
"""
@@ -60,7 +62,9 @@ def upload_image(
6062
image_name = os.path.basename(image_path)
6163
imgjpeg = image_utils.file2jpeg(image_path)
6264

63-
upload_url = _local_upload_url(api_key, project_url, batch_name, tag_names, kwargs)
65+
upload_url = _local_upload_url(
66+
api_key, project_url, batch_name, tag_names, sequence_number, sequence_size, kwargs
67+
)
6468
m = MultipartEncoder(
6569
fields={
6670
"name": image_name,
@@ -155,8 +159,10 @@ def _hosted_upload_url(api_key, project_url, image_path, split):
155159
return url
156160

157161

158-
def _local_upload_url(api_key, project_url, batch_name, tag_names, kwargs):
159-
url = f"{API_URL}/dataset/{project_url}/upload?api_key={api_key}" f"&batch={batch_name}"
162+
def _local_upload_url(api_key, project_url, batch_name, tag_names, sequence_number, sequence_size, kwargs):
163+
url = f"{API_URL}/dataset/{project_url}/upload?api_key={api_key}&batch={batch_name}"
164+
if sequence_number is not None and sequence_size is not None:
165+
url += f"&sequence_number={sequence_number}&sequence_size={sequence_size}"
160166
for key, value in kwargs.items():
161167
url += f"&{str(key)}={str(value)}"
162168
for tag in tag_names:

roboflow/core/project.py

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -458,6 +458,8 @@ def single_upload(
458458
tag_names=[],
459459
is_prediction: bool = False,
460460
annotation_overwrite=False,
461+
sequence_number=None,
462+
sequence_size=None,
461463
**kwargs,
462464
):
463465
project_url = self.id.rsplit("/")[1]
@@ -480,6 +482,8 @@ def single_upload(
480482
split=split,
481483
batch_name=batch_name,
482484
tag_names=tag_names,
485+
sequence_number=sequence_number,
486+
sequence_size=sequence_size,
483487
**kwargs,
484488
)
485489
image_id = uploaded_image["id"]

roboflow/core/workspace.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,8 @@ def _upload_image(imagedesc):
359359
annotation_path=annotation_path,
360360
annotation_labelmap=labelmap,
361361
split=split,
362+
sequence_number=imagedesc.get("index"),
363+
sequence_size=len(images),
362364
)
363365
_log_img_upload(image_path, uploadres)
364366
except Exception as e:

roboflow/util/folderparser.py

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
import os
2+
import re
23

34
from .image_utils import load_labelmap
45

@@ -24,15 +25,35 @@ def parsefolder(folder):
2425
}
2526

2627

28+
def _alphanumkey(s):
29+
s = os.path.splitext(s)[0]
30+
# Split the string into two parts: all characters before the last digit sequence, and the last digit sequence
31+
match = re.match(r"(.*?)(\d*)$", s)
32+
if match:
33+
alpha_part = match.group(1)
34+
num_part = match.group(2)
35+
num_part = int(num_part) if num_part else 0
36+
return (alpha_part, num_part)
37+
else:
38+
return (s, 0)
39+
40+
2741
def _list_files(folder):
2842
filedescriptors = []
2943
for root, dirs, files in os.walk(folder):
3044
for file in files:
3145
file_path = os.path.join(root, file)
3246
filedescriptors.append(_describe_file(file_path.split(folder)[1]))
47+
filedescriptors = sorted(filedescriptors, key=lambda x: _alphanumkey(x["file"]))
48+
_add_indices(filedescriptors)
3349
return filedescriptors
3450

3551

52+
def _add_indices(files):
53+
for i, f in enumerate(files):
54+
f["index"] = i
55+
56+
3657
def _describe_file(f):
3758
name = f.split("/")[-1]
3859
dirname = os.path.dirname(f)

tests/manual/debugme.py

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -22,13 +22,15 @@
2222
# "project get cultura-pepino-dark".split()
2323
# "workspace list".split()
2424
# "workspace get wolfodorpythontests".split()
25-
f"infer -w jacob-solawetz -m rock-paper-scissors-slim/5 -c .01 {thisdir}/data/scissors.png".split() # noqa: E501 // docs
25+
# f"infer -w jacob-solawetz -m rock-paper-scissors-slim/5 -c .01 {thisdir}/data/scissors.png".split() # noqa: E501 // docs
2626
# f"infer -w roboflow-6tyri -m usa-states/3 -c .94 -t instance-segmentation {thisdir}/data/unitedstates.jpg".split() # noqa: E501 // docs
2727
# f"infer -w naumov-igor-segmentation -m car-segmetarion/2 -t semantic-segmentation {thisdir}/data/car.jpg".split() # noqa: E501 // docs
2828
# f"import {thisdir}/data/cultura-pepino-voc -w wolfodorpythontests -p cultura-pepino-voc -f auto -c 50".split() # noqa: E501 // docs
2929
# f"import {thisdir}/data/cultura-pepino-darknet -w wolfodorpythontests -p cultura-pepino-darknet -f auto -c 100".split() # noqa: E501 // docs
3030
# f"import {thisdir}/data/0311fisheye -w wolfodorpythontests -p 0311fisheye -f auto -c 50".split() # noqa: E501 // docs
3131
# f"upload {thisdir}/data/cultura-pepino-darknet/train/10_jpg.rf.2b3a401b0ffd8482e52137ad22faa14f.jpg -a {thisdir}/data/cultura-pepino-darknet/train/10_jpg.rf.2b3a401b0ffd8482e52137ad22faa14f.txt -m {thisdir}/data/cultura-pepino-darknet/train/_darknet.labels -w wolfodorpythontests -p cultura-pepino-darknet -r 3".split() # noqa: E501 // docs
32+
# f"upload -p ordered-uploading {thisdir}/data/ordered-upload/1.jpg".split()
33+
f"import -p ordered-uploading {thisdir}/data/ordered-upload".split()
3234
# f" {thisdir}/data/cultura-pepino-darknet -w wolfodorpythontests -p cultura-pepino-darknet -f auto -c 100".split() # noqa: E501 // docs
3335
)
3436
args.func(args)

0 commit comments

Comments
 (0)