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
confidencesobjectConfidence values for the different components of the analysis
thumbnail_cropsobjectArray of thumbnails for each player
metaobjectMetadata about the analysis run.
warmupsobject[]Warm-up periods detected in the video.
debug_dataobjectInternal debug data. Present in the output but not intended for general use.
Players
player_idintegerTracking id of the player
swingsobject[]Array of swings performed by player, see description of Swings object below.
swing_type_distributionobjectSwing type distribution for the given player. Keys are swing type values as described in the swing_type field.
{
"fh_overhead": 0.152,
"fh": 0.204,
"1h_bh": 0.151,
"2h_bh": 0.098,
"other": 0.395
}swing_countintegerTotal number of valid swings (swing.valid = True) by the given player throughout the video
Unit: count
covered_distancefloatTotal distance covered throughout the video
Unit: m
fastest_sprintfloatThe fastest sprint throughout the video
Unit: km/h
fastest_sprint_timestampfloatTimestamp for fastest sprint event
Unit: s
location_heatmaparray[]Player heat map throughout the video.
activity_scorefloatAssigned score based on the players number of swings, fastest sprint and total covered distance.
Swings
startobjectStart of swing
Units:
timestamp: sframe_nr: index
{
"timestamp": 13.73,
"frame_nr": 412
}endobjectEnd of swing
Units:
timestamp: sframe_nr: index
{
"timestamp": 14.73,
"frame_nr": 442
}player_idintegerPlayer 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.
swing_typestringThe type of swing performed, as classified by the machine learning model based on the player's movements.
| Value | Swing type |
|---|---|
fh_overhead | Forehand overhead (often a serve) |
fh | Forehand |
1h_bh | Backhand (one-handed) |
2h_bh | Backhand (two-handed) |
other | Other |
Example: "fh"
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 ("fh") swing can be a volley or not, depending on the ball trajectory before the swing. Therefore, the swing type (e.g. forehand: "fh") 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_hitobjectTime of the ball-racket contact
Units:
timestamp: sframe_nr: index
{
"timestamp": 14.23,
"frame_nr": 427
}confidence_swing_typefloatMachine 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_eventfloatMachine learning confidence that the detected event is an actual swing.
Unit: scalar [0-1]
Example: 0.97
confidencefloatOverall 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_volleyfloatConfidence 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_distancefloatDistance 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_speedfloatEstimated 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_typestringNot in use yet. Impact description
intercepting_player_idintegerNot in use yet. Tracking ID of intercepting player if applicable
Unit: scalar
ball_trajectoryarrayNot in use yet. Image coordinates of ball after swing
Unit: pixel
annotationsarray2D 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_timefloatStart of team session
Unit: s
end_timefloatEnd of team session
Unit: s
team_frontarrayArray of player IDs in the front team (close to the camera)
team_backarrayArray 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.
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.
startobjectStart of highlight
{
"timestamp": 13.73,
"frame_nr": 412
}endobjectEnd of highlight
{
"timestamp": 24.73,
"frame_nr": 742
}typestringType 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).
durationfloatDuration of highlight (end - start)
Unit: s
swing_countintTotal number of swings during the highlight
Unit: scalar
ball_speedfloatA 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_distancefloatSimilar 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_distancefloatTotal 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_speedfloatThe player distance defined above divided by highlight duration in seconds. Essentially, the sum of average player speeds during the highlight.
Unit: m/s
dynamic_scorefloatA 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 23.77x8.23, which reflect the court dimensions of 23.77x8.23 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 8.23 meters (27ft), and Y is between 0 and 23.77 meters (78ft) for the standard tennis court.
timestampfloatUnits: seconds
court_posfloat[]Units: meters [0:8.23, 0:23.77]
player_idintegerUnits: scalar
typestringValues: "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: secondsX,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_positionsdictTimestamps 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: secondsX,Y: scalar [0-1]court_X,court_Y: scalar [0:8.23, 0:23.77]
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_confidencesobjectConfidence 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_confidencesobjectBall 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_confidencesobjectObject 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_confidencesobjectConfidences 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_cropsobjectEach 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_typestringDetected sport type used for the analysis.
Example: "tennis_doubles"
sport_type_originalstringSport type as originally provided before any internal reclassification.
Example: "tennis_unknown"
only_in_rally_databooleanIf true, the output contains only swings that belong to a rally.
video_infoobjectTechnical information about the input video.
| Field | Type | Description |
|---|---|---|
width | integer | Frame width in pixels |
height | integer | Frame height in pixels |
fps | float | Frames per second |
duration | float | Total duration in seconds |
total_frames | integer | Total number of frames |
start_timestamp | float | Start timestamp offset in seconds |
end_time | float | End time in seconds |
codec | string | Video codec (e.g. "h264") |
bitrate | integer | Bitrate in bits per second |
video_source | string | URL of the source video |
r_frame_rate | float | Real frame rate |
avg_frame_rate | float | Average frame rate |
n_playersintegerNumber of unique players tracked.
n_ralliesintegerNumber of rallies detected.
n_team_sessionsintegerNumber of team sessions detected.
n_floor_bouncesintegerNumber 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_timefloatStart of the warm-up period.
Unit: seconds
end_timefloatEnd of the warm-up period.
Unit: seconds
warmup_confidencefloatConfidence 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
methodstringMethod used to detect the warm-up.
Example: "multiballs"
reasonstringReason 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": "other",
"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": {
"fh_overhead": 0.152,
"fh": 0.204,
"1h_bh": 0.151,
"2h_bh": 0.098,
"other": 0.395
},
"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": "fh",
"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": {
"fh_overhead": 0.168,
"fh": 0.221,
"1h_bh": 0.143,
"2h_bh": 0.112,
"other": 0.356
},
"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": "fh_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": {
"fh_overhead": 0.133,
"fh": 0.241,
"1h_bh": 0.178,
"2h_bh": 0.089,
"other": 0.359
},
"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
}
]
}
}