Alex Hortua
Creating a faster version with a different approach (Training with a frozen Backbone of COCO images)
b87aa54
import torch
from utils import calculate_ap
from torchvision.transforms import functional as F
@torch.no_grad()
def calculate_map(model, data_loader, device, iou_threshold=0.5, num_classes=2):
"""Calculate Mean Average Precision (mAP) across all classes."""
model.eval()
all_predictions = []
all_targets = []
for images, targets in data_loader:
# Convert PIL images to tensors before sending to GPU
images = [F.to_tensor(img).to(device) for img in images]
predictions = model(images)
all_predictions.extend(predictions)
all_targets.extend(targets)
aps = []
for class_id in range(1, num_classes):
predictions_class = []
targets_class = []
for pred, target in zip(all_predictions, all_targets):
pred_boxes = pred['boxes'].cpu()
pred_scores = pred['scores'].cpu()
pred_labels = pred['labels'].cpu()
target_boxes = target['boxes'].cpu()
target_labels = target['labels'].cpu()
pred_mask = pred_labels == class_id
target_mask = target_labels == class_id
predictions_class.append({'boxes': pred_boxes[pred_mask], 'scores': pred_scores[pred_mask]})
targets_class.append({'boxes': target_boxes[target_mask]})
ap = calculate_ap(predictions_class, targets_class, iou_threshold)
aps.append(ap)
return sum(aps) / len(aps)
@torch.no_grad()
def evaluate_model(model, val_loader, device):
"""Evaluate model performance using mAP."""
mAP = calculate_map(model, val_loader, device)
print(f"Validation mAP: {mAP:.4f}")
return mAP