Spaces:
Running
Running
| import warnings | |
| import numpy as np | |
| import requests | |
| from PIL import Image | |
| import gradio as gr | |
| from lang_sam import LangSAM | |
| model = LangSAM() | |
| text_prompt = """ | |
| Focus on the inner circular region captured by the endoscopic camera. Identify only small, raised, and rounded growths (polyps) with smooth and well-defined edges. These polyps typically appear brighter or redder than the surrounding tissue and have a soft, protruding texture. Ignore any flat areas, reflections, or irregular shapes that do not match these criteria. Avoid including empty or uniformly colored regions without distinct structures. | |
| Multiple polyps may exist in one image. | |
| """ | |
| def highlight_mask_on_image(image, mask_np, color=(0, 200, 0), alpha=0.7): | |
| """Tô màu cho khu vực được xác định bởi mask lên hình ảnh gốc.""" | |
| image_np = np.array(image) | |
| if mask_np.shape != image_np.shape[:2]: | |
| raise ValueError("Kích thước của mask không khớp với kích thước của hình ảnh") | |
| highlighted_image = image_np.copy() | |
| mask_indices = mask_np > 0 # Chỉ lấy các vùng có mask | |
| highlighted_image[mask_indices] = (1 - alpha) * image_np[mask_indices] + alpha * np.array(color) | |
| return Image.fromarray(highlighted_image.astype(np.uint8)) | |
| def display_masks_np(masks_np): | |
| """ | |
| Hiển thị từng mask từ danh sách masks_np. | |
| Parameters: | |
| masks_np (list): Danh sách các mask dưới dạng numpy array. | |
| Returns: | |
| None: Hiển thị từng mask. | |
| """ | |
| import matplotlib.pyplot as plt | |
| print(f"Number of masks to display: {len(masks_np)}") | |
| for i, mask_np in enumerate(masks_np): | |
| print(f"Mask {i + 1} statistics: min={np.min(mask_np)}, max={np.max(mask_np)}, sum={np.sum(mask_np)}") | |
| if np.sum(mask_np) > 0: # Chỉ hiển thị mask nếu không rỗng | |
| plt.imshow(mask_np, cmap="gray") | |
| plt.title(f"Mask {i + 1}") | |
| plt.axis("off") | |
| plt.show() | |
| else: | |
| print(f"Mask {i + 1} is empty (all zeros).") | |
| def main(image): | |
| # Convert image to RGB | |
| image_pil = image.convert("RGB") | |
| # Get prediction results from the model | |
| res = model.predict([image_pil], [text_prompt]) | |
| # Check if the result has the expected structure | |
| if not isinstance(res, list) or len(res) == 0 or not isinstance(res[0], dict): | |
| raise ValueError("Unexpected result structure from model.predict") | |
| # Extract masks, boxes, phrases, and logits from the result | |
| masks = res[0].get("masks", []) | |
| boxes = res[0].get("boxes", []) | |
| phrases = res[0].get("phrases", []) | |
| logits = res[0].get("scores", []) | |
| # Handle the case where no masks are detected | |
| if len(masks) == 0: | |
| print(f"No objects of the '{text_prompt}' prompt detected in the image.") | |
| return image_pil # Return the original image if no masks are detected | |
| # Convert masks to numpy arrays (if not already numpy arrays) | |
| masks_np = [mask.squeeze() if isinstance(mask, np.ndarray) else mask.cpu().numpy() for mask in masks] | |
| # Skip the first mask and process only masks from the second one onwards | |
| if len(masks_np) > 1: | |
| masks_np = masks_np[1:] # Bỏ mask đầu tiên | |
| # Combine masks if there are multiple masks | |
| if len(masks_np) > 1: | |
| combined_mask = np.sum(masks_np, axis=0) > 0 | |
| else: | |
| combined_mask = masks_np[0] | |
| # Highlight the combined mask on the original image | |
| highlighted_image = highlight_mask_on_image(image_pil, combined_mask) | |
| #display_masks_np(masks_np) # Display the remaining masks | |
| return highlighted_image # Return the highlighted image | |
| def create_polyb(): | |
| with gr.Blocks() as demo: | |
| gr.Markdown("Hãy tải ảnh lên và nhấn **Xử Lý** để khoanh vùng Polyp.") | |
| with gr.Row(): | |
| inp = gr.Image(label= "Nhập Ảnh",type="pil",height=512, width=512,value="../anh/viemphoi.jpeg",interactive=True) | |
| out = gr.Image(label="Kết Quả Dự Đoán", type = 'pil', height=512, width=512) | |
| btn = gr.Button("Xử Lý") | |
| btn.click(fn=main, inputs=inp, outputs=out) | |
| return demo |