File size: 4,150 Bytes
5eb0103
be0b780
 
 
 
 
14f65d2
be0b780
 
 
f9ed910
be0b780
 
 
f9ed910
be0b780
 
 
 
 
 
 
 
 
 
 
 
 
f9ed910
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
be0b780
 
f9ed910
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
be0b780
f9ed910
 
be0b780
f9ed910
 
 
be0b780
f9ed910
 
 
 
 
be0b780
f9ed910
 
 
 
 
be0b780
73559a6
 
 
56e3d5a
f29f9e5
73559a6
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101

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