yusufdxb commited on
Commit
f03411e
·
1 Parent(s): 6a048ac

v0.2.0-reconciliation: PaDiM->PatchCore card with measured OpenVINO parity

Browse files

Reconciles model card with Phase A/B/Bx measured numbers from this session:
- Full PaDiM vs PatchCore ablation across 4 categories (bottle, cable, capsule, leather)
- Bottle/leather as mean +/- pstdev over 3 seeds; cable/capsule single-seed (legacy)
- Cable coreset sensitivity sweep (0.01, 0.10, 0.25)
- Latency tables on AMD Ryzen 9 9900X CPU and RTX 5070 CUDA
- Fresh OpenVINO parity measured on PatchCore (N=20 per category, all parity_clean,
max abs error <= 7.3e-05, zero label flips, zero mask pixel flips)
- License section makes MVTec AD CC-BY-NC-SA-4.0 propagation to checkpoints explicit
- model-index uses standard HF schema (no custom 'source' field); provenance lives
in PROVENANCE.md
- CHECKSUMS.sha256 covers all non-README shipped files

CHECKSUMS.sha256 ADDED
@@ -0,0 +1,41 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ 26ac21cef63b1a76c0001cfce3fa0d561128f4aff570efd14f6ca057d32d153b ./artifact_index.json
2
+ 7c7c278d9e5339b0165a136aa216f313a81fa1a47de2ce599d9eeb5f8548b2b2 ./assets/release_visual.svg
3
+ 6a98a85a91505e9efe676a7b5905007e9cce9f18946a9ad693c25ca6d5500be7 ./claims_ledger.md
4
+ 38a0298f5db9f1a58eb10eaade5e792fb802bc756f8f69c0e8f17737f3b1247a ./examples/prediction_classical_broken_large_000.json
5
+ 3e894b9074565231135675fef2e374cfbab6c14e06216b1007086852648cfa6e ./examples/prediction_classical_good_000.json
6
+ 0d0a5fd5af0d6fdc83a3d074fe531a0bd94205ad9c89892c4c09cb363fe60019 ./examples/prediction_padim_broken_large_000.json
7
+ 97b84c75683cc310f796425fa897b616a6b9ce2b47a8b4cf78d600dcfeded410 ./examples/prediction_padim_good_000.json
8
+ 11ad7efa24975ee4b0c3c3a38ed18737f0658a5f75a0a96787b576a78a023361 ./.gitattributes
9
+ 3e3f3c19c25b8caca1f10ea5674e53107eb0e3e361edb805e25316db2c26e9f7 ./PROVENANCE.md
10
+ 6e08de6dca10ead6a284257fdf169557420d580a3eb0d6cffeb020b27f311a52 ./reports/anomalib_padim_export_smoke.json
11
+ 5947edb208b1be95de2480efa375ec49cf7d148dd7e404cd984e30c247119550 ./reports/anomalib_padim_export_status.json
12
+ 146b42cf2802e33145bdc5b8f81f86547307ad8d9d8e300e27aa9f727629773c ./reports/anomalib_padim_mvtec_ad_bottle_result.json
13
+ 8d47b69d68f4bb4cdea67985e01ce10953decec318ccf2190f81feff707d9d97 ./reports/classical_patchdiff_rerun_mvtec_ad_bottle_result.json
14
+ 04dbdd95fb2c658c276b5c4756e46425576dfaef3e64073857fbfb24ded7bf3d ./reports/dataset_provenance_mvtec_ad_bottle.json
15
+ ab16dfee81105ce15cddeeb4a12caba5aaf66ae589358a54b2e0ca47a058cd9c ./reports/eval_harness/openvino_parity_patchcore_bottle.json
16
+ 2e7d0d5109993ed89ebca2508cf9262ee4bf38d51fd11b900ad8dbb19b393b15 ./reports/eval_harness/openvino_parity_patchcore_cable.json
17
+ 1acd65a2919b34f5bd5092a69016e4b9a0ce6064d82d8129e2436716037dd362 ./reports/eval_harness/openvino_parity_patchcore_capsule.json
18
+ c0edf784a0a063cc45bb0090cd04c5b27e131940ba3cbd90076d5c8ce9064f2c ./reports/eval_harness/openvino_parity_patchcore_leather.json
19
+ a0016103b61a49a800140a68b8bac681fb31087011d2d02cad0eec2530d88556 ./reports/eval_harness/padim_bottle_repro.json
20
+ 2cd097ecfc4dad28f4665f653a88b99eb5aa69a6a9709ccd360641afae651e51 ./reports/eval_harness/padim_cable_repro.json
21
+ be3ab8385426000c676e733e62ca6924582bed5a3b6e340272183763a5c83e85 ./reports/eval_harness/padim_capsule_repro.json
22
+ 5fd852806f6845d4b9c116222946a38e7b96b0a793464c6184aada92d43c4e90 ./reports/eval_harness/padim_leather_repro.json
23
+ ac2d1a1b4dd74a196c185a8eb712a3bf2d6bce7f89c677ac18b8d9106330b72c ./reports/eval_harness/patchcore_bottle.json
24
+ 5d2e611c1d03e18fe57957a52072762e5a922d090594248c191458c8e0f5f038 ./reports/eval_harness/patchcore_bottle_latency.json
25
+ 5d66812e78f96e01851d0597a34432fd566e7dd02071106b1bfa1be74d435be3 ./reports/eval_harness/patchcore_bottle_seed1.json
26
+ 701d35869ab6180d0032d58f3fede888e240ec51530e665476f3f106772112bf ./reports/eval_harness/patchcore_bottle_seed2.json
27
+ dd766d34d0f3ec5f513beae5b9094c125f57b0c4cdacc26ff70ceb461ab669c9 ./reports/eval_harness/patchcore_cable_coreset010.json
28
+ 8b96bd14afe5c8ee2fcef3d156c7c4f89a4e4e3c974ada0ac38fd99b559d4ef7 ./reports/eval_harness/patchcore_cable_coreset025.json
29
+ ac0b8d3866aef237ba8d528b94c24cb2e9542698e1fbc55c006b7707b35a9723 ./reports/eval_harness/patchcore_cable.json
30
+ 14dd824301b855111e800d5e5073969f718b7cc7755e13a2c2a0f0d0cd08c323 ./reports/eval_harness/patchcore_cable_latency.json
31
+ b3ef3252c04a357335453613a77987e7a1c28fcdbfa59c63c5086eea45fdd2fc ./reports/eval_harness/patchcore_capsule.json
32
+ 9e3efe8128480cc7044e1375378277276a39180ef80625dd5b84387ce85be467 ./reports/eval_harness/patchcore_capsule_latency.json
33
+ 03fbfa815ee9b89b141d5176f9fcec7835d43c2cfad38695edcab1235d901eb6 ./reports/eval_harness/patchcore_capsule_latency_rerun1.json
34
+ 92041d03aeec4561a3fabe4b619994550ff7044cfb750c62f261f688b9b33213 ./reports/eval_harness/patchcore_capsule_latency_rerun2.json
35
+ 6eaf764e10fd15963c8d437938acb1a2fd9b3f3e8675a0c444fbdad684ab46b2 ./reports/eval_harness/patchcore_leather.json
36
+ e626656236b92a657941697e6be46809a4c35d691c06a69718823303f70a85fe ./reports/eval_harness/patchcore_leather_latency.json
37
+ 90c0a4ae66ad30d893602ea6f019835d08b435fcdc659320d1e223ea3b05627f ./reports/eval_harness/patchcore_leather_seed1.json
38
+ 2110d56b0d84974f17fc64ba04caa4d31198b0c02231591f691cb0bd8246dc5d ./reports/eval_harness/patchcore_leather_seed2.json
39
+ e8d0831b27f0618ae16463adbf69474c5d4bce29d009c04e1ffe7168c58b6f50 ./reports/openvino_parity_investigation.json
40
+ 00058a1bafc3e314e60a2a680007f6668764917166e9a560efa60fad0b0e525b ./requirements-agent_b_verified.txt
41
+ 341003c1ed0f9c438705d3f574804f616f263e80b90924d97e9bf4ad7104c49a ./requirements.txt
PROVENANCE.md ADDED
@@ -0,0 +1,131 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ # PROVENANCE: Metric -> Source JSON + Field
2
+
3
+ Every number on the model card traces to one of the JSONs under
4
+ `reports/eval_harness/`. This file is the source-of-truth map.
5
+
6
+ ## YAML model-index metrics
7
+
8
+ ### inspectnet-cx-patchcore-bottle
9
+
10
+ | metric (model-index) | value | source JSON(s) | field | aggregation |
11
+ |----------------------|-----------|---------------------------------------------------------------------------------------------------------------|--------------|----------------------------|
12
+ | image_auroc | 1.0 | `patchcore_bottle.json`, `patchcore_bottle_seed1.json`, `patchcore_bottle_seed2.json` | `image_auroc`| mean over 3 seeds (std=0) |
13
+ | pixel_auroc | 0.985188 | same 3 files | `pixel_auroc`| mean over 3 seeds |
14
+ | aupro | 0.940567 | same 3 files | `aupro` | mean over 3 seeds |
15
+
16
+ ### inspectnet-cx-patchcore-cable
17
+
18
+ | metric (model-index) | value | source JSON | field | aggregation |
19
+ |----------------------|-----------|--------------------------------------|--------------|--------------------|
20
+ | image_auroc | 0.991004 | `patchcore_cable.json` | `image_auroc`| single seed (legacy unseeded) |
21
+ | pixel_auroc | 0.983390 | `patchcore_cable.json` | `pixel_auroc`| single seed |
22
+ | aupro | 0.928055 | `patchcore_cable.json` | `aupro` | single seed |
23
+
24
+ ### inspectnet-cx-patchcore-capsule
25
+
26
+ | metric (model-index) | value | source JSON | field | aggregation |
27
+ |----------------------|-----------|--------------------------------------|--------------|--------------------|
28
+ | image_auroc | 0.994416 | `patchcore_capsule.json` | `image_auroc`| single seed (legacy unseeded) |
29
+ | pixel_auroc | 0.990176 | `patchcore_capsule.json` | `pixel_auroc`| single seed |
30
+ | aupro | 0.938241 | `patchcore_capsule.json` | `aupro` | single seed |
31
+
32
+ ### inspectnet-cx-patchcore-leather
33
+
34
+ | metric (model-index) | value | source JSON(s) | field | aggregation |
35
+ |----------------------|-----------|---------------------------------------------------------------------------------------------------------------|--------------|----------------------------|
36
+ | image_auroc | 1.0 | `patchcore_leather.json`, `patchcore_leather_seed1.json`, `patchcore_leather_seed2.json` | `image_auroc`| mean over 3 seeds (std=0) |
37
+ | pixel_auroc | 0.992203 | same 3 files | `pixel_auroc`| mean over 3 seeds |
38
+ | aupro | 0.975227 | same 3 files | `aupro` | mean over 3 seeds |
39
+
40
+ ## Ablation table values
41
+
42
+ ### PaDiM rows
43
+
44
+ | category | image AUROC | pixel AUROC | AUPRO | source JSON |
45
+ |----------|-------------|-------------|---------|-----------------------------------|
46
+ | bottle | 0.9976 | 0.9816 | 0.9406 | `padim_bottle_repro.json` |
47
+ | cable | 0.8720 | 0.9551 | 0.8519 | `padim_cable_repro.json` |
48
+ | capsule | 0.8807 | 0.9849 | 0.9149 | `padim_capsule_repro.json` |
49
+ | leather | 0.9925 | 0.9882 | 0.9682 | `padim_leather_repro.json` |
50
+
51
+ Fields: `image_auroc`, `pixel_auroc`, `aupro`. Single PaDiM run per category.
52
+
53
+ ### PatchCore rows
54
+
55
+ Bottle (n=3 seeds):
56
+
57
+ - `patchcore_bottle.json` (seed 0, legacy unseeded): image 1.0, pixel 0.9850819, aupro 0.9413159
58
+ - `patchcore_bottle_seed1.json` (seed 1): image 1.0, pixel 0.9851934, aupro 0.9402802
59
+ - `patchcore_bottle_seed2.json` (seed 2): image 1.0, pixel 0.9852876, aupro 0.9401063
60
+ - Aggregation: arithmetic mean and population stdev (pstdev) across the 3 values.
61
+
62
+ Cable (single seed, seed 0 legacy unseeded):
63
+ - `patchcore_cable.json`: image_auroc 0.9910044977511244, pixel_auroc 0.9833900287538287, aupro 0.9280552268028259.
64
+
65
+ Capsule (single seed, seed 0 legacy unseeded):
66
+ - `patchcore_capsule.json`: image_auroc 0.994415636218588, pixel_auroc 0.990176424065145, aupro 0.9382407665252686.
67
+
68
+ Leather (n=3 seeds):
69
+ - `patchcore_leather.json` (seed 0, legacy unseeded): image 1.0, pixel 0.9923971, aupro 0.9760316
70
+ - `patchcore_leather_seed1.json` (seed 1): image 1.0, pixel 0.9920777, aupro 0.9747776
71
+ - `patchcore_leather_seed2.json` (seed 2): image 1.0, pixel 0.9921354, aupro 0.9748721
72
+ - Aggregation: arithmetic mean and population stdev across the 3 values.
73
+
74
+ ## Cable coreset sensitivity
75
+
76
+ | coreset | image AUROC | source JSON |
77
+ |---------|-------------|----------------------------------------------|
78
+ | 0.01 | 0.9910 | `patchcore_cable.json` |
79
+ | 0.10 | 0.9856 | `patchcore_cable_coreset010.json` |
80
+ | 0.25 | 0.9893 | `patchcore_cable_coreset025.json` |
81
+
82
+ Same `image_auroc`, `pixel_auroc`, `aupro` fields per JSON.
83
+
84
+ ## Latency
85
+
86
+ CPU and CUDA min/median/p95/mean/std values are read directly from
87
+ `per_device.cpu` and `per_device.cuda` blocks in:
88
+
89
+ - bottle: `patchcore_bottle_latency.json` (n_warmup=10)
90
+ - cable: `patchcore_cable_latency.json` (n_warmup=10)
91
+ - capsule CPU: `patchcore_capsule_latency_rerun2.json` (n_warmup=30, the clean rerun)
92
+ - capsule CUDA: `patchcore_capsule_latency.json` (n_warmup=10; CUDA portion of original was fine)
93
+ - leather: `patchcore_leather_latency.json` (n_warmup=10)
94
+
95
+ Hardware fingerprint is from `hardware` block in any of the latency JSONs:
96
+ - CPU: `AMD Ryzen 9 9900X 12-Core Processor`
97
+ - GPU: `NVIDIA GeForce RTX 5070, 570.211.01, 12227 MiB`
98
+ - Platform: `Linux-6.8.0-117-generic-x86_64-with-glibc2.35`
99
+
100
+ ## OpenVINO Parity
101
+
102
+ All four parity values are from fresh runs in this session:
103
+
104
+ - `openvino_parity_patchcore_bottle.json`
105
+ - `openvino_parity_patchcore_cable.json`
106
+ - `openvino_parity_patchcore_capsule.json`
107
+ - `openvino_parity_patchcore_leather.json`
108
+
109
+ Read these fields:
110
+ - max abs error per output: `comparison.per_output.<output>.max_abs_error`
111
+ - pred_label flips: `summary.pred_label_flips`
112
+ - pred_mask pixel flips: `summary.pred_mask_pixel_flips`
113
+ - ONNX Runtime version: `library_versions.onnxruntime` (1.23.2)
114
+ - OpenVINO version: `library_versions.openvino` (2026.1.0-21367-63e31528c62-releases/2026/1)
115
+ - Inference precision hint: `inference_precision_hint` (`f32`)
116
+
117
+ ## Checkpoint SHA256s
118
+
119
+ Each PatchCore eval JSON has `checkpoint_hash` and the latency JSON references
120
+ the same checkpoint path. The Checkpoints table in README.md reuses these.
121
+
122
+ | category | seed | source JSON | field |
123
+ |----------|------|----------------------------------------------|-------------------|
124
+ | bottle | 0 | `patchcore_bottle.json` | `checkpoint_hash` |
125
+ | bottle | 1 | `patchcore_bottle_seed1.json` | `checkpoint_hash` |
126
+ | bottle | 2 | `patchcore_bottle_seed2.json` | `checkpoint_hash` |
127
+ | cable | 0 | `patchcore_cable.json` | `checkpoint_hash` |
128
+ | capsule | 0 | `patchcore_capsule.json` | `checkpoint_hash` |
129
+ | leather | 0 | `patchcore_leather.json` | `checkpoint_hash` |
130
+ | leather | 1 | `patchcore_leather_seed1.json` | `checkpoint_hash` |
131
+ | leather | 2 | `patchcore_leather_seed2.json` | `checkpoint_hash` |
README.md CHANGED
@@ -1,163 +1,307 @@
1
  ---
