大家好,我是小F~
今天给大家介绍一个计算机视觉实战的项目。
这个项目使用YOLO(目前最好的AI物体检测模型之一)来检测跟踪视频中的球员、裁判和足球。
使用Kmeans进行像素分割和聚类,根据球员的T恤颜色将他们分配到各个球队。
有了这些信息,就可以衡量一支球队在比赛中的控球率。
此外使用光流测量帧之间的摄像机移动,使得能够准确测量球员的移动。
通过透视变换来表示场景的深度和透视,使我们能够以米而不是像素为单位测量球员的移动。
最后,我们将计算球员的速度和覆盖的距离。
需要安装Python3,推荐使用Python3.10。
下面是一些Python库的依赖。
ultralytics
supervision
OpenCV
NumPy
Matplotlib
Pandas
主程序代码如下~
from utils import read_video, save_video
from trackers import Tracker
import cv2
import numpy as np
from team_assigner import TeamAssigner
from player_ball_assigner import PlayerBallAssigner
from camera_movement_estimator import CameraMovementEstimator
from view_transformer import ViewTransformer
from speed_and_distance_estimator import SpeedAndDistance_Estimator
def main():
# Read Video
video_frames = read_video('input_videos/08fd33_4.mp4')
# Initialize Tracker
tracker = Tracker('models/best.pt')
tracks = tracker.get_object_tracks(video_frames,
read_from_stub=True,
stub_path='stubs/track_stubs.pkl')
# Get object positions
tracker.add_position_to_tracks(tracks)
# camera movement estimator
camera_movement_estimator = CameraMovementEstimator(video_frames[0])
camera_movement_per_frame = camera_movement_estimator.get_camera_movement(video_frames,
read_from_stub=True,
stub_path='stubs/camera_movement_stub.pkl')
camera_movement_estimator.add_adjust_positions_to_tracks(tracks, camera_movement_per_frame)
# View Trasnformer
view_transformer = ViewTransformer()
view_transformer.add_transformed_position_to_tracks(tracks)
# Interpolate Ball Positions
tracks["ball"] = tracker.interpolate_ball_positions(tracks["ball"])
# Speed and distance estimator
speed_and_distance_estimator = SpeedAndDistance_Estimator()
speed_and_distance_estimator.add_speed_and_distance_to_tracks(tracks)
# Assign Player Teams
team_assigner = TeamAssigner()
team_assigner.assign_team_color(video_frames[0],
tracks['players'][0])
for frame_num, player_track in enumerate(tracks['players']):
for player_id, track in player_track.items():
team = team_assigner.get_player_team(video_frames[frame_num],
track['bbox'],
player_id)
tracks['players'][frame_num][player_id]['team'] = team
tracks['players'][frame_num][player_id]['team_color'] = team_assigner.team_colors[team]
# Assign Ball Aquisition
player_assigner = PlayerBallAssigner()
team_ball_control = []
for frame_num, player_track in enumerate(tracks['players']):
ball_bbox = tracks['ball'][frame_num][1]['bbox']
assigned_player = player_assigner.assign_ball_to_player(player_track, ball_bbox)
if assigned_player != -1:
tracks['players'][frame_num][assigned_player]['has_ball'] = True
team_ball_control.append(tracks['players'][frame_num][assigned_player]['team'])
else:
team_ball_control.append(team_ball_control[-1])
team_ball_control = np.array(team_ball_control)
# Draw output
## Draw object Tracks
output_video_frames = tracker.draw_annotations(video_frames, tracks, team_ball_control)
## Draw Camera movement
output_video_frames = camera_movement_estimator.draw_camera_movement(output_video_frames, camera_movement_per_frame)
## Draw Speed and Distance
speed_and_distance_estimator.draw_speed_and_distance(output_video_frames, tracks)
# Save video
save_video(output_video_frames, 'output_videos/output_video.avi')
if __name__ == '__main__':
main()
项目使用了以下模块:
YOLO:AI物体检测模型
Kmeans:像素分割和聚类来检测T恤颜色
光流:测量相机运动
透视变换:表示场景深度和透视
计算每位球员的速度和距离
项目源码,公众号后台回复:「足球分析」,即可获得。
万水千山总是情,点个 👍 行不行。
推荐阅读
··· END ···