real / MeAI_Maincode /Polyb.py
dangtiendatdat's picture
Update MeAI_Maincode/Polyb.py
f29f9e5 verified
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