Result in detail

This page describes the content of `result_url`.

Top level

playersobject[]

Data for the whole video sorted by player

team_sessionsobject[]

Team configurations during the video

ralliesfloat[][]

All rallies detected in the video

highlightsobject[]

Highlights -- most interesing rallies -- found in the video

bounce_heatmaparray[]

Heatmap of ball bounces on the court

ball_bouncesarray[]

Array of floor bounces containing position, time, player_id

ball_positionsobject[]

XY-positions of the ball on each 2D frame throughout the video

player_positionsobject[]

XY-court positions of the players throughout the video

confidencesobject

Confidence values for the different components of the analysis

thumbnail_cropsobject

Array of thumbnails for each player

metaobject

Metadata about the analysis run.

warmupsobject[]

Warm-up periods detected in the video.

debug_dataobject

Internal debug data. Present in the output but not intended for general use.

Players

player_idinteger

Tracking id of the player

swingsobject[]

Array of swings performed by player, see description of Swings object below.

swing_type_distributionobject

Swing type distribution for the given player. Keys are swing type values as described in the swing_type field.

{
  "forehand": 0.35,
  "backhand_one_hand": 0.18,
  "backhand_two_hand": 0.10,
  "lob": 0.15,
  "overhead": 0.10,
  "other": 0.12
}
swing_countinteger

Total number of valid swings (swing.valid = True) by the given player throughout the video

Unit: count

covered_distancefloat

Total distance covered throughout the video

Unit: m

fastest_sprintfloat

The fastest sprint throughout the video

Unit: km/h

fastest_sprint_timestampfloat

Timestamp for fastest sprint event

Unit: s

location_heatmaparray[]

Player heat map throughout the video.

activity_scorefloat

Assigned score based on the players number of swings, fastest sprint and total covered distance.

Swings

startobject

Start of swing

Units:

  • timestamp: s
  • frame_nr: index
{
  "timestamp": 13.73,
  "frame_nr": 412
}
endobject

End of swing

Units:

  • timestamp: s
  • frame_nr: index
{
  "timestamp": 14.73,
  "frame_nr": 442
}
player_idinteger

Player tracking id

Unit: scalar

validboolean

"True" if this is a valid swing, as concluded by analysis of player movements and ball trajectory.

Swings that are not valid will be removed from the delivery in the future. For now they are also returned to help evaluate the quality of the analysis.

serveboolean

"True" if the swing is a serve.

The first swing of a rally almost always has serve=true unless we suspect that the first swing of a rally was not detected. Very short rallies are excluded from the rally list, but the serve swing will still have the attribute serve=true. Thus, the number of serves might be larger than the number of rallies.

swing_typestring

The type of swing performed, as classified by the machine learning model based on the player's movements.

ValueSwing type
forehandForehand
backhand_one_handBackhand (one-handed)
backhand_two_handBackhand (two-handed)
lobLob
overheadOverhead
otherOther

Example: "forehand"

volleyboolean

"True" if the swing a volley i.e. there was no bounce before the ball was hit.

Attribute "volley" or "not volley" is not included in the swing type. For example, a forehand ("forehand") swing can be a volley or not, depending on the ball trajectory before the swing. Therefore, the swing type (e.g. forehand: "forehand") is decided by the machine learning model based on player's movements. The volley attribute is added later based on the ball trajectory and other factors such as distance between the player and the net (a ball bounce at the floor is not always detected correctly, that's why other factors are also included).

is_in_rallyboolean

"True" if the swing belongs to a rally.

rallyfloat[]

Two timestamps indicating the start and end of the rally the swing belongs to. If is_in_rally is false, this field is irrelevant.

Unit: s
Example:

[
  1.36699,
  5.96699
]
ball_hitobject

Time of the ball-racket contact

Units:

  • timestamp: s
  • frame_nr: index
{
  "timestamp": 14.23,
  "frame_nr": 427
}
confidence_swing_typefloat

Machine learning confidence value of swing_type. Values are between 0 and 1, higher values indicate higher confidence that the swing is of the given type.

Unit: scalar [0-1]
Example: 0.45

confidence_swing_eventfloat

Machine learning confidence that the detected event is an actual swing.

