a gold outline the reviewer kept from the model's proposal is not judged
CI / ledger-and-tools (push) Successful in 19s

454 of the 1 029 gold outlines are a proposal kept unchanged (loop 159 of 317, pin 140 of
224, face 140 of 295, crystal 14 of 149): the pre-labelling model's own masks. The
evaluation now ignores them object by object for every model, like a crowd region: they
leave the gold, and an unmatched prediction on one of them is not a false alarm.
tools/gold_kept.py finds them against the studio's batch proposals (mask IoU >= 0.98) and
writes data/gold/kept_machine.json; evaluate_image, evaluate_dirs and gate_stats.per_frame
read it. With it, the frame-level exclusion of 845bd87 is no longer applied (it stays as
the fallback without the file), so the gold set can grow with frames the active model
pre-labelled. Every registry model is measured again on this basis and the three v5 runs
are re-gated, without promotion.

Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_013uu3Bxsu5JqFhaWa9Ftu6z
This commit is contained in:
jungfrauandClaude Fable 5.1 committed 2026-10-25 09:48:20 +01:00
1 parent 845bd87bb3
commit 63ee07fe61
38 files changed
+4800 -3173

No files matched your search

+892
View File
@@ -0,0 +1,892 @@
{
"built": "2026-10-25T09:43:48",
"frames": {
"tpi_10130": [
1
],
"tpi_14689": [
0,
1,
2
],
"tpi_16092": [
0,
1
],
"tpi_16223": [
0
],
"tpi_16235": [
0,
1
],
"tpi_16252": [
0,
1,
2
],
"tpi_16321": [
0,
1,
2
],
"tpi_16325": [
0,
1
],
"tpi_16361": [
0
],
"tpi_16956": [
0
],
"tpi_17889": [
0
],
"tpi_24512": [
0,
1,
2
],
"tpi_2869": [
0,
1
],
"tpi_31669": [
0
],
"tpi_31928": [
0
],
"tpi_32422": [
0,
1,
2
],
"tpi_32690": [
0,
1,
2
],
"tpi_32762": [
0,
1,
2
],
"tpi_33849": [
1,
2
],
"tpi_34038": [
0,
1,
2
],
"tpi_34389": [
0,
1
],
"tpi_36563": [
1,
2
],
"tpi_44119": [
0,
1,
2
],
"tpi_45649": [
0
],
"tpi_46469": [
0,
1,
2
],
"tpi_48284": [
0
],
"tpi_48572": [
0
],
"tpi_48994": [
0,
1
],
"tpi_49039": [
0,
1,
2,
3
],
"tpi_50822": [
0,
1,
2
],
"tpi_51387": [
0,
1,
2
],
"tpi_51699": [
0,
1,
2
],
"tpi_51773": [
0,
1,
2
],
"tpi_52248": [
0,
1
],
"tpi_52402": [
0,
1
],
"tpi_53961": [
0,
1,
2
],
"tpi_5421": [
0
],
"tpi_54266": [
0,
1
],
"tpi_54621": [
0
],
"tpi_55277": [
0,
1,
2
],
"tpi_55303": [
0,
1
],
"tpi_55371": [
0,
1
],
"tpi_55383": [
0
],
"tpi_55408": [
0,
1,
2
],
"tpi_55416": [
0,
1,
2
],
"tpi_55896": [
2
],
"tpi_55912": [
0
],
"tpi_56012": [
0
],
"tpi_56096": [
0
],
"tpi_56104": [
0
],
"tpi_56717": [
0
],
"tpi_56840": [
0,
1,
2
],
"tpi_57300": [
0
],
"tpi_57342": [
0,
1,
2
],
"tpi_57684": [
0
],
"tpi_57702": [
1
],
"tpi_57991": [
0
],
"tpi_59080": [
0
],
"tpi_59496": [
0
],
"tpi_59564": [
0
],
"tpi_59868": [
0,
1
],
"tpi_59935": [
0
],
"tpi_59988": [
0,
1
],
"tpi_60116": [
0,
1
],
"tpi_60129": [
0
],
"tpi_60568": [
0,
1,
2
],
"tpi_60625": [
0,
1
],
"tpi_60637": [
0,
1,
2
],
"tpi_61066": [
0,
1,
2
],
"tpi_61069": [
0,
1,
2
],
"tpi_61087": [
0
],
"tpi_61136": [
0,
1,
2
],
"tpi_61317": [
0
],
"tpi_61327": [
0
],
"tpi_61334": [
0
],
"tpi_61343": [
0
],
"tpi_61344": [
0,
1,
2
],
"tpi_61358": [
0,
1,
2
],
"tpi_61361": [
0
],
"tpi_61364": [
0,
1,
2
],
"tpi_61372": [
0
],
"tpi_61374": [
0,
1,
2
],
"tpi_61379": [
0,
1,
2
],
"tpi_61380": [
0,
1
],
"tpi_61381": [
0,
1,
2
],
"tpi_61385": [
0,
1
],
"tpi_61392": [
0,
1
],
"tpi_61411": [
0,
1,
2
],
"tpi_61419": [
0,
1,
2
],
"tpi_61430": [
0,
1
],
"tpi_61439": [
0
],
"tpi_61441": [
0,
1,
2
],
"tpi_61442": [
0,
1,
2
],
"tpi_61443": [
0,
1,
2
],
"tpi_61445": [
0
],
"tpi_61447": [
0
],
"tpi_61449": [
0
],
"tpi_61452": [
0,
1,
2
],
"tpi_61457": [
0,
1,
2
],
"tpi_61565": [
0
],
"tpi_61572": [
0
],
"tpi_61579": [
0
],
"tpi_61581": [
0,
1
],
"tpi_61594": [
0,
1
],
"tpi_61610": [
0,
1,
2
],
"tpi_61613": [
0
],
"tpi_61627": [
0
],
"tpi_61651": [
0
],
"tpi_61670": [
0
],
"tpi_61702": [
0,
1,
2
],
"tpi_61769": [
0
],
"tpi_61839": [
0
],
"tpi_61865": [
0,
1
],
"tpi_62017": [
0,
1
],
"tpi_62033": [
0,
1,
2
],
"tpi_62361": [
0,
1
],
"tpi_62413": [
0,
1
],
"tpi_62598": [
0
],
"tpi_62617": [
0,
1,
2
],
"tpi_62621": [
0,
1
],
"tpi_62622": [
0,
1,
2
],
"tpi_62623": [
0,
1,
2
],
"tpi_62631": [
0,
1,
2
],
"tpi_62634": [
0,
2
],
"tpi_62640": [
0,
1
],
"tpi_62645": [
0,
1,
2
],
"tpi_62646": [
0,
1
],
"tpi_62649": [
0,
1
],
"tpi_62656": [
0,
1
],
"tpi_62669": [
0,
1,
2
],
"tpi_62682": [
0,
1,
2
],
"tpi_62692": [
0,
1,
2
],
"tpi_62697": [
0,
1,
2
],
"tpi_62700": [
0
],
"tpi_62703": [
0,
1,
2
],
"tpi_62711": [
0,
1
],
"tpi_62717": [
0,
1
],
"tpi_62718": [
0,
1,
2
],
"tpi_62719": [
0,
1,
2
],
"tpi_62720": [
0,
1,
2
],
"tpi_62739": [
0,
2
],
"tpi_62740": [
0,
1
],
"tpi_62742": [
0,
1,
2
],
"tpi_62745": [
0,
1,
2
],
"tpi_62746": [
0,
1,
2
],
"tpi_62747": [
0,
1
],
"tpi_62749": [
0,
1,
2
],
"tpi_62751": [
0,
1
],
"tpi_62754": [
0,
1,
2
],
"tpi_62755": [
0,
1
],
"tpi_62756": [
0,
1,
2
],
"tpi_62757": [
0,
1
],
"tpi_62758": [
0,
1,
2
],
"tpi_62759": [
0,
1,
2
],
"tpi_62760": [
0,
1
],
"tpi_62761": [
0,
1
],
"tpi_62762": [
0,
1,
2
],
"tpi_62763": [
0,
1,
2
],
"tpi_62764": [
0,
1
],
"tpi_62766": [
0,
1,
2
],
"tpi_62767": [
0,
1,
2
],
"tpi_62768": [
0,
1
],
"tpi_62769": [
0,
1,
2
],
"tpi_62772": [
0
],
"tpi_62773": [
0,
1
],
"tpi_62775": [
0,
1
],
"tpi_62776": [
0,
1,
2
],
"tpi_62910": [
0,
1,
2
],
"tpi_62927": [
0,
1,
2
],
"tpi_62928": [
0,
1,
2
],
"tpi_62965": [
0,
1,
2
],
"tpi_63041": [
0,
1
],
"tpi_63202": [
0,
1
],
"tpi_63206": [
0,
1,
2
],
"tpi_63207": [
0,
1,
2
],
"tpi_63223": [
0,
1
],
"tpi_63226": [
0,
1,
2
],
"tpi_63228": [
0,
1
],
"tpi_63234": [
0,
1
],
"tpi_63239": [
0,
1
],
"tpi_63376": [
0,
1,
2
],
"tpi_63389": [
0,
1,
2
],
"tpi_63390": [
0,
1,
2,
3
],
"tpi_63416": [
0,
1,
2
],
"tpi_63420": [
0,
1,
2,
3
],
"tpi_63426": [
0,
1,
2
],
"tpi_63434": [
0,
1
],
"tpi_63436": [
0,
1,
2
],
"tpi_63461": [
0
],
"tpi_63463": [
0,
1,
2
],
"tpi_63479": [
0,
1
],
"tpi_63481": [
0,
1,
2,
3
],
"tpi_63484": [
0,
1
],
"tpi_63490": [
0,
1
],
"tpi_63492": [
0,
1
],
"tpi_63516": [
0,
1
],
"tpi_63517": [
0
],
"tpi_63518": [
0,
1
],
"tpi_63522": [
0,
1
],
"tpi_63535": [
0,
1,
2
],
"tpi_63540": [
0,
1,
2,
3
],
"tpi_63546": [
0,
1
],
"tpi_63548": [
0,
1,
2
],
"tpi_63554": [
0,
1,
2
],
"tpi_8285": [
0,
1,
2
],
"tpi_8378": [
0
],
"tpi_8507": [
0
]
},
"gold_by_class": {
"crystal": 149,
"ice": 43,
"loop_all": 317,
"loop_face": 295,
"needle": 1,
"pin": 224
},
"gold_frames": 335,
"iou": 0.98,
"kept_by_class": {
"crystal": 14,
"ice": 1,
"loop_all": 159,
"loop_face": 140,
"pin": 140
},
"source": "/home/jungfrau/AareLC_studio/data/pipeline_prod",
"with_a_proposal": 265
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 296,
"fp": 30,
"fn": 21,
"precision": 0.9079754601226994,
"recall": 0.9337539432176656,
"f1": 0.9206842923794711,
"mean_mask_iou": 0.9073751532898063,
"n_matched": 296
"tp": 143,
"fp": 29,
"fn": 15,
"precision": 0.8313953488372093,
"recall": 0.9050632911392406,
"f1": 0.8666666666666667,
"mean_mask_iou": 0.8674415312015792,
"n_matched": 143
},
"pin": {
"tp": 210,
"fp": 31,
"fn": 14,
"precision": 0.8713692946058091,
"recall": 0.9375,
"f1": 0.9032258064516129,
"mean_mask_iou": 0.9251018239521286,
"n_matched": 210
"tp": 72,
"fp": 28,
"fn": 12,
"precision": 0.72,
"recall": 0.8571428571428571,
"f1": 0.782608695652174,
"mean_mask_iou": 0.9005936416376064,
"n_matched": 72
},
"crystal": {
"tp": 63,
"tp": 59,
"fp": 60,
"fn": 86,
"precision": 0.5121951219512195,
"recall": 0.4228187919463087,
"f1": 0.4632352941176471,
"mean_mask_iou": 0.7350608356484347,
"n_matched": 63
"fn": 76,
"precision": 0.4957983193277311,
"recall": 0.43703703703703706,
"f1": 0.4645669291338583,
"mean_mask_iou": 0.7375392182625371,
"n_matched": 59
},
"loop_face": {
"tp": 242,
"fp": 57,
"fn": 53,
"precision": 0.8093645484949833,
"recall": 0.8203389830508474,
"f1": 0.8148148148148148,
"mean_mask_iou": 0.8947509538634725,
"n_matched": 242
"tp": 116,
"fp": 53,
"fn": 39,
"precision": 0.6863905325443787,
"recall": 0.7483870967741936,
"f1": 0.7160493827160493,
"mean_mask_iou": 0.8449184154775634,
"n_matched": 116
},
"ice": {
"tp": 4,
"fp": 14,
"fn": 39,
"fn": 38,
"precision": 0.2222222222222222,
"recall": 0.09302325581395349,
"f1": 0.13114754098360654,
"recall": 0.09523809523809523,
"f1": 0.13333333333333333,
"mean_mask_iou": 0.8004176972482764,
"n_matched": 4
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 815,
"fp": 192,
"fn": 214,
"precision": 0.8093346573982125,
"recall": 0.7920310981535471,
"f1": 0.8005893909626718,
"mean_mask_iou": 0.89434927935403,
"n_matched": 815
"tp": 394,
"fp": 184,
"fn": 181,
"precision": 0.6816608996539792,
"recall": 0.6852173913043478,
"f1": 0.6834345186470078,
"mean_mask_iou": 0.8467357919330295,
"n_matched": 394
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-alc-v1-2026-09-28/weights.pt",
"environment": {
@@ -83,5 +84,5 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:38:35"
"measured_at": "2026-10-25T09:45:18"
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 301,
"fp": 46,
"fn": 16,
"precision": 0.8674351585014409,
"recall": 0.9495268138801262,
"f1": 0.9066265060240963,
"mean_mask_iou": 0.9106655381480923,
"n_matched": 301
"tp": 147,
"fp": 41,
"fn": 11,
"precision": 0.7819148936170213,
"recall": 0.930379746835443,
"f1": 0.8497109826589595,
"mean_mask_iou": 0.8807960658528784,
"n_matched": 147
},
"pin": {
"tp": 205,
"fp": 23,
"fn": 19,
"precision": 0.8991228070175439,
"recall": 0.9151785714285714,
"f1": 0.9070796460176992,
"mean_mask_iou": 0.9271949529032009,
"n_matched": 205
"tp": 70,
"fp": 19,
"fn": 14,
"precision": 0.7865168539325843,
"recall": 0.8333333333333334,
"f1": 0.8092485549132948,
"mean_mask_iou": 0.9075385327840141,
"n_matched": 70
},
"crystal": {
"tp": 68,
"fp": 79,
"fn": 81,
"precision": 0.46258503401360546,
"recall": 0.4563758389261745,
"f1": 0.45945945945945943,
"mean_mask_iou": 0.7521428721132434,
"n_matched": 68
"tp": 64,
"fp": 78,
"fn": 71,
"precision": 0.4507042253521127,
"recall": 0.4740740740740741,
"f1": 0.46209386281588444,
"mean_mask_iou": 0.7550301651989408,
"n_matched": 64
},
"loop_face": {
"tp": 231,
"fp": 54,
"fn": 64,
"precision": 0.8105263157894737,
"recall": 0.7830508474576271,
"f1": 0.796551724137931,
"mean_mask_iou": 0.9043612742080045,
"n_matched": 231
"tp": 105,
"fp": 47,
"fn": 50,
"precision": 0.6907894736842105,
"recall": 0.6774193548387096,
"f1": 0.6840390879478827,
"mean_mask_iou": 0.8603735901165422,
"n_matched": 105
},
"ice": {
"tp": 3,
"fp": 6,
"fn": 40,
"fn": 39,
"precision": 0.3333333333333333,
"recall": 0.06976744186046512,
"f1": 0.11538461538461539,
"recall": 0.07142857142857142,
"f1": 0.11764705882352941,
"mean_mask_iou": 0.9028650216500921,
"n_matched": 3
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 808,
"fp": 208,
"fn": 221,
"precision": 0.7952755905511811,
"recall": 0.7852283770651117,
"f1": 0.7902200488997555,
"mean_mask_iou": 0.8996869517802373,
"n_matched": 808
"tp": 389,
"fp": 191,
"fn": 186,
"precision": 0.6706896551724137,
"recall": 0.6765217391304348,
"f1": 0.6735930735930735,
"mean_mask_iou": 0.8595744770570013,
"n_matched": 389
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-alc-v1-800px-2026-09-29/weights.pt",
"environment": {
@@ -83,5 +84,5 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:38:43"
"measured_at": "2026-10-25T09:45:26"
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 297,
"fp": 28,
"fn": 20,
"precision": 0.9138461538461539,
"recall": 0.9369085173501577,
"f1": 0.9252336448598131,
"mean_mask_iou": 0.9095758214023709,
"n_matched": 297
"tp": 145,
"fp": 26,
"fn": 13,
"precision": 0.847953216374269,
"recall": 0.9177215189873418,
"f1": 0.8814589665653495,
"mean_mask_iou": 0.8662224294961051,
"n_matched": 145
},
"pin": {
"tp": 211,
"fp": 22,
"fn": 13,
"precision": 0.9055793991416309,
"recall": 0.9419642857142857,
"f1": 0.9234135667396062,
"mean_mask_iou": 0.918075781649843,
"n_matched": 211
"tp": 72,
"fp": 20,
"fn": 12,
"precision": 0.782608695652174,
"recall": 0.8571428571428571,
"f1": 0.8181818181818182,
"mean_mask_iou": 0.9004199640700032,
"n_matched": 72
},
"crystal": {
"tp": 73,
"fp": 80,
"fn": 76,
"precision": 0.477124183006536,
"recall": 0.4899328859060403,
"f1": 0.48344370860927155,
"mean_mask_iou": 0.7356274524847086,
"n_matched": 73
"tp": 68,
"fp": 79,
"fn": 67,
"precision": 0.46258503401360546,
"recall": 0.5037037037037037,
"f1": 0.4822695035460993,
"mean_mask_iou": 0.7430181470498084,
"n_matched": 68
},
"loop_face": {
"tp": 240,
"fp": 47,
"fn": 55,
"precision": 0.8362369337979094,
"recall": 0.8135593220338984,
"f1": 0.8247422680412371,
"mean_mask_iou": 0.8954467214590506,
"n_matched": 240
"tp": 113,
"fp": 43,
"fn": 42,
"precision": 0.7243589743589743,
"recall": 0.7290322580645161,
"f1": 0.7266881028938906,
"mean_mask_iou": 0.8464124446162589,
"n_matched": 113
},
"ice": {
"tp": 5,
"fp": 16,
"fn": 38,
"fn": 37,
"precision": 0.23809523809523808,
"recall": 0.11627906976744186,
"f1": 0.15625,
"recall": 0.11904761904761904,
"f1": 0.15873015873015875,
"mean_mask_iou": 0.7708521231731791,
"n_matched": 5
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 826,
"fp": 193,
"fn": 203,
"precision": 0.8105986261040236,
"recall": 0.8027210884353742,
"f1": 0.806640625,
"mean_mask_iou": 0.8914289185012624,
"n_matched": 826
"tp": 403,
"fp": 184,
"fn": 172,
"precision": 0.686541737649063,
"recall": 0.7008695652173913,
"f1": 0.693631669535284,
"mean_mask_iou": 0.8448054356001627,
"n_matched": 403
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-alc-v1-humanonly-2026-09-28/weights.pt",
"environment": {
@@ -83,5 +84,5 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:38:51"
"measured_at": "2026-10-25T09:45:33"
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 303,
"fp": 47,
"fn": 14,
"precision": 0.8657142857142858,
"recall": 0.9558359621451105,
"f1": 0.9085457271364318,
"mean_mask_iou": 0.9069670864361529,
"n_matched": 303
"tp": 147,
"fp": 44,
"fn": 11,
"precision": 0.7696335078534031,
"recall": 0.930379746835443,
"f1": 0.8424068767908309,
"mean_mask_iou": 0.8678916321179074,
"n_matched": 147
},
"pin": {
"tp": 204,
"fp": 21,
"fn": 20,
"precision": 0.9066666666666666,
"recall": 0.9107142857142857,
"f1": 0.9086859688195991,
"mean_mask_iou": 0.9359407329356912,
"n_matched": 204
"tp": 68,
"fp": 20,
"fn": 16,
"precision": 0.7727272727272727,
"recall": 0.8095238095238095,
"f1": 0.7906976744186046,
"mean_mask_iou": 0.9136319159785413,
"n_matched": 68
},
"crystal": {
"tp": 52,
"tp": 46,
"fp": 47,
"fn": 97,
"precision": 0.5252525252525253,
"recall": 0.348993288590604,
"f1": 0.41935483870967744,
"mean_mask_iou": 0.7462760360786713,
"n_matched": 52
"fn": 89,
"precision": 0.4946236559139785,
"recall": 0.34074074074074073,
"f1": 0.4035087719298245,
"mean_mask_iou": 0.7437556227192347,
"n_matched": 46
},
"loop_face": {
"tp": 252,
"fp": 52,
"fn": 43,
"precision": 0.8289473684210527,
"recall": 0.8542372881355932,
"f1": 0.8414023372287145,
"mean_mask_iou": 0.8995485516679328,
"n_matched": 252
"tp": 118,
"fp": 48,
"fn": 37,
"precision": 0.7108433734939759,
"recall": 0.7612903225806451,
"f1": 0.735202492211838,
"mean_mask_iou": 0.8528360467721436,
"n_matched": 118
},
"ice": {
"tp": 4,
"fp": 10,
"fn": 39,
"fn": 38,
"precision": 0.2857142857142857,
"recall": 0.09302325581395349,
"f1": 0.14035087719298245,
"recall": 0.09523809523809523,
"f1": 0.14285714285714285,
"mean_mask_iou": 0.8357625526706466,
"n_matched": 4
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 815,
"fp": 177,
"fn": 214,
"precision": 0.8215725806451613,
"recall": 0.7920310981535471,
"f1": 0.8065314200890649,
"mean_mask_iou": 0.9013234059093594,
"n_matched": 815
"tp": 383,
"fp": 169,
"fn": 192,
"precision": 0.6938405797101449,
"recall": 0.6660869565217391,
"f1": 0.6796805678793256,
"mean_mask_iou": 0.8561292495633251,
"n_matched": 383
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-alc-v1-mask1-2026-09-28/weights.pt",
"environment": {
@@ -83,5 +84,5 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:38:59"
"measured_at": "2026-10-25T09:45:41"
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 301,
"fp": 35,
"fn": 16,
"precision": 0.8958333333333334,
"recall": 0.9495268138801262,
"f1": 0.9218989280245022,
"mean_mask_iou": 0.9062259909805817,
"n_matched": 301
"tp": 147,
"fp": 33,
"fn": 11,
"precision": 0.8166666666666667,
"recall": 0.930379746835443,
"f1": 0.8698224852071006,
"mean_mask_iou": 0.8655259237412337,
"n_matched": 147
},
"pin": {
"tp": 208,
"fp": 24,
"fn": 16,
"precision": 0.896551724137931,
"recall": 0.9285714285714286,
"f1": 0.912280701754386,
"mean_mask_iou": 0.9247143441757603,
"n_matched": 208
"tp": 71,
"fp": 21,
"fn": 13,
"precision": 0.7717391304347826,
"recall": 0.8452380952380952,
"f1": 0.8068181818181818,
"mean_mask_iou": 0.8996192482083158,
"n_matched": 71
},
"crystal": {
"tp": 59,
"fp": 54,
"fn": 90,
"precision": 0.5221238938053098,
"recall": 0.3959731543624161,
"f1": 0.450381679389313,
"mean_mask_iou": 0.7515763531776168,
"n_matched": 59
"tp": 55,
"fp": 53,
"fn": 80,
"precision": 0.5092592592592593,
"recall": 0.4074074074074074,
"f1": 0.45267489711934156,
"mean_mask_iou": 0.7579461585093508,
"n_matched": 55
},
"loop_face": {
"tp": 255,
"fp": 62,
"fn": 40,
"precision": 0.804416403785489,
"recall": 0.864406779661017,
"f1": 0.8333333333333334,
"mean_mask_iou": 0.8987716581416572,
"n_matched": 255
"tp": 121,
"fp": 56,
"fn": 34,
"precision": 0.6836158192090396,
"recall": 0.7806451612903226,
"f1": 0.7289156626506025,
"mean_mask_iou": 0.8493116285087041,
"n_matched": 121
},
"ice": {
"tp": 3,
"fp": 7,
"fn": 40,
"fn": 39,
"precision": 0.3,
"recall": 0.06976744186046512,
"f1": 0.11320754716981132,
"recall": 0.07142857142857142,
"f1": 0.11538461538461536,
"mean_mask_iou": 0.7530200271235444,
"n_matched": 3
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 826,
"fp": 182,
"fn": 203,
"precision": 0.8194444444444444,
"recall": 0.8027210884353742,
"f1": 0.8109965635738832,
"mean_mask_iou": 0.8969775358579729,
"n_matched": 826
"tp": 397,
"fp": 170,
"fn": 178,
"precision": 0.7001763668430335,
"recall": 0.6904347826086956,
"f1": 0.6952714535901927,
"mean_mask_iou": 0.8509271618682365,
"n_matched": 397
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-alc-v1-noflip-2026-09-28/weights.pt",
"environment": {
@@ -83,5 +84,5 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:39:07"
"measured_at": "2026-10-25T09:45:49"
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 298,
"fp": 38,
"fn": 19,
"precision": 0.8869047619047619,
"recall": 0.9400630914826499,
"f1": 0.9127105666156202,
"mean_mask_iou": 0.9176975714925484,
"n_matched": 298
"tp": 145,
"fp": 37,
"fn": 13,
"precision": 0.7967032967032966,
"recall": 0.9177215189873418,
"f1": 0.8529411764705882,
"mean_mask_iou": 0.8769675310992452,
"n_matched": 145
},
"pin": {
"tp": 209,
"fp": 29,
"fn": 15,
"precision": 0.8781512605042017,
"recall": 0.9330357142857143,
"f1": 0.9047619047619047,
"mean_mask_iou": 0.9435781234732605,
"n_matched": 209
"tp": 70,
"fp": 26,
"fn": 14,
"precision": 0.7291666666666666,
"recall": 0.8333333333333334,
"f1": 0.7777777777777777,
"mean_mask_iou": 0.9126956941970581,
"n_matched": 70
},
"crystal": {
"tp": 74,
"tp": 69,
"fp": 83,
"fn": 75,
"precision": 0.4713375796178344,
"recall": 0.4966442953020134,
"f1": 0.4836601307189542,
"mean_mask_iou": 0.7637412283661057,
"n_matched": 74
"fn": 66,
"precision": 0.45394736842105265,
"recall": 0.5111111111111111,
"f1": 0.4808362369337979,
"mean_mask_iou": 0.7589545831684434,
"n_matched": 69
},
"loop_face": {
"tp": 253,
"fp": 64,
"fn": 42,
"precision": 0.7981072555205048,
"recall": 0.8576271186440678,
"f1": 0.8267973856209151,
"mean_mask_iou": 0.907481124159418,
"n_matched": 253
"tp": 120,
"fp": 54,
"fn": 35,
"precision": 0.6896551724137931,
"recall": 0.7741935483870968,
"f1": 0.729483282674772,
"mean_mask_iou": 0.8574801797985127,
"n_matched": 120
},
"ice": {
"tp": 7,
"fp": 16,
"fn": 36,
"fn": 35,
"precision": 0.30434782608695654,
"recall": 0.16279069767441862,
"f1": 0.21212121212121213,
"recall": 0.16666666666666666,
"f1": 0.2153846153846154,
"mean_mask_iou": 0.8089197334873823,
"n_matched": 7
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 841,
"fp": 230,
"fn": 188,
"precision": 0.7852474323062558,
"recall": 0.8172983479105929,
"f1": 0.800952380952381,
"mean_mask_iou": 0.906603706963766,
"n_matched": 841
"tp": 411,
"fp": 216,
"fn": 164,
"precision": 0.6555023923444976,
"recall": 0.7147826086956521,
"f1": 0.6838602329450915,
"mean_mask_iou": 0.8563915244575192,
"n_matched": 411
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-alc-v1-noflip-mask1-2026-09-29/weights.pt",
"environment": {
@@ -83,5 +84,5 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:39:15"
"measured_at": "2026-10-25T09:45:57"
}
@@ -1,54 +1,54 @@
{
"per_class": {
"loop_all": {
"tp": 271,
"fp": 34,
"fn": 46,
"precision": 0.8885245901639345,
"recall": 0.8548895899053628,
"f1": 0.8713826366559485,
"mean_mask_iou": 0.9178478445187722,
"n_matched": 271
"tp": 120,
"fp": 32,
"fn": 38,
"precision": 0.7894736842105263,
"recall": 0.759493670886076,
"f1": 0.7741935483870968,
"mean_mask_iou": 0.8686593143838969,
"n_matched": 120
},
"pin": {
"tp": 193,
"fp": 39,
"fn": 31,
"precision": 0.8318965517241379,
"recall": 0.8616071428571429,
"f1": 0.8464912280701755,
"mean_mask_iou": 0.9465569860568435,
"n_matched": 193
"tp": 60,
"fp": 35,
"fn": 24,
"precision": 0.631578947368421,
"recall": 0.7142857142857143,
"f1": 0.670391061452514,
"mean_mask_iou": 0.9142336983351689,
"n_matched": 60
},
"crystal": {
"tp": 57,
"tp": 54,
"fp": 91,
"fn": 92,
"precision": 0.38513513513513514,
"recall": 0.3825503355704698,
"f1": 0.38383838383838387,
"mean_mask_iou": 0.7631099261639591,
"n_matched": 57
"fn": 81,
"precision": 0.3724137931034483,
"recall": 0.4,
"f1": 0.38571428571428573,
"mean_mask_iou": 0.7631927995812678,
"n_matched": 54
},
"loop_face": {
"tp": 233,
"fp": 72,
"fn": 62,
"precision": 0.7639344262295082,
"recall": 0.7898305084745763,
"f1": 0.7766666666666666,
"mean_mask_iou": 0.921962263303789,
"n_matched": 233
"tp": 101,
"fp": 59,
"fn": 54,
"precision": 0.63125,
"recall": 0.6516129032258065,
"f1": 0.6412698412698413,
"mean_mask_iou": 0.8756678161736451,
"n_matched": 101
},
"ice": {
"tp": 13,
"tp": 12,
"fp": 23,
"fn": 30,
"precision": 0.3611111111111111,
"recall": 0.3023255813953488,
"f1": 0.32911392405063294,
"mean_mask_iou": 0.8470510637223766,
"n_matched": 13
"precision": 0.34285714285714286,
"recall": 0.2857142857142857,
"f1": 0.3116883116883117,
"mean_mask_iou": 0.8346283164485953,
"n_matched": 12
},
"needle": {
"tp": 0,
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 767,
"fp": 259,
"fn": 262,
"precision": 0.7475633528265108,
"recall": 0.7453838678328474,
"f1": 0.7464720194647202,
"mean_mask_iou": 0.9136224265229171,
"n_matched": 767
"tp": 347,
"fp": 240,
"fn": 228,
"precision": 0.5911413969335605,
"recall": 0.6034782608695652,
"f1": 0.5972461273666093,
"mean_mask_iou": 0.8609900289178314,
"n_matched": 347
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_studio/models/best_yolo26n-seg-overlap-false_2026-04-12.pt",
"environment": {
@@ -83,5 +84,5 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:40:12"
"measured_at": "2026-10-25T09:47:40"
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 304,
"fp": 40,
"fn": 13,
"precision": 0.8837209302325582,
"recall": 0.9589905362776026,
"f1": 0.9198184568835098,
"mean_mask_iou": 0.8999997153410435,
"n_matched": 304
"tp": 149,
"fp": 33,
"fn": 9,
"precision": 0.8186813186813187,
"recall": 0.9430379746835443,
"f1": 0.8764705882352942,
"mean_mask_iou": 0.8575752170782032,
"n_matched": 149
},
"pin": {
"tp": 212,
"fp": 33,
"tp": 72,
"fp": 29,
"fn": 12,
"precision": 0.8653061224489796,
"recall": 0.9464285714285714,
"f1": 0.9040511727078892,
"mean_mask_iou": 0.9265693926582884,
"n_matched": 212
"precision": 0.7128712871287128,
"recall": 0.8571428571428571,
"f1": 0.7783783783783783,
"mean_mask_iou": 0.9008857646241738,
"n_matched": 72
},
"crystal": {
"tp": 60,
"fp": 57,
"fn": 89,
"precision": 0.5128205128205128,
"recall": 0.40268456375838924,
"f1": 0.45112781954887216,
"mean_mask_iou": 0.7585980276654778,
"n_matched": 60
"tp": 55,
"fp": 56,
"fn": 80,
"precision": 0.4954954954954955,
"recall": 0.4074074074074074,
"f1": 0.4471544715447154,
"mean_mask_iou": 0.7581973650603907,
"n_matched": 55
},
"loop_face": {
"tp": 251,
"fp": 76,
"fn": 44,
"precision": 0.7675840978593272,
"recall": 0.8508474576271187,
"f1": 0.8070739549839228,
"mean_mask_iou": 0.8968178309993826,
"n_matched": 251
"tp": 119,
"fp": 71,
"fn": 36,
"precision": 0.6263157894736842,
"recall": 0.7677419354838709,
"f1": 0.6898550724637681,
"mean_mask_iou": 0.8456455896715827,
"n_matched": 119
},
"ice": {
"tp": 8,
"fp": 37,
"fn": 35,
"fn": 34,
"precision": 0.17777777777777778,
"recall": 0.18604651162790697,
"f1": 0.18181818181818182,
"recall": 0.19047619047619047,
"f1": 0.1839080459770115,
"mean_mask_iou": 0.7778219649966538,
"n_matched": 8
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 835,
"fp": 243,
"fn": 194,
"precision": 0.774582560296846,
"recall": 0.8114674441205053,
"f1": 0.7925961082107261,
"mean_mask_iou": 0.8944579133748279,
"n_matched": 835
"tp": 403,
"fp": 226,
"fn": 172,
"precision": 0.6406995230524642,
"recall": 0.7008695652173913,
"f1": 0.6694352159468437,
"mean_mask_iou": 0.8466445120764414,
"n_matched": 403
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v2-recipeA-2026-09-29/weights.pt",
"environment": {
@@ -83,5 +84,5 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:39:23"
"measured_at": "2026-10-25T09:46:06"
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 308,
"fp": 33,
"fn": 9,
"precision": 0.9032258064516129,
"recall": 0.9716088328075709,
"f1": 0.9361702127659575,
"mean_mask_iou": 0.9278619630785258,
"n_matched": 308
"tp": 150,
"fp": 29,
"fn": 8,
"precision": 0.8379888268156425,
"recall": 0.9493670886075949,
"f1": 0.8902077151335311,
"mean_mask_iou": 0.8837871374185333,
"n_matched": 150
},
"pin": {
"tp": 214,
"fp": 19,
"fn": 10,
"precision": 0.9184549356223176,
"recall": 0.9553571428571429,
"f1": 0.936542669584245,
"mean_mask_iou": 0.9456527987011091,
"n_matched": 214
},
"crystal": {
"tp": 74,
"fp": 60,
"fn": 75,
"precision": 0.5522388059701493,
"recall": 0.4966442953020134,
"f1": 0.5229681978798587,
"mean_mask_iou": 0.766323017315329,
"fp": 18,
"fn": 10,
"precision": 0.8043478260869565,
"recall": 0.8809523809523809,
"f1": 0.8409090909090908,
"mean_mask_iou": 0.9129160323387382,
"n_matched": 74
},
"crystal": {
"tp": 67,
"fp": 60,
"fn": 68,
"precision": 0.5275590551181102,
"recall": 0.4962962962962963,
"f1": 0.5114503816793893,
"mean_mask_iou": 0.7563014436506881,
"n_matched": 67
},
"loop_face": {
"tp": 267,
"fp": 54,
"fn": 28,
"precision": 0.8317757009345794,
"recall": 0.9050847457627119,
"f1": 0.8668831168831169,
"mean_mask_iou": 0.9131015467260754,
"n_matched": 267
"tp": 130,
"fp": 50,
"fn": 25,
"precision": 0.7222222222222222,
"recall": 0.8387096774193549,
"f1": 0.7761194029850746,
"mean_mask_iou": 0.8556288501030779,
"n_matched": 130
},
"ice": {
"tp": 4,
"fp": 19,
"fn": 39,
"fn": 38,
"precision": 0.17391304347826086,
"recall": 0.09302325581395349,
"f1": 0.12121212121212122,
"recall": 0.09523809523809523,
"f1": 0.12307692307692307,
"mean_mask_iou": 0.7417344288796006,
"n_matched": 4
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 867,
"fp": 185,
"fn": 162,
"precision": 0.8241444866920152,
"recall": 0.8425655976676385,
"f1": 0.8332532436328688,
"mean_mask_iou": 0.9130612889537925,
"n_matched": 867
"tp": 425,
"fp": 176,
"fn": 150,
"precision": 0.7071547420965059,
"recall": 0.7391304347826086,
"f1": 0.7227891156462585,
"mean_mask_iou": 0.8588111575514382,
"n_matched": 425
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v3-noflip-mask1-2026-09-30/weights.pt",
"environment": {
@@ -83,7 +84,7 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:39:30",
"measured_at": "2026-10-25T09:46:15",
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-alc-v1-noflip-mask1-2026-09-29/gold_report.json",
"f1_delta": 0.0284,
@@ -1,54 +1,54 @@
{
"per_class": {
"loop_all": {
"tp": 306,
"fp": 23,
"fn": 11,
"precision": 0.9300911854103343,
"recall": 0.9652996845425867,
"f1": 0.9473684210526315,
"mean_mask_iou": 0.9094462017528081,
"n_matched": 306
"tp": 150,
"fp": 21,
"fn": 8,
"precision": 0.8771929824561403,
"recall": 0.9493670886075949,
"f1": 0.911854103343465,
"mean_mask_iou": 0.8727343113100435,
"n_matched": 150
},
"pin": {
"tp": 213,
"fp": 32,
"tp": 73,
"fp": 29,
"fn": 11,
"precision": 0.8693877551020408,
"recall": 0.9508928571428571,
"f1": 0.9083155650319831,
"mean_mask_iou": 0.9262696606645503,
"n_matched": 213
"precision": 0.7156862745098039,
"recall": 0.8690476190476191,
"f1": 0.7849462365591398,
"mean_mask_iou": 0.8966474690281144,
"n_matched": 73
},
"crystal": {
"tp": 67,
"tp": 61,
"fp": 60,
"fn": 82,
"precision": 0.5275590551181102,
"recall": 0.44966442953020136,
"f1": 0.4855072463768116,
"mean_mask_iou": 0.761630287259793,
"n_matched": 67
"fn": 74,
"precision": 0.5041322314049587,
"recall": 0.45185185185185184,
"f1": 0.4765625,
"mean_mask_iou": 0.7686510752576673,
"n_matched": 61
},
"loop_face": {
"tp": 262,
"fp": 58,
"fn": 33,
"precision": 0.81875,
"recall": 0.888135593220339,
"f1": 0.8520325203252033,
"mean_mask_iou": 0.8993687596276626,
"n_matched": 262
"tp": 128,
"fp": 55,
"fn": 27,
"precision": 0.6994535519125683,
"recall": 0.8258064516129032,
"f1": 0.757396449704142,
"mean_mask_iou": 0.8499420270231782,
"n_matched": 128
},
"ice": {
"tp": 6,
"tp": 5,
"fp": 17,
"fn": 37,
"precision": 0.2608695652173913,
"recall": 0.13953488372093023,
"f1": 0.18181818181818182,
"mean_mask_iou": 0.7961226947704595,
"n_matched": 6
"precision": 0.22727272727272727,
"recall": 0.11904761904761904,
"f1": 0.15624999999999997,
"mean_mask_iou": 0.7945995701731496,
"n_matched": 5
},
"needle": {
"tp": 0,
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 854,
"fp": 190,
"fn": 175,
"precision": 0.8180076628352491,
"recall": 0.8299319727891157,
"f1": 0.8239266763145201,
"mean_mask_iou": 0.8981575595964695,
"n_matched": 854
"tp": 417,
"fp": 182,
"fn": 158,
"precision": 0.6961602671118531,
"recall": 0.7252173913043478,
"f1": 0.7103918228279388,
"mean_mask_iou": 0.8537618821009811,
"n_matched": 417
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v3-recipeA-2026-09-29/weights.pt",
"environment": {
@@ -83,7 +84,7 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:39:38",
"measured_at": "2026-10-25T09:46:22",
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-alc-v1-noflip-mask1-2026-09-29/gold_report.json",
"f1_delta": 0.0221,
@@ -1,54 +1,54 @@
{
"per_class": {
"loop_all": {
"tp": 309,
"tp": 151,
"fp": 16,
"fn": 8,
"precision": 0.9507692307692308,
"recall": 0.9747634069400631,
"f1": 0.9626168224299065,
"mean_mask_iou": 0.9298444164418739,
"n_matched": 309
"fn": 7,
"precision": 0.9041916167664671,
"recall": 0.9556962025316456,
"f1": 0.9292307692307693,
"mean_mask_iou": 0.8937953477312267,
"n_matched": 151
},
"pin": {
"tp": 215,
"fp": 22,
"tp": 75,
"fp": 21,
"fn": 9,
"precision": 0.9071729957805907,
"recall": 0.9598214285714286,
"f1": 0.9327548806941431,
"mean_mask_iou": 0.9406678664910599,
"n_matched": 215
"precision": 0.78125,
"recall": 0.8928571428571429,
"f1": 0.8333333333333334,
"mean_mask_iou": 0.9064077941912371,
"n_matched": 75
},
"crystal": {
"tp": 99,
"fp": 84,
"tp": 85,
"fp": 82,
"fn": 50,
"precision": 0.5409836065573771,
"recall": 0.6644295302013423,
"f1": 0.5963855421686747,
"mean_mask_iou": 0.8062619700615773,
"n_matched": 99
"precision": 0.5089820359281437,
"recall": 0.6296296296296297,
"f1": 0.5629139072847682,
"mean_mask_iou": 0.7832414691670929,
"n_matched": 85
},
"loop_face": {
"tp": 271,
"fp": 52,
"fn": 24,
"precision": 0.8390092879256966,
"recall": 0.9186440677966101,
"f1": 0.8770226537216829,
"mean_mask_iou": 0.908800452666073,
"n_matched": 271
"tp": 133,
"fp": 50,
"fn": 22,
"precision": 0.726775956284153,
"recall": 0.8580645161290322,
"f1": 0.7869822485207101,
"mean_mask_iou": 0.8565095066104034,
"n_matched": 133
},
"ice": {
"tp": 5,
"tp": 4,
"fp": 19,
"fn": 38,
"precision": 0.20833333333333334,
"recall": 0.11627906976744186,
"f1": 0.14925373134328357,
"mean_mask_iou": 0.821677572899137,
"n_matched": 5
"precision": 0.17391304347826086,
"recall": 0.09523809523809523,
"f1": 0.12307692307692307,
"mean_mask_iou": 0.8337434918036797,
"n_matched": 4
},
"needle": {
"tp": 0,
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 899,
"fp": 193,
"fn": 130,
"precision": 0.8232600732600732,
"recall": 0.8736637512147716,
"f1": 0.8477133427628477,
"mean_mask_iou": 0.9118784889312731,
"n_matched": 899
"tp": 448,
"fp": 188,
"fn": 127,
"precision": 0.7044025157232704,
"recall": 0.7791304347826087,
"f1": 0.7398843930635838,
"mean_mask_iou": 0.8633257707530342,
"n_matched": 448
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/weights.pt",
"environment": {
@@ -83,7 +84,7 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:39:46",
"measured_at": "2026-10-25T09:46:31",
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v3-noflip-mask1-2026-09-30/gold_report.json",
"f1_delta": 0.015,
@@ -1,54 +1,54 @@
{
"per_class": {
"loop_all": {
"tp": 307,
"fp": 29,
"fn": 10,
"precision": 0.9136904761904762,
"recall": 0.9684542586750788,
"f1": 0.9402756508422665,
"mean_mask_iou": 0.9144044278112335,
"n_matched": 307
"tp": 151,
"fp": 26,
"fn": 7,
"precision": 0.8531073446327684,
"recall": 0.9556962025316456,
"f1": 0.9014925373134328,
"mean_mask_iou": 0.8794716171670773,
"n_matched": 151
},
"pin": {
"tp": 212,
"fp": 22,
"fn": 12,
"precision": 0.905982905982906,
"recall": 0.9464285714285714,
"f1": 0.9257641921397379,
"mean_mask_iou": 0.9372053245642273,
"n_matched": 212
"tp": 73,
"fp": 21,
"fn": 11,
"precision": 0.776595744680851,
"recall": 0.8690476190476191,
"f1": 0.8202247191011236,
"mean_mask_iou": 0.9129233997527235,
"n_matched": 73
},
"crystal": {
"tp": 86,
"fp": 64,
"fn": 63,
"precision": 0.5733333333333334,
"recall": 0.5771812080536913,
"f1": 0.5752508361204013,
"mean_mask_iou": 0.7866494646342707,
"n_matched": 86
"tp": 75,
"fp": 63,
"fn": 60,
"precision": 0.5434782608695652,
"recall": 0.5555555555555556,
"f1": 0.5494505494505495,
"mean_mask_iou": 0.7781053837940977,
"n_matched": 75
},
"loop_face": {
"tp": 267,
"fp": 67,
"fn": 28,
"precision": 0.7994011976047904,
"recall": 0.9050847457627119,
"f1": 0.8489666136724962,
"mean_mask_iou": 0.8960405961764998,
"n_matched": 267
"tp": 133,
"fp": 63,
"fn": 22,
"precision": 0.6785714285714286,
"recall": 0.8580645161290322,
"f1": 0.7578347578347578,
"mean_mask_iou": 0.8476228354203764,
"n_matched": 133
},
"ice": {
"tp": 5,
"tp": 4,
"fp": 15,
"fn": 38,
"precision": 0.25,
"recall": 0.11627906976744186,
"f1": 0.15873015873015872,
"mean_mask_iou": 0.796892647988566,
"n_matched": 5
"precision": 0.21052631578947367,
"recall": 0.09523809523809523,
"f1": 0.13114754098360656,
"mean_mask_iou": 0.8107709823995006,
"n_matched": 4
},
"needle": {
"tp": 0,
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 877,
"fp": 197,
"fn": 152,
"precision": 0.8165735567970205,
"recall": 0.8522837706511176,
"f1": 0.8340466000951023,
"mean_mask_iou": 0.9011275308133186,
"n_matched": 877
"tp": 436,
"fp": 188,
"fn": 139,
"precision": 0.6987179487179487,
"recall": 0.7582608695652174,
"f1": 0.7272727272727274,
"mean_mask_iou": 0.857290016512025,
"n_matched": 436
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-recipeA-2026-10-02/weights.pt",
"environment": {
@@ -83,7 +84,7 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:39:55",
"measured_at": "2026-10-25T09:46:38",
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v3-noflip-mask1-2026-09-30/gold_report.json",
"f1_delta": -0.0057,
@@ -1,54 +1,54 @@
{
"per_class": {
"loop_all": {
"tp": 311,
"fp": 26,
"fn": 6,
"precision": 0.9228486646884273,
"recall": 0.9810725552050473,
"f1": 0.9510703363914373,
"mean_mask_iou": 0.9233204539476648,
"n_matched": 311
"tp": 153,
"fp": 23,
"fn": 5,
"precision": 0.8693181818181818,
"recall": 0.9683544303797469,
"f1": 0.9161676646706587,
"mean_mask_iou": 0.8955158506777854,
"n_matched": 153
},
"pin": {
"tp": 217,
"fp": 21,
"fn": 7,
"precision": 0.9117647058823529,
"recall": 0.96875,
"f1": 0.9393939393939394,
"mean_mask_iou": 0.9350234271216731,
"n_matched": 217
"tp": 78,
"fp": 19,
"fn": 6,
"precision": 0.8041237113402062,
"recall": 0.9285714285714286,
"f1": 0.861878453038674,
"mean_mask_iou": 0.9067608977866488,
"n_matched": 78
},
"crystal": {
"tp": 92,
"fp": 73,
"fn": 57,
"precision": 0.5575757575757576,
"recall": 0.6174496644295302,
"f1": 0.5859872611464969,
"mean_mask_iou": 0.7836372984261296,
"n_matched": 92
"tp": 83,
"fp": 71,
"fn": 52,
"precision": 0.538961038961039,
"recall": 0.6148148148148148,
"f1": 0.5743944636678201,
"mean_mask_iou": 0.7817240537621242,
"n_matched": 83
},
"loop_face": {
"tp": 272,
"fp": 53,
"fn": 23,
"precision": 0.8369230769230769,
"recall": 0.9220338983050848,
"f1": 0.8774193548387096,
"mean_mask_iou": 0.90096496604208,
"n_matched": 272
"tp": 134,
"fp": 51,
"fn": 21,
"precision": 0.7243243243243244,
"recall": 0.864516129032258,
"f1": 0.7882352941176471,
"mean_mask_iou": 0.8558725800145162,
"n_matched": 134
},
"ice": {
"tp": 3,
"tp": 2,
"fp": 9,
"fn": 40,
"precision": 0.25,
"recall": 0.06976744186046512,
"f1": 0.10909090909090909,
"mean_mask_iou": 0.784312008919469,
"n_matched": 3
"precision": 0.18181818181818182,
"recall": 0.047619047619047616,
"f1": 0.07547169811320754,
"mean_mask_iou": 0.8048262223344274,
"n_matched": 2
},
"needle": {
"tp": 0,
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 895,
"fp": 182,
"fn": 134,
"precision": 0.8310120705663882,
"recall": 0.86977648202138,
"f1": 0.8499525166191833,
"mean_mask_iou": 0.9045394224676367,
"n_matched": 895
"tp": 450,
"fp": 173,
"fn": 125,
"precision": 0.7223113964686998,
"recall": 0.782608695652174,
"f1": 0.7512520868113521,
"mean_mask_iou": 0.8642687773554002,
"n_matched": 450
},
"dataset": {
"gold_images": 335,
"pred_images": 335,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"environment": {
"host": "mx-spark-01",
@@ -84,32 +85,32 @@
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0022,
"mask_iou_delta": -0.0099,
"mask_score": 0.7867,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0073,
"f1_delta": 0.0114,
"mask_iou_delta": 0.0037,
"mask_score": 0.6764,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": 0.0009,
"class_f1_delta": {
"loop_all": -0.0115,
"pin": 0.0066
"loop_all": -0.0131,
"pin": 0.0285
},
"pass_point_rule": false,
"pass_point_rule": true,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.0024,
"lo": -0.0143,
"hi": 0.0204,
"win": 0.595
"delta": 0.0114,
"lo": -0.0119,
"hi": 0.0351,
"win": 0.816
},
"mask_score": {
"delta": 0.0009,
"lo": -0.0127,
"hi": 0.0145,
"win": 0.553
"delta": 0.0037,
"lo": -0.0143,
"hi": 0.0224,
"win": 0.662
}
},
"pass": false
@@ -27,43 +27,43 @@
"pt"
],
"metrics": {
"tp": 895,
"fp": 182,
"fn": 134,
"precision": 0.8310120705663882,
"recall": 0.86977648202138,
"f1": 0.8499525166191833,
"mean_mask_iou": 0.9045394224676367,
"n_matched": 895
"tp": 450,
"fp": 173,
"fn": 125,
"precision": 0.7223113964686998,
"recall": 0.782608695652174,
"f1": 0.7512520868113521,
"mean_mask_iou": 0.8642687773554002,
"n_matched": 450
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0022,
"mask_iou_delta": -0.0099,
"mask_score": 0.7867,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0073,
"f1_delta": 0.0114,
"mask_iou_delta": 0.0037,
"mask_score": 0.6764,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": 0.0009,
"class_f1_delta": {
"loop_all": -0.0115,
"pin": 0.0066
"loop_all": -0.0131,
"pin": 0.0285
},
"pass_point_rule": false,
"pass_point_rule": true,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.0024,
"lo": -0.0143,
"hi": 0.0204,
"win": 0.595
"delta": 0.0114,
"lo": -0.0119,
"hi": 0.0351,
"win": 0.816
},
"mask_score": {
"delta": 0.0009,
"lo": -0.0127,
"hi": 0.0145,
"win": 0.553
"delta": 0.0037,
"lo": -0.0143,
"hi": 0.0224,
"win": 0.662
}
},
"pass": false
@@ -1,54 +1,54 @@
{
"per_class": {
"loop_all": {
"tp": 309,
"tp": 151,
"fp": 25,
"fn": 8,
"precision": 0.9251497005988024,
"recall": 0.9747634069400631,
"f1": 0.9493087557603687,
"mean_mask_iou": 0.9252735800942133,
"n_matched": 309
"fn": 7,
"precision": 0.8579545454545454,
"recall": 0.9556962025316456,
"f1": 0.9041916167664671,
"mean_mask_iou": 0.8900843775137935,
"n_matched": 151
},
"pin": {
"tp": 214,
"tp": 76,
"fp": 15,
"fn": 10,
"precision": 0.9344978165938864,
"recall": 0.9553571428571429,
"f1": 0.944812362030905,
"mean_mask_iou": 0.9373156284625324,
"n_matched": 214
"fn": 8,
"precision": 0.8351648351648352,
"recall": 0.9047619047619048,
"f1": 0.8685714285714285,
"mean_mask_iou": 0.9028628651190943,
"n_matched": 76
},
"crystal": {
"tp": 96,
"fp": 67,
"fn": 53,
"precision": 0.588957055214724,
"recall": 0.6442953020134228,
"f1": 0.6153846153846153,
"mean_mask_iou": 0.7870228886885559,
"n_matched": 96
"tp": 85,
"fp": 66,
"fn": 50,
"precision": 0.5629139072847682,
"recall": 0.6296296296296297,
"f1": 0.5944055944055944,
"mean_mask_iou": 0.7815064307616706,
"n_matched": 85
},
"loop_face": {
"tp": 269,
"fp": 53,
"fn": 26,
"precision": 0.8354037267080745,
"recall": 0.911864406779661,
"f1": 0.8719611021069691,
"mean_mask_iou": 0.9008181510928498,
"n_matched": 269
"tp": 135,
"fp": 50,
"fn": 20,
"precision": 0.7297297297297297,
"recall": 0.8709677419354839,
"f1": 0.7941176470588235,
"mean_mask_iou": 0.8489963361151837,
"n_matched": 135
},
"ice": {
"tp": 3,
"tp": 2,
"fp": 10,
"fn": 40,
"precision": 0.23076923076923078,
"recall": 0.06976744186046512,
"f1": 0.10714285714285714,
"mean_mask_iou": 0.8444813717997576,
"n_matched": 3
"precision": 0.16666666666666666,
"recall": 0.047619047619047616,
"f1": 0.07407407407407407,
"mean_mask_iou": 0.902436343413922,
"n_matched": 2
},
"needle": {
"tp": 0,
@@ -62,26 +62,29 @@
}
},
"overall": {
"tp": 891,
"fp": 170,
"fn": 138,
"precision": 0.8397737983034873,
"recall": 0.8658892128279884,
"f1": 0.8526315789473684,
"mean_mask_iou": 0.9056148202172515,
"n_matched": 891
"tp": 449,
"fp": 166,
"fn": 126,
"precision": 0.7300813008130081,
"recall": 0.7808695652173913,
"f1": 0.7546218487394959,
"mean_mask_iou": 0.8593936379304089,
"n_matched": 449
},
"dataset": {
"gold_images": 335,
"pred_images": 335,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v5-noflip-mask1-2026-10-23/weights.pt",
"environment": {
"host": "mx-spark-01",
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-25T09:46:56",
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0049,
@@ -113,5 +116,6 @@
}
},
"pass": false
}
},
"gate_measured_on": 335
}
@@ -1,54 +1,54 @@
{
"per_class": {
"loop_all": {
"tp": 309,
"tp": 151,
"fp": 25,
"fn": 8,
"precision": 0.9251497005988024,
"recall": 0.9747634069400631,
"f1": 0.9493087557603687,
"mean_mask_iou": 0.9252735800942133,
"n_matched": 309
"fn": 7,
"precision": 0.8579545454545454,
"recall": 0.9556962025316456,
"f1": 0.9041916167664671,
"mean_mask_iou": 0.8900843775137935,
"n_matched": 151
},
"pin": {
"tp": 214,
"tp": 76,
"fp": 15,
"fn": 10,
"precision": 0.9344978165938864,
"recall": 0.9553571428571429,
"f1": 0.944812362030905,
"mean_mask_iou": 0.9373156284625324,
"n_matched": 214
"fn": 8,
"precision": 0.8351648351648352,
"recall": 0.9047619047619048,
"f1": 0.8685714285714285,
"mean_mask_iou": 0.9028628651190943,
"n_matched": 76
},
"crystal": {
"tp": 96,
"fp": 67,
"fn": 53,
"precision": 0.588957055214724,
"recall": 0.6442953020134228,
"f1": 0.6153846153846153,
"mean_mask_iou": 0.7870228886885559,
"n_matched": 96
"tp": 85,
"fp": 66,
"fn": 50,
"precision": 0.5629139072847682,
"recall": 0.6296296296296297,
"f1": 0.5944055944055944,
"mean_mask_iou": 0.7815064307616706,
"n_matched": 85
},
"loop_face": {
"tp": 269,
"fp": 53,
"fn": 26,
"precision": 0.8354037267080745,
"recall": 0.911864406779661,
"f1": 0.8719611021069691,
"mean_mask_iou": 0.9008181510928498,
"n_matched": 269
"tp": 135,
"fp": 50,
"fn": 20,
"precision": 0.7297297297297297,
"recall": 0.8709677419354839,
"f1": 0.7941176470588235,
"mean_mask_iou": 0.8489963361151837,
"n_matched": 135
},
"ice": {
"tp": 3,
"tp": 2,
"fp": 10,
"fn": 40,
"precision": 0.23076923076923078,
"recall": 0.06976744186046512,
"f1": 0.10714285714285714,
"mean_mask_iou": 0.8444813717997576,
"n_matched": 3
"precision": 0.16666666666666666,
"recall": 0.047619047619047616,
"f1": 0.07407407407407407,
"mean_mask_iou": 0.902436343413922,
"n_matched": 2
},
"needle": {
"tp": 0,
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 891,
"fp": 170,
"fn": 138,
"precision": 0.8397737983034873,
"recall": 0.8658892128279884,
"f1": 0.8526315789473684,
"mean_mask_iou": 0.9056148202172515,
"n_matched": 891
"tp": 449,
"fp": 166,
"fn": 126,
"precision": 0.7300813008130081,
"recall": 0.7808695652173913,
"f1": 0.7546218487394959,
"mean_mask_iou": 0.8593936379304089,
"n_matched": 449
},
"dataset": {
"gold_images": 335,
"pred_images": 335,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"environment": {
"host": "mx-spark-01",
@@ -84,32 +85,32 @@
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0049,
"mask_iou_delta": -0.0125,
"mask_score": 0.7842,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0063,
"f1_delta": 0.0147,
"mask_iou_delta": -0.0016,
"mask_score": 0.6711,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": -0.0039,
"class_f1_delta": {
"loop_all": -0.0133,
"pin": 0.0121
"loop_all": -0.025,
"pin": 0.0352
},
"pass_point_rule": false,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.0017,
"lo": -0.0137,
"hi": 0.0179,
"win": 0.592
"delta": 0.0147,
"lo": -0.0078,
"hi": 0.0402,
"win": 0.906
},
"mask_score": {
"delta": -0.0056,
"lo": -0.0174,
"hi": 0.0056,
"win": 0.174
"delta": -0.0016,
"lo": -0.0182,
"hi": 0.0149,
"win": 0.446
}
},
"pass": false
@@ -27,43 +27,43 @@
"pt"
],
"metrics": {
"tp": 891,
"fp": 170,
"fn": 138,
"precision": 0.8397737983034873,
"recall": 0.8658892128279884,
"f1": 0.8526315789473684,
"mean_mask_iou": 0.9056148202172515,
"n_matched": 891
"tp": 449,
"fp": 166,
"fn": 126,
"precision": 0.7300813008130081,
"recall": 0.7808695652173913,
"f1": 0.7546218487394959,
"mean_mask_iou": 0.8593936379304089,
"n_matched": 449
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0049,
"mask_iou_delta": -0.0125,
"mask_score": 0.7842,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0063,
"f1_delta": 0.0147,
"mask_iou_delta": -0.0016,
"mask_score": 0.6711,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": -0.0039,
"class_f1_delta": {
"loop_all": -0.0133,
"pin": 0.0121
"loop_all": -0.025,
"pin": 0.0352
},
"pass_point_rule": false,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.0017,
"lo": -0.0137,
"hi": 0.0179,
"win": 0.592
"delta": 0.0147,
"lo": -0.0078,
"hi": 0.0402,
"win": 0.906
},
"mask_score": {
"delta": -0.0056,
"lo": -0.0174,
"hi": 0.0056,
"win": 0.174
"delta": -0.0016,
"lo": -0.0182,
"hi": 0.0149,
"win": 0.446
}
},
"pass": false
@@ -1,54 +1,54 @@
{
"per_class": {
"loop_all": {
"tp": 308,
"fp": 26,
"fn": 9,
"precision": 0.9221556886227545,
"recall": 0.9716088328075709,
"f1": 0.9462365591397849,
"mean_mask_iou": 0.9210329853480719,
"n_matched": 308
"tp": 151,
"fp": 25,
"fn": 7,
"precision": 0.8579545454545454,
"recall": 0.9556962025316456,
"f1": 0.9041916167664671,
"mean_mask_iou": 0.8884674186684715,
"n_matched": 151
},
"pin": {
"tp": 214,
"tp": 74,
"fp": 16,
"fn": 10,
"precision": 0.9304347826086956,
"recall": 0.9553571428571429,
"f1": 0.9427312775330396,
"mean_mask_iou": 0.9357500978870736,
"n_matched": 214
"precision": 0.8222222222222222,
"recall": 0.8809523809523809,
"f1": 0.8505747126436781,
"mean_mask_iou": 0.9094866087767759,
"n_matched": 74
},
"crystal": {
"tp": 76,
"fp": 63,
"fn": 73,
"precision": 0.5467625899280576,
"recall": 0.5100671140939598,
"f1": 0.5277777777777778,
"mean_mask_iou": 0.779695033962373,
"n_matched": 76
"tp": 69,
"fp": 62,
"fn": 66,
"precision": 0.5267175572519084,
"recall": 0.5111111111111111,
"f1": 0.518796992481203,
"mean_mask_iou": 0.777642425424736,
"n_matched": 69
},
"loop_face": {
"tp": 265,
"fp": 51,
"fn": 30,
"precision": 0.8386075949367089,
"recall": 0.8983050847457628,
"f1": 0.867430441898527,
"mean_mask_iou": 0.9022314012766025,
"n_matched": 265
"tp": 130,
"fp": 47,
"fn": 25,
"precision": 0.7344632768361582,
"recall": 0.8387096774193549,
"f1": 0.7831325301204819,
"mean_mask_iou": 0.8552905127066354,
"n_matched": 130
},
"ice": {
"tp": 5,
"tp": 4,
"fp": 3,
"fn": 38,
"precision": 0.625,
"recall": 0.11627906976744186,
"f1": 0.19607843137254904,
"mean_mask_iou": 0.7441614535204797,
"n_matched": 5
"precision": 0.5714285714285714,
"recall": 0.09523809523809523,
"f1": 0.16326530612244897,
"mean_mask_iou": 0.737655233049668,
"n_matched": 4
},
"needle": {
"tp": 0,
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 868,
"fp": 160,
"fn": 161,
"precision": 0.8443579766536965,
"recall": 0.8435374149659864,
"f1": 0.8439474963539134,
"mean_mask_iou": 0.9055272253710626,
"n_matched": 868
"tp": 428,
"fp": 154,
"fn": 147,
"precision": 0.7353951890034365,
"recall": 0.7443478260869565,
"f1": 0.7398444252376836,
"mean_mask_iou": 0.8627483743149267,
"n_matched": 428
},
"dataset": {
"gold_images": 335,
"pred_images": 336,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26s-seg-v3-s-640px-2026-10-01/weights.pt",
"environment": {
@@ -83,7 +84,7 @@
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-22T11:40:04",
"measured_at": "2026-10-25T09:47:13",
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v3-noflip-mask1-2026-09-30/gold_report.json",
"f1_delta": 0.0238,
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 308,
"tp": 151,
"fp": 19,
"fn": 9,
"precision": 0.9418960244648318,
"recall": 0.9716088328075709,
"f1": 0.9565217391304348,
"mean_mask_iou": 0.9229619481348076,
"n_matched": 308
"fn": 7,
"precision": 0.888235294117647,
"recall": 0.9556962025316456,
"f1": 0.9207317073170731,
"mean_mask_iou": 0.8883753001974017,
"n_matched": 151
},
"pin": {
"tp": 214,
"fp": 23,
"fn": 10,
"precision": 0.9029535864978903,
"recall": 0.9553571428571429,
"f1": 0.9284164859002169,
"mean_mask_iou": 0.9392434589975192,
"n_matched": 214
"tp": 76,
"fp": 21,
"fn": 8,
"precision": 0.7835051546391752,
"recall": 0.9047619047619048,
"f1": 0.839779005524862,
"mean_mask_iou": 0.9117903085113713,
"n_matched": 76
},
"crystal": {
"tp": 93,
"fp": 61,
"fn": 56,
"precision": 0.6038961038961039,
"recall": 0.6241610738255033,
"f1": 0.6138613861386139,
"mean_mask_iou": 0.7860551169622239,
"n_matched": 93
"tp": 84,
"fp": 60,
"fn": 51,
"precision": 0.5833333333333334,
"recall": 0.6222222222222222,
"f1": 0.6021505376344085,
"mean_mask_iou": 0.7879133701727913,
"n_matched": 84
},
"loop_face": {
"tp": 274,
"fp": 52,
"fn": 21,
"precision": 0.8404907975460123,
"recall": 0.9288135593220339,
"f1": 0.8824476650563607,
"mean_mask_iou": 0.9017649910336784,
"n_matched": 274
"tp": 140,
"fp": 50,
"fn": 15,
"precision": 0.7368421052631579,
"recall": 0.9032258064516129,
"f1": 0.8115942028985507,
"mean_mask_iou": 0.8506909275773613,
"n_matched": 140
},
"ice": {
"tp": 5,
"fp": 18,
"fn": 38,
"fn": 37,
"precision": 0.21739130434782608,
"recall": 0.11627906976744186,
"f1": 0.15151515151515152,
"recall": 0.11904761904761904,
"f1": 0.15384615384615383,
"mean_mask_iou": 0.8077960211591213,
"n_matched": 5
},
@@ -62,26 +62,29 @@
}
},
"overall": {
"tp": 894,
"fp": 173,
"fn": 135,
"precision": 0.837863167760075,
"recall": 0.8688046647230321,
"f1": 0.8530534351145038,
"mean_mask_iou": 0.9054766149636467,
"n_matched": 894
"tp": 456,
"fp": 168,
"fn": 119,
"precision": 0.7307692307692307,
"recall": 0.7930434782608695,
"f1": 0.7606338615512926,
"mean_mask_iou": 0.8613183483285363,
"n_matched": 456
},
"dataset": {
"gold_images": 335,
"pred_images": 335,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"weights": "/home/jungfrau/AareLC_train/models/registry/yolo26s-seg-v5-s-noflip-mask1-2026-10-23/weights.pt",
"environment": {
"host": "mx-spark-01",
"ultralytics": "8.4.160",
"torch": "2.14.0+cu130"
},
"measured_at": "2026-10-25T09:47:22",
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0053,
@@ -113,5 +116,6 @@
}
},
"pass": false
}
},
"gate_measured_on": 335
}
@@ -1,52 +1,52 @@
{
"per_class": {
"loop_all": {
"tp": 308,
"tp": 151,
"fp": 19,
"fn": 9,
"precision": 0.9418960244648318,
"recall": 0.9716088328075709,
"f1": 0.9565217391304348,
"mean_mask_iou": 0.9229619481348076,
"n_matched": 308
"fn": 7,
"precision": 0.888235294117647,
"recall": 0.9556962025316456,
"f1": 0.9207317073170731,
"mean_mask_iou": 0.8883753001974017,
"n_matched": 151
},
"pin": {
"tp": 214,
"fp": 23,
"fn": 10,
"precision": 0.9029535864978903,
"recall": 0.9553571428571429,
"f1": 0.9284164859002169,
"mean_mask_iou": 0.9392434589975192,
"n_matched": 214
"tp": 76,
"fp": 21,
"fn": 8,
"precision": 0.7835051546391752,
"recall": 0.9047619047619048,
"f1": 0.839779005524862,
"mean_mask_iou": 0.9117903085113713,
"n_matched": 76
},
"crystal": {
"tp": 93,
"fp": 61,
"fn": 56,
"precision": 0.6038961038961039,
"recall": 0.6241610738255033,
"f1": 0.6138613861386139,
"mean_mask_iou": 0.7860551169622239,
"n_matched": 93
"tp": 84,
"fp": 60,
"fn": 51,
"precision": 0.5833333333333334,
"recall": 0.6222222222222222,
"f1": 0.6021505376344085,
"mean_mask_iou": 0.7879133701727913,
"n_matched": 84
},
"loop_face": {
"tp": 274,
"fp": 52,
"fn": 21,
"precision": 0.8404907975460123,
"recall": 0.9288135593220339,
"f1": 0.8824476650563607,
"mean_mask_iou": 0.9017649910336784,
"n_matched": 274
"tp": 140,
"fp": 50,
"fn": 15,
"precision": 0.7368421052631579,
"recall": 0.9032258064516129,
"f1": 0.8115942028985507,
"mean_mask_iou": 0.8506909275773613,
"n_matched": 140
},
"ice": {
"tp": 5,
"fp": 18,
"fn": 38,
"fn": 37,
"precision": 0.21739130434782608,
"recall": 0.11627906976744186,
"f1": 0.15151515151515152,
"recall": 0.11904761904761904,
"f1": 0.15384615384615383,
"mean_mask_iou": 0.8077960211591213,
"n_matched": 5
},
@@ -62,20 +62,21 @@
}
},
"overall": {
"tp": 894,
"fp": 173,
"fn": 135,
"precision": 0.837863167760075,
"recall": 0.8688046647230321,
"f1": 0.8530534351145038,
"mean_mask_iou": 0.9054766149636467,
"n_matched": 894
"tp": 456,
"fp": 168,
"fn": 119,
"precision": 0.7307692307692307,
"recall": 0.7930434782608695,
"f1": 0.7606338615512926,
"mean_mask_iou": 0.8613183483285363,
"n_matched": 456
},
"dataset": {
"gold_images": 335,
"pred_images": 335,
"missing_predictions": 0,
"iou_threshold": 0.5
"iou_threshold": 0.5,
"ignored_objects": 454
},
"environment": {
"host": "mx-spark-01",
@@ -84,34 +85,34 @@
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0053,
"mask_iou_delta": -0.01,
"mask_score": 0.7867,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0064,
"f1_delta": 0.0207,
"mask_iou_delta": 0.0104,
"mask_score": 0.6831,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": -0.002,
"class_f1_delta": {
"loop_all": -0.0061,
"pin": -0.0043
"loop_all": -0.0085,
"pin": 0.0064
},
"pass_point_rule": false,
"pass_point_rule": true,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.006,
"lo": -0.0112,
"hi": 0.0239,
"win": 0.771
"delta": 0.0207,
"lo": -0.0028,
"hi": 0.0438,
"win": 0.961
},
"mask_score": {
"delta": -0.0004,
"lo": -0.0133,
"hi": 0.0122,
"win": 0.494
"delta": 0.0104,
"lo": -0.0053,
"hi": 0.027,
"win": 0.9
}
},
"pass": false
"pass": true
}
}
@@ -27,45 +27,45 @@
"pt"
],
"metrics": {
"tp": 894,
"fp": 173,
"fn": 135,
"precision": 0.837863167760075,
"recall": 0.8688046647230321,
"f1": 0.8530534351145038,
"mean_mask_iou": 0.9054766149636467,
"n_matched": 894
"tp": 456,
"fp": 168,
"fn": 119,
"precision": 0.7307692307692307,
"recall": 0.7930434782608695,
"f1": 0.7606338615512926,
"mean_mask_iou": 0.8613183483285363,
"n_matched": 456
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0053,
"mask_iou_delta": -0.01,
"mask_score": 0.7867,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0064,
"f1_delta": 0.0207,
"mask_iou_delta": 0.0104,
"mask_score": 0.6831,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": -0.002,
"class_f1_delta": {
"loop_all": -0.0061,
"pin": -0.0043
"loop_all": -0.0085,
"pin": 0.0064
},
"pass_point_rule": false,
"pass_point_rule": true,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.006,
"lo": -0.0112,
"hi": 0.0239,
"win": 0.771
"delta": 0.0207,
"lo": -0.0028,
"hi": 0.0438,
"win": 0.961
},
"mask_score": {
"delta": -0.0004,
"lo": -0.0133,
"hi": 0.0122,
"win": 0.494
"delta": 0.0104,
"lo": -0.0053,
"hi": 0.027,
"win": 0.9
}
},
"pass": false
"pass": true
}
}
+26 -26
View File
@@ -1,42 +1,42 @@
{
"overall": {
"tp": 891,
"fp": 170,
"fn": 138,
"precision": 0.8397737983034873,
"recall": 0.8658892128279884,
"f1": 0.8526315789473684,
"mean_mask_iou": 0.9056148202172515,
"n_matched": 891
"tp": 449,
"fp": 166,
"fn": 126,
"precision": 0.7300813008130081,
"recall": 0.7808695652173913,
"f1": 0.7546218487394959,
"mean_mask_iou": 0.8593936379304089,
"n_matched": 449
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0049,
"mask_iou_delta": -0.0125,
"mask_score": 0.7842,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0063,
"f1_delta": 0.0147,
"mask_iou_delta": -0.0016,
"mask_score": 0.6711,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": -0.0039,
"class_f1_delta": {
"loop_all": -0.0133,
"pin": 0.0121
"loop_all": -0.025,
"pin": 0.0352
},
"pass_point_rule": false,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.0017,
"lo": -0.0137,
"hi": 0.0179,
"win": 0.592
"delta": 0.0147,
"lo": -0.0078,
"hi": 0.0402,
"win": 0.906
},
"mask_score": {
"delta": -0.0056,
"lo": -0.0174,
"hi": 0.0056,
"win": 0.174
"delta": -0.0016,
"lo": -0.0182,
"hi": 0.0149,
"win": 0.446
}
},
"pass": false
@@ -53,5 +53,5 @@
"mAP50-95(M)": 0.60896
},
"version": "yolo26n-seg-v5-noflip-mask1-2026-10-25",
"measured_at": "2026-10-25T02:47:47"
"measured_at": "2026-10-25T09:47:49"
}
+22 -4
View File
@@ -24,11 +24,11 @@
},
"version": "yolo26n-seg-v5-noflip-mask1-2026-10-25",
"metrics": {
"f1": 0.8526315789473684,
"mean_mask_iou": 0.9056148202172515,
"f1": 0.7546218487394959,
"mean_mask_iou": 0.8593936379304089,
"gate_pass": false,
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"measured_at": "2026-10-25T02:47:47"
"measured_at": "2026-10-25T09:47:49"
},
"history": [
{
@@ -72,8 +72,26 @@
"at": "2026-10-25T02:47:47",
"by": "jungfrau@mx-spark-01",
"note": "{\"baseline\": \"/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json\", \"f1_delta\": 0.0049, \"mask_iou_delta\": -0.0125, \"mask_score\": 0.7842, \"mask_score_baseline\": 0.7967, \"matched_only_iou_delta\": -0.0063, \"class_f1_delta\": {\"loop_all\": -0.0133, \"pin\": 0.0121}, \"pass_point_rule\": false, \"rule\": \"paired bootstrap\", \"bootstrap\": {\"frames\": 285, \"mounts\": 250, \"draws\": 2000, \"f1\": {\"delta\": 0.0017, \"lo\": -0.0137, \"hi\": 0.0179, \"win\": 0.592}, \"mask_score\": {\"delta\": -0.0056, \"lo\": -0.0174, \"hi\": 0.0056, \"win\": 0.174}}, \"pass\": false}"
},
{
"status": "training",
"at": "2026-10-25T09:47:41",
"by": "jungfrau@mx-spark-01",
"note": "train_run.py"
},
{
"status": "measured",
"at": "2026-10-25T09:47:49",
"by": "jungfrau@mx-spark-01",
"note": ""
},
{
"status": "gate_failed",
"at": "2026-10-25T09:47:49",
"by": "jungfrau@mx-spark-01",
"note": "{\"baseline\": \"/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json\", \"f1_delta\": 0.0147, \"mask_iou_delta\": -0.0016, \"mask_score\": 0.6711, \"mask_score_baseline\": 0.6726, \"matched_only_iou_delta\": -0.0039, \"class_f1_delta\": {\"loop_all\": -0.025, \"pin\": 0.0352}, \"pass_point_rule\": false, \"rule\": \"paired bootstrap\", \"bootstrap\": {\"frames\": 335, \"mounts\": 300, \"draws\": 2000, \"f1\": {\"delta\": 0.0147, \"lo\": -0.0078, \"hi\": 0.0402, \"win\": 0.906}, \"mask_score\": {\"delta\": -0.0016, \"lo\": -0.0182, \"hi\": 0.0149, \"win\": 0.446}}, \"pass\": false}"
}
],
"host": "mx-spark-01",
"started": "2026-10-25T02:47:39"
"started": "2026-10-25T09:47:41"
}
+27 -27
View File
@@ -1,42 +1,42 @@
{
"overall": {
"tp": 895,
"fp": 182,
"fn": 134,
"precision": 0.8310120705663882,
"recall": 0.86977648202138,
"f1": 0.8499525166191833,
"mean_mask_iou": 0.9045394224676367,
"n_matched": 895
"tp": 450,
"fp": 173,
"fn": 125,
"precision": 0.7223113964686998,
"recall": 0.782608695652174,
"f1": 0.7512520868113521,
"mean_mask_iou": 0.8642687773554002,
"n_matched": 450
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0022,
"mask_iou_delta": -0.0099,
"mask_score": 0.7867,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0073,
"f1_delta": 0.0114,
"mask_iou_delta": 0.0037,
"mask_score": 0.6764,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": 0.0009,
"class_f1_delta": {
"loop_all": -0.0115,
"pin": 0.0066
"loop_all": -0.0131,
"pin": 0.0285
},
"pass_point_rule": false,
"pass_point_rule": true,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.0024,
"lo": -0.0143,
"hi": 0.0204,
"win": 0.595
"delta": 0.0114,
"lo": -0.0119,
"hi": 0.0351,
"win": 0.816
},
"mask_score": {
"delta": 0.0009,
"lo": -0.0127,
"hi": 0.0145,
"win": 0.553
"delta": 0.0037,
"lo": -0.0143,
"hi": 0.0224,
"win": 0.662
}
},
"pass": false
@@ -53,5 +53,5 @@
"mAP50-95(M)": 0.62865
},
"version": "yolo26n-seg-v5-n-1024px-2026-10-25",
"measured_at": "2026-10-25T02:48:09"
"measured_at": "2026-10-25T09:48:08"
}
+22 -4
View File
@@ -24,11 +24,11 @@
},
"version": "yolo26n-seg-v5-n-1024px-2026-10-25",
"metrics": {
"f1": 0.8499525166191833,
"mean_mask_iou": 0.9045394224676367,
"f1": 0.7512520868113521,
"mean_mask_iou": 0.8642687773554002,
"gate_pass": false,
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"measured_at": "2026-10-25T02:48:09"
"measured_at": "2026-10-25T09:48:08"
},
"history": [
{
@@ -72,11 +72,29 @@
"at": "2026-10-25T02:48:09",
"by": "jungfrau@mx-spark-01",
"note": "{\"baseline\": \"/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json\", \"f1_delta\": 0.0022, \"mask_iou_delta\": -0.0099, \"mask_score\": 0.7867, \"mask_score_baseline\": 0.7967, \"matched_only_iou_delta\": -0.0073, \"class_f1_delta\": {\"loop_all\": -0.0115, \"pin\": 0.0066}, \"pass_point_rule\": false, \"rule\": \"paired bootstrap\", \"bootstrap\": {\"frames\": 285, \"mounts\": 250, \"draws\": 2000, \"f1\": {\"delta\": 0.0024, \"lo\": -0.0143, \"hi\": 0.0204, \"win\": 0.595}, \"mask_score\": {\"delta\": 0.0009, \"lo\": -0.0127, \"hi\": 0.0145, \"win\": 0.553}}, \"pass\": false}"
},
{
"status": "training",
"at": "2026-10-25T09:47:59",
"by": "jungfrau@mx-spark-01",
"note": "train_run.py"
},
{
"status": "measured",
"at": "2026-10-25T09:48:08",
"by": "jungfrau@mx-spark-01",
"note": ""
},
{
"status": "gate_failed",
"at": "2026-10-25T09:48:08",
"by": "jungfrau@mx-spark-01",
"note": "{\"baseline\": \"/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json\", \"f1_delta\": 0.0114, \"mask_iou_delta\": 0.0037, \"mask_score\": 0.6764, \"mask_score_baseline\": 0.6726, \"matched_only_iou_delta\": 0.0009, \"class_f1_delta\": {\"loop_all\": -0.0131, \"pin\": 0.0285}, \"pass_point_rule\": true, \"rule\": \"paired bootstrap\", \"bootstrap\": {\"frames\": 335, \"mounts\": 300, \"draws\": 2000, \"f1\": {\"delta\": 0.0114, \"lo\": -0.0119, \"hi\": 0.0351, \"win\": 0.816}, \"mask_score\": {\"delta\": 0.0037, \"lo\": -0.0143, \"hi\": 0.0224, \"win\": 0.662}}, \"pass\": false}"
}
],
"train_args": {
"imgsz": 1024
},
"host": "mx-spark-01",
"started": "2026-10-25T02:47:59"
"started": "2026-10-25T09:47:59"
}
+28 -28
View File
@@ -1,45 +1,45 @@
{
"overall": {
"tp": 894,
"fp": 173,
"fn": 135,
"precision": 0.837863167760075,
"recall": 0.8688046647230321,
"f1": 0.8530534351145038,
"mean_mask_iou": 0.9054766149636467,
"n_matched": 894
"tp": 456,
"fp": 168,
"fn": 119,
"precision": 0.7307692307692307,
"recall": 0.7930434782608695,
"f1": 0.7606338615512926,
"mean_mask_iou": 0.8613183483285363,
"n_matched": 456
},
"gate": {
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"f1_delta": 0.0053,
"mask_iou_delta": -0.01,
"mask_score": 0.7867,
"mask_score_baseline": 0.7967,
"matched_only_iou_delta": -0.0064,
"f1_delta": 0.0207,
"mask_iou_delta": 0.0104,
"mask_score": 0.6831,
"mask_score_baseline": 0.6726,
"matched_only_iou_delta": -0.002,
"class_f1_delta": {
"loop_all": -0.0061,
"pin": -0.0043
"loop_all": -0.0085,
"pin": 0.0064
},
"pass_point_rule": false,
"pass_point_rule": true,
"rule": "paired bootstrap",
"bootstrap": {
"frames": 285,
"mounts": 250,
"frames": 335,
"mounts": 300,
"draws": 2000,
"f1": {
"delta": 0.006,
"lo": -0.0112,
"hi": 0.0239,
"win": 0.771
"delta": 0.0207,
"lo": -0.0028,
"hi": 0.0438,
"win": 0.961
},
"mask_score": {
"delta": -0.0004,
"lo": -0.0133,
"hi": 0.0122,
"win": 0.494
"delta": 0.0104,
"lo": -0.0053,
"hi": 0.027,
"win": 0.9
}
},
"pass": false
"pass": true
},
"training": {
"epochs_run": 235,
@@ -53,5 +53,5 @@
"mAP50-95(M)": 0.64104
},
"version": "yolo26s-seg-v5-s-noflip-mask1-2026-10-25",
"measured_at": "2026-10-25T02:47:58"
"measured_at": "2026-10-25T09:47:58"
}
+24 -6
View File
@@ -2,7 +2,7 @@
"id": "2026-10-23_v5-s-noflip-mask1",
"dataset": "dataset/2026-10-22_v5",
"base_weights": "models/base/yolo26s-seg.pt",
"status": "gate_failed",
"status": "gate_passed",
"created": "2026-10-23T03:53:49",
"created_by": "jungfrau@mx-spark-01",
"hyperparams": {
@@ -24,11 +24,11 @@
},
"version": "yolo26s-seg-v5-s-noflip-mask1-2026-10-25",
"metrics": {
"f1": 0.8530534351145038,
"mean_mask_iou": 0.9054766149636467,
"gate_pass": false,
"f1": 0.7606338615512926,
"mean_mask_iou": 0.8613183483285363,
"gate_pass": true,
"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json",
"measured_at": "2026-10-25T02:47:58"
"measured_at": "2026-10-25T09:47:58"
},
"history": [
{
@@ -72,8 +72,26 @@
"at": "2026-10-25T02:47:58",
"by": "jungfrau@mx-spark-01",
"note": "{\"baseline\": \"/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json\", \"f1_delta\": 0.0053, \"mask_iou_delta\": -0.01, \"mask_score\": 0.7867, \"mask_score_baseline\": 0.7967, \"matched_only_iou_delta\": -0.0064, \"class_f1_delta\": {\"loop_all\": -0.0061, \"pin\": -0.0043}, \"pass_point_rule\": false, \"rule\": \"paired bootstrap\", \"bootstrap\": {\"frames\": 285, \"mounts\": 250, \"draws\": 2000, \"f1\": {\"delta\": 0.006, \"lo\": -0.0112, \"hi\": 0.0239, \"win\": 0.771}, \"mask_score\": {\"delta\": -0.0004, \"lo\": -0.0133, \"hi\": 0.0122, \"win\": 0.494}}, \"pass\": false}"
},
{
"status": "training",
"at": "2026-10-25T09:47:49",
"by": "jungfrau@mx-spark-01",
"note": "train_run.py"
},
{
"status": "measured",
"at": "2026-10-25T09:47:58",
"by": "jungfrau@mx-spark-01",
"note": ""
},
{
"status": "gate_passed",
"at": "2026-10-25T09:47:58",
"by": "jungfrau@mx-spark-01",
"note": "{\"baseline\": \"/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json\", \"f1_delta\": 0.0207, \"mask_iou_delta\": 0.0104, \"mask_score\": 0.6831, \"mask_score_baseline\": 0.6726, \"matched_only_iou_delta\": -0.002, \"class_f1_delta\": {\"loop_all\": -0.0085, \"pin\": 0.0064}, \"pass_point_rule\": true, \"rule\": \"paired bootstrap\", \"bootstrap\": {\"frames\": 335, \"mounts\": 300, \"draws\": 2000, \"f1\": {\"delta\": 0.0207, \"lo\": -0.0028, \"hi\": 0.0438, \"win\": 0.961}, \"mask_score\": {\"delta\": 0.0104, \"lo\": -0.0053, \"hi\": 0.027, \"win\": 0.9}}, \"pass\": true}"
}
],
"host": "mx-spark-01",
"started": "2026-10-25T02:47:48"
"started": "2026-10-25T09:47:49"
}
+12 -3
View File
@@ -20,10 +20,10 @@ Generated by `python tools/ledger.py render`; do not edit by hand.
| 2026-09-30_v3-s-640px | gate_passed | dataset/2026-09-29_v3 | models/base/yolo26s-seg.pt | yolo26s-seg-v3-s-640px-2026-10-01 | 0.861 | 0.886 | yes | 2026-10-02T13:29 |
| 2026-10-01_v4-noflip-mask1 | promoted | dataset/2026-10-01_v4 | models/base/yolo26n-seg.pt | yolo26n-seg-v4-noflip-mask1-2026-10-02 | 0.852 | 0.891 | yes | 2026-10-02T13:25 |
| 2026-10-01_v4-recipeA | gate_failed | dataset/2026-10-01_v4 | models/base/yolo26n-seg.pt | yolo26n-seg-v4-recipeA-2026-10-02 | 0.832 | 0.884 | no | 2026-10-02T04:12 |
| 2026-10-22_v5-noflip-mask1 | gate_failed | dataset/2026-10-22_v5 | models/base/yolo26n-seg.pt | yolo26n-seg-v5-noflip-mask1-2026-10-25 | 0.853 | 0.906 | no | 2026-10-25T02:47 |
| 2026-10-22_v5-noflip-mask1 | gate_failed | dataset/2026-10-22_v5 | models/base/yolo26n-seg.pt | yolo26n-seg-v5-noflip-mask1-2026-10-25 | 0.755 | 0.859 | no | 2026-10-25T09:47 |
| 2026-10-23_v5-m-noflip-mask1 | aborted | dataset/2026-10-22_v5 | models/base/yolo26m-seg.pt | - | - | - | - | 2026-10-23T18:53 |
| 2026-10-23_v5-n-1024px | gate_failed | dataset/2026-10-22_v5 | models/base/yolo26n-seg.pt | yolo26n-seg-v5-n-1024px-2026-10-25 | 0.850 | 0.905 | no | 2026-10-25T02:48 |
| 2026-10-23_v5-s-noflip-mask1 | gate_failed | dataset/2026-10-22_v5 | models/base/yolo26s-seg.pt | yolo26s-seg-v5-s-noflip-mask1-2026-10-25 | 0.853 | 0.905 | no | 2026-10-25T02:47 |
| 2026-10-23_v5-n-1024px | gate_failed | dataset/2026-10-22_v5 | models/base/yolo26n-seg.pt | yolo26n-seg-v5-n-1024px-2026-10-25 | 0.751 | 0.864 | no | 2026-10-25T09:48 |
| 2026-10-23_v5-s-noflip-mask1 | gate_passed | dataset/2026-10-22_v5 | models/base/yolo26s-seg.pt | yolo26s-seg-v5-s-noflip-mask1-2026-10-25 | 0.761 | 0.861 | yes | 2026-10-25T09:47 |
States: exported → queued → training → measured → gate_passed → gate_failed → promoted → deployed (or aborted).
@@ -157,6 +157,9 @@ States: exported → queued → training → measured → gate_passed → gate_f
- 2026-10-25T02:47:39 · training · jungfrau@mx-spark-01 — train_run.py
- 2026-10-25T02:47:47 · measured · jungfrau@mx-spark-01
- 2026-10-25T02:47:47 · gate_failed · jungfrau@mx-spark-01 — {"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json", "f1_delta": 0.0049, "mask_iou_delta": -0.0125, "mask_score": 0.7842, "mask_score_baseline": 0.7967, "matched_only_iou_delta": -0.0063, "class_f1_delta": {"loop_all": -0.0133, "pin": 0.0121}, "pass_point_rule": false, "rule": "paired bootstrap", "bootstrap": {"frames": 285, "mounts": 250, "draws": 2000, "f1": {"delta": 0.0017, "lo": -0.0137, "hi": 0.0179, "win": 0.592}, "mask_score": {"delta": -0.0056, "lo": -0.0174, "hi": 0.0056, "win": 0.174}}, "pass": false}
- 2026-10-25T09:47:41 · training · jungfrau@mx-spark-01 — train_run.py
- 2026-10-25T09:47:49 · measured · jungfrau@mx-spark-01
- 2026-10-25T09:47:49 · gate_failed · jungfrau@mx-spark-01 — {"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json", "f1_delta": 0.0147, "mask_iou_delta": -0.0016, "mask_score": 0.6711, "mask_score_baseline": 0.6726, "matched_only_iou_delta": -0.0039, "class_f1_delta": {"loop_all": -0.025, "pin": 0.0352}, "pass_point_rule": false, "rule": "paired bootstrap", "bootstrap": {"frames": 335, "mounts": 300, "draws": 2000, "f1": {"delta": 0.0147, "lo": -0.0078, "hi": 0.0402, "win": 0.906}, "mask_score": {"delta": -0.0016, "lo": -0.0182, "hi": 0.0149, "win": 0.446}}, "pass": false}
## 2026-10-23_v5-m-noflip-mask1
@@ -173,6 +176,9 @@ States: exported → queued → training → measured → gate_passed → gate_f
- 2026-10-25T02:47:59 · training · jungfrau@mx-spark-01 — train_run.py
- 2026-10-25T02:48:09 · measured · jungfrau@mx-spark-01
- 2026-10-25T02:48:09 · gate_failed · jungfrau@mx-spark-01 — {"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json", "f1_delta": 0.0022, "mask_iou_delta": -0.0099, "mask_score": 0.7867, "mask_score_baseline": 0.7967, "matched_only_iou_delta": -0.0073, "class_f1_delta": {"loop_all": -0.0115, "pin": 0.0066}, "pass_point_rule": false, "rule": "paired bootstrap", "bootstrap": {"frames": 285, "mounts": 250, "draws": 2000, "f1": {"delta": 0.0024, "lo": -0.0143, "hi": 0.0204, "win": 0.595}, "mask_score": {"delta": 0.0009, "lo": -0.0127, "hi": 0.0145, "win": 0.553}}, "pass": false}
- 2026-10-25T09:47:59 · training · jungfrau@mx-spark-01 — train_run.py
- 2026-10-25T09:48:08 · measured · jungfrau@mx-spark-01
- 2026-10-25T09:48:08 · gate_failed · jungfrau@mx-spark-01 — {"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json", "f1_delta": 0.0114, "mask_iou_delta": 0.0037, "mask_score": 0.6764, "mask_score_baseline": 0.6726, "matched_only_iou_delta": 0.0009, "class_f1_delta": {"loop_all": -0.0131, "pin": 0.0285}, "pass_point_rule": true, "rule": "paired bootstrap", "bootstrap": {"frames": 335, "mounts": 300, "draws": 2000, "f1": {"delta": 0.0114, "lo": -0.0119, "hi": 0.0351, "win": 0.816}, "mask_score": {"delta": 0.0037, "lo": -0.0143, "hi": 0.0224, "win": 0.662}}, "pass": false}
## 2026-10-23_v5-s-noflip-mask1
@@ -183,3 +189,6 @@ States: exported → queued → training → measured → gate_passed → gate_f
- 2026-10-25T02:47:48 · training · jungfrau@mx-spark-01 — train_run.py
- 2026-10-25T02:47:58 · measured · jungfrau@mx-spark-01
- 2026-10-25T02:47:58 · gate_failed · jungfrau@mx-spark-01 — {"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json", "f1_delta": 0.0053, "mask_iou_delta": -0.01, "mask_score": 0.7867, "mask_score_baseline": 0.7967, "matched_only_iou_delta": -0.0064, "class_f1_delta": {"loop_all": -0.0061, "pin": -0.0043}, "pass_point_rule": false, "rule": "paired bootstrap", "bootstrap": {"frames": 285, "mounts": 250, "draws": 2000, "f1": {"delta": 0.006, "lo": -0.0112, "hi": 0.0239, "win": 0.771}, "mask_score": {"delta": -0.0004, "lo": -0.0133, "hi": 0.0122, "win": 0.494}}, "pass": false}
- 2026-10-25T09:47:49 · training · jungfrau@mx-spark-01 — train_run.py
- 2026-10-25T09:47:58 · measured · jungfrau@mx-spark-01
- 2026-10-25T09:47:58 · gate_passed · jungfrau@mx-spark-01 — {"baseline": "/home/jungfrau/AareLC_train/models/registry/yolo26n-seg-v4-noflip-mask1-2026-10-02/gold_report.json", "f1_delta": 0.0207, "mask_iou_delta": 0.0104, "mask_score": 0.6831, "mask_score_baseline": 0.6726, "matched_only_iou_delta": -0.002, "class_f1_delta": {"loop_all": -0.0085, "pin": 0.0064}, "pass_point_rule": true, "rule": "paired bootstrap", "bootstrap": {"frames": 335, "mounts": 300, "draws": 2000, "f1": {"delta": 0.0207, "lo": -0.0028, "hi": 0.0438, "win": 0.961}, "mask_score": {"delta": 0.0104, "lo": -0.0053, "hi": 0.027, "win": 0.9}}, "pass": true}
File diff suppressed because it is too large. Load diff
+8 -2
View File
@@ -14,7 +14,7 @@ from pathlib import Path
from typing import Dict, List
from src.eval.metrics import aggregate, evaluate_image, full_report
from src.eval.yolo_labels import load_class_names, read_label_file
from src.eval.yolo_labels import load_class_names, read_kept_outlines, read_label_file
def _stems(label_dir: Path) -> Dict[str, Path]:
@@ -26,17 +26,22 @@ def evaluate_dirs(pred_dir, gold_dir, iou_thr: float = 0.5,
pred_dir, gold_dir = Path(pred_dir), Path(gold_dir)
gold_files = _stems(gold_dir)
pred_files = _stems(pred_dir)
# outlines a model proposed and the reviewer kept are not judged (see evaluate_image)
kept = read_kept_outlines(gold_dir.parent)
# Gold defines the evaluation set; a missing prediction counts as all-FN.
per_image = []
missing_pred = 0
ignored = 0
for stem, gpath in sorted(gold_files.items()):
gold = read_label_file(gpath)
ppath = pred_files.get(stem)
pred = read_label_file(ppath) if ppath else []
if ppath is None:
missing_pred += 1
per_image.append(evaluate_image(gold, pred, iou_thr))
ign = kept.get(stem, ())
ignored += len(ign)
per_image.append(evaluate_image(gold, pred, iou_thr, ignore=ign))
report = full_report(aggregate(per_image), names)
report["dataset"] = {
@@ -44,6 +49,7 @@ def evaluate_dirs(pred_dir, gold_dir, iou_thr: float = 0.5,
"pred_images": len(pred_files),
"missing_predictions": missing_pred,
"iou_threshold": iou_thr,
"ignored_objects": ignored,
}
return report
+19 -7
View File
@@ -64,8 +64,9 @@ class ClassCount:
def _match_class(gold: List[PolygonInstance], pred: List[PolygonInstance],
iou_thr: float) -> ClassCount:
"""Greedy bbox-IoU matching within a single class."""
iou_thr: float, ignored: Sequence[PolygonInstance] = ()) -> ClassCount:
"""Greedy bbox-IoU matching within a single class. A prediction left unmatched that overlaps
an ``ignored`` object (bbox IoU >= iou_thr) is neither a hit nor a false alarm."""
cc = ClassCount()
gold_boxes = [g.bbox() for g in gold]
pred_boxes = [p.bbox() for p in pred]
@@ -89,18 +90,29 @@ def _match_class(gold: List[PolygonInstance], pred: List[PolygonInstance],
cc.fn = len(gold) - len(used_g)
cc.fp = len(pred) - len(used_p)
for pi, pb in enumerate(pred_boxes):
if pi not in used_p and any(bbox_iou(pb, g.bbox()) >= iou_thr for g in ignored):
cc.fp -= 1
return cc
def evaluate_image(gold: List[PolygonInstance], pred: List[PolygonInstance],
iou_thr: float = 0.5) -> Dict[int, ClassCount]:
"""Per-class counts for one image."""
iou_thr: float = 0.5, ignore: Sequence[int] = ()) -> Dict[int, ClassCount]:
"""Per-class counts for one image.
``ignore`` names gold objects by index that are not judged: outlines a model proposed and
the reviewer kept unchanged (tools/gold_kept.py), which are that model's own masks and
would score a perfect overlap against it. They leave the gold, and an unmatched prediction
of their class that overlaps one of them leaves the count too."""
skip = {int(i) for i in ignore}
judged = [g for i, g in enumerate(gold) if i not in skip]
ignored = [g for i, g in enumerate(gold) if i in skip]
by_class: Dict[int, ClassCount] = {}
classes = {i.class_id for i in gold} | {i.class_id for i in pred}
classes = {i.class_id for i in judged} | {i.class_id for i in pred}
for c in classes:
g = [i for i in gold if i.class_id == c]
g = [i for i in judged if i.class_id == c]
p = [i for i in pred if i.class_id == c]
by_class[c] = _match_class(g, p, iou_thr)
by_class[c] = _match_class(g, p, iou_thr, [i for i in ignored if i.class_id == c])
return by_class
+15 -1
View File
@@ -10,9 +10,10 @@ offers helpers to convert to/from absolute pixels.
"""
from __future__ import annotations
import json
from dataclasses import dataclass
from pathlib import Path
from typing import List, Optional, Tuple
from typing import Dict, List, Optional, Tuple
Point = Tuple[float, float]
@@ -121,3 +122,16 @@ def load_class_names(dataset_yaml) -> List[str]:
except ValueError:
continue
return [names_map[k] for k in sorted(names_map)] if names_map else []
def read_kept_outlines(gold_root) -> Dict[str, List[int]]:
"""``<gold root>/kept_machine.json`` (tools/gold_kept.py): frame stem -> indices of the gold
objects that are a model's proposal kept unchanged by the reviewer. Such an outline is the
model's own mask and is not judged (an ignore region in the evaluation). Empty when the file
is missing."""
p = Path(gold_root) / "kept_machine.json"
if not p.exists():
return {}
data = json.loads(p.read_text(encoding="utf-8"))
return {str(k): [int(i) for i in v] for k, v in (data.get("frames") or {}).items()}
+32
View File
@@ -0,0 +1,32 @@
"""A gold outline the reviewer kept from the model's proposal is not judged: neither a hit nor a miss,
and a prediction on it is not a false alarm."""
from src.eval.metrics import evaluate_image
from src.eval.yolo_labels import PolygonInstance
def sq(x, y, s=0.1, c=0):
return PolygonInstance(c, [(x, y), (x + s, y), (x + s, y + s), (x, y + s)])
def test_ignored_gold_object_is_neither_hit_nor_miss():
gold = [sq(0.1, 0.1), sq(0.5, 0.5)]
pred = [sq(0.1, 0.1), sq(0.5, 0.5)]
plain = evaluate_image(gold, pred)[0]
assert (plain.tp, plain.fp, plain.fn) == (2, 0, 0)
ign = evaluate_image(gold, pred, ignore=[1])[0]
assert (ign.tp, ign.fp, ign.fn) == (1, 0, 0), "the prediction on the ignored outline is not a false alarm"
assert len(ign.mask_ious) == 1, "its overlap does not enter the mask score"
def test_missing_prediction_on_an_ignored_object_is_not_a_miss():
gold = [sq(0.1, 0.1), sq(0.5, 0.5)]
cc = evaluate_image(gold, [sq(0.1, 0.1)], ignore=[1])[0]
assert (cc.tp, cc.fp, cc.fn) == (1, 0, 0)
def test_a_real_false_alarm_still_counts_and_other_classes_are_untouched():
gold = [sq(0.1, 0.1), sq(0.5, 0.5, c=1)]
pred = [sq(0.1, 0.1), sq(0.8, 0.8), sq(0.5, 0.5, c=1)]
out = evaluate_image(gold, pred, ignore=[0])
assert (out[0].tp, out[0].fp, out[0].fn) == (0, 1, 0), "the far prediction is a false alarm, the one on the ignored outline is not"
assert (out[1].tp, out[1].fp, out[1].fn) == (1, 0, 0)
+12 -5
View File
@@ -10,9 +10,10 @@ Two sets of frames:
stays comparable;
* **all unseen** frames: the core plus every gold frame added since that no dataset has used.
A frame a model pre-labelled (``data/gold/prelabel.json``) is unseen by every other model but not
by that one: where the reviewer kept a proposed outline, the gold holds the model's own mask. It is
left out of that model's measure, and a pair is compared on the frames neither of them touched.
Where the reviewer kept a proposed outline, the gold holds the pre-labelling model's own mask,
which overlaps itself perfectly. With ``data/gold/kept_machine.json`` (tools/gold_kept.py) such
outlines are ignored object by object for every model; without it, a frame a model pre-labelled
(``data/gold/prelabel.json``) leaves that model's measure altogether.
It grows with the gold set and is the one to judge a candidate on.
A model is listed when its predictions on the current gold set exist under
@@ -111,7 +112,10 @@ def main(argv: Optional[List[str]] = None) -> int:
frames: Dict[str, Dict[str, gate_stats.FrameCounts]] = {}
label_of: Dict[str, str] = {}
prelabel = gate_stats.load_prelabel(gold.parent)
# with kept_machine.json the evaluation ignores a model's own outlines object by object;
# without it, a frame the model pre-labelled leaves its measure altogether (the older rule)
object_level = gate_stats.kept_outlines_known(gold.parent)
prelabel = {} if object_level else gate_stats.load_prelabel(gold.parent)
own: Dict[str, int] = {}
for d in sorted((root / "runs").glob("_measure_*/gold_predictions")):
ver = d.parent.name[len("_measure_"):]
@@ -131,7 +135,10 @@ def main(argv: Optional[List[str]] = None) -> int:
usable_reps = {k: report({s: f for s, f in frames[k].items() if s in core and s not in bad_light}) for k in order}
print(f"clean gold frames: {len(unseen)}" + (f" (core {len(core_now)})" if len(unseen) != len(core_now) else ""))
if any(own.values()):
if object_level:
kept = sum(len(v) for v in __import__("src.eval.yolo_labels", fromlist=["x"]).read_kept_outlines(gold.parent).values())
print(f"{kept} gold outlines are a model's proposal kept unchanged by the reviewer: not judged for any model (data/gold/kept_machine.json)")
elif any(own.values()):
print("frames a model pre-labelled itself, left out of its own measure: "
+ ", ".join(f"{k} {n}" for k, n in own.items() if n))
elif not prelabel:
+9 -2
View File
@@ -33,6 +33,12 @@ def load_groups(gold_root) -> Dict[str, Dict[str, str]]:
return {"mount": dict(g.get("mount") or {}), "light": dict(g.get("light") or {}), "excluded": dict(g.get("excluded") or {})}
def kept_outlines_known(gold_root) -> bool:
"""True when ``kept_machine.json`` exists: the evaluation then ignores a model's own outlines
object by object, and the frame-level exclusion of ``without_own_proposals`` is not needed."""
return (Path(gold_root) / "kept_machine.json").exists()
def load_prelabel(gold_root) -> Dict[str, str]:
"""``data/gold/prelabel.json`` (tools/gold_prelabel.py): frame -> version of the model that
proposed its labels before a reviewer saw them. Empty when the file is missing."""
@@ -59,10 +65,11 @@ def per_frame(pred_dir, gold_dir, iou_thr: float = 0.5, stems: Optional[Iterable
``stems`` restricts the frames; a gold frame without a prediction file is left out
(the caller pairs on the frames both models have)."""
from src.eval.metrics import evaluate_image
from src.eval.yolo_labels import read_label_file
from src.eval.yolo_labels import read_kept_outlines, read_label_file
pred_dir, gold_dir = Path(pred_dir), Path(gold_dir)
wanted = set(stems) if stems is not None else None
kept = read_kept_outlines(gold_dir.parent) # a model's own outlines are not judged
out: Dict[str, FrameCounts] = {}
for g in sorted(gold_dir.glob("*.txt")):
if wanted is not None and g.stem not in wanted:
@@ -71,7 +78,7 @@ def per_frame(pred_dir, gold_dir, iou_thr: float = 0.5, stems: Optional[Iterable
if not p.exists():
continue
frame: FrameCounts = {}
for c, cc in evaluate_image(read_label_file(g), read_label_file(p), iou_thr).items():
for c, cc in evaluate_image(read_label_file(g), read_label_file(p), iou_thr, ignore=kept.get(g.stem, ())).items():
frame[int(c)] = (float(cc.tp), float(cc.fp), float(cc.fn), float(sum(cc.mask_ious)))
out[g.stem] = frame
return out
+101
View File
@@ -0,0 +1,101 @@
"""Which gold outlines are a model's proposal that the reviewer kept unchanged.
Written to ``data/gold/kept_machine.json`` as ``{"frames": {stem: [gold object indices]}}``: a
gold object is kept-machine when a proposed object of the same class in the studio's batch
annotation overlaps it with mask IoU >= 0.98. Such an outline is the pre-labelling model's own
mask; the evaluation ignores it for every model (src/eval/metrics.evaluate_image), so a model
is never scored against itself and the gold set can grow with any reviewed frame.
python tools/gold_kept.py [--studio ~/AareLC_studio/data/pipeline_prod] [--iou 0.98]
"""
from __future__ import annotations
import argparse
import glob
import json
import re
from collections import Counter
from datetime import datetime
from pathlib import Path
import cv2
import numpy as np
HERE = Path(__file__).resolve().parent
NAMES = ["loop_all", "pin", "crystal", "loop_face", "ice", "needle"]
GRID = 512
def gold_objects(path: Path):
out = []
for line in path.read_text(encoding="utf-8").split("\n"):
p = line.split()
if len(p) < 7:
continue
out.append((int(p[0]), np.array([float(v) for v in p[1:]], dtype=np.float64).reshape(-1, 2)))
return out
def raster(pts_norm) -> np.ndarray:
m = np.zeros((GRID, GRID), np.uint8)
cv2.fillPoly(m, [np.round(pts_norm * GRID).astype(np.int32).reshape(-1, 1, 2)], 1)
return m.astype(bool)
def iou(a, b) -> float:
u = int((a | b).sum())
return int((a & b).sum()) / u if u else 0.0
def main() -> int:
ap = argparse.ArgumentParser(description=__doc__, formatter_class=argparse.RawDescriptionHelpFormatter)
ap.add_argument("--root", default=str(HERE.parent))
ap.add_argument("--studio", default=str(Path.home() / "AareLC_studio" / "data" / "pipeline_prod"))
ap.add_argument("--iou", type=float, default=0.98, help="mask IoU from which a gold outline counts as the proposal kept")
args = ap.parse_args()
root, studio = Path(args.root).expanduser(), Path(args.studio).expanduser()
labels = root / "data" / "gold" / "labels"
proposals = {}
for f in glob.glob(str(studio / "20*/annotations/tpi_*.json")):
proposals.setdefault(Path(f).stem, f)
frames, kept, total = {}, Counter(), Counter()
with_proposal = 0
for g in sorted(labels.glob("*.txt")):
m = re.search(r"tpi_(\d+)", g.stem)
objs = gold_objects(g)
for c, _ in objs:
total[NAMES[c]] += 1
f = proposals.get("tpi_" + m.group(1)) if m else None
if not f:
continue
with_proposal += 1
a = json.loads(Path(f).read_text(encoding="utf-8"))
W, H = float(a.get("width") or 2040), float(a.get("height") or 2040)
props = []
for o in a.get("objects") or []:
poly = (o.get("polygons") or [None])[0]
if poly and len(poly) >= 3:
props.append((o.get("class_id"), raster(np.array(poly, dtype=np.float64) / [W, H])))
idx = []
for i, (c, pts) in enumerate(objs):
rm = raster(pts)
if any(pc == c and iou(rm, pm) >= args.iou for pc, pm in props):
kept[NAMES[c]] += 1
idx.append(i)
if idx:
frames[g.stem] = idx
out = {"built": datetime.now().isoformat(timespec="seconds"), "source": str(studio), "iou": args.iou,
"gold_frames": sum(1 for _ in labels.glob("*.txt")), "with_a_proposal": with_proposal,
"kept_by_class": dict(kept), "gold_by_class": dict(total), "frames": frames}
dest = root / "data" / "gold" / "kept_machine.json"
dest.write_text(json.dumps(out, indent=1, sort_keys=True) + "\n", encoding="utf-8")
n = sum(len(v) for v in frames.values())
print(f"{n} of {sum(total.values())} gold outlines are a proposal kept unchanged, on {len(frames)} frames -> {dest}")
for c in NAMES:
if total[c]:
print(f" {c:10} {kept[c]:4} of {total[c]:4}")
return 0
if __name__ == "__main__":
raise SystemExit(main())
+3 -2
View File
@@ -237,8 +237,9 @@ def paired_with_baseline(run_dir: Path, baseline: Optional[Path]) -> Optional[Di
gold = ROOT / "data" / "gold" / "labels"
cand = gate_stats.per_frame(run_dir / "gold_predictions", gold)
base = gate_stats.per_frame(base_pred, gold)
# neither model is judged on frames it pre-labelled: the gold there holds its own outlines
prelabel = gate_stats.load_prelabel(gold.parent)
# neither model is judged on its own outlines: object by object with kept_machine.json
# (per_frame does it), else by leaving out whole frames a model pre-labelled
prelabel = {} if gate_stats.kept_outlines_known(gold.parent) else gate_stats.load_prelabel(gold.parent)
cand_version = (json.loads((run_dir / "run.json").read_text(encoding="utf-8")).get("version") if (run_dir / "run.json").exists() else None)
base_version = Path(baseline).parent.name
if base_version.startswith("_measure_"):