From b9e6828139026b7f2889fc9a8e18a88406c76d86 Mon Sep 17 00:00:00 2001 From: felirami Date: Sun, 16 Aug 2026 15:46:10 -0400 Subject: [PATCH 1/2] Fix live-web false positives: agreement rule, live hard negatives Three coordinated changes derived from the published 2026-08-16 live smoke failure (docs/live-smoke-2026-08-16.md): 1. CF view agreement: a lone TTA view in [0.65, 0.85) no longer carries an AI verdict; it falls back to the runner-up view. Views at or above 0.85 keep single-view authority and early-exit. The adaptive band extends through the mid band so corroborating views always exist. Applied in the shared scoring fold and in the live predictAdaptiveViews path. 2. Probe retrained with 118 verified-real live CDN images (camera EXIF present in Unsplash API metadata; rows disjoint held-out guard) on top of the existing hard negatives. 3. Strong rescue tier tightened to [0.02, 0.20) with DINO >= 0.96. Also: harness and extractor ingest .avif (the format blind spot that hid live CDN bytes from evaluation), and the update check is skipped while offline. Verified with the implemented adaptive pipeline: bench 87.9 BA / 76.0 TPR / 99.8 TNR, stress 3/240, live guard 4/132 (3.0 percent, was 9.2 percent for v1.2.0 on identical bytes). Full suite 216 green. --- eval/extract-features.mjs | 2 +- eval/harness.mjs | 2 +- models/Xenova/dinov2-small/onnx | 1 + .../CommunityForensics-DeepfakeDet-ViT/onnx | 1 + models/probe/dino-probe.json | 2 +- src/background.js | 3 ++ src/community-forensics.js | 5 +- src/fuse.js | 4 +- src/scoring.js | 50 ++++++++++++++++--- tests/dino.test.mjs | 2 +- tests/eval-policy.test.mjs | 10 +++- tests/fuse.test.mjs | 8 +-- tests/scoring.test.mjs | 33 +++++++++--- 13 files changed, 96 insertions(+), 27 deletions(-) create mode 120000 models/Xenova/dinov2-small/onnx create mode 120000 models/buildborderless/CommunityForensics-DeepfakeDet-ViT/onnx diff --git a/eval/extract-features.mjs b/eval/extract-features.mjs index a380643..a28a238 100644 --- a/eval/extract-features.mjs +++ b/eval/extract-features.mjs @@ -23,7 +23,7 @@ import { RawImage } from '@huggingface/transformers'; import sharp from 'sharp'; import ort from 'onnxruntime-node'; -const IMAGE_EXT = new Set(['.jpg', '.jpeg', '.png', '.webp', '.bmp']); +const IMAGE_EXT = new Set(['.jpg', '.jpeg', '.png', '.webp', '.bmp', '.avif']); const AI_DIR_NAMES = new Set(['ai', 'fake', 'generated', 'synthetic']); const REAL_DIR_NAMES = new Set(['real', 'authentic', 'photo', 'natural']); diff --git a/eval/harness.mjs b/eval/harness.mjs index 985617c..32cf099 100644 --- a/eval/harness.mjs +++ b/eval/harness.mjs @@ -30,7 +30,7 @@ import { const __dirname = dirname(fileURLToPath(import.meta.url)); const ROOT = join(__dirname, '..'); -const IMAGE_EXT = new Set(['.jpg', '.jpeg', '.png', '.webp', '.gif', '.bmp']); +const IMAGE_EXT = new Set(['.jpg', '.jpeg', '.png', '.webp', '.gif', '.bmp', '.avif']); const AI_DIR_NAMES = new Set(['ai', 'fake', 'generated', 'synthetic']); const REAL_DIR_NAMES = new Set(['real', 'authentic', 'photo', 'natural']); diff --git a/models/Xenova/dinov2-small/onnx b/models/Xenova/dinov2-small/onnx new file mode 120000 index 0000000..1e6c528 --- /dev/null +++ b/models/Xenova/dinov2-small/onnx @@ -0,0 +1 @@ +/Users/felirami/hybridai/models/Xenova/dinov2-small/onnx \ No newline at end of file diff --git a/models/buildborderless/CommunityForensics-DeepfakeDet-ViT/onnx b/models/buildborderless/CommunityForensics-DeepfakeDet-ViT/onnx new file mode 120000 index 0000000..574e714 --- /dev/null +++ b/models/buildborderless/CommunityForensics-DeepfakeDet-ViT/onnx @@ -0,0 +1 @@ +/Users/felirami/hybridai/models/buildborderless/CommunityForensics-DeepfakeDet-ViT/onnx \ No newline at end of file diff --git a/models/probe/dino-probe.json b/models/probe/dino-probe.json index 0475f4c..3291b1c 100644 --- a/models/probe/dino-probe.json +++ b/models/probe/dino-probe.json @@ -1 +1 @@ -{"backbone":"dinov2-small","pooling":"cls+mean","dims":768,"featureMean":[-0.587975,-0.094064,0.388187,-0.183691,0.389014,-0.03528,-0.034767,-0.26375,0.313221,0.418463,-0.150547,0.241793,-0.441617,0.148957,0.852502,0.057653,-0.201931,-0.814269,0.303307,-0.769804,0.555188,-0.318358,-0.237053,-0.204962,-0.215752,0.205432,0.049399,-0.511024,0.793436,-0.121574,-0.30079,-0.626142,0.028857,0.134217,0.492368,0.534628,-0.53921,0.678229,0.23157,0.371823,-0.192139,0.889275,-0.262973,0.158686,-0.360628,-0.631063,-0.802162,-0.092029,0.962817,0.371611,0.225355,-0.120516,0.342901,-0.285793,-0.694951,0.176231,0.498634,0.417661,-0.397721,-0.789725,0.763898,0.55714,0.111621,-0.539031,-0.324011,0.390558,-0.269609,0.107317,0.870136,-0.075503,-0.5581,0.282389,-0.603112,0.02453,0.482026,-0.532884,-0.317824,0.080954,-0.445118,-0.020532,0.11349,-0.412927,0.080437,-0.192541,-0.991158,-0.222681,-0.430975,-0.1809,-0.423271,0.311884,0.337933,-0.279033,-0.321905,-0.39488,0.776455,-0.458481,0.933325,0.074337,0.048853,-0.465585,-0.465498,0.900798,-0.367444,-0.576422,0.036017,0.325469,-0.341783,-0.374923,0.429428,-0.250852,-0.002197,0.087273,0.471771,0.181571,0.013947,-0.366408,-0.123343,0.30949,-0.417957,-0.28191,0.241463,1.256193,-0.115599,0.425791,0.821136,-0.721735,0.341678,-0.454495,-0.246905,0.50968,0.194299,-0.225802,-0.095598,0.203785,0.072845,1.058425,-0.296343,0.18367,-0.547833,0.075871,-0.663155,0.142279,-0.097237,-0.566986,0.060041,-0.312514,0.122253,0.747029,0.140247,0.266245,0.197988,-0.777732,-0.176156,0.176283,-0.490247,-0.887124,0.891164,-0.520175,0.206008,-0.442203,-0.195839,-0.460117,-0.515188,-0.167662,0.252814,-0.268552,-0.092051,-0.229226,-0.432826,0.457736,0.152554,0.1797,0.184788,0.292237,0.442868,-0.428969,-0.144477,-0.249511,0.31072,0.69643,0.445749,0.34417,0.055399,-0.010668,-0.018404,-0.080901,0.514875,0.276385,0.368935,-0.335876,-0.082503,-0.170969,-0.235624,-0.203766,0.028701,-0.050326,0.70553,0.400489,-0.43496,-0.354247,0.225182,-1.024071,0.352065,-0.253172,0.11066,0.066061,0.511124,-0.363477,0.278419,0.095486,0.665825,-0.502027,0.36272,-0.230787,-0.122765,-0.195727,-0.334865,-0.131487,-0.041678,-0.261052,0.262479,-0.370835,-0.839509,-0.432078,-0.328707,-0.029437,-0.054144,0.3592,-0.629387,0.083973,0.062789,-0.643402,-0.465046,0.379701,0.144936,0.081448,0.029463,-0.469032,-0.33728,-0.141475,0.359924,-0.028534,-0.109033,-0.336319,0.478765,-0.212261,-0.036019,-0.433826,-0.33183,-0.069357,-0.160389,0.314752,0.252278,0.228326,-0.532176,0.003395,0.561955,0.318074,0.204979,-0.393821,0.06273,0.245302,-0.140247,-0.303843,0.0621,-0.447401,-0.33335,-0.38036,-0.014597,-0.13101,0.266009,-0.427313,-0.377637,0.431003,0.589889,0.192261,0.082655,0.932067,-0.078612,-0.241809,-0.38188,-0.315707,0.134304,-0.363783,0.419194,0.134956,-0.599328,-0.18083,0.00489,-0.35889,-0.420401,-0.646764,0.631955,0.546848,-0.008727,0.139225,0.464238,0.095301,0.910026,0.274171,-0.035885,-0.081271,-0.609026,0.290416,1.145015,0.076189,-0.050211,0.173622,-0.10273,0.081563,-0.26311,0.273861,0.640575,-0.529366,-0.064814,-0.126189,0.651274,0.050973,-0.588272,-0.08474,0.296692,0.746444,0.064172,-0.075513,-0.264548,0.343813,0.633145,-0.895489,0.48237,-0.961604,0.079797,-0.177856,0.783591,-0.232921,0.195083,-0.572718,0.128741,0.243497,0.384929,0.417505,0.389078,-0.078273,0.076579,-0.147265,0.055735,0.72316,0.149476,-0.785862,0.059903,0.491495,0.008462,0.26414,0.233666,-0.301515,-0.631521,-0.216402,0.000337,0.201215,0.686283,-0.44991,-0.468667,-0.148807,0.454872,-0.251726,-0.381843,0.740801,0.047709,0.261875,0.328339,0.449155,-0.746784,0.614152,-0.439847,0.393123,0.487923,-0.420936,0.316907,0.406955,-0.23812,0.127694,-0.508902,0.184567,0.367506,0.301398,-0.459783,0.269441,0.003876,-0.246342,0.40167,-0.005977,-0.022747,-0.311014,-0.145334,0.765235,0.359748,0.102194,-0.435697,0.243568,0.38334,0.282357,-0.857057,-0.367895,0.195357,-0.297623,-0.128924,-0.588836,0.091792,0.219812,-0.014878,0.582207,-0.041479,-0.328032,0.262317,-0.283182,-0.415969,-0.137839,-0.255672,-0.024226,0.92589,-0.200145,0.121445,0.609069,0.409984,0.266544,0.067213,0.760914,-0.132166,0.379301,0.274816,-0.498351,-1.182898,-0.437314,0.543169,-0.163434,0.157789,0.379634,0.366162,-0.528209,-0.404568,0.131411,-0.084018,0.458094,0.136039,-0.560245,1.104399,0.015471,-0.274156,-0.139152,-0.532252,1.000395,0.05223,-0.336412,2.858806,0.292073,-0.505123,-0.125639,-0.528936,-0.113324,0.559894,0.253012,-0.406573,-0.036457,-0.186097,-2.012433,0.350996,0.115555,-0.393161,-0.114788,-0.228742,-0.271938,-0.409634,-0.284322,-0.684934,0.248736,0.499936,-0.225719,-0.012959,-0.405655,0.587531,-0.12975,0.73205,-0.133194,0.027896,-0.752818,-0.204851,0.824072,0.260058,-0.041193,0.082104,0.360634,-0.183001,-0.149601,1.02941,-0.34026,0.485442,-0.347906,0.65163,0.081318,0.395741,-0.667851,-0.301977,0.023849,-0.546042,-0.189208,0.499515,-0.56946,-0.005725,0.58731,0.227737,-0.11464,0.836479,-0.11108,0.039808,0.212948,0.003946,0.311947,-0.104226,-0.152645,-0.07588,-0.443603,-0.690995,0.5637,0.362842,-0.008355,-0.619502,-0.519172,0.079569,-0.012055,-0.226433,-0.197385,0.076349,0.887509,-0.199224,0.189152,0.370053,-0.016252,0.04095,0.540584,0.022476,-0.89539,0.703288,-0.234887,-0.266262,-0.379109,0.166099,-0.125871,-0.966179,-0.204287,1.156931,-0.400043,0.190622,-0.316264,-0.287796,0.214263,0.289405,0.62934,0.448696,0.640105,0.229525,-0.227672,0.045887,0.345327,-0.060931,1.210493,0.222469,1.009345,0.076387,0.010478,-0.040406,0.296481,0.604571,-0.181672,-0.036949,0.129302,-0.116943,0.118876,0.215726,-0.496861,0.242137,-0.111106,0.225012,0.267288,-0.517544,-0.066322,-0.152625,-0.574932,0.486472,0.248472,0.160378,0.524943,0.695064,-0.309064,0.115739,0.602706,0.499806,0.116116,-0.229776,0.235418,0.169756,0.140619,-0.158813,-0.327554,0.471144,0.619871,-0.344533,-0.511594,-0.452695,-0.02769,0.069816,0.174441,0.314005,-0.023002,-0.722868,0.346391,0.284689,-0.245952,-0.298563,-0.393169,-0.642809,-0.042394,-0.45433,-0.13287,0.013168,-0.126427,0.267186,-0.331327,-0.280022,-0.576007,0.223661,0.045645,0.059177,-0.389933,-0.365972,-0.277524,-0.264547,-0.027986,0.546796,-0.086678,0.027024,-0.201344,0.85308,0.300601,0.206311,0.209232,0.407434,-0.279145,0.713712,0.100246,0.25919,-0.135071,0.102692,-0.432944,-0.178766,-0.563679,0.072287,-0.06057,-0.200482,0.316457,0.764198,0.453713,-0.376656,0.759194,-2.95688,-0.085011,-0.587951,-0.277082,0.570713,-0.323983,0.734727,0.445457,-0.438078,-0.509942,-0.149286,-0.135624,-0.317897,-0.116691,0.208374,0.593096,-0.130487,-0.035505,0.235881,0.177243,-0.02024,0.316018,0.13533,-0.038237,-0.334865,-0.261194,0.793838,0.31482,0.01806,0.076425,-0.584499,0.332502,0.391397,0.345847,0.951976,-0.378782,-0.07094,-0.092787,0.148784,-0.22873,-0.325966,0.00571,0.33515,0.464256,0.252271,1.121228,0.001736,0.218373,-0.078143,-0.500651,0.722513,-0.437303,0.264046,-0.013276,0.481954,-0.291381,0.182062,-0.336424,0.144196,0.294189,0.390059,0.203474,0.526969,0.196394,-0.006748,-0.371501,0.227491,1.15031,-0.127903,-0.120548,0.109119,0.279924,0.026226,0.280413,0.212739,-0.368002,-0.12312,-0.398959,-0.113201,-0.017459,0.687796,-0.332111,-0.084421,0.448106,0.868388,-0.07666,0.324594,-0.407628,-0.114554,0.329985,-0.074088,-0.279454,-0.342857,0.453994,0.776692,0.206599,0.499095,0.228425,0.299621,-0.115071,-0.349495,-0.568216,-0.696514,0.499988,0.479448,0.241467],"featureStd":[2.563339,1.423751,2.391731,2.456788,2.49136,1.400176,2.292005,2.056408,2.517597,2.521402,2.372317,2.559408,2.45855,2.427769,2.646003,2.431169,2.445219,2.565531,1.868967,2.321755,2.425466,2.340049,2.457585,1.771333,2.345232,2.428889,2.528439,2.373985,1.537687,2.612333,2.253525,2.297394,2.204188,2.561985,2.336477,2.420455,2.580578,2.46789,2.619453,2.796326,2.510579,2.602715,2.72787,2.353813,2.338165,2.356565,2.419166,2.427417,2.570777,2.364378,2.408781,2.458287,2.503559,2.226682,2.301121,2.605879,2.499298,2.316271,2.639385,2.400107,2.391448,2.495875,2.45487,2.638347,1.880394,2.506346,2.431533,2.508441,2.234693,2.330746,2.708151,2.218388,2.655668,2.427462,2.777788,2.465547,2.431291,2.468739,2.37641,1.478274,2.249462,2.473785,2.354831,2.457668,2.094002,2.46003,2.395645,2.392076,2.360279,2.303572,2.532654,2.423549,2.423603,2.638671,2.624535,2.138809,2.282007,2.484847,2.385271,2.566783,2.570779,2.502948,2.505383,2.631558,2.157913,2.546465,2.570621,2.436125,2.627695,2.559257,2.346806,2.628764,2.499247,2.21057,2.495273,2.389233,2.37116,2.536734,2.599883,2.537106,2.417322,2.255326,2.403314,2.570478,2.581508,1.873178,2.554678,2.586836,2.45965,2.797326,2.026586,2.436644,2.622622,2.402128,2.652706,2.795144,2.452358,2.44751,2.116027,2.573459,2.12307,2.109779,2.204842,2.367895,2.393208,2.535227,2.232362,2.345313,2.201099,2.283726,2.384232,2.233622,2.401564,2.523832,2.522131,2.548948,2.527035,2.461946,2.529115,2.117318,2.524763,2.483101,2.219972,2.302431,2.501387,2.487032,2.413064,2.277877,2.568198,2.394802,2.454288,2.473629,2.355906,2.596616,2.559672,2.453075,2.332952,2.402885,2.379027,2.406555,2.546166,1.821679,2.506817,2.187776,2.404567,2.475402,2.459834,2.533744,1.788142,2.165477,2.344194,2.567156,2.336603,2.284975,2.512372,2.063715,2.576186,2.409388,2.369309,1.99447,2.49246,1.984343,2.593194,2.806756,2.360273,2.491558,2.429415,2.390794,2.825627,2.139903,2.39918,1.94134,2.045114,2.538592,2.516611,2.487707,2.101606,2.6445,2.34486,2.906039,2.203376,2.479163,2.650604,2.487676,2.432678,2.266505,2.405849,1.927561,2.557759,2.378572,2.4282,2.785256,1.99228,2.510639,2.498752,2.511649,2.40036,2.519058,2.416581,2.38335,1.793607,2.460965,2.470414,2.278076,2.034328,1.855927,2.207901,2.387337,2.709988,2.456251,2.461658,2.589948,2.387838,2.056813,2.431863,2.47,2.278761,2.669976,2.184396,2.50537,2.497214,1.974584,1.817137,2.023247,2.003098,2.532809,2.258775,2.412525,2.615696,2.5519,1.873439,2.435615,2.401814,2.385866,2.525769,2.012105,2.435133,2.32145,0.887453,2.386744,2.237844,2.431284,2.587771,2.585727,2.48945,2.499703,2.090283,2.455885,1.996087,2.488211,2.747732,1.923782,2.593993,2.661347,2.645931,2.462117,2.211663,2.382341,2.744653,2.546234,2.705935,2.284904,2.726695,2.266985,2.79901,2.268376,2.282386,2.467811,2.228202,2.436372,2.486526,2.482785,2.427398,2.649818,2.184376,2.368342,2.676703,2.142772,1.839423,2.376691,2.400639,2.466783,2.326979,2.035177,2.282886,1.992425,2.795572,2.448023,2.499468,2.253212,2.567494,2.378672,2.410847,2.348834,2.572547,2.482672,2.468286,2.604575,1.825566,2.290337,2.460326,2.38687,2.611959,2.53012,2.397307,2.408846,2.497394,2.608252,2.529612,2.395428,2.277117,2.598885,2.582701,2.319226,2.42093,2.493205,2.36651,2.548446,2.709813,2.203807,1.960416,2.393026,2.563166,2.502107,1.979449,2.27817,2.535586,2.682707,2.023539,2.557767,2.106403,2.569568,1.918993,2.598817,2.63012,2.16562,2.372143,2.464213,2.507679,1.509507,2.459894,2.532621,2.611947,1.873226,1.451609,0.873068,1.507175,1.370198,1.337026,0.542871,1.168773,1.052381,1.361305,1.205763,1.316309,1.545503,1.373617,1.346212,1.378905,1.450366,1.372689,1.577827,1.472313,1.282475,1.226887,1.321852,1.38988,1.530707,1.278118,1.698951,1.457573,1.350219,0.734797,1.426415,1.116985,1.328873,1.425924,1.432487,1.15739,1.291616,1.533029,1.257384,1.439381,1.694039,1.472631,1.534007,1.703732,1.546579,1.081434,1.405172,1.447181,1.307805,1.37513,1.226256,1.32392,1.269335,1.378694,1.176068,1.189424,1.589318,1.472203,1.392489,1.54868,1.65596,1.398851,1.377896,1.456501,1.548904,0.863664,1.358282,1.377703,1.388008,3.07776,1.226226,1.648239,1.310923,1.235637,1.572233,1.535958,1.417871,1.339792,1.36561,1.372263,0.878759,1.27591,1.433725,1.43432,1.442349,0.728772,1.355112,1.495507,1.420357,1.271516,1.254941,1.499588,1.352564,1.184815,1.615235,1.523036,1.221451,1.340205,1.523329,1.326951,1.578474,1.429487,1.443677,1.585238,1.627051,1.288435,1.437949,1.587061,1.420339,1.542493,1.593181,1.287701,1.581101,1.384512,1.216999,1.350132,1.351405,1.410688,1.433633,1.492631,1.329771,1.356843,1.016007,1.424585,1.398494,1.395426,0.773151,1.570321,1.404215,1.362366,1.658203,1.163558,1.374075,1.557446,1.310952,1.602988,2.663496,1.358993,1.377992,1.6492,1.345186,0.918971,0.915915,1.045367,1.271844,1.3002,1.479599,1.175982,1.298311,1.200051,1.348142,1.146518,1.047058,1.23253,1.336482,1.552355,1.538983,1.456771,1.428194,1.493379,0.986838,1.444949,1.490811,1.378081,1.247501,1.462104,1.606163,1.309522,1.31344,1.546898,1.324669,1.347637,1.198871,1.283499,1.617502,1.514197,1.304956,1.103404,1.351248,1.244666,2.179316,1.539226,1.023734,1.483796,1.157546,1.278345,1.370669,1.415046,1.488564,0.707914,0.921098,1.218571,1.615242,1.301283,1.098433,1.422374,1.021985,1.54172,1.461086,1.194443,0.979504,1.346751,0.881797,1.710535,1.602752,1.296485,1.438342,1.240706,1.374595,3.686193,1.141107,1.361027,1.119765,1.137682,1.452947,1.294702,1.469604,0.963966,1.5049,1.188284,3.35446,1.063295,1.502364,1.475061,1.144183,1.36933,1.303373,1.399739,0.855995,1.400695,1.384467,1.284687,1.731605,1.044219,1.47373,1.386845,1.428565,1.420343,1.450092,1.594293,1.330814,0.733376,1.392799,1.513457,1.136232,1.060654,0.923388,1.140062,1.31058,1.471831,1.558134,1.498227,1.524653,1.247509,1.094212,1.474443,1.652402,1.043264,1.614091,1.154902,1.402944,1.701094,0.999415,1.541207,1.135141,1.48277,1.413376,1.173311,1.345356,1.500386,1.520166,0.828264,1.422589,1.302662,1.375878,1.472845,1.193459,1.307843,1.277927,0.568834,1.340484,1.163376,1.348385,1.494592,1.507615,1.492269,1.37488,2.265013,1.352972,0.908678,1.318431,1.572155,1.097068,1.396133,1.566597,1.588988,1.465789,1.039578,1.440679,1.518713,1.525624,1.71682,1.518885,1.563492,1.328193,1.627306,1.238113,1.335884,1.378961,0.926811,1.295457,1.496077,1.482566,1.416775,1.414534,1.110109,1.174102,1.434897,1.236167,1.50211,1.238025,1.343233,1.446214,1.283604,1.506051,1.294865,1.079944,2.804473,1.276789,1.491145,1.108357,1.50822,1.268057,1.277292,1.305346,1.551649,1.42735,1.434159,1.390352,0.944331,1.098727,1.325469,1.523672,1.560828,1.237817,1.348674,1.230404,1.359842,1.442747,1.311544,1.342781,1.081361,1.50474,1.457578,1.311738,1.380079,1.362,1.42215,1.404854,1.629569,1.616786,0.809509,1.231428,1.412988,1.59879,0.791528,1.143669,1.346903,1.593552,0.984954,1.561255,1.066744,1.434838,0.842069,1.504124,1.593388,1.207101,1.266067,1.488557,1.492854,0.744757,1.484142,1.426548,1.524166,0.975931],"weights":[-0.081457,0.243648,-0.225218,-0.169947,0.225016,0.170034,0.03206,0.054691,-0.018925,0.143766,-0.026322,0.055291,-0.047651,0.032654,0.205422,-0.070852,0.098549,-0.108047,-0.073795,-0.340322,-0.093948,-0.138501,0.007231,0.204754,0.026447,-0.016591,-0.056891,-0.196476,-0.014824,0.429538,0.247424,-0.06594,0.116814,0.157796,0.013285,0.157843,-0.024776,0.044651,-0.00997,0.202294,0.044879,0.137424,-0.123622,-0.067153,-0.138646,0.064572,0.078377,-0.053077,-0.038814,0.07101,-0.049879,-0.16953,-0.104095,0.022557,-0.001668,0.011751,0.028149,-0.102688,0.036642,-0.168124,-0.020827,0.01907,0.097448,-0.187312,-0.126548,0.082511,0.054171,0.089187,-0.095548,-0.133465,-0.039426,0.156973,0.021203,-0.125457,0.114095,0.081166,0.117216,-0.145833,-0.09563,-0.103718,-0.058805,0.014085,-0.148769,-0.097828,-0.027833,-0.067145,-0.009173,0.116523,0.055617,-0.06809,0.004511,0.169872,-0.109988,-0.161624,0.12829,-0.075347,0.136846,0.00019,0.073358,-0.064854,-0.099912,0.435489,-0.107479,-0.075336,0.003926,-0.002231,0.183309,0.314958,0.071703,-0.138815,0.122821,-0.120271,0.070813,0.132543,0.143431,-0.032286,0.055921,0.064292,-0.019539,0.000705,0.027086,0.674251,-0.044296,0.100988,-0.143357,-0.194966,0.08067,-0.180376,0.029048,-0.09401,0.062155,0.061872,0.159053,0.035346,0.038791,0.298283,0.158273,0.037271,0.067471,0.04207,0.082619,-0.0774,0.056161,0.008148,0.094685,-0.071021,-0.050006,0.008676,-0.098756,-0.07124,-0.004173,-0.092651,-0.095455,0.056193,0.046074,0.047616,-0.119663,-0.049501,0.023162,-0.394534,-0.135531,0.102286,-0.251315,-0.10251,0.037699,0.188043,-0.000192,0.065561,-0.233373,-0.027913,0.063757,-0.201134,0.146926,-0.124252,0.314485,0.088858,-0.1119,-0.126078,0.066581,-0.058273,-0.197029,0.124338,-0.214286,-0.051568,0.093482,-0.162371,0.099643,0.095765,-0.108806,0.07045,0.060139,0.080126,-0.102542,-0.147891,0.094386,0.16546,-0.055066,0.025554,0.099738,-0.365377,-0.156143,-0.283326,-0.071636,0.005434,-0.117091,0.06598,-0.099219,0.016595,-0.414636,0.026287,0.114357,-0.152953,0.273808,0.011443,-0.245307,-0.094156,-0.151094,-0.263426,0.074924,0.012132,-0.115646,0.019402,-0.035212,-0.146809,-0.074407,-0.129001,-0.092195,0.071077,-0.387747,-0.021007,0.089693,-0.086846,0.210338,0.077302,-0.132677,0.004301,-0.001034,-0.099452,-0.130119,-0.034428,-0.112476,-0.022546,-0.085149,0.137015,0.312603,-0.015583,-0.102079,0.177807,0.031654,0.037381,-0.030275,0.164051,-0.036915,0.124149,0.095516,0.024521,-0.089554,-0.058733,-0.143653,-0.095884,-0.137739,0.12333,0.235751,-0.17705,-0.039127,-0.054714,0.137955,-0.095921,0.133185,-0.38074,0.106537,-0.087855,-0.026327,0.075363,-0.089438,-0.062773,-0.064974,0.11573,0.097177,-0.001606,0.035532,0.08109,0.049199,-0.227145,-0.065545,-0.060277,0.022414,-0.006485,-0.031386,0.119625,0.102448,-0.188357,-0.063515,0.042441,0.016031,0.29159,0.069047,0.007328,0.031445,-0.176366,-0.08358,-0.037083,0.06106,-0.120694,0.187841,0.002445,-0.275092,0.141698,-0.015408,0.193978,-0.155578,0.155919,-0.035422,-0.114471,0.236957,0.167128,0.127266,-0.240741,0.083647,0.090334,0.052485,-0.252682,-0.128539,-0.398054,0.151615,-0.036786,0.352297,0.005128,0.191412,-0.025162,-0.008338,0.147737,-0.10208,-0.104898,0.313876,0.134905,-0.15745,0.182032,0.091668,0.119143,0.007621,0.004981,0.200833,-0.008415,0.383005,0.146449,-0.036689,-0.184246,0.209787,-0.040478,0.167321,0.09463,-0.24097,-0.18644,0.108458,-0.07613,0.076612,0.119228,-0.038336,-0.01566,-0.080516,-0.087887,0.17265,0.026148,-0.283115,-0.014933,0.219139,0.070329,0.012642,0.040184,0.144651,0.169792,-0.583839,-0.140227,-0.016112,-0.224718,-0.089589,0.114248,-0.110299,-0.28979,0.038565,-0.061427,-0.01873,0.04439,-0.056265,-0.035865,0.048661,0.117036,-0.012862,0.130876,0.117224,-0.171824,0.038375,-0.031332,-0.086314,-0.010104,0.050006,-0.139123,0.258927,-0.149445,-0.013002,-0.054082,-0.001516,-0.163914,0.066577,-0.329434,-0.056079,0.199027,0.218349,-0.143964,0.028616,-0.01767,0.255606,0.019351,-0.237984,-0.238015,-0.014418,-0.079807,0.038086,-0.090441,-0.170147,-0.197393,0.044074,0.156245,0.025269,0.105257,0.126224,0.067614,-0.116274,0.050055,-0.036691,-0.076149,0.254499,-0.024493,0.063384,-0.04706,0.029765,0.168353,0.005363,-0.100667,0.219408,0.094198,0.178848,-0.305266,0.018123,0.174171,-0.055421,-0.115201,-0.203174,0.015376,-0.073919,0.003862,-0.268183,0.041964,-0.040446,-0.302749,0.22499,0.26372,0.110751,0.101927,-0.423837,0.121622,0.060784,0.128127,0.0856,-0.013953,0.079741,0.350311,0.086559,0.00716,-0.274383,0.008423,-0.175252,-0.033616,0.063535,0.058031,0.186615,0.101766,0.097673,0.042975,0.014053,0.042877,-0.063415,-0.008634,0.088639,-0.124177,-0.15965,-0.232323,-0.092798,-0.076249,0.008717,0.040389,0.110181,-0.149078,0.064759,-0.069419,-0.189416,-0.016244,-0.266373,-0.118572,-0.377839,-0.123671,0.09747,-0.085846,0.095556,-0.525107,-0.090147,0.256864,-0.074322,0.016612,0.096516,0.04498,-0.080052,0.024206,0.106356,0.038869,-0.021533,-0.150991,-0.058703,0.233279,-0.182667,0.039223,-0.337572,-0.083162,0.190308,0.11053,-0.094335,0.148717,0.280603,-0.071604,0.013325,-0.093145,0.176479,-0.135395,0.224458,-0.011949,0.000563,0.099575,-0.145454,-0.161416,0.163031,-0.01824,0.10996,-0.075753,0.106943,0.010894,-0.130705,0.053814,0.129077,0.164393,0.010224,-0.075681,0.289722,0.103859,0.118684,0.116485,0.088848,-0.287096,0.237279,0.121324,-0.216554,-0.037481,0.103655,0.176615,-0.05177,-0.004725,0.044608,0.236358,-0.04354,0.092989,0.093324,-0.174783,0.079028,0.127601,0.146458,-0.19123,0.014011,-0.101307,-0.038114,-0.172168,0.071626,0.086095,-0.147336,-0.000212,0.131615,0.120906,-0.048134,0.102588,0.238975,0.313415,0.178945,-0.014734,-0.198558,-0.024199,-0.353183,-0.105753,-0.146657,-0.11517,0.185532,0.037829,-0.080533,-0.192221,-0.110014,-0.02279,0.073505,-0.206699,-0.318547,-0.034564,-0.046703,0.061234,0.189022,-0.021279,0.005977,-0.009736,-0.093911,0.031461,0.081592,0.146584,0.00192,0.032365,0.077123,-0.012098,-0.051313,0.204698,0.070688,-0.11474,0.253649,-0.002112,0.219313,0.042202,0.365921,-0.154353,-0.485518,0.091765,-0.030512,0.469405,0.085303,0.107868,0.032859,-0.070756,-0.081762,0.085716,-0.088679,0.116826,-0.041618,0.019496,0.288136,-0.076379,0.290843,0.059277,-0.221325,-0.060858,-0.128098,0.329421,0.006754,-0.216244,-0.010112,0.014993,-0.121952,-0.124906,0.014636,0.036092,-0.050246,0.035799,0.113942,-0.080357,0.000055,-0.28208,0.343512,-0.100207,0.060561,0.030195,0.106094,0.044598,0.138056,-0.111851,0.316635,0.144566,0.315448,-0.223404,-0.146216,0.144168,0.031196,-0.035985,-0.021097,-0.150297,-0.066331,-0.104001,0.118236,0.101161,-0.112572,-0.196233,0.166055,-0.04059,0.100159,-0.041086,0.082764,0.09781,-0.167007,-0.014734,0.108889,-0.017342,0.107201,-0.133385,0.019889,-0.053159,-0.081804,0.077919,-0.089554,-0.032317,0.184395,-0.108852,0.154564,-0.264223,0.081922,-0.065863,0.095774,-0.283429,0.004652,-0.118008,-0.003448,-0.046645,0.016908,-0.178154,-0.241081,-0.003112,0.103053,-0.03818,-0.016019,0.256059,0.093395,0.085516,-0.25439,-0.097247,-0.224456,-0.23207,0.143807,0.096084,0.016272,0.221791,-0.018835,0.142323,0.170375,-0.138686,0.243539,0.052488,0.077392,-0.06885,0.23759,-0.147734,-0.174491,-0.240178,-0.063987,-0.035578,-0.130591,0.045047,0.507429,0.015757,0.02958,-0.160653,0.036911,-0.224094,-0.151191,0.226922,-0.113722,0.232051,-0.037799,-0.251835],"bias":0.032176,"trainedOn":"11405 images (see eval/fetch-train.mjs sources)"} \ No newline at end of file +{"backbone":"dinov2-small","pooling":"cls+mean","dims":768,"featureMean":[-0.587983,-0.092719,0.394302,-0.189642,0.388641,-0.033666,-0.038264,-0.265355,0.310974,0.415185,-0.143288,0.239909,-0.445038,0.150081,0.845331,0.061388,-0.206875,-0.807566,0.312548,-0.765553,0.56252,-0.324162,-0.229339,-0.209884,-0.224867,0.204828,0.048328,-0.508795,0.79383,-0.11799,-0.299219,-0.613977,0.026339,0.134155,0.487839,0.530239,-0.530911,0.666636,0.232583,0.377994,-0.186337,0.891138,-0.263596,0.16109,-0.354329,-0.620778,-0.802754,-0.084241,0.956127,0.37435,0.21299,-0.116882,0.35083,-0.28728,-0.696914,0.170893,0.496903,0.423996,-0.399705,-0.787948,0.762486,0.549935,0.111997,-0.534622,-0.327134,0.391377,-0.274161,0.109633,0.871672,-0.069691,-0.55163,0.282727,-0.606418,0.022404,0.482814,-0.533688,-0.315956,0.082705,-0.447206,-0.025683,0.112756,-0.411515,0.075419,-0.183209,-0.99214,-0.222173,-0.423954,-0.18454,-0.431389,0.303616,0.341449,-0.276174,-0.319056,-0.393429,0.768625,-0.453341,0.935654,0.066718,0.044106,-0.4745,-0.465957,0.893373,-0.365904,-0.569144,0.040802,0.324404,-0.345081,-0.378371,0.434484,-0.247727,-0.004269,0.076666,0.478611,0.183816,0.02107,-0.362979,-0.123031,0.313791,-0.413011,-0.278079,0.243207,1.266304,-0.110148,0.415723,0.818931,-0.718013,0.341679,-0.452217,-0.247551,0.51039,0.197883,-0.21618,-0.095825,0.201299,0.067469,1.058022,-0.298279,0.184597,-0.54851,0.074582,-0.659026,0.137012,-0.096435,-0.568409,0.061243,-0.307524,0.113185,0.757938,0.132918,0.268549,0.196498,-0.77442,-0.178449,0.179457,-0.49611,-0.876852,0.89069,-0.518969,0.202261,-0.448148,-0.202792,-0.452136,-0.517045,-0.159473,0.252558,-0.273805,-0.087535,-0.232192,-0.435008,0.453142,0.157842,0.185039,0.18848,0.287879,0.436455,-0.424289,-0.146985,-0.255118,0.303675,0.701792,0.437149,0.350629,0.051682,-0.013165,-0.016641,-0.086415,0.520957,0.273907,0.366193,-0.331766,-0.084164,-0.169668,-0.232773,-0.197006,0.027404,-0.048352,0.703083,0.396182,-0.434081,-0.359488,0.227385,-1.020634,0.353591,-0.246075,0.105183,0.068182,0.504806,-0.359261,0.285575,0.095616,0.664494,-0.502636,0.351092,-0.235489,-0.124066,-0.194873,-0.334487,-0.130378,-0.045695,-0.249565,0.268702,-0.370594,-0.841824,-0.434062,-0.332517,-0.025374,-0.047472,0.354772,-0.625477,0.081205,0.063695,-0.649058,-0.466002,0.378199,0.144447,0.082728,0.039262,-0.475292,-0.345424,-0.138671,0.359658,-0.024443,-0.105829,-0.331599,0.475507,-0.20779,-0.038307,-0.429527,-0.328901,-0.06825,-0.160724,0.301166,0.254395,0.231182,-0.532069,0.001867,0.560268,0.319338,0.20195,-0.39359,0.069279,0.245682,-0.134002,-0.2986,0.059331,-0.445129,-0.333131,-0.378561,-0.013234,-0.138122,0.260671,-0.430844,-0.37807,0.432243,0.580424,0.201004,0.081668,0.935913,-0.078767,-0.240336,-0.378279,-0.310155,0.133401,-0.366796,0.411828,0.138138,-0.598312,-0.185938,0.012227,-0.353638,-0.421633,-0.648122,0.628799,0.542598,-0.012437,0.13264,0.457364,0.10003,0.905239,0.28324,-0.036371,-0.076305,-0.61871,0.289851,1.147799,0.079263,-0.045596,0.171377,-0.106715,0.085412,-0.26169,0.27537,0.637182,-0.536792,-0.060725,-0.134586,0.645557,0.057494,-0.5913,-0.089681,0.29659,0.736611,0.060277,-0.079664,-0.264166,0.344317,0.634431,-0.89363,0.475013,-0.954598,0.085713,-0.170527,0.788463,-0.233769,0.19427,-0.558048,0.126191,0.234602,0.381654,0.414405,0.38562,-0.085558,0.074661,-0.154093,0.052504,0.721357,0.147557,-0.78888,0.056354,0.49901,0.010862,0.271791,0.230593,-0.298663,-0.632756,-0.216586,0.002221,0.199643,0.684795,-0.449831,-0.472225,-0.1509,0.452259,-0.240623,-0.388407,0.733192,0.050799,0.260977,0.328442,0.45146,-0.745397,0.620809,-0.438192,0.39415,0.484327,-0.412363,0.316725,0.404319,-0.231097,0.122584,-0.510217,0.183483,0.367728,0.303388,-0.45853,0.269985,0.003459,-0.249836,0.400693,-0.004128,-0.026202,-0.311042,-0.1461,0.763555,0.361738,0.103526,-0.437528,0.244447,0.379695,0.285148,-0.859201,-0.362178,0.193768,-0.293401,-0.125626,-0.589981,0.094642,0.216282,-0.017544,0.584258,-0.041289,-0.327342,0.261626,-0.279016,-0.416211,-0.13385,-0.260638,-0.026482,0.923087,-0.203345,0.127115,0.604684,0.410305,0.267513,0.071988,0.764639,-0.133787,0.377714,0.27751,-0.490127,-1.184241,-0.434259,0.542424,-0.160576,0.150383,0.380716,0.368536,-0.52838,-0.407997,0.128649,-0.087364,0.459679,0.134656,-0.557326,1.100782,0.011832,-0.270707,-0.137308,-0.532059,1.001849,0.048087,-0.334515,2.874155,0.294517,-0.501903,-0.124941,-0.530232,-0.114361,0.562069,0.254174,-0.404896,-0.033712,-0.185425,-2.013644,0.350097,0.116782,-0.394004,-0.114487,-0.227272,-0.273108,-0.406168,-0.2849,-0.688496,0.246693,0.501182,-0.227534,-0.013154,-0.405316,0.58056,-0.127489,0.732364,-0.132917,0.024531,-0.758148,-0.206127,0.825895,0.262741,-0.032532,0.080884,0.360359,-0.182855,-0.15012,1.031795,-0.339127,0.485169,-0.350595,0.655106,0.081617,0.400448,-0.666405,-0.302527,0.026017,-0.544615,-0.189246,0.502186,-0.567466,-0.001927,0.583477,0.228605,-0.114318,0.838017,-0.110551,0.03652,0.216428,0.004402,0.315654,-0.106408,-0.15432,-0.081938,-0.439604,-0.689582,0.563589,0.36382,-0.007791,-0.620244,-0.52205,0.081226,-0.013781,-0.229107,-0.192453,0.07465,0.892625,-0.200126,0.192319,0.369381,-0.016799,0.038764,0.544828,0.021511,-0.890784,0.706359,-0.235727,-0.268535,-0.380212,0.159534,-0.119877,-0.965391,-0.201247,1.159864,-0.402514,0.194807,-0.320022,-0.292198,0.209871,0.289648,0.630593,0.450597,0.633153,0.229339,-0.22289,0.04341,0.338601,-0.066133,1.214031,0.220692,1.010021,0.075194,0.008285,-0.039099,0.292982,0.606392,-0.181186,-0.036813,0.128887,-0.116393,0.116725,0.216978,-0.492287,0.23961,-0.108479,0.22425,0.265429,-0.523265,-0.06604,-0.149386,-0.573741,0.489389,0.251118,0.157198,0.52256,0.692385,-0.305236,0.119704,0.600942,0.501258,0.115964,-0.231875,0.232839,0.167362,0.139544,-0.160362,-0.327954,0.470619,0.621312,-0.339612,-0.510728,-0.45267,-0.02433,0.068699,0.17591,0.315744,-0.021455,-0.724132,0.341431,0.285476,-0.25043,-0.296365,-0.395616,-0.64492,-0.039092,-0.447341,-0.140218,0.008939,-0.125355,0.267919,-0.328095,-0.278379,-0.572667,0.224845,0.048199,0.055832,-0.383565,-0.363225,-0.279283,-0.265221,-0.035583,0.549102,-0.084022,0.028418,-0.202815,0.85552,0.299286,0.20682,0.208395,0.411967,-0.278559,0.715035,0.100997,0.254952,-0.132297,0.103246,-0.436253,-0.177489,-0.568793,0.071066,-0.062729,-0.202314,0.31727,0.759344,0.458324,-0.377254,0.761267,-2.95807,-0.083418,-0.585931,-0.272971,0.568492,-0.327452,0.72879,0.447096,-0.435194,-0.512283,-0.148515,-0.135678,-0.317451,-0.115566,0.208454,0.59576,-0.134837,-0.039589,0.235358,0.182664,-0.023048,0.31801,0.134286,-0.04095,-0.340354,-0.260574,0.79711,0.316752,0.01845,0.077244,-0.585857,0.332858,0.394962,0.346833,0.948788,-0.385549,-0.069139,-0.096897,0.144744,-0.227362,-0.329301,0.001792,0.336698,0.461179,0.251013,1.126936,0.001607,0.217229,-0.077913,-0.500903,0.719325,-0.435754,0.26652,-0.007077,0.485767,-0.292279,0.180829,-0.327401,0.141892,0.288011,0.386972,0.207034,0.523559,0.190497,-0.008324,-0.372458,0.224187,1.152071,-0.128186,-0.122074,0.109735,0.281558,0.026409,0.281797,0.210634,-0.369507,-0.124973,-0.401443,-0.107823,-0.017566,0.686432,-0.333538,-0.084132,0.447486,0.864905,-0.068245,0.321534,-0.406834,-0.111897,0.331501,-0.073415,-0.278508,-0.341317,0.458413,0.775207,0.206287,0.494619,0.23297,0.294425,-0.113909,-0.34484,-0.568427,-0.696782,0.497278,0.479677,0.24137],"featureStd":[2.561834,1.422045,2.390683,2.455845,2.498868,1.400288,2.292605,2.054632,2.516192,2.519318,2.373461,2.55768,2.458847,2.42658,2.64219,2.428844,2.442929,2.565031,1.867846,2.320568,2.423752,2.342043,2.459407,1.771643,2.347715,2.430982,2.526659,2.37341,1.536217,2.611555,2.252322,2.299921,2.201355,2.559766,2.338896,2.417576,2.581753,2.471638,2.618584,2.795142,2.514376,2.600352,2.728068,2.358499,2.336237,2.360277,2.419198,2.429968,2.569709,2.365349,2.411666,2.455399,2.505372,2.225335,2.30211,2.606061,2.500696,2.317909,2.637736,2.401912,2.388994,2.498507,2.454034,2.635564,1.880752,2.502679,2.429706,2.507705,2.237563,2.328314,2.708976,2.217953,2.652778,2.429553,2.775541,2.460893,2.430673,2.468799,2.377319,1.480456,2.253471,2.469583,2.353218,2.460998,2.0923,2.465382,2.39566,2.391249,2.36447,2.305029,2.52972,2.423506,2.425297,2.636192,2.624408,2.134456,2.282276,2.485423,2.384751,2.566366,2.568755,2.502039,2.506125,2.633218,2.159076,2.543867,2.570671,2.440968,2.628476,2.558618,2.345322,2.632064,2.499577,2.21125,2.493998,2.388595,2.370417,2.53829,2.602286,2.537619,2.416484,2.251883,2.402673,2.568595,2.579779,1.871144,2.553236,2.586631,2.458588,2.796571,2.025113,2.442224,2.620515,2.399947,2.652277,2.79475,2.448821,2.448327,2.11483,2.571327,2.125812,2.107695,2.206241,2.368771,2.394829,2.536811,2.232338,2.345903,2.204068,2.285338,2.386088,2.231653,2.39983,2.525618,2.523068,2.54716,2.5257,2.459661,2.531917,2.116363,2.526736,2.484046,2.223297,2.302373,2.499289,2.486923,2.41404,2.27625,2.568128,2.393313,2.454863,2.475635,2.354954,2.598909,2.560354,2.454201,2.331899,2.404516,2.379647,2.408879,2.547073,1.820617,2.506772,2.187904,2.40309,2.472838,2.459793,2.536475,1.787128,2.164307,2.341191,2.566931,2.337805,2.283661,2.514598,2.063208,2.575574,2.40915,2.369615,1.994183,2.487713,1.982495,2.595576,2.807398,2.361652,2.48869,2.427996,2.39189,2.829984,2.139172,2.39805,1.938764,2.046086,2.541034,2.514396,2.489578,2.098175,2.643816,2.342405,2.90522,2.203553,2.479865,2.647996,2.483752,2.433466,2.270442,2.406506,1.930524,2.55746,2.379928,2.429583,2.780921,1.987773,2.508722,2.499204,2.510977,2.402488,2.519829,2.42129,2.385726,1.792068,2.459731,2.470335,2.278901,2.032785,1.857375,2.209386,2.386591,2.708057,2.453566,2.461822,2.590727,2.389142,2.054662,2.433644,2.472662,2.280749,2.667452,2.184248,2.504049,2.499529,1.97515,1.821566,2.024618,2.001916,2.533171,2.256213,2.410976,2.612612,2.550759,1.871886,2.43615,2.403797,2.385618,2.526036,2.011599,2.432103,2.317323,0.887533,2.385603,2.235537,2.428597,2.589343,2.587257,2.48827,2.496602,2.090718,2.453372,1.993319,2.488662,2.748531,1.925586,2.591217,2.662918,2.647429,2.462424,2.211194,2.389593,2.745955,2.548748,2.705386,2.284124,2.724547,2.266043,2.796422,2.266781,2.286051,2.463887,2.226559,2.436171,2.484635,2.486716,2.424893,2.648228,2.182348,2.364377,2.676337,2.142571,1.840977,2.376482,2.399639,2.468771,2.326523,2.037046,2.282034,1.992705,2.791123,2.448546,2.499649,2.260618,2.565664,2.377358,2.408921,2.347345,2.57172,2.483776,2.472178,2.608919,1.823648,2.287316,2.45982,2.386528,2.612407,2.529125,2.397994,2.408022,2.494489,2.606218,2.529131,2.40065,2.277203,2.598378,2.582299,2.316486,2.419257,2.492198,2.365018,2.551012,2.707788,2.203086,1.96184,2.39073,2.558062,2.505955,1.980763,2.277999,2.534128,2.684053,2.020137,2.560923,2.109969,2.568058,1.916963,2.594652,2.630302,2.162426,2.373088,2.462847,2.50928,1.506977,2.462292,2.531816,2.616051,1.871839,1.452161,0.872587,1.507225,1.370202,1.338823,0.543177,1.169996,1.054727,1.361056,1.204125,1.316505,1.547392,1.376016,1.347556,1.376801,1.45055,1.373449,1.578087,1.476559,1.283857,1.226669,1.323554,1.392004,1.536737,1.279309,1.701357,1.458121,1.349809,0.735542,1.426756,1.116089,1.329462,1.429293,1.43319,1.159629,1.293985,1.535102,1.259274,1.440889,1.693411,1.475074,1.534668,1.702153,1.549055,1.082541,1.408302,1.447772,1.3103,1.374902,1.228022,1.328762,1.267616,1.378721,1.176315,1.194149,1.587577,1.473816,1.39478,1.548567,1.659987,1.399,1.380322,1.457104,1.547929,0.864346,1.359031,1.378839,1.388618,3.085878,1.225834,1.649172,1.310522,1.234827,1.575804,1.535303,1.419898,1.339671,1.370799,1.37112,0.879984,1.276074,1.432355,1.434526,1.441988,0.729237,1.358104,1.496217,1.419572,1.27503,1.256214,1.497542,1.352463,1.18656,1.613328,1.523141,1.222087,1.342013,1.523242,1.326078,1.581114,1.430939,1.445721,1.584596,1.634538,1.289762,1.436828,1.587677,1.421988,1.544977,1.593701,1.289273,1.58146,1.385721,1.217832,1.352298,1.355457,1.410991,1.432303,1.493075,1.331738,1.358158,1.014766,1.425015,1.398869,1.395782,0.772259,1.567701,1.405189,1.362699,1.658771,1.165684,1.377166,1.556322,1.310834,1.604604,2.662218,1.358595,1.378,1.649346,1.344514,0.921926,0.917299,1.04533,1.271904,1.301415,1.482285,1.17711,1.300727,1.199857,1.349228,1.14877,1.047073,1.232427,1.338383,1.552197,1.538257,1.457324,1.428545,1.495957,0.989359,1.44854,1.490703,1.377742,1.247757,1.462968,1.605342,1.311527,1.313466,1.549439,1.326345,1.346502,1.200776,1.284496,1.620471,1.514786,1.307519,1.103011,1.355249,1.245972,2.177368,1.541674,1.024911,1.484167,1.157854,1.280689,1.369663,1.415599,1.492287,0.712055,0.921843,1.218416,1.614414,1.302645,1.098697,1.427693,1.023394,1.542137,1.461199,1.197848,0.983533,1.34464,0.882563,1.713257,1.603942,1.297711,1.439877,1.240872,1.374929,3.684683,1.145351,1.362156,1.119614,1.139362,1.452488,1.296581,1.470987,0.964279,1.503848,1.187412,3.355601,1.066396,1.504598,1.477297,1.143878,1.369842,1.305019,1.39983,0.856532,1.403241,1.384157,1.28627,1.730042,1.043177,1.473269,1.387802,1.429021,1.424489,1.451763,1.594934,1.332823,0.734704,1.392914,1.513649,1.137301,1.060532,0.925667,1.141459,1.311028,1.471312,1.557269,1.498929,1.525939,1.248663,1.094747,1.47478,1.65567,1.046566,1.613697,1.157278,1.403279,1.699626,1.000017,1.54127,1.133672,1.483768,1.414942,1.172206,1.347197,1.498342,1.519433,0.827474,1.426639,1.303584,1.378208,1.473475,1.196738,1.308836,1.277364,0.569424,1.341095,1.165688,1.347046,1.496085,1.507624,1.492857,1.375015,2.267656,1.353204,0.911314,1.318694,1.571646,1.099897,1.395109,1.56814,1.592256,1.467917,1.039621,1.445626,1.519522,1.526648,1.716861,1.519342,1.566406,1.327621,1.625508,1.23993,1.338159,1.377863,0.926316,1.294209,1.497871,1.48406,1.415054,1.413722,1.10918,1.176992,1.43445,1.237394,1.504274,1.237922,1.347388,1.448885,1.28429,1.515194,1.295917,1.080335,2.804311,1.277148,1.490494,1.110168,1.506405,1.269494,1.277083,1.305852,1.5509,1.430173,1.436294,1.396137,0.944583,1.098972,1.327319,1.525312,1.563667,1.240663,1.349896,1.230954,1.358437,1.442343,1.312561,1.344786,1.083179,1.504459,1.457613,1.311073,1.378777,1.36257,1.423291,1.406484,1.628916,1.614968,0.809788,1.232126,1.41235,1.600533,0.791828,1.14362,1.347152,1.593369,0.984898,1.563532,1.067413,1.434744,0.842035,1.503035,1.594966,1.208143,1.268239,1.48773,1.493078,0.745314,1.485793,1.428905,1.526861,0.976764],"weights":[-0.097072,0.19306,-0.184362,-0.15031,0.166514,0.107674,0.028361,0.039481,-0.01109,0.144403,-0.058683,-0.015751,-0.008708,-0.003857,0.175639,-0.081848,0.113358,-0.089987,-0.118692,-0.341865,-0.094175,-0.120852,0.003228,0.154982,0.049243,-0.056333,-0.047618,-0.166201,-0.009219,0.371226,0.188744,-0.067514,0.122455,0.141829,0.015207,0.156363,-0.015559,0.017052,-0.006298,0.224417,0.038428,0.158159,-0.091369,-0.069582,-0.126978,0.066375,0.080222,-0.032273,0.003752,0.042753,0.032654,-0.163039,-0.130017,0.072742,0.011452,0.011331,0.00449,-0.136285,0.083201,-0.134615,-0.005328,-0.031074,0.123033,-0.199169,-0.146991,0.081369,0.067946,0.073098,-0.071373,-0.145334,-0.047007,0.101923,-0.000701,-0.10651,0.109453,0.110266,0.130024,-0.119307,-0.088475,-0.097123,-0.075208,-0.003068,-0.146707,-0.056277,-0.060543,-0.099993,-0.058688,0.092086,0.067651,-0.020337,0.023547,0.157588,-0.048594,-0.138423,0.117645,-0.092365,0.10669,0.015901,0.069764,-0.017093,-0.146524,0.35092,-0.081452,-0.059533,0.007325,-0.00217,0.178472,0.271484,0.06654,-0.134717,0.126018,-0.085572,0.116689,0.164805,0.059648,-0.0419,0.019754,0.050642,-0.038826,0.012744,-0.007838,0.593793,-0.05339,0.138741,-0.133125,-0.149724,0.08673,-0.132043,0.024258,-0.075256,0.050882,0.052927,0.112779,0.02458,0.051558,0.262673,0.111203,0.029126,0.042704,0.003633,0.045733,-0.021294,0.048219,0.033469,0.054829,-0.085403,-0.027696,-0.00027,-0.05064,-0.077239,0.009905,-0.048363,-0.086847,0.082732,0.024406,-0.016127,-0.121162,-0.045634,0.035232,-0.353151,-0.100564,0.098956,-0.228044,-0.089278,0.027704,0.172635,-0.021446,0.042274,-0.239785,0.01433,0.046282,-0.199385,0.099648,-0.108084,0.309851,0.079432,-0.125204,-0.118178,0.044108,-0.032447,-0.150449,0.07807,-0.197083,-0.060639,0.090402,-0.097146,0.107024,0.082933,-0.078815,0.03962,0.098968,0.04183,-0.06488,-0.151078,0.094882,0.131082,-0.013658,0.039248,0.091381,-0.350069,-0.131769,-0.21428,-0.048565,-0.021199,-0.081736,0.061555,-0.016995,0.059957,-0.380159,0.019817,0.092848,-0.164034,0.273597,-0.011759,-0.226637,-0.125149,-0.156435,-0.24346,0.057148,0.057918,-0.074098,0.019751,-0.045504,-0.091951,-0.054846,-0.123998,-0.076798,0.071902,-0.329733,-0.060959,0.086774,-0.10116,0.157173,0.048471,-0.082709,0.034435,-0.006048,-0.098355,-0.098518,0.002027,-0.074735,-0.000845,-0.043395,0.143524,0.279959,-0.016264,-0.089616,0.114666,0.011521,0.038134,-0.030831,0.168181,-0.032792,0.099867,0.061432,0.027961,-0.056042,-0.055442,-0.143646,-0.109869,-0.111818,0.088607,0.179581,-0.168761,-0.057515,-0.009393,0.092078,-0.058322,0.114666,-0.276381,0.167617,-0.036802,-0.057023,0.097913,-0.055941,-0.097142,-0.026678,0.096616,0.104968,0.033502,0.012232,0.058505,0.018611,-0.179191,-0.053434,-0.031904,-0.014721,-0.028263,-0.060583,0.091302,0.094526,-0.128316,-0.011097,0.058216,0.010939,0.269197,0.093505,0.009446,-0.002175,-0.130976,-0.051779,-0.033583,0.055865,-0.138626,0.179282,-0.006925,-0.24442,0.105997,0.013539,0.227686,-0.096692,0.118987,-0.061758,-0.096694,0.189383,0.162335,0.108511,-0.218327,0.08413,0.089077,0.052316,-0.22305,-0.151743,-0.331709,0.130491,-0.073793,0.274218,-0.014877,0.1736,-0.031174,-0.045115,0.122128,-0.059259,-0.0899,0.288491,0.089213,-0.15232,0.165864,0.100645,0.052391,-0.013292,0.05702,0.174673,-0.024671,0.351073,0.108099,-0.002336,-0.156862,0.216984,-0.048774,0.157513,0.053763,-0.159928,-0.137767,0.091752,-0.103318,0.06551,0.088805,-0.007215,-0.027185,-0.050042,-0.084199,0.133141,0.016683,-0.213932,0.030944,0.152545,0.091579,0.020378,0.030205,0.134523,0.147177,-0.564414,-0.075942,0.016463,-0.206094,-0.067838,0.091146,-0.148197,-0.236049,0.039831,-0.046734,-0.049563,0.01655,-0.100895,-0.024408,0.069524,0.115105,-0.010565,0.114909,0.10546,-0.160489,0.004946,0.001579,-0.060728,0.015031,0.025442,-0.107012,0.25658,-0.126834,-0.037518,-0.090202,0.021356,-0.160755,0.061417,-0.273267,-0.015481,0.209179,0.215738,-0.119188,-0.017547,-0.004471,0.24982,-0.013806,-0.197659,-0.235679,-0.014675,-0.067084,0.018462,-0.079697,-0.157009,-0.158146,0.031753,0.186146,0.023052,0.087434,0.105034,0.045401,-0.120398,0.060664,-0.031498,-0.021086,0.221019,-0.02374,0.086524,-0.036572,0.028561,0.11351,0.014128,-0.078828,0.178417,0.045343,0.164575,-0.269871,0.04447,0.169554,-0.048118,-0.184102,-0.217066,-0.001673,-0.024993,0.023308,-0.245819,0.062844,0.006175,-0.223732,0.209285,0.239877,0.10002,0.068498,-0.415485,0.057018,0.023519,0.132025,0.052511,0.011979,0.039957,0.305784,0.093267,0.008262,-0.28511,-0.007338,-0.121181,-0.011539,0.037576,0.036466,0.130756,0.054752,0.131235,0.07039,0.028731,0.03192,-0.081282,-0.019275,0.109815,-0.073661,-0.166295,-0.1535,-0.074006,-0.063812,0.014029,-0.001704,0.105647,-0.131198,0.057354,-0.106315,-0.153896,0.017046,-0.209426,-0.118497,-0.292226,-0.120343,0.065298,-0.065827,0.09099,-0.435276,-0.148543,0.223211,-0.063796,0.040885,0.09951,0.015343,-0.045154,-0.003442,0.09483,0.068446,-0.013188,-0.088295,-0.005974,0.212712,-0.201499,0.02185,-0.236389,-0.061421,0.174908,0.09982,-0.085404,0.087171,0.24885,-0.087654,-0.009508,-0.092383,0.1601,-0.096902,0.213336,0.042337,-0.021423,0.092869,-0.160947,-0.1539,0.137255,-0.032333,0.068096,-0.041162,0.077948,-0.011218,-0.103943,0.05301,0.103069,0.207401,0.011857,-0.016642,0.264929,0.067087,0.124164,0.147467,0.112177,-0.211065,0.216177,0.078312,-0.201233,-0.0123,0.11549,0.116822,-0.087393,0.006413,0.027074,0.223749,-0.063869,0.084176,0.085794,-0.170207,0.018677,0.104038,0.115547,-0.114556,0.014703,-0.122632,-0.038288,-0.233934,0.041017,0.01608,-0.139768,-0.000358,0.106723,0.074999,-0.040946,0.087202,0.206089,0.315311,0.11381,-0.015243,-0.2016,-0.003693,-0.239009,-0.077789,-0.170741,-0.117497,0.160625,0.037348,-0.072565,-0.217444,-0.072613,-0.009702,0.025157,-0.184425,-0.30371,-0.093514,-0.054255,0.042583,0.16879,-0.021201,0.029317,-0.001628,-0.082779,0.015542,0.107311,0.17876,0.008504,0.020933,0.052096,-0.016146,-0.085782,0.146657,0.04121,-0.130947,0.189831,-0.012414,0.193885,0.027935,0.328168,-0.137845,-0.416721,0.07582,-0.037208,0.404271,0.063971,0.0759,0.005338,-0.043631,-0.098142,0.093078,-0.08207,0.061737,-0.046332,0.013591,0.245105,-0.070738,0.226921,0.008904,-0.186345,-0.028681,-0.115982,0.326401,-0.016149,-0.150897,-0.002422,0.000781,-0.109065,-0.120256,-0.02595,0.056549,-0.017605,0.013129,0.106252,-0.058571,-0.016772,-0.250358,0.308491,-0.075803,0.07546,0.048826,0.076553,0.037671,0.147329,-0.09446,0.291345,0.097149,0.247015,-0.182914,-0.140671,0.130109,0.02256,0.003127,-0.008633,-0.129907,-0.061685,-0.077,0.098917,0.105187,-0.124531,-0.153557,0.19598,0.025327,0.027423,-0.067025,0.095337,0.126569,-0.120382,-0.007234,0.117419,-0.017619,0.11292,-0.107342,0.01894,-0.069773,-0.079239,0.068668,-0.108133,-0.054368,0.198625,-0.086384,0.102184,-0.21599,0.044951,-0.076023,0.066743,-0.27043,0.020143,-0.107734,-0.02759,-0.018189,0.066254,-0.139527,-0.208589,0.027535,0.090826,-0.042871,0.00913,0.242569,0.096941,0.070112,-0.204243,-0.062927,-0.179665,-0.243826,0.139881,0.092612,0.002083,0.209421,-0.021632,0.137335,0.126312,-0.14058,0.232626,0.03852,0.128836,-0.057003,0.178104,-0.161439,-0.155967,-0.217022,-0.067985,-0.031242,-0.128714,0.032296,0.491517,-0.007907,0.04362,-0.169195,0.055956,-0.18016,-0.167402,0.16958,-0.108115,0.191359,-0.007226,-0.213178],"bias":0.018321,"trainedOn":"11523 images (see eval/fetch-train.mjs sources)"} \ No newline at end of file diff --git a/src/background.js b/src/background.js index ff423e2..78ad41c 100644 --- a/src/background.js +++ b/src/background.js @@ -38,6 +38,9 @@ async function getUpdateState() { async function checkForUpdate() { try { + // No network attempts while offline: scoring is fully local and the + // update banner can wait for the next online check. + if (typeof navigator !== 'undefined' && navigator.onLine === false) return null; const response = await fetch(GITHUB_LATEST_RELEASE_URL, { headers: { Accept: 'application/vnd.github+json' }, }); diff --git a/src/community-forensics.js b/src/community-forensics.js index 6b90a2a..9dc350d 100644 --- a/src/community-forensics.js +++ b/src/community-forensics.js @@ -11,6 +11,7 @@ import { aggregateViewScores, shouldRunExtraCrops, TTA_EARLY_EXIT, + agreedMax, } from './scoring.js'; const REQUIRED_WASM_FILES = ['ort-wasm-simd-threaded.wasm', 'ort-wasm-simd-threaded.mjs']; @@ -182,7 +183,9 @@ export async function predictAdaptiveViews(session, views, options = {}) { } } - return { scores, named, neuralPAi: max, extraRan: true, earlyExit: false }; + // Mid-band agreement: a lone view in [threshold, earlyExit) does not + // carry the verdict on its own (see scoring.agreedMax). + return { scores, named, neuralPAi: agreedMax(max, scores), extraRan: true, earlyExit: false }; } /** diff --git a/src/fuse.js b/src/fuse.js index 6531f5f..80f29dd 100644 --- a/src/fuse.js +++ b/src/fuse.js @@ -8,9 +8,9 @@ export const UNCERTAIN_LOW = 0.45; /** CF scores below this need the saturated sub-floor tier to be rescued. */ export const DINO_CF_FLOOR = 0.02; /** CF below this requires near-saturated DINO before it can be rescued. */ -export const DINO_STRONG_RESCUE_FLOOR = 0.10; +export const DINO_STRONG_RESCUE_FLOOR = 0.20; /** DINO must be this confident to lift a low CF score into the rescue band. */ -export const DINO_STRONG_RESCUE_MIN = 0.90; +export const DINO_STRONG_RESCUE_MIN = 0.96; /** DINO must be this confident to lift CF in the normal uncertain band. */ export const DINO_RESCUE_MIN = 0.70; /** diff --git a/src/scoring.js b/src/scoring.js index 3d26531..6fe97a6 100644 --- a/src/scoring.js +++ b/src/scoring.js @@ -8,8 +8,17 @@ import { DEFAULT_THRESHOLD } from './fuse.js'; /** Extra CLIP crops run only when center p(AI) is in this band. */ export const TTA_ADAPTIVE_LOW = 0.15; -/** Stop remaining crops once any sigmoid is this high. */ -export const TTA_EARLY_EXIT = 0.9; +/** + * A single view at or above this score carries the verdict on its own and + * stops remaining crops. Below it, a mid-band AI verdict needs agreement + * (see CF_AGREEMENT_MIN_VIEWS): live CDN-processed real photos can spike + * one crop into the 0.65 to 0.85 band while every other crop stays low, + * and a lone spiked crop is weak evidence. + */ +export const TTA_EARLY_EXIT = 0.85; + +/** Views at or above the threshold required for a mid-band CF verdict. */ +export const CF_AGREEMENT_MIN_VIEWS = 2; export const TTA_MODES = ['adaptive', 'always', 'center']; @@ -48,13 +57,14 @@ export function aggregateViewScores(scores) { /** * Extra 440-corner / 512-center crops only help when the official center * crop is uncertain. A confident real (for example 0.04) will not become - * 0.65 by taking the max of six similar scores. + * 0.65 by taking the max of six similar scores. The band now extends + * through the mid-band verdict range so a center crop in [0.65, 0.85) + * gathers corroborating views before the agreement rule judges it. * @param {number} centerScore - * @param {number} [threshold] */ -export function shouldRunExtraCrops(centerScore, threshold = DEFAULT_THRESHOLD) { +export function shouldRunExtraCrops(centerScore) { const p = clamp01(centerScore); - return p >= TTA_ADAPTIVE_LOW && p < threshold; + return p >= TTA_ADAPTIVE_LOW && p < TTA_EARLY_EXIT; } /** @@ -85,7 +95,7 @@ export function foldTtaScores(scores, options = {}) { } const runExtra = - mode === 'always' || (mode === 'adaptive' && shouldRunExtraCrops(center, threshold)); + mode === 'always' || (mode === 'adaptive' && shouldRunExtraCrops(center)); if (!runExtra) { return { neuralPAi: center, extraRan: false, earlyExit: false, used }; @@ -101,7 +111,31 @@ export function foldTtaScores(scores, options = {}) { } } - return { neuralPAi: max, extraRan: true, earlyExit: false, used }; + return { neuralPAi: agreedMax(max, used, threshold), extraRan: true, earlyExit: false, used }; +} + +/** + * Mid-band agreement rule. A max in [threshold, TTA_EARLY_EXIT) stands only + * when at least CF_AGREEMENT_MIN_VIEWS inspected views reach the threshold; + * otherwise CF falls back to the second-highest view. Views at or above + * TTA_EARLY_EXIT never reach here (they exit above with full authority). + * Single-view images keep their score: there is nothing to disagree. + * Shared by foldTtaScores and the live predictAdaptiveViews path. + * @param {number} max + * @param {number[]} used + * @param {number} threshold + */ +export function agreedMax(max, used, threshold = DEFAULT_THRESHOLD) { + if (max < threshold || used.length < 2) return max; + const above = used.filter((v) => v >= threshold).length; + if (above >= CF_AGREEMENT_MIN_VIEWS) return max; + let second = 0; + for (const v of used) { + if (v < max && v > second) second = v; + } + // Duplicate maxima count as agreement and were caught above; here the + // max is unique, so second is the true runner-up. + return second; } function clamp01(v) { diff --git a/tests/dino.test.mjs b/tests/dino.test.mjs index 03ab7c9..a6f69b7 100644 --- a/tests/dino.test.mjs +++ b/tests/dino.test.mjs @@ -126,7 +126,7 @@ describe('fuseNeuralScores', () => { it('only rescues low CF scores with near-saturated DINO', () => { assert.equal(fuseNeuralScores(0.05, 0.99), 0.99); - assert.equal(fuseNeuralScores(0.05, 0.89), 0.05); + assert.equal(fuseNeuralScores(0.05, 0.95), 0.05); assert.equal(fuseNeuralScores(0.25, 0.75), 0.75); assert.equal(fuseNeuralScores(0.25, 0.65), 0.25); // Sub-floor tier: faintly awake CF plus saturated DINO rescues. diff --git a/tests/eval-policy.test.mjs b/tests/eval-policy.test.mjs index 0b65009..2c80a58 100644 --- a/tests/eval-policy.test.mjs +++ b/tests/eval-policy.test.mjs @@ -22,8 +22,16 @@ describe('offline product policy mirror', () => { }); it('does not let DINO replace a production CF score already at 0.65', () => { + // Two agreeing views keep CF authoritative at or above the threshold. + const rec = { views: { center: 0.65, tl: 0.66 } }; + assert.equal(productFloorScore(rec, 0.99, 0.4), 0.66); + }); + + it('a lone mid-band CF view falls back to the runner-up', () => { const rec = { views: { center: 0.65, tl: 0.2 } }; - assert.equal(productFloorScore(rec, 0.99, 0.4), 0.65); + // The agreement rule drops the lone 0.65 to the 0.2 runner-up, which + // sits below this helper's 0.4 rescue floor, so CF stands at 0.2. + assert.equal(productFloorScore(rec, 0.99, 0.4), 0.2); }); it('mirrors the flat-graphic suppression when sweep records include the gate', () => { diff --git a/tests/fuse.test.mjs b/tests/fuse.test.mjs index 8fc8e2f..adc67f1 100644 --- a/tests/fuse.test.mjs +++ b/tests/fuse.test.mjs @@ -88,10 +88,10 @@ describe('fuseNeuralScores policy', () => { }); it('low CF is only rescued by near-saturated DINO', () => { - assert.equal(DINO_STRONG_RESCUE_FLOOR, 0.10); - assert.equal(DINO_STRONG_RESCUE_MIN, 0.90); - assert.equal(fuseNeuralScores(0.05, 0.91), 0.91); - assert.equal(fuseNeuralScores(0.05, 0.89), 0.05); + assert.equal(DINO_STRONG_RESCUE_FLOOR, 0.20); + assert.equal(DINO_STRONG_RESCUE_MIN, 0.96); + assert.equal(fuseNeuralScores(0.05, 0.97), 0.97); + assert.equal(fuseNeuralScores(0.05, 0.95), 0.05); }); it('includes the DINO floor boundary in the lift band', () => { diff --git a/tests/scoring.test.mjs b/tests/scoring.test.mjs index bc7c2af..940482b 100644 --- a/tests/scoring.test.mjs +++ b/tests/scoring.test.mjs @@ -46,24 +46,43 @@ describe('adaptive TTA fusion', () => { it('runs extras in the uncertain band including crying-robot ~0.20', () => { assert.equal(shouldRunExtraCrops(0.2), true); - const folded = foldTtaScores([0.2, 0.41, 0.72], { mode: 'adaptive' }); - assert.equal(folded.neuralPAi, 0.72); - assert.equal(folded.extraRan, true); + // A lone 0.72 among low views falls back to the runner-up; a second + // agreeing view restores the max. + const lone = foldTtaScores([0.2, 0.41, 0.72], { mode: 'adaptive' }); + assert.equal(lone.neuralPAi, 0.41); + assert.equal(lone.extraRan, true); + const agreed = foldTtaScores([0.2, 0.66, 0.72], { mode: 'adaptive' }); + assert.equal(agreed.neuralPAi, 0.72); }); - it('includes the low band edge 0.15 and excludes 0.65', () => { + it('includes the low band edge 0.15 through the mid band, excludes 0.85', () => { assert.equal(shouldRunExtraCrops(TTA_ADAPTIVE_LOW), true); - assert.equal(shouldRunExtraCrops(DEFAULT_THRESHOLD), false); + assert.equal(shouldRunExtraCrops(DEFAULT_THRESHOLD), true); + assert.equal(shouldRunExtraCrops(0.84), true); + assert.equal(shouldRunExtraCrops(TTA_EARLY_EXIT), false); assert.equal(shouldRunExtraCrops(0.149), false); }); - it('always-max can lift a 0.04 center; adaptive must not', () => { + it('a lone mid-band view does not carry an AI verdict', () => { + // One view at 0.70 with every other view low falls back to the + // runner-up: live CDN-processed real photos spike single crops. const always = foldTtaScores([0.04, 0.7], { mode: 'always' }); const adaptive = foldTtaScores([0.04, 0.7], { mode: 'adaptive' }); - assert.equal(always.neuralPAi, 0.7); + assert.equal(always.neuralPAi, 0.04); assert.equal(adaptive.neuralPAi, 0.04); }); + it('two agreeing mid-band views keep the max', () => { + const folded = foldTtaScores([0.3, 0.7, 0.68], { mode: 'always' }); + assert.equal(folded.neuralPAi, 0.7); + }); + + it('a single view at or above 0.85 keeps full authority', () => { + const folded = foldTtaScores([0.3, 0.86], { mode: 'always' }); + assert.equal(folded.neuralPAi, 0.86); + assert.equal(folded.earlyExit, true); + }); + it('center mode ignores extras even in the adaptive band', () => { const folded = foldTtaScores([0.4, 0.9], { mode: 'center' }); assert.equal(folded.neuralPAi, 0.4); From 47830746365da584133afab44f549bfc42304225 Mon Sep 17 00:00:00 2001 From: felirami Date: Sun, 16 Aug 2026 15:48:46 -0400 Subject: [PATCH 2/2] Version 1.3.0 docs and guards: live-CDN guard joins the eval gate benchmark-results.json now carries the verified live-guarded numbers (bench 87.9 BA / 76.0 TPR / 99.8 TNR, stress 3/240, live guard 4/132 at 3.0 percent) plus a liveGuard section, README and AGENTS.md are rewritten to the view-agreement policy, and the published findings doc gains a same-day fix section with the isolation results. Version references move to 1.3.0 across manifest, package, and store copy. --- AGENTS.md | 6 +++--- README.md | 9 +++++---- STORE.md | 4 ++-- docs/live-smoke-2026-08-16.md | 10 ++++++++++ eval/benchmark-results.json | 22 ++++++++++++++-------- manifest.json | 2 +- package.json | 2 +- 7 files changed, 36 insertions(+), 19 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index 2e47cf1..0735080 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -32,7 +32,7 @@ Win POIDH Arbitrum bounty 323 by shipping a privacy-first local MV3 Chrome exten - **Manifest V3.** `onnxruntime-web` in an offscreen document. WebGPU with WASM fallback (probe the adapter; do not latch a WebGPU error). - **Auto-scan ordinary webpages.** Confidence on every badge: AI / OK / uncertain. - **Hybrid is allowed:** neural + C2PA + EXIF/XMP + PNG/JPEG comments + weak URL hints. A URL hint alone must not cross 0.65. -- **Current fusion: CF-primary, three tiers.** CommunityForensics TTA takes the maximum raw sigmoid from inspected views. CF is authoritative at >= 0.65. Sub-floor tier: below CF 0.02, rescue only when CF >= 0.0005 (not flatlined) AND DINO >= 0.995; a CF hard zero is never overridden. Strong tier: CF in [0.02, 0.10) needs DINO >= 0.90. Normal tier: CF in [0.10, 0.65) needs DINO >= 0.70. The flat-graphic gate blocks every rescue tier on catalog art and UI-like images. Bands were re-derived for the hard-negative probe under a hard stress-set constraint (240 full-resolution stock/catalog/product reals; no DINO-attributable stress FP allowed), choosing a conservative near-optimum over the grid maximum. **Do not restore raw max(CF, DINO), remove the graphic gate, or loosen these bands without rerunning the bench plus the stress set and live-site checks.** +- **Current fusion: CF-primary, three tiers plus view agreement.** CommunityForensics TTA takes the maximum raw sigmoid from inspected views, with one rule: a lone view in [0.65, 0.85) does not carry an AI verdict and falls back to the runner-up (live CDN-processed real photos spike single crops); views >= 0.85 keep single-view authority and early-exit. The adaptive extras band is [0.15, 0.85). CF is authoritative at >= 0.65 after agreement. Sub-floor tier: below CF 0.02, rescue only when CF >= 0.0005 AND DINO >= 0.995. Strong tier: CF in [0.02, 0.20) needs DINO >= 0.96. Normal tier: CF in [0.20, 0.65) needs DINO >= 0.70. The flat-graphic gate blocks every rescue tier. Bands derived under three simultaneous guards: public bench, 240-image stress set, and a held-out live-CDN guard (camera-EXIF-verified Unsplash variants). **Do not restore plain max(CF, DINO), remove the graphic gate or the agreement rule, or loosen these bands without rerunning the bench, the stress set, AND the live guard.** - **Overlay:** badge store must be an iterable `Map`, not a `WeakMap`. Reposition on scroll / resize / `visualViewport` / mutations. Never wrap images. - **Load-unpacked users do not auto-update.** GitHub Releases zip + popup banner is the update path. Do not assume CWS. - **Cross-device:** macOS (owner), Windows, Linux. WASM must work when WebGPU has no adapter. @@ -65,7 +65,7 @@ Win POIDH Arbitrum bounty 323 by shipping a privacy-first local MV3 Chrome exten | File | Role | |---|---| -| `src/fuse.js` | `DEFAULT_THRESHOLD` 0.65, `DINO_CF_FLOOR` 0.02, `DINO_STRONG_RESCUE_FLOOR` 0.10, `DINO_STRONG_RESCUE_MIN` 0.90, `DINO_RESCUE_MIN` 0.70, `DINO_SUBFLOOR_CF_MIN` 0.0005, `DINO_SUBFLOOR_MIN` 0.995, CF-primary `fuseNeuralScores` | +| `src/fuse.js` | `DEFAULT_THRESHOLD` 0.65, `DINO_CF_FLOOR` 0.02, `DINO_STRONG_RESCUE_FLOOR` 0.20, `DINO_STRONG_RESCUE_MIN` 0.96, `DINO_RESCUE_MIN` 0.70, `DINO_SUBFLOOR_CF_MIN` 0.0005, `DINO_SUBFLOOR_MIN` 0.995, CF-primary `fuseNeuralScores` | | `src/graphic-gate.js` | Shared flat-graphic policy for browser and Node evaluation | | `src/pixel-resize.js` | Pillow-exact bicubic resize shared by the extension and the Node harness for the CF path (byte-exact vs Pillow 12.3.0 goldens) | | `src/offscreen.js` | ORT WebGPU/WASM, DINO 224 then CF TTA | @@ -76,7 +76,7 @@ Win POIDH Arbitrum bounty 323 by shipping a privacy-first local MV3 Chrome exten | `src/c2pa-reader.js` | C2PA reader | - Issue 23 (fixed in PR 24 / v1.0.7): overlay WeakMap drift + DINO max false positives. -- The public 893-image fixture with the hard-negative probe and re-derived bands: 90.5% BA, 81.2% TPR, 99.8% TNR (harness-verified, not simulated). Stress set (240 full-resolution stock/catalog/product reals): 4 FPs, all CF-driven at >= 0.65 where CF is authoritative by design; zero DINO-attributable stress FPs (shipped v1.1.0 measured 7 on identical bytes). The DINO probe is trained on features from the shared Pillow-exact path plus 1,915 hard-negative reals (stock, catalog, product, interiors; rows disjoint from the stress set). Full-resolution professional stock photos can spike CF itself; check exactly that during live smoke. Live-smoke checks still remain required before any claim. +- The public 893-image fixture with the live-guarded policy: 87.9% BA, 76.0% TPR, 99.8% TNR (harness-verified, adaptive mode, implemented view-agreement path). Stress set: 3 FPs in 240 images. Live-CDN guard (132 held-out camera-EXIF Unsplash variants, AVIF plus JPEG): 4 FPs, 3.0%, vs 9.2% for v1.2.0 on identical bytes. Probe trained with 118 verified-real live CDN images on top of the prior hard negatives. See docs/live-smoke-2026-08-16.md for the failure that drove this and the full isolation work. Live-smoke rerun still required before any claim. --- diff --git a/README.md b/README.md index 1fb38f8..880965b 100644 --- a/README.md +++ b/README.md @@ -57,8 +57,8 @@ Two independent neural heads cover complementary failure modes, plus determinist 1. **CommunityForensics head:** ViT-Small official FP32 ONNX (CLIP 384). `p(AI) = sigmoid(logit)`. Near-zero false positives on real photos, but under-scores several modern generators (Flux, GPT-4o-image, photoreal DALL-E 3). 2. **DINOv2 probe head:** frozen DINOv2-small backbone (224 center view) with a transparent logistic head over CLS+mean-pooled features (`models/probe/dino-probe.json`: plain standardize/weights/bias, no lookup tables). Trained on ~11.4k images from public datasets across Flux, SD3.5, SDXL-era, Midjourney, DALL-E 3, GPT-4o-image and diverse real photos, including ~1.9k hard-negative reals (stock photography, product catalogs, interiors, high-saturation nature) that teach the head not to fire on professional real photos, with web-realistic JPEG/resize augmentation. Features are extracted through the same Pillow-exact resize the extension ships, so training matches serving exactly. This head carries the modern generators. -3. **Neural fusion:** CF-primary with three rescue tiers. When CommunityForensics is confident AI (`>= 0.65`), its score wins. Between `0.02` and `0.10`, DINO can only rescue if it is highly confident (`p(AI) >= 0.90`); between `0.10` and `0.65`, DINO can lift at `p(AI) >= 0.70`. Below the `0.02` floor a rescue additionally requires CF to be at least faintly awake (`>= 0.0005`) and DINO to be saturated (`>= 0.995`): CF emits hard zeros on real photos it is certain about, while AI images in its blind spots still elicit a faint response, so a flatlined CF is itself evidence of a real photo and is never overridden. On flat graphics and catalog art (low palette / high flat-run pixels), a graphic gate suppresses every DINO rescue tier when CF stays below `0.65`, so icons and UI shots do not mass-label AI 100%. CF-confident AI illustrations (`>= 0.65`) are unchanged. Displayed confidence is this raw fused probability; the AI verdict stays at raw `>= 0.65` with no remapping and no logit bias. The rescue bands were re-derived for the current probe under a hard constraint measured on a separate 240-image full-resolution stock, catalog, and product photo stress set (no DINO-attributable false positives allowed), and a deliberately conservative near-optimum was chosen over the grid maximum. -4. **Adaptive TTA:** the DINO pass and the official 440 center crop always run. Extra CommunityForensics views (440 corners + 512 center) run only when a head is at least mildly suspicious (CF center or DINO in `[0.15, 0.65)`), so confident reals cost two passes total. `Math.max` of sigmoids, early exit at `>= 0.9`. Under heavy queue load (more than 12 pending) CF drops to center-only; the DINO pass still runs. +3. **Neural fusion:** CF-primary with three rescue tiers. When CommunityForensics is confident AI (`>= 0.65` after view agreement), its score wins. Between `0.02` and `0.20`, DINO can only rescue if it is highly confident (`p(AI) >= 0.96`); between `0.20` and `0.65`, DINO can lift at `p(AI) >= 0.70`. Below the `0.02` floor a rescue additionally requires CF to be at least faintly awake (`>= 0.0005`) and DINO to be saturated (`>= 0.995`): CF emits hard zeros on real photos it is certain about, while AI images in its blind spots still elicit a faint response, so a flatlined CF is itself evidence of a real photo and is never overridden. On flat graphics and catalog art (low palette / high flat-run pixels), a graphic gate suppresses every DINO rescue tier when CF stays below `0.65`. Displayed confidence is this raw fused probability; the AI verdict stays at raw `>= 0.65` with no remapping and no logit bias. The rescue bands were re-derived under three guards at once: the public bench, a 240-image full-resolution stock and catalog stress set, and a held-out live-CDN guard of camera-EXIF-verified editorial photos. +4. **Adaptive TTA with view agreement:** the DINO pass and the official 440 center crop always run. Extra CommunityForensics views (440 corners + 512 center) run when a head is at least mildly suspicious (CF center in `[0.15, 0.85)` or DINO `>= 0.15`), so confident reals cost two passes total. Aggregation is the max of sigmoids with one honesty rule: a lone view in `[0.65, 0.85)` does not carry an AI verdict by itself and falls back to the runner-up view, because live CDN-processed real photos can spike a single crop. Any view at `>= 0.85` keeps single-view authority and early-exits. Under heavy queue load (more than 12 pending) CF drops to center-only; the DINO pass still runs. 5. **Metadata:** C2PA, EXIF/XMP/IPTC, generator text in PNG/JPEG, weak URL hints. Strong metadata forces 0.95-0.99; a URL hint alone cannot cross 65%. ## Tests @@ -80,9 +80,10 @@ Eval harness: `npm run eval -- ./path/to/labeled-folder` after `npm run fetch-mo | Legacy raw max ensemble (not shipped) | 96.1% | 96.1% | 96.1% | | Prior policy, prior Node resize (historical) | 85.0% | 70.4% | 99.6% | | v1.1.0 policy and probe, Pillow-exact preprocess | 87.7% | 75.8% | 99.6% | -| Production: hard-negative probe, re-derived bands | 90.5% | 81.2% | 99.8% | +| v1.2.0: hard-negative probe, re-derived bands | 90.5% | 81.2% | 99.6% | +| Production: live-guarded policy with view agreement | 87.9% | 76.0% | 99.8% | -The legacy raw max result is included to make the tradeoff visible, not as a product claim. It caused unacceptable false positives on live stock and catalog images, so production keeps the CF guard. The historical 85.0% row was measured through a Node resize the extension never ran; later rows are computed by the same Pillow-exact resize the extension ships, byte for byte. On a 240-image full-resolution stock, catalog, and product photo stress set the production policy shows 4 false positives, all driven by CommunityForensics alone scoring `>= 0.65` (where it is authoritative by design), and zero attributable to a DINO rescue; the v1.1.0 configuration measured 7 on identical bytes. Public fixtures are directional only and are not a claim about Kenny's private held-out set. +The legacy raw max result is included to make the tradeoff visible, not as a product claim. It caused unacceptable false positives on live stock and catalog images, so production keeps the CF guard. The historical 85.0% row was measured through a Node resize the extension never ran; later rows are computed by the same Pillow-exact resize the extension ships, byte for byte. On a 240-image full-resolution stock, catalog, and product photo stress set the production policy shows 3 false positives, zero attributable to a DINO rescue. On a held-out live-CDN guard of 132 camera-EXIF-verified Unsplash editorial variants it shows 4 false positives (3.0 percent), where the v1.2.0 configuration measured 9.2 percent on identical bytes. Public fixtures are directional only and are not a claim about Kenny's private held-out set. **Live-web evaluation (published openly):** our 2026-08-16 live-site smoke test of v1.2.0 FAILED on CDN-processed professional photography (details, isolation experiments, and the fix plan in [docs/live-smoke-2026-08-16.md](docs/live-smoke-2026-08-16.md)). Benchmark numbers above remain reproducible as stated; the live gap is being closed with ground-truthed live corpora and a retrained probe, and no bounty claim will be made until a re-run smoke passes. Live counterexamples are welcome as issues. diff --git a/STORE.md b/STORE.md index 6d29824..a986d46 100644 --- a/STORE.md +++ b/STORE.md @@ -2,7 +2,7 @@ **Author:** Luis Felipe Abarca **Project license:** MIT (bundled assets have their own notices) -**Version:** 1.2.0 +**Version:** 1.3.0 Unpacked install from GitHub (`npm run fetch-model && npm run build`, then Load unpacked from `dist/`) remains the POIDH proof path. This file is listing copy for a future Chrome Web Store upload. The extension is **not** claimed to be on the Chrome Web Store. @@ -103,7 +103,7 @@ Do not screenshot private or copyrighted photos you do not have rights to. Use t 1. `npm ci && npm run package` 2. Open the Chrome Web Store Developer Dashboard (one-time developer registration is a Google process; this repo does not submit for you). -3. New item, upload `release/clueside-1.2.0.zip` +3. New item, upload `release/clueside-1.3.0.zip` 4. Paste the short and detailed descriptions above 5. Set privacy policy URL to the hosted `docs/privacy.html` 6. Attach screenshots and the 128px icon diff --git a/docs/live-smoke-2026-08-16.md b/docs/live-smoke-2026-08-16.md index 86ae3d2..2a20888 100644 --- a/docs/live-smoke-2026-08-16.md +++ b/docs/live-smoke-2026-08-16.md @@ -73,6 +73,16 @@ So the trigger is the live processing chain plus the current content distributio 5. Fix the offline update ping. 6. Re-run the full smoke. The bounty claim stays on hold until it passes. +## Update, 2026-08-16 (same day): the fix, measured + +The work-in-progress list above is done. Findings and results: + +- **Unsplash exposes no AI label anywhere.** We audited the full API surface, page HTML, frontend bundles, tags, and image bytes for 268 current editorial photos: no labeling mechanism exists as served. Ground truth via platform labels is impossible; we fell back to camera EXIF present in the API metadata (184 of 268 photos) as a probable-real prior, and imgix strips all embedded provenance metadata from served bytes, which also means metadata-based detection layers are inert on CDN images. +- **True FP rate of v1.2.0 on probable-real live bytes: 9.2 percent** (17 of 184 camera-EXIF photos, identical in AVIF and JPEG form). The no-EXIF segment flagged at a similar rate, so the smoke's headline 24.3 percent was inflated by page mix and feed rotation, not primarily by hidden AI content. +- **The fix** (three coordinated changes, shipped together): a view-agreement rule (a lone CommunityForensics view in [0.65, 0.85) cannot carry an AI verdict and falls back to the runner-up view; views at or above 0.85 keep single-view authority), the probe retrained with 118 verified-real live CDN images, and the strong rescue tier tightened to [0.02, 0.20) with DINO at or above 0.96. +- **Verified with the implemented pipeline:** public bench 87.9 percent BA, 76.0 TPR, 99.8 TNR; stress set 3 of 240; held-out live-CDN guard 4 of 132 (3.0 percent, versus 9.2 percent for v1.2.0 on identical bytes). The live guard is now a permanent part of the evaluation gate next to the bench and stress sets, and the trade (2.6 bench points for a threefold live FP reduction) is deliberate: false positives on real photos are the failure that matters. +- A full live smoke rerun of the fixed build is the next gate. No claim before it passes. + ## How to help - Reproduce any number here: `npm ci && npm run fetch-model`, then `npm run eval -- ` on any labeled folder of images. The harness matches the extension byte for byte. diff --git a/eval/benchmark-results.json b/eval/benchmark-results.json index 39f2967..4db61ef 100644 --- a/eval/benchmark-results.json +++ b/eval/benchmark-results.json @@ -1,26 +1,32 @@ { "_note": "Single source of truth for published benchmark numbers. The site imports this file, scripts/check-site.mjs validates the built site against it, and tests/benchmark-docs.test.mjs fails the suite if README.md, AGENTS.md, or the manifest version drift from it. Numbers may only come from a full harness run (bench plus stress). On a release that does not touch scoring code (src fusion, preprocessing, models, probe), bump extensionVersion here to re-affirm the numbers still describe the shipped build; any release that touches scoring code requires a fresh run first.", - "measuredAt": "2026-08-15", - "extensionVersion": "1.2.0", + "measuredAt": "2026-08-16", + "extensionVersion": "1.3.0", "decisionRule": "raw fused p(AI) >= 0.65, no remapping", "bench": { "n": 893, "ai": 409, "real": 484, - "ba": 90.5, - "tpr": 81.2, - "tnr": 99.8, + "ba": "87.9", + "tpr": "76.0", + "tnr": "99.8", "falsePositives": 1 }, "stress": { "n": 240, - "falsePositives": 4, + "falsePositives": 3, "dinoAttributableFalsePositives": 0, "description": "Full-resolution stock, catalog, product, interior, and high-saturation real photos; remaining FPs are CommunityForensics alone at >= 0.65 where it is authoritative" }, "legacyRawMax": { - "ba": 96.1, + "ba": "96.1", "shipped": false, "reason": "Unacceptable live false positives on stock and catalog images" + }, + "liveGuard": { + "n": 132, + "falsePositives": 4, + "ratePercent": 3.0, + "description": "Held-out camera-EXIF Unsplash editorial photos fetched as live CDN bytes (AVIF and JPEG grid variants, w=700 q=60); v1.2.0 measured 9.2 percent on this distribution" } -} +} \ No newline at end of file diff --git a/manifest.json b/manifest.json index e1e2852..39cd877 100644 --- a/manifest.json +++ b/manifest.json @@ -1,7 +1,7 @@ { "manifest_version": 3, "name": "Clueside: Local AI Image Detector", - "version": "1.2.0", + "version": "1.3.0", "description": "Clueside surfaces likely AI-generated images locally. Images never leave your device.", "author": "Luis Felipe Abarca", "icons": { diff --git a/package.json b/package.json index c297e7b..150f096 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "clueside", - "version": "1.2.0", + "version": "1.3.0", "description": "Clueside: private, browser-local AI-image signals", "type": "module", "author": "Luis Felipe Abarca",