Unit: scalar [0-1]
Example: 0.97

confidencefloat

Overall confidence that the swing is valid i.e. represents a successful attempt to hit the ball. It is calculated by combining machine learning confidences and consistency of the swing time and place with the ball data. Values are between 0 and 1, higher values indicate higher confidence that the swing is valid.

Unit: scalar [0-1]
Example: 0.65

confidence_volleyfloat

Confidence that the swing is a volley, a float value between 0 and 1. It is an addition to the "volley" attribute, to allow for a more fine-grained analysis. Volley is a boolean attribute that is set to true if the confidence_volley is higher than 0.5.

Confidence_volley is computed based on the floor bounce data, distance between the player and the net, swing type, time after the previous swing, orientation of the player body, serve attribute of the swings.

Unit: scalar [0-1]
Example: 0.79

ball_hit_locationfloat[]

Position of player on court (X,Y) when the ball was hit, in meters. Defined as the middle point between the player's right foot and left foot.

Unit: m

ball_player_distancefloat

Distance on image between the player's bounding box and ball in impact frame. The distance is normalized to the average size of the player's bounding box. Distances larger than one usually indicate that it is not a valid swing since the ball was too far away from the player.

Unit: scalar

ball_speedfloat

Estimated ball velocity just after the ball was hit

Unit: km/h

ball_impact_locationfloat[]

Not in use yet. Location where ball hit the court or where intercepting player returned ball from

Unit: m

ball_impact_typestring

Not in use yet. Impact description

intercepting_player_idinteger

Not in use yet. Tracking ID of intercepting player if applicable

Unit: scalar

ball_trajectoryarray

Not in use yet. Image coordinates of ball after swing

Unit: pixel

annotationsarray

2D Pose data for player during swing

Team Sessions

Team Sessions is a list of objects, each object represents a team configuration containing IDs of players in the front-team and the back-team, as well as the time interval when this configuration was active. The front-team is the team on the court side where the camera is mounted, the back-team plays on the court side opposite to the camera location.

If a player leaves the court, or changes the court side for a short time, this is not considered as a team change. Only long-term changes are considered and only consistent team configurations are reported. The time window to react to team configration changes is currently set to 30 seconds. End of one team session does not necessarily coincide with the start of the next team session, there is usually a transition period when the team configuration is not clear.

Key information about players is also included in the team session objects (recent addition). It is related to the session only, i.e. covered_distance is specific to the player's movement during the session. Player's location heatmap and list of swings with swing_type_distribution are omitted to keep team sessions lightweight.

Each team session object has the following properties:

start_timefloat

Start of team session

Unit: s

end_timefloat

End of team session

Unit: s

team_frontarray

Array of player IDs in the front team (close to the camera)

team_backarray

Array of player IDs in the back team (far from the camera)

playersobject[]

Array of players (in both teams), see description of Players object above.

Player objects here only contain content from within the team session, e.g. activity score is computed based on player's swings, speed and covered distance during the session. They do not include player location heatmap, swing list and swing type distribution.

Example:

