十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

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

Anomalib 滤镜组件详解:GaussianBlur2d 高斯平滑的实现原理与异常图应用

Anomalib 滤镜组件详解:GaussianBlur2d 高斯平滑的实现原理与异常图应用 Anomalib 滤镜组件详解GaussianBlur2d 高斯平滑的实现原理与异常图应用【免费下载链接】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/anomalibanomalib.models.components.filters是 Anomalib 中为异常检测模型提供图像预处理与特征增强滤镜的基础模块当前核心也是唯一对外导出的组件是GaussianBlur2d——一个预计算核的 2D 高斯模糊滤波器。它的直接用途是对 patch 级/像素级异常分数做平滑生成更干净、更连贯的异常热力图。读完本篇你将理解GaussianBlur2d的完整参数体系、核尺寸自动计算公式、前向传播的填充与分组卷积流程以及它在 PatchCore、PADI-M、CFA、DiNOmaly 等十余个模型中的具体用法与调参要点。该模块的 API 参考页由 filters 参考文档 通过 Sphinxautomodule指令直接生成本文在此基础上结合源码与测试做纵深展开。模块定位filters 在组件体系中的位置filters包本身非常精简仅包含 GaussianBlur2d 的实现文件其 包初始化文件 的模块 docstring 明确了定位This module provides filter implementations that can be used for image preprocessing and feature enhancement in anomaly detection models.并通过__all__ [GaussianBlur2d]只暴露这一个类。从源码结构看该模块处于anomalib.models.components模型公共组件这一层之下与PCA、GaussianKDE、TimmFeatureExtractor等并列。components 包的__init__.py将其归入 Image Processing 类别并重新导出from .filters import GaussianBlur2d __all__ [ ... GaussianBlur2d, ... ]因此实际使用中既可以从anomalib.models.components顶层导入也可以从anomalib.models.components.filters直接导入仓库中两种写法都有使用。GaussianBlur2d API 参考参数、默认值与设计取舍GaussianBlur2d是nn.Module子类源码位于 blur.py L48-L108。构造函数签名与参数语义如下参数类型默认值说明sigmafloat \| tuple[float, float]必填高斯核标准差。传单个 float 时横、纵两个维度共用传二元组可分别指定channelsint1输入通道数。异常图通常为 1RGB 图像为 3kernel_sizeint \| tuple[int, int] \| NoneNone高斯核尺寸。为None时由 sigma 自动推算支持(kh, kw)各向异性核normalizeboolTrue是否将核元素归一化到和为 1保证平滑不改变图像整体亮度border_typestrreflectpaddingsame时的边界填充模式可选reflect、replicate等paddingstrsame填充策略。same输出与输入同尺寸valid输出收缩为(H-kh1, W-kw1)与许多高斯模糊实现例如 kornia 原生的GaussianBlur2d在前向时即时构造核不同本类在__init__阶段就预计算好核这一取舍在源码 docstring 中被明确说明this class pre-computes the Gaussian kernel during initialization rather than computing it during the forward pass. This approach is more efficient but requires specifying the number of input channels upfront.——即以必须提前知道通道数为代价换取前向阶段的效率。初始化时的核构造链路blur.py L97-L108self.kernel: torch.Tensor # 1. 借助 kornia 生成二维高斯核 self.register_buffer(kernel, get_gaussian_kernel2d(kernel_sizekernel_size, sigmasigma)) # 2. 可选归一化元素和为 1 if normalize: self.kernel normalize_kernel2d(self.kernel) # 3. 展开为 (1, 1, kh, kw)再沿通道维度扩展为 (C, 1, kh, kw) self.kernel self.kernel.view(1, 1, *self.kernel.shape[-2:]).expand(self.channels, -1, -1, -1) # 4. 记录尺寸预计算 same 填充所需的 padding 形状 self.height, self.width self.kernel.shape[-2:] self.padding_shape _compute_padding([self.height, self.width])几个值得注意的实现细节核通过register_buffer注册随模型.to(device)/.cuda()自动迁移设备且不会进入优化器参数核被扩展成(C, 1, kh, kw)形状前向时用groupsC的分组卷积实现每通道独立卷积等价于对每个通道单独模糊避免跨通道混合padding_shape由 kornia 内部工具_compute_padding预计算保证same模式下输出尺寸与输入严格一致。核尺寸的自动推算公式当kernel_size为None时尺寸由 compute_kernel_size 给出def compute_kernel_size(sigma_val: float) - int: # 核尺寸 2 * int(4 * sigma 0.5) 1保证覆盖 ±4σ 的显著区域 return 2 * int(4.0 * sigma_val 0.5) 1docstring 中给出的两个算例可以直接验证sigma1.0 → 9、sigma2.0 → 17。该公式与常见经验核半径取4σ一致且结果恒为奇数满足对称卷积核的要求。例如 PatchCore 的异常图生成器用sigma4推算出33×33的核见下文。前向传播流程填充、分组卷积与输出形状forward方法blur.py L110-L141接收形状为(B, C, H, W)的张量流程分三步batch, channel, height, width input_tensor.size() if self.padding same: # 1) 按边界模式填充使卷积后仍能裁回原尺寸 input_tensor F.pad(input_tensor, self.padding_shape, modeself.border_type) # 2) 分组卷积stride1、padding0每通道独立卷积 output F.conv2d(input_tensor, self.kernel, groupsself.channels, padding0, stride1) if self.padding same: out output.view(batch, channel, height, width) else: # 3) valid 模式输出收缩H-kh1, W-kw1 out output.view(batch, channel, height - self.height 1, width - self.width 1) return out行为约定可以总结为paddingsame默认输出形状与输入完全一致异常图场景中基本都使用这一模式paddingvalid输出收缩kh-1 × kw-1适合下游会自行做 resize 的场景高斯模糊本身不引入可学习参数normalizeTrue时是保能量的线性平滑不会整体抬升或压低分数幅值——这对于后续基于固定阈值或分位数做异常判定很重要。实战用法从最小示例到异常图平滑最小可运行示例以下代码直接取自模块 docstring可直接复制运行需要torch环境import torch from anomalib.models.components.filters import GaussianBlur2d # 3 通道输入如 RGB 图像 blur GaussianBlur2d(sigma1.0, channels3) input_tensor torch.randn(1, 3, 256, 256) blurred blur(input_tensor) # blurred.shape torch.Size([1, 3, 256, 256])单通道异常图场景的典型用法各向同性核自动推算、same填充保尺寸from anomalib.models.components import GaussianBlur2d map_blur GaussianBlur2d(sigma4.0, channels1) # kernel 自动推算为 33×33 anomaly_map torch.rand(1, 1, 128, 128) smoothed map_blur(anomaly_map) # 形状不变热力更连贯与上采样 平滑的标准搭配在 Anomalib 中GaussianBlur2d几乎总是与F.interpolate串联用于把低分辨率的 patch 级分数映射回原图尺寸后抹平 patch 网格的锯齿。以 PatchCore 的 AnomalyMapGenerator 为例class AnomalyMapGenerator(nn.Module): def __init__(self, sigma: int 4) - None: super().__init__() kernel_size 2 * int(4.0 * sigma 0.5) 1 # sigma4 → 33 self.blur GaussianBlur2d( kernel_size(kernel_size, kernel_size), sigma(sigma, sigma), channels1, ) def compute_anomaly_map(self, patch_scores, image_sizeNone): if image_size is None: anomaly_map patch_scores else: anomaly_map F.interpolate(patch_scores, size(image_size[0], image_size[1])) return self.blur(anomaly_map)注意这里核尺寸公式与compute_kernel_size完全一致说明库内模型遵循同一套σ → 核半径 4σ的经验约定。CFA 的异常图生成cfa/anomaly_map.py L99则在每次前向中按需实例化先对多尺度分数取均值、双线性上采样再GaussianBlur2d(sigmaself.sigma).to(score.device)平滑体现了 buffer 化核随模块迁移设备的便利性。在模型族中的实际应用从源码结构看GaussianBlur2d是库内异常图平滑的事实标准组件覆盖了基于内存库、重建误差、扩散/流模型等多个技术路线。主要使用点如下均可在仓库中直接检索到模型 / 组件文件位置用法特征PatchCorepatchcore/anomaly_map.py L59默认sigma433×33 核1 通道PADI-Mpadim/anomaly_map.py L67与 PatchCore 相同的显式核尺寸 sigma 元组写法CFAcfa/anomaly_map.py L99前向时动态构造配合上采样DiNOmalydinomaly/torch_model.py L198-L202用DEFAULT_GAUSSIAN_SIGMA/DEFAULT_GAUSSIAN_KERNEL_SIZE常量在初始化时固定UniNetuninet/components/anomaly_map.py L44sigma4.0但显式指定小核(5, 5)轻度平滑Super-ADDsuper_add/torch_model.py L327-L334可选开关gaussian_blur_sigma 0才创建 blur否则为NoneSuperSimpleNetsupersimplenet/torch_model.py L383GaussianBlur2d(kernel_sizekernel_size, sigma4)InpFormerinp_former/torch_model.py L155作为成员模块用于推理输出平滑Reverse Distillationreverse_distillation/anomaly_map.py L112异常图生成阶段平滑Tiled Ensemble 流水线smoothing.py L55GaussianBlur2d(sigmafilter_sigma)由流水线配置项驱动从这些用法可以归纳出三条库内惯例异常图统一走 1 通道——所有模型都以channels1构造因为输入是标量分数图而非 RGB 图像sigma 与核尺寸配套出现——要么显式给(kh, kw)(σx, σy)元组要么只给 sigma 让公式推算两种写法在库内并存但都保持核覆盖约 ±4σ的比例关系平滑是可选而非强制的——如 Super-ADD 允许通过gaussian_blur_sigma 0关闭平滑说明该组件设计为锦上添花的后处理关闭后不影响推理正确性。正确性验证与 Kornia 的等价性测试GaussianBlur2d的可信度由一个参数化等价性测试保证位于 tests/unit/models/components/test_blur.pypytest.mark.parametrize(sigma, [(4.0, 4.0), (1.9, 3.0), (2.0, 1.5)]) pytest.mark.parametrize(channels, list(range(1, 6))) pytest.mark.parametrize(kernel_size, [(33, 33), (9, 9), (11, 5), (3, 3)]) def test_blur_equivalence(kernel_size, sigma, channels) - None: Test if the GaussianBlur2d layer produces the same output as Kornias GaussianBlur2d layer. for _ in range(10): input_tensor torch.randn((3, channels, 128, 128)) kornia korniaGaussianBlur2d(kernel_size, sigma, separableFalse) blur_kornia kornia(input_tensor) gaussian GaussianBlur2d(kernel_sizekernel_size, sigmasigma, channelschannels) blur_gaussian gaussian(input_tensor) torch.testing.assert_close(blur_kornia, blur_gaussian)该测试覆盖了 12 组(kernel_size, sigma)组合 × 5 种通道数每组跑 10 次随机输入3×C×128×128用torch.testing.assert_close断言输出与 kornia 原生实现数值一致。它同时验证了三种关键路径各向异性核如11×5、非对称 sigma如(1.9, 3.0)、多通道分组卷积。对使用者而言这意味着GaussianBlur2d与 kornia 版本可以直接互换只是核构造时机不同。调参实践建议结合上文公式与各模型默认值给出可直接落地的调参指引sigma 决定平滑强度sigma 越大热力图越糊、异常区域越连贯但小缺陷的边界会被吞掉。库内图像级模型的常见取值为σ4对应 33×33 核轻量模型如 UniNet 则用σ4 5×5 小核做轻度平滑——从源码结构看核尺寸明显小于 4σ 规则时实际平滑范围受核尺寸约束。优先让 kernel_size 自动推算不传kernel_size时公式2·int(4σ0.5)1保证核覆盖 ±4σ只有需要刻意限制平滑范围时才显式传小核。各向异性场景用元组sigma(σy, σx)与kernel_size(ky, kx)支持非方形核例如横向纹理为主的工业图像可分别设置。边界处理border_type默认reflect会在边界外产生镜像延续比replicate更不易出现边缘亮度台阶对高分辨率图像差异通常不显著。保持normalizeTrue异常分数后续可能参与阈值比较或跨图像排序归一化核保证平滑前后分数总量守恒是库内所有调用点都遵守的默认约定。通道数必须与输入一致预计算核设计决定了channels是构造期参数1 通道异常图与 3 通道 RGB 不能复用同一个实例。小结anomalib.models.components.filters虽小却是 Anomalib 异常图管线中高频复用的基础件GaussianBlur2d以构造期预计算核 分组卷积 same/valid 双填充策略实现了一个与 Kornia 数值等价、可直接register_buffer随模块迁移设备的高效高斯滤波器σ → 4σ 半径的核尺寸公式在 PatchCore、PADI-M、Super-ADD 等模型中被一致复用并配合F.interpolate上采样构成低分辨率分数 → 原图尺寸平滑热力图的标准套路。如果你要在自定义模型中平滑异常分数推荐直接沿用库内惯例channels1、paddingsame、sigma 与 4σ 核尺寸配套并参考 filters 参考文档 与 test_blur.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),仅供参考
返回列表