From 579b0938783252520d81b956ae738fdf13081b17 Mon Sep 17 00:00:00 2001 From: davidpagnon Date: Fri, 16 Feb 2024 02:56:15 +0100 Subject: [PATCH] joss draft --- Content/joint_convention.png | Bin 0 -> 31377 bytes Content/paper.bib | 289 +++++++++++++++++++++++++++++++++++ Content/paper.md | 90 +++++++++++ README.md | 5 +- 4 files changed, 382 insertions(+), 2 deletions(-) create mode 100644 Content/joint_convention.png create mode 100644 Content/paper.bib create mode 100644 Content/paper.md diff --git a/Content/joint_convention.png b/Content/joint_convention.png new file mode 100644 index 0000000000000000000000000000000000000000..974b6bf061ad151e814f6be5055c78be77bf57b5 GIT binary patch literal 31377 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 literal 0 HcmV?d00001 diff --git a/Content/paper.bib b/Content/paper.bib new file mode 100644 index 0000000..753a606 --- /dev/null +++ b/Content/paper.bib @@ -0,0 +1,289 @@ +@article{Beaucage_2019, + title={Validation of an OpenSim full-body model with detailed lumbar spine for estimating lower lumbar spine loads during symmetric and asymmetric lifting tasks}, + author={Beaucage-Gauvreau, Erica and Robertson, William SP and Brandon, Scott CE and Fraser, Robert and Freeman, Brian JC and Graham, Ryan B and Thewlis, Dominic and Jones, Claire F}, + journal={Computer methods in biomechanics and biomedical engineering}, + DOI = {10.1080/10255842.2018.1564819}, + volume={22}, + number={5}, + pages={451--464}, + year={2019}, + publisher={Taylor \& Francis} +} + +@article{Bradski_2000, + author = {Bradski, G.}, + citeulike-article-id = {2236121}, + journal = {Dr. Dobb's Journal of Software Tools}, + keywords = {bibtex-import}, + posted-at = {2008-01-15 19:21:54}, + priority = {4}, + title = {The OpenCV Library}, + year = {2000} +} + +@article{Butterworth_1930, + title={On the theory of filter amplifiers}, + author={Butterworth, Stephen}, + journal={Wireless Engineer}, + volume={7}, + number={6}, + pages={536--541}, + year={1930} +} + +@article{Cao_2019, + title={OpenPose: realtime multi-person 2D pose estimation using Part Affinity Fields}, + author={Cao, Zhe and Hidalgo, Gines and Simon, Tomas and Wei, Shih-En and Sheikh, Yaser}, + journal={IEEE transactions on pattern analysis and machine intelligence}, + volume={43}, + number={1}, + pages={172--186}, + year={2019}, + URL = {https://arxiv.org/abs/1611.08050}, + DOI = {10.1109/TPAMI.2019.2929257}, + publisher={IEEE} +} + +@article{Cleveland_1981, + title={LOWESS: A program for smoothing scatterplots by robust locally weighted regression}, + author={Cleveland, William S}, + DOI={10.2307/2683591}, + journal={American Statistician}, + volume={35}, + number={1}, + pages={54}, + year={1981} +} + +@article{Colyer_2018, + title={A review of the evolution of vision-based motion analysis and the integration of advanced computer vision methods towards developing a markerless system}, + author={Colyer, Steffi L and Evans, Murray and Cosker, Darren P and Salo, Aki IT}, + journal={Sports medicine-open}, + DOI={10.1186/s40798-018-0139-y}, + volume={4}, + number={1}, + pages={1--15}, + year={2018}, + publisher={SpringerOpen} +} + +@article{Delp_2007, + title={OpenSim: open-source software to create and analyze dynamic simulations of movement}, + author={Delp, Scott L and Anderson, Frank C and Arnold, Allison S and Loan, Peter and Habib, Ayman and John, Chand T and Guendelman, Eran and Thelen, Darryl G}, + journal={IEEE transactions on biomedical engineering}, + volume={54}, + number={11}, + pages={1940--1950}, + year={2007}, + URL = {https://ieeexplore.ieee.org/abstract/document/4352056}, + DOI = {10.1109/TBME.2007.901024}, + publisher={IEEE} +} + +@inproceedings{Fang_2017, + title={{RMPE}: Regional Multi-person Pose Estimation}, + author={Fang, Hao-Shu and Xie, Shuqin and Tai, Yu-Wing and Lu, Cewu}, + booktitle={ICCV}, + year={2017}, + URL = {https://ieeexplore.ieee.org/document/8237518}, + DOI = {10.1109/ICCV.2017.256} +} + +@article{Hartley_1997, + title={Triangulation}, + author={Hartley, Richard I and Sturm, Peter}, + journal={Computer vision and image understanding}, + DOI={10.1006/cviu.1997.0547}, + volume={68}, + number={2}, + pages={146--157}, + year={1997}, + publisher={Elsevier} +} + +@misc{Hidalgo_2019, + author = {Hidalgo, Ginés}, + title = {OpenPose Experimental Models}, + year = {2019}, + publisher = {GitHub}, + journal = {GitHub repository}, + url = {https://github.com/CMU-Perceptual-Computing-Lab/openpose_train/tree/master/experimental_models#body_25b-model---option-2-recommended} +} + +@misc{Hidalgo_2021, + author = {Hidalgo, Ginés}, + title = {OpenPose 3D reconstruction module}, + year = {2021}, + publisher = {GitHub}, + journal = {GitHub repository}, + url = {https://github.com/CMU-Perceptual-Computing-Lab/openpose/blob/master/doc/advanced/3d_reconstruction_module.md} +} + +@article{Kanko_2021, + title={Concurrent assessment of gait kinematics using marker-based and markerless motion capture}, + author={Kanko, Robert M and Laende, Elise K and Davis, Elysia M and Selbie, W Scott and Deluzio, Kevin J}, + journal={Journal of biomechanics}, + volume={127}, + pages={110665}, + year={2021}, + URL = {https://doi.org/10.1016/j.jbiomech.2021.110665}, + DOI = {10.1016/j.jbiomech.2021.110665}, + publisher={Elsevier} +} + +@article{Karashchuk_2021, + title={Anipose: a toolkit for robust markerless 3D pose estimation}, + author={Karashchuk, Pierre and Rupp, Katie L and Dickinson, Evyn S and Walling-Bell, Sarah and Sanders, Elischa and Azim, Eiman and Brunton, Bingni W and Tuthill, John C}, + journal={Cell reports}, + volume={36}, + number={13}, + pages={109730}, + year={2021}, + URL = {https://doi.org/10.1016/j.celrep.2021.109730}, + DOI = {10.1016/j.celrep.2021.109730}, + publisher={Elsevier} +} + +@article{Mathis_2018, + title={DeepLabCut: markerless pose estimation of user-defined body parts with deep learning}, + author={Mathis, Alexander and Mamidanna, Pranav and Cury, Kevin M and Abe, Taiga and Murthy, Venkatesh N and Mathis, Mackenzie Weygandt and Bethge, Matthias}, + journal={Nature neuroscience}, + volume={21}, + number={9}, + pages={1281--1289}, + year={2018}, + URL = {https://www.nature.com/articles/s41593-018-0209-y}, + DOI = {10.1038/s41593-018-0209-y}, + publisher={Nature Publishing Group} +} + + @misc{Matthis_2022, + type={Python}, + title={FreeMoCap: A free, open source markerless motion capture system}, + rights={AGPL-3.0}, + url={https://github.com/freemocap/freemocap}, + author={Matthis, Jonathan Samir and Cherian, Aaron}, + year={2022}, + publisher = {GitHub}, + journal = {GitHub repository}, +} + +@article{Needham_2021, + title={The accuracy of several pose estimation methods for 3D joint centre localisation}, + author={Needham, Laurie and Evans, Murray and Cosker, Darren P and Wade, Logan and McGuigan, Polly M and Bilzon, James L and Colyer, Steffi L}, + journal={Scientific reports}, + DOI={10.1038/s41598-021-00212-x}, + volume={11}, + number={1}, + pages={1--11}, + year={2021}, + publisher={Nature Publishing Group} +} + +@article{Pagnon_2021, + title={Pose2Sim: An End-to-End Workflow for 3D Markerless Sports Kinematics—Part 1: Robustness}, + author={Pagnon, David and Domalain, Mathieu and Reveret, Lionel}, + journal={Sensors}, + volume={21}, + number={19}, + year={2021}, + URL = {https://www.mdpi.com/1424-8220/21/19/6530}, + DOI = {10.3390/s21196530}, + publisher={Multidisciplinary Digital Publishing Institute} +} + +@article{Pagnon_2022, + title = {Pose2Sim: An End-to-End Workflow for 3D Markerless Sports Kinematics—Part 2: Accuracy}, + author = {Pagnon, David and Domalain, Mathieu and Reveret, Lionel}, + journal = {Sensors}, + volume={22}, + number={7}, + year={2022}, + URL = {https://www.mdpi.com/1424-8220/22/7/2712}, + DOI = {10.3390/s22072712}, + publisher={Multidisciplinary Digital Publishing Institute} +} + +@article{Rajagopal_2016, + title={Full-body musculoskeletal model for muscle-driven simulation of human gait}, + author={Rajagopal, Apoorva and Dembia, Christopher L and DeMers, Matthew S and Delp, Denny D and Hicks, Jennifer L and Delp, Scott L}, + journal={IEEE transactions on biomedical engineering}, + DOI={10.1109/tbme.2016.2586891}, + volume={63}, + number={10}, + pages={2068--2079}, + year={2016}, + publisher={IEEE} +} + +@article{Seth_2018, + DOI = {10.1371/journal.pcbi.1006223}, + author = {Seth, Ajay AND Hicks, Jennifer L. AND Uchida, Thomas K. AND Habib, Ayman AND Dembia, Christopher L. AND Dunne, James J. AND Ong, Carmichael F. AND DeMers, Matthew S. AND Rajagopal, Apoorva AND Millard, Matthew AND Hamner, Samuel R. AND Arnold, Edith M. AND Yong, Jennifer R. AND Lakshmikanth, Shrinidhi K. AND Sherman, Michael A. AND Ku, Joy P. AND Delp, Scott L.}, + journal = {PLOS Computational Biology}, + publisher = {Public Library of Science}, + title = {OpenSim: Simulating musculoskeletal dynamics and neuromuscular control to study human and animal movement}, + year = {2018}, + month = {07}, + volume = {14}, + url = {https://doi.org/10.1371/journal.pcbi.1006223}, + pages = {1-20}, + number = {7}, +} + +@article{Sheshadri_2020, + DOI={10.21105/joss.01849}, + url = {https://doi.org/10.21105/joss.01849}, + year = {2020}, + publisher = {The Open Journal}, + volume = {5}, + number = {45}, + pages = {1849}, + author = {Sheshadri, Swathi and Dann, Benjamin and Hueser, Timo and Scherberger, Hansjoerg}, + title = {3D reconstruction toolbox for behavior tracked with multiple cameras}, + journal = {Journal of Open Source Software} +} + + @article{Uhlrich_2022, + title={OpenCap: 3D human movement dynamics from smartphone videos}, + url={https://www.biorxiv.org/content/10.1101/2022.07.07.499061v1}, + DOI={10.1101/2022.07.07.499061}, + publisher={bioRxiv}, + author={Uhlrich, Scott D. and Falisse, Antoine and Kidziński, Łukasz and Muccini, Julie and Ko, Michael and Chaudhari, Akshay S. and Hicks, Jennifer L. and Delp, Scott L.}, + year={2022}, + month={Jul}, + pages={2022.07.07.499061} +} + +@article{Zeni_2008, + title={Two simple methods for determining gait events during treadmill and overground walking using kinematic data}, + author={Zeni Jr, JA and Richards, JG and Higginson, JS2384115}, + journal={Gait \& posture}, + volume={27}, + number={4}, + pages={710--714}, + year={2008}, + URL={https://doi.org/10.1016/j.gaitpost.2007.07.007}, + DOI={10.1016/j.gaitpost.2007.07.007}, + publisher={Elsevier} +} + +@article{Zhang_2000, + title={A flexible new technique for camera calibration}, + author={Zhang, Zhengyou}, + journal={IEEE Transactions on pattern analysis and machine intelligence}, + DOI={10.1109/34.888718}, + volume={22}, + number={11}, + pages={1330--1334}, + year={2000}, + publisher={IEEE} +} + +@article{Zheng_2022, + title={Deep learning-based human pose estimation: A survey}, + author={Zheng, Ce and Wu, Wenhan and Yang, Taojiannan and Zhu, Sijie and Chen, Chen and Liu, Ruixu and Shen, Ju and Kehtarnavaz, Nasser and Shah, Mubarak}, + journal={arXiv}, + year={2022}, + URL={https://doi.org/10.48550/arXiv.2012.13392}, + DOI={10.48550/arXiv.2012.13392}, +} diff --git a/Content/paper.md b/Content/paper.md new file mode 100644 index 0000000..50b15be --- /dev/null +++ b/Content/paper.md @@ -0,0 +1,90 @@ +--- +title: 'Sports2D: Compute 2D joint and segment angles from a video.' +tags: + - python + - markerless kinematics + - motion capture + - sports performance analysis + - openpose + - clinical gait analysis +authors: + - name: David Pagnon^[corresponding author] + orcid: 0000-0002-6891-8331 + affiliation: 1 +affiliations: + - name: Centre for the Analysis of Motion, Entertainment Research & Applications (CAMERA), University of Bath, Claverton Down, Bath, BA2 7AY, UK + index: 1 +date: February 14 2024 +bibliography: paper.bib +--- + + +# Summary +`Sports2D` provides a user-friendly solution for automatic analysis of human movement from videos. This Python package uses markerless 2D pose estimation to detect joint coordinates from videos, and then computes 2D joint and segment angles. It can be installed either locally or on a free server, which makes it possible to run it directly from a smartphone. + +It outputs annotated videos and image sequences which display joint locations, joint angles, and segment angles, for each of the detected persons. This information is also stored in .csv files, editable on MS Excel or any other spreadsheet editor for further analysis. + +`Sports2D` may be useful for clinicians as a decision supports system (CDSS) [], as well as for gait analysis [] or ergonomic design []. Sports coaches can also use it to quantify key performance indicators (KPIs) [], or to better understand, correct, or compare athletes' movement patterns. Finally, it can be used by researchers as a simple tool for 2D biomechanical analysis on the fly. One of the multiple use cases would be to evaluate ACL injury risks from deceleration drills []. + +![Example results from a Demo video.\label{fig:demo video results}](demo_openpose_results.png) +![Example plot of joint angle evolution.\label{fig:joint angle evolution}](demo_show_plots.png) + + +# Statement of need + +Machine learning has recently accelerated the development and availability of markerless kinematics, which allows for the collection of kinematic data without the use of physical markers or of manual annotation. + +A large part of these tools focus on 2D analysis, such as `OpenPose` [@Cao_2019], `BlazePose` [], or `DeepLabCut` []. Although they bear the advantage of being open-source, they are not easily accessible to people who do not have a programming background, and the output is not directly usable for further kinematic investigation. Yet, clinical acceptance of new technologies is known to be influenced not only by their price value and their performance, but also by their perceived ease-of-use, the social influence around the customer, and other parameters described by the Unified Theory of Acceptance and Use of Technology (UTAUT2) []. + +In fact, there is a clear trade-off between accuracy and ease-of-use. Some open-source tools focus on the accuracy of a 3D analysis by using multiple cameras, such as `Pose2Sim` [] or `OpenCap` []. These, however, require either a certain level of programming skills, or a particular hardware setup. Some other tools choose to put more emphasis on user-friendliness, and point out that 2D analysis is often sufficient when the analyzed motion mostly lies in the sagittal or frontal plane. `Kinovea` [], for example, is a widely used software for sports performance analysis which provides multiple additional features. However, it relies on tracking manual labels. This may be time-consuming when analyzing numerous videos, and it can also be lacking robustness when the tracked points of interest are lost. It is also only available on Windows, and requires the user to transfer files prior to analysis. + +`Sports2D` is an alternative solution that aims at filling this gap: it is free and open-source, easy to install, can be run from any smartphone or computer, and automatically provides 2D joint and segment angles without the need for manual annotation. It is also robust, and can be used to analyze numerous videos at once. The motion of multiple people can be analyzed in the same video, and the output is directly usable for further statistical analysis. + + +# Workflow + +`Sports2D` can be installed and run two different ways: locally, or on a Google Colab free server []. +- *If run locally*, it can be installed via `pip install sports2d`. Two options are then offered: either run it with BlazePose as a pose estimation model, or with OpenPose. BlazePose comes preinstalled and is very fast, however it is less accurate and only detects one person per video. OpenPose is more accurate, allows for the detection of multiple people, and comes with more fine-tuning in `Sports2D`, but it is slower and requires the user to install it themselves. +- *If run on Colab*, it can be installed in one click from any computer or smartphone device, either every time the user needs it, or once for all on Google Drive. In this case, OpenPose can be automatically installed and runs by default, and video and table results are automatically saved on Google Drive. A video tutorial can be found at this address: https://www.youtube.com/watch?v=Er5RpcJ8o1Y. + +After installation, the user can choose one or several videos to analize. Then, `Sports2D` goes through two stages: +- **Pose detection:** Joint centers are detected for each video frame. If OpenPose is used, multiple persons can be detected with consistent IDs across frames. A person is associated to another in the next frame when they are at a small distance. Sequences of missing data are interpolated if they are less than N frames long, N being a threshold defined by the user. Resulting coordinates can be filtered with a Butterworth, Gaussian, Median, or LOESS filter. They can also be plotted. Note that locations are in pixels, but can be converted to meters if the user provides the distance between two points in the video. +- **Joint and segment angle estimation:** Specific joint and segment angles can be chosen, and are computed from the previously calculated positions. +If a person suddenly faces the other way, this change of direction is taken into account. The person is considered to go to the left when their toes are to the left of their heels. +Resulting angles can be filtered in the same way as point coordinates, and they can also be plotted. + +Joint angle conventions are as follows: +- Ankle dorsiflexion: Between heel and big toe, and ankle and knee +- Knee flexion: Between hip, knee, and ankle +- Hip flexion: Between knee, hip, and shoulder +- Shoulder flexion: Between hip, shoulder, and elbow +- Elbow flexion: Between wrist, elbow, and shoulder + +Segment angles are measured anticlockwise between the horizontal and the segment lines: +- Foot: Between heel and big toe +- Shank: Between knee and ankle +- Thigh: Between hip and knee +- Arm: Between shoulder and elbow +- Forearm: Between elbow and wrist +- Trunk: Between shoulder midpoint and hip midpoint + +![Joint angle conventions. Adapted from [@Yang2007].\label{fig:joint angle conventions}](Joint_convention.png) + + +# Limitations + +The user of `Sports2D` should be aware of the following limitations: +- Results are acceptable only if the persons move in the 2D plane, from right to left or from left to right. +If you need research-grade markerless joint kinematics, consider using several cameras, and constraining angles to a biomechanically accurate model. See `Pose2Sim` for example. +- Angle estimation is only as good as the pose estimation algorithm, i.e., it is not perfect, especially if motion blur is significant such as on some broadcast videos. +- Google Colab does not follow the European GDPR requirements regarding data privacy []. Install locally if this matters. + + +# Acknowledgements +I would like to acknowledge Rob Olivar, a sports coach who enlightened me about the need for such a tool.\ +I also acknowledge the work of the dedicated people involved in the many major software programs and packages used by `Sports2D`, such as `Python`, `OpenPose`, `BlazePose`, `OpenCV` [@Bradski_2000], among others. + + +# References + + diff --git a/README.md b/README.md index 072f1f7..a593caa 100644 --- a/README.md +++ b/README.md @@ -192,7 +192,7 @@ BlazePose or OpenPose are used to detect joint centers from a video. - If `BlazePose` is used, only one person can be detected.\ No interpolation nor filtering options are available. Not plotting available. -- If `OpenPose` is used, multiple persons can be consistently detected across frames. A person is matched to another in the next frame when their average point clouds are at a small euclidian distance.\ +- If `OpenPose` is used, multiple persons can be consistently detected across frames. A person is associated to another in the next frame when they are at a small distance.\ Sequences of missing data are interpolated if they are less than N frames long.\ Resulting coordinates can be filtered with Butterworth, gaussian, median, or loess filter. They can also be plotted. @@ -200,7 +200,7 @@ BlazePose or OpenPose are used to detect joint centers from a video. #### Angle computation: Joint and segment angles are computed from csv position files.\ -If a person suddently faces the other way, this change of direction is taken into account.\ +If a person suddenly faces the other way, this change of direction is taken into account.\ Resulting angles can be filtered in the same way as point coordinates, and they can also be plotted. **Joint angle conventions:** @@ -246,6 +246,7 @@ If you want to contribute to Sports2D, please follow [this guide](https://docs.g - [x] Handle sudden **changes of direction**. - [x] **Colab version** for those who cannot install OpenPose. - [x] **Colab version** more user-friendly, usable on a smartphone. +- [x] **Batch processing** for the analysis of multiple videos at once. - [ ] **Implement [AlphaPose](https://github.com/MVIG-SJTU/AlphaPose)** which might be more accurate on broadcasted videos. - [ ] Perform **Inverse kinematics and dynamics** with OpenSim (cf. [Pose2Sim](https://github.com/perfanalytics/pose2sim), but in 2D). Update [this model](https://github.com/davidpagnon/Sports2D/blob/main/Sports2D/Utilities/2D_gait.osim) (add arms, markers, remove muscles and contact spheres). Add pipeline example.