File size: 5,846 Bytes
9b33231
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
import streamlit as st
from PIL import Image
import pandas as pd
import matplotlib.pyplot as plt
import numpy as np
from io import BytesIO
import uuid
import gc

import sys
import os

sys.path.append(os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
from segmentation_model import load_model,transform_image, run_inference, save_input_image, save_objects_and_metadata, extract_object
from identification_model import load_yolov8_model, run_object_detection
# from models.text_extraction_model import extract_text
# from models.summarization_model import summarize_text
# from utils.data_mapping import create_summary_table



model = load_model()
detection_model = load_yolov8_model()

def resize_image(image, size=(800, 800)):
    return image.resize(size, Image.ANTIALIAS)

def display_masks(outputs, image, threshold=0.5):
    masks = outputs[0]['masks']
    scores = outputs[0]['scores']
    
    fig, ax = plt.subplots()
    ax.imshow(np.array(image))

    extracted_objects = []
    
    for i in range(len(scores)):
        if scores[i] > threshold:
            mask = masks[i].squeeze().cpu().numpy()
            mask = np.where(mask > 0.5, 1, 0).astype(np.uint8)

            object_img = extract_object(image,mask)
            extracted_objects.append(object_img)
            #Display the mask
            ax.imshow(mask, cmap='jet', alpha=0.5)  # Overlay mask on image
    
    st.pyplot(fig)

    return extracted_objects

    

st.title("Image Segmentation with Mask R-CNN and Object Detection")

uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])

if uploaded_file is not None:
    # Convert uploaded file to PIL Image
    image = uploaded_file
    st.image(image, caption='Uploaded Image.', use_column_width=True)
    image = Image.open(uploaded_file).convert('RGB')
    # Generate a unique master ID for the image
    master_id = str(uuid.uuid4())
    
    # Save the input image
    save_input_image(image, master_id)
    # Transform image
    image_tensor = transform_image(image)
    outputs = run_inference(model, image_tensor)

    extracted_objects = display_masks(outputs, image)
    
    if extracted_objects:
    # Save the extracted objects and their metadata
        metadata = save_objects_and_metadata(extracted_objects, master_id)
    
    # Display metadata as a JSON output
        st.write("Metadata for extracted objects:")
        #st.json(metadata)
    
    # Display each extracted object
        st.write("Extracted Objects:")
        for i, obj_img in enumerate(extracted_objects):
         st.image(obj_img, caption=f'Object {i+1}', use_column_width=True)
         # Convert the object image to a numpy array for YOLO inference
         obj_img_np = np.array(obj_img)
         # Run object detection on each extracted object
         detection_results = run_object_detection(detection_model, obj_img_np)
         st.write(f"Detection results for Object {i+1}:")
         st.json(detection_results)
    else:
        st.write("No objects were detected")


    # del extracted_objects
    # gc.collect()
    
    # Display results
    #display_masks(outputs, image) 





if uploaded_file is not None:
    image = Image.open(uploaded_file).convert("RGB")
    st.image(image, caption='Uploaded Image.', use_column_width=True)
    
    image_tensor = transform_image(image)
    outputs = run_inference(model, image_tensor)
    
    display_masks(outputs, image)



# def upload_image():
#     uploaded_file = st.file_uploader("Choose an image...", type=["jpg", "jpeg", "png"])
#     if uploaded_file is not None:
#         image = Image.open(uploaded_file)
#         return image
#     return None


# # def display_segmentation(image):
# #     st.image(image, caption="Original Image", use_column_width=True)
    
#     # Transform and run inference
#     # image_tensor = transform_image(image)
#     # outputs = run_inference(image_tensor)

#     # # Save segmented objects
#     # output_dir = 'segmented_objects/'
#     # save_segmented_objects(image, outputs, output_dir)
    
#     # segmented_images = [Image.open(f"{output_dir}object_{i+1}.png") for i in range(len(outputs[0]['scores']))]
#     # for img in segmented_images:
#     #     st.image(img, caption="Segmented Object", use_column_width=True)




# def main():
#     st.title("Image Processing Pipeline")

# #     uploaded_file = st.file_uploader("Upload an image", type=["jpg", "png"])
# #     if uploaded_file:
# #         image_path = f"data/input_images/{uploaded_file.name}"
# #         image = Image.open(uploaded_file)
# #         image.save(image_path)  # Save the uploaded image for further processing
# #         st.image(image, caption="Uploaded Image")

# #         if st.button("Segment Image"):
# #             segmented = segment_image(image_path)
# #             st.image(segmented, caption="Segmented Image", use_column_width=True)

# #         if st.button("Identify and Extract Objects"):
# #             objects_data = identify_and_extract_objects(image_path)
# #             extracted_objects = []

# #             for obj_data in objects_data:
# #                 object_image = Image.open(obj_data['Image Path'])
# #                 text = extract_text(object_image)
# #                 summary = summarize_text(text)
# #                 obj_data['Text'] = text
# #                 obj_data['Summary'] = summary
# #                 extracted_objects.append(obj_data)

# #                 st.image(object_image, caption=f"Object {obj_data['ID']} - Label {obj_data['Label']}")

# #             summary_file = create_summary_table(extracted_objects)
# #             st.write(pd.DataFrame(extracted_objects))
# #             st.download_button(label="Download Summary Table", data=open(summary_file).read(), file_name="summary.csv")

# if __name__ == "__main__":
#     main()