[
  {
    "start_time": 0,
    "end_time": 345,
    "team_front": [
      105,
      14
    ],
    "team_back": [
      76,
      84
    ],
  "players": [
    {
      "player_id": 105,
      "swing_count": 12,
      "covered_distance": 353.8545,
      "fastest_sprint": 36.1742,
      "fastest_sprint_timestamp": 289.5,
      "activity_score": 366.7704
    },
    {
      "player_id": 14,
      "swing_count": 9,
      "covered_distance": 286.1234,
      "fastest_sprint": 28.5123,
      "fastest_sprint_timestamp": 123.3,
      "activity_score": 298.4567
    },
    {
      "player_id": 76,
      "swing_count": 10,
      "covered_distance": 310.5678,
      "fastest_sprint": 30.1234,
      "fastest_sprint_timestamp": 200.1,
      "activity_score": 320.7890
    },
    {
      "player_id": 84,
      "swing_count": 8,
      "covered_distance": 295.6789,
      "fastest_sprint": 29.4567,
      "fastest_sprint_timestamp": 150.2,
      "activity_score": 310.1234
    }
  ]
]

Rallies

List of rallies in the video that include actual gameplay starting with a serve and ending e.g. with a ball hitting the net. Short rallies, with duration less than approximately 3 seconds, are excluded from the list.

Rallies are identified by a continuous sequence of swings, without long pauses in between. Serves that start a rally are identified by the position of the serving player and by 'freezing' of all other players waiting for the serve. Warmups where multiple balls are repeatedly seen moving on the court are excluded from rallies. One rally is represented by two float numbers: start and end time of the rally, in seconds.

ralliesfloat[][]

Units: s
Example:

[
  [1.36699, 5.96699],
  [19.533, 25.9],
  [32.8, 36.533]
]

Highlights

Highlights represent the most interesting parts of the match. One highlight is meant to include one rally, from the serve to the last hit. They are identified mostly by a continuous sequence of swings, without long pauses in between, and also by ball data.

Highlights is an array. Each highlight in the array has the following properties.

startobject

Start of highlight

{
  "timestamp": 13.73,
  "frame_nr": 412
}
endobject

End of highlight

{
  "timestamp": 24.73,
  "frame_nr": 742
}
typestring

Type of highlight. So far two types are available: "longest_rally" and "fastest_rally". Longest rally is determined purely by its duration. Fastest rally is determined by the average speed of the ball and also average speed of the players.

Example: "longest_rally"

playersobject[]

Array of players that were active during the highlight, see description of Players object above.

Players object here only contain content from within the highlight duration, e.g. only those swings that have been performed during the highlight. It does not contain player location heatmap (because it occupies a lot of space, and probably has little interest for the short duration of the highlight, while the heatmap for the whole video is already present in the player object).

durationfloat

Duration of highlight (end - start)

Unit: s

swing_countint

Total number of swings during the highlight

Unit: scalar

ball_speedfloat

A relative measure of how fast the ball moves across the video frames during the highlight. It is computed from ball apparent positions on the image, rather than it's positions in the 3D world. It is meant to give a rough idea of which rallies involved faster ball movement. Ball speed here shouldn't be confused with the ball speed in the swing object, which reflects the actual speed of the ball after the hit in 3D world, in km/h.

Unit: scalar

ball_distancefloat

Similar to the ball speed defined above. It is a relative measure of the distance travelled by the ball across the video frames during the highlight. It is computed from ball apparent positions on the image, rather than it's positions in the 3D world. It is meant to give a rough idea of which rallies involved more ball movement.

Unit: scalar

players_distancefloat

Total distance travelled by all the players during the highlight. Computations are based on the player positions in the court coordinates, after proper smoothing.

Unit: m

players_speedfloat

The player distance defined above divided by highlight duration in seconds. Essentially, the sum of average player speeds during the highlight.

Unit: m/s

dynamic_scorefloat

A metric used to sort rallies by their intensity and select the "fastest rally" highlights. It is a product of 4 values: ball' and players' speed and distances, where the speeds are taken to the cubic power. In other words, it is higher for rallies with fastest ball and player motion, but slightly lower for very short rallies.

Unit: scalar

Bounce Heatmap

bounce_heatmaparray[]

2D matrix of integer numbers delivered as an array of arrays. Each numbers indicates the total number of ball bounces in the corresponding cell of the court.

The cell size is 1x1 meter, and the bounce matrix dimensions are 20x10, which reflect the court dimensions of 20x10 meters.

Units

  • scalar, integer non-negative

Example:

[
  [0, 0, 0, 2, 2, 2, 0, 0, 0, 0],
  [2, 1, 4, 1, 4, 0, 1, 1, 0, 0],
  [2, 1, 1, 4, 1, 2, 2, 0, 0, 0]
]

Ball Bounces

Array of ball bounces after the ball was hit by a player. It contains the bounce position in the court coordinates: X and Y in meters, time between the ball hit and the subsequent bounce in seconds, ID of the player who hit the ball before it bounced, and bounce type. So far only two bounce types are included: "floor" and "swing" (i.e. bounce on racket).

Coordinate X is between 0 and 10 meters, and Y is between 0 and 20 meters for the standard padel court.

timestampfloat

Units: seconds

court_posfloat[]

Units: meters [0:10, 0:20]

player_idinteger

Units: scalar

typestring

Values: "floor" or "swing"

Example:

[
  {
    "timestamp": 2.4,
    "court_pos": [
      1.45473,
      6.79042
    ],
    "player_id": 14,
    "type": "floor"
  },
  {
    "timestamp": 5.96699,
    "court_pos": [
      3.78182,
      17.26798
    ],
    "player_id": 105,
    "type": "swing"
  }
]

Ball Positions

ball_positionsobject[]

Timestamps along with coordinates (X,Y) of the ball for every frame of the video where a ball was detected. The coordinates are float numbers in the range [0,1] where (0,0) is the top left corner of the frame and (1,1) is the bottom right corner.

Results for one frame are given as an object with the following properties: timestamp, X, Y. These objects for different frames are combined in an array.

For some frames there is no ball detected, then the difference between timestamps in subsequent array elements is large.

Units

  • timestamp: seconds
  • X, Y: scalar [0-1]

Example:

[
  {
    "timestamp": 0.03301,
    "X": 0.70365,
    "Y": 0.66944
  },
  {
    "timestamp": 0.5,
    "X": 0.69792,
    "Y": 0.66111
  }
]

Player Positions

player_positionsdict

Timestamps and image coordinates (X,Y) and court positions (X,Y) for every player throughout the video. Data are given at approximately 6 frames per second (data are sampled sparser than typical 30 fps for video recording to save on output size).

The image coordinates are float numbers in the range [0,1] where (0,0) is the top left corner of the frame and (1,1) is the bottom right corner. The image coordinates correspond to the center of the player bounding box.

The court positions are distance, in meters, from top left corner of the court (as seen from camera).

Results for one frame are given as an object with the following properties: timestamp, X, Y. 'court_X', 'court_Y'. These objects for different frames are combined in a list for each player. These lists are delivered as a dictionary, with keys being player IDs.

When the player is outside of camera view, or outside of the court, there is no data delivered.

Units

  • timestamp: seconds
  • X, Y: scalar [0-1]
  • court_X, court_Y: scalar [0:10, 0:20]

Example:

{
  "161": [
    {
      "timestamp": 0.33,
      "X": 0.30365,
      "Y": 0.26944,
      "court_X": 1.41,
      "court_Y": 2.55
    },
    {
      "timestamp": 0.5,
      "X": 0.39792,
      "Y": 0.29111,
      "court_X": 1.49,
      "court_Y": 3.1
    }
  ]
}

Confidences

pose_confidencesobject

Confidence level in the poses detected for each player. Object properties are player IDs, the values are objects with two properties ‘mean’ (mean confidence) and ‘count’ (over how many poses this mean value was computed).

Units

  • mean: scalar [0-1]
  • count: integer

Example:

{
  "1995": {
    "mean": 0.66623,
    "count": 75873
  },
  "2631": {
    "mean": 0.64581,
    "count": 81957
  },
  "2854": {
    "mean": 0.63266,
    "count": 84468
  },
  "3031": {
    "mean": 0.67041,
    "count": 79622
  }
}
ball_confidencesobject

Ball detection frequency is a relative fraction of video frames where a ball was detected. Ball detection confidence is a measure of confidence that the determined ball location is correct

Units

  • ball_detection_frequency: scalar [0-1]
  • ball_detection_confidence: scalar [0-1]

Example:

{
  "ball_detection_frequency": 0,
  "ball_detection_confidence": 0.30984
}
swing_confidencesobject

Object properties are player IDs, the values are objects with properties mean (mean confidence), count (over how many occurrences this mean value was computed), and ball_nearby (how often the detected swinging movements matches a ball detection nearby)

Units

  • mean: scalar [0-1]
  • ball_nearby: scalar [0-1]
  • count: integer

Example:

{
  "1995": {
    "mean": 0.66621,
    "ball_nearby": 0.71107,
    "count": 488
  },
  "2631": {
    "mean": 0.67024,
    "ball_nearby": 0.62647,
    "count": 597
  },
  "2854": {
    "mean": 0.65375,
    "ball_nearby": 0.6691,
    "count": 547
  },
  "3031": {
    "mean": 0.52166,
    "ball_nearby": 0.51696,
    "count": 619
  }
}
final_confidencesobject

Confidences averaged over all players (proportionally to the corresponding counts): object with properties pose, ball, swing (computed from mean in swing confidences), swing_ball (computed from ball_nearby in swing confidences). The final confidence is average of all others.

Units

  • pose: scalar [0-1]
  • swing: scalar [0-1]
  • swing_ball: scalar [0-1]
  • ball: scalar [0-1]
  • final: scalar [0-1

Example:

{
  "pose": 0.65326,
  "swing": 0.6245,
  "swing_ball": 0.62506,
  "ball": 0.30984,
  "final": 0.55316
}

Thumbnail Crops

thumbnail_cropsobject

Each player ID is mapped to an array of the top 5 thumbnail frames for that player. Each thumbnail comes in 4 variants which differs in how close the crop is to the players face. The smallest frames the head, the medium sized frames the head and some of the chest, the large box frames the head and torso and the largest frames the full person.

Boundingboxes follow the (xmin, ymin, xmax, ymax) format with coordinates normalized to image dimensions. Example:

{
"4": [
    {
        "bbox": [
            [
                0.6133851574652889,
                0.11593489143187785,
                0.6234476996666691,
                0.13102870473394823
            ],
            [
                0.6083538863645988,
                0.11090362033118772,
                0.6284789707673593,
                0.14109124693532848
            ],
            [
                0.6083538863645988,
                0.10889111189091168,
                0.6284789707673593,
                0.16926636509919316
            ],
            [
                0.6076457500457764,
                0.11096051335334778,
                0.624550998210907,
                0.21223686635494232
            ]
        ],
        "frame_nr": 411,
        "timestamp": 13.699999809265137,
        "score": 0.3808106226830157
    },
    {
        "bbox": [
            [
                0.6137423031787128,
                0.11565495662491035,
                0.6239184624691754,
                0.1309191955606041
            ],
            [
                0.6086542235334815,
                0.11056687697967908,
                0.6290065421144067,
                0.14109535485106664
            ],
            [
                0.6086542235334815,
                0.10853164512158658,
                0.6290065421144067,
                0.16958860086436167
            ],
            [
                0.6079655289649963,
                0.1108631119132042,
                0.6248025298118591,
                0.21169747412204742
            ]
        ],
        "frame_nr": 412,
        "timestamp": 13.73330020904541,
        "score": 0.3777012344630819
    },
    {
        "bbox": [
            [
                0.6054023159644926,
                0.1216291664145315,
                0.6161930309631503,
                0.13781523891251796
            ],
            [
                0.6000069584651637,
                0.11623380891520267,
                0.6215883884624791,
                0.14860595391117562
            ],
            [
                0.6000069584651637,
                0.11407566591547114,
                0.6215883884624791,
                0.17881995590741703
            ],
            [
                0.6001584529876709,
                0.11747521162033081,
                0.6205766797065735,
                0.2218719720840454
            ]
        ],
        "frame_nr": 82,
        "timestamp": 2.733330011367798,
        "score": 0.3621332238345576
    },
    {
        "bbox": [
            [
                0.6143657415112168,
                0.11661404361330573,
                0.6246624738971084,
                0.13205914219214313
            ],
            [
                0.609217375318271,
                0.11146567742035994,
                0.6298108400900542,
                0.1423558745780347
            ],
            [
                0.609217375318271,
                0.10940633094318161,
                0.6298108400900542,
                0.17118672525853115
            ],
            [
                0.6088064908981323,
                0.11195679754018784,
                0.625842809677124,
                0.21372298896312714
            ]
        ],
        "frame_nr": 413,
        "timestamp": 13.76669979095459,
        "score": 0.35957940319590875
    },
    {
        "bbox": [
            [
                0.6165482997894287,
                0.1194416880607605,
                0.6274006366729736,
                0.13572019338607788
            ],
            [
                0.6111221313476562,
                0.11401551961898804,
                0.6328268051147461,
                0.1465725302696228
            ],
            [
                0.6111221313476562,
                0.11184505224227906,
                0.6328268051147461,
                0.1769590735435486
            ],
            [
                0.6106997132301331,
                0.11665115505456924,
                0.6285014748573303,
                0.2224864512681961
            ]
        ],
        "frame_nr": 419,
        "timestamp": 13.966699600219727,
        "score": 0.35655416500383064
    }
]
}

Meta

sport_typestring

Detected sport type used for the analysis.

Example: "padel_doubles"

sport_type_originalstring

Sport type as originally provided before any internal reclassification.

Example: "padel_doubles"

only_in_rally_databoolean

If true, the output contains only swings that belong to a rally.

video_infoobject

Technical information about the input video.

FieldTypeDescription
widthintegerFrame width in pixels
heightintegerFrame height in pixels
fpsfloatFrames per second
durationfloatTotal duration in seconds
total_framesintegerTotal number of frames
start_timestampfloatStart timestamp offset in seconds
end_timefloatEnd time in seconds
codecstringVideo codec (e.g. "h264")
bitrateintegerBitrate in bits per second
video_sourcestringURL of the source video
r_frame_ratefloatReal frame rate
avg_frame_ratefloatAverage frame rate
n_playersinteger

Number of unique players tracked.

n_ralliesinteger

Number of rallies detected.

n_team_sessionsinteger

Number of team sessions detected.

n_floor_bouncesinteger

Number of floor ball bounces detected.

Warmups

Array of warm-up periods: they are considered as not actual gameplay, but a practice session based on number of balls and player behavior. Each warmup object has the following fields:

start_timefloat

Start of the warm-up period.

Unit: seconds

end_timefloat

End of the warm-up period.

Unit: seconds

warmup_confidencefloat

Confidence that this period is a warm-up.

Unit: scalar [0-1]

warmup_ralliesfloat[][]

List of rally time intervals detected within the warm-up period, each as [start_time, end_time].

Unit: seconds

methodstring

Method used to detect the warm-up.

Example: "multiballs"

reasonstring

Reason the period was classified as a warm-up.

Example: "multi_ball_detection"

Example

Here you can see a truncated response (each array shows a maximum of one item).

{
  "players": [
    {
      "player_id": 161,
      "swings": [
        {
          "start": {
            "timestamp": 2.2,
            "frame_nr": 66
          },
          "end": {
            "timestamp": 2.533,
            "frame_nr": 76
          },
          "player_id": 161,
          "swing_type": "lob",
          "serve": false,
          "valid": true,
          "volley": true,
          "is_in_rally": true,
          "rally": [
            1.367,
            5.967
          ],
          "confidence": 0.77426,
          "confidence_swing_type": 0.48363,
          "confidence_volley": 0.7432,
          "ball_hit": {
            "timestamp": 2.367,
            "frame_nr": 71
          },
          "ball_hit_location": [
            6.49,
            1.488
          ],
          "ball_player_distance": 0.8,
          "ball_speed": 64.3,
          "ball_impact_location": null,
          "ball_impact_type": null,
          "intercepting_player_id": null,
          "ball_trajectory": null,
          "annotations": [
            {
              "tracking_id": 161,
              "keypoints": [
                [0.5565, 0.0751],
                [0.5577, 0.073]
              ],
              "confidences": [
                0.5811,
                0.5774
              ],
              "meta": {

              },
              "bbox": [
                0.5399,
                0.0681,
                0.5681,
                0.1552
              ],
              "box_confidence": 1
            }
          ]
        }
      ],
      "swing_type_distribution": {
        "other": 0.3,
        "backhand_one_hand": 0.15,
        "lob": 0.3,
        "overhead": 0.05,
        "forehand": 0.2
      },
      "swing_count": 20,
      "covered_distance": 353.8545,
      "fastest_sprint": 36.1742,
      "fastest_sprint_timestamp": 289.5,
      "activity_score": 366.7704,
      "location_heatmap": [
        [1]
      ]
    },
    {
      "player_id": 13,
      "swings": [
        {
          "start": {
            "timestamp": 20.733,
            "frame_nr": 622
          },
          "end": {
            "timestamp": 21.233,
            "frame_nr": 637
          },
          "player_id": 13,
          "swing_type": "forehand",
          "serve": false,
          "valid": true,
          "volley": false,
          "is_in_rally": true,
          "rally": [
            18.72,
            35.67
          ],
          "confidence": 0.87312,
          "confidence_swing_type": 0.48363,
          "confidence_volley": 0.4332,
          "ball_hit": {
            "timestamp": 21,
            "frame_nr": 630
          },
          "ball_hit_location": [
            3.647,
            19.006
          ],
          "ball_player_distance": 0,
          "ball_speed": 134.932,
          "ball_impact_location": null,
          "ball_impact_type": null,
          "intercepting_player_id": null,
          "ball_trajectory": null,
          "annotations": [
            {
              "tracking_id": 13,
              "keypoints": [
                [0.3042, 0.5294],
                [0.3037, 0.5197]
              ],
              "confidences": [
                0.9151,
                0.7697
              ],
              "meta": {

              },
              "bbox": [
                0.2137,
                0.4686,
                0.3838,
                0.965
              ],
              "box_confidence": 1
            }
          ]
        }
      ],
      "swing_type_distribution": {
        "forehand": 0.12,
        "overhead": 0.16,
        "lob": 0.4,
        "backhand_one_hand": 0.12,
        "other": 0.2
      },
      "swing_count": 15,
      "covered_distance": 442.744,
      "fastest_sprint": 10.0869,
      "fastest_sprint_timestamp": 280.9,
      "activity_score": 431.6462,
      "location_heatmap": [
        [1]
      ]
    }
  ],
  "team_sessions": [
    {
      "start_time": 0,
      "end_time": 2345,
      "team_front": [
        161
      ],
      "team_back": [
        13,
        84
      ],
      "players": [
        {
          "player_id": 161,
          "swing_count": 121,
          "covered_distance": 353.8545,
          "fastest_sprint": 36.1742,
          "fastest_sprint_timestamp": 2289.5,
          "activity_score": 366.7704
        },
        {
          "player_id": 13,
          "swing_count": 91,
          "covered_distance": 286.1234,
          "fastest_sprint": 28.5123,
          "fastest_sprint_timestamp": 123.3,
          "activity_score": 298.4567
        },
        {
          "player_id": 84,
          "swing_count": 60,
          "covered_distance": 310.5678,
          "fastest_sprint": 30.1234,
          "fastest_sprint_timestamp": 1200.1,
          "activity_score": 320.7890
        }
      ]
    }
  ],
  "highlights": [
    {
      "type": "longest_rally",
      "start": {
        "timestamp": 553.3,
        "frame_nr": 16598
      },
      "end": {
        "timestamp": 573.6,
        "frame_nr": 17207
      },
      "duration": 20.3,
      "swing_count": 6,
      "ball_speed": 1.43,
      "ball_distance": 31.2,
      "players_distance": 11.4,
      "players_speed": 0.56,
      "dynamic_score": 88.3,
      "players": [
        {
          "player_id": 161,
          "swings": [
            {
              "start": {
                "timestamp": 556.267,
                "frame_nr": 16687
              },
              "end": {
                "timestamp": 556.733,
                "frame_nr": 16701
              },
              "player_id": 161,
              "swing_type": "overhead",
              "serve": false,
              "valid": true,
              "volley": true,
              "is_in_rally": true,
              "rally": [
                553.3,
                573.6
              ],
              "confidence": 0.9305,
              "confidence_swing_type": 0.5363,
              "confidence_volley": 0.621,
              "ball_hit": {
                "timestamp": 556.5,
                "frame_nr": 16694
              },
              "ball_hit_location": [
                3.387,
                17.833
              ],
              "ball_player_distance": 0.1667,
              "ball_speed": 93.249,
              "ball_impact_location": null,
              "ball_impact_type": null,
              "intercepting_player_id": null,
              "ball_trajectory": null,
              "annotations": [
                {
                  "tracking_id": 161,
                  "keypoints": [
                    [0.3052, 0.3755],
                    [0.3009, 0.3775]
                  ],
                  "confidences": [
                    0.6225,
                    0.5551
                  ],
                  "meta": {

                  },
                  "bbox": [
                    0.2752,
                    0.2662,
                    0.3851,
                    0.6931
                  ],
                  "box_confidence": 1
                }
              ]
            }
          ],
          "swing_type_distribution": {
            "overhead": 0.667,
            "lob": 0.333
          },
          "swing_count": 3,
          "covered_distance": 32.0102,
          "fastest_sprint": 11.3225,
          "activity_score": 35.5163,
          "location_heatmap": [
            [0.2]
          ]
        }
      ]
    }
  ],
  "rallies": [
    [1.36699, 5.96699],
    [19.533, 25.9],
    [32.8, 36.533]
  ],
  "confidences": {
    "pose_confidences": {
      "13": {
        "mean": 0.7004,
        "count": 15154
      },
      "86": {
        "mean": 0.6609,
        "count": 15072
      },
      "149": {
        "mean": 0.6198,
        "count": 15436
      },
      "161": {
        "mean": 0.5937,
        "count": 14728
      }
    },
    "ball_confidences": {
      "ball_detection_frequency": 0,
      "ball_detection_confidence": 0.2037
    },
    "swing_confidences": {
      "13": {
        "mean": 0.613,
        "ball_nearby": 0.72,
        "count": 50
      },
      "86": {
        "mean": 0.5875,
        "ball_nearby": 0.7561,
        "count": 41
      },
      "149": {
        "mean": 0.6839,
        "ball_nearby": 0.8679,
        "count": 53
      },
      "161": {
        "mean": 0.6242,
        "ball_nearby": 0.6364,
        "count": 44
      }
    },
    "final_confidences": {
      "pose": 0.6439,
      "swing": 0.63,
      "swing_ball": 0.75,
      "ball": 0.2037,
      "final": 0.5569
    }
  },
  "bounce_heatmap": [
    [0, 0, 0, 2, 2, 2, 0, 0, 0, 0],
    [2, 1, 4, 1, 4, 0, 1, 1, 0, 0],
    [2, 1, 1, 4, 1, 2, 2, 0, 0, 0],
    [0, 2, 2, 5, 1, 1, 2, 2, 0, 0],
    [4, 6, 1, 2, 2, 0, 0, 1, 1, 2],
    [1, 2, 0, 1, 0, 0, 0, 0, 0, 0],
    [1, 1, 0, 0, 0, 1, 0, 1, 0, 0],
    [0, 0, 0, 0, 1, 1, 1, 0, 0, 0],
    [0, 2, 1, 3, 0, 1, 1, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 3, 0, 0, 0],
    [0, 0, 0, 4, 0, 0, 0, 0, 0, 0],
    [0, 0, 0, 0, 1, 0, 2, 1, 0, 1],
    [0, 0, 2, 0, 1, 1, 1, 1, 0, 0],
    [0, 0, 1, 3, 2, 1, 1, 0, 1, 0],
    [1, 1, 1, 2, 0, 0, 1, 2, 1, 0],
    [0, 0, 1, 0, 1, 2, 1, 1, 2, 0],
    [0, 0, 1, 0, 5, 1, 3, 2, 1, 2],
    [0, 1, 0, 3, 0, 0, 1, 1, 1, 1],
    [0, 1, 0, 0, 1, 0, 0, 1, 0, 0],
    [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
  ],
  "ball_bounces": [
    {
      "timestamp": 2.4,
      "court_pos": [
        1.45473,
        6.79042
      ],
      "player_id": 13,
      "type": "floor"
    },
    {
      "timestamp": 5.96699,
      "court_pos": [
        3.78182,
        17.26798
      ],
      "player_id": 161,
      "type": "swing"
    }
  ],
  "ball_positions": [
    {
      "timestamp": 0.033,
      "X": 0.7036,
      "Y": 0.6694
    },
    {
      "timestamp": 0.5,
      "X": 0.6979,
      "Y": 0.6611
    },
    {
      "timestamp": 0.533,
      "X": 0.701,
      "Y": 0.6509
    },
    {
      "timestamp": 0.567,
      "X": 0.7021,
      "Y": 0.637
    }
  ],
  "player_positions": {
    "161": [
      {
        "timestamp": 0.33,
        "X": 0.3036,
        "Y": 0.2694
      },
      {
        "timestamp": 0.5,
        "X": 0.3979,
        "Y": 0.2911
      }
    ]
  }
}

On this page