danie94-lml's picture
Update app.py
b1587c2 verified
import streamlit as st
import torch,torchvision
import detectron2
import pickle
from detectron2.utils.logger import setup_logger
logger = setup_logger()
from detectron2.engine import DefaultPredictor
from detectron2.projects import point_rend
from viz_app import plot_single_image # Correct import
from PIL import Image
import numpy as np
from detectron2.data import MetadataCatalog, DatasetCatalog
from detectron2.utils.visualizer import Visualizer
from collections import Counter
# Define configuration parameters
output_directories = {
"4 Classes": "output/pointrend_4_cls_6_nest_8k/",
}
# Function to load the configuration
def load_configuration(output_dir):
with open(output_dir + "cfg.pickle", "rb") as f:
return pickle.load(f)
# Function to run instance segmentation
def run_instance_segmentation(im, predictor, num_classes):
outputs = plot_single_image(im, predictor,num_classes)
masks = outputs['instances'].pred_masks.cpu().numpy()
classes = outputs['instances'].pred_classes.cpu().numpy()
if num_classes == 2:
# Create masks for Nest and Inorganic Material
nest_masks = masks[classes == 0]
inorganic_material_masks = masks[classes == 1]
# Calculate the total pixel area of Nest masks
total_nest_area = np.sum(nest_masks)
# Calculate the total area of Inorganic Material masks
total_inorganic_area = np.sum(inorganic_material_masks)
# Contar la cantidad de máscaras por categoría
mask_counts = Counter(classes)
elif num_classes == 4:
# Create masks for Nest and Inorganic Material
plastic_masks = masks[classes == 0]
fishing_net_masks = masks[classes == 1]
rope_cloth_masks = masks[classes == 2]
nest_masks = masks[classes == 3]
# Calculate the total pixel area of Nest masks
total_nest_area = np.sum(nest_masks)
# Calculate the total area of Inorganic Material masks
plastic_area = np.sum(plastic_masks)
fishing_net_area = np.sum(fishing_net_masks)
rope_cloth_area = np.sum(rope_cloth_masks)
total_inorganic_area = np.sum([plastic_area, fishing_net_area, rope_cloth_area])
# Contar la cantidad de máscaras por categoría
mask_counts = Counter(classes)
return total_nest_area, total_inorganic_area, mask_counts
def click_instance_segmentation(image, model_selection, predictor):
im = np.array(image)[:, :, ::-1]
if st.button("Run Instance Segmentation"):
num_classes = 2 if model_selection == "2 Classes" else 4
total_nest_area, total_inorganic_area, mask_counts = run_instance_segmentation(im, predictor, num_classes)
# Calculate the percentage of inorganic material within the Nest
percentage_inorganic_in_nest = (total_inorganic_area / total_nest_area) * 100
st.write(f"Percentage of Inorganic Material in Nest: {percentage_inorganic_in_nest:.2f}%")
category_list = ['Plastic', 'Fishing_Net', 'Rope/Cloth', "Nest"]
# Mostrar la cantidad de máscaras por categoría
st.write("Mask Counts by Category:")
for category, count in mask_counts.items():
st.write(f"Category {category_list[category]}: {count} masks")
def app():
# Create a sidebar to select the model
model_selection = st.sidebar.radio("Select Model", list(output_directories.keys()))
output_dir = output_directories[model_selection]
cfg = load_configuration(output_dir)
cfg.MODEL.WEIGHTS = output_dir + "model_best.pth"
cfg.MODEL.DEVICE = "cpu"
cfg.MODEL.ROI_HEADS.SCORE_THRESH_TEST = 0.65
predictor = DefaultPredictor(cfg)
default_image_path = 'image/DJI_0228_frame_0022_object_0.jpg'
st.header('Please upload an image')
file = st.file_uploader('', type=['png', 'jpg', 'jpeg'])
if file:
image = Image.open(file)
st.image(image, caption="Uploaded Image", use_column_width=True)
click_instance_segmentation(image, model_selection, predictor)
else:
st.write("No image uploaded. Using default example image.")
image = Image.open(default_image_path)
st.image(image, caption="Default Example Image", use_column_width=True)
click_instance_segmentation(image, model_selection, predictor)
app()