马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
x
异常检测(AD) 在欺诈检测、网络安全和医疗诊断等关键使命应用中至关重要。由于数据的高维性和底层模式的复杂性,图像、视频和卫星图像等视觉数据中的异常检测尤其具有挑战性。然而,视觉异常检测对于检测制造中的缺陷、辨认监控录像中的可疑运动以及检测医学图像中的异常至关重要。
在本文中,您将学习怎样使用OpenVINO 工具包中的FiftyOne和Anomalib对视觉数据实行异常检测。为了演示,我们将使用MVTec AD 数据集,此中包罗具有划痕、凹痕和孔洞等异常的各种物体的图像。
它涵盖以下内容:
- 在 FiftyOne 中加载 MVTec AD 数据集
- 使用 Anomalib 训练异常检测模子
- 评估 FiftyOne 中的异常检测模子
安装依赖项
确保你在假造环境中运行它python=3.10。Anomalib 必要 Python 3.10,因此请确保你安装了正确的版本。
- conda create -n anomalib_env python=3.10conda activate anomalib_env
复制代码 以后,按照Anomalib README中的阐明从源代码安装 Anomalib及其依赖项。这些在 Google Colab 上可能必要一些时间,但对于本地安装应该很快:
- pip install -U torchvision einops FrEIA timm open_clip_torch imgaug lightning kornia openvino git+https://github.com/openvinotoolkit/anomalib.git
复制代码 我们预备安装更多软件包。如今您可以明白为什么我们建议为该项目使用假造环境!
- huggingface_hub用于加载 MVTec AD 数据集
- clip用于盘算图像嵌入
- umap-learn用于降维
- pip install -U huggingface_hub umap-learn git+https://github.com/openai/CLIP.git
复制代码 加载和可视化 MVTec AD 数据集
如今,让我们从FiftyOne导入我们必要的全部相干模块:
- import fiftyone as fo # 基础库和应用程序import fiftyone.brain as fob # ML 方法import fiftyone.zoo as foz # zoo 数据集和模型from fiftyone import ViewField as F # 定义视图的助手import fiftyone.utils.huggingface as fouh # Hugging Face 集成
复制代码 并从 Hugging Face Hub 加载 MVTec AD 数据集:
- dataset = fouh.load_from_hub("Voxel51/mvtec-ad", persistent=True, overwrite=True)
复制代码 在继承之前,让我们看一下FiftyOne 应用程序中的数据集:
- session = fo.launch_app(dataset)
复制代码
该数据集包罗 12 个对象类别的 5354 张图像。每个类别都有“良好”和“异常”图像,这些图像存在划痕、凹痕和孔洞等缺陷。每个异常样本还带有一个掩模,用于定位图像中的缺陷区域。
缺陷标签因类别而异,这在实际世界的异常检测场景中很常见。在这些场景中,您会为每个类别训练不同的模子。在这里,我们将先容一个类别的流程,您可以将相同的步骤应用于其他类别。
还有一点必要注意的是,数据集被分为训练集和测试集。训练集只包罗“良好”图像,而测试集则包罗“良好”和“异常”图像。
在训练模子之前,让我们深入研究数据集。通过盘算图像嵌入并在低维空间中可视化它们,我们可以了解数据中隐蔽的布局和模式。首先,我们将使用 CLIP 模子盘算数据集中全部图像的嵌入:
- model = foz.load_zoo_model( "clip-vit-base32-torch" ) # 从 zoo 加载 CLIP 模型
- # 计算数据集的嵌入dataset.compute_embeddings( model=model, embeddings_field= "clip_embeddings" , batch_size= 64 )
- # 使用 UMAP 对嵌入进行降维fob.compute_visualization( dataset, embeddings= "clip_embeddings" , method= "umap" , brain_key= "clip_vis" )
复制代码 革新 FiftyOne 应用程序,单击“+”选项卡,然后选择“Embeddings”。从下拉菜单中选择“all_clip_vis”。您将看到 2D 空间中图像嵌入的散点图,此中每个点对应于数据集中的一个样本。
使用颜色下拉菜单,注意嵌入怎样根据对象类别进行聚类。这是因为 CLIP 对图像的语义信息进行编码。此外,CLIP 嵌入不会根据缺陷范例在类别内进行聚类。
训练异常检测模子
如今我们对数据集有了了解,我们预备使用 Anomalib 训练异常检测模子。
使命:Anomalib 支持图像的分类、检测和分割使命。我们将重点关注分割,此中模子猜测图像中的每个像素是否异常,并创建一个定位缺陷的掩码。
模子:Anomalib 支持多种异常检测算法。在本演练中,我们将使用两种算法:
- PaDiM:用于异常检测和定位的补丁分布建模框架
- PatchCore:迈向工业异常检测的全面召回
预处置处罚:在训练模子之前,我们将在本演练中将图像巨细调整为 256x256 像素。通过 Torchvision 的 Resize 类将其添加为转换,我们可以在训练和推理过程中动态调整图像巨细。
从Anomalib 和辅助模块导入处置处罚图像和路径所需的模块:
- import numpy as npimport osfrom pathlib import Pathfrom PIL import Imagefrom torchvision.transforms.v2 import Resize
- from anomalib import TaskTypefrom anomalib.data.image.folder import Folderfrom anomalib.deploy import ExportType, OpenVINOInferencerfrom anomalib.engine import Enginefrom anomalib.models import Padim, Patchcore
复制代码 如今,界说一些在整个条记本中使用的常量。
- OBJECT:我们将重点关注的对象类别。在本演练中,我们将使用“瓶子”。假如您想要循环遍历类别,可以使用 dataset.distinct("category.label") 从数据集中获取类别列表。
- ROOT_DIR:Anomalib 将在此中查找图像和掩码的根目次。我们的数据已存储在磁盘上,因此我们只需将文件符号链接到 Anomalib 所需的目次即可。
- TASK:我们正在实行的使命。我们将在本演练中使用“分段”。
- IMAGE_SIZE:在训练模子之前调整图像的巨细。我们将使用 256x 256 像素。
- OBJECT = "bottle" ## 要训练的对象ROOT_DIR = Path( "/tmp/mvtec_ad" ) ## 用于存储 anomalib 数据的根目录TASK = TaskType.SEGMENTATION ## 模型的任务类型IMAGE_SIZE = ( 256 , 256 ) ## 预处理图像大小以保证均匀性
复制代码 对于给定的对象范例(类别),create_datamodule()下面的函数会创建一个 AnomalibDataModule对象。这将被通报到我们引擎的fit()方法来训练模子,并用于实例化数据加载器以进行训练和验证。
代码可能看起来很复杂,所以让我们分解一下发生了什么:
- 我们创建的数据子集仅包罗“良好”的训练图像和“异常”图像以供验证。
- 我们将图像和掩码符号链接到 Anomalib 渴望的目次。
- 我们从 Anomalib 实例化并设置一个数据模块Folder,它是自界说数据集的通用类。
|