赞
踩
异常检测(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.10
conda 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 np
import os
from pathlib import Path
from PIL import Image
from torchvision.transforms.v2 import Resize
from anomalib import TaskType
from anomalib.data.image.folder import Folder
from anomalib.deploy import ExportType, OpenVINOInferencer
from anomalib.engine import Engine
from 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,它是自定义数据集的通用类。
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/1011717
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。