ARTICLE DETAIL

资讯详情

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

Data-Juicer 视频运动分数过滤器(video_motion_score_filter)实战指南:基于 OpenCV 稠密光流的视频筛选

Data-Juicer 视频运动分数过滤器(video_motion_score_filter)实战指南:基于 OpenCV 稠密光流的视频筛选 人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载导读video_motion_score_filter是 Data-Juicer 提供的一个面向视频数据的过滤器算子它利用 OpenCV 的 Farneback 算法计算视频帧间的稠密光流将光流幅值的均值作为该视频的运动分数然后根据用户设定的最小/最大分数阈值决定样本去留。本文将以 官方算子文档 为主体结合 算子源码 与 单元测试完整讲解其原理、全部参数、源码级实现细节与实操配置方法。读完本文你将掌握如何用该算子剔除静态或低动态的视频样本、如何用any/all策略处理多视频样本以及如何输出光流作为下游任务的元数据。一、算子概览该过滤器用于保留 OpenCV 视频运动分数在指定范围内的样本在 Data-Juicer 中注册信息如下算子类型Typefilter标签Tagscpu,video其核心流程可概括为使用 OpenCV 的Farneback 算法计算稠密光流 → 为每个视频计算平均运动分数→ 依据min_score/max_score阈值保留样本 → 通过any或all策略决定多视频样本的取舍 → 统计结果缓存在键video_motion_score下。运动分数定义为光流幅值的均值并可选择性地相对于帧对角线长度归一化归一化后分数大致落在[0, 1]量级。二、工作原理从光流到运动分数从源码video_motion_score_filter.py可以看到整个计算链条分为三部分1. 稠密光流计算算子通过cv2.calcOpticalFlowFarneback计算相邻两帧间的稠密光流setup_model与compute_flow方法def setup_model(self, rankNone): self.model cv2.calcOpticalFlowFarneback def compute_flow(self, prev_frame, curr_frame): curr_frame cv2.cvtColor(curr_frame, cv2.COLOR_BGR2GRAY) if prev_frame is None: flow None else: flow self.model(prev_frame, curr_frame, None, **self.extra_kwargs) return flow, curr_frame实现要点每帧先转为灰度图第一帧没有前序帧跳过从第二帧起计算 shape 为(H, W, 2)的光流场通道 0/1 分别对应水平、垂直方向的位移dx、dy。Farneback 算法的内部参数通过_default_kwargs提供默认值并允许用户在构造算子时通过kwargs覆盖Farneback 参数默认值含义pyr_scale0.5图像金字塔的缩放比例levels3金字塔层数winsize15平均窗口大小iterations3每层迭代次数poly_n5多项式展开的邻域大小poly_sigma1.2多项式展开的高斯标准差flags0光流计算标志位2. 运动分数计算对每一对相邻帧用cv2.cartToPolar将光流的笛卡尔分量转换为幅值mag再取均值作为该帧的运动分数mag, _ cv2.cartToPolar(flow[..., 0], flow[..., 1]) frame_motion_score np.mean(mag) if self.relative: frame_motion_score / np.hypot(*frame.shape[:2])若relativeFalse默认分数为像素位移的绝对值均值量级与视频分辨率、真实运动幅度相关若relativeTrue则除以帧对角线长度np.hypot(height, width)分数被归一化到[0, 1]量级便于跨分辨率设定统一阈值。每个视频的运动分数为所有被采样帧对分数的算术平均若某个视频因帧数不足如只有一帧、没有形成任何光流对其分数被记为-1。最终每个视频得到一个分数值缓存在样本的stats字段下StatsKeys.video_motion_score即video_motion_score定义见 data_juicer/utils/constant.py。3. 阈值判定与多视频策略process_single将每个视频的分数与阈值比较再按策略汇总keep_bools np.array([ self.get_keep_boolean(motion_score, self.min_score, self.max_score) for motion_score in video_motion_scores ]) if len(keep_bools) 0: return True if self.any: return keep_bools.any() else: return keep_bools.all()比较逻辑继承自基类 data_juicer/ops/base_op.py 的get_keep_booleanmin_score score max_score同时支持基类的min_closed_interval、max_closed_interval、reversed_range等通用过滤开关any_or_allany默认样本中只要任意一个视频满足条件即保留any_or_allall样本中所有视频都满足条件才保留样本没有任何视频时默认保留len(keep_bools) 0返回True。由于该算子已注册到OPERATORS与UNFORKABLE两个注册表见源码装饰器它会出现在算子自动发现列表中并遵循 Data-Juicer 统一的先compute_stats缓存统计、再process过滤两阶段执行模型统计一旦写入stats再次计算会被跳过if StatsKeys.video_motion_score in sample[Fields.stats]: return sample。三、参数配置详解3.1 参数总表完整继承官方文档参数名类型默认值说明min_scorefloat0.25保留样本所需的最小运动分数max_scorefloat1.7976931348623157e308即sys.float_info.max源码默认值保留样本所需的最大运动分数即无上限frame_fieldOptional[str]None存放视频帧的字段名为None时直接从video字段加载视频并抽帧sampling_fpsAnnotated[float, Gt(gt0)]2光流计算所用的采样帧率frames_per_secondsizeint/Tuple[int]/Tuple[int, int]/NoneNone计算光流前对帧进行缩放。为(h, w)时直接匹配到该尺寸为整数时把帧的较短边匹配到该值如高大于宽则缩放为(size * height / width, size)None保持原尺寸max_sizeOptional[int]None缩放后较长边的上限。若按size缩放后较长边仍大于max_size则以max_size为准覆盖size较短边可能小于size。仅在size为整数时支持divisibleint1缩放后帧尺寸必须能被该数整除relativeboolFalse为True时光流幅值相对于帧对角线长度归一化到[0, 1]量级any_or_allstranyany任意视频满足条件即保留样本all所有视频满足条件才保留样本if_output_optical_flowboolFalse是否将计算得到的光流输出到样本meta中每个视频的光流以(num_frame, H, W, 2)形状存储optical_flow_keystrvideo_optical_flow存放光流结果的字段名对应MetaKeys.video_optical_flow见 data_juicer/utils/constant.pyargs-额外参数kwargs-额外参数可覆盖 Farneback 内部参数等除表格所列参数外源码还暴露了文档参数表中未单列的original_fpsOptional[PositiveFloat] None仅在指定frame_field时生效用于按sampling_step round(original_fps / sampling_fps)对已有帧做二次采样详见下文帧输入模式。3.2 尺寸约束的底层实现size/max_size/divisible的语义由calculate_resized_dimensions实现data_juicer/utils/mm_utils.py先确定短边、长边再按target_size是单整数还是二元组决定缩放方式最后施加max_length上限与divisible取整约束算子随后用cv2.resize(..., interpolationcv2.INTER_AREA)完成缩放。注意源码构造时对size做了校验size为 list/tuple 时其长度必须是 1 或 2否则抛出ValueError。3.3 帧率采样逻辑源码级细节视频输入模式frame_fieldNone默认用cv2.VideoCapture打开视频读取CAP_PROP_FPS后sampling_fps min(self.sampling_fps, fps) sampling_step round(fps / sampling_fps) sampling_step max(min(sampling_step, total_frames - 1), 1)实际采样率不会超过视频原始帧率采样步长至少为 1且保证视频至少留下两帧total_frames - 1的下限确保能形成光流对读取时通过cap.set(cv2.CAP_PROP_POS_FRAMES, frame_count)快速跳帧避免逐帧解码兼顾效率。帧输入模式指定frame_field从样本的指定字段直接读取帧支持帧为文件路径或bytes编码分别走cv2.imread或np.frombuffer cv2.imdecode若original_fps为None处理全部帧向后兼容行为若提供了original_fpseffective_fps min(sampling_fps, original_fps)sampling_step max(round(original_fps / effective_fps), 1)仅处理frame_idx % sampling_step 0的帧。3.4 光流输出当if_output_optical_flowTrue时每个视频的光流会被写入sample[Fields.meta][optical_flow_key]形状为(num_frame, H, W, 2)num_frame为实际参与计算的光流对数量即被采样帧数减一。这在光流下游任务如运动感知、时序分析、视频生成质量评估中可直接复用。四、效果演示以下效果演示复现官方文档的示例测试视频位于 tests/ops/data 目录下的video1.mp4、video2.mp4、video3.mp4。4.1 test_middle区间过滤VideoMotionScoreFilter(min_score1.5, max_score3.0)输入3 个样本各含 1 个视频video1 / video2 / video3输出仅保留含 video1 的样本解释算子的目标是只保留运动分数落在[1.5, 3.0]的样本。依据单元测试注释中的真实分数video1≈1.869、video2≈3.521、video3≈1.173video1 的分数落在指定范围内被保留video2 与 video3 因超出/低于区间被移除。4.2 test_any多视频样本的任一满足策略VideoMotionScoreFilter(min_score1.5, max_score3.0, any_or_allany)输入3 个样本各含 2 个视频video1video2 / video2video3 / video1video3输出保留第 1 和第 3 个样本解释any模式下只要样本中任意一个视频分数落在[1.5, 3.0]就保留。第 1 个样本video1video2与第 3 个样本video1video3都包含分数约 1.869 的 video1故被保留第 2 个样本video2video3中 video2≈3.521 超上限、video3≈1.173 低于下限无一满足被移除。对应地若将策略改为any_or_allall则仅当样本中所有视频都满足条件时才保留对应测试test_all中该配置下全部样本被过滤。五、单元测试矩阵验证行为与边界tests/ops/filter/test_video_motion_score_filter.py 覆盖了该算子几乎所有关键路径可作为配置时的行为参考测试方法配置要点验证行为test_default默认参数三个视频全部通过默认min_score0.25max_score无上限test_highmin_score3.0仅保留分数最高的 video2≈3.521test_lowmax_score1.50仅保留分数最低的 video3≈1.173test_middlemin_score1.5, max_score3.0仅保留 video1≈1.869test_any/test_allany_or_allany/all多视频样本的聚合策略差异test_downscale/test_downscale_maxsize120/size120, max_size160缩放与长边上限约束下的过滤test_downscale_relativesize(120, 160), relativeTrue缩放 对角线归一化后的阈值设定min_score0.005test_parallelnum_proc2多进程执行结果与单进程一致test_output_optical_flowif_output_optical_flowTruemeta中出现video_optical_flow字段test_frame_field系列frame_fieldframes含/不含original_fps含original_fps为 30/4/2 与sampling_fps2的组合帧输入模式、按original_fps二次采样的步长计算与边界步长过大导致无光流对时分数为-1被过滤测试数据使用同一组video1.mp4/video2.mp4/video3.mp4见 tests/ops/data参考分数分别为约 1.869317、3.52111、1.1731424——这组数值也可以帮你反推如果希望过滤掉几乎静止的视频通常可在relativeFalse时把min_score设在 0.11 之间再结合数据实际分布微调。六、在 Data-Juicer 流程中的配置示例该算子可在数据处理配置文件中直接按算子名video_motion_score_filter引用在data_juicer/ops/filter/__init__.py中已注册导出。一个典型的process配置片段如下process: - video_motion_score_filter: min_score: 0.2 # 低于 0.2 视为静态/低动态视频过滤掉 max_score: 1.7976931348623157e308 # 不设上限可省略以用默认值 sampling_fps: 2 # 每秒采样 2 帧做光流默认值 relative: false # 使用绝对值分数跨分辨率场景可改 true any_or_all: any # 多视频样本任一满足即保留运行方式与 Data-Juicer 其他 filter 算子一致例如通过process_data.py指定配置文件执行详见 ProcessData 文档 与 演示配置。对于视频样本量大的场景算子被标记为UNFORKABLE源码UNFORKABLE.register_module(OP_NAME)说明它不适合被 fork 拆分处理执行时会遵循框架对该类算子的调度策略同时它依赖opencv-contrib-python源码通过 LazyLoader 惰性加载cv2确保在完整安装 Data-Juicer 依赖后可开箱即用。七、小结video_motion_score_filter用稠密光流幅值均值这一可解释、可复现的度量把视频的动感程度变成可配置的筛选门槛。掌握它的关键参数组合即可应对三类常见需求剔除静态/低动态视频min_score设一个较低的正阈值必要时开启relativeTrue消除分辨率影响剔除过激运动/高动态视频收紧max_score上限或配合基类的reversed_range反转区间多视频样本的精细控制用any_or_all切换任一满足与全部满足策略并可用if_output_optical_flow顺带导出光流供下游使用。相关链接官方算子文档算子源代码单元测试测试视频数据光流字段常量定义基类过滤判定逻辑 get_keep_boolean返回算子列表Data-Juicer 数据处理教程赞分享人工智能大模型数据工程数据清洗数据增强数据质检【免费下载链接】data-juicerData processing for and with foundation models! ➡️ ➡️ 项目地址https://gitcode.com/gh_mirrors/da/data-juicer点击查看免费下载相关推荐data-juicer 视频运动分数过滤实战基于 ptlflow 光流的 VideoMotionScorePtlflowFilter 算子详解data juicer 视频运动分数过滤实战基于 ptlflow 光流的 VideoMotionScorePtlflowFilter 算子详解 本篇文章围绕人工智能大模型数据工程数据清洗数据增强数据质检Data-Juicer 的 video_motion_score_raft_filter基于 RAFT 光流的视频运动得分过滤算子实战指南Data Juicer 的 video_motion_score_raft_filter基于 RAFT 光流的视频运动得分过滤算子实战指南 本文围绕 Data人工智能大模型数据工程数据清洗数据增强数据质检Data-Juicer 音频质量过滤实战AudioNMFSNRFilter 与基于 NMF 的信噪比SNR筛选Data Juicer 音频质量过滤实战AudioNMFSNRFilter 与基于 NMF 的信噪比SNR筛选 导读 在构建语音识别ASR、文本转语音人工智能大模型数据工程数据清洗数据增强数据质检上一篇Anteon监控数据备份方案确保历史指标安全存储下一篇PCSX2模拟器终极指南从零开始畅玩2500款PS2经典游戏创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表