File size: 13,787 Bytes
0e9808f | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 | # 全部实验结果
**阅读前提**:所有 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 输入。
|