ARTICLE DETAIL

资讯详情

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

anomalib 中的 CFM 跨模态特征映射模型:RGB 与 3D 点云联合的多模态异常检测实战指南

anomalib 中的 CFM 跨模态特征映射模型:RGB 与 3D 点云联合的多模态异常检测实战指南 anomalib 中的 CFM 跨模态特征映射模型RGB 与 3D 点云联合的多模态异常检测实战指南【免费下载链接】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导读CFMCrossmodal Feature Mapping跨模态特征映射是 anomalib 中实现的一类轻量级多模态异常检测方法源自 CVPR 2024 论文Multimodal Industrial Anomaly Detection by Crossmodal Feature Mapping。它同时利用 RGB 图像与 3D 点云仅用两个小型 MLP 网络学习两种模态特征之间的双向映射在推理阶段通过跨模态预测与真实特征的不一致来定位异常。本文以 src/anomalib/models/image/cfm/README.md 为核心结合模型源码与配置逐层拆解 CFM 的原理、训练命令、参数含义与资源调优策略帮助你理解并上手在 MVTec 3D-AD 等深度数据集上运行 CFM。CFM 的核心思想不做记忆库只学特征映射与 M3DM、3D-ADS 这类基于 memory-bank记忆库的多模态方法不同CFM 采用了一条更轻量的路径训练两个小型 MLP 网络来建立 RGB 与 3D 特征之间的双向映射一个 MLP 从 RGB 特征预测 3D 特征另一个 MLP 从 3D 特征预测 RGB 特征。训练数据只包含无缺陷nominal/defect-free样本因此两个映射网络学到的是正常数据上两种模态之间的一致性关系。到了推理阶段异常被定义为观测到的特征与其跨模态预测结果之间的不一致——正常区域两种模态高度一致、映射误差小而异常区域会同时破坏两个方向的映射一致性。从源码看这一思想在 torch_model.py 中被清晰实现# xyz_dim 384 * 3 - 1152rgb_dim 768 self.xyz_to_rgb_mapper FeatureProjectionMLP(in_featuresxyz_dim, out_featuresrgb_dim) self.rgb_to_xyz_mapper FeatureProjectionMLP(in_featuresrgb_dim, out_featuresxyz_dim)FeatureProjectionMLP见 components.py是一个三层 1×1 卷积网络Conv2d - GELU - Conv2d - GELU - Conv2d隐藏层维度取输入输出维度的均值。整个模型只在特征图的空间位置上做逐点映射参数量远小于记忆库方法这也是 CFM 被描述为 lightweight 的原因。模型类型为Segmentation分割型即输出逐像素的异常图anomaly map这与它的LearningType.ONE_CLASS属性见 lightning_model.py一致——单类别、仅用正常样本训练。特征提取冻结的 DINO 与 Point-MAE 双主干CFM 使用两个预训练主干分别处理两种模态训练期间两个主干完全冻结只有两个映射 MLP 参与梯度更新。RGB 分支DINO ViT-Base主干为DINO ViT-Basepatch size 8输入 224×224输出768 维patch 特征通过 timm 加载timm.create_model(model_namergb_backbone, pretrainedTrue)默认主干名称为vit_base_patch8_224.dino见 components.py。在 torch_model.py 中rgb_backbone: str vit_base_patch8_224.dino ... rgb_dim 768源码中还会截取 DINO 的前 12 个 transformer blockself.rgb_backbone.blocks[:layers_keep]并丢弃 CLS token、把 patch token 重排为空间网格特征见FeatureExtractors.forward_rgb_features。3D 分支Point-MAE 预训练的 PointTransformer使用 Point-MAE 预训练的PointTransformer处理点云将点云按局部邻域分组输出1152 维特征由第 3、7、11 层的输出拼接而成权重可通过pointmae_weights参数显式指定否则自动下载到 anomalib 缓存目录下载地址与 SHA256 校验和定义在 components.py 的POINTMAE_DOWNLOAD_INFO中。源码中对应的实现# components.py —— PointTransformer.forward x torch.cat((feature_list[3], feature_list[7], feature_list[11]), dim1) # 3×384 1152三个层各输出 384 维拼接后得到 1152 维。而MultimodalFeatures.get_features_maps负责把两种模态的特征对齐到同一空间分辨率3D 特征先经最远点采样FPS见 utils.py 的farthest_point_sample得到中心点再用 3 近邻插值interpolating_points回填到原始点、重投影到 2D 网格最后用 3×3 平均池化平滑RGB 特征则双线性插值到目标分辨率后同样平滑。值得注意的是components.py 中实现了一个值得留意的细节零填充掩码只根据 batch 中第一个样本计算因此当batch_size 1时会发出警告要求所有样本共享相同的填充模式——这也是 README 建议 batch size 保持为 1 的原因之一。异常检测流程双向距离的逐元素乘积对于每一个空间位置CFM 按以下四步计算异常README 所述与 anomaly_map.py 的CFMAnomalyMapGenerator.forward一一对应计算 RGB 方向的归一化 L2 距离||normalize(pred_rgb) - normalize(rgb_feat)||₂计算 3D 方向的归一化 L2 距离||normalize(pred_xyz) - normalize(xyz_feat)||₂对两张距离图做逐元素乘积combined_map dist_rgb * dist_xyz放大两个模态同时不一致的区域高斯模糊平滑 top-k 打分把乘积图双线性上采样到原图尺寸经高斯模糊后取异常值最高的前topk_ratio比例像素的均值作为图像级异常分数。其中高斯模糊核由sigma4.0动态生成核大小kernel_size 2 * (int(sigma * 3) // 2) 1top-k 比例默认topk_ratio0.001这两个默认值都定义在CFMAnomalyMapGenerator.__init__中。代码中的高斯模糊替换了原论文基于 PIL 的 KNN 高斯模糊改用纯 PyTorch 的 2D 卷积核实现见GaussianBlurKernel并通过register_buffer注册核张量使其随模型自动上 GPU 且不被优化器视为可训练参数。推理路径的完整调用链为CFM.forward(batch) - CFMModel(rgb, xyz) - extract_features - map_features - anomaly_map_generator最终返回InferenceBatch(pred_score, anomaly_map)见 lightning_model.py 与 torch_model.py。训练与推理仅优化映射网络CFM 的训练只发生在两个映射 MLP 上。在 torch_model.py 中# Blocking the gradients: extractors arent updated for param in self.feature_extractors.parameters(): param.requires_grad FalseCFMModel.mapper_parameters()只返回两个映射器的参数而 lightning_model.py 的configure_optimizers用Adam优化这些参数学习率默认lr1e-4。训练损失是双向的余弦相似度损失之和loss_rgb 1 - cos_sim(pred_rgb, rgb_feat).mean() loss_xyz 1 - cos_sim(pred_xyz, xyz_feat).mean() loss loss_rgb loss_xyz此外lightning_model.py 还做了两件对多模态模型很重要的事动态预处理器configure_pre_processor默认把输入 Resize 到 224×224多模态 batch 解析_get_data从 batch 中同时取image与point_cloud/depth_map并要求 3D 输入形状为(B, 3, H, W)若分辨率与 RGB 不一致会自动双线性插值对齐。CFM.forward也重写为必须接收包含两种模态的Batch直接传入裸图像张量会抛出TypeError。上手运行CLI 与配置文件两种方式CFM 需要一个同时包含 RGB 与深度/点云的多模态数据集如 MVTec 3D-AD并且一次只训练一个类别。仓库中对应的数据模块为anomalib.data.MVTec3D见 mvtec_3d.py。方式一纯 CLIanomalib train --model anomalib.models.CFM --data anomalib.data.MVTec3D --data.category bagel --data.train_batch_size 1 --trainer.devices 1方式二配置文件 CLI 覆盖anomalib train -c examples/configs/model/cfm.yaml --data anomalib.data.MVTec3D --data.category bagel --data.train_batch_size 1配置文件 examples/configs/model/cfm.yamldocs 侧镜像见 docs/source/examples/configs/model/cfm.yaml内容如下model: class_path: anomalib.models.CFM init_args: lr: 1.0e-4 rgb_backbone: vit_base_patch8_224.dino group_size: 128 num_group: 1024各参数含义与 lightning_model.py 的CFM.__init__一致参数默认值说明lr1.0e-4Adam 优化器的学习率仅作用于两个映射 MLPrgb_backbonevit_base_patch8_224.dino用于 RGB 的 DINO 主干名称经 timm 加载group_size128PointTransformer 的 KNN 邻域大小每个组包含的点数num_group1024点云分组数量FPS 采样得到的中心点数pointmae_weightsNonePoint-MAE 预训练权重路径为None时自动下载到 anomalib 缓存目录内存优化要点README 明确指出点云操作非常消耗内存。如果遇到 OOM建议batch size 保持为 1——--data.train_batch_size 1使用单设备——--trainer.devices 1降低num_group——如从 1024 降到 512减少 FPS 采样点与分组数量lightning_model.py 的 docstring 示例即展示了CFM(lr1e-4, num_group512)的用法。从源码角度补充一个原因3D 分支的Group模块会对每个样本执行 FPS复杂度与点数量线性相关和 KNN 分组Encoder会把(batch*num_group, group_size, 3)的点组张量整体送入卷积内存占用随num_group × group_size × batch增长同时MultimodalFeatures对batch 1时基于首样本的零填充掩码也有约束见 components.py因此 batch size 保持 1 既是内存需要也是正确性前提。关于 Benchmark 结果的说明README 中的 Benchmark 部分给出了 MVTec 3D-AD 数据集的指标表结构Image AUROC、Pixel AUROC、Image F1并明确注明Benchmarks pending full evaluation——即当前仓库中该表尚未填充具体数值需要在所有类别上完成完整训练后才能给出。该表以 seed 42 为准进行评测。因此任何声称 CFM 在该数据集上的具体精度数值都需要以自行复现的实验结果或论文原始数据为准仓库本身目前未提供可引用的评测数字。小结CFM 为多模态异常检测提供了一种去记忆库化的简洁范式用两个冻结的预训练主干DINO Point-MAE提取 RGB 与 3D 特征再用两个小型 MLP 学习正常样本上的跨模态映射推理时以双向映射误差的逐元素乘积定位异常。在 anomalib 中你只需一条 CLI 命令或一份 YAML 配置即可在 MVTec 3D-AD 上按类别训练与推理若想深入底层建议按 torch_model.py模型与损失、components.py主干与点云算子、anomaly_map.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),仅供参考
返回列表