type
status
date
slug
summary
tags
category
icon
password
Last edited time
Jun 20, 2024 05:23 PM
PatchCore中Memory Bank中对核心集选择策略
📝 主旨内容
为什么要取核心集而不是存储全部正常特征
- 减少内存占用
- 加快推理速度
- 找到代表元素,增加鲁棒性(防止过拟合,指标有所提升)
选择策略是什么
- 内层的min():
- 这个内层的min表示的是,对于每个点,找到在核心集 中与 距离最近的点 。
- 它度量的是点 到核心集中最近点 的距离。这个距离表示了 对 的代表性。
- 中层的max():
- 这个max表示在所有原始点 中,找到到其最近核心集点 的最大距离。
- 它度量的是核心集 的最坏情况,即对整个数据集 中最不利的点 ,核心集 的表现。
- 外层的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距离:
总的时间复杂度
如何优化——贪心+随机投影
- 选择起始点:随机选择指定数量的起始点。
- 计算起始点与所有点的距离矩阵。
- 计算每个点到所有起始点距离的平均值作为初始的距离值。
- 在循环中逐步选择距离值最大的点(贪心选择),然后更新每个点到已选择点的最小距离。
需要加入个点,加入之后需要更新内的点到M内点的距离
整体的贪心思路和Dijkstra以及最小生成树的Pirm算法类似
比较优化前后
ㅤ | 优化前 | 优化后 |
时间复杂度 | ||
Toothbrush类的时间 |
效果——采样率为0.1最好
指标峰值出现在采样比例为0~0.01之间
发展到3D——多库协同或全样本入库
M3DM(CVPR2020)内存占用平均6.1G,FPS仅有0.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 |
🤗 总结归纳
内鬼会在核心集的选取中被抛弃吗(异常混入内存库)
异常特征状态 | 单个离群点 | 多个离群点 | 非离群点 | 离群+非离群 |
原始方法 | ✅ | ✅ | ❌ | ㅤ |
贪心近似 | ❌ | ❌ | ✅ | ㅤ |
📎 参考文章
- 作者:ziuch
- 链接:https://ziuch.com/article/PatchCore-Memory-Bank-Coreset-Sampler?target=comment
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。
相关文章