File size: 2,010 Bytes
17133be | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | """Static descriptive benchmark figure; no invented confidence intervals."""
from pathlib import Path
import json
import matplotlib
matplotlib.use('Agg')
import matplotlib.pyplot as plt
root=Path(__file__).parent
j=json.loads((root.parents[1]/'cascade_benchmark/receipts/metrics-680.json').read_text(encoding='utf8'))
fig,axes=plt.subplots(2,1,figsize=(10,7.8),layout='constrained')
panels=[('Image alerts / Alertes image',[
('Positive-image recall / Rappel images positives',j['image']['recall'],'#377eb8'),
('Negative false-alarm rate / Fausses alertes négatives',j['image']['negative_false_alarm_rate'],'#d95f02')]),
('Flame localization / Localisation flamme',[
('Proposal containment / Couverture propositions',j['flame']['proposal_gt_containment_recall'],'#7a7a7a'),
('Box recall at IoU ≥ .5 / Rappel boîtes',j['flame']['recall'],'#377eb8'),
('Tiny flame recall / Rappel petites flammes',j['flame']['tiny_recall'],'#377eb8')])]
for ax,(title,rows) in zip(axes,panels):
values=[100*r[1]['value'] for r in rows]
ax.barh(range(len(rows)),values,color=[r[2] for r in rows],height=.58)
ax.set_yticks(range(len(rows)),[r[0] for r in rows],fontsize=9)
ax.invert_yaxis();ax.set_xlim(0,125);ax.set_xticks([0,25,50,75,100]);ax.set_xticklabels(['0%','25%','50%','75%','100%'])
ax.set_title(title,loc='left',fontsize=12,fontweight='bold')
ax.spines[['top','right','left']].set_visible(False);ax.grid(axis='x',alpha=.18);ax.set_axisbelow(True)
for i,(_,r,_) in enumerate(rows):ax.text(values[i]+1,i,f"{values[i]:.2f}% {r['success']}/{r['n']}",va='center',fontsize=9)
fig.suptitle('FireViewer v2.5 · 680 images · frozen PyTorch FP32 cascade on L4',fontsize=14,fontweight='bold')
fig.supxlabel('229 visual families; correlated views. Descriptive ratios, no independent-event confidence intervals.\nTiny: box area/image area ≤ (32/1088)². Point-base accuracy unmeasured. LiteRT/Android performance not shown.',fontsize=9)
out=root/'cascade-v25-benchmark.png';fig.savefig(out,dpi=155);print(out)
|