| # 全部实验结果 |
|
|
| **阅读前提**:所有 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 输入。 |
| |