基于OpenVINO实现无监督异常检测

打印 上一主题 下一主题

主题 1682|帖子 1682|积分 5046

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
    异常检测(AD) 在欺诈检测、网络安全和医疗诊断等关键使命应用中至关重要。由于数据的高维性和底层模式的复杂性,图像、视频和卫星图像等视觉数据中的异常检测尤其具有挑战性。然而,视觉异常检测对于检测制造中的缺陷、辨认监控录像中的可疑运动以及检测医学图像中的异常至关重要。
    在本文中,您将学习怎样使用OpenVINO 工具包中的FiftyOne和Anomalib对视觉数据实行异常检测。为了演示,我们将使用MVTec AD 数据集,此中包罗具有划痕、凹痕和孔洞等异常的各种物体的图像。
    它涵盖以下内容:




    • 在 FiftyOne 中加载 MVTec AD 数据集
    • 使用 Anomalib 训练异常检测模子
    • 评估 FiftyOne 中的异常检测模子

安装依赖项
    确保你在假造环境中运行它python=3.10。Anomalib 必要 Python 3.10,因此请确保你安装了正确的版本。
  1. conda create -n anomalib_env python=3.10conda activate anomalib_env
复制代码
    以后,按照Anomalib README中的阐明从源代码安装 Anomalib及其依赖项。这些在 Google Colab 上可能必要一些时间,但对于本地安装应该很快:



  1. 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用于降维

  1. pip install -U huggingface_hub umap-learn git+https://github.com/openai/CLIP.git
复制代码
加载和可视化 MVTec AD 数据集
    如今,让我们从FiftyOne导入我们必要的全部相干模块:​​​​​​​
  1. 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 数据集:
  1. dataset = fouh.load_from_hub("Voxel51/mvtec-ad", persistent=True, overwrite=True)
复制代码
    在继承之前,让我们看一下FiftyOne 应用程序中的数据集:
  1. session = fo.launch_app(dataset)
复制代码

    该数据集包罗 12 个对象类别的 5354 张图像。每个类别都有“良好”和“异常”图像,这些图像存在划痕、凹痕和孔洞等缺陷。每个异常样本还带有一个掩模,用于定位图像中的缺陷区域。
    缺陷标签因类别而异,这在实际世界的异常检测场景中很常见。在这些场景中,您会为每个类别训练不同的模子。在这里,我们将先容一个类别的流程,您可以将相同的步骤应用于其他类别。
    还有一点必要注意的是,数据集被分为训练集和测试集。训练集只包罗“良好”图像,而测试集则包罗“良好”和“异常”图像。
    在训练模子之前,让我们深入研究数据集。通过盘算图像嵌入并在低维空间中可视化它们,我们可以了解数据中隐蔽的布局和模式。首先,我们将使用 CLIP 模子盘算数据集中全部图像的嵌入:​​​​​​​
  1. model = foz.load_zoo_model( "clip-vit-base32-torch" )   # 从 zoo 加载 CLIP 模型
  2. # 计算数据集的嵌入dataset.compute_embeddings(     model=model, embeddings_field= "clip_embeddings" , batch_size= 64 )
  3. # 使用 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 和辅助模块导入处置处罚图像和路径所需的模块:
​​​​​​​
  1. import numpy as npimport osfrom pathlib import Pathfrom PIL import Imagefrom torchvision.transforms.v2 import Resize
  2. 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 像素。







  1. OBJECT = "bottle"  ## 要训练的对象ROOT_DIR = Path( "/tmp/mvtec_ad" ) ## 用于存储 anomalib 数据的根目录TASK = TaskType.SEGMENTATION ## 模型的任务类型IMAGE_SIZE = ( 256 , 256 ) ## 预处理图像大小以保证均匀性
复制代码
    对于给定的对象范例(类别),create_datamodule()下面的函数会创建一个 AnomalibDataModule对象。这将被通报到我们引擎的fit()方法来训练模子,并用于实例化数据加载器以进行训练和验证。
    代码可能看起来很复杂,所以让我们分解一下发生了什么:




    • 我们创建的数据子集仅包罗“良好”的训练图像和“异常”图像以供验证。
    • 我们将图像和掩码符号链接到 Anomalib 渴望的目次。
    • 我们从 Anomalib 实例化并设置一个数据模块Folder,它是自界说数据集的通用类。

    
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连密封材料

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表