长视频非球场画面过滤示例

ShuttleSet 比赛视频里混着比赛画面、特写、回放、观众席。Task E 的目标是自动判定每帧是否为 固定机位比赛画面(court visible),剔除非比赛片段,为后续 BT_Transformer 训练提供干净数据。 下方为方法验证阶段的产出视频与 bbox 可视化。

● court visible 43.1% ● NO COURT 56.9% ShuttleSet · An Se Young vs Pornpawee · Thailand Open 2021 QF 5 分钟片段验证

1 视频演示

两个示例均来自同一场比赛的 5 分钟 ffmpeg 切片(frame 20000–29000)。

球场过滤演示 court filter

每帧检查 homography.csv 四角点附近是否有白线像素:≥3/4 命中 → court visible, 画蓝色角点;否则打红色 NO COURT 水印。此为 filter_court_video.py 输出。

脚本 filter_court_video.py 方法 角点白像素评分(无 ML) 分辨率 1920×1080

球员框 + 球位置标注 detection

在同一片段上叠加 YOLOv11x 球员检测框(绿 Player A / 红 Player B)与 TrackNet 球位置, 来自检测缓存。此为 annotate_video_segment.py 输出,展示下游检测管线效果。

脚本 annotate_video_segment.py 数据源 frame_detections / ball_trajectory parquet 输出 1280×720
43.1%
court visible 帧
56.9%
NO COURT 帧
4 / 4
角点命中阈值(≥3 判定可见)

2 判定方法

轻量启发式,无需机器学习模型,直接复用 ShuttleSet 自带的角点元数据。

  1. homography.csv 读取每场比赛四个球场角点像素坐标(原为 1280×720,按视频实际分辨率 ×1.5 缩放)。
  2. 逐帧在角点周围(半径 5px)检查是否有白色像素(球场线,灰度阈值 ≥180)。
  3. ≥3/4 角点落在白线上 → court visible(比赛画面);否则 → NO COURT(特写/回放/观众)。
  4. 输出标注视频 + 统计比例,用户目测确认准确。

当前进度:判定与标注已完成验证;真正的「连续片段提取」(输出 {start_frame, end_frame} segment JSON、 按 gap<30 帧分组、过滤 <3s 短片段)尚在规划中,对应 filter_gameplay_segments.py 待编写。