场景检测性能优化方向与测试方法
1. 引言
本指南旨在提供一套系统化的方法,用于验证和分析视频处理项目的效率,特别是针对场景检测模块的性能。通过收集关键性能指标 (KPIs)
和剖析代码执行,我们可以识别性能瓶颈,并为后续的代码优化提供数据支持。
2. 准备工作
2.1. 定义关键性能指标 (KPIs)
在开始测试前,明确需要衡量的性能指标:
- 总处理时间 (End-to-End Time)*衡量单个视频从场景检测开始到结束的总耗时。
- 场景检测函数耗时
detect_scenes
函数的精确执行时间。
- CPU 使用率场景检测过程中的平均和峰值 CPU 使用率。
- 内存使用量 场景检测过程中的峰值和平均内存消耗。
- GPU 使用率 (若启用):GPU 计算单元和显存的使用率。
- 检测到的场景数作为检测结果的一个基本衡量。
- 检测时使用的帧率记录
detect_scenes
内部实际使用的视频帧率。
2.2. 选择测试数据集
- 多样性 准备一组包含不同特征的视频文件:
- 不同分辨率 (例如:720p, 1080p, 4K)。
- 不同编码格式 (例如:H.264, HEVC)。
- 不同时长 (例如:短视频 < 1分钟,中等视频 5-10分钟,长视频 > 30分钟)。
- 不同场景复杂度 (例如:场景切换频繁的预告片,场景切换较少的讲座视频)。
- 代表性 测试视频应能代表项目实际应用中常见的视频类型。
- 可重复性 使用固定的视频集进行所有测试,以便比较不同优化版本的效果。
2.3. 搭建测试环境
- 硬件一致性 所有基准测试应在同一台机器上进行,以消除硬件差异。记录测试机器的 CPU、内存、GPU型号、磁盘类型等规格。
- 软件环境一致性 确保 Python 版本、操作系统以及所有相关依赖库 (如 PySceneDetect, OpenCV, FFmpeg) 的版本在测试期间保持不变。可以从
requirements.txt
文件中获取依赖列表。
- 环境隔离 测试时,尽量关闭其他不必要的应用程序,以减少对测试结果的干扰。
2.4. 配置测试参数
config.ini
基准测试脚本会加载此文件。确保其中的路径配置 (如 ffmpeg_path
, ffprobe_path
) 和默认的检测器参数是你想要测试的基础配置。
- 测试脚本内配置
benchmark_scene_detector.py
脚本允许定义多种测试配置 ( configurations_to_test
列表),例如:
- CPU vs GPU 解码。
- 使用不同的检测器组合 (例如,仅
ContentDetector
vs MultiDetector
全启用)。
- 不同的检测器参数 (例如,不同的
threshold
或 min_scene_len_frames
)。
3. 测试执行
3.1. 测试脚本:benchmark_scene_detector.py
1 2
| pip install memory-profiler psutil snakeviz # snakeviz 用于可视化 cProfile 结果
|
1
| python src/video/benchmark_scene_detector.py
|
1 2
| python -m pstats profiling_results/profile_your_test_video1_Config_Default_CPU.prof
|
1
| snakeviz profiling_results/profile_your_test_video1_Config_Default_CPU.prof
|
3.2. 性能剖析 (Profiling)
- 当测试配置中
"profile": True
时,脚本会为该次运行生成一个 .prof
文件,保存在 profiling_results
目录下。
- 这些文件包含了函数调用次数、每次调用的耗时、累计耗时等详细信息。
3.3. 资源监控
- 手动监控 在测试脚本运行时,使用操作系统自带的工具(如 Windows 的任务管理器,Linux 的
top
/htop
,macOS 的活动监视器)观察
CPU 和内存的实时使用情况。
- GPU 监控 如果测试 GPU 加速,使用特定于 GPU 厂商的工具(如 NVIDIA 的
nvidia-smi
)监控 GPU 利用率和显存使用。
- 脚本内监控 (可选) 可以修改
benchmark_scene_detector.py
,使用 psutil
库在调用 detect_scenes
前后记录进程的 CPU
和内存快照,以获得更精确的数据。
3.4 比较耗时:
- 对比 CPU 和 GPU 配置下的耗时,评估 GPU 加速的实际效果。从示例输出来看,对于“建筑家园-02.mp4”,使用 GPU (
Config_Default_GPU) 将处理时间从约 15.1 秒降低到了约 8.6 秒,有显著提升。
- 对比不同检测器组合或参数下的耗时。例如,Config_ContentDetectorOnly_CPU (仅使用 ContentDetector) 的耗时约为 5.4 秒,远快于使用
MultiDetector 的 Config_Default_CPU (15.1 秒),但检测到的场景数也从 12 个减少到了 9 个。这需要在速度和检测全面性之间进行权衡。
- 观察不同特性视频(如时长、分辨率)对处理时间的影响(需要更多测试视频样本来分析此项)。4.2. 分析性能剖析 (.prof) 文件使用
Python 的 pstats 模块或 snakeviz 工具来分析 .prof 文件。使用 pstats (命令行):
4. 结果分析
4.1. 分析基准测试日志
脚本执行完毕后,会打印一个总结报告,显示每个视频在不同配置下的处理时长和检测到的场景数。
在 pstats 交互式 shell 中,常用命令:
- sort cumulative: 按累计耗时排序。
- stats 20: 显示耗时最多的前 20 个函数。
- callers function_name: 查看哪些函数调用了 function_name。
- callees function_name: 查看 function_name 调用了哪些函数。
使用 snakeviz (Web 界面,推荐):
macOS性能测试结果解释:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76
| /Users/zg/PycharmProjects/scene_detect_split/.venv/bin/python /Users/zg/PycharmProjects/scene_detect_split/src/tests/benchmark_scene_detector.py 2025-05-30 10:46:40.555 | INFO | config.config:initialize_settings:147 - Configuration successfully loaded from: /Users/zg/PycharmProjects/scene_detect_split/src/run/config.ini 2025-05-30 10:46:40.556 | INFO | __main__:<module>:118 - Configuration loaded from: /Users/zg/PycharmProjects/scene_detect_split/src/run/config.ini 2025-05-30 10:46:40.556 | INFO | __main__:<module>:210 - ===== Processing Video: /Volumes/shared/样例/CG渲染样例/建筑家园/建筑家园-02.mp4 ===== 2025-05-30 10:46:40.556 | INFO | __main__:<module>:214 - --- Running with Configuration: Config_Default_CPU --- 2025-05-30 10:46:40.556 | INFO | __main__:run_detection_benchmark:50 - --- Benchmarking: 建筑家园-02.mp4 --- 2025-05-30 10:46:40.556 | INFO | __main__:run_detection_benchmark:51 - Detector Setup: MultiDetector 2025-05-30 10:46:40.556 | INFO | __main__:run_detection_benchmark:52 - Using GPU for OpenCV decode: False 2025-05-30 10:46:40.556 | INFO | video.scene_detector:detect_scenes:69 - [MainThread] Starting detect_scenes for '建筑家园-02.mp4' Backend None not available. Trying another backend: opencv 2025-05-30 10:46:40.720 | INFO | video.scene_detector:detect_scenes:99 - [MainThread] Video '建筑家园-02.mp4' opened with VideoStreamCv2. 2025-05-30 10:46:40.720 | INFO | video.scene_detector:detect_scenes:126 - [MainThread] Configured detector type: MultiDetector for '建筑家园-02.mp4'. 2025-05-30 10:46:40.721 | INFO | video.scene_detector:detect_scenes:133 - [MainThread] Effective global min_scene_len (frames) for detectors: 15 for '建筑家园-02.mp4'. min_delta_hsv is deprecated, use min_content_val instead. 2025-05-30 10:53:54.141 | INFO | video.scene_detector:detect_scenes:302 - [MainThread] SceneManager detected 214 scenes in '建筑家园-02.mp4'. 2025-05-30 10:53:54.143 | INFO | video.scene_detector:detect_scenes:334 - [MainThread] Final 214 scenes for '建筑家园-02.mp4' after adjustments. 2025-05-30 10:53:54.296 | INFO | __main__:run_detection_benchmark:76 - Profiling data saved to: profiling_results/profile_建筑家园_02_Config_Default_CPU.prof 2025-05-30 10:53:54.297 | INFO | __main__:run_detection_benchmark:83 - Video: 建筑家园-02.mp4 2025-05-30 10:53:54.297 | INFO | __main__:run_detection_benchmark:85 - Detected Scenes: 214 2025-05-30 10:53:54.298 | INFO | __main__:run_detection_benchmark:86 - Detected Frame Rate: 60.00 fps 2025-05-30 10:53:54.298 | INFO | __main__:run_detection_benchmark:87 - Processing Time: 433.7327 seconds 2025-05-30 10:53:54.298 | INFO | __main__:run_detection_benchmark:90 - --- Benchmark End --- 2025-05-30 10:53:54.298 | INFO | __main__:<module>:214 - --- Running with Configuration: Config_Default_GPU --- 2025-05-30 10:53:54.298 | INFO | __main__:run_detection_benchmark:50 - --- Benchmarking: 建筑家园-02.mp4 --- 2025-05-30 10:53:54.298 | INFO | __main__:run_detection_benchmark:51 - Detector Setup: MultiDetector 2025-05-30 10:53:54.298 | INFO | __main__:run_detection_benchmark:52 - Using GPU for OpenCV decode: True 2025-05-30 10:53:54.298 | INFO | video.scene_detector:detect_scenes:69 - [MainThread] Starting detect_scenes for '建筑家园-02.mp4' 2025-05-30 10:53:54.299 | INFO | video.scene_detector:detect_scenes:95 - [MainThread] GPU decode (AVFoundation/VideoToolbox likely) on macOS for '建筑家园-02.mp4'. Backend None not available. Trying another backend: opencv 2025-05-30 10:53:54.381 | INFO | video.scene_detector:detect_scenes:99 - [MainThread] Video '建筑家园-02.mp4' opened with VideoStreamCv2. 2025-05-30 10:53:54.381 | INFO | video.scene_detector:detect_scenes:126 - [MainThread] Configured detector type: MultiDetector for '建筑家园-02.mp4'. 2025-05-30 10:53:54.381 | INFO | video.scene_detector:detect_scenes:133 - [MainThread] Effective global min_scene_len (frames) for detectors: 15 for '建筑家园-02.mp4'. min_delta_hsv is deprecated, use min_content_val instead. 2025-05-30 11:00:45.457 | INFO | video.scene_detector:detect_scenes:302 - [MainThread] SceneManager detected 214 scenes in '建筑家园-02.mp4'. 2025-05-30 11:00:45.458 | INFO | video.scene_detector:detect_scenes:334 - [MainThread] Final 214 scenes for '建筑家园-02.mp4' after adjustments. 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:76 - Profiling data saved to: profiling_results/profile_建筑家园_02_Config_Default_GPU.prof 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:83 - Video: 建筑家园-02.mp4 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:85 - Detected Scenes: 214 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:86 - Detected Frame Rate: 60.00 fps 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:87 - Processing Time: 411.5587 seconds 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:90 - --- Benchmark End --- 2025-05-30 11:00:45.865 | INFO | __main__:<module>:214 - --- Running with Configuration: Config_ContentDetectorOnly_CPU --- 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:50 - --- Benchmarking: 建筑家园-02.mp4 --- 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:51 - Detector Setup: ContentDetector 2025-05-30 11:00:45.865 | INFO | __main__:run_detection_benchmark:52 - Using GPU for OpenCV decode: False 2025-05-30 11:00:45.865 | INFO | video.scene_detector:detect_scenes:69 - [MainThread] Starting detect_scenes for '建筑家园-02.mp4' Backend None not available. Trying another backend: opencv 2025-05-30 11:00:45.939 | INFO | video.scene_detector:detect_scenes:99 - [MainThread] Video '建筑家园-02.mp4' opened with VideoStreamCv2. 2025-05-30 11:00:45.939 | INFO | video.scene_detector:detect_scenes:126 - [MainThread] Configured detector type: ContentDetector for '建筑家园-02.mp4'. 2025-05-30 11:00:45.939 | INFO | video.scene_detector:detect_scenes:133 - [MainThread] Effective global min_scene_len (frames) for detectors: 15 for '建筑家园-02.mp4'. 2025-05-30 11:07:26.007 | INFO | video.scene_detector:detect_scenes:302 - [MainThread] SceneManager detected 164 scenes in '建筑家园-02.mp4'. 2025-05-30 11:07:26.011 | INFO | video.scene_detector:detect_scenes:334 - [MainThread] Final 164 scenes for '建筑家园-02.mp4' after adjustments. 2025-05-30 11:07:26.170 | INFO | __main__:run_detection_benchmark:83 - Video: 建筑家园-02.mp4 2025-05-30 11:07:26.170 | INFO | __main__:run_detection_benchmark:85 - Detected Scenes: 164 2025-05-30 11:07:26.170 | INFO | __main__:run_detection_benchmark:86 - Detected Frame Rate: 60.00 fps 2025-05-30 11:07:26.170 | INFO | __main__:run_detection_benchmark:87 - Processing Time: 400.2969 seconds 2025-05-30 11:07:26.170 | INFO | __main__:run_detection_benchmark:90 - --- Benchmark End --- 2025-05-30 11:07:26.170 | INFO | __main__:<module>:236 -
===== Benchmark Summary ===== 2025-05-30 11:07:26.170 | INFO | __main__:<module>:238 - Video: 建筑家园-02.mp4 2025-05-30 11:07:26.170 | INFO | __main__:<module>:240 - Config: Config_Default_CPU | Duration: 433.7327s | Scenes: 214 2025-05-30 11:07:26.170 | INFO | __main__:<module>:240 - Config: Config_Default_GPU | Duration: 411.5587s | Scenes: 214 2025-05-30 11:07:26.170 | INFO | __main__:<module>:240 - Config: Config_ContentDetectorOnly_CPU | Duration: 400.2969s | Scenes: 164 2025-05-30 11:07:26.170 | INFO | __main__:<module>:242 - To analyze .prof files, use a tool like 'snakeviz' or Python's pstats module. 2025-05-30 11:07:26.170 | INFO | __main__:<module>:243 - Example: python -m pstats profiling_results/your_profile_file.prof 2025-05-30 11:07:26.170 | INFO | __main__:<module>:244 - Then in pstats shell: sort cumulative, stats 20
进程已结束,退出代码为 0
|
- macOS 上的 GPU 解码:
- 在 “GPU 监控” 或 “比较耗时” 部分,可以特别说明在 macOS 上,即使没有明确的
VideoStreamCv2Cuda
,PySceneDetect 通过
VideoStreamCv2
也可能间接利用 VideoToolbox/AVFoundation 进行硬件加速解码,但效果可能与专用 CUDA 后端不同。
- PySceneDetect 后端回退:
- 在 “结果分析” 或 “故障排查” (如果添加此章节) 部分,解释
Backend None not available. Trying another backend: opencv
日志的含义,即 PySceneDetect
尝试了默认后端(可能是用户指定的或库的优选)但失败,然后回退到 OpenCV。这对于理解实际使用的解码路径很重要。
- 依赖库版本的重要性:
- 再次强调在 “软件环境一致性” 部分,PySceneDetect、OpenCV (及其 CUDA/OpenCL 支持的编译方式)、FFmpeg
的版本都会显著影响性能和功能,包括硬件加速的可用性。
min_delta_hsv
废弃警告:
- 在 “配置测试参数” 或 “结果分析” 部分,提示用户注意 PySceneDetect 的废弃警告,并及时更新其配置文件或代码以使用推荐的新参数。
通过这些补充,benchmark_test.md
文档将更准确地反映实际的测试情况,并为用户提供更有价值的性能分析指导。
4.2. 分析性能剖析 (.prof
) 文件
使用 Python 的 pstats
模块或 snakeviz
工具来分析 .prof
文件。
- 使用
pstats
(命令行)
- snakeviz 会在浏览器中打开一个交互式的火焰图或旭日图,直观地展示函数调用栈和各部分耗时。
- 关注点:
- 耗时最多的函数:这些是首要的优化目标。通常会是 PySceneDetect 库中与视频解码、帧处理以及各检测器核心算法相关的函数。
- PySceneDetect 内部函数:如果瓶颈在 PySceneDetect 库内部(如特定检测器的 process_frame
方法,视频解码函数),优化方向可能包括调整检测器参数、选择更快的检测器、或优化视频解码方式(如验证 GPU 解码效果,尝试帧降采样)。
- 自定义逻辑:如果 detect_scenes 函数中自定义的逻辑部分(例如,在 scene_detector.py 中添加检测器、调整场景列表的循环)耗时较长,需要针对性优化。
4.3. 分析资源监控数据
CPU 瓶颈:
- 如果 CPU 单核或多核长时间处于高负载状态,表明计算是瓶颈。
- 检查是否存在某个核心远高于其他核心的情况(可能表示并行度不足或某些操作无法有效并行,尽管 detect_scenes 本身是单线程的,但其调用的
OpenCV 或 FFmpeg 后端可能利用多核)。
内存瓶颈:
- 如果内存使用持续增长或达到系统上限,可能存在内存泄漏或处理大数据时内存管理不当。
- PySceneDetect 通常是流式处理,但某些配置或长视频仍可能消耗较多内存。确保 video_api_obj.reset() 被正确调用。
GPU 瓶颈:
- 如果启用了 GPU 加速,但 GPU 利用率低,检查驱动、CUDA/OpenCV 配置,以及数据传输到 GPU 的开销。示例输出显示 GPU 配置 (
Config_Default_GPU) 速度更快,表明 GPU 在此场景下可能得到了有效利用。
- 如果 GPU 利用率高,但性能提升不明显,可能瓶颈在其他部分(如 Python 代码本身、磁盘 I/O)。
5.根据分析结果改进代码 (优化方向示例)
基于上述分析,可以针对性地对 scene_detector.py 及相关模块进行优化:
场景检测策略优化:
- 调整检测器:根据性能和准确度需求,在 config.ini 中启用或禁用特定的检测器,或调整其参数(如 threshold,
min_scene_len_frames)。从示例输出看,仅使用 ContentDetector 速度最快,但场景数略少。需要根据业务需求决定是否值得牺牲一些检测场景换取速度。
- 帧降采样:对于长视频,在 scene_detector.py 中为 SceneManager 设置 frame_skip 或通过
video_api_obj.set_downscale_factor() 来减少处理的帧数/分辨率,以大幅提升速度。将其作为可配置项。视频解码优化:
- 基于测试结果,确定 CPU 解码或 GPU 解码 (VideoStreamCv2Cuda) 在何种情况下更优,并相应调整配置。示例中 GPU 解码效果明显。
代码逻辑优化:
- 检查 detect_scenes 内部是否有可优化的循环或数据处理。确保资源(如 video_api_obj)得到正确和及时的释放。
长视频特定优化:
- 考虑更细粒度的检查点机制(如果 detect_scenes 本身耗时过长)。
- 探索分块处理长视频的策略。
6. 迭代与验证
性能优化是一个迭代过程。每次应用优化后,都应重新运行基准测试,以验证优化的效果,并确保没有引入新的性能问题或功能性缺陷。
通过遵循本指南,您可以系统地评估和提升视频处理项目的性能,特别是在处理计算密集的场景检测任务时。
总结
macOS 场景检测性能测试总结
测试视频: 建筑家园-02.mp4
(60fps)
测试日期: 2025-05-30
关键测试数据
测试配置 |
解码方式 |
检测器组合 |
处理时长 (秒) |
检测场景数 |
帧率 (fps) |
Config_Default_CPU |
CPU |
MultiDetector |
433.7327 |
214 |
60.00 |
Config_Default_GPU |
GPU (请求) |
MultiDetector |
411.5587 |
214 |
60.00 |
Config_ContentDetectorOnly_CPU |
CPU |
ContentDetector |
400.2969 |
164 |
60.00 |
主要结论
-
GPU 加速在 macOS 上的表现:
- 当请求 GPU 解码时 (
Config_Default_GPU
),即使 PySceneDetect 日志显示回退到标准的 VideoStreamCv2
后端 (而非 VideoStreamCv2Cuda
),处理速度相比纯 CPU 解码 (Config_Default_CPU
) 仍有约 5% 的提升 (从 433.73 秒降至 411.56 秒)。
- 这表明在 macOS 上,
VideoStreamCv2
可能间接利用了系统级的硬件加速框架 (如 AVFoundation/VideoToolbox) 进行视频解码。
- 需要注意的是,这种提升幅度可能不如在具有专用 NVIDIA GPU 和正确配置 CUDA 的环境中使用
VideoStreamCv2Cuda
时显著。
-
检测器选择对性能和结果的显著影响:
- 仅使用
ContentDetector
(Config_ContentDetectorOnly_CPU
) 的配置速度最快,处理时长为 400.30 秒。
- 与使用
MultiDetector
的 CPU 配置 (Config_Default_CPU
) 相比,速度提升了约 7.7% (快了约 33 秒)。
- 然而,仅使用
ContentDetector
时,检测到的场景数从 214 个减少到 164 个,表明牺牲了一定的检测全面性。这需要在处理效率和检测结果的完整性之间进行权衡。
-
PySceneDetect 后端行为:
- 测试日志中出现
Backend None not available. Trying another backend: opencv
,表明 PySceneDetect 在尝试使用一个(可能是用户配置的或库优选的)后端失败后,成功回退到了 OpenCV 后端 (VideoStreamCv2
)。这对于理解实际的解码路径和排查配置问题非常重要。
-
库的兼容性提示:
- 日志中
AdaptiveDetector
相关的警告 min_delta_hsv is deprecated, use min_content_val instead.
提示需要更新配置文件中的参数,以确保与 PySceneDetect 库的持续兼容性和最佳实践。
windows 测试结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| D:\pythonProject\venv1\Scripts\python.exe D:\pythonProject\scene-detect-split1\src\tests\benchmark_scene_detector.py 2025-05-30 14:11:57.528 | INFO | config.config:initialize_settings:147 - Configuration successfully loaded from: D:\pythonProject\scene-detect-split1\src\run\config.ini 2025-05-30 14:11:57.529 | INFO | __main__:<module>:118 - Configuration loaded from: D:\pythonProject\scene-detect-split1\src\run\config.ini 2025-05-30 14:11:57.869 | INFO | __main__:<module>:210 - ===== Processing Video: Z:\样例\CG渲染样例\建筑家园\建筑家园-02.mp4 ===== 2025-05-30 14:11:57.869 | INFO | __main__:<module>:214 - --- Running with Configuration: Config_Default_CPU --- 2025-05-30 14:11:57.869 | INFO | __main__:run_detection_benchmark:50 - --- Benchmarking: 建筑家园-02.mp4 --- 2025-05-30 14:11:57.869 | INFO | __main__:run_detection_benchmark:51 - Detector Setup: ContentDetector 2025-05-30 14:11:57.869 | INFO | __main__:run_detection_benchmark:52 - Using GPU for OpenCV decode: False 2025-05-30 14:11:57.870 | INFO | video.scene_detector:detect_scenes:69 - [MainThread] Starting detect_scenes for '建筑家园-02.mp4' Backend None not available. Trying another backend: opencv 2025-05-30 14:11:58.075 | INFO | video.scene_detector:detect_scenes:99 - [MainThread] Video '建筑家园-02.mp4' opened with VideoStreamCv2. 2025-05-30 14:11:58.075 | INFO | video.scene_detector:detect_scenes:126 - [MainThread] Configured detector type: ContentDetector for '建筑家园-02.mp4'. 2025-05-30 14:11:58.075 | INFO | video.scene_detector:detect_scenes:133 - [MainThread] Effective global min_scene_len (frames) for detectors: 15 for '建筑家园-02.mp4'. 2025-05-30 14:16:45.990 | INFO | video.scene_detector:detect_scenes:302 - [MainThread] SceneManager detected 159 scenes in '建筑家园-02.mp4'. 2025-05-30 14:16:45.990 | INFO | video.scene_detector:detect_scenes:334 - [MainThread] Final 159 scenes for '建筑家园-02.mp4' after adjustments. 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:76 - Profiling data saved to: profiling_results\profile_建筑家园_02_Config_Default_CPU.prof 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:83 - Video: 建筑家园-02.mp4 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:85 - Detected Scenes: 159 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:86 - Detected Frame Rate: 60.00 fps 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:87 - Processing Time: 288.2435 seconds 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:90 - --- Benchmark End --- 2025-05-30 14:16:46.113 | INFO | __main__:<module>:214 - --- Running with Configuration: Config_Default_GPU --- 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:50 - --- Benchmarking: 建筑家园-02.mp4 --- 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:51 - Detector Setup: ContentDetector 2025-05-30 14:16:46.113 | INFO | __main__:run_detection_benchmark:52 - Using GPU for OpenCV decode: True 2025-05-30 14:16:46.113 | INFO | video.scene_detector:detect_scenes:69 - [MainThread] Starting detect_scenes for '建筑家园-02.mp4' 2025-05-30 14:16:46.147 | WARNING | video.scene_detector:detect_scenes:93 - [MainThread] VideoStreamCv2Cuda not available. Using CPU for '建筑家园-02.mp4'. Backend None not available. Trying another backend: opencv 2025-05-30 14:16:46.242 | INFO | video.scene_detector:detect_scenes:99 - [MainThread] Video '建筑家园-02.mp4' opened with VideoStreamCv2. 2025-05-30 14:16:46.243 | INFO | video.scene_detector:detect_scenes:126 - [MainThread] Configured detector type: ContentDetector for '建筑家园-02.mp4'. 2025-05-30 14:16:46.243 | INFO | video.scene_detector:detect_scenes:133 - [MainThread] Effective global min_scene_len (frames) for detectors: 15 for '建筑家园-02.mp4'. 2025-05-30 14:20:35.982 | INFO | video.scene_detector:detect_scenes:302 - [MainThread] SceneManager detected 159 scenes in '建筑家园-02.mp4'. 2025-05-30 14:20:35.982 | INFO | video.scene_detector:detect_scenes:334 - [MainThread] Final 159 scenes for '建筑家园-02.mp4' after adjustments. 2025-05-30 14:20:36.101 | INFO | __main__:run_detection_benchmark:76 - Profiling data saved to: profiling_results\profile_建筑家园_02_Config_Default_GPU.prof 2025-05-30 14:20:36.101 | INFO | __main__:run_detection_benchmark:83 - Video: 建筑家园-02.mp4 2025-05-30 14:20:36.102 | INFO | __main__:run_detection_benchmark:85 - Detected Scenes: 159 2025-05-30 14:20:36.102 | INFO | __main__:run_detection_benchmark:86 - Detected Frame Rate: 60.00 fps 2025-05-30 14:20:36.102 | INFO | __main__:run_detection_benchmark:87 - Processing Time: 229.9882 seconds 2025-05-30 14:20:36.102 | INFO | __main__:run_detection_benchmark:90 - --- Benchmark End --- 2025-05-30 14:20:36.102 | INFO | __main__:<module>:214 - --- Running with Configuration: Config_ContentDetectorOnly_CPU --- 2025-05-30 14:20:36.102 | INFO | __main__:run_detection_benchmark:50 - --- Benchmarking: 建筑家园-02.mp4 --- 2025-05-30 14:20:36.102 | INFO | __main__:run_detection_benchmark:51 - Detector Setup: ContentDetector 2025-05-30 14:20:36.102 | INFO | __main__:run_detection_benchmark:52 - Using GPU for OpenCV decode: False 2025-05-30 14:20:36.102 | INFO | video.scene_detector:detect_scenes:69 - [MainThread] Starting detect_scenes for '建筑家园-02.mp4' Backend None not available. Trying another backend: opencv 2025-05-30 14:20:36.194 | INFO | video.scene_detector:detect_scenes:99 - [MainThread] Video '建筑家园-02.mp4' opened with VideoStreamCv2. 2025-05-30 14:20:36.194 | INFO | video.scene_detector:detect_scenes:126 - [MainThread] Configured detector type: ContentDetector for '建筑家园-02.mp4'. 2025-05-30 14:20:36.194 | INFO | video.scene_detector:detect_scenes:133 - [MainThread] Effective global min_scene_len (frames) for detectors: 15 for '建筑家园-02.mp4'. 2025-05-30 14:24:23.153 | INFO | video.scene_detector:detect_scenes:302 - [MainThread] SceneManager detected 159 scenes in '建筑家园-02.mp4'. 2025-05-30 14:24:23.153 | INFO | video.scene_detector:detect_scenes:334 - [MainThread] Final 159 scenes for '建筑家园-02.mp4' after adjustments. 2025-05-30 14:24:23.278 | INFO | __main__:run_detection_benchmark:83 - Video: 建筑家园-02.mp4 2025-05-30 14:24:23.278 | INFO | __main__:run_detection_benchmark:85 - Detected Scenes: 159 2025-05-30 14:24:23.278 | INFO | __main__:run_detection_benchmark:86 - Detected Frame Rate: 60.00 fps 2025-05-30 14:24:23.278 | INFO | __main__:run_detection_benchmark:87 - Processing Time: 227.1770 seconds 2025-05-30 14:24:23.278 | INFO | __main__:run_detection_benchmark:90 - --- Benchmark End --- 2025-05-30 14:24:23.278 | INFO | __main__:<module>:236 -
===== Benchmark Summary ===== 2025-05-30 14:24:23.280 | INFO | __main__:<module>:238 - Video: 建筑家园-02.mp4 2025-05-30 14:24:23.280 | INFO | __main__:<module>:240 - Config: Config_Default_CPU | Duration: 288.2435s | Scenes: 159 2025-05-30 14:24:23.280 | INFO | __main__:<module>:240 - Config: Config_Default_GPU | Duration: 229.9882s | Scenes: 159 2025-05-30 14:24:23.280 | INFO | __main__:<module>:240 - Config: Config_ContentDetectorOnly_CPU | Duration: 227.1770s | Scenes: 159 2025-05-30 14:24:23.280 | INFO | __main__:<module>:242 - To analyze .prof files, use a tool like 'snakeviz' or Python's pstats module. 2025-05-30 14:24:23.280 | INFO | __main__:<module>:243 - Example: python -m pstats profiling_results/your_profile_file.prof 2025-05-30 14:24:23.280 | INFO | __main__:<module>:244 - Then in pstats shell: sort cumulative, stats 20
Process finished with exit code 0
|
Windows 平台场景检测性能测试总结
测试视频: 建筑家园-02.mp4
(60fps)
测试日期: 2025-05-30
测试平台: Windows
关键测试数据
测试配置 |
解码方式 |
检测器设置 |
处理时长 (秒) |
检测场景数 |
Config_Default_CPU |
CPU |
ContentDetector* |
288.2435 |
159 |
Config_Default_GPU |
GPU (请求) |
ContentDetector* |
229.9882 |
159 |
Config_ContentDetectorOnly_CPU |
CPU |
ContentDetector |
227.1770 |
159 |
- 重要: 日志显示所有配置(包括
Config_Default_CPU
和 Config_Default_GPU
)的 Detector Setup
均为 ContentDetector
。这表明 benchmark_scene_detector.py
中的这些 “Default” 配置可能错误地仅指定了 ContentDetector
,而不是 config.ini
中定义的 MultiDetector
。因此,以下分析基于所有测试实际上都只使用了 ContentDetector
。
主要结论
-
GPU 加速请求在 Windows 上的表现 (当 CUDA 后端不可用时):
- 当请求 GPU 解码时 (
Config_Default_GPU
),日志明确指出 VideoStreamCv2Cuda not available. Using CPU...
。最终视频流通过标准的 VideoStreamCv2
后端由 CPU 完成解码。
- 尽管如此,
Config_Default_GPU
(229.99 秒) 仍然比 Config_Default_CPU
(288.24 秒) 快了约 58.25 秒,性能提升约 20.2%。
- 这可能归因于 Windows 平台上 OpenCV 的 CPU 解码后端(如 Media Foundation 或 DirectShow)在特定路径或针对某些视频格式时,相比纯粹的 CPU 路径有更优化的表现,或者系统资源调度差异。
-
ContentDetectorOnly_CPU
作为最快配置:
Config_ContentDetectorOnly_CPU
(227.18 秒) 是所有配置中最快的,符合预期。
- 它与
Config_Default_GPU
(实际也是 ContentDetector + CPU 解码) 的性能差异较小 (约 2.8 秒),可能在测量误差范围内。
-
PySceneDetect 后端回退:
- 日志清晰展示了当优选后端(如 CUDA)不可用时,PySceneDetect 回退到标准 OpenCV (
VideoStreamCv2
) 的行为。
-
与 macOS 测试的对比 (针对同一视频,但检测器配置可能不同):
- 在 Windows 上仅使用
ContentDetector
(CPU) 处理此视频 (约 227-288 秒) 比之前在 macOS 上使用 MultiDetector
(CPU) (约 433 秒) 要快。如果 macOS 也仅用 ContentDetector
(约 400 秒),Windows 仍然更快。这可能反映了操作系统底层视频处理框架的效率差异。
- 在“请求GPU但回退到CPU”的情况下,Windows 平台显示出相对更大的性能提升 (约 20.2%),而 macOS 平台 (针对
MultiDetector
) 约为 5%。
关键问题点与后续行动建议
-
核实并修正 benchmark_scene_detector.py
中的测试配置:
- 首要任务: 确保
Config_Default_CPU
和 Config_Default_GPU
配置正确地使用了您期望的 MultiDetector
设置(从 config.ini
的 [SceneDetectorSetup]
加载)。如果当前它们被错误地指向了仅 ContentDetector
,那么对 MultiDetector
的性能评估是不准确的。
-
彻底排查 VideoStreamCv2Cuda not available
问题:
- 检查 OpenCV-Python 版本 (确保是为 Windows 编译的、包含 CUDA 支持的版本)。
- 检查 CUDA Toolkit 和 cuDNN 的安装与兼容性。
- 检查 系统环境变量 (如
PATH
, CUDA_PATH
)。
- 检查 NVIDIA 驱动程序版本。
- 运行项目中的
cuda_available_verify.py
脚本获取直接反馈。
-
在 CUDA 成功启用后重新进行基准测试:
- 只有当
VideoStreamCv2Cuda
能够成功加载和使用时,才能真正评估 GPU 对视频解码的加速效果。
- 届时,重点对比
MultiDetector
配置下 CPU 与 GPU (CUDA) 的性能。
-
分析 .prof
文件:
- 对于修正配置后的
MultiDetector
测试,使用 snakeviz
分析 .prof
文件。
- 关注视频 I/O (
cv2.VideoCapture
的 retrieve
和 grab
方法) 和各个子检测器在 CPU 与 GPU 配置下的耗时。
-
继续测试帧降采样:
- 无论 CUDA 是否成功启用,如果视频 I/O 依然是主要瓶颈,帧降采样 (
frame_skip
和 downscale_factor
) 都是至关重要的优化策略。
后续分析建议
- 深入剖析
.prof
文件: 使用 snakeviz
或 pstats
分析 MultiDetector
配置下各具体检测器的耗时,以精确定位性能瓶颈。
- 测试帧降采样: 鉴于当前处理时间较长,强烈建议测试帧降采样 (
frame_skip
或 downscale_factor
) 对长视频处理效率的影响。
- 参数调优: 针对
MultiDetector
中的各个检测器,细致调整其参数,寻找性能与准确度的最佳平衡点。
- 多样化测试: 使用更多不同类型和长度的视频进行测试,以验证当前结论的普适性。
测试结果如图
macOS平台测试结果图示




window平台测试结果图示



