Paper Reading - 2、PatchCore: Towards Total Recall in Industrial Anomaly Detection

PatchCore 模型架构:

在这里插入图片描述

Patch: 所谓补丁,指的是像素;
Embedding: 所谓嵌入,指的是将网络提取的不同特征组合到一块;

训练流程:无神经网络参数更新,不需要训练,不需要更新参数 requires_grad==false,只需要使用预训练模型提取特征,构建 Memory Bank 相当于使用正常数据进行模型训练、构建。

推理流程:提取Patch特征,再Faiss搜索。

Pretrained Encoder: 使用预训练模型(wide_resnet50_2) backbone 提取图像特征, 采用[2, 3]层特征作为图像特征,具有较强的底层特征(轮廓、边缘、颜色、纹理和形状特征),更能够反映图像内容。不采用最后几层原因:深层特征偏向于分类任务,具有更强的语义信息。

Locally aware patch features:提取图像的 Patch特征,这个特征带有周围数据的信息。特征值的集合构建 PatchCore memory bank。

for feature in features:
    m = torch.nn. AvgPool2d(3, 1, 1)
    embeddings.append(m(feature)) # 特征值:以(h,w)为中心的邻居点集得到,论文中说使用adaptive average pooling. 实验使用AvgPool2d,指标更高。
# embedding_concat:特征连接,参考 https://github.com/xiahaifeng1995/PaDiM-Anomaly-Detection-Localization-master 
embedding = embedding_concat(embeddings[0], embeddings[1])
# reshape: 维度变换
self.embedding_list.extend(reshape_embedding(np.array(embedding)))

1、PatchCore与PaDiM对比: patchcore 使用高效的patch-feature memory bank, 在测试时所有patch都可以访问该内存库。 PaDiM 是针对每个 patch 的马氏距离度量。 相比之下, PatchCore对图像对齐的依赖性降低。
2、特征提取:特征表示为何不选择网络特征层次的最后一级:(1)会丢失更多的局部正常样本信息;(2)深层特征具有更强的语义信息,偏向于分类任务。
3、patch特征:可以理解为 训练图片上所有的点,以该点为中心的邻居点集得到的特征值,特征值的集合就是 PatchCore memory bank。
以( h , w ) 为中心,以p 为直径的正方形包围住的点;
在这里插入图片描述
围绕这些点计算的特征图上的点为:

在这里插入图片描述
一张图像的Patch特征集合:
在这里插入图片描述
正常训练集图像的Patch特征集合:
在这里插入图片描述
Coreset-reduced patch-feature memory bank:Coreset Subsampling 核心集二次抽样:稀疏采样 目的是Reduce memory bank,加快算法运行速度。

# Memory Bank:将收集到的正常图像 Patch 特征放入 MemoryBank
total_embeddings = np.array(self.embedding_list)
# Random projection  随机投影
self.randomprojector = SparseRandomProjection(n_components='auto', eps=0.9) # 'auto' => Johnson-Lindenstrauss lemma
self.randomprojector.fit(total_embeddings)
# Coreset Subsampling 核心集二次抽样:稀疏采样 Reduce memory bank
# 参考 https://github.com/google/active-learning/blob/master/sampling_methods/kcenter_greedy.py
selector = kCenterGreedy(total_embeddings,0,0)
selected_idx = selector.select_batch(model=self.randomprojector, already_selected=[], N=int(total_embeddings.shape[0]*args.coreset_sampling_ratio))
self.embedding_coreset = total_embeddings[selected_idx]

NP-Hard问题,建议使用迭代贪婪近似。
在这里插入图片描述
在这里插入图片描述
Anomaly Detection with PatchCore:

features = self(x)
embeddings = []
for feature in features:
    m = torch.nn.AvgPool2d(3, 1, 1)
    embeddings.append(m(feature))
embedding_ = embedding_concat(embeddings[0], embeddings[1])
embedding_test = np.array(reshape_embedding(np.array(embedding_)))
score_patches, _ = self.index.search(embedding_test , k=args.n_neighbors)
anomaly_map = score_patches[:,0].reshape((28,28))
N_b = score_patches[np.argmax(score_patches[:,0])]
# 论文解释:
'''
To obtain s, we use a scaling w on s∗ to account for the behaviour of neighbouring patches: 
    If the memory bank features closest to the anomaly candidate mtest,∗, m∗, 
    is itself relatively far from neighbouring samples and thereby an already rare nominal occurence, 
    we increase the anomaly score
    如果内存库特征最接近异常候选 m^test,* , m^*, 本身距离近邻样本相对较远,因此是少见的正常发生,使用权重增加异常分数。 
    相当于计算了一个softmax
'''
w = (1 - (np.max(np.exp(N_b))/np.sum(np.exp(N_b))))
score = w*max(score_patches[:,0]) # Image-level score
gt_np = gt.cpu().numpy()[0,0].astype(int)
# 将结果放大:匹配原始输入分辨率
anomaly_map_resized = cv2.resize(anomaly_map, (args.input_size, args.input_size))
# 高斯平滑
anomaly_map_resized_blur = gaussian_filter(anomaly_map_resized, sigma=4)

提取Patch特征:
在这里插入图片描述
计算异常值分数:集合P(Xtest) 到M的距离。公式arg min ||m_test - m|| 表示点m_test到集合M的距离,然后找到最远的点m_test, *。
在这里插入图片描述
在这里插入图片描述

