data-juicer 视频运动分数过滤实战:基于 ptlflow 光流的 VideoMotionScorePtlflowFilter 算子详解
发布时间:2026/10/4 15:22:09 锦皓数字建站

人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载本篇文章围绕>from data_juicer.ops.filter.video_motion_score_ptlflow_filter import ( VideoMotionScorePtlflowFilter, ) # 默认配置dpflow 模型sampling_fps2保留分数 1.0 的视频 op VideoMotionScorePtlflowFilter() # 自定义阈值与模型 op VideoMotionScorePtlflowFilter( min_score10.0, max_score20.0, model_nameraft, sampling_fps2, any_or_allany, )随后可在Dataset上调用op.compute_stats(dataset)与op.process(dataset)或直接op.run(dataset)完成过滤分数统计会缓存在样本的stats字段的video_motion_score键下。4.2 通过 YAML 配置集成到数据处理流程在>dataset_path: path/to/video_dataset.jsonl video_key: videos process: - video_motion_score_ptlflow_filter: min_score: 5.0 max_score: 50.0 model_name: dpflow sampling_fps: 2 size: 256 divisible: 8 any_or_all: any4.3 命令行运行使用仓库根目录下的处理入口脚本执行python tools/process_data.py --config your_config.yaml注意该算子标签为gpu声明了 CUDA 加速器源码中_accelerator cuda建议在具备 NVIDIA GPU 的环境运行设备CPU/CUDA会在推理时自动检测并设置无需手工指定。五、效果演示与阈值调优原文档提供了两个典型演示用例测试样本来自 tests/ops/data 下的video1.mp4、video2.mp4、video3.mp4三个视频每个样本各含 1 个视频。5.1 test_default默认参数全保留VideoMotionScorePtlflowFilter()在默认参数min_score1.0、max_scoresys.float_info.max、model_namedpflow下三个视频全部通过过滤、被保留。根据 test_video_motion_score_ptlflow_filter.py 中的注释这三个测试视频在默认模型下的运动分数参考值约为22.65、11.97、2.27均不低于默认下限1.0因此全部保留——这正说明默认配置是一个“宽松下限”的通用运动性筛查。5.2 test_different_model切换光流模型VideoMotionScorePtlflowFilter(model_nameraft)将model_name切换为raft后三个视频同样全部保留。这表明该算子对模型选择是透明的model_name决定光流来源而分数阈值、采样与过滤逻辑不变。5.3 阈值调优高 / 中 / 低运动筛选参考测试用例可以直观理解min_score/max_score的调参效果筛选高运动视频VideoMotionScorePtlflowFilter(min_score20)→ 仅保留video1.mp4分数约 22.65 ≥ 20筛选低运动视频VideoMotionScorePtlflowFilter(min_score0.0, max_score5)→ 仅保留video3.mp4分数约 2.27 ≤ 5筛选中等运动视频VideoMotionScorePtlflowFilter(min_score10, max_score20)→ 仅保留video2.mp4分数约 11.97 落在区间内。再结合缩放参数使用测试用例# 先缩放到短边 128再以 min_score5 过滤 VideoMotionScorePtlflowFilter(min_score5, size128) # 双目标尺寸 max_size 限制 VideoMotionScorePtlflowFilter(min_score0.0, size256, max_size256) # 相对归一化分数目标 (128, 160)阈值按 [0,1] 尺度 VideoMotionScorePtlflowFilter(min_score0.005, size(128, 160), relativeTrue)先降采样再算光流能显著降低显存占用与推理耗时是处理高分辨率视频时的推荐做法。六、源码实现剖析6.1 继承结构与注册机制该算子通过装饰器完成注册video_motion_score_ptlflow_filter.pyUNFORKABLE.register_module(OP_NAME) OPERATORS.register_module(OP_NAME) class VideoMotionScorePtlflowFilter(VideoMotionScoreFilter):OPERATORS注册使其可按字符串名video_motion_score_ptlflow_filter在 YAML 配置中被实例化UNFORKABLE标记表示该算子不适合 fork 并行模型加载与 CUDA 上下文相关测试中对应地使用spawn启动方式见 test_video_motion_score_ptlflow_filter.py 的test_parallel。构造函数在基类参数之上额外接收model_name、ckpt_path、get_model_args其中get_model_args会经jsonargparse.dict_to_namespace转成命名空间对象后传给 ptlflowvideo_motion_score_ptlflow_filter.py。6.2 setup_model模型加载与设备自动检测def setup_model(self, rankNone): self.model ptlflow.get_model(self.model_name, ckpt_pathself.ckpt_path, argsself.get_model_args) if self.use_cuda(): rank rank if rank is not None else 0 rank rank % cuda_device_count() self.device fcuda:{rank} else: self.device cpu self.model.to(self.device) self.model.eval()设备策略是自动的有 CUDA 时按进程rank对 GPU 数量取模分配设备否则回退到 CPU。模型统一切换为eval()模式。6.3 compute_flow推理与光流后处理def compute_flow(self, prev_frame, curr_frame): if prev_frame is None: flow None else: io_adapter ptlflow_io_adapter.IOAdapter(self.model, prev_frame.shape[:2]) frames [prev_frame, curr_frame] inputs io_adapter.prepare_inputs(frames) inputs {key: value.to(self.device) for key, value in inputs.items()} with torch.no_grad(): predictions self.model(inputs) flows predictions.get(flows) # shape: (1, 1, 2, H, W) flow flows[-1][0].detach().cpu().numpy().transpose((1, 2, 0)) # 2,H,W - H,W,2 return flow, curr_frame关键点第一帧返回flowNone无前一帧可比对从第二帧起用 ptlflow 的IOAdapter做输入适配包括归一化、颜色通道翻转等预处理即文档所述“BGR→RGB”与归一化变换在no_grad下推理最终把模型输出的(1, 1, 2, H, W)光流张量转换为 numpy 的(H, W, 2)格式末尾两维分别为dx、dy供基类计算幅度。6.4 基类的统计计算流程分数计算与过滤逻辑全部继承自 VideoMotionScoreFiltercompute_stats_single先检查stats.video_motion_score是否已缓存已缓存则跳过支持增量复用样本无视频且无frame_field时写入空数组随后逐视频调用_compute_motion_scores_from_video或从frame_field走_compute_motion_scores_from_frames并跳过重复视频键避免重复计算视频读取路径用cv2.VideoCapture打开视频读取真实 FPS取sampling_fps min(配置值, 实际FPS)、sampling_step round(fps / sampling_fps)并保证步长不小于 1、采样帧数不小于 2缩放后逐帧compute_flow→cartToPolar幅度 → 均值通过cap.set(cv2.CAP_PROP_POS_FRAMES, ...)快速跳帧process_single从stats取分数数组逐视频调用基类的get_keep_boolean见 base_op.py支持开闭区间与区间取反最后按any/all策略合并为样本级保留结论。6.5 光流结果输出开启if_output_optical_flowTrue时计算得到的光流会以(num_frame, H, W, 2)结构写入样本meta的optical_flow_key字段默认video_optical_flow对应 constant.py 中的MetaKeys.video_optical_flow。测试test_output_optical_flow测试文件验证了该字段确实写入meta特性。这使得光流可以作为中间产物供后续算子如基于光流的动作分析、轨迹提取复用避免重复推理。七、测试与使用注意事项单元测试覆盖了 test_video_motion_score_ptlflow_filter.py 中的以下场景默认参数过滤、切换模型raft降采样size/max_size/relative归一化高、低、中运动阈值筛选多视频样本的any/all策略num_proc并行使用spawn启动方式光流结果输出。使用时的注意事项依赖需安装ptlflow0.4.1见 pyproject.toml首次运行会下载ckpt_path指定的预训练权重设备标记为 GPU 算子无 CUDA 环境时自动退化为 CPU 推理但高分辨率视频会明显变慢建议配合size降采样使用并行属于UNFORKABLE算子多进程环境请采用spawn而非fork分数语义默认relativeFalse时分数为绝对像素位移均值不同分辨率视频间的可比性弱如需跨分辨率统一阈值建议开启relativeTrue统计缓存分数缓存在stats.video_motion_score中同一算子重复运行时不会重复计算。八、相关资源算子源码基类实现OpenCV 版运动分数过滤同系列 RAFT 版算子单元测试测试视频样本、video2.mp4、video3.mp4数据处理配置指南返回算子列表赞分享人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载相关推荐Vue Devtools 插件开发实战指南从注册到组件检查器、自定义 Inspector 与 Timeline基于 devtools 仓库Vue Devtools 插件开发实战指南从注册到组件检查器、自定义 Inspector 与 Timeline基于 devtools 仓库 Vue Dev人工智能大模型数据工程数据清洗数据增强数据质检Data-Juicer 视频时长过滤算子video_duration_filter深度解析参数配置、实现原理与实战用法Data Juicer 视频时长过滤算子video_duration_filter深度解析参数配置、实现原理与实战用法 视频时长是视频数据质量清洗中最基础人工智能大模型数据工程数据清洗数据增强数据质检oh-my-openagent Git Master Skill 完全指南原子提交、rebase 手术与历史考古的三合一 Git Agent 工作流oh my openagent Git Master Skill 完全指南原子提交、rebase 手术与历史考古的三合一 Git Agent 工作流 导读 G人工智能大模型数据工程数据清洗数据增强数据质检上一篇Argilla × Hugging Face Transformers用预训练模型辅助标注并微调领域情感分类器的完整实战下一篇智能灌溉指南用Arduino-ESP32实现土壤自动补水创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。