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 输入。