Spaces:
Paused
Paused
Update app.py
Browse files
app.py
CHANGED
|
@@ -237,10 +237,17 @@ def filter_mask_by_size(masks,minimum_pixels):
|
|
| 237 |
renumbered_masks = np.zeros_like(filtered_masks)
|
| 238 |
for new_id, old_id in enumerate(unique_ids, start=1):
|
| 239 |
renumbered_masks[filtered_masks == old_id] = new_id
|
|
|
|
| 240 |
|
| 241 |
-
return renumbered_masks, removed_count
|
| 242 |
|
| 243 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 244 |
|
| 245 |
@spaces.GPU
|
| 246 |
def run_segmentation_editor(editor_data, model_choice, min_cell_size):
|
|
@@ -277,6 +284,11 @@ def run_segmentation_editor(editor_data, model_choice, min_cell_size):
|
|
| 277 |
# Run Cellpose segmentation
|
| 278 |
masks, flows, styles = model.eval(processed_image_np, diameter=None, channels=[0, 0])
|
| 279 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
| 280 |
if min_cell_size > 0:
|
| 281 |
masks, removed_count = filter_mask_by_size(masks, min_cell_size)
|
| 282 |
filter_msg = f"Removed {removed_count} small objects (< {min_cell_size} pixels).\n"
|
|
@@ -313,6 +325,7 @@ def run_segmentation_editor(editor_data, model_choice, min_cell_size):
|
|
| 313 |
pack_array(masks),
|
| 314 |
pack_array(processed_image_np),
|
| 315 |
confluency,
|
|
|
|
| 316 |
)
|
| 317 |
|
| 318 |
except Exception as e:
|
|
@@ -371,6 +384,8 @@ with gr.Blocks(
|
|
| 371 |
masks_state = gr.State(value=None)
|
| 372 |
image_state = gr.State(value=None)
|
| 373 |
|
|
|
|
|
|
|
| 374 |
with gr.Tab("Image Editor (Draw Selection)"):
|
| 375 |
gr.Markdown("### Draw selection and run segmentation")
|
| 376 |
|
|
@@ -434,7 +449,7 @@ with gr.Blocks(
|
|
| 434 |
segment_btn1.click(
|
| 435 |
fn=run_segmentation_editor,
|
| 436 |
inputs=[image_editor, model_dropdown1, min_size_slider1],
|
| 437 |
-
outputs=[cell_count_output1, overlay_output1, info_output1, viability_section1, masks_state, image_state, confluency_output1]
|
| 438 |
).then( # Chain the initial viability assessment after segmentation
|
| 439 |
fn=update_viability_realtime,
|
| 440 |
inputs=[blue_threshold1, masks_state, image_state], # Pass stored state as inputs
|
|
|
|
| 237 |
renumbered_masks = np.zeros_like(filtered_masks)
|
| 238 |
for new_id, old_id in enumerate(unique_ids, start=1):
|
| 239 |
renumbered_masks[filtered_masks == old_id] = new_id
|
| 240 |
+
|
| 241 |
|
| 242 |
+
return renumbered_masks, removed_count, mean_cell_size
|
| 243 |
|
| 244 |
+
|
| 245 |
+
def rec_min_size(masks):
|
| 246 |
+
num_cells = len(np.unique(masks)) - 1
|
| 247 |
+
if num_cells <= 0:
|
| 248 |
+
return 0
|
| 249 |
+
mean_cell_size = np.count_nonzero(masks) / num_cells
|
| 250 |
+
return int(round(mean_cell_size))
|
| 251 |
|
| 252 |
@spaces.GPU
|
| 253 |
def run_segmentation_editor(editor_data, model_choice, min_cell_size):
|
|
|
|
| 284 |
# Run Cellpose segmentation
|
| 285 |
masks, flows, styles = model.eval(processed_image_np, diameter=None, channels=[0, 0])
|
| 286 |
|
| 287 |
+
|
| 288 |
+
# Minimum size filtering
|
| 289 |
+
|
| 290 |
+
recommend_min = recommend_min_pixels(masks)
|
| 291 |
+
|
| 292 |
if min_cell_size > 0:
|
| 293 |
masks, removed_count = filter_mask_by_size(masks, min_cell_size)
|
| 294 |
filter_msg = f"Removed {removed_count} small objects (< {min_cell_size} pixels).\n"
|
|
|
|
| 325 |
pack_array(masks),
|
| 326 |
pack_array(processed_image_np),
|
| 327 |
confluency,
|
| 328 |
+
gr.update(value = recommend_min)
|
| 329 |
)
|
| 330 |
|
| 331 |
except Exception as e:
|
|
|
|
| 384 |
masks_state = gr.State(value=None)
|
| 385 |
image_state = gr.State(value=None)
|
| 386 |
|
| 387 |
+
|
| 388 |
+
|
| 389 |
with gr.Tab("Image Editor (Draw Selection)"):
|
| 390 |
gr.Markdown("### Draw selection and run segmentation")
|
| 391 |
|
|
|
|
| 449 |
segment_btn1.click(
|
| 450 |
fn=run_segmentation_editor,
|
| 451 |
inputs=[image_editor, model_dropdown1, min_size_slider1],
|
| 452 |
+
outputs=[cell_count_output1, overlay_output1, info_output1, viability_section1, masks_state, image_state, confluency_output1, min_size_slider1]
|
| 453 |
).then( # Chain the initial viability assessment after segmentation
|
| 454 |
fn=update_viability_realtime,
|
| 455 |
inputs=[blue_threshold1, masks_state, image_state], # Pass stored state as inputs
|