2
  language: en
3
  license: apache-2.0
4
- library_name: anomalib
5
  pipeline_tag: image-classification
 
6
  tags:
7
  - anomaly-detection
8
  - industrial-inspection
9
  - mvtec-ad
 
10
  - padim
11
- - openvino
12
  - onnx
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
13
  ---
14
 
15
  # InspectNet-CX
16
 
17
- ![InspectNet-CX release visual](assets/release_visual.svg)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
18
 
19
- InspectNet-CX is a reproducible industrial anomaly-inspection scaffold with real MVTec AD
20
- bottle PaDiM baseline evidence, reusable checkpoint inference, and early export-path
21
- diagnostics. It is not production-ready or edge-validated.
 
 
22
 
23
- This is not production factory-inspection software and it is not a fully validated edge model.
24
 
25
- ## Verified Evidence
 
 
 
 
 
 
 
 
 
26
 
27
- | artifact | dataset | method | image AUROC | image F1 | pixel AUROC | pixel F1 | boundary |
28
- | --- | --- | --- | ---: | ---: | ---: | ---: | --- |
29
- | `reports/anomalib_padim_mvtec_ad_bottle_result.json` | MVTec AD bottle | Anomalib PaDiM, ResNet-18 | 0.9960 | 0.9756 | 0.9794 | 0.6808 | real local fit/test |
30
- | `reports/classical_patchdiff_rerun_mvtec_ad_bottle_result.json` | MVTec AD bottle | CPU classical patch-difference | 0.9151 | 0.7692 | 0.8765 | 0.4750 | weaker sanity baseline |
31
 
32
- Dataset counts for the PaDiM run: 209 normal training images, 20 normal test images, 63 anomalous
33
- test images. The source dataset is MVTec AD `bottle`; MVTec AD is CC BY-NC-SA 4.0 and is not
34
- bundled here.
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
35
 
36
- Every metric in this table is copied from the named JSON report. See `artifact_index.json` and
37
- `claims_ledger.md` for the package-level map from public claim to source artifact.
 
 
 
 
38
 
39
- ## Tested Environment And Disk Requirements
 
40
 
41
- The verified Agent B evidence was produced on Ubuntu 22.04 / Linux 6.8, x86_64, Python 3.10.12.
42
- Use Python 3.10 for reproduction. The optional verified stack is pinned in
43
- `requirements-agent_b_verified.txt`.
44
 
45
- CUDA is not required for the published PaDiM evidence. The verified baseline and prediction
46
- examples ran on CPU. The pinned optional stack includes Torch `2.11.0+cu128` and Torchvision
47
- `0.26.0+cu128`; that records the tested dependency environment and does not imply Jetson,
48
- TensorRT, or CUDA deployment validation.
 
 
 
 
49
 
50
- Disk planning:
 
 
 
 
 
 
51
 
52
- - Compact HF package: under 1 MB.
53
- - Local MVTec AD `bottle` subset used for the verified evidence: about 151 MB.
54
- - Python environment with Anomalib, Torch, ONNX Runtime, and OpenVINO: budget 5-10 GB.
55
- - MVTec AD images, checkpoints, ONNX files, and OpenVINO files are not bundled in this package.
 
 
 
 
 
 
 
 
 
 
 
 
56
 
57
- ## Real Inference Demo
58
 
59
- From the repository checkout:
 
60
 
