filter-inspection / docs /RESULTS.md
daipath's picture
加入完整文档集:复现指南、逐文件说明、结果汇总、诚实性审计、已知边界
0e9808f verified
|
Raw
History Blame Contribute Delete
13.8 kB
# 全部实验结果
**阅读前提**:所有 test 数字都是「阈值在 val 上定、test 只评一次」的诚实口径,除非明确标注 oracle。
AUROC 的噪声地板是 **±0.005**(Hanley–McNeil 标准误)——**排名相邻的模型之间没有统计意义上的差别**
---
## 数据与切分
| | A 套(全混合 8:1:1) | B 套(跨批次) |
|---|---|---|
| train / val / test | 2768 / 434 / 409 | 2787 / 441 / 284 |
| test 良品 / 不良 | 185 / 224 | 185 / 99 |
| test 不良率 | 54.8% | 34.9% |
| test 与 train 的包重叠 | 10 / 10 | **0 / 1** |
3728 张 → 剔除 117 张(rare_class 83 / zero_shapes 28 / no_json 6)→ **3611 张**
288 个分组(`pkg‖sess`),**0 组跨 split**
| 类别 | A 套 train/val/test | B 套 train/val/test |
|---|---|---|
| good | 1368 / 193 / 185 | 1383 / 178 / 185 |
| 划 | 870 / 135 / 133 | 942 / 149 / 47 |
| 侧面崩 | 253 / 42 / 40 | 253 / 50 / 32 |
| 崩 | 163 / 37 / 28 | 179 / 37 / 12 |
| 麻 | 114 / 27 / 23 | 129 / 27 / 8 |
---
## 一、分割路线
### 像素级质量
| | A val | A test | B val | B test |
|---|---|---|---|---|
| 划痕 Dice | 0.6366 | 0.6578 | 0.6502 | 0.5659 |
| 崩边 Dice | 0.7713 | 0.8489 | 0.7652 | 0.7811 |
| **麻点 Dice** | **0.4580** | **0.3728** | **0.4403** | **0.2609** |
| 三类合计 Dice | 0.6975 | 0.7432 | 0.7021 | 0.6802 |
| 三类合计 IoU | 0.5355 | 0.5913 | 0.5410 | 0.5153 |
| AUROC `px_any` | 0.9635 | 0.9755 | 0.9706 | 0.9884 |
| AUROC `s_max` | 0.9779 | **0.9922** | 0.9884 | 0.9749 |
训练:200 epoch,A 套最佳 epoch **146**,最后 20 epoch 的 val Dice 标准差 **0.0047** —— 已收敛。
### 判废检出(A 套 test)
| 方法 | 检出 | 误报 | 口径 |
|---|---|---|---|
| 单一像素阈值 | **71.4%** | 5/185 | honest(val 定阈) |
| 单一像素阈值 | 49.6% | 3/185 | *oracle(test 调阈,作弊)* |
| 7 维几何判据 | **64.3%** | 7/185 | honest |
| 7 维几何判据 | 74.6% | 3/185 | *oracle* |
### 判废检出(B 套 test)
| 方法 | 检出 | 误报 | 口径 |
|---|---|---|---|
| 单一像素阈值 | **69.7%** | 5/185 | honest |
| 单一像素阈值 | 65.7% | 3/185 | *oracle* |
| 7 维几何判据 | **76.8%** | 7/185 | honest |
| 7 维几何判据 | 85.9% | 3/185 | *oracle* |
> **几何判据 oracle → honest 掉 10 个点(A 套 74.6% → 64.3%)。**
> 7 个自由度在 434 张 val 上调,过拟合是必然的。这是几何判据路线的天花板。
### 阈值扫描 —— 本项目最关键的一张表
A 套 test(`curve_test.csv`):
| τ | 误报 | 总检出 | 划痕 | 崩边 | **麻点** |
|---|---|---|---|---|---|
| 10 | 15/185 | 99.1% | 99.3% | 98.5% | 100% |
| 100 | 12/185 | 98.2% | 98.5% | 97.1% | 100% |
| 200 | 12/185 | 94.2% | 96.2% | 97.1% | 73.9% |
| 400 | 10/185 | 86.6% | 93.2% | 97.1% | **17.4%** |
| 800 | 8/185 | 81.3% | 87.2% | 97.1% | **0.0%** |
| 1600 | 5/185 | 66.1% | 64.7% | 91.2% | **0.0%** |
| 3200 | 1/185 | 35.7% | 26.3% | 66.2% | **0.0%** |
**崩边极其稳健**(τ=1600 仍有 91.2%),**麻点在 τ=800 就归零**
麻点连通域太小——test 全部麻点图预测像素合计 6297 px,均摊每图 274 px。
### 增广消融(A 套,分割)
| 增广 | 平均 Dice | 单阈值检出 | 误报 |
|---|---|---|---|
| none | 0.5947 | 65.6% | 2 |
| **weak** | **0.6136** | **70.1%** | 2 |
| mid | 0.6061 | 59.4% | 2 |
| strong | 0.6086 | 56.7% | 3 |
**weak 最好,strong 更差。** 缺陷本身是细微低对比结构,强增广会把它抹掉。
---
## 二、分类路线(推荐)
### 完整榜单(42 个模型,按 test AUROC)
`rec@3` = val 误报 ≤3 时的阈值搬到 test 后的检出率;`fp@3` = test 上实际误报数。
| # | split | task | backbone | size | aug | norm | loss | 参数M | val AUROC | **test AUROC** | rec@3 | fp@3 | imp_test | imp_line10 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| 1 | A | bin | efficientnet_b0 | 320 | mid | **imnet** | ce | 4.01 | 0.9951 | **0.9976** | 94.6% | 3 | 1.40% | 13.4% |
| 2 | A | bin | efficientnet_b0 | 320 | cutmix | gwz | ce | 4.01 | 0.9922 | 0.9975 | 95.5% | 4 | 1.83% | 16.9% |
| 3 | A | bin | mobilenetv3_large_100 | 320 | weak | gwz | ce | 4.20 | 0.9917 | 0.9969 | 94.6% | 3 | 1.40% | 13.4% |
| 4 | A | bin | efficientnet_b0 | 384 | mid | gwz | ce | 4.01 | 0.9966 | 0.9968 | 96.4% | 7 | 3.14% | 26.1% |
| 5 | A | bin | edgenext_small | 320 | mid | gwz | ce | 5.28 | 0.9952 | 0.9968 | 96.4% | 6 | 2.70% | 23.2% |
| 6 | A | bin | efficientnet_b0 | 224 | mid | gwz | ce | 4.01 | 0.9924 | 0.9961 | 96.0% | 4 | 1.83% | 16.9% |
| 7 | A | bin | mobilenetv3_large_100 | 320 | none | gwz | ce | 4.20 | 0.9869 | 0.9959 | 89.7% | **2** | **0.99%** | **9.8%** |
| 8 | A | bin | efficientnet_b0 | 320 | mid | gwz | ce_nols | 4.01 | 0.9951 | 0.9955 | 98.7% | 7 | 3.07% | 25.7% |
| 9 | A | bin | efficientnet_b0 | 448 | mid | gwz | ce | 4.01 | **0.9971** | 0.9943 | 96.9% | 4 | 1.81% | 16.7% |
| 10 | A | cls4 | mobilenetv3_large_100 | 320 | weak | gwz | ce | 4.21 | 0.9815 | 0.9940 | 78.6% | **1** | **0.56%** | **5.8%** |
| 11 | A | bin | vit_small_patch16 | 224 | mid | gwz | ce | 21.67 | 0.9872 | 0.9937 | 93.3% | 3 | 1.42% | 13.5% |
| 12 | A | bin | regnety_016 | 320 | mid | gwz | ce | 10.32 | 0.9950 | 0.9931 | 96.0% | 7 | 3.15% | 26.2% |
| 13 | A | cls4 | mobilenetv3_large_100 | 320 | mid | gwz | ce | 4.21 | 0.9908 | 0.9928 | 86.2% | 2 | 1.03% | 10.2% |
| 14 | A | bin | efficientnet_b0 | 320 | mid | gwz | ce | 4.01 | 0.9936 | 0.9918 | **97.3%** | 4 | 1.80% | 16.7% |
| 15 | A | bin | efficientnet_b0 | 320 | mid | gwz | focal | 4.01 | 0.9962 | 0.9917 | 96.9% | 5 | 2.25% | 20.1% |
| 16 | A | bin | mobilenetv3_large_100 | 320 | mid | gwz | ce | 4.20 | **0.9974** | 0.9913 | **99.1%** | 8 | 3.48% | 28.2% |
| 17 | A | bin | resnet34 | 320 | mid | gwz | ce | 21.29 | 0.9923 | 0.9911 | 94.2% | 3 | 1.40% | 13.4% |
| 18 | A | bin | efficientnet_b0 | 320 | mid | zscore | ce | 4.01 | 0.9950 | 0.9910 | 91.1% | 3 | 1.45% | 13.8% |
| 19 | A | bin | efficientnet_b0 | 320 | photo | gwz | ce | 4.01 | 0.9938 | 0.9908 | 93.8% | 6 | 2.78% | 23.7% |
| 20 | A | cls4 | mobilenetv3_large_100 | 320 | strong | gwz | ce | 4.21 | 0.9903 | 0.9906 | 88.8% | 3 | 1.49% | 14.1% |
| 21 | A | bin | efficientnet_b0 | 320 | mixup | gwz | ce | 4.01 | 0.9926 | 0.9895 | 92.9% | 5 | 2.35% | 20.8% |
| 22 | A | bin | convnext_nano | 320 | mid | gwz | ce | 14.95 | 0.9865 | 0.9893 | 85.7% | 4 | 2.04% | 18.5% |
| 23 | A | bin | efficientvit_b1 | 320 | mid | gwz | ce | 7.50 | 0.9930 | 0.9893 | 93.8% | 6 | 2.78% | 23.7% |
| 24 | A | cls4 | mobilenetv3_large_100 | 320 | none | gwz | ce | 4.21 | 0.9768 | 0.9892 | 83.9% | 4 | 2.08% | 18.8% |
| 25 | A | bin | resnet18 | 320 | mid | gwz | ce | 11.18 | 0.9936 | 0.9890 | 92.4% | 5 | 2.36% | 20.8% |
| 26 | A | bin | efficientnet_b0 | 256 | mid | gwz | ce | 4.01 | 0.9958 | 0.9884 | 97.3% | 4 | 1.80% | 16.7% |
| 27 | A | bin | repvgg_a1 | 320 | mid | gwz | ce | 12.81 | 0.9938 | 0.9878 | 93.8% | 6 | 2.78% | 23.7% |
| 28 | A | bin | efficientnet_b0 | 320 | geo | gwz | ce | 4.01 | 0.9945 | 0.9873 | 92.9% | 4 | 1.89% | 17.3% |
| 29 | A | cls4 | resnet34 | 320 | mid | gwz | ce | 21.29 | 0.9786 | 0.9867 | 74.6% | **1** | **0.60%** | **6.1%** |
| 30 | B | cls4 | mobilenetv3_large_100 | 320 | none | gwz | ce | 4.21 | 0.9911 | 0.9862 | 91.9% | 8 | 8.08% | 29.8% |
| 31 | B | bin | resnet34 | 320 | mid | gwz | ce | 21.29 | 0.9932 | 0.9862 | 94.9% | 7 | 6.93% | 26.4% |
| 32 | B | cls4 | mobilenetv3_large_100 | 320 | mid | gwz | ce | 4.21 | 0.9880 | 0.9855 | 89.9% | 5 | 5.32% | 21.3% |
| 33 | B | bin | mobilenetv3_large_100 | 320 | weak | gwz | ce | 4.20 | 0.9921 | 0.9853 | 87.9% | 8 | 8.42% | 30.7% |
| 34 | A | bin | mobilenetv3_large_100 | 320 | strong | gwz | ce | 4.20 | 0.9883 | 0.9847 | 81.3% | 3 | 1.62% | 15.2% |
| 35 | B | cls4 | resnet34 | 320 | mid | gwz | ce | 21.29 | 0.9915 | 0.9825 | 91.9% | 5 | 5.21% | 20.9% |
| 36 | B | cls4 | mobilenetv3_large_100 | 320 | weak | gwz | ce | 4.21 | 0.9937 | 0.9816 | 89.9% | 6 | 6.32% | 24.5% |
| 37 | B | cls4 | mobilenetv3_large_100 | 320 | strong | gwz | ce | 4.21 | 0.9781 | 0.9815 | 60.6% | 4 | 6.25% | 24.3% |
| 38 | B | bin | mobilenetv3_large_100 | 320 | none | gwz | ce | 4.20 | 0.9898 | 0.9814 | 85.9% | 7 | 7.61% | 28.4% |
| 39 | B | bin | mobilenetv3_large_100 | 320 | strong | gwz | ce | 4.20 | 0.9951 | 0.9805 | **100%** | 9 | 8.33% | 30.5% |
| 40 | B | bin | mobilenetv3_large_100 | 320 | mid | gwz | ce | 4.20 | 0.9974 | 0.9761 | 99.0% | 10 | 9.26% | 33.0% |
| 41 | A | bin | efficientnet_b0 | 320 | cutmix | gwz | focal | 4.01 | 0.8868 | 0.9050 | 51.3% | 5 | 4.17% | 32.2% |
| 42 | A | bin | **convnext_tiny (DINOv3)** | 320 | mid | gwz | ce | 27.82 | **0.5132** | **0.5335** | 0.0% | 0 | — | — |
> ⚠ **这张表本身带选择偏差**:在 test 上横比 42 个模型再挑最好是有偏的。
> 按 **val** 预先选定的无偏结果是 `mobilenetv3_large_100 mid gwz`(val 0.9974)→ **test 0.9913**。
> 与榜首 0.9976 差 0.0063,**这个差值就是选择偏差的量级**。
### 四分类逐类召回(`cls4_resnet34_mid_320`,A 套 test)
| GT 类别 | 张数 | 判对 | 召回 | 主要混淆去向 |
|---|---|---|---|---|
| 划痕 | 133 | 117 | 88.0% | → 崩边 8 |
| 崩边 | 68 | 64 | 94.1% | → 划痕 1、麻点 2 |
| 良品 | 185 | 176 | 95.1% | → 划痕 6 |
| **麻点** | 23 | 21 | **91.3%** | → 划痕 1、崩边 1 |
整体 acc **92.4%**,bal_acc **92.1%**,AUROC 0.9867。
> `eval.json` 里 `confusion` 的方向是 **外层 = 预测类,内层 = 真实类**。读反会得到 94.4/84.2/96.2/80.8 这组完全不同的数字。
### TTA×8(4 旋转 × 2 翻转,A 套 test AUROC)
| 模型 | 原始 | TTA | Δ |
|---|---|---|---|
| **mobilenetv3_large_100 weak** | 0.9969 | **0.9982** | +0.0013 |
| efficientnet_b0 mid | 0.9918 | 0.9949 | +0.0032 |
| vit_small mid | 0.9937 | 0.9948 | +0.0011 |
| resnet34 mid | 0.9911 | 0.9932 | +0.0021 |
| convnext_nano mid | 0.9893 | 0.9909 | +0.0016 |
| efficientnet_b0 cutmix/focal | 0.9050 | 0.9418 | +0.0368 |
| **mobilenetv3_large_100 none** | 0.9959 | **0.9925** | **−0.0034** |
| mobilenetv3_large_100 mid | 0.9913 | 0.9907 | −0.0006 |
**TTA 不是稳赢**:8 个里 2 个变差。且多数增益(+0.001~+0.003)在噪声地板以内。
唯一明确有效的是那个本来就没训好的模型(+0.037)。
---
## 三、分割 vs 分类 · 同口径对决
| | A 套 test | B 套 test |
|---|---|---|
| 分割 · 单阈值 | 71.4% @ 误报 5 | 69.7% @ 误报 5 |
| 分割 · 7 维几何 | 64.3% @ 误报 7 | 76.8% @ 误报 7 |
| **分类 · resnet34** | **94.2% @ 误报 3** | **94.9% @ 误报 7** |
| **分类 · efficientnet_b0** | **97.3% @ 误报 4** | — |
**B 套误报同为 7 时:分割 76.8% vs 分类 94.9%。**
A 套分类只花 3–4 个误报就到 94–97%,分割花 7 个误报只有 64%。
即便让分割**作弊**(阈值直接在 test 上调),最好也只有 A 74.6% / B 85.9%,仍追不上诚实的分类。
**麻点上的差距最悬殊**:分割在任何低误报阈值下 **0%**,分类 **91.3%** 且不需要任何几何工程。
---
## 四、诚实性审计
| 审计 | 数值 | 判读 |
|---|---|---|
| 批次指纹强度(`pkg_acc`) | 92.7% | 作弊**有**空间 |
| 未见类「碎」检出(`sui`) | 92.2%–100% | 学的是通用缺陷特征 ✓ |
| 跨批次泛化(A→B AUROC) | 0.9911 → 0.9862(**−0.005**) | 噪声量级 ✓ |
| **冻结特征:kNN vs 线性探针** | **0.9634 vs 0.9461** | **无可解锁捷径** ✓✓ |
| `eta2`(包解释良品分数方差) | A 0.05–0.06 / **B 0.000** | 极低 ✓ |
| 良品分数分布 | 185 张中 **169 张恰好为 0** | 非零的多是真缺陷 ✓ |
详见 [`AUDIT.md`](AUDIT.md)。
---
## 五、业务指标(产线不良率相关)
### 部署模型的阈值标定表(A 套 test,185 良品 / 224 不良)
| 档位 | 阈值 | test 误报 | test 检出 | 不良桶良品率 | 产线10%口径 | 每万片冤杀 | 每万片漏检 |
|---|---|---|---|---|---|---|---|
| 最严 | 0.787 | 4/185 | 95.5% | **1.83%** | 16.9% | 195 | 45 |
| 保守 | 0.509 | 8/185 | 98.7% | 3.49% | 28.3% | 389 | 13 |
| **平衡(默认)** | **0.459** | 8/185 | **99.1%** | 3.48% | 28.2% | 389 | 9 |
| 宽松 | 0.411 | 9/185 | 99.1% | 3.90% | 30.6% | 438 | 9 |
| 高召回 | 0.242 | 11/185 | 99.6% | 4.70% | 35.0% | 535 | 4 |
> 分数分布是双峰的,**0.51~0.79 之间几乎是空的**。真正有意义的只有「最严 0.787」和「平衡 0.459」两档。
### 产线不良率 10% 的诚实口径(`p10_honest.json`)
阈值在 val 上定、test 只评一次:
| | A 套 | B 套 |
|---|---|---|
| test 检出率 | 22.3% | 51.5% |
| test 误报 | 1/185 | 0/185 |
| **不良桶良品率** | **17.89%** | **0.00%** |
| 放行桶纯度(NPV) | 92.02% | 94.89% |
| 每万片漏检 | 777 | 485 |
| 每万片冤杀 | 49 | 0 |
**目标 1%–5% 在 A 套全部不可达。** B 套达到了,但代价是检出率只有 51.5%。
> 我此前报过 A 套 0% —— 那是**在 test 上选阈值**的结果,是错的。诚实口径是 17.89%。
**precision 随不良率的变化**(同一模型同一阈值):
| 产线不良率 | 不良桶良品率 |
|---|---|
| 54.8%(本 test) | 1.83% |
| 10% | 16.9% |
| 5% | 29.5% |
| 2% | 51.6% |
**任何 precision 数字必须绑定不良率。** 详见 [`CAVEATS.md`](CAVEATS.md)。
---
## 六、推理性能
| | CPU | GPU (RTX 4090) |
|---|---|---|
| 吞吐 | ~22 张/秒 | ~3600 张/秒 |
| 1 万张耗时 | ~7 分钟 | ~3 秒 |
| 分发体积 | 138 MB | 1.3 GB |
模型:判废 `mobilenetv3_large_100`(16.8 MB ONNX,4.2M 参数),
类型 `resnet34`(85.1 MB ONNX,21.3M 参数),均 320×320 输入。