type
status
date
slug
summary
tags
category
icon
password
Last edited time
Jun 20, 2024 05:23 PM
😀
PatchCore中Memory Bank中对核心集选择策略

📝 主旨内容

为什么要取核心集而不是存储全部正常特征

  1. 减少内存占用
  1. 加快推理速度
  1. 找到代表元素,增加鲁棒性(防止过拟合,指标有所提升)

选择策略是什么

notion image
notion image
notion image
  1. 内层的min():
      • 这个内层的min表示的是,对于每个点,找到在核心集 中与 距离最近的点
      • 它度量的是点 到核心集中最近点 的距离。这个距离表示了 的代表性。
  1. 中层的max():
      • 这个max表示在所有原始点 中,找到到其最近核心集点 的最大距离。
      • 它度量的是核心集 的最坏情况,即对整个数据集 中最不利的点 ,核心集 的表现。
  1. 外层的min():
      • 这个外层的min表示在所有可能的核心集 中,找到一个核心集使得上面所述的最坏情况下的最大距离最小化。
      • 它确保选择的核心集 在最坏情况下也能尽可能地代表原始数据集
💡
进行抽样时,要使预抽样的特征向量(m)和后抽样的特征向量中的最大最小距离最小

min和max可以交换吗——不能

  • 代表性问题:如果先min再max,表达的意义就完全变了。min表示找到离核心集中某点最近的原始点,而max表示取其中距离最大的原始点。这样的话,核心集中的每个点都找一个最近的原始点,然后在这些点中找最大的那个,这并不能代表整体数据的最坏情况,也无法保证核心集在最坏情况下的表现。
  • 优化目标不同:max-min和min-max在优化目标上是不同的。原公式的目标是优化最坏情况的表现(minimize the maximum distance),而调换位置后就变成了优化某些局部最优情况,这不符合核心集选择的目标。
    • 举例说明
      假设有三个点 和两个核心集点
    • 如果按照 ,我们会先找到每个点到核心集中最近点的距离,然后选择这些距离中的最大值,最后选择一个核心集使这个最大值最小。
    • 如果调换位置为 ,则会先找每个核心集中点到最远原始点的距离,再选取这些距离中的最小值,这并不能保证最坏情况下的优化效果。
举例
n1
n2
n3
m1
2
5
8
m2
3
4
7
m3
1
9
6

为什么不能直接求解——求解空间大(NP-hard)

求解空间大小

求解的时间复杂度

求解的伪代码

MVtec AD数据集统计数据
Category
# Train
# Test (good)
# Test (defective)
# Defect groups
# Defect regions
Image side length
Carpet
280
28
89
5
97
1024
Grid
264
21
57
5
170
1024
Leather
245
32
92
5
99
1024
Tile
230
33
84
5
86
840
Wood
247
19
60
5
168
1024
Bottle
209
20
63
3
68
900
Cable
224
58
92
8
151
1024
Capsule
219
23
109
5
114
1000
Hazelnut
391
40
70
4
136
1024
Metal Nut
220
22
93
4
132
700
Pill
267
26
141
7
245
800
Screw
320
41
119
5
135
1024
Toothbrush
60
12
30
1
66
1024
Transistor
213
60
40
4
44
1024
Zipper
240
32
119
7
177
1024
Total
3629
467
1258
73
1888
-
最大子集数量
最大子集预估计算时间
最小子集数量
最小子集预估计算时间

被忽略的时间开销

枚举每个方案 O(len())
itertools.combinations的实现
计算特征距离 O(cnt(F))
时,是欧氏距离 (L2 Distance):
时,是曼哈顿距离 (L1 Distance):
时,是L3距离:
总的时间复杂度

如何优化——贪心+随机投影

  1. 选择起始点:随机选择指定数量的起始点。
  1. 计算起始点与所有点的距离矩阵。
  1. 计算每个点到所有起始点距离的平均值作为初始的距离值。
  1. 在循环中逐步选择距离值最大的点(贪心选择),然后更新每个点到已选择点的最小距离。
💡
需要加入个点,加入之后需要更新内的点到M内点的距离
💡
整体的贪心思路和Dijkstra以及最小生成树的Pirm算法类似

比较优化前后

优化前
优化后
时间复杂度
Toothbrush类的时间

效果——采样率为0.1最好

💡
指标峰值出现在采样比例为0~0.01之间
notion image
notion image

发展到3D——多库协同或全样本入库

💡
M3DM(CVPR2020)内存占用平均6.1G,FPS仅有0.1
notion image
notion image

可能的原因

  1. 追求精度
  1. 硬件资源充足?
  1. 少样本
MvTec AD(img)
MVtec 3D-AD(img+3d)
Eyecandies(img+3d)
Real3D-AD(3d)
Anomaly-ShapeNet(3d)
每个类正常样本数目
60~391
210~361
1000
4
4
MvTec 3D-AD Datasets
MvTec 3D-AD Datasets
Real3D-AD Datasets
Real3D-AD Datasets

🤗 总结归纳

内鬼会在核心集的选取中被抛弃吗(异常混入内存库)

异常特征状态
单个离群点
多个离群点
非离群点
离群+非离群
原始方法
贪心近似

📎 参考文章

数据结构与算法讲义(Python版)ChatPaper-Click——让GPT4帮你解读论文
Loading...