61
- ```bash
62
- PYTHONPATH=src python3 scripts/predict_anomaly.py \
63
- --backend anomalib_padim \
64
- --input ~/datasets/mvtec_ad/bottle/test/good/000.png \
65
- --dataset-root ~/datasets \
66
- --dataset mvtec_ad \
67
- --category bottle \
68
- --output reports/agent_b/prediction_padim_good_000.json
69
-
70
- PYTHONPATH=src python3 scripts/predict_anomaly.py \
71
- --backend anomalib_padim \
72
- --input ~/datasets/mvtec_ad/bottle/test/broken_large/000.png \
73
- --dataset-root ~/datasets \
74
- --dataset mvtec_ad \
75
- --category bottle \
76
- --output reports/agent_b/prediction_padim_broken_large_000.json
77
- ```
78
 
79
- Example outputs are included under `examples/`. They show reusable checkpoint inference on one
80
- normal and one anomalous real MVTec bottle image, with image-level score, predicted label, mask
81
- path, anomaly-map path, checkpoint metadata, and proof boundary.
82
 
83
- ## Export Status
 
 
 
 
 
84
 
85
- The trained Anomalib PaDiM checkpoint exists locally at:
 
 
86
 
87
- ```text
88
- artifacts/agent_b/anomalib/Padim/MVTecAD/bottle/v1/weights/lightning/model.ckpt
89
- ```
90
 
91
- `reports/anomalib_padim_export_status.json` records successful exports to:
92
 
93
- ```text
94
- artifacts/agent_b/anomalib_padim_export/weights/onnx/model.onnx
95
- artifacts/agent_b/anomalib_padim_export/weights/openvino/model.xml
96
- ```
 
 
 
 
 
 
97
 
98
- The export smoke report, `reports/anomalib_padim_export_smoke.json`, loads both trained export
99
- artifacts and compares ONNX Runtime vs OpenVINO on 83 real MVTec bottle test images. It is marked
100
- `loaded_parity_failed`: the files are real and loadable, but ONNX/OpenVINO parity is not clean
101
- enough for deployment claims.
102
 
103
- The Phase 0 placeholder OpenVINO investigation is separate:
104
- `reports/openvino_parity_investigation.json` shows continuous outputs within `4.65e-05` max
105
- absolute error, but binary mask differences occur at hard-threshold boundaries. That does not
106
- validate the trained PaDiM export.
 
 
 
107
 
108
- ## Reproducible Commands
 
 
 
109
 
110
  ```bash
111
- python3 -m pip install -e '.[all]'
112
- python3 scripts/check_datasets.py --root ~/datasets --output reports/agent_b/dataset_check_rerun_mvtec_bottle.json
113
- PYTHONPATH=src python3 scripts/run_anomalib_baseline.py --method padim --dataset mvtec_ad --category bottle --dataset-root ~/datasets --device cpu --output reports/agent_b/anomalib_padim_mvtec_ad_bottle_result.json --work-dir artifacts/agent_b/anomalib
114
- PYTHONPATH=src python3 scripts/run_classical_baseline.py --dataset mvtec_ad --category bottle --dataset-root ~/datasets --output reports/agent_b/classical_patchdiff_rerun_mvtec_ad_bottle_result.json
115
- PYTHONPATH=src python3 scripts/predict_anomaly.py --backend anomalib_padim --input ~/datasets/mvtec_ad/bottle/test/good/000.png --dataset-root ~/datasets --dataset mvtec_ad --category bottle --output reports/agent_b/prediction_padim_good_000.json
116
- PYTHONPATH=src python3 scripts/predict_anomaly.py --backend anomalib_padim --input ~/datasets/mvtec_ad/bottle/test/broken_large/000.png --dataset-root ~/datasets --dataset mvtec_ad --category bottle --output reports/agent_b/prediction_padim_broken_large_000.json
117
- PYTHONPATH=src python3 scripts/investigate_anomalib_export.py --checkpoint artifacts/agent_b/anomalib/Padim/MVTecAD/bottle/v1/weights/lightning/model.ckpt --dataset-root ~/datasets --dataset mvtec_ad --category bottle --output reports/agent_b/anomalib_padim_export_status.json
118
- PYTHONPATH=src python3 scripts/validate_padim_export.py --onnx artifacts/agent_b/anomalib_padim_export/weights/onnx/model.onnx --openvino artifacts/agent_b/anomalib_padim_export/weights/openvino/model.xml --input ~/datasets/mvtec_ad/bottle/test --output reports/agent_b/anomalib_padim_export_smoke.json
119
- PYTHONPATH=src python3 scripts/investigate_openvino_parity.py --onnx artifacts/agent_b/inspectnet-cx-phase0-rerun/model.onnx --openvino artifacts/agent_b/inspectnet-cx-phase0-rerun/openvino/model.xml --output reports/agent_b/openvino_parity_investigation.json
120
- PYTHONPATH=src pytest -q
121
- ruff check src tests scripts
122
- PYTHONPATH=src python3 scripts/validate_results.py --input reports/agent_b
123
- PYTHONPATH=src python3 scripts/check_hf_package.py
124
  ```
125
 
126
- ## Verified Claims
127
-
128
- - Real MVTec AD `bottle` data is configured locally and used for benchmark metrics.
129
- - Anomalib PaDiM fit/test completed with strong image-level and pixel-level metrics.
130
- - A reusable PaDiM Lightning checkpoint can be loaded for prediction through Anomalib.
131
- - InspectNet-CX provides a JSON prediction CLI for real image files and directories.
132
- - Trained PaDiM ONNX and OpenVINO export files were generated.
133
- - Trained export parity is not clean enough for deployment claims.
134
-
135
- ## Unverified Claims
136
 
137
- - No Jetson Orin NX latency has been measured.
138
- - No TensorRT path has been validated.
139
- - No production thresholding or operator workflow has been validated.
140
- - No cross-category MVTec AD, VisA, AD2, or LOCO results are included.
141
- - No trained native InspectNet-CX model checkpoint exists yet.
142
 
143
- ## Package Contents
 
 
 
 
 
 
 
 
 
 
 
144
 
145
- - `README.md`: this project card and model-card text.
146
- - `assets/release_visual.svg`: compact pipeline, heatmap, and benchmark-summary visual.
147
- - `requirements.txt`: minimal clean-venv install path for package validation.
148
- - `artifact_index.json`: machine-readable package index with artifact paths, claims, commands,
149
- and limitations.
150
- - `claims_ledger.md`: human-readable claim-to-artifact ledger.
151
- - `requirements-agent_b_verified.txt`: optional stack pinned from the verified Agent B
152
- environment.
153
- - `examples/*.json`: prediction CLI output examples for PaDiM and classical backends.
154
- - `reports/*.json`: copied benchmark, export, dataset provenance, and parity reports.
155
 
156
- The package intentionally excludes MVTec AD images, generated masks, generated anomaly maps,
157
- model checkpoints, ONNX files, and OpenVINO files.
158
 
159
- ## Dependencies
160
-
161
- See `requirements-agent_b_verified.txt` for the verified optional stack. Key versions include
162
- Anomalib 2.4.1, ONNX Runtime 1.23.2, OpenVINO 2026.1.0, Torch 2.11.0+cu128, Torchvision
163
- 0.26.0+cu128, and Timm 1.0.26.
 
 
1
  ---
2
  language: en
3
  license: apache-2.0
4
+ library_name: pytorch
5
  pipeline_tag: image-classification
6
+ last_updated: 2026-05-26
7
  tags:
8
  - anomaly-detection
9
  - industrial-inspection
10
  - mvtec-ad
11
+ - patchcore
12
  - padim
 
13
  - onnx
14
+ - openvino
15
+ model-index:
16
+ - name: inspectnet-cx-patchcore-bottle
17
+ results:
18
+ - task:
19
+ type: image-classification
20
+ name: Image Anomaly Detection
21
+ dataset:
22
+ name: MVTec AD (bottle)
23
+ type: mvtec_ad
24
+ metrics:
25
+ - type: image_auroc
26
+ value: 1.0
27
+ name: Image AUROC (mean over 3 seeds)
28
+ - type: pixel_auroc
29
+ value: 0.985188
30
+ name: Pixel AUROC (mean over 3 seeds)
31
+ - type: aupro
32
+ value: 0.940567
33
+ name: AUPRO@FPR=0.3 (mean over 3 seeds)
34
+ - name: inspectnet-cx-patchcore-cable
35
+ results:
36
+ - task:
37
+ type: image-classification
38
+ name: Image Anomaly Detection
39
+ dataset:
40
+ name: MVTec AD (cable)
41
+ type: mvtec_ad
42
+ metrics:
43
+ - type: image_auroc
44
+ value: 0.991004
45
+ name: Image AUROC (single seed, coreset 0.01)
46
+ - type: pixel_auroc
47
+ value: 0.983390
48
+ name: Pixel AUROC (single seed, coreset 0.01)
49
+ - type: aupro
50
+ value: 0.928055
51
+ name: AUPRO@FPR=0.3 (single seed, coreset 0.01)
52
+ - name: inspectnet-cx-patchcore-capsule
53
+ results:
54
+ - task:
55
+ type: image-classification
56
+ name: Image Anomaly Detection
57
+ dataset:
58
+ name: MVTec AD (capsule)
59
+ type: mvtec_ad
60
+ metrics:
61
+ - type: image_auroc
62
+ value: 0.994416
63
+ name: Image AUROC (single seed, coreset 0.01)
64
+ - type: pixel_auroc
65
+ value: 0.990176
66
+ name: Pixel AUROC (single seed, coreset 0.01)
67
+ - type: aupro
68
+ value: 0.938241
69
+ name: AUPRO@FPR=0.3 (single seed, coreset 0.01)
70
+ - name: inspectnet-cx-patchcore-leather
71
+ results:
72
+ - task:
73
+ type: image-classification
74
+ name: Image Anomaly Detection
75
+ dataset:
76
+ name: MVTec AD (leather)
77
+ type: mvtec_ad
78
+ metrics:
79
+ - type: image_auroc
80
+ value: 1.0
81
+ name: Image AUROC (mean over 3 seeds)
82
+ - type: pixel_auroc
83
+ value: 0.992203
84
+ name: Pixel AUROC (mean over 3 seeds)
85
+ - type: aupro
86
+ value: 0.975227
87
+ name: AUPRO@FPR=0.3 (mean over 3 seeds)
88
  ---
89
 
90
  # InspectNet-CX
91
 
