Spaces:
Sleeping
Sleeping
import cv2 | |
import numpy as np | |
def calculate_deforestation_metrics(mask, threshold=0.5): | |
""" | |
Calculate deforestation metrics from the predicted mask | |
Args: | |
mask: Predicted mask (numpy array) | |
threshold: Threshold to binarize the mask (default is 0.5) | |
Returns: | |
Dictionary containing deforestation metrics | |
""" | |
# Binarize the mask | |
binary_mask = (mask > threshold).astype(np.uint8) | |
# Calculate pixel counts | |
total_pixels = binary_mask.size | |
forest_pixels = np.sum(binary_mask) | |
deforested_pixels = total_pixels - forest_pixels | |
# Calculate percentages | |
forest_percentage = (forest_pixels / total_pixels) * 100 | |
deforested_percentage = (deforested_pixels / total_pixels) * 100 | |
# Determine deforestation level | |
if deforested_percentage < 20: | |
level = "Low" | |
elif deforested_percentage < 50: | |
level = "Medium" | |
else: | |
level = "High" | |
return { | |
"forest_pixels": forest_pixels, | |
"deforested_pixels": deforested_pixels, | |
"forest_percentage": forest_percentage, | |
"deforested_percentage": deforested_percentage, | |
"deforestation_level": level, | |
} | |
def create_overlay(original_image, mask, threshold=0.5, alpha=0.5): | |
""" | |
Create a visualization by overlaying the mask on the original image | |
Args: | |
original_image: Original RGB image | |
mask: Predicted mask | |
threshold: Threshold to binarize the mask | |
alpha: Opacity of the overlay | |
Returns: | |
Overlay image | |
""" | |
# Resize mask to match original image if needed | |
if original_image.shape[:2] != mask.shape[:2]: | |
mask = cv2.resize(mask, (original_image.shape[1], original_image.shape[0])) | |
# Create binary mask | |
binary_mask = (mask > threshold).astype(np.uint8) * 255 | |
# Create a colored mask (green for forest, red for deforested) | |
colored_mask = np.zeros_like(original_image) | |
colored_mask[binary_mask == 255] = [0, 255, 0] # Green for forest | |
colored_mask[binary_mask == 0] = [150, 75, 0] # Brown for deforested | |
# Create overlay | |
overlay = cv2.addWeighted(original_image, 1 - alpha, colored_mask, alpha, 0) | |
return overlay | |
CLASS_NAMES = ['bike-bicycle', 'bus-truck', 'car', 'fire', 'human', 'smoke'] | |
COLORS = np.random.uniform(0, 255, size=(len(CLASS_NAMES), 3)) | |
def preprocess(image, img_size=640): | |
image = cv2.cvtColor(image, cv2.COLOR_BGR2RGB) | |
image = cv2.resize(image, (img_size, img_size)) | |
image = image.transpose((2, 0, 1)) # HWC to CHW | |
image = np.ascontiguousarray(image, dtype=np.float32) / 255.0 | |
return image[np.newaxis, ...] | |
def postprocess(outputs, conf_thresh=0.5, iou_thresh=0.5): | |
outputs = outputs[0].transpose() | |
boxes, scores, class_ids = [], [], [] | |
for row in outputs: | |
cls_scores = row[4:4+len(CLASS_NAMES)] | |
class_id = np.argmax(cls_scores) | |
max_score = cls_scores[class_id] | |
if max_score >= conf_thresh: | |
cx, cy, w, h = row[:4] | |
x = (cx - w/2).item() # Convert to Python float | |
y = (cy - h/2).item() | |
width = w.item() | |
height = h.item() | |
boxes.append([x, y, width, height]) | |
scores.append(float(max_score)) | |
class_ids.append(int(class_id)) | |
if len(boxes) > 0: | |
# Convert to list of lists with native Python floats | |
boxes = [[float(x) for x in box] for box in boxes] | |
scores = [float(score) for score in scores] | |
indices = cv2.dnn.NMSBoxes( | |
bboxes=boxes, | |
scores=scores, | |
score_threshold=conf_thresh, | |
nms_threshold=iou_thresh | |
) | |
if len(indices) > 0: | |
boxes = [boxes[i] for i in indices.flatten()] | |
scores = [scores[i] for i in indices.flatten()] | |
class_ids = [class_ids[i] for i in indices.flatten()] | |
return boxes, scores, class_ids | |