Ruvadev commited on
Commit
2d7d577
·
verified ·
1 Parent(s): 6448eee

Delete raven/directml_inference.py

Browse files
Files changed (1) hide show
  1. raven/directml_inference.py +0 -36
raven/directml_inference.py DELETED
@@ -1,36 +0,0 @@
1
- from __future__ import annotations
2
- import numpy as np
3
- import torch
4
- import torch.nn.functional as F
5
- from .onnx_runtime import open_session,run_foundation,run_fusion
6
- from .transforms import foundation_transform
7
- from .forensic_features import load_rgb,extract_handcrafted,spectral_map,camera_residual_map
8
- from .specialists import load_specialists_checkpoint
9
- from .dataset import FeatureNormalizer,BRANCH_KEYS
10
- from .anchors import AnchorSet
11
- from .calibration import MetaCalibrator,meta_features
12
- from .provenance import inspect_provenance
13
- from .model import RavenFusion
14
-
15
-
16
- def _specialist(im,ck):
17
- spec,cam,sck=load_specialists_checkpoint(ck,"cpu"); size=int(sck["map_size"]); sm=torch.from_numpy(spectral_map(im,size)[None,None]).float(); cm=torch.from_numpy(camera_residual_map(im,size)[None,None]).float()
18
- with torch.inference_mode():
19
- ps=spec(sm); pc=cam(cm)
20
- def m(pred,target):
21
- err=torch.abs(pred-target); flat=err.flatten(1); return [float(flat.mean()),float(((pred-target)**2).flatten(1).mean()),float(1-F.cosine_similarity(pred.flatten(1),target.flatten(1),dim=1).mean()),float(torch.quantile(flat,.90))]
22
- return np.asarray(m(ps,sm)+m(pc,cm),np.float32)
23
-
24
-
25
- def infer_directml(model_path:str,foundation_onnx:str,fusion_onnx:str,image_path:str,cpu_only:bool=False):
26
- ck=torch.load(model_path,map_location="cpu",weights_only=False); im=load_rgb(image_path); tf=foundation_transform(224); x=tf(im)[None].numpy().astype(np.float32)
27
- fs=open_session(foundation_onnx,prefer_directml=not cpu_only); fus=open_session(fusion_onnx,prefer_directml=not cpu_only); sem=run_foundation(fs,x)[0].astype(np.float32)
28
- h=extract_handcrafted(im,ck["config"]["features"]); sp=_specialist(im,ck["specialists_checkpoint"]); raw={"semantic":sem,"camera":h["camera"],"spectral":h["spectral"],"patch":h["patch"],"specialist":sp}
29
- norm=FeatureNormalizer.from_dict(ck["normalizer"]); anchors=AnchorSet.from_dict(ck["anchors"]); nf={k:norm.transform(k,raw[k])[None] for k in BRANCH_KEYS}; anch=anchors.score({k:raw[k][None] for k in BRANCH_KEYS}); q=h["quality"][None].astype(np.float32); luma=np.asarray([float(h["quality"][0])],np.float32)
30
- oo=run_fusion(fus,{**nf,"quality":q,"anchors":anch,"luma":luma}); mx=meta_features(oo["logit_mean"],oo["logit_std"],oo["branch_mean"],oo["gates_mean"],anch,sp[None],q); cs=MetaCalibrator.from_dict(ck["calibrator"]).predict_stats(mx); prob=float(cs["mean"][0]); pstd=float(cs["std"][0]); plo=float(cs["lower"][0]); phi=float(cs["upper"][0]); rt=float(ck["real_threshold"]); at=float(ck["ai_threshold"]); prov=inspect_provenance(image_path)
31
- if prov.get("ai_provenance"): verdict="AI"; reason="verified provenance"
32
- elif plo>=at: verdict="AI"; reason="balanced calibration interval is above AI threshold"
33
- elif phi<=rt: verdict="REAL"; reason="balanced calibration interval is below REAL threshold"
34
- else: verdict="UNCERTAIN"; reason="calibration interval overlaps the decision region"
35
- gates=np.asarray(oo["gates_mean"])[0]; branches=1/(1+np.exp(-np.asarray(oo["branch_mean"])[0])); names=list(RavenFusion.BRANCHES)
36
- return {"verdict":verdict,"balanced_ai_probability":prob,"balanced_real_probability":1-prob,"ai_probability":prob,"probability_definition":"50:50 REAL/AI prior; not inflated by dataset counts","calibration_std":pstd,"balanced_ai_probability_interval_80":[plo,phi],"reason":reason,"providers":{"foundation":fs.get_providers(),"fusion":fus.get_providers()},"thresholds":{"REAL_max":rt,"AI_min":at},"routing_weights":{n:float(gates[i]) for i,n in enumerate(names)},"branch_evidence":{n:float(branches[i]) for i,n in enumerate(names)},"provenance":prov}