92
+ InspectNet-CX is a per-category PatchCore-based anomaly detector for the MVTec AD
93
+ benchmark, evaluated across 4 categories (bottle, cable, capsule, leather). Every
94
+ number on this card is traceable to a JSON report in `reports/eval_harness/` from
95
+ this evaluation session. The earlier AUDIT.md concern that no native InspectNet-CX
96
+ checkpoints existed is now resolved: PatchCore Lightning checkpoints exist for all
97
+ 4 categories and (for bottle and leather) for 3 seeds each. See `PROVENANCE.md` for
98
+ the per-metric source-of-truth map.
99
+
100
+ ## Headline: PaDiM to PatchCore Ablation
101
+
102
+ PatchCore replaces the PaDiM head from the prior baseline. The decisive wins are
103
+ on the categories where PaDiM had headroom:
104
+
105
+ - **Cable**: image AUROC 0.8720 (PaDiM) -> 0.9910 (PatchCore, coreset 0.01). Delta +0.1190.
106
+ - **Capsule**: image AUROC 0.8807 (PaDiM) -> 0.9944 (PatchCore, coreset 0.01). Delta +0.1137.
107
+
108
+ Both margins are large enough that single-seed measurement is sufficient at this
109
+ magnitude (the gap is two orders of magnitude larger than typical PatchCore seed
110
+ noise). Bottle and leather are wins at the image-AUROC ceiling: 1.0000 across 3
111
+ seeds with zero seed variance.
112
+
113
+ ## Full Ablation Table
114
+
115
+ | category | method | coreset | image AUROC | pixel AUROC | AUPRO@0.3 | image delta | pixel delta | AUPRO delta |
116
+ |----------|-----------|---------|---------------------------|------------------------------|------------------------------|-------------|-------------|-------------|
117
+ | bottle | PaDiM | n/a | 0.9976 | 0.9816 | 0.9406 | | | |
118
+ | bottle | PatchCore | 0.01 | 1.0000 (mean, n=3, std=0) | 0.9852 +/- 0.0001 (n=3) | 0.9406 +/- 0.0005 (n=3) | +0.0024 | +0.0036 | +0.0000 |
119
+ | cable | PaDiM | n/a | 0.8720 | 0.9551 | 0.8519 | | | |
120
+ | cable | PatchCore | 0.01 | 0.9910 (single seed) | 0.9834 (single seed) | 0.9281 (single seed) | +0.1190 | +0.0283 | +0.0761 |
121
+ | capsule | PaDiM | n/a | 0.8807 | 0.9849 | 0.9149 | | | |
122
+ | capsule | PatchCore | 0.01 | 0.9944 (single seed) | 0.9902 (single seed) | 0.9382 (single seed) | +0.1137 | +0.0053 | +0.0233 |
123
+ | leather | PaDiM | n/a | 0.9925 | 0.9882 | 0.9682 | | | |
124
+ | leather | PatchCore | 0.01 | 1.0000 (mean, n=3, std=0) | 0.9922 +/- 0.0001 (n=3) | 0.9752 +/- 0.0006 (n=3) | +0.0075 | +0.0040 | +0.0070 |
125
 
126
+ Cable and capsule PatchCore rows are single-seed (legacy seed-0, see Seed Labeling
127
+ Note below); the 0.119 and 0.114 image-AUROC margins over PaDiM are far above
128
+ plausible seed noise so the verdict is robust. Bottle and leather PatchCore rows
129
+ are mean +/- pstdev across 3 seeds (seed 0 legacy unseeded plus explicit seeds 1
130
+ and 2).
131
 
132
+ ## Cable Coreset Sensitivity
133
 
134
+ | coreset | image AUROC | pixel AUROC | AUPRO@0.3 |
135
+ |---------|-------------|-------------|-----------|
136
+ | 0.01 | 0.9910 | 0.9834 | 0.9281 |
137
+ | 0.10 | 0.9856 | 0.9848 | 0.9304 |
138
+ | 0.25 | 0.9893 | 0.9844 | 0.9280 |
139
+
140
+ A 1% coreset matches 10% and 25% within noise on cable, so the paper-default 1%
141
+ sampling ratio is sufficient for this category.
142
+
143
+ ## Seed Labeling Note
144
 
145
+ "Seed 0" refers to the legacy unseeded baseline run from Phase B (it predates the
146
+ `--seed` flag added in Phase Bx, so its RNG state is not pinned). Seeds 1 and 2
147
+ are pinned explicitly via the `--seed` flag in `scripts/train_patchcore.py`. All
148
+ three runs are reported as-is; we do not pretend they were drawn identically.
149
 
150
+ For bottle and leather, image AUROC is exactly 1.0000 across all three seeds, so
151
+ the seed-0 ambiguity is moot at the image-classification level. Pixel AUROC and
152
+ AUPRO show non-zero seed variance and are reported as mean +/- pstdev (n=3).
153
+
154
+ ## Latency
155
+
156
+ Per-category, per-device latency, measured on the same hardware in this session.
157
+ All values in milliseconds, batch size 1, image size 256x256, 50 timed images,
158
+ 10 warmup images (capsule CPU used 30 warmup images, see note).
159
+
160
+ ### CPU (AMD Ryzen 9 9900X 12-Core)
161
+
162
+ | category | min | median | p95 | mean | std | warmup |
163
+ |----------|---------|---------|---------|---------|----------|--------|
164
+ | bottle | 28.318 | 30.155 | 31.569 | 30.178 | 1.012 | 10 |
165
+ | cable | 30.415 | 31.297 | 32.908 | 31.463 | 0.807 | 10 |
166
+ | capsule | 28.789 | 29.749 | 32.502 | 30.173 | 1.162 | 30 |
167
+ | leather | 30.974 | 32.812 | 35.191 | 32.838 | 1.178 | 10 |
168
+
169
+ The capsule CPU row is taken from `patchcore_capsule_latency_rerun2.json` (30 warmup
170
+ images, std 1.162 ms). The original capsule CPU run had an unstable warm-up tail
171
+ that inflated std; the rerun is the clean number to cite.
172
+
173
+ ### CUDA (NVIDIA GeForce RTX 5070, driver 570.211.01, 12227 MiB)
174
 
175
+ | category | min | median | p95 | mean | std | warmup |
176
+ |----------|---------|---------|---------|---------|---------|--------|
177
+ | bottle | 5.144 | 5.202 | 6.415 | 5.508 | 0.473 | 10 |
178
+ | cable | 5.130 | 5.290 | 6.558 | 5.513 | 0.465 | 10 |
179
+ | capsule | 5.109 | 5.354 | 6.179 | 5.474 | 0.376 | 10 |
180
+ | leather | 5.171 | 5.350 | 6.365 | 5.613 | 0.468 | 10 |
181
 
182
+ Platform: Linux-6.8.0-117-generic-x86_64-with-glibc2.35, Python 3.10.12, Torch
183
+ 2.11.0+cu128, Anomalib 2.4.1.
184
 
185
+ ## Accuracy/Cost Tradeoff
 
 
186
 
187
+ PatchCore is more accurate than PaDiM on all 4 categories (cable +0.119 image
188
+ AUROC, capsule +0.114, leather +0.0075, bottle +0.0024), but at higher inference
189
+ cost: CPU median ~30 ms/image vs PaDiM's lighter coupling, and CUDA median
190
+ ~5.2-5.6 ms/image. The CPU cost is dominated by the wide_resnet50_2 backbone and
191
+ the memory-bank nearest-neighbor lookup. On CUDA the model is fast enough for
192
+ real-time-class inspection workloads; on CPU it sits in the tens of ms.
193
+
194
+ ## OpenVINO Parity (Measured This Session)
195
 
196
+ Fresh PatchCore ONNX and OpenVINO exports were produced via Anomalib's
197
+ `Engine.export(export_type=ExportType.ONNX|OPENVINO, ...)` from each trained
198
+ Lightning checkpoint. Outputs were compared on N=20 real MVTec AD test images per
199
+ category (mix of normal + anomalous) under ONNX Runtime CPU (FP32) and OpenVINO
200
+ CPU with `INFERENCE_PRECISION_HINT=f32`. Inference precision hint matters: leaving
201
+ it at the CPU plugin default can silently engage bf16 on AVX-512-BF16 hosts and
202
+ break parity, which is why the f32 hint is explicit.
203
 
204
+ | category | max abs error (anomaly map) | max abs error (pred score) | pred_label flips (N=20) | pred_mask pixel flips (out of 1,310,720) | source JSON |
205
+ |----------|-----------------------------|-----------------------------|-------------------------|-------------------------------------------|-------------|
206
+ | bottle | 2.181e-05 | 6.020e-06 | 0/20 | 0 | `reports/eval_harness/openvino_parity_patchcore_bottle.json` |
207
+ | cable | 4.768e-06 | 3.278e-06 | 0/20 | 0 | `reports/eval_harness/openvino_parity_patchcore_cable.json` |
208
+ | capsule | 7.719e-06 | 4.053e-06 | 0/20 | 0 | `reports/eval_harness/openvino_parity_patchcore_capsule.json` |
209
+ | leather | 4.321e-06 | 7.299e-05 (pred_score) | 0/20 | 0 | `reports/eval_harness/openvino_parity_patchcore_leather.json` |
210
+
211
+ All 4 categories status `parity_clean` per the JSON definition (max_abs_error <=
212
+ 1e-3, zero label flips, zero mask pixel flips). ONNX Runtime 1.23.2, OpenVINO
213
+ 2026.1.0-21367-63e31528c62-releases/2026/1.
214
+
215
+ This is a fresh PatchCore parity measurement. The earlier commit `c3594fc` covered
216
+ PaDiM only and does not transfer to PatchCore by extrapolation; this measurement
217
+ replaces that.
218
+
219
+ ## License
220
 
221
+ ### Package and Card
222
 
223
+ The code in the InspectNet-CX package, this model card, the per-category result
224
+ JSON files, and the parity reports are licensed under **Apache-2.0**.
225
 
226
+ ### MVTec AD Dataset Restriction (Important)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
227
 
228
+ The trained PatchCore checkpoints were fit on the **MVTec AD** dataset, which is
229
+ distributed under **CC BY-NC-SA 4.0**. That license is **non-commercial**.
 
230
 
231
+ **This restriction propagates to the trained checkpoints.** Even though the
232
+ package code is Apache-2.0, downstream **commercial** use of the trained
233
+ PatchCore checkpoints (or any derivative model that was fit on MVTec AD images)
234
+ is **not** permitted under MVTec AD's terms. The dataset license overrides the
235
+ package license for any artifact whose weights or memory bank were built from
236
+ MVTec AD pixels.
237
 
