PatchCore的代码复现

前言
在这里插入图片描述
源码地址:https://github.com/amazon-science/patchcore-inspection
论文地址:https://arxiv.org/abs/2106.08265
异常检测问题在工业图像数据分析中扮演着至关重要的角色,其目的是从大量正常数据中识别出异常行为或模式。这一任务的挑战在于,正常数据的样本相对容易获取,而异常情况却因其稀有性和多样性而难以收集。为了解决这一问题,研究者们开发了多种方法,其中一种备受关注的方法是PatchCore模型。
PatchCore模型是一种先进的工业异常检测方法,它在MVTec数据集上取得了最先进的性能(State of the Art,简称SOTA。这个数据集是工业领域内公认的用于评估异常检测算法的标准数据集,包含了多种不同类别的工业产品图像,既有正常样本也有异常样本。
PatchCore的关键优势在于它的特征提取机制。传统的异常检测方法通常需要大量的标注数据来训练模型,以学习正常和异常图像之间的差异。然而,PatchCore采用了一种不同的策略,它利用了预训练模型(如WideResNet50)来提取图像特征。这种方法的优势在于,预训练模型已经在大型数据集(如ImageNet)上学习了丰富的视觉特征,因此可以直接应用于新的任务,而无需进行额外的特征提取训练。
这里只复现代码中训练和测试流程,不对论文核心进行分析。
使用数据
数据来源https://www.mvtec.com/company/research/datasets/mvtec-ad,将其放在某个位置datapath。确保其遵循以下数据树结构:

mvtec
|-- bottle
|-----|----- ground_truth
|-----|----- test
|-----|--------|------ good
|-----|--------|------ broken_large
|-----|--------|------ ...
|-----|----- train
|-----|--------|------ good
|-- cable
|-- ...

总共有15个子数据集:bottle(瓶子),cable(电缆),capsule(胶囊),carpet(地毯),grid(网格),hazelnut(危险螺母), leather(皮革),metal_nut(金属螺母),pill(药丸 ),screw(螺丝 ),tile(瓷砖),toothbrush(牙刷 ),transistor(变压器),wood(木材),zipper(拉链)。

模型训练

run_patchcore.py
--gpu 0 # 设置GPU ID
--seed 0 # 重复性种子 
--save_patchcore_model # 如果设置,则保存PatchCore模型
--save_segmentation_images
--log_group IM224_WR50_L2-3_P01_D1024-1024_PS-3_AN-1_S0
--log_project MVTecAD_Results results # 日志详细信息:运行名称和整体项目文件夹的名称
patch_core # 现在传递所有与PatchCore相关的参数
-b wideresnet50  # 使用哪个基础网络
-le layer2 # 从哪些层提取特征
-le layer3
--faiss_on_gpu # 是否在GPU上执行相似性搜索
--pretrain_embed_dimension 1024
--target_embed_dimension 1024 # 从基础层提取的特征维度和最终聚合的PatchCore维度
--anomaly_scorer_num_nn 1 # 异常检测使用的最近邻数量
--patchsize 3 # 和局部聚合的邻居大小
sampler # 现在传递所有(Coreset-)子采样的参数
-p 0.1 approx_greedy_coreset # # 子采样百分比和精确的子采样方法
dataset # 现在传递所有与数据集相关联的参数
--resize 256 # 初始缩放形状
--imagesize 224 # 最终裁剪图片尺寸
-d wood # 选择的数据类型
mvtec \datasets\mvtec # 要使用的MVTec子数据集

出现问题1:保存结果图时总是会将原图覆盖掉,检查后发现src/patchcore/utils.py代码存在bug,进行了修改

savename = image_path.split("/")
savename = "_".join(savename[-save_depth:])
savename = os.path.join(savefolder, savename)
这三行删掉,修改成
folder_name = os.path.basename(os.path.dirname(image_path))
save_path = os.path.join(savefolder, folder_name)
if not os.path.exists(save_path):
	os.makedirs(save_path)
savename = os.path.join(save_path, os.path.basename(image_path))

出现问题2:AttributeError: ‘MVTecDataset’ object has no attribute ‘transform_std’
因为主干是基于imagenet数据集训练的,所以均值和方差都是imagenet,因此可以在patchcore/datasets/mvtec.py中,在类class MVTecDataset 的def init 的函数中加入下面两行

self.transform_std = IMAGENET_STD
self.transform_mean = IMAGENET_MEAN

模型推理

load_and_evaluate_patchcore.py
--gpu 0
--seed 0
--save_segmentation_images
"results/MVTecAD_Results/IM224_WR50_L2-3_P01_D1024-1024_PS-3_AN-1_S0/evaluateAnswer" # 保存测试结果的路径
patch_core_loader
--patch_core_paths
"results/MVTecAD_Results/IM224_WR50_L2-3_P01_D1024-1024_PS-3_AN-1_S0/models/mvtec_tile" # 前训练的模型的路径
--faiss_on_gpu
dataset
--resize 256
--imagesize 224
--num_workers 0
-d tile # 选择的数据类型
mvtec \datasets\mvtec # 要使用的MVTec子数据集

输出结果
在这里插入图片描述

### PatchCore 使用指南和教程 #### 项目概述 PatchCore 是一种用于异常检测的技术,旨在通过无监督学习的方式识别图像中的异常区域。为了帮助用户更好地理解和应用这一技术,官方提供了详细的安装与使用指南[^1]。 #### 安装步骤 按照官方文档说明,首先需要克隆仓库至本地环境: ```bash git clone https://gitcode.com/gh_mirrors/pa/PatchCore_anomaly_detection.git cd PatchCore_anomaly_detection ``` 接着依据个人需求创建虚拟环境并激活它之后,执行如下命令来安装依赖项: ```bash pip install -r requirements.txt ``` 这一步骤确保了所有必要的库都被正确加载到环境中,从而支持后续操作的顺利开展[^2]。 #### 配置文件解析 配置文件对于调整模型参数至关重要,在 `config` 文件夹下可以找到多个预定义设置选项。这些配置涵盖了训练过程中的超参设定、数据集路径指定等方面的内容。建议初次使用者先熟悉默认配置再做适当修改以适应具体应用场景的需求。 #### 启动流程 完成上述准备工作后即可运行示例脚本来测试整个系统的功能是否正常工作。通常情况下会有一个简单的例子供开发者快速验证环境搭建的成功与否。例如: ```python from patchcore import train, test if __name__ == "__main__": # 训练阶段 trainer = train.Trainer() trainer.run() # 测试阶段 tester = test.Tester() results = tester.evaluate() ``` 这段代码展示了如何调用内置接口实现基本的功能演示,同时也为更复杂的定制化开发奠定了基础。 #### 关键概念解释 - **核心算法**:基于自监督学习机制构建特征表示空间,并利用核密度估计(KDE)计算样本属于正常分布的概率得分。 - **数据处理方式**:采用随机裁剪补丁(patch)作为输入单元,经过编码器映射成低维向量后再聚合得到全局描述子。 - **评估指标体系**:主要关注ROC曲线下的面积(AUC),像素级精度(Pixel-wise Accuracy)等衡量标准来评价模型性能优劣程度。
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值