Mohamed-ENNHIRI
Add Tab 7: resolution study (segformer_b0 + U-Net at 192/256/512)
a3200e4
Raw
History Blame Contribute Delete
1.22 kB
"""Confusion-matrix-based metrics. Same as the other experiments."""
import torch
class SegMetrics:
def __init__(self, threshold=0.5):
self.threshold = threshold
self.reset()
def reset(self):
self.tp = 0.0
self.fp = 0.0
self.fn = 0.0
self.tn = 0.0
@torch.no_grad()
def update(self, logits_or_probs, target, output_is_prob=False):
pred = logits_or_probs if output_is_prob else torch.sigmoid(logits_or_probs)
pred = (pred > self.threshold).float()
target = target.float()
self.tp += (pred * target).sum().item()
self.fp += (pred * (1 - target)).sum().item()
self.fn += ((1 - pred) * target).sum().item()
self.tn += ((1 - pred) * (1 - target)).sum().item()
def compute(self):
eps = 1e-7
tp, fp, fn, tn = self.tp, self.fp, self.fn, self.tn
fg_iou = tp / (tp + fp + fn + eps)
bg_iou = tn / (tn + fp + fn + eps)
return {
"iou": float(fg_iou),
"miou": float(0.5 * (fg_iou + bg_iou)),
"dice": float((2 * tp) / (2 * tp + fp + fn + eps)),
"pixel_acc": float((tp + tn) / (tp + tn + fp + fn + eps)),
}