File size: 2,901 Bytes
4fba7a2
f254011
 
4fba7a2
 
a67cc84
 
 
 
f254011
4c76544
 
a49b93f
480594f
a67cc84
a49b93f
4c76544
 
a67cc84
4c76544
 
 
 
480594f
a49b93f
4c76544
 
 
480594f
a49b93f
4c76544
a49b93f
a67cc84
 
 
 
 
 
 
 
7e0a636
 
 
a67cc84
 
 
 
 
a49b93f
a67cc84
f254011
a49b93f
f254011
a49b93f
480594f
f254011
480594f
4c76544
f254011
 
 
 
 
4c76544
1f6ce81
 
 
 
15625a2
f254011
 
 
 
 
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
import gradio as gr
import numpy as np
from transformers import MaskFormerFeatureExtractor, MaskFormerForInstanceSegmentation


# feature_extractor = MaskFormerFeatureExtractor.from_pretrained("facebook/maskformer-swin-tiny-coco")
# model = MaskFormerForInstanceSegmentation.from_pretrained("facebook/maskformer-swin-tiny-coco")
feature_extractor = MaskFormerFeatureExtractor.from_pretrained("facebook/maskformer-swin-large-coco")
model = MaskFormerForInstanceSegmentation.from_pretrained("facebook/maskformer-swin-large-coco")

def visualize_instance_seg_mask(img_in, mask, id2label):
    img_out = np.zeros((mask.shape[0], mask.shape[1], 3))
    image_total_pixels = mask.shape[0] * mask.shape[1]
    label_ids = np.unique(mask)
    vegetation_labels = ["tree-merged", "grass-merged"]

    def get_color(id):
        id_color = (np.random.randint(0, 2), np.random.randint(0, 4), np.random.randint(0, 256))
        if id2label[id] in vegetation_labels:
            id_color = (0, 140, 0)
        return id_color

    id2color = {id: get_color(id) for id in label_ids}
    id2count = {id: 0 for id in label_ids}

    for i in range(img_out.shape[0]):
      for j in range(img_out.shape[1]):
        img_out[i, j, :] = id2color[mask[i, j]]
        id2count[mask[i, j]] = id2count[mask[i, j]] + 1

    image_res = (0.5 * img_in + 0.5 * img_out) / 255

    vegetation_count = sum([id2count[id] for id in label_ids if id2label[id] in vegetation_labels])

    dataframe_vegetation_items = [[
        f"{id2label[id]}",
        f"{(100 * id2count[id] / image_total_pixels):.2f} %",
        f"{np.sqrt(id2count[id] / image_total_pixels):.2f} m"
        ] for id in label_ids if id2label[id] in vegetation_labels]
    dataframe_all_items = [[
        f"{id2label[id]}",
        f"{(100 * id2count[id] / image_total_pixels):.2f} %",
        f"{np.sqrt(id2count[id] / image_total_pixels):.2f} m"
        ] for id in label_ids]
    dataframe_vegetation_total = [[
        f"vegetation",
        f"{(100 * vegetation_count / image_total_pixels):.2f} %",
        f"{np.sqrt(vegetation_count / image_total_pixels):.2f} m"]]

    return image_res, dataframe_vegetation_total


def query_image(img):
    img_size = (img.shape[0], img.shape[1])
    inputs = feature_extractor(images=img, return_tensors="pt")
    outputs = model(**inputs)
    results = feature_extractor.post_process_semantic_segmentation(outputs=outputs, target_sizes=[img_size])[0]
    results = visualize_instance_seg_mask(img, results.numpy(), model.config.id2label)
    return results


demo = gr.Interface(
    query_image,
    inputs=[gr.Image(label="Input Image")],
    outputs=[
        gr.Image(label="Vegetation"),
        gr.DataFrame(label="Info", headers=["Object Label", "Pixel Percent", "Square Length"])
    ],
    title="Maskformer (large-coco)",
    allow_flagging="never",
    analytics_enabled=None
)

demo.launch(show_api=False)