复现:

环境问题:

# 原有环境:存在问题:roc_auc_score 不高,且在coreset_sampling_ratio=0.1,
# 文件较大(100M)时候报错:Faiss assertion 'err == CUBLAS_STATUS_SUCCESS' failed in void faiss::gpu::runMatrixMult(faiss::gpu::Tensor<float, 2, true>&, bool, faiss::gpu::Tensor<T, 2, true>&, bool, faiss::gpu::Tensor<IndexType, 2, true>&, bool, float, float, cublasHandle_t, cudaStream_t) [with AT = float; BT = float; cublasHandle_t = cublasContext*; cudaStream_t = CUstream_st*] at /project/faiss/faiss/gpu/utils/MatrixMult-inl.cuh:265; details: cublas failed (13): (512, 1536) x (16385, 1536)' = (512, 16385) gemm params m 16385 n 512 k 1536 trA T trB N lda 1536 ldb 1536 ldc 16385
pytorch-lightning==1.2.0
torch==1.9.0+cu111
faiss-gpu==1.7.1.post3

# 尝试解决:重新安装faiss-gpu; 结果:roc_auc_score在0.001,0.01的指标变得正常,在0.1(coreset_sampling_ratio越大)时候,稀疏采样(selector.select_batch)越慢 ,
conda install -c pytorch faiss-gpu cudatoolkit=11.0 

常用的自定义数据格式:

data:
├── test
│   ├── good
│   └── ng
└── train
    └── good

Resource:
Paper: https://arxiv.org/abs/2106.08265
Code: https://github.com/hcw-00/PatchCore_anomaly_detection
论文解读:https://blog.csdn.net/fuyouzhiyi/article/details/124725323
https://www.zywvvd.com/notes/study/deep-learning/anomaly-detection/patchcore/patchcore/

  • 5
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
### 回答1: "朝着工业异常检测的全面回忆迈进"是指致力于实现在工业生产过程中对异常情况的全面回溯和记录。这样的系统可以帮助企业快速识别和解决异常情况,提高生产效率和质量。实现这样的系统需要采集大量的生产数据,并利用先进的算法进行处理和分析。同时,还需要建立可靠的数据存储和管理系统,确保数据的完整性和安全性。总的来说,实现工业异常检测的全面回溯需要跨学科的协作和技术的支持。 ### 回答2: 在工业系统中,异常检测是一个非常关键的任务,一旦异常被检测到,可以及时采取措施来避免生产线的停滞和工业事故的发生。为了提高异常检测的准确性和效率,研究人员正在不断尝试将人类的记忆方式应用到机器学习中,实现“完全回忆”。 目前,工业异常检测中常用的方法是基于统计学的方法,但这些方法的缺点是需要大量的数据和专业知识,而且无法处理复杂和多变的数据。相反,人类的大脑能够准确地理解环境中的各种信号,并快速地做出反应。为了实现这种类似于人类的记忆功能,人工智能领域提出了不同的方法,如深度学习、神经网络等。 其中,深度学习已经被证明是在工业异常检测中最有效的方法之一,尤其是在处理大量数据时。深度学习模型可以通过输入工业数据和异常数据进行训练,在预测生产过程中的异常时表现出色。但是,为了实现“完全回忆”,还需要解决模型在面对新型异常时的适应问题。 一个可能的解决方案是构建一个基于迁移学习的模型,该模型可以从已有的异常数据中学习到经验,并在发现新型异常时自动适应。此外,研究人员可以尝试使用更加先进的人工智能技术,如注意力机制和增强学习,来提高模型的准确性和可靠性。 总之,通过应用类似于人类记忆功能的深度学习模型和其他人工智能技术,工业异常检测可以更加准确、高效,并可以实现“完全回忆”。这将对工业生产的安全和效率有着积极的影响。 ### 回答3: 近年来,随着物联网技术的快速发展,大量的传感器数据被收集并用于工业异常检测。异常检测是工业生产中非常重要的一个环节,它能帮助企业实时识别和处理生产过程中的异常情况,从而提高生产效率、降低成本、提升产品质量。但工业环境下存在各种噪声、复杂运行条件和复杂的生产过程等挑战,因此确保工业异常检测的精确性至关重要。 为了实现更精确的工业异常检测,研究人员提出了“全面回忆”的概念,旨在通过利用所有可用信息来识别一些异常情况。具体来说,全面回忆从三个方面着手:一是从数据收集开始,尽可能多地收集机器的输出数据。二是利用深度学习等技术有效地处理这些数据,从而进行分类和聚类分析。三是结合专家领域知识,利用额外的信息来完成异常识别和分析。 实现全面回忆的目标需要考虑多个方面的技术挑战。首先,需要设计创新的数据集、流水线和算法,以捕获复杂工业环境中的多方面信息和随时间变化的变化情况。其次,需要利用大规模的计算机资源来实现高效的数据处理和模型训练。此外,还需要设计到位的专家领域知识建模和融合策略,以确保高准确度和高鲁棒性的异常检测。 总之,全面回忆是工业异常检测研究领域的一个重要方向,它将为挖掘大量生产数据提供强有力的支持,有望为工业生产的智能化和智能化水平提高做出重要贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值