Spaces:
Sleeping
Sleeping
| import gradio as gr | |
| import spaces | |
| from cellpose import models | |
| import numpy as np | |
| import cv2 | |
| import matplotlib.pyplot as plt | |
| import tempfile | |
| from PIL import Image | |
| import io | |
| from huggingface_hub import hf_hub_download | |
| HF_REPO_ID = "myang4218/cellposemodel" | |
| MODEL_OPTIONS = { | |
| "Hemocytometer Model": "hemocytometermodel.npy", | |
| "General Model": "generalmodel.npy" | |
| } | |
| loaded_models = {} | |
| def segment_and_count(image, model_choice): | |
| model_filename = MODEL_OPTIONS[model_choice] | |
| model_path = hf_hub_download(repo_id=HF_REPO_ID, filename=model_filename) | |
| if model_filename in loaded_models: | |
| model = loaded_models[model_filename] | |
| else: | |
| model = models.CellposeModel(gpu=True, pretrained_model=model_path) | |
| loaded_models[model_filename] = model | |
| # Convert PIL Image to numpy array | |
| image_np = np.array(image) | |
| # If grayscale, convert to RGB | |
| if len(image_np.shape) == 2: | |
| image_np = cv2.cvtColor(image_np, cv2.COLOR_GRAY2RGB) | |
| elif len(image_np.shape) == 3 and image_np.shape[2] == 4: | |
| # Handle RGBA images | |
| image_np = cv2.cvtColor(image_np, cv2.COLOR_RGBA2RGB) | |
| # Run Cellpose | |
| masks, flows, styles = model.eval(image_np, diameter=None, channels=[0, 0]) | |
| # Count unique cells | |
| cell_count = len(np.unique(masks)) - 1 # subtract 1 for background | |
| # Create better overlay visualization | |
| overlay = image_np.copy().astype(np.float32) | |
| # Create colored mask overlay | |
| if masks.max() > 0: | |
| # Generate random colors for each cell | |
| np.random.seed(42) # For reproducible colors | |
| colors = np.random.randint(0, 255, size=(masks.max() + 1, 3)) | |
| colors[0] = [0, 0, 0] # Background stays black | |
| # Create colored overlay | |
| colored_mask = colors[masks] | |
| # Blend with original image | |
| alpha = 0.4 | |
| overlay = (1 - alpha) * overlay + alpha * colored_mask | |
| # Ensure values are in valid range and convert to uint8 | |
| overlay = np.clip(overlay, 0, 255).astype(np.uint8) | |
| # Convert result to PIL Image for output | |
| overlay_image = Image.fromarray(overlay) | |
| return cell_count, overlay_image | |
| # Gradio interface | |
| demo = gr.Interface( | |
| fn=segment_and_count, | |
| inputs=[ | |
| gr.Image(type="pil", label="Microscopy Image"), | |
| gr.Dropdown(choices=list(MODEL_OPTIONS.keys()), label="Select Model", value="Hemocytometer Model") | |
| ], | |
| outputs=[ | |
| gr.Number(label="Number of Cells"), | |
| gr.Image(type="pil", label="Segmented Overlay") | |
| ], | |
| title="Cell Counter with Cellpose", | |
| description="Upload a microscopy image and select a model to count the number of cells using Cellpose segmentation." | |
| ) | |
| if __name__ == "__main__": | |
| demo.launch() |