ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Anomalib 中的 WinCLIP:零样本/少样本异常分类与分割模型实战指南

Anomalib 中的 WinCLIP:零样本/少样本异常分类与分割模型实战指南 Anomalib 中的 WinCLIP零样本/少样本异常分类与分割模型实战指南【免费下载链接】anomalibAn anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.项目地址: https://gitcode.com/GitHub_Trending/an/anomalibWinCLIPWindow-based CLIP是 Anomalib 库中内置的基于 CLIP 视觉-语言模型的零样本Zero-Shot/少样本Few-Shot异常检测方案无需在正常样本上训练或微调即可直接对图像进行异常分类与像素级分割定位。本文以 WinCLIP 模型文档 为核心结合仓库源码lightning_model.py、torch_model.py、prompting.py、utils.py深入讲解其工作原理、CLI 与 Python API 用法、全部可配置参数及底层实现细节帮助读者快速在自有数据集上跑通 WinCLIP 的 0-shot 与 k-shot 推理。WinCLIP 是什么不训练也能做异常检测WinCLIP 是论文WinCLIP: Zero-/Few-Shot Anomaly Classification and Segmentation的开源实现模型类型标注为 Segmentation即同时输出图像级异常分数与像素级异常图。它的核心思路是直接利用预训练 CLIP 模型对“文本描述”和“图像内容”的跨模态对齐能力把异常检测问题转化为文本语义相似度比较问题。具体来说WinCLIP 会为被测物体类别例如 transistor构造两组文本提示prompt正常状态提示如 transistor without defect无缺陷的晶体管异常状态提示如 transistor with defect有缺陷的晶体管。随后模型用 CLIP 分别提取输入图像的图像嵌入image embedding与上述提示的文本嵌入text embedding通过计算二者之间的余弦相似度得到图像级异常分数。相似度越偏向“异常文本”图像被判为异常的可能性越高。从源码可以印证这一设计torch_model.py 中固定使用ViT-B-16-plus-240主干网络来自 open_clip 的laion400m_e31预训练权重并设置了与 CLIP 论文一致的TEMPERATURE 0.07温度超参数而 utils.py 中的class_scores函数正是按论文公式1实现先计算余弦相似度再除以温度并施加 softmax最后取target_class1即异常类的分数作为异常得分。两大核心机制滑动窗口定位与少样本关联像素级定位多尺度滑动窗口仅凭整图嵌入只能做图像级分类无法定位缺陷。WinCLIP 的像素级异常定位通过在图像上以滑动窗口方式移动掩码实现对每个窗口位置重复执行与整图相同的异常分数计算将窗口的相似度分数赋给窗口覆盖的所有像素最后在不同尺度与窗口位置上用调和平均harmonic averaging聚合分数形成逐像素的异常图。源码 torch_model.py 中的_generate_masks调用 utils.py 的make_masks该函数基于 PyTorch 的unfold操作在特征图网格上以指定 kernel窗口覆盖的 patch 数和 stride 生成所有滑动窗口的掩码索引。窗口大小可调即scales参数从而把不同尺度的局部信息纳入定位预测utils.py 的harmonic_aggregation则用调和平均聚合覆盖同一 patch 的所有窗口分数——相比算术平均调和平均对低分更敏感更适合强调潜在的缺陷区域。少样本模式参考关联模块Reference Association在 few-shot 模式下模型引入一个参考关联模块它收集并存储若干张正常参考图像的基于窗口的图像嵌入推理时额外计算输入图像嵌入与正常参考图像嵌入之间的余弦相似度作为关联分数association score。最终异常分数取零样本分数与少样本关联分数的平均值。对应源码utils.py 的visual_association_score按论文公式4实现——取每个嵌入与全部参考嵌入的最小余弦距离再归一化torch_model.py 的_compute_few_shot_scores在整图 patch 尺度与每个窗口尺度上分别计算关联分数最后跨尺度取均值torch_model.py 的forward中则将零样本分数与少样本分数取平均作为最终输出。环境准备安装依赖WinCLIP 依赖open_clip库。如果缺少该依赖torch_model.py 会直接抛出ImportError并提示使用以下命令安装pip install anomalib[vlm,clip] # 或使用 uv uv pip install anomalib[vlm,clip]快速上手0-Shot 与 1-Shot 推理WinCLIP 是零样本模型无需在正常图像上训练或微调可以直接在测试集上评估。0-Shot纯零样本直接使用默认配置测试 MVTecAD 数据集anomalib test --model WinClip --data MVTecAD1-Shot一张正常参考图通过--model.k_shot指定少样本参考图像数量anomalib test --model WinClip --model.k_shot 1 --data MVTecADPython API 方式同样可以通过 Anomalib Engine 以代码方式运行from anomalib.data import MVTecAD from anomalib.engine import Engine from anomalib.models import WinClip datamodule MVTecAD(root./datasets/MVTecAD) model WinClip() # 零样本测试 Engine.test(modelmodel, datamoduledatamodule)也可直接构造模型查看关键配置from anomalib.models import WinClip # 零样本 model WinClip() # 5 张参考图的少样本模式 model WinClip(k_shot5) # 自定义类别名 model WinClip(class_nametransistor)参数详解参数类型说明默认值class_namestr用于提示词集成的类别名。留空时优先使用数据集的 category 名称如 MVTecAD 的类别若不可用则回退为object。nullk_shotint少样本模式下使用的正常参考图像数量。为0时即零样本模式。0scalestuple多尺度窗口嵌入包含的尺度集合每个整数表示窗口覆盖的 patch 数。[2, 3]few_shot_sourcestr/Path少样本参考图像的文件夹路径不提供时从训练数据中采样参考图。null类别名解析顺序lightning_model.py 的_get_class_name明确了类别名的解析顺序使用初始化时传入的class_name未传入时若 datamodule 存在category属性如 MVTecAD 各子类则使用该类别名均不可用时回退为object。k_shot 参考图收集当k_shot 0时模型会在setup阶段收集参考图lightning_model.py若指定了few_shot_source则通过PredictDataset加载该目录下的图片否则遍历训练集 DataLoader 逐批取图直到凑齐k_shot张为止。收集到的参考图会送入WinClipModel.setup预计算并缓存窗口级视觉嵌入与 patch 级嵌入。学习类型判定模型的learning_type属性根据k_shot动态返回lightning_model.pyk_shot 0时为LearningType.FEW_SHOT否则为LearningType.ZERO_SHOT。源码级原理深入固定输入与预处理WinCLIP 的输入尺寸固定为240×240不可修改。其默认预处理器lightning_model.py使用 CLIP 专属的归一化均值(0.48145466, 0.4578275, 0.40821073)与标准差(0.26862954, 0.26130258, 0.27577711)配合双三次插值Resize((240, 240))。若向configure_pre_processor传入其他image_size只会打印警告并被忽略。提示词集成Prompt Ensembleprompting.py 实现了组合式提示词集成以NORMAL_STATES如 flawless {}、{} without defect和ANOMALOUS_STATES如 damaged {}、{} with defect为状态词与TEMPLATES21 条模板如 a cropped photo of the {}.、a photo of the {} for anomaly detection.做笛卡尔积生成大量正常/异常提示。在 torch_model.py 的_collect_text_embeddings中全部提示经tokenize与encode_text编码后按类别取平均得到两个平均文本嵌入正常、异常各一条拼接后缓存为_text_embeddings供推理使用。一次前向得到三类嵌入torch_model.py 的encode_image通过向 CLIP 视觉编码器的patch_dropout层注册 forward hook 抓取中间特征图从而在一次前向中同时得到图像嵌入(N, D)用于整图分类分数窗口嵌入(N, W, D)每个尺度一组用于多尺度像素定位Patch 嵌入(N, P, D)用于少样本模式的整图尺度关联分数。前向推理的分数合成torch_model.py 的forward流程为用图像嵌入与文本嵌入计算零样本图像分数对每个尺度用窗口嵌入计算窗口分数并做调和聚合得到各尺度分数图再跨尺度按调和平均合成多尺度分数图整图被视为一个额外尺度若处于少样本模式额外计算基于参考嵌入的关联分数图与零样本分数图取平均图像分数同样与关联分数取平均将多尺度分数图双线性插值回原始图像尺寸输出InferenceBatch(pred_score, anomaly_map)分别对应图像级分数与像素级异常图。需要注意的边界与限制零训练约束configure_optimizers返回空WinCLIP 不需要优化器trainer_arguments也为空字典lightning_model.py因此该模型仅用于测试/推理不参与训练流程。固定分辨率输入被固定缩放至 240×240若任务需要更高分辨率输入需要自行扩展实现。参考图来源不指定few_shot_source时参考图从训练集 DataLoader 中顺序采样建议保证训练集为正常样本。基准数据模型文档中的 Benchmark 部分目前标注为 Coming soon...尚未发布 MVTecAD 分类别 AUC/F1 表格请勿引用未经证实的数据。参考实现与归属WinCLIP 的 torch 模型实现参考了社区两个开源项目WinCLIP-pytorch 与 WinClip 的复现实现详见 README.md 的 Attribution 部分。Anomalib 中该模型的单测覆盖了核心 torch 模型行为见 tests/unit/models/image/winclip/test_torch_model.py可作为理解与验证模型行为的补充资料。【免费下载链接】anomalibAn anomaly detection library comprising state-of-the-art algorithms and features such as experiment management, hyper-parameter optimization, and edge inference.项目地址: https://gitcode.com/GitHub_Trending/an/anomalib创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表