238
+ If you want commercial use, you must retrain the per-category PatchCore detector
239
+ on your own commercially-licensed data using the package code, and the
240
+ non-commercial restriction does not apply to the resulting weights.
241
 
242
+ ## Checkpoints
 
 
243
 
244
+ PatchCore Lightning checkpoints used for the numbers in this card:
245
 
246
+ | category | seed | coreset | SHA256 | size MB |
247
+ |----------|-----------------------|---------|--------------------------------------------------------------------|---------|
248
+ | bottle | 0 (legacy unseeded) | 0.01 | `b0eb8834ae8d2bece3270cd1ef003427f16e0a109cc6bbb3a85eea49e50461df` | 107.6 |
249
+ | bottle | 1 | 0.01 | `d89e12adc18b806e3da552d261c33b113422bf3e49068c73b2e1223816cabd12` | 107.6 |
250
+ | bottle | 2 | 0.01 | `b4afc04f0af2dd70de8393754ed47f276cc2778a6ec9e2d87431e894dcedb725` | 107.6 |
251
+ | cable | 0 (legacy unseeded) | 0.01 | `29d451c6a03707c155adaf1e5bf33313531c9d8204d8722cbe8f9516aac930c2` | 108.5 |
252
+ | capsule | 0 (legacy unseeded) | 0.01 | `25454995713926187e9816613d0e76e8e9531d6ca99becdf2565e8e8ebda8feb` | 108.2 |
253
+ | leather | 0 (legacy unseeded) | 0.01 | `5cf7c7a793ad441a9c6cd92ee27517c674df35720c1873e61ef7aab5ebc2bd29` | 109.8 |
254
+ | leather | 1 | 0.01 | `5af3f908dae9df60fe472718b588deeaaeb93ce7b7b8d286c9077df098375d65` | 109.8 |
255
+ | leather | 2 | 0.01 | `268b1d0819ef50353a0ed874dc84ce2f38d5fe1686978ed284f881c5532fbc0e` | 109.8 |
256
 
257
+ Checkpoints are not bundled in this HF repo. They live in the upstream training
258
+ tree under `artifacts/patchcore_{cat}[_seed{N}]/Patchcore/MVTecAD/{cat}/v0/weights/lightning/model.ckpt`
259
+ and are reproducible from the documented training commands.
 
260
 
261
+ ## Backbone and Hyperparameters
262
+
263
+ - Backbone: `wide_resnet50_2` (timm).
264
+ - Feature layers: `layer2`, `layer3`.
265
+ - Coreset sampling ratio: 0.01 (main runs), with 0.10 and 0.25 sweep on cable.
266
+ - Image size: 256x256, RGB, BILINEAR resize, divide-by-255 normalization.
267
+ - Train/test split: MVTec AD default per-category split.
268
 
269
+ ## Verification
270
+
271
+ See `CHECKSUMS.sha256` for SHA256 of every non-README file shipped in this repo.
272
+ Verify with:
273
 
274
  ```bash
275
+ sha256sum -c CHECKSUMS.sha256
 
 
 
 
 
 
 
 
 
 
 
 
276
  ```
277
 
278
+ See `PROVENANCE.md` for the metric-to-JSON map. Every number in the YAML
279
+ `model-index` block and in the ablation, coreset, latency, and parity tables
280
+ points to a specific field in a specific JSON under `reports/eval_harness/`.
 
 
 
 
 
 
 
281
 
282
+ ## Caveats
 
 
 
 
283
 
284
+ - Cable and capsule PatchCore rows are **single-seed**; the +0.119 / +0.114 image
285
+ AUROC margins over PaDiM are large enough that this is acceptable, but the
286
+ caveat is real.
287
+ - Seed 0 across categories is the **legacy unseeded** baseline run; only seeds 1
288
+ and 2 have pinned RNG state.
289
+ - **MVTec AD non-commercial license** (CC BY-NC-SA 4.0) propagates to the
290
+ checkpoints and overrides the package Apache-2.0 for downstream commercial use.
291
+ - No Jetson, TensorRT, or edge-hardware validation has been performed. CPU
292
+ latency is on an AMD Ryzen 9 9900X workstation, not on target inspection
293
+ hardware.
294
+ - Pixel-level evaluation uses the standard MVTec AD pixel AUROC and
295
+ AUPRO@FPR=0.3 with no additional production thresholding.
296
 
297
+ ## Reproduction
 
 
 
 
 
 
 
 
 
298
 
299
+ PaDiM and PatchCore evaluation harness, latency benchmark, and parity script are
300
+ in the upstream repo:
301
 
