尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

Anomalib 视频异常检测实战:UCSDped Datamodule 的数据加载、切片机制与配置详解

Anomalib 视频异常检测实战:UCSDped Datamodule 的数据加载、切片机制与配置详解 Anomalib 视频异常检测实战UCSDped Datamodule 的数据加载、切片机制与配置详解【免费下载链接】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在视频异常检测Abnormal Event Detection任务中数据加载器的设计往往比模型本身更影响工程效率。Anomalib 通过UCSDpedDatamodule 对经典的 UCSD Pedestrian 数据集做了完整封装自动下载校验、视频序列切帧、clip 索引、ground truth 掩码对齐、验证集切分等步骤全部由框架接管。本文以仓库中 UCSDped Datamodule 文档页 为核心结合 Datamodule 实现、Dataset 实现 与 示例配置文件完整拆解该模块的每个参数、底层调用链与使用方式读完后你可以直接在 Anomalib 训练管线中接入该数据集并理解每一帧数据是如何被组织成训练样本的。一、UCSD Pedestrian 数据集与任务定义UCSD Pedestrian 数据集由 Mahadevan 等人在 2010 年 CVPR 论文《Anomaly detection in crowded scenes》中发布Dataset 源码头部注释给出了引用与 BSD 2-Clause 许可说明。数据集内容为监控摄像头拍摄的人群视频正常场景是只有行人通过异常场景则出现了车辆、自行车等非行人实体。Anomalib 将数据集划分为两个子类别subcategoryUCSDped1UCSDped2Datamodule 默认使用UCSDped2。数据集解压后期望的目录结构如下来自 Dataset 模块的 docstringroot/ ├── UCSDped1/ │ ├── Train/ │ │ ├── Train001/ │ │ │ ├── 001.tif │ │ │ └── ... │ │ └── ... │ └── Test/ │ ├── Test001/ │ │ ├── 001.tif │ │ └── ... │ ├── Test001_gt/ │ │ ├── 001.bmp │ │ └── ... │ └── ... └── UCSDped2/ ├── Train/ └── Test/要点视频以图像序列形式存放训练/测试视频各为一个目录目录内是逐帧*.tif文件而非 mp4 等容器格式测试集每个视频目录旁有对应的_gt目录存放逐帧*.bmp异常掩码训练集没有掩码标注因此训练阶段是仅正常样本的训练模式。二、UCSDped Datamodule参数逐项解析UCSDped 类继承自 AnomalibVideoDataModule是 PyTorch Lightning 风格的 DataModule负责在prepare_data()阶段下载数据、在setup()阶段构建训练/测试数据集。完整构造参数及默认值如下与 源码签名 一一对应参数类型默认值说明rootPath \| str \| None./datasets/ucsd数据集下载与解压的根目录为None时由框架解析默认路径categorystrUCSDped2子类别只能为UCSDped1或UCSDped2clip_length_in_framesint2每个视频 clip 包含的帧数frames_between_clipsint10相邻 clip 之间跳过的帧数步进target_frameVideoTargetFrameVideoTargetFrame.LAST多帧模型中用哪一帧的 ground truthtrain_batch_sizeint8训练批大小eval_batch_sizeint8验证/测试批大小num_workersint8数据加载 worker 数train_augmentations/val_augmentations/test_augmentationsTransform \| NoneNone各阶段 torchvision v2 增强augmentationsTransform \| NoneNone未指定阶段级增强时的通用增强val_split_modeValSplitModeValSplitMode.SAME_AS_TEST验证集构建方式val_split_ratiofloat0.5用于验证的数据比例0~1seedint \| NoneNone随机种子保证可复现其中target_frame是视频任务特有参数取值来自 VideoTargetFrame 枚举FIRST用 clip 第一帧的标注LAST用最后一帧的标注默认MID用中间帧ALL所有帧都作为目标不对 ground truth 做帧级选择。从源码结构看target_frame的选取逻辑集中在基类AnomalibVideoDataset._select_targets中当clip_length_in_frames 1且target_frame ! ALL时数据集__getitem__会把 mask、label、original_image、frames 索引全部收缩到目标帧上保证送进模型的是多帧输入 单帧标注的配对样本。与图像 Datamodule 的关键差异UCSDped继承的 AnomalibVideoDataModule 重写了_create_test_split为空实现并在_setup中对ValSplitMode.SYNTHETIC抛出ValueError。也就是说视频数据集不支持动态测试集重分配也不支持合成异常生成——原因是帧之间存在时间依赖随机打乱会破坏标注一致性。这是使用视频数据模块时与图像数据模块最大的行为差异val_split_mode实际可用的只有SAME_AS_TEST与FROM_TEST两类。三、自动下载与目录整理prepare_data 的完整流程UCSDped.prepare_data 实现了开箱即下的能力逻辑为三步存在性检查若root/category目录已存在如./datasets/ucsd/UCSDped2直接记录 Found the dataset. 日志并跳过下载下载与校验否则调用download_and_extract下载信息定义在模块级常量 DOWNLOAD_INFO 中——URL 为 UCSD 官方发布地址并附带 SHA-256hashsum2329af32...1915b用于完整性校验下载工具与进度条实现在 download.py目录扁平化官方压缩包解压后外层多套一层UCSD_Anomaly_Dataset.v1p2目录源码随后把该目录下的所有条目move到root下并删除空壳目录使最终布局与上一节的期望结构一致。这意味着你只需要保证root目录可写、网络可达setup()时数据就会自动就位若断网也可以手动将已解压数据集放到root下保证root/UCSDped2存在以跳过下载。四、Dataset 层样本表生成与 Clip 索引Datamodule 的_setup会分别为Split.TRAIN和Split.TEST构建两个 UCSDpedDataset 实例并传入相同的clip_length_in_frames、frames_between_clips、target_frame。Dataset 的构造分为两条主线4.1 样本表make_ucsd_dataset 解析目录结构make_ucsd_dataset 负责把文件树解析成 Pandas DataFrame 样本表遍历root/category下*/*的二级目录即Train/Train001、Test/Test001这类视频目录并过滤掉不含*.tif的目录这一步天然把*_gt掩码目录排除在视频列表之外按folder名Train/Test为样本打上 split 标记仅测试集推导掩码路径Test001→root/category/Test/Test001_gt训练集mask_path置空字符串根据是否存在掩码自动推断任务类型并写入samples.attrs[task]全空掩码为classification否则为segmentation。这一推断值得注意如果数据集目录被误删掉_gt目录任务类型会静默降级为 classification属于排查数据问题时值得优先检查的点。4.2 Clip 索引UCSDpedClipsIndexer真正的取一个样本由 UCSDpedClipsIndexer 完成它继承自 ClipsIndexer后者又扩展了 torchvision 的VideoClipsoutput_formatTCHW即输出为[T, C, H, W]的 clip 张量。UCSD 的实现针对图像序列这一特殊形态做了两处覆写_compute_frame_pts由于目录结构无法推断 fps直接对每个视频目录glob(*.tif)统计帧数生成0..n_frames-1的帧索引video_fps全部置Noneget_clip按 clip 的帧索引点clip_pts从排序后的 tif 列表中读取对应帧逐帧调用read_image(..., as_tensorTrue)后torch.stack成[L, C, H, W]张量L即clip_length_in_frames。掩码侧的get_mask逻辑对称当mask_folder为空训练集时直接返回None测试集则从_gt目录glob(*.bmp)后按相同帧索引读取并堆叠。基类的get_item最终把这些拼成VideoItem数据对象包含imageclip、gt_mask、video_path、frames帧索引与last_frame该视频最后一帧索引五个字段。五、样本产出形态训练与测试返回什么Dataset__getitem__的完整流程在 基类实现 中可归纳为五步通过 indexer 取VideoItem并把视频 dtype 缩放到[0, 1]浮点to_dtype_video同时保留一份 uint8 的original_image用于可视化若存在gt_mask则对image与Mask(gt_mask)联合施加增强并由掩码计算逐帧二分类标签掩码中出现 1 即为异常帧否则仅对图像做增强clip_length_in_frames 1时压掉时间维若 clip 多帧且target_frame ! ALL执行_select_targets收缩到目标帧返回最终的VideoItem。因此从 Dataset 的 docstring 示例 可以确认两个 split 返回字段的差异训练样本键[image, video_path, frames, last_frame, original_image]测试样本键在此之上多出mask与label由逐帧掩码计算得到。批数据则由 VideoBatch.collate 统一聚合。六、三种使用方式API、配置文件与 CLI6.1 Python API 直接构造Datamodule 的 docstring 示例 给出了标准用法from anomalib.data import UCSDped datamodule UCSDped(root./datasets/ucsd) datamodule.prepare_data() # 首次运行时下载并整理数据集 datamodule.setup() # 构建 train/test 数据集与验证切分 train_loader datamodule.train_dataloader() val_loader datamodule.val_dataloader() test_loader datamodule.test_dataloader()也可以直接操作 Dataset 层from pathlib import Path from anomalib.data.datasets import UCSDpedDataset from anomalib.data.utils import Split dataset UCSDpedDataset( rootPath(./datasets/ucsdped), categoryUCSDped1, splitSplit.TRAIN, ) dataset[0].keys() # dict_keys([image, video_path, frames, last_frame, original_image])6.2 YAML 配置驱动仓库内置了可直接使用的配置文件 ucsd_ped.yamlclass_path: anomalib.data.UCSDped init_args: root: ./datasets/ucsd category: UCSDped2 clip_length_in_frames: 2 frames_between_clips: 10 target_frame: LAST train_batch_size: 8 eval_batch_size: 1 num_workers: 8 val_split_mode: FROM_TEST val_split_ratio: 0.5 seed: null可以看到与类默认值的两处差异eval_batch_size设为1视频评估更省显存val_split_mode设为FROM_TEST从测试集切出验证集。配置加载入口在 AnomalibVideoDataModule 的 docstring 中已有说明AnomalibVideoDataModule.from_config(config_pathexamples/configs/data/ucsd_ped.yaml)即可从该文件重建数据模块配合 Anomalib 的 pipeline 配置即可在训练脚本或anomalib train --data_config ...类命令中使用具体管线配置可参考 examples/configs 下的说明。6.3 单测视角的使用示范单元测试文件 展示了带增强的构造方式可作为参数组合的参照from torchvision.transforms.v2 import Resize from anomalib.data import UCSDped datamodule UCSDped( rootdataset_path / ucsdped, categorydummy, # 测试用假目录 clip_length_in_frames2, train_batch_size4, eval_batch_size4, num_workers0, augmentationsResize((256, 256)), ) datamodule.prepare_data() datamodule.setup()该测试类继承通用视频 Datamodule 测试基类_TestAnomalibVideoDatamodule并固定指向上述 配置文件路径即配置文件的键名与实际类签名是被测试持续约束的。七、clip 参数调优与注意事项clip_length_in_frames与frames_between_clips共同决定样本密度与计算开销是调数据侧超参的主战场clip_length_in_frames2默认每个样本 2 帧。UCSD 帧率较低且场景变化快论文原始设定即短 clipframes_between_clips10默认clip 之间跳过 10 帧避免相邻样本高度重叠导致的有效样本重复同时减少磁盘读取若希望更密集的滑窗如评估时做逐帧打分可将其调小但样本数会相应成倍增长。clip 的生成规则沿用 torchvisionVideoClips的滑动窗口策略output_formatTCHW在 ClipsIndexer 构造 中固定因此 clip 数量、帧点计算等细节可参考其索引逻辑单帧输入clip_length_in_frames1时基类会压掉时间维样本退化为普通图像方便用图像异常检测模型直接跑该数据集。其他实用注意事项fps 不可用video_fps恒为None图像序列无时间戳依赖真实时间间隔的算法在该数据集上不可用掩码缺失即任务降级如第 4.1 节所述_gt目录缺失会使 task 从 segmentation 降级为 classification验证集来源由于不支持动态测试切分val_split_mode只能在SAME_AS_TEST验证集测试集或FROM_TEST按比例从测试集划出见val_split_ratio之间选择且随机性由seed控制依赖提示视频数据工具链依赖av库utils/video.py 在缺失时会给出uv pip install av或uv pip install anomalib[video]的安装提示。八、小结Anomalib 的UCSDpedDatamodule 把监控视频 → 可训练 clip 样本这条链路完整收敛到了三个层次Datamodule 负责下载校验与 Lightning 集成Dataset 负责目录解析、样本表与 clip 索引ClipsIndexer/VideoItem 负责统一的视频样本数据契约。参数默认值面向开箱即用UCSDped2、2 帧 clip、LAST 目标帧而clip_length_in_frames、frames_between_clips、target_frame与验证切分模式则覆盖了短 clip 分类、滑窗评估、图像模型复用等常见场景。配合 ucsd_ped.yaml 配置文件与 单元测试你可以在不写任何数据加载代码的前提下把 UCSD Pedestrian 数据集接入 Anomalib 的任意视频异常检测训练管线。【免费下载链接】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),仅供参考
返回列表