Upload agents/optical_agent.py with huggingface_hub
Browse files- agents/optical_agent.py +9 -23
agents/optical_agent.py
CHANGED
|
@@ -37,10 +37,10 @@ def f01_ca_magnitude(img: Image.Image) -> Dict[str, Any]:
|
|
| 37 |
rb = float(np.corrcoef(er[::step],eb[::step])[0,1])
|
| 38 |
gb = float(np.corrcoef(eg[::step],eb[::step])[0,1])
|
| 39 |
avg = (rg+rb+gb)/3
|
| 40 |
-
if avg > 0.99: s,n = 0.
|
| 41 |
elif avg < 0.70: s,n = 0.5, "Abnormally low channel correlation"
|
| 42 |
elif 0.80<=avg<=0.97: s,n = -0.4, "Natural CA pattern detected"
|
| 43 |
-
else: s,n = 0.
|
| 44 |
return {"test":"CA Magnitude","avg_corr":round(avg,4),"score":s,"note":n}
|
| 45 |
|
| 46 |
# ββ 2. CA Radial Gradient ββββββββββββββββββββββββββββββββββββββββββββ
|
|
@@ -103,8 +103,8 @@ def f05_vignetting_symmetry(img: Image.Image) -> Dict[str, Any]:
|
|
| 103 |
q3 = float(np.mean(gray[h//2:,:w//2])); q4 = float(np.mean(gray[h//2:,w//2:]))
|
| 104 |
qs = [q1,q2,q3,q4]; std = float(np.std(qs)); mean = float(np.mean(qs))
|
| 105 |
asym = std/(mean+1e-9)
|
| 106 |
-
if asym < 0.03: s,n = -0.
|
| 107 |
-
elif asym > 0.
|
| 108 |
else: s,n = 0.0, f"Moderate asymmetry ({asym:.4f})"
|
| 109 |
return {"test":"Vignetting Symmetry","asymmetry":round(asym,4),"score":s,"note":n}
|
| 110 |
|
|
@@ -381,9 +381,9 @@ def f20_optical_center(img: Image.Image) -> Dict[str, Any]:
|
|
| 381 |
cy, cx = h/2, w/2
|
| 382 |
offset_y = abs(y_max - cy)/(h+1e-9); offset_x = abs(x_max - cx)/(w+1e-9)
|
| 383 |
offset = np.sqrt(offset_y**2 + offset_x**2)
|
| 384 |
-
if offset < 0.1: s,n = -0.
|
| 385 |
elif offset < 0.25: s,n = 0.0, f"Slight optical center offset ({offset:.3f})"
|
| 386 |
-
else: s,n = 0.
|
| 387 |
return {"test":"Optical Center","offset":round(offset,4),"score":s,"note":n}
|
| 388 |
|
| 389 |
|
|
@@ -395,20 +395,6 @@ ALL_TESTS = [f01_ca_magnitude,f02_ca_radial,f03_lateral_ca,f04_vignetting,
|
|
| 395 |
f17_sharpness_falloff,f18_diffraction,f19_geometric_distortion,f20_optical_center]
|
| 396 |
|
| 397 |
def run_optical_agent(img: Image.Image) -> AgentEvidence:
|
| 398 |
-
|
| 399 |
-
|
| 400 |
-
|
| 401 |
-
r = fn(img); findings.append(r); scores.append(r["score"])
|
| 402 |
-
except Exception as e:
|
| 403 |
-
findings.append({"test":fn.__name__,"error":str(e),"score":0})
|
| 404 |
-
avg = float(np.mean(scores)) if scores else 0.0
|
| 405 |
-
conf = min(1.0, 0.5+0.5*abs(avg))
|
| 406 |
-
viol = [f["test"] for f in findings if f.get("score",0)>0.2]
|
| 407 |
-
comp = [f["test"] for f in findings if f.get("score",0)<-0.1]
|
| 408 |
-
if viol: rat = f"Optical violations: {', '.join(viol)}."
|
| 409 |
-
elif comp: rat = f"Optical physics consistent: {', '.join(comp)}."
|
| 410 |
-
else: rat = "Optical analysis inconclusive."
|
| 411 |
-
for f in findings:
|
| 412 |
-
if f.get("note"): rat += f" [{f['test']}]: {f['note']}."
|
| 413 |
-
return AgentEvidence("Optical Physics Agent", np.clip(avg,-1,1), conf,
|
| 414 |
-
max(0.0,1.0-len(scores)/len(ALL_TESTS)), rat, findings)
|
|
|
|
| 37 |
rb = float(np.corrcoef(er[::step],eb[::step])[0,1])
|
| 38 |
gb = float(np.corrcoef(eg[::step],eb[::step])[0,1])
|
| 39 |
avg = (rg+rb+gb)/3
|
| 40 |
+
if avg > 0.99: s,n = 0.35, "Near-perfect channel alignment β weak CA indicator (modern diffusion models can produce CA)"
|
| 41 |
elif avg < 0.70: s,n = 0.5, "Abnormally low channel correlation"
|
| 42 |
elif 0.80<=avg<=0.97: s,n = -0.4, "Natural CA pattern detected"
|
| 43 |
+
else: s,n = 0.15, "Borderline CA"
|
| 44 |
return {"test":"CA Magnitude","avg_corr":round(avg,4),"score":s,"note":n}
|
| 45 |
|
| 46 |
# ββ 2. CA Radial Gradient ββββββββββββββββββββββββββββββββββββββββββββ
|
|
|
|
| 103 |
q3 = float(np.mean(gray[h//2:,:w//2])); q4 = float(np.mean(gray[h//2:,w//2:]))
|
| 104 |
qs = [q1,q2,q3,q4]; std = float(np.std(qs)); mean = float(np.mean(qs))
|
| 105 |
asym = std/(mean+1e-9)
|
| 106 |
+
if asym < 0.03: s,n = -0.15, f"Symmetric brightness (asym={asym:.4f}) β real optics"
|
| 107 |
+
elif asym > 0.2: s,n = 0.15, f"Asymmetric brightness (asym={asym:.4f}) β possible manipulation (but could be scene lighting)"
|
| 108 |
else: s,n = 0.0, f"Moderate asymmetry ({asym:.4f})"
|
| 109 |
return {"test":"Vignetting Symmetry","asymmetry":round(asym,4),"score":s,"note":n}
|
| 110 |
|
|
|
|
| 381 |
cy, cx = h/2, w/2
|
| 382 |
offset_y = abs(y_max - cy)/(h+1e-9); offset_x = abs(x_max - cx)/(w+1e-9)
|
| 383 |
offset = np.sqrt(offset_y**2 + offset_x**2)
|
| 384 |
+
if offset < 0.1: s,n = -0.1, f"Optical center near image center (offset={offset:.3f})"
|
| 385 |
elif offset < 0.25: s,n = 0.0, f"Slight optical center offset ({offset:.3f})"
|
| 386 |
+
else: s,n = 0.1, f"Optical center offset ({offset:.3f}) β unreliable for scenes with bright objects"
|
| 387 |
return {"test":"Optical Center","offset":round(offset,4),"score":s,"note":n}
|
| 388 |
|
| 389 |
|
|
|
|
| 395 |
f17_sharpness_falloff,f18_diffraction,f19_geometric_distortion,f20_optical_center]
|
| 396 |
|
| 397 |
def run_optical_agent(img: Image.Image) -> AgentEvidence:
|
| 398 |
+
from agents.utils import run_agent_tests
|
| 399 |
+
findings, avg, conf, fail, rat = run_agent_tests(ALL_TESTS, img, "Optical Physics Agent")
|
| 400 |
+
return AgentEvidence("Optical Physics Agent", np.clip(avg,-1,1), conf, fail, rat, findings)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|