spacr 0.1.75__py3-none-any.whl → 0.1.77__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.
- spacr/app_annotate.py +1 -2
- spacr/core.py +21 -21
- spacr/deep_spacr.py +6 -6
- spacr/gui_core.py +33 -29
- spacr/gui_elements.py +0 -1
- spacr/measure.py +4 -4
- spacr/settings.py +20 -10
- spacr/utils.py +12 -15
- {spacr-0.1.75.dist-info → spacr-0.1.77.dist-info}/METADATA +1 -1
- {spacr-0.1.75.dist-info → spacr-0.1.77.dist-info}/RECORD +14 -14
- {spacr-0.1.75.dist-info → spacr-0.1.77.dist-info}/LICENSE +0 -0
- {spacr-0.1.75.dist-info → spacr-0.1.77.dist-info}/WHEEL +0 -0
- {spacr-0.1.75.dist-info → spacr-0.1.77.dist-info}/entry_points.txt +0 -0
- {spacr-0.1.75.dist-info → spacr-0.1.77.dist-info}/top_level.txt +0 -0
spacr/app_annotate.py
CHANGED
@@ -41,8 +41,7 @@ def initiate_annotation_app(parent_frame):
|
|
41
41
|
settings_window.destroy()
|
42
42
|
annotate_app(parent_frame, settings)
|
43
43
|
|
44
|
-
|
45
|
-
start_button = tk.Button(settings_window, text="Start Annotation", command=start_annotation_app)
|
44
|
+
start_button = tk.Button(settings_window, text="Start Annotation", command=start_annotation_app, bg='black', fg='white')
|
46
45
|
start_button.pack(pady=10)
|
47
46
|
|
48
47
|
def start_annotate_app():
|
spacr/core.py
CHANGED
@@ -971,7 +971,7 @@ def generate_dataset(src, file_metadata=None, experiment='TSG101_screen', sample
|
|
971
971
|
shutil.rmtree(temp_dir)
|
972
972
|
print(f"\nSaved {total_images} images to {tar_name}")
|
973
973
|
|
974
|
-
def apply_model_to_tar(tar_path, model_path, file_type='cell_png', image_size=224, batch_size=64, normalize=True, preload='images',
|
974
|
+
def apply_model_to_tar(tar_path, model_path, file_type='cell_png', image_size=224, batch_size=64, normalize=True, preload='images', n_jobs=10, threshold=0.5, verbose=False):
|
975
975
|
|
976
976
|
from .io import TarImageDataset
|
977
977
|
from .utils import process_vision_results
|
@@ -994,7 +994,7 @@ def apply_model_to_tar(tar_path, model_path, file_type='cell_png', image_size=22
|
|
994
994
|
model = torch.load(model_path)
|
995
995
|
|
996
996
|
dataset = TarImageDataset(tar_path, transform=transform)
|
997
|
-
data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True,
|
997
|
+
data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True, num_workers=n_jobs, pin_memory=True)
|
998
998
|
|
999
999
|
model_name = os.path.splitext(os.path.basename(model_path))[0]
|
1000
1000
|
dataset_name = os.path.splitext(os.path.basename(tar_path))[0]
|
@@ -1034,7 +1034,7 @@ def apply_model_to_tar(tar_path, model_path, file_type='cell_png', image_size=22
|
|
1034
1034
|
torch.cuda.memory.empty_cache()
|
1035
1035
|
return df
|
1036
1036
|
|
1037
|
-
def apply_model(src, model_path, image_size=224, batch_size=64, normalize=True,
|
1037
|
+
def apply_model(src, model_path, image_size=224, batch_size=64, normalize=True, n_jobs=10):
|
1038
1038
|
|
1039
1039
|
from .io import NoClassDataset
|
1040
1040
|
|
@@ -1055,7 +1055,7 @@ def apply_model(src, model_path, image_size=224, batch_size=64, normalize=True,
|
|
1055
1055
|
|
1056
1056
|
print(f'Loading dataset in {src} with {len(src)} images')
|
1057
1057
|
dataset = NoClassDataset(data_dir=src, transform=transform, shuffle=True, load_to_memory=False)
|
1058
|
-
data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True,
|
1058
|
+
data_loader = DataLoader(dataset, batch_size=batch_size, shuffle=True, num_workers=n_jobs)
|
1059
1059
|
print(f'Loaded {len(src)} images')
|
1060
1060
|
|
1061
1061
|
result_loc = os.path.splitext(model_path)[0]+datetime.date.today().strftime('%y%m%d')+'_'+os.path.splitext(model_path)[1]+'_test_result.csv'
|
@@ -1302,7 +1302,7 @@ def generate_training_dataset(src, mode='annotation', annotation_column='test',
|
|
1302
1302
|
|
1303
1303
|
return
|
1304
1304
|
|
1305
|
-
def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_size=32, classes=['nc','pc'],
|
1305
|
+
def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_size=32, classes=['nc','pc'], n_jobs=None, validation_split=0.0, max_show=2, pin_memory=False, normalize=False, channels=[1, 2, 3], augment=False, verbose=False):
|
1306
1306
|
|
1307
1307
|
"""
|
1308
1308
|
Generate data loaders for training and validation/test datasets.
|
@@ -1314,7 +1314,7 @@ def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_
|
|
1314
1314
|
- image_size (int): The size of the input images.
|
1315
1315
|
- batch_size (int): The batch size for the data loaders.
|
1316
1316
|
- classes (list): The list of classes to consider.
|
1317
|
-
-
|
1317
|
+
- n_jobs (int): The number of worker threads for data loading.
|
1318
1318
|
- validation_split (float): The fraction of data to use for validation when train_mode is 'erm'.
|
1319
1319
|
- max_show (int): The maximum number of images to show when verbose is True.
|
1320
1320
|
- pin_memory (bool): Whether to pin memory for faster data transfer.
|
@@ -1404,10 +1404,10 @@ def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_
|
|
1404
1404
|
#val_dataset = augment_dataset(val_dataset, is_grayscale=(len(channels) == 1))
|
1405
1405
|
print(f'Data after augmentation: Train: {len(train_dataset)}')#, Validataion:{len(val_dataset)}')
|
1406
1406
|
|
1407
|
-
train_loaders = DataLoader(train_dataset, batch_size=batch_size, shuffle=shuffle,
|
1408
|
-
val_loaders = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle,
|
1407
|
+
train_loaders = DataLoader(train_dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
|
1408
|
+
val_loaders = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
|
1409
1409
|
else:
|
1410
|
-
train_loaders = DataLoader(data, batch_size=batch_size, shuffle=shuffle,
|
1410
|
+
train_loaders = DataLoader(data, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
|
1411
1411
|
|
1412
1412
|
elif train_mode == 'irm':
|
1413
1413
|
data = MyDataset(data_dir, classes, transform=transform, shuffle=shuffle, pin_memory=pin_memory)
|
@@ -1436,13 +1436,13 @@ def generate_loaders(src, train_mode='erm', mode='train', image_size=224, batch_
|
|
1436
1436
|
#val_dataset = augment_dataset(val_dataset, is_grayscale=(len(channels) == 1))
|
1437
1437
|
print(f'Data after augmentation: Train: {len(train_dataset)}')#, Validataion:{len(val_dataset)}')
|
1438
1438
|
|
1439
|
-
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=shuffle,
|
1440
|
-
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle,
|
1439
|
+
train_loader = DataLoader(train_dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
|
1440
|
+
val_loader = DataLoader(val_dataset, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
|
1441
1441
|
|
1442
1442
|
train_loaders.append(train_loader)
|
1443
1443
|
val_loaders.append(val_loader)
|
1444
1444
|
else:
|
1445
|
-
train_loader = DataLoader(plate_data, batch_size=batch_size, shuffle=shuffle,
|
1445
|
+
train_loader = DataLoader(plate_data, batch_size=batch_size, shuffle=shuffle, num_workers=n_jobs if n_jobs is not None else 0, pin_memory=pin_memory)
|
1446
1446
|
train_loaders.append(train_loader)
|
1447
1447
|
val_loaders.append(None)
|
1448
1448
|
|
@@ -2078,11 +2078,11 @@ def identify_masks(src, object_type, model_name, batch_size, channels, diameter,
|
|
2078
2078
|
else:
|
2079
2079
|
radius = 100
|
2080
2080
|
|
2081
|
-
|
2082
|
-
if
|
2083
|
-
|
2081
|
+
n_jobs = os.cpu_count()-2
|
2082
|
+
if n_jobs < 1:
|
2083
|
+
n_jobs = 1
|
2084
2084
|
|
2085
|
-
mask_stack = _btrack_track_cells(src, name, batch_filenames, object_type, plot, save, masks_3D=masks, mode=timelapse_mode, timelapse_remove_transient=timelapse_remove_transient, radius=radius,
|
2085
|
+
mask_stack = _btrack_track_cells(src, name, batch_filenames, object_type, plot, save, masks_3D=masks, mode=timelapse_mode, timelapse_remove_transient=timelapse_remove_transient, radius=radius, n_jobs=n_jobs)
|
2086
2086
|
if timelapse_mode == 'trackpy':
|
2087
2087
|
mask_stack = _trackpy_track_cells(src, name, batch_filenames, object_type, masks, timelapse_displacement, timelapse_memory, timelapse_remove_transient, plot, save, timelapse_mode)
|
2088
2088
|
|
@@ -2303,9 +2303,9 @@ def generate_cellpose_masks(src, settings, object_type):
|
|
2303
2303
|
else:
|
2304
2304
|
radius = 100
|
2305
2305
|
|
2306
|
-
|
2307
|
-
if
|
2308
|
-
|
2306
|
+
n_jobs = os.cpu_count()-2
|
2307
|
+
if n_jobs < 1:
|
2308
|
+
n_jobs = 1
|
2309
2309
|
|
2310
2310
|
mask_stack = _btrack_track_cells(src=src,
|
2311
2311
|
name=name,
|
@@ -2317,7 +2317,7 @@ def generate_cellpose_masks(src, settings, object_type):
|
|
2317
2317
|
mode=timelapse_mode,
|
2318
2318
|
timelapse_remove_transient=timelapse_remove_transient,
|
2319
2319
|
radius=radius,
|
2320
|
-
|
2320
|
+
n_jobs=n_jobs)
|
2321
2321
|
if timelapse_mode == 'trackpy':
|
2322
2322
|
mask_stack = _trackpy_track_cells(src=src,
|
2323
2323
|
name=name,
|
@@ -2551,7 +2551,7 @@ def compare_cellpose_masks(src, verbose=False, processes=None, save=True):
|
|
2551
2551
|
common_files.intersection_update(os.listdir(d))
|
2552
2552
|
common_files = list(common_files)
|
2553
2553
|
|
2554
|
-
# Create a pool of
|
2554
|
+
# Create a pool of n_jobs
|
2555
2555
|
with Pool(processes=processes) as pool:
|
2556
2556
|
args = [(src, filename, dirs, conditions) for filename in common_files]
|
2557
2557
|
results = pool.map(compare_mask, args)
|
spacr/deep_spacr.py
CHANGED
@@ -230,7 +230,7 @@ def train_test_model(src, settings, custom_model=False, custom_model_path=None):
|
|
230
230
|
image_size=settings['image_size'],
|
231
231
|
batch_size=settings['batch_size'],
|
232
232
|
classes=settings['classes'],
|
233
|
-
|
233
|
+
n_jobs=settings['n_jobs'],
|
234
234
|
validation_split=settings['val_split'],
|
235
235
|
pin_memory=settings['pin_memory'],
|
236
236
|
normalize=settings['normalize'],
|
@@ -255,7 +255,7 @@ def train_test_model(src, settings, custom_model=False, custom_model_path=None):
|
|
255
255
|
optimizer_type = settings['optimizer_type'],
|
256
256
|
use_checkpoint = settings['use_checkpoint'],
|
257
257
|
dropout_rate = settings['dropout_rate'],
|
258
|
-
|
258
|
+
n_jobs = settings['n_jobs'],
|
259
259
|
val_loaders = val,
|
260
260
|
test_loaders = None,
|
261
261
|
intermedeate_save = settings['intermedeate_save'],
|
@@ -276,7 +276,7 @@ def train_test_model(src, settings, custom_model=False, custom_model_path=None):
|
|
276
276
|
image_size=settings['image_size'],
|
277
277
|
batch_size=settings['batch_size'],
|
278
278
|
classes=settings['classes'],
|
279
|
-
|
279
|
+
n_jobs=settings['n_jobs'],
|
280
280
|
validation_split=0.0,
|
281
281
|
pin_memory=settings['pin_memory'],
|
282
282
|
normalize=settings['normalize'],
|
@@ -315,7 +315,7 @@ def train_test_model(src, settings, custom_model=False, custom_model_path=None):
|
|
315
315
|
torch.cuda.memory.empty_cache()
|
316
316
|
gc.collect()
|
317
317
|
|
318
|
-
def train_model(dst, model_type, train_loaders, train_loader_names, train_mode='erm', epochs=100, learning_rate=0.0001, weight_decay=0.05, amsgrad=False, optimizer_type='adamw', use_checkpoint=False, dropout_rate=0,
|
318
|
+
def train_model(dst, model_type, train_loaders, train_loader_names, train_mode='erm', epochs=100, learning_rate=0.0001, weight_decay=0.05, amsgrad=False, optimizer_type='adamw', use_checkpoint=False, dropout_rate=0, n_jobs=20, val_loaders=None, test_loaders=None, init_weights='imagenet', intermedeate_save=None, chan_dict=None, schedule = None, loss_type='binary_cross_entropy_with_logits', gradient_accumulation=False, gradient_accumulation_steps=4, channels=['r','g','b']):
|
319
319
|
"""
|
320
320
|
Trains a model using the specified parameters.
|
321
321
|
|
@@ -332,7 +332,7 @@ def train_model(dst, model_type, train_loaders, train_loader_names, train_mode='
|
|
332
332
|
optimizer_type (str, optional): The type of optimizer to use. Defaults to 'adamw'.
|
333
333
|
use_checkpoint (bool, optional): Whether to use checkpointing during training. Defaults to False.
|
334
334
|
dropout_rate (float, optional): The dropout rate for the model. Defaults to 0.
|
335
|
-
|
335
|
+
n_jobs (int, optional): The number of n_jobs for data loading. Defaults to 20.
|
336
336
|
val_loaders (list, optional): A list of validation data loaders. Defaults to None.
|
337
337
|
test_loaders (list, optional): A list of test data loaders. Defaults to None.
|
338
338
|
init_weights (str, optional): The initialization weights for the model. Defaults to 'imagenet'.
|
@@ -357,7 +357,7 @@ def train_model(dst, model_type, train_loaders, train_loader_names, train_mode='
|
|
357
357
|
|
358
358
|
use_cuda = torch.cuda.is_available()
|
359
359
|
device = torch.device("cuda" if use_cuda else "cpu")
|
360
|
-
kwargs = {'
|
360
|
+
kwargs = {'n_jobs': n_jobs, 'pin_memory': True} if use_cuda else {}
|
361
361
|
|
362
362
|
for idx, (images, labels, filenames) in enumerate(train_loaders):
|
363
363
|
batch, chans, height, width = images.shape
|
spacr/gui_core.py
CHANGED
@@ -192,15 +192,19 @@ def convert_settings_dict_for_gui(settings):
|
|
192
192
|
variables[key] = ('entry', None, str(value))
|
193
193
|
return variables
|
194
194
|
|
195
|
-
def setup_settings_panel(vertical_container, settings_type='mask',
|
195
|
+
def setup_settings_panel(vertical_container, settings_type='mask', window_dimensions=[500, 1000]):
|
196
196
|
global vars_dict, scrollable_frame
|
197
|
-
from .settings import set_default_settings_preprocess_generate_masks, get_measure_crop_settings, set_default_train_test_model, get_analyze_reads_default_settings, set_default_umap_image_settings, generate_fields
|
197
|
+
from .settings import set_default_settings_preprocess_generate_masks, get_measure_crop_settings, set_default_train_test_model, get_analyze_reads_default_settings, set_default_umap_image_settings, generate_fields, descriptions
|
198
198
|
|
199
|
-
|
199
|
+
width = (window_dimensions[0])//6
|
200
|
+
height = window_dimensions[1]
|
201
|
+
|
202
|
+
# Settings Frame
|
203
|
+
settings_frame = tk.Frame(vertical_container, bg='black', height=height, width=width)
|
200
204
|
vertical_container.add(settings_frame, stretch="always")
|
201
205
|
settings_label = spacrLabel(settings_frame, text="Settings", background="black", foreground="white", anchor='center', justify='center', align="center")
|
202
206
|
settings_label.grid(row=0, column=0, pady=10, padx=10)
|
203
|
-
scrollable_frame = spacrFrame(settings_frame, bg='black', width=
|
207
|
+
scrollable_frame = spacrFrame(settings_frame, bg='black', width=width)
|
204
208
|
scrollable_frame.grid(row=1, column=0, sticky="nsew")
|
205
209
|
settings_frame.grid_rowconfigure(1, weight=1)
|
206
210
|
settings_frame.grid_columnconfigure(0, weight=1)
|
@@ -351,18 +355,21 @@ def download_dataset(repo_id, subfolder, local_dir=None, retries=5, delay=5):
|
|
351
355
|
|
352
356
|
raise Exception("Failed to download files after multiple attempts.")
|
353
357
|
|
354
|
-
def setup_button_section(horizontal_container, settings_type='mask',
|
358
|
+
def setup_button_section(horizontal_container, settings_type='mask', window_dimensions=[500, 1000], run=True, abort=True, download=True, import_btn=True):
|
355
359
|
global button_frame, button_scrollable_frame, run_button, abort_button, download_dataset_button, import_button, q, fig_queue, vars_dict
|
360
|
+
from .settings import descriptions
|
361
|
+
|
362
|
+
width = (window_dimensions[0])//8
|
363
|
+
height = window_dimensions[1]
|
356
364
|
|
357
|
-
button_frame = tk.Frame(horizontal_container, bg='black')
|
365
|
+
button_frame = tk.Frame(horizontal_container, bg='black', height=height, width=width)
|
358
366
|
horizontal_container.add(button_frame, stretch="always", sticky="nsew")
|
359
367
|
button_frame.grid_rowconfigure(0, weight=0)
|
360
368
|
button_frame.grid_rowconfigure(1, weight=1)
|
361
369
|
button_frame.grid_columnconfigure(0, weight=1)
|
362
370
|
|
363
|
-
categories_label = spacrLabel(button_frame, text="Categories", background="black", foreground="white", font=('Helvetica', 12), anchor='center', justify='center', align="center")
|
371
|
+
categories_label = spacrLabel(button_frame, text="Categories", background="black", foreground="white", font=('Helvetica', 12), anchor='center', justify='center', align="center")
|
364
372
|
categories_label.grid(row=0, column=0, pady=10, padx=10)
|
365
|
-
|
366
373
|
button_scrollable_frame = spacrFrame(button_frame, bg='black')
|
367
374
|
button_scrollable_frame.grid(row=1, column=0, sticky="nsew")
|
368
375
|
|
@@ -391,6 +398,15 @@ def setup_button_section(horizontal_container, settings_type='mask', settings_ro
|
|
391
398
|
# Call toggle_settings after vars_dict is initialized
|
392
399
|
if vars_dict is not None:
|
393
400
|
toggle_settings(button_scrollable_frame)
|
401
|
+
|
402
|
+
# Description frame
|
403
|
+
description_frame = tk.Frame(horizontal_container, bg='black', height=height, width=width)
|
404
|
+
horizontal_container.add(description_frame, stretch="always", sticky="nsew")
|
405
|
+
description_label = tk.Label(description_frame, text="Module Description", bg='black', fg='white', anchor='nw', justify='left', wraplength=width//2-100)
|
406
|
+
description_label.pack(pady=10, padx=10)
|
407
|
+
description_text = descriptions.get(settings_type, "No description available for this module.")
|
408
|
+
description_label.config(text=description_text)
|
409
|
+
|
394
410
|
return button_scrollable_frame
|
395
411
|
|
396
412
|
def hide_all_settings(vars_dict, categories):
|
@@ -527,13 +543,18 @@ def setup_frame(parent_frame):
|
|
527
543
|
return parent_frame, vertical_container, horizontal_container
|
528
544
|
|
529
545
|
def initiate_root(parent, settings_type='mask'):
|
530
|
-
global q, fig_queue, parent_frame, scrollable_frame, button_frame, vars_dict, canvas, canvas_widget, progress_label, button_scrollable_frame
|
546
|
+
global q, fig_queue, parent_frame, scrollable_frame, button_frame, vars_dict, canvas, canvas_widget, progress_label, progress_output, button_scrollable_frame
|
531
547
|
from .gui_utils import main_thread_update_function
|
532
548
|
from .gui import gui_app
|
533
549
|
set_start_method('spawn', force=True)
|
534
|
-
|
535
550
|
print("Initializing root with settings_type:", settings_type)
|
551
|
+
|
536
552
|
parent_frame = parent
|
553
|
+
parent_frame.update_idletasks()
|
554
|
+
frame_width = int(parent_frame.winfo_width())
|
555
|
+
frame_height = int(parent_frame.winfo_height())
|
556
|
+
print(frame_width, frame_height)
|
557
|
+
dims = [frame_width, frame_height]
|
537
558
|
|
538
559
|
if not hasattr(parent_frame, 'after_tasks'):
|
539
560
|
parent_frame.after_tasks = []
|
@@ -555,13 +576,9 @@ def initiate_root(parent, settings_type='mask'):
|
|
555
576
|
elif settings_type == 'make_masks':
|
556
577
|
from .app_make_masks import initiate_make_mask_app
|
557
578
|
initiate_make_mask_app(horizontal_container)
|
558
|
-
elif settings_type is None:
|
559
|
-
#parent.quit()
|
560
|
-
parent_frame.destroy()
|
561
|
-
gui_app()
|
562
579
|
else:
|
563
|
-
scrollable_frame, vars_dict = setup_settings_panel(horizontal_container, settings_type)
|
564
|
-
button_scrollable_frame = setup_button_section(horizontal_container, settings_type)
|
580
|
+
scrollable_frame, vars_dict = setup_settings_panel(horizontal_container, settings_type, window_dimensions=dims)
|
581
|
+
button_scrollable_frame = setup_button_section(horizontal_container, settings_type, window_dimensions=dims)
|
565
582
|
canvas, canvas_widget = setup_plot_section(vertical_container)
|
566
583
|
console_output = setup_console(vertical_container)
|
567
584
|
|
@@ -578,16 +595,3 @@ def initiate_root(parent, settings_type='mask'):
|
|
578
595
|
|
579
596
|
print("Root initialization complete")
|
580
597
|
return parent_frame, vars_dict
|
581
|
-
|
582
|
-
def start_gui_app(settings_type='mask'):
|
583
|
-
global q, fig_queue, parent_frame, scrollable_frame, vars_dict, canvas, canvas_widget, progress_label
|
584
|
-
root = tk.Tk()
|
585
|
-
width = root.winfo_screenwidth()
|
586
|
-
height = root.winfo_screenheight()
|
587
|
-
root.geometry(f"{width}x{height}")
|
588
|
-
root.title(f"SpaCr: {settings_type.capitalize()}")
|
589
|
-
root.content_frame = tk.Frame(root)
|
590
|
-
print("Starting GUI app with settings_type:", settings_type)
|
591
|
-
initiate_root(root.content_frame, settings_type)
|
592
|
-
create_menu_bar(root)
|
593
|
-
root.mainloop()
|
spacr/gui_elements.py
CHANGED
@@ -1433,7 +1433,6 @@ def create_menu_bar(root):
|
|
1433
1433
|
from .gui_core import initiate_root
|
1434
1434
|
|
1435
1435
|
gui_apps = {
|
1436
|
-
"Main": (lambda frame: initiate_root(frame, None), "Main GUI window."),
|
1437
1436
|
"Mask": (lambda frame: initiate_root(frame, 'mask'), "Generate cellpose masks for cells, nuclei and pathogen images."),
|
1438
1437
|
"Measure": (lambda frame: initiate_root(frame, 'measure'), "Measure single object intensity and morphological feature. Crop and save single object image"),
|
1439
1438
|
"Annotate": (lambda frame: initiate_root(frame, 'annotate'), "Annotation single object images on a grid. Annotations are saved to database."),
|
spacr/measure.py
CHANGED
@@ -998,12 +998,12 @@ def measure_crop(settings):
|
|
998
998
|
_save_settings_to_db(settings)
|
999
999
|
|
1000
1000
|
files = [f for f in os.listdir(settings['input_folder']) if f.endswith('.npy')]
|
1001
|
-
|
1002
|
-
print(f'using {
|
1001
|
+
n_jobs = settings['n_jobs'] or mp.cpu_count()-4
|
1002
|
+
print(f'using {n_jobs} cpu cores')
|
1003
1003
|
|
1004
1004
|
with mp.Manager() as manager:
|
1005
1005
|
time_ls = manager.list()
|
1006
|
-
with mp.Pool(
|
1006
|
+
with mp.Pool(n_jobs) as pool:
|
1007
1007
|
result = pool.starmap_async(_measure_crop_core, [(index, time_ls, file, settings) for index, file in enumerate(files)])
|
1008
1008
|
|
1009
1009
|
# Track progress in the main process
|
@@ -1012,7 +1012,7 @@ def measure_crop(settings):
|
|
1012
1012
|
files_processed = len(time_ls)
|
1013
1013
|
files_to_process = len(files)
|
1014
1014
|
average_time = np.mean(time_ls) if len(time_ls) > 0 else 0
|
1015
|
-
time_left = (((files_to_process-files_processed)*average_time)/
|
1015
|
+
time_left = (((files_to_process-files_processed)*average_time)/n_jobs)/60
|
1016
1016
|
print(f'Progress: {files_processed}/{files_to_process} Time/img {average_time:.3f}sec, Time Remaining {time_left:.3f} min.', end='\r', flush=True)
|
1017
1017
|
result.get()
|
1018
1018
|
|
spacr/settings.py
CHANGED
@@ -43,7 +43,7 @@ def set_default_settings_preprocess_generate_masks(src, settings={}):
|
|
43
43
|
settings.setdefault('magnification', 20)
|
44
44
|
settings.setdefault('custom_regex', None)
|
45
45
|
settings.setdefault('metadata_type', 'cellvoyager')
|
46
|
-
settings.setdefault('
|
46
|
+
settings.setdefault('n_jobs', os.cpu_count()-4)
|
47
47
|
settings.setdefault('randomize', True)
|
48
48
|
settings.setdefault('verbose', True)
|
49
49
|
settings.setdefault('remove_background_cell', False)
|
@@ -254,7 +254,7 @@ def get_measure_crop_settings(settings):
|
|
254
254
|
settings.setdefault('plot',False)
|
255
255
|
settings.setdefault('plot_filtration',False)
|
256
256
|
settings.setdefault('representative_images', False)
|
257
|
-
settings.setdefault('
|
257
|
+
settings.setdefault('n_jobs', os.cpu_count()-2)
|
258
258
|
|
259
259
|
# Object settings
|
260
260
|
settings.setdefault('cell_mask_dim',None)
|
@@ -340,7 +340,7 @@ def set_default_train_test_model(settings):
|
|
340
340
|
settings.setdefault('gradient_accumulation_steps',4)
|
341
341
|
settings.setdefault('intermedeate_save',True)
|
342
342
|
settings.setdefault('pin_memory',True)
|
343
|
-
settings.setdefault('
|
343
|
+
settings.setdefault('n_jobs',cores)
|
344
344
|
settings.setdefault('channels',['r','g','b'])
|
345
345
|
settings.setdefault('augment',False)
|
346
346
|
settings.setdefault('verbose',False)
|
@@ -534,7 +534,7 @@ expected_types = {
|
|
534
534
|
"skip_mode": str,
|
535
535
|
"save": bool,
|
536
536
|
"plot": bool,
|
537
|
-
"
|
537
|
+
"n_jobs": int,
|
538
538
|
"verbose": bool,
|
539
539
|
"input_folder": str,
|
540
540
|
"cell_mask_dim": int,
|
@@ -557,7 +557,7 @@ expected_types = {
|
|
557
557
|
"include_uninfected": bool,
|
558
558
|
"dialate_pngs": bool,
|
559
559
|
"dialate_png_ratios": list,
|
560
|
-
"
|
560
|
+
"n_jobs": int,
|
561
561
|
"cells": list,
|
562
562
|
"cell_loc": list,
|
563
563
|
"pathogens": list,
|
@@ -677,7 +677,7 @@ expected_types = {
|
|
677
677
|
"gradient_accumulation_steps": int,
|
678
678
|
"intermedeate_save": bool,
|
679
679
|
"pin_memory": bool,
|
680
|
-
"
|
680
|
+
"n_jobs": int,
|
681
681
|
"augment": bool,
|
682
682
|
"target": str,
|
683
683
|
"cell_types": list,
|
@@ -902,7 +902,7 @@ def generate_fields(variables, scrollable_frame):
|
|
902
902
|
"save": "Whether to save the results to disk.",
|
903
903
|
"merge_edge_pathogen_cells": "Whether to merge cells that share pathogen objects.",
|
904
904
|
"plot": "Whether to plot the results.",
|
905
|
-
"
|
905
|
+
"n_jobs": "The number of n_jobs to use for processing the images. This will determine how many images are processed in parallel. Increase to speed up processing.",
|
906
906
|
"verbose": "Whether to print verbose output during processing.",
|
907
907
|
"input_folder": "Path to the folder containing the images.",
|
908
908
|
"cell_mask_dim": "The dimension of the array the cell mask is saved in.",
|
@@ -926,7 +926,7 @@ def generate_fields(variables, scrollable_frame):
|
|
926
926
|
"include_uninfected": "Whether to include uninfected cells in the analysis.",
|
927
927
|
"dialate_pngs": "Whether to dilate the PNG images before saving.",
|
928
928
|
"dialate_png_ratios": "The ratios to use for dilating the PNG images. This will determine the amount of dilation applied to the images before cropping.",
|
929
|
-
"
|
929
|
+
"n_jobs": "The number of n_jobs to use for processing the images. This will determine how many images are processed in parallel. Increase to speed up processing.",
|
930
930
|
"cells": "The cell types to include in the analysis.",
|
931
931
|
"cell_loc": "The locations of the cell types in the images.",
|
932
932
|
"pathogens": "The pathogen types to include in the analysis.",
|
@@ -960,7 +960,7 @@ categories = {
|
|
960
960
|
"Object Image": ["save_png", "dialate_pngs", "dialate_png_ratios", "png_size", "png_dims", "save_arrays", "normalize_by", "dialate_png_ratios", "crop_mode", "dialate_pngs", "normalize", "use_bounding_box"],
|
961
961
|
"Annotate Data": ["positive_control","negative_control", "location_column", "treatment_loc", "cells", "cell_loc", "pathogens", "pathogen_loc", "channel_of_interest", "measurement", "treatments", "representative_images", "um_per_pixel", "nr_imgs", "exclude", "exclude_conditions", "mix", "pos", "neg"],
|
962
962
|
"Measurements": ["remove_image_canvas", "remove_highly_correlated", "homogeneity", "homogeneity_distances", "radial_dist", "calculate_correlation", "manders_thresholds", "save_measurements", "tables", "image_nr", "dot_size", "filter_by", "remove_highly_correlated_features", "remove_low_variance_features", "channel_of_interest"],
|
963
|
-
"Advanced": ["plot", "timelapse", "schedule", "test_size","exclude","n_repeats","top_features", "model_type","minimum_cell_count","n_estimators","preprocess", "remove_background", "normalize", "lower_percentile", "merge_pathogens", "batch_size", "filter", "save", "masks", "verbose", "randomize", "
|
963
|
+
"Advanced": ["plot", "timelapse", "schedule", "test_size","exclude","n_repeats","top_features", "model_type","minimum_cell_count","n_estimators","preprocess", "remove_background", "normalize", "lower_percentile", "merge_pathogens", "batch_size", "filter", "save", "masks", "verbose", "randomize", "n_jobs", "train_mode","amsgrad","use_checkpoint","gradient_accumulation","gradient_accumulation_steps","intermedeate_save","pin_memory","n_jobs","channels","augment"],
|
964
964
|
"Clustering": ["eps","min_samples","analyze_clusters","clustering","remove_cluster_noise"],
|
965
965
|
"Embedding": ["visualize","n_neighbors","min_dist","metric","resnet_features","reduction_method","embedding_by_controls","col_to_compare","log_data"],
|
966
966
|
"Train DL Model": ["epochs", "loss_type", "optimizer_type","image_size","val_split","learning_rate","weight_decay","dropout_rate","init_weights", "train", "classes"],
|
@@ -969,6 +969,15 @@ categories = {
|
|
969
969
|
"Sequencing": ["upstream", "downstream", "barecode_length_1", "barecode_length_2", "chunk_size", "test"]
|
970
970
|
}
|
971
971
|
|
972
|
+
descriptions = {
|
973
|
+
'mask': "This module allows you to set default settings for preprocessing and generating masks.",
|
974
|
+
'measure': "This module allows you to set default settings for measuring and cropping images.",
|
975
|
+
'classify': "This module allows you to set default settings for training and testing classification models.",
|
976
|
+
'sequencing': "This module allows you to set default settings for analyzing sequencing reads.",
|
977
|
+
'umap': "This module allows you to set default settings for UMAP image analysis."
|
978
|
+
}
|
979
|
+
|
980
|
+
|
972
981
|
def set_annotate_default_settings(settings):
|
973
982
|
settings.setdefault('src', 'path')
|
974
983
|
settings.setdefault('image_type', 'cell_png')
|
@@ -982,4 +991,5 @@ def set_annotate_default_settings(settings):
|
|
982
991
|
settings.setdefault('percentiles', [2, 98])
|
983
992
|
settings.setdefault('measurement', 'cytoplasm_channel_3_mean_intensity,pathogen_channel_3_mean_intensity')
|
984
993
|
settings.setdefault('threshold', '2')
|
985
|
-
return settings
|
994
|
+
return settings
|
995
|
+
|
spacr/utils.py
CHANGED
@@ -74,9 +74,18 @@ from scipy import stats
|
|
74
74
|
from .logger import log_function_call
|
75
75
|
from multiprocessing import set_start_method, get_start_method
|
76
76
|
|
77
|
-
import
|
78
|
-
|
79
|
-
|
77
|
+
import torch
|
78
|
+
import torchvision.transforms as transforms
|
79
|
+
from torchvision.models import resnet50
|
80
|
+
from PIL import Image
|
81
|
+
import numpy as np
|
82
|
+
import umap
|
83
|
+
import pandas as pd
|
84
|
+
from sklearn.ensemble import RandomForestClassifier
|
85
|
+
from sklearn.preprocessing import StandardScaler
|
86
|
+
from scipy.stats import f_oneway, kruskal
|
87
|
+
from sklearn.cluster import KMeans
|
88
|
+
from scipy import stats
|
80
89
|
|
81
90
|
def reset_mp():
|
82
91
|
current_method = get_start_method()
|
@@ -3853,18 +3862,6 @@ def search_reduction_and_clustering(numeric_data, n_neighbors, min_dist, metric,
|
|
3853
3862
|
if verbose:
|
3854
3863
|
print(f'Embedding shape: {embedding.shape}')
|
3855
3864
|
return embedding, labels
|
3856
|
-
import torch
|
3857
|
-
import torchvision.transforms as transforms
|
3858
|
-
from torchvision.models import resnet50
|
3859
|
-
from PIL import Image
|
3860
|
-
import numpy as np
|
3861
|
-
import umap
|
3862
|
-
import pandas as pd
|
3863
|
-
from sklearn.ensemble import RandomForestClassifier
|
3864
|
-
from sklearn.preprocessing import StandardScaler
|
3865
|
-
from scipy.stats import f_oneway, kruskal
|
3866
|
-
from sklearn.cluster import KMeans
|
3867
|
-
from scipy import stats
|
3868
3865
|
|
3869
3866
|
def load_image(image_path):
|
3870
3867
|
"""Load and preprocess an image."""
|
@@ -3,7 +3,7 @@ spacr/__main__.py,sha256=bkAJJD2kjIqOP-u1kLvct9jQQCeUXzlEjdgitwi1Lm8,75
|
|
3
3
|
spacr/alpha.py,sha256=Y95sLEfpK2OSYKRn3M8eUOU33JJeXfV8zhrC4KnwSTY,35244
|
4
4
|
spacr/annotate_app.py,sha256=imQ7ZEXDyM6ce1dxZ1xUS1-KequuF_NCI4xCaPLjvco,29275
|
5
5
|
spacr/annotate_app_v2.py,sha256=imQ7ZEXDyM6ce1dxZ1xUS1-KequuF_NCI4xCaPLjvco,29275
|
6
|
-
spacr/app_annotate.py,sha256=
|
6
|
+
spacr/app_annotate.py,sha256=FhyDBsLdo6etOSvz6et2AhhJn67SwdeYUVDzBJzdw1E,2274
|
7
7
|
spacr/app_classify.py,sha256=urTP_wlZ58hSyM5a19slYlBxN0PdC-9-ga0hvq8CGWc,165
|
8
8
|
spacr/app_make_masks.py,sha256=qV3L_2TilGZBAUyBrzaWAayei_tf3XvJdUUDyzEI6hA,1834
|
9
9
|
spacr/app_make_masks_v2.py,sha256=OkNeskNbgep8wQa4ES3jpJjZLfn4yIkGwQOd9r0spfA,30497
|
@@ -14,8 +14,8 @@ spacr/app_umap.py,sha256=ZWAmf_OsIKbYvolYuWPMYhdlVe-n2CADoJulAizMiEo,153
|
|
14
14
|
spacr/chris.py,sha256=YlBjSgeZaY8HPy6jkrT_ISAnCMAKVfvCxF0I9eAZLFM,2418
|
15
15
|
spacr/classify_app.py,sha256=Zi15ryc1ocYitRF4kyxlC27XxGyzfSPdvj2d6ZrSh7E,8446
|
16
16
|
spacr/cli.py,sha256=507jfOOEV8BoL4eeUcblvH-iiDHdBrEVJLu1ghAAPSc,1800
|
17
|
-
spacr/core.py,sha256=
|
18
|
-
spacr/deep_spacr.py,sha256=
|
17
|
+
spacr/core.py,sha256=bm1cApGVTE218Ds3FqqWD5TsF5FF8kclHwPlvdOolzc,160216
|
18
|
+
spacr/deep_spacr.py,sha256=ASBsN4JpHp_3S-91JUsB34IWTjTGPYI7jKV2qZnUR5M,37005
|
19
19
|
spacr/foldseek.py,sha256=YIP1d4Ci6CeA9jSyiv-HTDbNmAmcSM9Y_DaOs7wYzLY,33546
|
20
20
|
spacr/get_alfafold_structures.py,sha256=ehx_MQgb12k3hFecP6cYVlm5TLO8iWjgevy8ESyS3cw,3544
|
21
21
|
spacr/graph_learning.py,sha256=1tR-ZxvXE3dBz1Saw7BeVFcrsUFu9OlUZeZVifih9eo,13070
|
@@ -23,8 +23,8 @@ spacr/gui.py,sha256=9psWiXMna1ebi-I55H0vQ3lad_923fhq_LB13lMSEg4,6893
|
|
23
23
|
spacr/gui_2.py,sha256=ZAI5quQYbhQJ40vK0NCqU_UMSPLkpfeQpomBWUSM0fc,6946
|
24
24
|
spacr/gui_annotate.py,sha256=ugBksLGOHdtOLlEuRyyc59TrkYKu3rDf8JxEgiBSVao,6536
|
25
25
|
spacr/gui_classify_app.py,sha256=Zi15ryc1ocYitRF4kyxlC27XxGyzfSPdvj2d6ZrSh7E,8446
|
26
|
-
spacr/gui_core.py,sha256=
|
27
|
-
spacr/gui_elements.py,sha256=
|
26
|
+
spacr/gui_core.py,sha256=VkcYV8gE8Bc1fKcuZSJ1plS8agS_386ZxjqudRMLhG0,27912
|
27
|
+
spacr/gui_elements.py,sha256=fgRaG7THe95jyaIaqJqe05syQ9apo9ZIwkRR2u9vMnY,72544
|
28
28
|
spacr/gui_make_masks_app.py,sha256=tl4M4Q2WQgrrwjRBJVevxJxpNowqzPhWkdCOm2UfRbw,45053
|
29
29
|
spacr/gui_make_masks_app_v2.py,sha256=X3izTBXdCZDlkVe-fbG-jmCQtcAbmK0OIivjyWaLhug,30576
|
30
30
|
spacr/gui_mask_app.py,sha256=mhTl_XzXLFl8Tx3WYEMpdYB_qw9u5JJa0EdkvlcIzAE,10706
|
@@ -38,23 +38,23 @@ spacr/logger.py,sha256=7Zqr3TuuOQLWT32gYr2q1qvv7x0a2JhLANmZcnBXAW8,670
|
|
38
38
|
spacr/make_masks_app.py,sha256=iGaTwhowoe2JMOSOf8bJwQZTooRhLQx7KO0ewnAmqDY,45138
|
39
39
|
spacr/make_masks_app_v2.py,sha256=X3izTBXdCZDlkVe-fbG-jmCQtcAbmK0OIivjyWaLhug,30576
|
40
40
|
spacr/mask_app.py,sha256=mhTl_XzXLFl8Tx3WYEMpdYB_qw9u5JJa0EdkvlcIzAE,10706
|
41
|
-
spacr/measure.py,sha256=
|
41
|
+
spacr/measure.py,sha256=e36NR8raCkvKHZXvTJgPDwObsmsegvc1dAiCqD3oljk,55751
|
42
42
|
spacr/measure_app.py,sha256=_C1-XFL5HSquUEEbM_NcxdvHx-socPFCx85MBG4d6xo,10598
|
43
43
|
spacr/old_code.py,sha256=jw67DAGoLBd7mWofVzRJSEmCI1Qrff26zIo65SEkV00,13817
|
44
44
|
spacr/plot.py,sha256=DYJEoK1kz2ih6ZGvKiA3xTqeIeKQNhuQKwgrscopFxA,69101
|
45
45
|
spacr/sequencing.py,sha256=fHZRnoMSxmhMdadkei3lUeBdckqFyptWdQyWsDW3aaU,83304
|
46
|
-
spacr/settings.py,sha256=
|
46
|
+
spacr/settings.py,sha256=PQ-VJSTlBMxfQuz35MiipoGmBjq56jqepViUvOjov0k,48668
|
47
47
|
spacr/sim.py,sha256=FveaVgBi3eypO2oVB5Dx-v0CC1Ny7UPfXkJiiRRodAk,71212
|
48
48
|
spacr/sim_app.py,sha256=47DEQpj8HBSa-_TImW-5JCeuQeRkm5NMpJWZG3hSuFU,0
|
49
49
|
spacr/timelapse.py,sha256=KMYCgHzf9LTZe-lWl5mvH2EjbKRE6OhpwdY13wEumGc,39504
|
50
|
-
spacr/utils.py,sha256=
|
50
|
+
spacr/utils.py,sha256=OQ8sSBH6VWx2xP_vh4ILJT71B46DFFhsq-Y6WxYdGhI,186891
|
51
51
|
spacr/version.py,sha256=axH5tnGwtgSnJHb5IDhiu4Zjk5GhLyAEDRe-rnaoFOA,409
|
52
52
|
spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model,sha256=z8BbHWZPRnE9D_BHO0fBREE85c1vkltDs-incs2ytXQ,26566572
|
53
53
|
spacr/models/cp/toxo_plaque_cyto_e25000_X1120_Y1120.CP_model_settings.csv,sha256=fBAGuL_B8ERVdVizO3BHozTDSbZUh1yFzsYK3wkQN68,420
|
54
54
|
spacr/models/cp/toxo_pv_lumen.CP_model,sha256=2y_CindYhmTvVwBH39SNILF3rI3x9SsRn6qrMxHy3l0,26562451
|
55
|
-
spacr-0.1.
|
56
|
-
spacr-0.1.
|
57
|
-
spacr-0.1.
|
58
|
-
spacr-0.1.
|
59
|
-
spacr-0.1.
|
60
|
-
spacr-0.1.
|
55
|
+
spacr-0.1.77.dist-info/LICENSE,sha256=SR-2MeGc6SCM1UORJYyarSWY_A-JaOMFDj7ReSs9tRM,1083
|
56
|
+
spacr-0.1.77.dist-info/METADATA,sha256=FEEy3ZRedFlkX0jIEsC7MZ1qlDRCahOWGrtmzE7Mj3g,5050
|
57
|
+
spacr-0.1.77.dist-info/WHEEL,sha256=GJ7t_kWBFywbagK5eo9IoUwLW6oyOeTKmQ-9iHFVNxQ,92
|
58
|
+
spacr-0.1.77.dist-info/entry_points.txt,sha256=BMC0ql9aNNpv8lUZ8sgDLQMsqaVnX5L535gEhKUP5ho,296
|
59
|
+
spacr-0.1.77.dist-info/top_level.txt,sha256=GJPU8FgwRXGzKeut6JopsSRY2R8T3i9lDgya42tLInY,6
|
60
|
+
spacr-0.1.77.dist-info/RECORD,,
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|