User-2468's picture
Colorizer round6: source and write verification before expensive computation
05f7527 verified
Raw History Blame Contribute Delete
1.51 kB
"""Metrics are fidelity/artifact proxies; none certifies plausible color by itself."""
import numpy as np
import torch
def soft_ce(logits, idx, weights, class_weights=None):
# FP32 reduction under autocast; no full target distribution materialized.
logits=logits.float()
idx=idx.permute(0,3,1,2)
weights=weights.permute(0,3,1,2)
nll=-((logits.gather(1,idx)-logits.logsumexp(1,keepdim=True))*weights).sum(1)
if class_weights is not None:
nll=nll*class_weights[idx[:,0]]
return nll.mean()
def per_image_metrics(L, pred, target):
error=(pred-target).square().sum(1).sqrt().mean((1,2))
chroma=pred.square().sum(1).sqrt().mean((1,2))
true_chroma=target.square().sum(1).sqrt().mean((1,2))
seams=[]
for dim in [-1,-2]:
dp=pred.diff(dim=dim).square().sum(1).sqrt()
dt=target.diff(dim=dim).square().sum(1).sqrt()
dl=L.diff(dim=dim).abs()[:,0]*50
# Penalize excess chroma discontinuity where luminance is flat.
mask=(dl<2).float()
seams.append(((dp-dt).relu()*mask).sum((1,2))/mask.sum((1,2)).clamp_min(1))
return {'ab_error':error,'chroma':chroma,'target_chroma':true_chroma,
'excess_chroma_edge':sum(seams)/2}
def summarize(rows):
keys=['ce','ab_error','chroma','target_chroma','excess_chroma_edge']
result={k:float(np.mean([r[k] for r in rows])) for k in keys}
result['n']=len(rows)
result['chroma_ratio']=result['chroma']/max(result['target_chroma'],1e-9)
return result