Spaces:
Build error
Build error
import streamlit as st | |
import cv2 | |
import numpy as np | |
from PIL import Image | |
import torch | |
!git clone --recursive https://github.com/frank-xwang/UnSAM.git | |
!python -m pip install 'git+https://github.com/MaureenZOU/detectron2-xyz.git' | |
%cd UnSAM | |
!python -m pip install -r requirements.txt | |
# uncomment the following lines if you want to run with GPU | |
%cd whole_image_segmentation/mask2former/modeling/pixel_decoder/ops | |
!sh make.sh | |
# clone and install Mask2Former | |
!git clone https://github.com/facebookresearch/Mask2Former.git | |
%cd Mask2Former | |
!pip install -U opencv-python | |
!pip install git+https://github.com/cocodataset/panopticapi.git | |
!pip install -r requirements.txt | |
%cd mask2former/modeling/pixel_decoder/ops | |
!python setup.py build install | |
%cd ../../../../ | |
%cd /kaggle/working/Mask2Former | |
#%cd /kaggle/working/UnSAM/whole_image_segmentation/mask2former/modeling/pixel_decoder/ops/Mask2Former | |
#%cd /kaggle/working/UnSAM/whole_image_segmentation/mask2former | |
import detectron2 | |
from detectron2.utils.logger import setup_logger | |
setup_logger() | |
setup_logger(name="mask2former") | |
# import some common libraries | |
import numpy as np | |
import cv2 | |
import torch | |
from detectron2.engine import DefaultPredictor | |
from detectron2.config import get_cfg | |
from detectron2.projects.deeplab import add_deeplab_config | |
from detectron2.utils.colormap import random_color | |
from mask2former import add_maskformer2_config | |
from tqdm import tqdm | |
def setup_predictor(config_file, weights_path, device='cpu'): | |
cfg = get_cfg() | |
cfg.set_new_allowed(True) | |
add_deeplab_config(cfg) | |
add_maskformer2_config(cfg) | |
cfg.merge_from_file(config_file) | |
cfg.MODEL.WEIGHTS = weights_path | |
cfg.MODEL.DEVICE = device | |
predictor = DefaultPredictor(cfg) | |
return predictor | |
def area(mask): | |
if mask.size == 0: | |
return 0 | |
return np.count_nonzero(mask) / mask.size | |
def vis_mask(input, mask, mask_color): | |
fg = mask > 0.5 | |
rgb = np.copy(input) | |
rgb[fg] = (rgb[fg] * 0.5 + np.array(mask_color) * 0.5).astype(np.uint8) | |
return Image.fromarray(rgb) | |
def show_image(I, pool): | |
already_painted = np.zeros(np.array(I).shape[:2]) | |
input = I.copy() | |
for mask in tqdm(pool): | |
already_painted += mask.astype(np.uint8) | |
overlap = (already_painted == 2) | |
if np.sum(overlap) != 0: | |
input = Image.fromarray(overlap[:, :, np.newaxis] * np.copy(I) + np.logical_not(overlap)[:, :, np.newaxis] * np.copy(input)) | |
already_painted -= overlap | |
input = vis_mask(input, mask, random_color(rgb=True)) | |
return input | |
# Load UnSAM and UnSAM+ predictors | |
unsam_predictor = setup_predictor( | |
"/kaggle/working/UnSAM/whole_image_segmentation/configs/maskformer2_R50_bs16_50ep.yaml", | |
"/kaggle/working/Mask2Former/unsam_sa1b_4perc_ckpt_200k.pth" | |
) | |
unsam_plus_predictor = setup_predictor( | |
"/kaggle/working/UnSAM/whole_image_segmentation/configs/maskformer2_R50_bs16_50ep.yaml", | |
"/kaggle/working/Mask2Former/unsam_plus_sa1b_1perc_ckpt_50k.pth" | |
) | |
st.title("Image Segmentation with UnSAM and UnSAM+") | |
# Upload image | |
uploaded_file = st.file_uploader("Choose an image...", type="png") | |
if uploaded_file is not None: | |
# Read the image | |
image = np.array(Image.open(uploaded_file)) | |
# Display the original image | |
st.image(image, caption='Original Image', use_column_width=True) | |
# Run predictions for UnSAM+ | |
unsam_plus_outputs = unsam_plus_predictor(image)['instances'] | |
unsam_plus_masks = [mask.cpu().numpy() for mask in unsam_plus_outputs.pred_masks] | |
sorted_unsam_plus_masks = sorted(unsam_plus_masks, key=lambda m: area(m), reverse=True) | |
unsam_plus_image = show_image(image, sorted_unsam_plus_masks) | |
# Run predictions for UnSAM | |
unsam_outputs = unsam_predictor(image)['instances'] | |
unsam_masks = [mask.cpu().numpy() for mask in unsam_outputs.pred_masks] | |
sorted_unsam_masks = sorted(unsam_masks, key=lambda m: area(m), reverse=True) | |
unsam_image = show_image(image, sorted_unsam_masks) | |
# Display the images side by side | |
st.image([image, unsam_plus_image, unsam_image], caption=['Original Image', 'UnSAM+ Output', 'UnSAM Output'], use_column_width=True) | |