sports2d 0.8.24__py3-none-any.whl → 0.8.26__py3-none-any.whl

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: sports2d
3
- Version: 0.8.24
3
+ Version: 0.8.26
4
4
  Summary: Compute 2D human pose and angles from a video or a webcam.
5
5
  Author-email: David Pagnon <contact@david-pagnon.com>
6
6
  Maintainer-email: David Pagnon <contact@david-pagnon.com>
@@ -40,6 +40,8 @@ Dynamic: license-file
40
40
  [![License](https://img.shields.io/badge/License-BSD_3--Clause-blue.svg)](https://opensource.org/licenses/BSD-3-Clause)
41
41
  \
42
42
  [![Discord](https://img.shields.io/discord/1183750225471492206?logo=Discord&label=Discord%20community)](https://discord.com/invite/4mXUdSFjmt)
43
+ [![Hugging Face Space](https://img.shields.io/badge/HuggingFace-Sports2D-yellow?logo=huggingface)](https://huggingface.co/spaces/DavidPagnon/sports2d)
44
+
43
45
 
44
46
  <!-- [![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://bit.ly/Sports2D_Colab)-->
45
47
 
@@ -52,7 +54,7 @@ Dynamic: license-file
52
54
  </br>
53
55
 
54
56
  > **`Announcements:`**
55
- > - Generate or import a calibration file, OpenSim skeleton overlay **New in v0.9!**
57
+ > - Compensate for floor angle, floor height, depth perspective effects, generate a calibration file **New in v0.8.25!**
56
58
  > - Select only the persons you want to analyze **New in v0.8!**
57
59
  > - MarkerAugmentation and Inverse Kinematics for accurate 3D motion with OpenSim. **New in v0.7!**
58
60
  > - Any detector and pose estimation model can be used. **New in v0.6!**
@@ -80,7 +82,7 @@ https://github.com/user-attachments/assets/2ce62012-f28c-4e23-b3b8-f68931bacb77
80
82
  <!-- https://github.com/user-attachments/assets/1c6e2d6b-d0cf-4165-864e-d9f01c0b8a0e -->
81
83
 
82
84
  `Warning:` Angle estimation is only as good as the pose estimation algorithm, i.e., it is not perfect.\
83
- `Warning:` Results are acceptable only if the persons move in the 2D plane (sagittal or frontal plane). The persons need to be filmed as parallel as possible to the motion plane.\
85
+ `Warning:` Results are acceptable only if the persons move in the 2D plane (sagittal or frontal). The persons need to be filmed as parallel as possible to the motion plane.\
84
86
  If you need 3D research-grade markerless joint kinematics, consider using several cameras with **[Pose2Sim](https://github.com/perfanalytics/pose2sim)**.
85
87
 
86
88
  <!--`Warning:` Google Colab does not follow the European GDPR requirements regarding data privacy. [Install locally](#installation) if this matters.-->
@@ -90,7 +92,8 @@ If you need 3D research-grade markerless joint kinematics, consider using severa
90
92
 
91
93
  ## Contents
92
94
  1. [Installation and Demonstration](#installation-and-demonstration)
93
- 1. [Installation](#installation)
95
+ 1. [Test it on Hugging face](#test-it-on-hugging-face)
96
+ 1. [Local installation](#local-installation)
94
97
  1. [Quick install](#quick-install)
95
98
  2. [Full install](#full-install)
96
99
  2. [Demonstration](#demonstration)
@@ -119,7 +122,16 @@ If you need 3D research-grade markerless joint kinematics, consider using severa
119
122
 
120
123
  ## Installation and Demonstration
121
124
 
122
- ### Installation
125
+
126
+ ### Test it on Hugging face
127
+
128
+ Test an online, limited version [on Hugging Face](https://huggingface.co/spaces/DavidPagnon/sports2d): [![Hugging Face Space](https://img.shields.io/badge/HuggingFace-Sports2D-yellow?logo=huggingface)](https://huggingface.co/spaces/DavidPagnon/sports2d)
129
+
130
+ <img src="Content/huggingface_demo.png" width="760">
131
+
132
+
133
+
134
+ ### Local installation
123
135
 
124
136
  <!--- OPTION 0: **Use Colab** \
125
137
  User-friendly (but full) version, also works on a phone or a tablet.\
@@ -294,30 +306,35 @@ sports2d --person_ordering_method on_click
294
306
  #### Get coordinates in meters:
295
307
  > **N.B.:** The Z coordinate (depth) should not be overly trusted.
296
308
 
297
- You may want coordinates in meters rather than pixels. 2 options to do so:
309
+ To convert from pixels to meters, you need a minima the height of a participant. Better results can be obtained by also providing an information on depth. The camera horizon angle and the floor height are generally automatically estimated. **N.B.: A calibration file will be generated.**
298
310
 
299
- 1. **Just provide the height of a reference person**:
300
- - Their height in meters is be compared with their height in pixels to get a pixel-to-meter conversion factor.
301
- - To estimate the depth coordinates, specify which side of the person is visible: `left`, `right`, `front`, or `back`. Use `auto` if you want it to be automatically determined (only works for motions in the sagittal plane), or `none` if you want to keep 2D coordinates instead of 3D (if the person turns around, for example).
302
- - The floor angle is automatically estimated from gait, as well as the origin of the xy axis. The person trajectory is corrected accordingly. You can use the `--floor_angle` and `--xy_origin` parameters to manually specify them if your subject is not travelling horizontally or if you want the origin not to be under their feet (note that the `y` axis points down).
303
-
304
- **N.B.: A calibration file will be generated.** By convention, the camera-to-subject distance is set to 10 meters.
311
+ - The pixel-to-meters scale is computed from the ratio between the height of the participant in meters and in pixels. The height in pixels is automatically calculated; use the `--first_person_height` parameter to specify the height in meters.
312
+ - Depth perspective effects can be compensated either with the camera-to-person distance (m), or focal length (px), or field-of-view (degrees or radians), or from a calibration file. Use the `--perspective_unit` ('distance_m', 'f_px', 'fov_deg', 'fov_rad', or 'from_calib') and `--perspective_value` parameters (resp. in m, px, deg, rad, or '').
313
+ - The camera horizon angle can be estimated from kinematics (`auto`), from a calibration file (`from_calib`), or manually (float). Use the `--floor_angle` parameter.
314
+ - Likewise for the floor level. Use the `--xy_origin` parameter.
305
315
 
306
- ``` cmd
307
- sports2d --first_person_height 1.65 --visible_side auto front none
308
- ```
309
- ``` cmd
310
- sports2d --first_person_height 1.65 --visible_side auto front none `
311
- --person_ordering_method on_click `
312
- --floor_angle 0 --xy_origin 0 940
313
- ```
316
+ If one of these parameters is set to `from_calib`, then use `--calib_file`.
314
317
 
315
- 2. **Or use a calibration file**:\
316
- It can either be a `.toml` calibration file previously generated by Sports2D, or a more accurate one coming from another system. For example, [Pose2Sim](https://github.com/perfanalytics/pose2sim) can be used to accurately calculate calibration, or to convert calibration files from Qualisys, Vicon, OpenCap, FreeMoCap, etc.
317
318
 
318
- ``` cmd
319
- sports2d --calib_file Calib_demo.toml --visible_side auto front none
320
- ```
319
+ ``` cmd
320
+ sports2d --first_person_height 1.65
321
+ ```
322
+ ``` cmd
323
+ sports2d --first_person_height 1.65 `
324
+ --floor_angle auto `
325
+ --xy_origin auto`
326
+ --perspective_unit distance_m --perspective_value 10
327
+ ```
328
+ ``` cmd
329
+ sports2d --first_person_height 1.65 `
330
+ --floor_angle 0 `
331
+ --xy_origin from_calib`
332
+ --perspective_unit from_calib --calib_file Sports2D\Demo\Calib_demo.toml
333
+ ```
334
+ ``` cmd
335
+ sports2d --first_person_height 1.65 `
336
+ --perspective_unit f_px --perspective_value 2520
337
+ ```
321
338
 
322
339
  <br>
323
340
 
@@ -419,7 +436,7 @@ sports2d --video_input demo.mp4 other_video.mp4 --time_range 1.2 2.7 0 3.5
419
436
  sports2d --calculate_angles false
420
437
  ```
421
438
  - Flip angles when the person faces the other side.\
422
- **N.B.:** *We consider that the person looks to the right if their toe keypoint is to the right of their heel. This is not always true when the person is sprinting, especially in the swing phase. Set it to false if you want timeseries to be continuous even when the participant switches their stance.*
439
+ **N.B.: Set to false when sprinting.** *We consider that each limb "looks" to the right if the toe keypoint is to the right of the heel one. This is not always true, particularly during the swing phase of sprinting. Set it to false if you want timeseries to be continuous even when the participant switches their stance.*
423
440
  ```cmd
424
441
  sports2d --flip_left_right true # Default
425
442
  ```
@@ -480,20 +497,25 @@ sports2d --help
480
497
  'config': ["C", "path to a toml configuration file"],
481
498
 
482
499
  'video_input': ["i", "webcam, or video_path.mp4, or video1_path.avi video2_path.mp4 ... Beware that images won't be saved if paths contain non ASCII characters"],
500
+ 'time_range': ["t", "start_time end_time. In seconds. Whole video if not specified. start_time1 end_time1 start_time2 end_time2 ... if multiple videos with different time ranges"],
483
501
  'nb_persons_to_detect': ["n", "number of persons to detect. int or 'all'. 'all' if not specified"],
484
502
  'person_ordering_method': ["", "'on_click', 'highest_likelihood', 'largest_size', 'smallest_size', 'greatest_displacement', 'least_displacement', 'first_detected', or 'last_detected'. 'on_click' if not specified"],
485
503
  'first_person_height': ["H", "height of the reference person in meters. 1.65 if not specified. Not used if a calibration file is provided"],
486
504
  'visible_side': ["", "front, back, left, right, auto, or none. 'auto front none' if not specified. If 'auto', will be either left or right depending on the direction of the motion. If 'none', no IK for this person"],
505
+ 'participant_mass': ["", "mass of the participant in kg or none. Defaults to 70 if not provided. No influence on kinematics (motion), only on kinetics (forces)"],
506
+ 'perspective_value': ["", "Either camera-to-person distance (m), or focal length (px), or field-of-view (degrees or radians), or '' if perspective_unit=='from_calib'"],
507
+ 'perspective_unit': ["", "'distance_m', 'f_px', 'fov_deg', 'fov_rad', or 'from_calib'"],
508
+ 'do_ik': ["", "do inverse kinematics. false if not specified"],
509
+ 'use_augmentation': ["", "Use LSTM marker augmentation. false if not specified"],
487
510
  'load_trc_px': ["", "load trc file to avaid running pose estimation again. false if not specified"],
488
511
  'compare': ["", "visually compare motion with trc file. false if not specified"],
489
- 'webcam_id': ["w", "webcam ID. 0 if not specified"],
490
- 'time_range': ["t", "start_time end_time. In seconds. Whole video if not specified. start_time1 end_time1 start_time2 end_time2 ... if multiple videos with different time ranges"],
491
512
  'video_dir': ["d", "current directory if not specified"],
492
513
  'result_dir': ["r", "current directory if not specified"],
514
+ 'webcam_id': ["w", "webcam ID. 0 if not specified"],
493
515
  'show_realtime_results': ["R", "show results in real-time. true if not specified"],
494
516
  'display_angle_values_on': ["a", '"body", "list", "body" "list", or "none". body list if not specified'],
495
517
  'show_graphs': ["G", "show plots of raw and processed results. true if not specified"],
496
- 'save_graphs': ["", "save position and angle plots of raw and processed results. false if not specified"],
518
+ 'save_graphs': ["", "save position and angle plots of raw and processed results. true if not specified"],
497
519
  'joint_angles': ["j", '"Right ankle" "Left ankle" "Right knee" "Left knee" "Right hip" "Left hip" "Right shoulder" "Left shoulder" "Right elbow" "Left elbow" if not specified'],
498
520
  'segment_angles': ["s", '"Right foot" "Left foot" "Right shank" "Left shank" "Right thigh" "Left thigh" "Pelvis" "Trunk" "Shoulders" "Head" "Right arm" "Left arm" "Right forearm" "Left forearm" if not specified'],
499
521
  'save_vid': ["V", "save processed video. true if not specified"],
@@ -514,11 +536,9 @@ sports2d --help
514
536
  'xy_origin': ["", "origin of the xy plane. 'auto' if not specified"],
515
537
  'calib_file': ["", "path to calibration file. '' if not specified, eg no calibration file"],
516
538
  'save_calib': ["", "save calibration file. true if not specified"],
517
- 'do_ik': ["", "do inverse kinematics. false if not specified"],
518
- 'use_augmentation': ["", "Use LSTM marker augmentation. false if not specified"],
519
539
  'feet_on_floor': ["", "offset marker augmentation results so that feet are at floor level. true if not specified"],
520
- 'use_simple_model': ["", "IK 10+ times faster, but no muscles or flexible spine. false if not specified"],
521
- 'participant_mass': ["", "mass of the participant in kg or none. Defaults to 70 if not provided. No influence on kinematics (motion), only on kinetics (forces)"],
540
+ 'distortions': ["", "camera distortion coefficients [k1, k2, p1, p2, k3] or 'from_calib'. [0.0, 0.0, 0.0, 0.0, 0.0] if not specified"],
541
+ 'use_simple_model': ["", "IK 10+ times faster, but no muscles or flexible spine, no patella. false if not specified"],
522
542
  'close_to_zero_speed_m': ["","Sum for all keypoints: about 50 px/frame or 0.2 m/frame"],
523
543
  'tracking_mode': ["", "'sports2d' or 'deepsort'. 'deepsort' is slower, harder to parametrize but can be more robust if correctly tuned"],
524
544
  'deepsort_params': ["", 'Deepsort tracking parameters: """{dictionary between 3 double quotes}""". \n\
@@ -528,6 +548,7 @@ sports2d --help
528
548
  'keypoint_likelihood_threshold': ["", "detected keypoints are not retained if likelihood is below this threshold. 0.3 if not specified"],
529
549
  'average_likelihood_threshold': ["", "detected persons are not retained if average keypoint likelihood is below this threshold. 0.5 if not specified"],
530
550
  'keypoint_number_threshold': ["", "detected persons are not retained if number of detected keypoints is below this threshold. 0.3 if not specified, i.e., i.e., 30 percent"],
551
+ 'max_distance': ["", "If a person is detected further than max_distance from its position on the previous frame, it will be considered as a new one. in px or None, 100 by default."],
531
552
  'fastest_frames_to_remove_percent': ["", "Frames with high speed are considered as outliers. Defaults to 0.1"],
532
553
  'close_to_zero_speed_px': ["", "Sum for all keypoints: about 50 px/frame or 0.2 m/frame. Defaults to 50"],
533
554
  'large_hip_knee_angles': ["", "Hip and knee angles below this value are considered as imprecise. Defaults to 45"],
@@ -539,15 +560,16 @@ sports2d --help
539
560
  'interp_gap_smaller_than': ["", "interpolate sequences of missing data if they are less than N frames long. 10 if not specified"],
540
561
  'fill_large_gaps_with': ["", "last_value, nan, or zeros. last_value if not specified"],
541
562
  'sections_to_keep': ["", "all, largest, first, or last. Keep 'all' valid sections even when they are interspersed with undetected chunks, or the 'largest' valid section, or the 'first' one, or the 'last' one"],
563
+ 'min_chunk_size': ["", "Minimum number of valid frames in a row to keep a chunk of data for a person. 10 if not specified"],
542
564
  'reject_outliers': ["", "reject outliers with Hampel filter before other filtering methods. true if not specified"],
543
565
  'filter': ["", "filter results. true if not specified"],
544
566
  'filter_type': ["", "butterworth, kalman, gcv_spline, gaussian, median, or loess. butterworth if not specified"],
567
+ 'cut_off_frequency': ["", "cut-off frequency of the Butterworth filter. 6 if not specified"],
545
568
  'order': ["", "order of the Butterworth filter. 4 if not specified"],
546
- 'cut_off_frequency': ["", "cut-off frequency of the Butterworth filter. 3 if not specified"],
569
+ 'gcv_cut_off_frequency': ["", "cut-off frequency of the GCV spline filter. 'auto' is usually better, unless the signal is too short (noise can then be considered as signal -> trajectories not filtered). 'auto' if not specified"],
570
+ 'gcv_smoothing_factor': ["", "smoothing factor of the GCV spline filter (>=0). Ignored if cut_off_frequency != 'auto'. Biases results towards more smoothing (>1) or more fidelity to data (<1). 1.0 if not specified"],
547
571
  'trust_ratio': ["", "trust ratio of the Kalman filter: How much more do you trust triangulation results (measurements), than the assumption of constant acceleration(process)? 500 if not specified"],
548
572
  'smooth': ["", "dual Kalman smoothing. true if not specified"],
549
- 'gcv_cut_off_frequency': ["", "cut-off frequency of the GCV spline filter. 'auto' if not specified"],
550
- 'smoothing_factor': ["", "smoothing factor of the GCV spline filter (>=0). Ignored if cut_off_frequency != 'auto'. Biases results towards more smoothing (>1) or more fidelity to data (<1). 0.1 if not specified"],
551
573
  'sigma_kernel': ["", "sigma of the gaussian filter. 1 if not specified"],
552
574
  'nb_values_used': ["", "number of values used for the loess filter. 5 if not specified"],
553
575
  'kernel_size': ["", "kernel size of the median filter. 3 if not specified"],
@@ -656,11 +678,11 @@ Sports2D:
656
678
 
657
679
  2. **Sets up pose estimation with RTMLib.** It can be run in lightweight, balanced, or performance mode, and for faster inference, the person bounding boxes can be tracked instead of detected every frame. Any RTMPose model can be used.
658
680
 
659
- 3. **Tracks people** so that their IDs are consistent across frames. A person is associated to another in the next frame when they are at a small distance. IDs remain consistent even if the person disappears from a few frames. We crafted a 'sports2D' tracker which gives good results and runs in real time, but it is also possible to use `deepsort` in particularly challenging situations.
681
+ 3. **Tracks people** so that their IDs are consistent across frames. A person is associated to another in the next frame when they are at a small distance. IDs remain consistent even if the person disappears from a few frames, thanks to the 'sports2D' tracker. [See Release notes of v0.8.22 for more information](https://github.com/davidpagnon/Sports2D/releases/tag/v0.8.22).
660
682
 
661
683
  4. **Chooses which persons to analyze.** In single-person mode, only keeps the person with the highest average scores over the sequence. In multi-person mode, you can choose the number of persons to analyze (`nb_persons_to_detect`), and how to order them (`person_ordering_method`). The ordering method can be 'on_click', 'highest_likelihood', 'largest_size', 'smallest_size', 'greatest_displacement', 'least_displacement', 'first_detected', or 'last_detected'. `on_click` is default and lets the user click on the persons they are interested in, in the desired order.
662
684
 
663
- 4. **Converts the pixel coordinates to meters.** The user can provide the size of a specified person to scale results accordingly. The floor angle and the coordinate origin can either be detected automatically from the gait sequence, or be manually specified. The depth coordinates are set to normative values, depending on whether the person is going left, right, facing the camera, or looking away.
685
+ 4. **Converts the pixel coordinates to meters.** The user can provide the size of a specified person to scale results accordingly. The camera horizon angle and the floor level can either be detected automatically from the gait sequence, be manually specified, or obtained frmm a calibration file. The depth perspective effects are compensated thanks with the distance from the camera to the subject, the focal length, the field of view, or from a calibration file. [See Release notes of v0.8.25 for more information](https://github.com/davidpagnon/Sports2D/releases/tag/v0.8.25).
664
686
 
665
687
  5. **Computes the selected joint and segment angles**, and flips them on the left/right side if the respective foot is pointing to the left/right.
666
688
 
@@ -3,24 +3,25 @@ Content/Demo_results.png,sha256=PPvL9LTzIxoIWnJAgUNyO4TM5OX5y1NCq11gOKVdvN0,1961
3
3
  Content/Demo_terminal.png,sha256=U_MqN6t44jISGfgG4OK91CDJwp70dNf3uXEH86-gcLs,91009
4
4
  Content/Person_selection.png,sha256=USZkJgk7GUG8nAQn4GywHsgi53eQG_wXkxqJnr4t1to,439085
5
5
  Content/Video_tuto_Sports2D_Colab.png,sha256=w6OUOB3jul5wc11OwW8HEEW2bmg5LFAbdzdcudWZ11E,298322
6
+ Content/huggingface_demo.png,sha256=PYOluHQDDRCgugNNS0Phpkc-5sC5xS3i9RIH_gEJo3o,361357
6
7
  Content/joint_convention.png,sha256=KsR5HXdyfIBJ0yNqI0QNgMr0uIId2RaE_p2qKhQ4u3A,614908
7
8
  Content/paper.bib,sha256=oG61x3ea2ml9bJxnc26y1Yr0lU6ZaePWNMBs7VSs4Io,10581
8
9
  Content/paper.md,sha256=8rWSOLrKTysloZv0Fz2lr3nayxtHi7GlFMqwdgDVggY,11333
9
10
  Content/sports2d_blender.gif,sha256=wgMuPRxhja3XtQn76_okGXsNnUT9Thp0pnD36GdW5_E,448786
10
11
  Content/sports2d_opensim.gif,sha256=XP1AcjqhbGcJknXUoNJjPWAwaM9ahZafbDgLWvzKJs4,376656
11
12
  Sports2D/Sports2D.ipynb,sha256=VnOVjIl6ndnCJTT13L4W5qTw4T-TQDF3jt3-wxnXDqM,2427047
12
- Sports2D/Sports2D.py,sha256=dZR16Id9rhrifEU91Y6wZxxmCCQDuGEfa3Ri9kLSiR4,36345
13
+ Sports2D/Sports2D.py,sha256=iss4omG4QBwZAlm2TFLg_i2AJjQ6r6ogai1iI9U26r4,36987
13
14
  Sports2D/__init__.py,sha256=BuUkPEdItxlkeqz4dmoiPwZLkgAfABJK3KWQ1ujTGwE,153
14
- Sports2D/process.py,sha256=TweN8PsBuA8FG-7-yAQEGh_PJYpmhGDeNYtde40XXcc,131637
15
+ Sports2D/process.py,sha256=86Ta3cnghwWjd7eYPc_KtGRWEQMYE7qIu4tQ1Btd6n4,143072
15
16
  Sports2D/Demo/Calib_demo.toml,sha256=d6myoOkhhz3c5LOwCEJQBWT9eyqr6RSYoaPbFjBMizc,369
16
- Sports2D/Demo/Config_demo.toml,sha256=ZCyGybTRPi3YNTigPZkyokQz5gbEsbqGAS4O7Z69K4M,15972
17
+ Sports2D/Demo/Config_demo.toml,sha256=xlBEoH2BjSMT6btIpXG2KoCCdksZnyEyRJb1lf9WDew,16685
17
18
  Sports2D/Demo/demo.mp4,sha256=2aZkFxhWR7ESMEtXCT8MGA83p2jmoU2sp1ylQfO3gDk,3968304
18
19
  Sports2D/Utilities/__init__.py,sha256=BuUkPEdItxlkeqz4dmoiPwZLkgAfABJK3KWQ1ujTGwE,153
19
- Sports2D/Utilities/common.py,sha256=idMRmesFv5BPX-5g3z5dOVa7SpS_8tNgijvGrOZlR-k,11185
20
- Sports2D/Utilities/tests.py,sha256=BcZ02nVcX04PpTQ2t0g5dPGHbAXY_028Y2lxn_3udjQ,5570
21
- sports2d-0.8.24.dist-info/licenses/LICENSE,sha256=f4qe3nE0Y7ltJho5w-xAR0jI5PUox5Xl-MsYiY7ZRM8,1521
22
- sports2d-0.8.24.dist-info/METADATA,sha256=6DjTjB4xYYmTItINASrlzONHW65ww6Py3bhhxjGSR9g,42938
23
- sports2d-0.8.24.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
24
- sports2d-0.8.24.dist-info/entry_points.txt,sha256=V8dFDIXatz9VvoGgoHzb2wE71C9-f85K6_OjnEQlxww,108
25
- sports2d-0.8.24.dist-info/top_level.txt,sha256=cWWBiDD2WbQXMoIoN6-9et9U2t2c_ZKo2JtBqO5uN-k,17
26
- sports2d-0.8.24.dist-info/RECORD,,
20
+ Sports2D/Utilities/common.py,sha256=RbS7kFCAT7SLbCxJJM0ULsqm7G4TMCnOVeZDTRgkrwk,11457
21
+ Sports2D/Utilities/tests.py,sha256=DYQ5ZdO1L7ZxxSb5hx8rTbF9VaKBeyh16hK_j_6Q9hQ,5819
22
+ sports2d-0.8.26.dist-info/licenses/LICENSE,sha256=f4qe3nE0Y7ltJho5w-xAR0jI5PUox5Xl-MsYiY7ZRM8,1521
23
+ sports2d-0.8.26.dist-info/METADATA,sha256=AOuxVfFC0l0arH9Iu3V1vhJ6naTGbOwEXbZ4nXYhV_c,44479
24
+ sports2d-0.8.26.dist-info/WHEEL,sha256=_zCd3N1l69ArxyTb8rzEoP9TpbYXkqRFSNOD5OuxnTs,91
25
+ sports2d-0.8.26.dist-info/entry_points.txt,sha256=V8dFDIXatz9VvoGgoHzb2wE71C9-f85K6_OjnEQlxww,108
26
+ sports2d-0.8.26.dist-info/top_level.txt,sha256=cWWBiDD2WbQXMoIoN6-9et9U2t2c_ZKo2JtBqO5uN-k,17
27
+ sports2d-0.8.26.dist-info/RECORD,,