Skip to content

ML IL PatchCore #537

@junxnone

Description

@junxnone

PatchCore 持续学习

  • PatchCore 核心是基于特征记忆库(Memory Bank/Coreset) 的非参数化方法,非常适合改造为增量更新模式。核心思路是:不重训整个模型,只动态新增、合并或修剪特征记忆库,避免灾难性遗忘

PatchCore 持续学习的核心原理

标准 PatchCore 训练:

  1. 用预训练模型(如 WideResNet50)提取正常样本的补丁特征(Patch Features)
  2. 贪婪核心集(Coreset) 算法压缩特征,构建记忆库 M
  3. 推理时计算测试特征与 M 的最近邻距离,得到异常分数

持续学习改造关键点

  • 不更新预训练主干网(避免遗忘旧特征)
  • 只增量更新 Coreset 记忆库
  • k-center 贪心策略 动态插入新特征
  • 控制内存库总大小,防止无限膨胀

方案

方案 1:简单增量合并(最易实现)

新数据来了,直接提取特征并合并到旧库,再重新做 Coreset 采样。

步骤

  1. 加载已训练好的 PatchCore 模型(含旧 Coreset M_old
  2. 对新增正常数据提取补丁特征 F_new
  3. 合并特征:M_combined = np.concatenate([M_old, F_new])
  4. 重新运行 Coreset 采样,得到新记忆库 M_new
  5. 保存 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,避免冗余
  • 避免:频繁全量重训;持续学习只更记忆库,不更主干网

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions