上传点球视频,AI 自动识别踢球队员和足球位置,判断是否存在假动作犯规。无需手动标定,拖拽即用。
无需手动标定门线或框选人员,上传视频即可在 40 秒内得到结果。
YOLO 目标检测模型逐帧搜索足球位置,通过网格聚类算法排除画面边缘的误检,精确定位足球坐标。
裁剪放大策略对画面中每个人做姿态估计,每帧独立选取足部离球最近的人作为踢球队员。
当踢球队员的足部接近球不足 80 像素,而球的位置始终未发生显著移动,即判定为假动作犯规。
支持 MP4、AVI、MOV、MKV 格式,文件大小不超过 200MB。
或点击选择本地文件
MP4 / AVI / MOV / MKV / WebM(最大 200MB)完整的技术架构、算法流程与参数配置说明。
| 字段 | 说明 |
|---|---|
| 功能名称 | FeintGuard — AI 假动作检测系统 |
| 适用场景 | 足球点球 / 罚球场景中,AI 自动识别踢球人是否做出摆腿假动作(feinting),辅助裁判判罚 |
| 开发语言 | Python 3.12+ |
| 核心依赖 | Flask ultralytics opencv-python numpy Pillow PyYAML |
| AI 模型 | YOLOv26-Detect(目标检测,80 类)+ YOLOv26-Pose(17 关键点姿态估计),双模型协同推理 |
| 前端技术 | 原生 HTML5 / CSS3 / JavaScript,FeintGuard Unicorn 暗色风格 UI |
| 上传限制 | MAX_CONTENT_LENGTH = 200MB,支持 MP4 / AVI / MOV / MKV / WebM 格式 |
| 任务管理 | 单次请求同步处理(上传 → 抽帧 → 检测 → 判罚 → 截图 → 返回 JSON),前端同步等待结果 |
1. 目录结构与路径管理
2. 视频抽帧引擎
基于 OpenCV VideoCapture 实现,自动检测视频 FPS。按 step = total_frames // 80 策略采样,最多处理 ~80 帧。使用 imencode 编码绕过中文路径兼容性问题。原始分辨率不缩放,直接传递 YOLO 模型。
3. YOLOv26 双模型协同检测
detect_balls(): YOLOv26-Detect 逐帧检测 class=32(sports ball),过滤 conf < 0.2find_ball_cluster(): 80px 网格聚类,选最大簇的均值中心作为足球最终位置detect_persons_with_foot(): YOLOv26-Detect 找 person(class=0, conf ≥ 0.5)collect_kicker_foot_data(): 每帧选足部距球最近的人作为踢球队员(距离 < 300px 才纳入)4. 假动作判定与容错(services/feint_judge.py)
detect_feints(): 足-球像素距离 < min_dist_threshold(默认 80px)→ 判定为假动作make_verdict(): 根据检测结果生成四种判罚结论| Verdict | 含义 | 触发条件 |
|---|---|---|
| FEINT | 检测到假动作 | 足-球距离 < 80px, dedup 后 ≥ 1 次 |
| CLEAN | 正常踢球 | 有采样数据但未触发假动作条件 |
| NO_KICKER | 未检测到踢球人 | 足-球距离序列为空 |
| NO_APPROACH | 踢球人未接近球 | 最近距离 > 200px |
| NO_BALL | 未检测到足球 | 球检测聚类失败 |
5. 字段映射与容错
API 响应 JSON 中内置多种容错处理:
NO_BALL 判罚而非崩溃try/except 捕获,返回 {"error": "..."} 而非 500showErr() 函数在分析失败时恢复页面操作区,不会卡死在 loading 状态配置文件 config.yaml,位于 后端/ 目录下,启动时由 create_app() 读取。
BALL_CLASS=32。每帧 YOLOv26-Detect 推理 → 过滤 conf≥0.2 且位于 margin 内的检测 → 80px 网格聚类 → 取最大簇均值作为足球最终位置。返回 (mean_cx, mean_cy, cluster_size) 或 None。
对 YOLOv26-Detect 找到的每个 person(conf≥0.5)做裁剪放大→3x 放大→YOLOv26-Pose 姿态检测→提取脚踝关键点。每帧选足部距球最近者。关键点优先级: R_ankle(16) → L_ankle(15) → R_knee(14) → L_knee(13)。需 ≥5 个关键点置信度 > 0.3 才采用。最终收集足-球距离时间序列。
detect_feints() 遍历足-球距离序列,距离 < 80px 标记为假动作,5 帧窗口去重。make_verdict() 根据 feint 数量 / 有无采样 / 最近距离生成 FEINT / CLEAN / NO_KICKER / NO_APPROACH 判罚。generate_screenshots() 在原始帧上绘制球(黄圈)、足(红圈)、连线(绿线)、距离标注、判罚标签,JPEG 压缩后返回 URL 列表。
本文系统引用以下学术成果与技术标准。