PatchCore 持续学习
- PatchCore 核心是基于特征记忆库(Memory Bank/Coreset) 的非参数化方法,非常适合改造为增量更新模式。核心思路是:不重训整个模型,只动态新增、合并或修剪特征记忆库,避免灾难性遗忘。
PatchCore 持续学习的核心原理
标准 PatchCore 训练:
- 用预训练模型(如 WideResNet50)提取正常样本的补丁特征(Patch Features)
- 用 贪婪核心集(Coreset) 算法压缩特征,构建记忆库
M
- 推理时计算测试特征与
M 的最近邻距离,得到异常分数
持续学习改造关键点:
- 不更新预训练主干网(避免遗忘旧特征)
- 只增量更新 Coreset 记忆库
- 用 k-center 贪心策略 动态插入新特征
- 控制内存库总大小,防止无限膨胀
方案
方案 1:简单增量合并(最易实现)
新数据来了,直接提取特征并合并到旧库,再重新做 Coreset 采样。
步骤:
- 加载已训练好的 PatchCore 模型(含旧 Coreset
M_old)
- 对新增正常数据提取补丁特征
F_new
- 合并特征:
M_combined = np.concatenate([M_old, F_new])
- 重新运行 Coreset 采样,得到新记忆库
M_new
- 保存
M_new 覆盖旧库
优点:实现简单、精度稳定
缺点:数据量大时合并+重采样较慢
方案 2:在线增量 Coreset(推荐,工业级)
增量 k-center 插入:新特征逐个/分批加入,不重训全量 Coreset。
核心逻辑:
- 对每个新特征
x,计算到现有记忆库的最小距离 d_min
- 若
d_min > 阈值(或随机),将 x 加入记忆库
- 定期修剪:移除冗余/近邻特征,控制库大小
优点:速度快、内存可控、适合流水线
缺点:需调距离阈值与最大容量
方案 3:多域/多类别持续学习(防遗忘)
生产中常有多产品切换,需保留旧类别记忆。
实现方式:
- 为每个类别维护独立 Coreset:
memory = {"bottle": M1, "cable": M2}
- 推理时自动匹配对应类别记忆库
- 新增类别时直接新建记忆库,不覆盖旧库
关键参数与避坑
- Coreset 比例:
coreset_ratio=0.05~0.1,平衡精度与速度
- 最大内存大小:
max_memory_size=10000~50000,防内存爆炸
- 距离阈值:新特征插入阈值
1e-3~1e-2,避免冗余
- 避免:频繁全量重训;持续学习只更记忆库,不更主干网
PatchCore 持续学习
PatchCore 持续学习的核心原理
标准 PatchCore 训练:
MM的最近邻距离,得到异常分数持续学习改造关键点:
方案
方案 1:简单增量合并(最易实现)
新数据来了,直接提取特征并合并到旧库,再重新做 Coreset 采样。
步骤:
M_old)F_newM_combined = np.concatenate([M_old, F_new])M_newM_new覆盖旧库优点:实现简单、精度稳定
缺点:数据量大时合并+重采样较慢
方案 2:在线增量 Coreset(推荐,工业级)
增量 k-center 插入:新特征逐个/分批加入,不重训全量 Coreset。
核心逻辑:
x,计算到现有记忆库的最小距离d_mind_min> 阈值(或随机),将x加入记忆库优点:速度快、内存可控、适合流水线
缺点:需调距离阈值与最大容量
方案 3:多域/多类别持续学习(防遗忘)
生产中常有多产品切换,需保留旧类别记忆。
实现方式:
memory = {"bottle": M1, "cable": M2}关键参数与避坑
coreset_ratio=0.05~0.1,平衡精度与速度max_memory_size=10000~50000,防内存爆炸1e-3~1e-2,避免冗余