302
+ ```bash
303
+ PYTHONPATH=src python3 scripts/eval_harness.py --method patchcore --dataset mvtec_ad --category cable --coreset 0.01 --output reports/eval_harness/patchcore_cable.json
304
+ PYTHONPATH=src python3 scripts/train_patchcore.py --category leather --seed 1 --output artifacts/patchcore_leather_seed1
305
+ PYTHONPATH=src python3 scripts/bench_latency.py --checkpoint artifacts/patchcore_bottle/Patchcore/MVTecAD/bottle/v0/weights/lightning/model.ckpt --category bottle --output reports/eval_harness/patchcore_bottle_latency.json
306
+ PYTHONPATH=src python3 scripts/validate_patchcore_export.py --category bottle --checkpoint artifacts/patchcore_bottle/Patchcore/MVTecAD/bottle/v0/weights/lightning/model.ckpt --output reports/eval_harness/openvino_parity_patchcore_bottle.json
307
+ ```
reports/eval_harness/openvino_parity_patchcore_bottle.json ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.openvino_parity_patchcore.v1",
3
+ "category": "bottle",
4
+ "checkpoint": "artifacts/patchcore_bottle/Patchcore/MVTecAD/bottle/v0/weights/lightning/model.ckpt",
5
+ "checkpoint_sha256": "b0eb8834ae8d2bece3270cd1ef003427f16e0a109cc6bbb3a85eea49e50461df",
6
+ "image_count": 20,
7
+ "image_size": 256,
8
+ "inference_precision_hint": "f32",
9
+ "device": "CPU",
10
+ "library_versions": {
11
+ "python": "3.10.12",
12
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
13
+ "onnxruntime": "1.23.2",
14
+ "openvino": "2026.1.0-21367-63e31528c62-releases/2026/1",
15
+ "anomalib": "2.4.1",
16
+ "torch": "2.11.0+cu128"
17
+ },
18
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
19
+ "timestamp_utc": "2026-05-26T05:26:27.975484+00:00",
20
+ "onnx_path": "/tmp/patchcore_export_bottle_zaz0jvpt/onnx/weights/onnx/model.onnx",
21
+ "openvino_path": "/tmp/patchcore_export_bottle_zaz0jvpt/openvino/weights/openvino/model.xml",
22
+ "comparison": {
23
+ "per_output": {
24
+ "pred_score": {
25
+ "max_abs_error": 6.020069122314453e-06,
26
+ "mean_abs_error": 1.0967254638671874e-06,
27
+ "max_rel_error": 2.0114561266382225e-05
28
+ },
29
+ "pred_label": {
30
+ "max_abs_error": 0.0,
31
+ "mean_abs_error": 0.0,
32
+ "max_rel_error": 0.0
33
+ },
34
+ "anomaly_map": {
35
+ "max_abs_error": 2.1807849407196045e-05,
36
+ "mean_abs_error": 8.278125193328378e-07,
37
+ "max_rel_error": 0.0012416018871590495
38
+ },
39
+ "pred_mask": {
40
+ "max_abs_error": 0.0,
41
+ "mean_abs_error": 0.0,
42
+ "max_rel_error": 0.0
43
+ }
44
+ },
45
+ "pred_label_flips": 0,
46
+ "pred_label_total": 20,
47
+ "pred_mask_pixel_flips": 0,
48
+ "pred_mask_pixel_total": 1310720,
49
+ "pred_mask_pixel_flip_fraction": 0.0,
50
+ "onnx_output_names": [
51
+ "pred_score",
52
+ "pred_label",
53
+ "anomaly_map",
54
+ "pred_mask"
55
+ ]
56
+ },
57
+ "summary": {
58
+ "max_abs_error_any_output": 2.1807849407196045e-05,
59
+ "pred_label_flips": 0,
60
+ "pred_label_total": 20,
61
+ "pred_mask_pixel_flips": 0,
62
+ "pred_mask_pixel_total": 1310720,
63
+ "pred_mask_pixel_flip_fraction": 0.0
64
+ },
65
+ "status": "parity_clean"
66
+ }
reports/eval_harness/openvino_parity_patchcore_cable.json ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.openvino_parity_patchcore.v1",
3
+ "category": "cable",
4
+ "checkpoint": "artifacts/patchcore_cable/Patchcore/MVTecAD/cable/v0/weights/lightning/model.ckpt",
5
+ "checkpoint_sha256": "29d451c6a03707c155adaf1e5bf33313531c9d8204d8722cbe8f9516aac930c2",
6
+ "image_count": 20,
7
+ "image_size": 256,
8
+ "inference_precision_hint": "f32",
9
+ "device": "CPU",
10
+ "library_versions": {
11
+ "python": "3.10.12",
12
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
13
+ "onnxruntime": "1.23.2",
14
+ "openvino": "2026.1.0-21367-63e31528c62-releases/2026/1",
15
+ "anomalib": "2.4.1",
16
+ "torch": "2.11.0+cu128"
17
+ },
18
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
19
+ "timestamp_utc": "2026-05-26T05:26:41.886549+00:00",
20
+ "onnx_path": "/tmp/patchcore_export_cable_24bk8gk9/onnx/weights/onnx/model.onnx",
21
+ "openvino_path": "/tmp/patchcore_export_cable_24bk8gk9/openvino/weights/openvino/model.xml",
22
+ "comparison": {
23
+ "per_output": {
24
+ "pred_score": {
25
+ "max_abs_error": 3.2782554626464844e-06,
26
+ "mean_abs_error": 1.0311603546142579e-06,
27
+ "max_rel_error": 7.807902875356376e-06
28
+ },
29
+ "pred_label": {
30
+ "max_abs_error": 0.0,
31
+ "mean_abs_error": 0.0,
32
+ "max_rel_error": 0.0
33
+ },
34
+ "anomaly_map": {
35
+ "max_abs_error": 4.76837158203125e-06,
36
+ "mean_abs_error": 7.231675681396155e-07,
37
+ "max_rel_error": 1.850500120781362e-05
38
+ },
39
+ "pred_mask": {
40
+ "max_abs_error": 0.0,
41
+ "mean_abs_error": 0.0,
42
+ "max_rel_error": 0.0
43
+ }
44
+ },
45
+ "pred_label_flips": 0,
46
+ "pred_label_total": 20,
47
+ "pred_mask_pixel_flips": 0,
48
+ "pred_mask_pixel_total": 1310720,
49
+ "pred_mask_pixel_flip_fraction": 0.0,
50
+ "onnx_output_names": [
51
+ "pred_score",
52
+ "pred_label",
53
+ "anomaly_map",
54
+ "pred_mask"
55
+ ]
56
+ },
57
+ "summary": {
58
+ "max_abs_error_any_output": 4.76837158203125e-06,
59
+ "pred_label_flips": 0,
60
+ "pred_label_total": 20,
61
+ "pred_mask_pixel_flips": 0,
62
+ "pred_mask_pixel_total": 1310720,
63
+ "pred_mask_pixel_flip_fraction": 0.0
64
+ },
65
+ "status": "parity_clean"
66
+ }
reports/eval_harness/openvino_parity_patchcore_capsule.json ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.openvino_parity_patchcore.v1",
3
+ "category": "capsule",
4
+ "checkpoint": "artifacts/patchcore_capsule/Patchcore/MVTecAD/capsule/v0/weights/lightning/model.ckpt",
5
+ "checkpoint_sha256": "25454995713926187e9816613d0e76e8e9531d6ca99becdf2565e8e8ebda8feb",
6
+ "image_count": 20,
7
+ "image_size": 256,
8
+ "inference_precision_hint": "f32",
9
+ "device": "CPU",
10
+ "library_versions": {
11
+ "python": "3.10.12",
12
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
13
+ "onnxruntime": "1.23.2",
14
+ "openvino": "2026.1.0-21367-63e31528c62-releases/2026/1",
15
+ "anomalib": "2.4.1",
16
+ "torch": "2.11.0+cu128"
17
+ },
18
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
19
+ "timestamp_utc": "2026-05-26T05:26:54.925870+00:00",
20
+ "onnx_path": "/tmp/patchcore_export_capsule_h7hqamy1/onnx/weights/onnx/model.onnx",
21
+ "openvino_path": "/tmp/patchcore_export_capsule_h7hqamy1/openvino/weights/openvino/model.xml",
22
+ "comparison": {
23
+ "per_output": {
24
+ "pred_score": {
25
+ "max_abs_error": 4.0531158447265625e-06,
26
+ "mean_abs_error": 1.761317253112793e-06,
27
+ "max_rel_error": 8.166761290340219e-06
28
+ },
29
+ "pred_label": {
30
+ "max_abs_error": 0.0,
31
+ "mean_abs_error": 0.0,
32
+ "max_rel_error": 0.0
33
+ },
34
+ "anomaly_map": {
35
+ "max_abs_error": 7.718801498413086e-06,
36
+ "mean_abs_error": 8.301735874738369e-07,
37
+ "max_rel_error": 3.931000173906796e-05
38
+ },
39
+ "pred_mask": {
40
+ "max_abs_error": 0.0,
41
+ "mean_abs_error": 0.0,
42
+ "max_rel_error": 0.0
43
+ }
44
+ },
45
+ "pred_label_flips": 0,
46
+ "pred_label_total": 20,
47
+ "pred_mask_pixel_flips": 0,
48
+ "pred_mask_pixel_total": 1310720,
49
+ "pred_mask_pixel_flip_fraction": 0.0,
50
+ "onnx_output_names": [
51
+ "pred_score",
52
+ "pred_label",
53
+ "anomaly_map",
54
+ "pred_mask"
55
+ ]
56
+ },
57
+ "summary": {
58
+ "max_abs_error_any_output": 7.718801498413086e-06,
59
+ "pred_label_flips": 0,
60
+ "pred_label_total": 20,
61
+ "pred_mask_pixel_flips": 0,
62
+ "pred_mask_pixel_total": 1310720,
63
+ "pred_mask_pixel_flip_fraction": 0.0
64
+ },
65
+ "status": "parity_clean"
66
+ }
reports/eval_harness/openvino_parity_patchcore_leather.json ADDED
@@ -0,0 +1,66 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.openvino_parity_patchcore.v1",
3
+ "category": "leather",
4
+ "checkpoint": "artifacts/patchcore_leather/Patchcore/MVTecAD/leather/v0/weights/lightning/model.ckpt",
5
+ "checkpoint_sha256": "5cf7c7a793ad441a9c6cd92ee27517c674df35720c1873e61ef7aab5ebc2bd29",
6
+ "image_count": 20,
7
+ "image_size": 256,
8
+ "inference_precision_hint": "f32",
9
+ "device": "CPU",
10
+ "library_versions": {
11
+ "python": "3.10.12",
12
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
13
+ "onnxruntime": "1.23.2",
14
+ "openvino": "2026.1.0-21367-63e31528c62-releases/2026/1",
15
+ "anomalib": "2.4.1",
16
+ "torch": "2.11.0+cu128"
17
+ },
18
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
19
+ "timestamp_utc": "2026-05-26T05:27:07.327557+00:00",
20
+ "onnx_path": "/tmp/patchcore_export_leather_ai2452vv/onnx/weights/onnx/model.onnx",
21
+ "openvino_path": "/tmp/patchcore_export_leather_ai2452vv/openvino/weights/openvino/model.xml",
22
+ "comparison": {
23
+ "per_output": {
24
+ "pred_score": {
25
+ "max_abs_error": 7.298588752746582e-05,
26
+ "mean_abs_error": 4.3779611587524416e-06,
27
+ "max_rel_error": 0.00023112464987207204
28
+ },
29
+ "pred_label": {
30
+ "max_abs_error": 0.0,
31
+ "mean_abs_error": 0.0,
32
+ "max_rel_error": 0.0
33
+ },
34
+ "anomaly_map": {
35
+ "max_abs_error": 4.32133674621582e-06,
36
+ "mean_abs_error": 6.938633305253461e-07,
37
+ "max_rel_error": 0.0014192002126947045
38
+ },
39
+ "pred_mask": {
40
+ "max_abs_error": 0.0,
41
+ "mean_abs_error": 0.0,
42
+ "max_rel_error": 0.0
43
+ }
44
+ },
45
+ "pred_label_flips": 0,
46
+ "pred_label_total": 20,
47
+ "pred_mask_pixel_flips": 0,
48
+ "pred_mask_pixel_total": 1310720,
49
+ "pred_mask_pixel_flip_fraction": 0.0,
50
+ "onnx_output_names": [
51
+ "pred_score",
52
+ "pred_label",
53
+ "anomaly_map",
54
+ "pred_mask"
55
+ ]
56
+ },
57
+ "summary": {
58
+ "max_abs_error_any_output": 7.298588752746582e-05,
59
+ "pred_label_flips": 0,
60
+ "pred_label_total": 20,
61
+ "pred_mask_pixel_flips": 0,
62
+ "pred_mask_pixel_total": 1310720,
63
+ "pred_mask_pixel_flip_fraction": 0.0
64
+ },
65
+ "status": "parity_clean"
66
+ }
reports/eval_harness/padim_bottle_repro.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "bottle",
4
+ "method": "padim",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "b620c53f19ec3242c2e0146d53ee71001c035594fa31376b0e1c875c4053f8b7",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/anomalib_scoring/Padim/MVTecAD/bottle/v2/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "de7ea7c54f23d9ca33aaa7bfafeb1f6bb80c515d99f6179b604e4ec6882eae83",
10
+ "image_auroc": 0.9976190476190476,
11
+ "pixel_auroc": 0.9816106949514174,
12
+ "aupro": 0.940564751625061,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.3784149718284607,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 209
20
+ },
21
+ "n_test_images": 83,
22
+ "n_test_anomaly": 63,
23
+ "n_test_normal": 20,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T04:50:15.669819+00:00",
35
+ "device": "cpu"
36
+ }
reports/eval_harness/padim_cable_repro.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "cable",
4
+ "method": "padim",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "d7bbd5d916acd9c8660eaacc6d653c7bdc4ab9fc8765f48563cccc5717df8150",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/anomalib_scoring_cable/Padim/MVTecAD/cable/v1/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "2db928d24905691b677fa90c132a36050030dd3dc0abcd0d514d3772ea972c0f",
10
+ "image_auroc": 0.8720014992503747,
11
+ "pixel_auroc": 0.955104514240921,
12
+ "aupro": 0.8519249558448792,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.3756111641228199,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 224
20
+ },
21
+ "n_test_images": 150,
22
+ "n_test_anomaly": 92,
23
+ "n_test_normal": 58,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T04:51:02.394695+00:00",
35
+ "device": "cpu"
36
+ }
reports/eval_harness/padim_capsule_repro.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "capsule",
4
+ "method": "padim",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "a35a4767af802024bcbbdb6ef56b1c9074be26490b39d0345378c8b842d69ee6",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/anomalib_scoring_capsule/Padim/MVTecAD/capsule/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "0fcba06e0c2550a4e37e06727d5e376f64387901f1b13c504649060d2d798607",
10
+ "image_auroc": 0.8807339449541285,
11
+ "pixel_auroc": 0.9849188179370411,
12
+ "aupro": 0.914944589138031,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.40798546075820924,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 219
20
+ },
21
+ "n_test_images": 132,
22
+ "n_test_anomaly": 109,
23
+ "n_test_normal": 23,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T04:51:44.276536+00:00",
35
+ "device": "cpu"
36
+ }
reports/eval_harness/padim_leather_repro.json ADDED
@@ -0,0 +1,36 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "leather",
4
+ "method": "padim",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "4c730802f339675b402c86c8079e1b7b57b07c0b00e6f4de45db073ebb52ad5c",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/anomalib_scoring_leather/Padim/MVTecAD/leather/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "986cf8871aa86b666078435d83db585927adb056eb6153a2b30437167aafe718",
10
+ "image_auroc": 0.9925271739130433,
11
+ "pixel_auroc": 0.9882110318538196,
12
+ "aupro": 0.9681736826896667,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.40272310554981233,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 245
20
+ },
21
+ "n_test_images": 124,
22
+ "n_test_anomaly": 92,
23
+ "n_test_normal": 32,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T04:52:21.865807+00:00",
35
+ "device": "cpu"
36
+ }
reports/eval_harness/patchcore_bottle.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "bottle",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "b620c53f19ec3242c2e0146d53ee71001c035594fa31376b0e1c875c4053f8b7",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_bottle/Patchcore/MVTecAD/bottle/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "b0eb8834ae8d2bece3270cd1ef003427f16e0a109cc6bbb3a85eea49e50461df",
10
+ "image_auroc": 1.0,
11
+ "pixel_auroc": 0.9850819072235026,
12
+ "aupro": 0.9413159489631653,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.2681984579563141,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 209
20
+ },
21
+ "n_test_images": 83,
22
+ "n_test_anomaly": 63,
23
+ "n_test_normal": 20,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:01:39.161257+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.01,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.01,
44
+ "checkpoint_sha256": "b0eb8834ae8d2bece3270cd1ef003427f16e0a109cc6bbb3a85eea49e50461df",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_bottle_latency.json ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.bench_latency.v1",
3
+ "category": "bottle",
4
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_bottle/Patchcore/MVTecAD/bottle/v0/weights/lightning/model.ckpt",
5
+ "dataset_root": "/home/yusuf/datasets/mvtec_ad",
6
+ "hardware": {
7
+ "cpu": "AMD Ryzen 9 9900X 12-Core Processor",
8
+ "gpu": "NVIDIA GeForce RTX 5070, 570.211.01, 12227 MiB",
9
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35"
10
+ },
11
+ "library_versions": {
12
+ "python": "3.10.12",
13
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
14
+ "numpy": "2.2.6",
15
+ "torch": "2.11.0+cu128",
16
+ "torchvision": "0.26.0+cu128",
17
+ "anomalib": "2.4.1"
18
+ },
19
+ "timestamp_utc": "2026-05-26T05:05:45.170181+00:00",
20
+ "per_device": {
21
+ "cpu": {
22
+ "device": "cpu",
23
+ "n_images": 50,
24
+ "n_warmup": 10,
25
+ "image_size": 256,
26
+ "batch_size": 1,
27
+ "min_ms": 28.318168000168953,
28
+ "median_ms": 30.15510099999119,
29
+ "p95_ms": 31.568882550072885,
30
+ "mean_ms": 30.1779899399844,
31
+ "std_ms": 1.0117806649427663
32
+ },
33
+ "cuda": {
34
+ "device": "cuda",
35
+ "n_images": 50,
36
+ "n_warmup": 10,
37
+ "image_size": 256,
38
+ "batch_size": 1,
39
+ "min_ms": 5.143589999988762,
40
+ "median_ms": 5.201645000170174,
41
+ "p95_ms": 6.4145484999698965,
42
+ "mean_ms": 5.50754846003656,
43
+ "std_ms": 0.4728880034145876
44
+ }
45
+ }
46
+ }
reports/eval_harness/patchcore_bottle_seed1.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "bottle",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "b620c53f19ec3242c2e0146d53ee71001c035594fa31376b0e1c875c4053f8b7",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_bottle_seed1/Patchcore/MVTecAD/bottle/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "d89e12adc18b806e3da552d261c33b113422bf3e49068c73b2e1223816cabd12",
10
+ "image_auroc": 1.0,
11
+ "pixel_auroc": 0.9851934235356974,
12
+ "aupro": 0.9402801990509033,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.2910947442054749,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 209
20
+ },
21
+ "n_test_images": 83,
22
+ "n_test_anomaly": 63,
23
+ "n_test_normal": 20,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:19:02.959334+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.01,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.01,
44
+ "checkpoint_sha256": "d89e12adc18b806e3da552d261c33b113422bf3e49068c73b2e1223816cabd12",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_bottle_seed2.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "bottle",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "b620c53f19ec3242c2e0146d53ee71001c035594fa31376b0e1c875c4053f8b7",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_bottle_seed2/Patchcore/MVTecAD/bottle/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "b4afc04f0af2dd70de8393754ed47f276cc2778a6ec9e2d87431e894dcedb725",
10
+ "image_auroc": 1.0,
11
+ "pixel_auroc": 0.9852875630288879,
12
+ "aupro": 0.9401062726974487,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.29508321762084966,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 209
20
+ },
21
+ "n_test_images": 83,
22
+ "n_test_anomaly": 63,
23
+ "n_test_normal": 20,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:19:58.828103+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.01,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.01,
44
+ "checkpoint_sha256": "b4afc04f0af2dd70de8393754ed47f276cc2778a6ec9e2d87431e894dcedb725",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_cable.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "cable",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "d7bbd5d916acd9c8660eaacc6d653c7bdc4ab9fc8765f48563cccc5717df8150",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_cable/Patchcore/MVTecAD/cable/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "29d451c6a03707c155adaf1e5bf33313531c9d8204d8722cbe8f9516aac930c2",
10
+ "image_auroc": 0.9910044977511244,
11
+ "pixel_auroc": 0.9833900287538287,
12
+ "aupro": 0.9280552268028259,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.4500109788775444,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 224
20
+ },
21
+ "n_test_images": 150,
22
+ "n_test_anomaly": 92,
23
+ "n_test_normal": 58,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:02:17.305784+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.01,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.01,
44
+ "checkpoint_sha256": "29d451c6a03707c155adaf1e5bf33313531c9d8204d8722cbe8f9516aac930c2",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_cable_coreset010.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "cable",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "d7bbd5d916acd9c8660eaacc6d653c7bdc4ab9fc8765f48563cccc5717df8150",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_cable_coreset010/Patchcore/MVTecAD/cable/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "5cac130be961ebfeee5c772c004938f13d833fa1b54c3e70f893b9cc4be1ad22",
10
+ "image_auroc": 0.9855697151424287,
11
+ "pixel_auroc": 0.9848007912668789,
12
+ "aupro": 0.9303989410400391,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.26405930995941157,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 224
20
+ },
21
+ "n_test_images": 150,
22
+ "n_test_anomaly": 92,
23
+ "n_test_normal": 58,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:04:17.622258+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.1,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.1,
44
+ "checkpoint_sha256": "5cac130be961ebfeee5c772c004938f13d833fa1b54c3e70f893b9cc4be1ad22",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_cable_coreset025.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "cable",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "d7bbd5d916acd9c8660eaacc6d653c7bdc4ab9fc8765f48563cccc5717df8150",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_cable_coreset025/Patchcore/MVTecAD/cable/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "5979528b21adef3c04bb04f716c6ddfa835d21ad3bdf9488b8b7eab1049416f8",
10
+ "image_auroc": 0.9893178410794603,
11
+ "pixel_auroc": 0.9843814612771362,
12
+ "aupro": 0.928039014339447,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.1510734988749027,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 224
20
+ },
21
+ "n_test_images": 150,
22
+ "n_test_anomaly": 92,
23
+ "n_test_normal": 58,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:05:01.867710+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.25,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.25,
44
+ "checkpoint_sha256": "5979528b21adef3c04bb04f716c6ddfa835d21ad3bdf9488b8b7eab1049416f8",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_cable_latency.json ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.bench_latency.v1",
3
+ "category": "cable",
4
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_cable/Patchcore/MVTecAD/cable/v0/weights/lightning/model.ckpt",
5
+ "dataset_root": "/home/yusuf/datasets/mvtec_ad",
6
+ "hardware": {
7
+ "cpu": "AMD Ryzen 9 9900X 12-Core Processor",
8
+ "gpu": "NVIDIA GeForce RTX 5070, 570.211.01, 12227 MiB",
9
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35"
10
+ },
11
+ "library_versions": {
12
+ "python": "3.10.12",
13
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
14
+ "numpy": "2.2.6",
15
+ "torch": "2.11.0+cu128",
16
+ "torchvision": "0.26.0+cu128",
17
+ "anomalib": "2.4.1"
18
+ },
19
+ "timestamp_utc": "2026-05-26T05:05:53.718666+00:00",
20
+ "per_device": {
21
+ "cpu": {
22
+ "device": "cpu",
23
+ "n_images": 50,
24
+ "n_warmup": 10,
25
+ "image_size": 256,
26
+ "batch_size": 1,
27
+ "min_ms": 30.415208999784227,
28
+ "median_ms": 31.296612500000265,
29
+ "p95_ms": 32.90803200002301,
30
+ "mean_ms": 31.463410440046573,
31
+ "std_ms": 0.8065842891002637
32
+ },
33
+ "cuda": {
34
+ "device": "cuda",
35
+ "n_images": 50,
36
+ "n_warmup": 10,
37
+ "image_size": 256,
38
+ "batch_size": 1,
39
+ "min_ms": 5.130470000040077,
40
+ "median_ms": 5.2899059999163,
41
+ "p95_ms": 6.557743550024497,
42
+ "mean_ms": 5.513052840015007,
43
+ "std_ms": 0.46512099244870114
44
+ }
45
+ }
46
+ }
reports/eval_harness/patchcore_capsule.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "capsule",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "a35a4767af802024bcbbdb6ef56b1c9074be26490b39d0345378c8b842d69ee6",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_capsule/Patchcore/MVTecAD/capsule/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "25454995713926187e9816613d0e76e8e9531d6ca99becdf2565e8e8ebda8feb",
10
+ "image_auroc": 0.994415636218588,
11
+ "pixel_auroc": 0.990176424065145,
12
+ "aupro": 0.9382407665252686,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.4463476654887199,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 219
20
+ },
21
+ "n_test_images": 132,
22
+ "n_test_anomaly": 109,
23
+ "n_test_normal": 23,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:02:57.600572+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.01,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.01,
44
+ "checkpoint_sha256": "25454995713926187e9816613d0e76e8e9531d6ca99becdf2565e8e8ebda8feb",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_capsule_latency.json ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.bench_latency.v1",
3
+ "category": "capsule",
4
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_capsule/Patchcore/MVTecAD/capsule/v0/weights/lightning/model.ckpt",
5
+ "dataset_root": "/home/yusuf/datasets/mvtec_ad",
6
+ "hardware": {
7
+ "cpu": "AMD Ryzen 9 9900X 12-Core Processor",
8
+ "gpu": "NVIDIA GeForce RTX 5070, 570.211.01, 12227 MiB",
9
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35"
10
+ },
11
+ "library_versions": {
12
+ "python": "3.10.12",
13
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
14
+ "numpy": "2.2.6",
15
+ "torch": "2.11.0+cu128",
16
+ "torchvision": "0.26.0+cu128",
17
+ "anomalib": "2.4.1"
18
+ },
19
+ "timestamp_utc": "2026-05-26T05:06:04.986280+00:00",
20
+ "per_device": {
21
+ "cpu": {
22
+ "device": "cpu",
23
+ "n_images": 50,
24
+ "n_warmup": 10,
25
+ "image_size": 256,
26
+ "batch_size": 1,
27
+ "min_ms": 30.708614000104717,
28
+ "median_ms": 31.777702999988833,
29
+ "p95_ms": 42.2283800000514,
30
+ "mean_ms": 38.632892740024545,
31
+ "std_ms": 38.97406824647649
32
+ },
33
+ "cuda": {
34
+ "device": "cuda",
35
+ "n_images": 50,
36
+ "n_warmup": 10,
37
+ "image_size": 256,
38
+ "batch_size": 1,
39
+ "min_ms": 5.108850999931747,
40
+ "median_ms": 5.353652000167131,
41
+ "p95_ms": 6.178862999854573,
42
+ "mean_ms": 5.473933599996599,
43
+ "std_ms": 0.3758229662202633
44
+ }
45
+ }
46
+ }
reports/eval_harness/patchcore_capsule_latency_rerun1.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.bench_latency.v1",
3
+ "category": "capsule",
4
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_capsule/Patchcore/MVTecAD/capsule/v0/weights/lightning/model.ckpt",
5
+ "dataset_root": "/home/yusuf/datasets/mvtec_ad",
6
+ "hardware": {
7
+ "cpu": "AMD Ryzen 9 9900X 12-Core Processor",
8
+ "gpu": "NVIDIA GeForce RTX 5070, 570.211.01, 12227 MiB",
9
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35"
10
+ },
11
+ "library_versions": {
12
+ "python": "3.10.12",
13
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
14
+ "numpy": "2.2.6",
15
+ "torch": "2.11.0+cu128",
16
+ "torchvision": "0.26.0+cu128",
17
+ "anomalib": "2.4.1"
18
+ },
19
+ "timestamp_utc": "2026-05-26T05:15:53.993082+00:00",
20
+ "per_device": {
21
+ "cpu": {
22
+ "device": "cpu",
23
+ "n_images": 50,
24
+ "n_warmup": 10,
25
+ "image_size": 256,
26
+ "batch_size": 1,
27
+ "min_ms": 31.486972000038804,
28
+ "median_ms": 41.77246400013246,
29
+ "p95_ms": 44.667347600170615,
30
+ "mean_ms": 40.962546960063264,
31
+ "std_ms": 3.56739511177009
32
+ }
33
+ }
34
+ }
reports/eval_harness/patchcore_capsule_latency_rerun2.json ADDED
@@ -0,0 +1,34 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.bench_latency.v1",
3
+ "category": "capsule",
4
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_capsule/Patchcore/MVTecAD/capsule/v0/weights/lightning/model.ckpt",
5
+ "dataset_root": "/home/yusuf/datasets/mvtec_ad",
6
+ "hardware": {
7
+ "cpu": "AMD Ryzen 9 9900X 12-Core Processor",
8
+ "gpu": "NVIDIA GeForce RTX 5070, 570.211.01, 12227 MiB",
9
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35"
10
+ },
11
+ "library_versions": {
12
+ "python": "3.10.12",
13
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
14
+ "numpy": "2.2.6",
15
+ "torch": "2.11.0+cu128",
16
+ "torchvision": "0.26.0+cu128",
17
+ "anomalib": "2.4.1"
18
+ },
19
+ "timestamp_utc": "2026-05-26T05:16:12.213588+00:00",
20
+ "per_device": {
21
+ "cpu": {
22
+ "device": "cpu",
23
+ "n_images": 50,
24
+ "n_warmup": 30,
25
+ "image_size": 256,
26
+ "batch_size": 1,
27
+ "min_ms": 28.789403999780916,
28
+ "median_ms": 29.74879599992164,
29
+ "p95_ms": 32.50230500000271,
30
+ "mean_ms": 30.1732830000401,
31
+ "std_ms": 1.1620811502979578
32
+ }
33
+ }
34
+ }
reports/eval_harness/patchcore_leather.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "leather",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "4c730802f339675b402c86c8079e1b7b57b07c0b00e6f4de45db073ebb52ad5c",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_leather/Patchcore/MVTecAD/leather/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "5cf7c7a793ad441a9c6cd92ee27517c674df35720c1873e61ef7aab5ebc2bd29",
10
+ "image_auroc": 1.0,
11
+ "pixel_auroc": 0.9923970507295065,
12
+ "aupro": 0.9760316014289856,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.2661692547798157,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 245
20
+ },
21
+ "n_test_images": 124,
22
+ "n_test_anomaly": 92,
23
+ "n_test_normal": 32,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:03:30.650515+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.01,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.01,
44
+ "checkpoint_sha256": "5cf7c7a793ad441a9c6cd92ee27517c674df35720c1873e61ef7aab5ebc2bd29",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_leather_latency.json ADDED
@@ -0,0 +1,46 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.bench_latency.v1",
3
+ "category": "leather",
4
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_leather/Patchcore/MVTecAD/leather/v0/weights/lightning/model.ckpt",
5
+ "dataset_root": "/home/yusuf/datasets/mvtec_ad",
6
+ "hardware": {
7
+ "cpu": "AMD Ryzen 9 9900X 12-Core Processor",
8
+ "gpu": "NVIDIA GeForce RTX 5070, 570.211.01, 12227 MiB",
9
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35"
10
+ },
11
+ "library_versions": {
12
+ "python": "3.10.12",
13
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
14
+ "numpy": "2.2.6",
15
+ "torch": "2.11.0+cu128",
16
+ "torchvision": "0.26.0+cu128",
17
+ "anomalib": "2.4.1"
18
+ },
19
+ "timestamp_utc": "2026-05-26T05:06:15.187105+00:00",
20
+ "per_device": {
21
+ "cpu": {
22
+ "device": "cpu",
23
+ "n_images": 50,
24
+ "n_warmup": 10,
25
+ "image_size": 256,
26
+ "batch_size": 1,
27
+ "min_ms": 30.973587000062253,
28
+ "median_ms": 32.81182499995339,
29
+ "p95_ms": 35.19110755000838,
30
+ "mean_ms": 32.837616140041064,
31
+ "std_ms": 1.1777132786393758
32
+ },
33
+ "cuda": {
34
+ "device": "cuda",
35
+ "n_images": 50,
36
+ "n_warmup": 10,
37
+ "image_size": 256,
38
+ "batch_size": 1,
39
+ "min_ms": 5.1714010000978305,
40
+ "median_ms": 5.349747500076774,
41
+ "p95_ms": 6.364728000062314,
42
+ "mean_ms": 5.613228779975543,
43
+ "std_ms": 0.46813156145994267
44
+ }
45
+ }
46
+ }
reports/eval_harness/patchcore_leather_seed1.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "leather",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "4c730802f339675b402c86c8079e1b7b57b07c0b00e6f4de45db073ebb52ad5c",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_leather_seed1/Patchcore/MVTecAD/leather/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "5af3f908dae9df60fe472718b588deeaaeb93ce7b7b8d286c9077df098375d65",
10
+ "image_auroc": 1.0,
11
+ "pixel_auroc": 0.992077722412704,
12
+ "aupro": 0.9747775793075562,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.2635792183876038,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 245
20
+ },
21
+ "n_test_images": 124,
22
+ "n_test_anomaly": 92,
23
+ "n_test_normal": 32,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:19:36.165636+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.01,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.01,
44
+ "checkpoint_sha256": "5af3f908dae9df60fe472718b588deeaaeb93ce7b7b8d286c9077df098375d65",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }
reports/eval_harness/patchcore_leather_seed2.json ADDED
@@ -0,0 +1,47 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ {
2
+ "schema": "inspectnet_cx.eval_harness.v1",
3
+ "category": "leather",
4
+ "method": "patchcore",
5
+ "dataset": "mvtec_ad",
6
+ "split": "mvtec_ad_default_train_test",
7
+ "split_hash": "4c730802f339675b402c86c8079e1b7b57b07c0b00e6f4de45db073ebb52ad5c",
8
+ "checkpoint": "/home/yusuf/Projects/inspectnet-cx/artifacts/patchcore_leather_seed2/Patchcore/MVTecAD/leather/v0/weights/lightning/model.ckpt",
9
+ "checkpoint_hash": "268b1d0819ef50353a0ed874dc84ce2f38d5fe1686978ed284f881c5532fbc0e",
10
+ "image_auroc": 1.0,
11
+ "pixel_auroc": 0.9921353973945378,
12
+ "aupro": 0.9748720526695251,
13
+ "aupro_fpr_limit": 0.3,
14
+ "threshold": 0.26283863246440886,
15
+ "threshold_selection": {
16
+ "rule": "quantile",
17
+ "quantile": 0.995,
18
+ "split": "train",
19
+ "n_train_scores": 245
20
+ },
21
+ "n_test_images": 124,
22
+ "n_test_anomaly": 92,
23
+ "n_test_normal": 32,
24
+ "library_versions": {
25
+ "python": "3.10.12",
26
+ "platform": "Linux-6.8.0-117-generic-x86_64-with-glibc2.35",
27
+ "numpy": "2.2.6",
28
+ "sklearn": "1.7.2",
29
+ "torch": "2.11.0+cu128",
30
+ "torchvision": "0.26.0+cu128",
31
+ "anomalib": "2.4.1"
32
+ },
33
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea",
34
+ "timestamp_utc": "2026-05-26T05:20:32.067330+00:00",
35
+ "device": "cuda",
36
+ "coreset_sampling_ratio": 0.01,
37
+ "train_sidecar": {
38
+ "backbone": "wide_resnet50_2",
39
+ "layers": [
40
+ "layer2",
41
+ "layer3"
42
+ ],
43
+ "coreset_sampling_ratio": 0.01,
44
+ "checkpoint_sha256": "268b1d0819ef50353a0ed874dc84ce2f38d5fe1686978ed284f881c5532fbc0e",
45
+ "git_commit": "e8b13f0163d67d14f3e3803fab58a834b002d5ea"
46
+ }
47
+ }