异常检测Anomalib现存小bug记录

本文探讨了使用Anomalib时遇到的问题,包括训练数据一致性依赖于测试集、数据类的可移植性、自定义数据集配置调整以及训练时测试集对可视化效果的影响。作者提供了关键代码片段和解决方案建议。

初试Anomalib,发现了几个小问题:

1. 相同训练数据,模型和seed均相同,但训练出的模型不一致

以MVTec数据集为例,测试集中存在良性数据(test/good)和不存在良性数据训练出的模型有一定差距。但只需在test/good目录中随便加入一个良性数据,即便该数据非良性,训练出的模型就会一致。

查看模型检查点代码如下:

import pytorch_lightning as pl
from pytorch_lightning.plugins.io import TorchCheckpointIO as tcio
ckpt_path = 'results/fastflow/mvtec/bottle/run/weights/lightning/model.ckpt'
tc = tcio()
ckpt_dict = tc.load_checkpoint(path=ckpt_path)
ckpt_dict['state_dict']

2. 数据类可移植性不强,若采用无标签的自定义数据集,需修改代码

自定义数据集若没有ground truth,无疑的是需修改配置文件,如下:

dataset:
  task: classification
model:
  early_stopping:
    metric: train_loss #不唯一
metrics:
  # pixel:      该项必须注释掉
  #   - F1Score
  #   - AUROC

还需修改anomalib-main/src/anomalib/data/mvtec.py文件中的make_mvtec_dataset()方法,否则会抛出键值不匹配异常,主要原因是代码默认加载ground truth,但实际没有。若不修改,将全部测试样本均放入test/good目录中亦可,但不建议。make_mvtec_dataset()方法修改部分如下,将红框内代码注释掉即可:

3. 训练时的测试集会影响可视化效果

训练时的测试集不同,可视化后的图像有很大差距,如下:

                

原因是测试集会影响训练保存的检查点ckpt_dict['state_dict']中的normalization_metrics.min和normalization_metrics.max,在推理时会直接采用上述两个预先保存的参数对异常图(anomaly_map)进行归一化,导致 训练集相同、测试集不同 保存的检查点可视化后的图像有很大差距,但生成的anomaly_map相同。

Tip: 模型训练时单个epoch中的迭代次数是训练+验证的总和。

在使用 `anomalib` 库进行模型训练时,其核心目标是实现无监督缺陷检测,适用于工业质检等场景。以下是基于 `anomalib` 的模型训练方法和步骤: ### 数据准备 在训练之前,需要准备好用于训练的数据集。`anomalib` 提供了多种数据模块,例如 `Folder`,允许用户通过指定文件夹路径加载自己的数据集。数据集应包含正常样本,因为无监督学习通常基于正常样本的分布进行建模 [^3]。 ```python from anomalib.data import Folder datamodule = Folder(root="path/to/dataset", normal_dir="normal", abnormal_dir="abnormal") ``` ### 模型选择 `anomalib` 支持多种无监督学习模型,例如 `PaDiM`、`PatchCore` 等。可以通过导入相应的模型类来选择模型。 ```python from anomalib.models import Patchcore model = Patchcore() ``` ### 配置文件 每个模型都需要一个 `config.yaml` 文件,用于定义模型参数、训练参数和数据增强策略。该文件通常位于 `anomalib/models/<model-name>` 目录下 [^2]。 ### 训练引擎 `anomalib` 提供了 `Engine` 类,用于管理模型的训练、验证和测试过程。通过 `Engine`,可以轻松启动训练任务。 ```python from anomalib.engine import Engine engine = Engine(model=model, datamodule=datamodule) engine.train() ``` ### 特征提取与分布估计 训练完成后,模型会利用正常样本提取特征,并为每个位置估计分布。这一步对于 PaDiM 等模型尤为重要,因为它们依赖于特征分布来检测异常 [^4]。 ### 模型测试与推理 在测试阶段,模型会计算每个像素特征与对应分布之间的马氏距离,构造 `anomaly map`,从而识别异常区域。 ```python engine.test() ``` ### 模型导出与部署 训练完成后,可以将模型导出为 ONNX 格式,以便在生产环境中部署和使用。 ```python engine.export(format="onnx") ``` ### 自定义模型支持 如果需要添加自定义模型,可以在 `anomalib/models` 目录下创建一个新的文件夹,并实现 `torch_model.py` 和 `lightning_model.py` 等文件 [^2]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值