Skip to content

Commit 4a1eca8

Browse files
committed
Add progress callback to search_images
1 parent b496d44 commit 4a1eca8

3 files changed

Lines changed: 61 additions & 5 deletions

File tree

abraia/training/dataset.py

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -85,7 +85,7 @@ def search_google(query):
8585
yield link
8686

8787

88-
def download(query, limit=100, save_output='dataset', verbose=True):
88+
def download(query, limit=100, save_output='dataset', verbose=True, callback=None):
8989
seen = set()
9090
download_count = 0
9191
os.makedirs(save_output, exist_ok=True)
@@ -102,6 +102,8 @@ def download(query, limit=100, save_output='dataset', verbose=True):
102102
download_count += 1
103103
if verbose:
104104
print(f"[%] Downloaded Image #{download_count} from {link}")
105+
if callback:
106+
callback({'current': download_count, 'total': limit})
105107
except Exception as e:
106108
print(f"[!] Error getting {link}: {e}")
107109
else:
@@ -112,9 +114,9 @@ def download(query, limit=100, save_output='dataset', verbose=True):
112114
break
113115

114116

115-
def search_images(query, limit=100, save_output='dataset', verbose=True):
117+
def search_images(query, limit=100, save_output='dataset', verbose=True, callback=None):
116118
"""Search and download images from Google and Bing."""
117-
download(query, limit=limit, save_output=save_output, verbose=verbose)
119+
download(query, limit=limit, save_output=save_output, verbose=verbose, callback=callback)
118120
return list_dir(save_output)
119121

120122

abraia/training/ops.py

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import numpy as np
2+
3+
4+
def train_test_split(*arrays, test_size=None, train_size=None, random_state=None, shuffle=True, stratify=None):
5+
"""Split arrays or matrices into random train and test subsets"""
6+
if random_state is not None:
7+
np.random.seed(random_state)
8+
n_samples = len(arrays[0])
9+
if test_size is None and train_size is None:
10+
test_size = 0.25
11+
if train_size is not None:
12+
n_train = int(train_size * n_samples) if isinstance(train_size, float) else train_size
13+
n_test = n_samples - n_train
14+
else:
15+
n_test = int(test_size * n_samples) if isinstance(test_size, float) else test_size
16+
n_train = n_samples - n_test
17+
indices = np.arange(n_samples)
18+
if shuffle:
19+
if stratify is not None:
20+
unique_classes, class_indices = np.unique(stratify, return_inverse=True)
21+
train_indices, test_indices = [], []
22+
for i in range(len(unique_classes)):
23+
cls_indices = indices[class_indices == i]
24+
np.random.shuffle(cls_indices)
25+
n_cls_test = int(n_test * len(cls_indices) / n_samples)
26+
test_indices.extend(cls_indices[:n_cls_test])
27+
train_indices.extend(cls_indices[n_cls_test:])
28+
indices = np.array(train_indices + test_indices)
29+
n_train = len(train_indices)
30+
else:
31+
np.random.shuffle(indices)
32+
res = []
33+
for arr in arrays:
34+
if isinstance(arr, list):
35+
res.append([arr[i] for i in indices[:n_train]])
36+
res.append([arr[i] for i in indices[n_train:]])
37+
else:
38+
res.append(arr[indices[:n_train]])
39+
res.append(arr[indices[n_train:]])
40+
return res
41+
42+
43+
def resample(*arrays, n_samples=None, random_state=None, replace=True):
44+
"""Resample arrays or matrices in a consistent way"""
45+
if random_state is not None:
46+
np.random.seed(random_state)
47+
n_samples = n_samples or len(arrays[0])
48+
indices = np.random.choice(len(arrays[0]), size=n_samples, replace=replace)
49+
res = []
50+
for arr in arrays:
51+
if isinstance(arr, list):
52+
res.append([arr[i] for i in indices])
53+
else:
54+
res.append(arr[indices])
55+
return res[0] if len(res) == 1 else res

scripts/abraia

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -200,10 +200,9 @@ def create(project, query, anonymize=False, upscale=0):
200200
"""Create or update a dataset."""
201201
from abraia.training import search_images, load_dataset
202202
dataset = load_dataset(project)
203-
save_output = f"{project}/"
204203
files = []
205204
if query:
206-
files = search_images(query, limit=100, save_output=save_output, verbose=True)
205+
files = search_images(query, limit=100, save_output=f"{project}/", verbose=True)
207206
if os.path.exists(project):
208207
files = process_dataset(project, anonymize=anonymize, upscale_threshold=upscale)
209208
process_map(upload_file, files, itertools.repeat(project + '/'), desc="Uploading images")

0 commit comments

Comments
 (0)