Close Menu
    Trending
    • Futurwise: Unlock 25% Off Futurwise Today
    • 3D Printer Breaks Kickstarter Record, Raises Over $46M
    • People are using AI to ‘sit’ with them while they trip on psychedelics
    • Reinforcement Learning in the Age of Modern AI | by @pramodchandrayan | Jul, 2025
    • How This Man Grew His Beverage Side Hustle From $1k a Month to 7 Figures
    • Finding the right tool for the job: Visual Search for 1 Million+ Products | by Elliot Ford | Kingfisher-Technology | Jul, 2025
    • How Smart Entrepreneurs Turn Mid-Year Tax Reviews Into Long-Term Financial Wins
    • Become a Better Data Scientist with These Prompt Engineering Tips and Tricks
    AIBS News
    • Home
    • Artificial Intelligence
    • Machine Learning
    • AI Technology
    • Data Science
    • More
      • Technology
      • Business
    AIBS News
    Home»Artificial Intelligence»Zero-Shot Player Tracking in Tennis with Kalman Filtering | by Derek Austin | Jan, 2025
    Artificial Intelligence

    Zero-Shot Player Tracking in Tennis with Kalman Filtering | by Derek Austin | Jan, 2025

    Team_AIBS NewsBy Team_AIBS NewsJanuary 19, 2025No Comments10 Mins Read
    Share Facebook Twitter Pinterest LinkedIn Tumblr Reddit Telegram Email
    Share
    Facebook Twitter LinkedIn Pinterest Email


    Automated tennis monitoring with out labels: GroundingDINO, Kalman filtering, and courtroom homography

    Towards Data Science

    Zero shot monitoring of a complete tennis level. Video supplied underneath an MIT License, and animation created by creator.

    With the current surge in sports activities monitoring initiatives, many impressed by Skalski’s popular soccer tracking project, there’s been a notable shift in direction of utilizing automated participant monitoring for sport hobbyists. Most of those approaches comply with a well-known workflow: acquire labeled information, prepare a YOLO mannequin, undertaking participant coordinates onto an overhead view of the sector or courtroom, and use this monitoring information to generate superior analytics for potential aggressive insights. Nonetheless, on this undertaking, we offer the instruments to bypass the necessity for labeled information, relying as an alternative on GroundingDINO’s zero-shot monitoring capabilities together with a Kalman filter implementation to beat noisy outputs from GroundingDino.

    Our dataset originates from a set of broadcast videos, publicly accessible underneath an MIT License due to Hayden Faulkner and group.¹ This information contains footage from varied tennis matches in the course of the 2012 Olympics at Wimbledon, we give attention to a match between Serena Williams and Victoria Azarenka.

    Some extent discovered between Serena Williams and Victoria Azarenka. Video is made public underneath an MIT License.

    GroundingDINO, for these not acquainted, merges object detection with language permitting customers to provide a immediate like “a tennis participant” which then leads the mannequin to return candidate object detection containers that match the outline. RoboFlow has an ideal tutorial here for these inquisitive about utilizing it — however I’ve pasted some very primary code beneath as effectively. As seen beneath you possibly can immediate the mannequin to determine objects that may very hardly ever if ever be tagged in an object detection dataset like a canine’s tongue!

    from groundingdino.util.inference import load_model, load_image, predict, annotate

    BOX_TRESHOLD = 0.35
    TEXT_TRESHOLD = 0.25

    # processes the picture to GroundingDino requirements
    image_source, picture = load_image("canine.jpg")

    immediate = "canine tongue, canine"
    containers, logits, phrases = predict(
    mannequin=mannequin,
    picture=picture,
    caption=TEXT_PROMPT,
    box_threshold=BOX_TRESHOLD,
    text_threshold=TEXT_TRESHOLD
    )

    GroundingDino output when prompted with “Canine” and “Canine tongue.” Image is owned by the creator.

    Nonetheless, distinguishing gamers on an expert tennis courtroom isn’t so simple as prompting for “tennis gamers.” The mannequin typically misidentifies different people on the courtroom, resembling line judges, ball folks, and different umpires, inflicting jumpy and inconsistent annotations. Moreover, the mannequin typically fails to even detect the gamers in sure frames, resulting in gaps and non-persistent containers that don’t reliably seem in every body.

    Monitoring picks up a traces individual within the first instance and a ball individual within the second. Picture made by the creator.

    To deal with these challenges, we apply a couple of focused strategies. First, we slim down the detection containers to simply the highest three possibilities from all attainable containers. Typically, line judges have the next chance rating than gamers, which is why we don’t filter to solely two containers. Nonetheless, this raises a brand new query: how can we mechanically distinguish gamers from line judges in every body?

    We noticed that detection containers for line and ball personnel sometimes have shorter time spans, typically lasting just some frames. Based mostly on this, we hypothesize that by associating containers throughout consecutive frames, we may filter out folks that solely seem briefly, thereby isolating the gamers.

    So how will we obtain this sort of affiliation between objects throughout frames? Happily, the sector of multi-object monitoring has extensively studied this downside. Kalman filters are a mainstay in multi-object monitoring, typically mixed with different identification metrics, resembling coloration. For our functions, a primary Kalman filter implementation is adequate. In easy phrases (for a deeper dive, test this article out), a Kalman filter is a technique for probabilistically estimating an object’s place based mostly on earlier measurements. It’s notably efficient with noisy information but in addition works effectively associating objects throughout time in movies, even when detections are inconsistent resembling when a participant is just not tracked each body. We implement a complete Kalman filter here however will stroll via a few of the principal steps within the following paragraphs.

    A Kalman filter state for two dimensions is sort of easy as proven beneath. All we have now to do is maintain monitor of the x and y location in addition to the objects velocity in each instructions (we ignore acceleration).

    class KalmanStateVector2D:
    x: float
    y: float
    vx: float
    vy: float

    The Kalman filter operates in two steps: it first predicts an object’s location within the subsequent body, then updates this prediction based mostly on a brand new measurement — in our case, from the article detector. Nonetheless, in our instance a brand new body may have a number of new objects, or it may even drop objects that had been current within the earlier body resulting in the query of how we are able to affiliate containers we have now seen beforehand with these seen at present.

    We select to do that through the use of the Mahalanobis distance, coupled with a chi-squared take a look at, to evaluate the chance {that a} present detection matches a previous object. Moreover, we maintain a queue of previous objects so we have now an extended ‘reminiscence’ than only one body. Particularly, our reminiscence shops the trajectory of any object seen during the last 30 frames. Then for every object we discover in a brand new body we iterate over our reminiscence and discover the earlier object probably to be a match with the present given by the chance given from the Mahalanbois distance. Nonetheless, it’s attainable we’re seeing a wholly new object as effectively, wherein case we must always add a brand new object to our reminiscence. If any object has <30% chance of being related to any field in our reminiscence we add it to our reminiscence as a brand new object.

    We offer our full Kalman filter beneath for these preferring code.

    from dataclasses import dataclass

    import numpy as np
    from scipy import stats

    class KalmanStateVectorNDAdaptiveQ:
    states: np.ndarray # for two dimensions these are [x, y, vx, vy]
    cov: np.ndarray # 4x4 covariance matrix

    def __init__(self, states: np.ndarray) -> None:
    self.state_matrix = states
    self.q = np.eye(self.state_matrix.form[0])
    self.cov = None
    # assumes a single step transition
    self.f = np.eye(self.state_matrix.form[0])

    # divide by 2 as we have now a velocity for every state
    index = self.state_matrix.form[0] // 2
    self.f[:index, index:] = np.eye(index)

    def initialize_covariance(self, noise_std: float) -> None:
    self.cov = np.eye(self.state_matrix.form[0]) * noise_std**2

    def predict_next_state(self, dt: float) -> None:
    self.state_matrix = self.f @ self.state_matrix
    self.predict_next_covariance(dt)

    def predict_next_covariance(self, dt: float) -> None:
    self.cov = self.f @ self.cov @ self.f.T + self.q

    def __add__(self, different: np.ndarray) -> np.ndarray:
    return self.state_matrix + different

    def update_q(
    self, innovation: np.ndarray, kalman_gain: np.ndarray, alpha: float = 0.98
    ) -> None:
    innovation = innovation.reshape(-1, 1)
    self.q = (
    alpha * self.q
    + (1 - alpha) * kalman_gain @ innovation @ innovation.T @ kalman_gain.T
    )

    class KalmanNDTrackerAdaptiveQ:

    def __init__(
    self,
    state: KalmanStateVectorNDAdaptiveQ,
    R: float, # R
    Q: float, # Q
    h: np.ndarray = None,
    ) -> None:
    self.state = state
    self.state.initialize_covariance(Q)
    self.predicted_state = None
    self.previous_states = []
    self.h = np.eye(self.state.state_matrix.form[0]) if h is None else h
    self.R = np.eye(self.h.form[0]) * R**2
    self.previous_measurements = []
    self.previous_measurements.append(
    (self.h @ self.state.state_matrix).reshape(-1, 1)
    )

    def predict(self, dt: float) -> None:
    self.previous_states.append(self.state)
    self.state.predict_next_state(dt)

    def update_covariance(self, achieve: np.ndarray) -> None:
    self.state.cov -= achieve @ self.h @ self.state.cov

    def replace(
    self, measurement: np.ndarray, dt: float = 1, predict: bool = True
    ) -> None:
    """Measurement will probably be a x, y place"""
    self.previous_measurements.append(measurement)
    assert dt == 1, "Solely single step transitions are supported on account of F matrix"
    if predict:
    self.predict(dt=dt)
    innovation = measurement - self.h @ self.state.state_matrix
    gain_invertible = self.h @ self.state.cov @ self.h.T + self.R
    gain_inverse = np.linalg.inv(gain_invertible)
    achieve = self.state.cov @ self.h.T @ gain_inverse

    new_state = self.state.state_matrix + achieve @ innovation

    self.update_covariance(achieve)
    self.state.update_q(innovation, achieve)
    self.state.state_matrix = new_state

    def compute_mahalanobis_distance(self, measurement: np.ndarray) -> float:
    innovation = measurement - self.h @ self.state.state_matrix
    return np.sqrt(
    innovation.T
    @ np.linalg.inv(
    self.h @ self.state.cov @ self.h.T + self.R
    )
    @ innovation
    )

    def compute_p_value(self, distance: float) -> float:
    return 1 - stats.chi2.cdf(distance, df=self.h.form[0])

    def compute_p_value_from_measurement(self, measurement: np.ndarray) -> float:
    """Returns the chance that the measurement is in step with the expected state"""
    distance = self.compute_mahalanobis_distance(measurement)
    return self.compute_p_value(distance)

    Having tracked each detected object over the previous 30 frames, we are able to now devise heuristics to pinpoint which containers probably characterize our gamers. We examined two approaches: deciding on the containers nearest the middle of the baseline, and choosing these with the longest noticed historical past in our reminiscence. Empirically, the primary technique typically flagged line judges as gamers at any time when the precise participant moved away from the baseline, making it much less dependable. In the meantime, we seen that GroundingDino tends to “flicker” between totally different line judges and ball folks, whereas real gamers preserve a considerably secure presence. Because of this, our ultimate rule is to select the containers in our reminiscence with the longest monitoring historical past because the true gamers. As you possibly can see within the preliminary video, it’s surprisingly efficient for such a easy rule!

    With our monitoring system now established on the picture, we are able to transfer towards a extra conventional evaluation by monitoring gamers from a chicken’s-eye perspective. This viewpoint allows the analysis of key metrics, resembling complete distance traveled, participant pace, and courtroom positioning traits. For instance, we may analyze whether or not a participant incessantly targets their opponent’s backhand based mostly on location throughout a degree. To perform this, we have to undertaking the participant coordinates from the picture onto a standardized courtroom template considered from above, aligning the angle for spatial evaluation.

    That is the place homography comes into play. Homography describes the mapping between two surfaces, which, in our case, means mapping the factors on our unique picture to an overhead courtroom view. By figuring out a couple of keypoints within the unique picture — resembling line intersections on a courtroom — we are able to calculate a homography matrix that interprets any level to a chicken’s-eye view. To create this homography matrix, we first must determine these ‘keypoints.’ Numerous open-source, permissively licensed fashions on platforms like RoboFlow may also help detect these factors, or we are able to label them ourselves on a reference picture to make use of within the transformation.

    As you possibly can see the expected keypoints should not excellent however we discover small errors don’t have an effect on the ultimate transformation matrix a lot.

    After labeling these keypoints, the following step is to match them with corresponding factors on a reference courtroom picture to generate a homography matrix. Utilizing OpenCV, we are able to then create this transformation matrix with a couple of easy traces of code!

    import numpy as np
    import cv2

    # order of the factors issues
    supply = np.array(keypoints) # (n, 2) matrix
    goal = np.array(court_coords) # (n, 2) matrix
    m, _ = cv2.findHomography(supply, goal)

    With the homography matrix in hand, we are able to map any level from our picture onto the reference courtroom. For this undertaking, our focus is on the participant’s place on the courtroom. To find out this, we take the midpoint on the base of every participant’s bounding field, utilizing it as their location on the courtroom within the chicken’s-eye view.

    We use the center level on the backside of the field to map to the place every participant is on the courtroom. The illustration reveals the keypoint translated to the tennis courtroom seen from a birds eye view with our homography matrix.

    In abstract, this undertaking demonstrates how we are able to use GroundingDINO’s zero-shot capabilities to trace tennis gamers with out counting on labeled information, reworking complicated object detection into actionable participant monitoring. By tackling key challenges — resembling distinguishing gamers from different on-court personnel, guaranteeing constant monitoring throughout frames, and mapping participant actions to a chicken’s-eye view of the courtroom — we’ve laid the groundwork for a sturdy monitoring pipeline all with out the necessity for express labels.

    This method doesn’t simply unlock insights like distance traveled, pace, and positioning but in addition opens the door to deeper match analytics, resembling shot concentrating on and strategic courtroom protection. With additional refinement, together with distilling a YOLO or RT-DETR mannequin from GroundingDINO outputs, we may even develop a real-time monitoring system that rivals current industrial options, offering a strong instrument for each teaching and fan engagement on the earth of tennis.



    Source link

    Share. Facebook Twitter Pinterest LinkedIn Tumblr Email
    Previous ArticleReimagining Fleet Safety in a Changing Industry | by Suryakant Kaushik | Jan, 2025
    Next Article UPDATE: Trump says he will issue an executive order Monday to get TikTok back after ban
    Team_AIBS News
    • Website

    Related Posts

    Artificial Intelligence

    Become a Better Data Scientist with These Prompt Engineering Tips and Tricks

    July 1, 2025
    Artificial Intelligence

    Lessons Learned After 6.5 Years Of Machine Learning

    July 1, 2025
    Artificial Intelligence

    Prescriptive Modeling Makes Causal Bets – Whether You Know it or Not!

    June 30, 2025
    Add A Comment
    Leave A Reply Cancel Reply

    Top Posts

    Futurwise: Unlock 25% Off Futurwise Today

    July 1, 2025

    I Tried Buying a Car Through Amazon: Here Are the Pros, Cons

    December 10, 2024

    Amazon and eBay to pay ‘fair share’ for e-waste recycling

    December 10, 2024

    Artificial Intelligence Concerns & Predictions For 2025

    December 10, 2024

    Barbara Corcoran: Entrepreneurs Must ‘Embrace Change’

    December 10, 2024
    Categories
    • AI Technology
    • Artificial Intelligence
    • Business
    • Data Science
    • Machine Learning
    • Technology
    Most Popular

    Day 1: making myself ML job ready in 60 days | by Kalukassahun | Apr, 2025

    April 15, 2025

    Take Your Time Back With This Multi-Tasking Ad Blocker, Now $15 for Life

    May 18, 2025

    MP Materials is Trying to Ease Dependence on China for Neodymium Magnets

    December 28, 2024
    Our Picks

    Futurwise: Unlock 25% Off Futurwise Today

    July 1, 2025

    3D Printer Breaks Kickstarter Record, Raises Over $46M

    July 1, 2025

    People are using AI to ‘sit’ with them while they trip on psychedelics

    July 1, 2025
    Categories
    • AI Technology
    • Artificial Intelligence
    • Business
    • Data Science
    • Machine Learning
    • Technology
    • Privacy Policy
    • Disclaimer
    • Terms and Conditions
    • About us
    • Contact us
    Copyright © 2024 Aibsnews.comAll Rights Reserved.

    Type above and press Enter to search. Press Esc to cancel.