 Shaun ZhouandClaude Opus 5
|
65bc6b2045
|
feat(boxes): 新增传统 CV 定位方法(--method cv),不依赖分类模型
背景差分:大半径方框均值估背景 → 残差(可选极性)→ 平滑 → 有无判定 → 按峰值归一化,
再交给与 gradcam / shap 同一套 cam_to_boxes 出框。只依赖 numpy。
与归因方法的差别:不需要 --checkpoint,分类器还没训练出来就能先跑一版框,也不受分类
精度影响;类别只能来自目录(--target label);找的是偏离局部背景的区域,而不是模型
据以判断类别的区域,所以对局部目标好、对铺满整图的纹理类给不出有意义的框。
有无缺陷是显式判定的:残差峰值要同时高于绝对对比度下限与噪声水平(MAD 估计)的 15 倍,
否则返回全零图。这条是必需的——实测纯噪声图的"峰值/MAD"稳定在 9 附近(最大 10.9,
几乎与噪声大小无关),有 0.25 对比度黑点时是 25~330;若只按峰值归一化,正常图的噪声
会被拉到 1,满图假框。阈值 15 取在两者之间。
顺带把积分图方框均值从 shap_explain.smooth 提到 engine/classical.box_mean 共用,
避免两处实现各自漂移。
实测:单张 0.011 秒(全量 11k 约 2 分钟);真实薄膜图上框能套住黑点、虫状物与划痕。
已知局限:背景估计在图像边界处对明暗阶跃有响应,贴边的交界可能出假框。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-09-17 11:03:13 +08:00 |
|
 Shaun ZhouandClaude Opus 5
|
32e56cb230
|
feat(boxes): generate_boxes.py 的 --target 默认改为 label
框的类别应该来自人工归类(图片所在目录),分类模型只负责定位。原先默认 predicted,
框的类别取模型 top1 预测,模型分错的图会把错误类别写进标签:boxes_shap 那次预测与
目录一致率 0.9915,约 95 张图的类别因此是错的。
两种取值只在预测与目录不一致的图上有区别,其余图解释的是同一个 logit、框完全相同。
--target predicted 仍保留。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-09-15 20:31:40 +08:00 |
|
 Shaun ZhouandClaude Opus 5
|
86c86b105c
|
refactor: 按实际的五步工作流裁掉无关代码
实际工作流是:simclr 训练 -> 聚类 -> 人工归类 -> 分类训练 -> GradCAM/SHAP 生成
热力图与 box。据此移除不参与其中的检测/定位链路,共 31 个文件、约 2600 行:
- 模型:defect_net、postprocess、necks/、heads/center_head
- 数据:film_defect(YOLO 读取端)、target_encoder
- 引擎:trainer、evaluator、losses
- 入口:train.py、eval.py
- 脚本:convert_annotations、split_dataset、export_onnx、profile_inference
- 配置:configs/{train,eval,model,dataset}
- utils/labels(多类/单类标签模式,仅检测分类头使用)
共享模块按实际用量瘦身:engine/metrics 只留 AverageMeter(检测指标随之移除);
datasets/yolo 只留写出侧(IMAGE_SUFFIXES 与 write_data_yaml)——第 5 步产出的
YOLO 标签是给外部检测训练用的交换格式,读取端不再需要。
裁剪过程中修掉一个真 bug:generate_boxes 的 --stage 默认 6(layer3)对 tiny_conv
这类非 nn.Sequential 骨架直接抛异常。现在自动退回骨架最终输出并警告,
另加 --stage -1 显式选择最终输出。
五步工作流已端到端实跑验证(simclr 1 轮 -> 聚类 -> 导出 -> 分类 1 轮 ->
gradcam 与 shap 两种方法各生成一遍)。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-09-11 10:27:20 +08:00 |
|
 Shaun ZhouandClaude Opus 5
|
57446c2f10
|
refactor: 合并为单一的框生成入口,gradcam / shap 可选,默认全量
此前是两个脚本:gradcam_boxes.py 全量跑但只有一种方法,shap_boxes.py 默认抽样
且强制输出对比图。两者合并为 scripts/generate_boxes.py:
- --method gradcam|shap 二选一,默认 gradcam
- 默认对全量数据生成;--limit / --per-class 降级为试参数用的可选项
- --min-area-ratio 缺省随方法而变(gradcam 0.02、shap 0.002):两者归因图分辨率差
16 倍,同一个小黑点在 128x128 上只占百来像素,共用阈值会被整个滤掉
产出改为符合 CLAUDE.md 工作流第 8 步的规格,是一个自成一体的 YOLO 数据集:
images/ 是原图硬链接、labels/ 是 YOLO 标签、heatmaps/ 是热力图叠加框。
images/ 与 labels/ 的对应关系符合仓库的 YOLO 约定,FilmDefectDataset 可直接读取,
把分类产出接回了检测训练链路(已加测试验证这条闭环)。
热力图目标类别改为模型 top1 预测(原为目录标注),--target label 可切回;
summary.json 记录两者一致率(实测 0.9873)。
修掉一个会静默丢标签的 bug:产出按预测类别分目录,不同源目录下的同名图
(dirA/x.png 与 dirB/x.png)若被预测到同一类会写同一个标签路径,后写的覆盖前者。
现在显式检测并中止,提示用 export_clusters.py --prefix-parent 重新导出。
Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
|
2026-09-10 16:26:56 +08:00 |
|