FastSAM / utils /tools.py
kishkath's picture
Create tools.py
70c642e
Raw
History Blame Contribute Delete
2.26 kB
import cv2
import os
import sys
import clip
import numpy as np
from PIL import Image
import matplotlib.pyplot as plt
def convert_box_xywh_to_xyxy(box):
if len(box) == 4:
return [box[0],box[1],box[0]+box[2],box[1]+box[3]]
else:
result = []
for b in box:
b = convert_box_xywh_to_xyxy(b)
result.append(b)
return result
def segment_image(image,bbox):
image_array = np.array(image)
segmented_image_array = np.zeros_like(image_array)
x1,y1,x2,y2 = bbox
segmented_image_array[y1:y2,x1:x2] = image_array[y1:y2,x1:x2]
segmented_image = Image.fromarray(segmented_image_array)
black_image = Image.new("RGB",image.size,(255,255,255))
transparency_mask = np.zeros((image_array.shape[0],image_array.shape[1]),dtype=np.uint8)
transparency_mask[y1:y2,x1:x2] = 255
transparency_mask_image = Image.fromarray(transparency_mask,mode="L")
black_image.paste(segmented_image,mask=transparency_mask_image)
return black_image
def format_results(result,filter=0):
annotations = []
n = len(result.masks.data)
for i in range(n):
annotation = []
mask = result.masks.data[i] == 1.0
if torch.sum(mask) < filter:
continue
annotation['id'] = i
annotation['segmentation'] = mask.cpu().numpy()
annotation['bbox'] = result.boxes.data[i]
annotation['score'] = result.boxes.conf[i]
annotation['area'] = annotation['segmentation'].sum()
annotations.append(annotation)
return annotations
def filter_masks(annotations):
annotations.sort(key=lambda x: x['area'],reverse=True)
to_remove = set()
for i in range(0,len(annotations)):
a = annotations[i]
for j in range(i+1,len(annotations)):
b = annotations[j]
if i!=j and (j not in to_remove):
if b['area'] < a['area']:
if (a['segmentation'] & b['segmentation']).sum()/b['segmentation'].sum()>0.8:
to.remove.add(j)
return [a for i,a in enumerate(annotations) if i not in to_remove], to_remove
def get_bbox_from_mask(mask):
mask = mask.astype(np.uint8)
contours,hierarchy = cv2.findContours(mask,cv2.RETR)