{"about":{"site":"https://codewithpapers.app","non_affiliation":"Code with Papers and Syntology are not affiliated with, endorsed by, or sponsored by Papers with Code, Meta, or the pwc-archive mirror.","licence":"CC BY-SA 4.0","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","attribution":"https://codewithpapers.app/attribution","modified":"archive material modified by Syntology; see the attribution page"},"url":"/paper/best-practices-for-2-body-pose-forecasting","title":"Best Practices for 2-Body Pose Forecasting","arxiv_id":"2304.05758","date":"2023-04-12","proceeding":null,"authors":["Muhammad Rameez Ur Rahman","Luca Scofano","Edoardo De Matteis","Alessandro Flaborea","Alessio Sampieri","Fabio Galasso"],"abstract":"The task of collaborative human pose forecasting stands for predicting the future poses of multiple interacting people, given those in previous frames. Predicting two people in interaction, instead of each separately, promises better performance, due to their body-body motion correlations. But the task has remained so far primarily unexplored. In this paper, we review the progress in human pose forecasting and provide an in-depth assessment of the single-person practices that perform best for 2-body collaborative motion forecasting. Our study confirms the positive impact of frequency input representations, space-time separable and fully-learnable interaction adjacencies for the encoding GCN and FC decoding. Other single-person practices do not transfer to 2-body, so the proposed best ones do not include hierarchical body modeling or attention-based interaction encoding. We further contribute a novel initialization procedure for the 2-body spatial interaction parameters of the encoder, which benefits performance and stability. Altogether, our proposed 2-body pose forecasting best practices yield a performance improvement of 21.9% over the state-of-the-art on the most recent ExPI dataset, whereby the novel initialization accounts for 3.5%. See our project page at https://www.pinlab.org/bestpractices2body","url_abs":"https://arxiv.org/abs/2304.05758v1","url_pdf":"https://arxiv.org/pdf/2304.05758v1.pdf","source":{"archive":"pwc-archive (Hugging Face), CC BY-SA 4.0","snapshot":"2025-07-28","licence_url":"https://creativecommons.org/licenses/by-sa/4.0/legalcode","row_kind":"abstracts"},"code_links":[{"paper_slug":"best-practices-for-2-body-pose-forecasting","repo_url":"https://github.com/edodema/BestPractices2Body","is_official":1,"mentioned_in_paper":0,"mentioned_in_github":1,"framework":"pytorch","reach":{"status":"ok","spdx":"MIT"}}],"tasks":[{"task_slug":"human-pose-forecasting","task_name":"Human Pose Forecasting"},{"task_slug":"motion-forecasting","task_name":"Motion Forecasting"},{"task_slug":"multi-person-pose-forecasting","task_name":"Multi-Person Pose forecasting"},{"task_slug":"motion-prediction","task_name":"motion prediction"}],"methods":[{"method_slug":"gcn","method_name":"GCN"}],"datasets_introduced":[],"methods_introduced":[],"results":[{"leaderboard":"/sota/multi-person-pose-forecasting-on-expi-common","task":"Multi-Person Pose forecasting","dataset":"Expi - common actions split","model":"Best Practices for 2-Body Pose Forecasting","rank_in_archive_order":1,"of":6,"metrics":{"Average MPJPE (mm) @ 1000 ms":"202","Average MPJPE (mm) @ 200 ms":"39","Average MPJPE (mm) @ 400 ms":"86","Average MPJPE (mm) @ 600 ms":"129"},"uses_additional_data":false},{"leaderboard":"/sota/multi-person-pose-forecasting-on-expi-unseen","task":"Multi-Person Pose forecasting","dataset":"Expi - unseen actions split","model":"Best Practices for 2-Body Pose Forecasting","rank_in_archive_order":1,"of":5,"metrics":{"Average MPJPE (mm) @ 400 ms":"100","Average MPJPE (mm) @ 600 ms":"149","Average MPJPE (mm) @ 800 ms":"191"},"uses_additional_data":false}],"syntology":{"atlas_url":"https://app.syntology.ai/?focus=2304.05758","mcp":{"get_harvested_code_for_paper":{"arxiv_id":"2304.05758"}},"developers":"https://syntology.ai/developers","read_at":"2026-09-24T18:15:14+00:00","read_at_is":"when the build read Syntology's graph, not when any sample ran","claim":"Per-sample execution status on synthesized fixtures; not a correctness claim about the paper. Samples come from repositories linked to the paper, official or community; repo_kind says which.","repos":[{"provenance":"external:paperswithcode_snapshot_2025-07-28","url":"https://github.com/edodema/BestPractices2Body","reach":{"status":"ok","spdx":"MIT"}}],"summary":{"ran":3,"unverified":14},"by_repo_kind":{"official":{"samples":17,"ran":3,"repositories":1}},"repo_kind_vocabulary":{"official":"The archive marks this repository official for the paper","named_in_paper":"The archive records that the paper mentions this repository; it is not marked official","listed":"In the archive's code links for this paper, not marked official and not recorded as mentioned in the paper","found_in_text":"Syntology found this repository in the paper's own text; whether it is the authors' implementation is not asserted","community":"Not in the archive's code links for this paper; a community repository Syntology harvested"},"n_pointer_only_for_licence":0,"samples":[{"code_sha256_prefix":"c0984e125450806e","entry":"ang2joint","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/angle_to_joint.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/angle_to_joint.py","link_basis":"plan_row","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"c0984e125450806e"}},{"code_sha256_prefix":"d7032acefdc1b55a","entry":"rodrigues","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/angle_to_joint.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/angle_to_joint.py","link_basis":"plan_row","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"d7032acefdc1b55a"}},{"code_sha256_prefix":"6588622485d7bdc2","entry":"with_zeros","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/angle_to_joint.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/angle_to_joint.py","link_basis":"plan_row","language":"python","status":"ran","verification_level":1,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":true,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"6588622485d7bdc2"}},{"code_sha256_prefix":"81e27319d084659d","entry":"extant_file","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/pyt_utils.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/pyt_utils.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"81e27319d084659d"}},{"code_sha256_prefix":"1edbc792f56ab438","entry":"fkl_torch","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/misc.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/misc.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"1edbc792f56ab438"}},{"code_sha256_prefix":"044ab013d7abd46a","entry":"gen_velocity","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/util.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/util.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"044ab013d7abd46a"}},{"code_sha256_prefix":"68de7a44b4f27b2d","entry":"get_dct_matrix","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/util.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/util.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"68de7a44b4f27b2d"}},{"code_sha256_prefix":"7660a1c90472fa55","entry":"get_logger","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/logger.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/logger.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"7660a1c90472fa55"}},{"code_sha256_prefix":"ba3289fec7009fc0","entry":"normExPI_2p_by_frame","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/datasets/data_utils_pi3d.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/datasets/data_utils_pi3d.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ba3289fec7009fc0"}},{"code_sha256_prefix":"d349fb0b9c8391b7","entry":"normExPI_xoz","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/datasets/data_utils_pi3d.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/datasets/data_utils_pi3d.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"d349fb0b9c8391b7"}},{"code_sha256_prefix":"2382970d969a42d1","entry":"readCSVasFloat","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/datasets/data_utils_pi3d.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/datasets/data_utils_pi3d.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"2382970d969a42d1"}},{"code_sha256_prefix":"6f649cf48e2412ce","entry":"rigid_align","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/rigid_align.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/rigid_align.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"6f649cf48e2412ce"}},{"code_sha256_prefix":"718c13d3298cc856","entry":"rigid_align_torch","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/rigid_align.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/rigid_align.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"718c13d3298cc856"}},{"code_sha256_prefix":"010398fec721a847","entry":"rigid_transform_3D","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/rigid_align.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/rigid_align.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"010398fec721a847"}},{"code_sha256_prefix":"13250dfe061caa67","entry":"rotmat2euler_torch","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/misc.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/misc.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"13250dfe061caa67"}},{"code_sha256_prefix":"963cf42da1883209","entry":"rotmat2quat_torch","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/misc.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/misc.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"963cf42da1883209"}},{"code_sha256_prefix":"ebbcbb831700b43b","entry":"update_lr_multistep","repo":"edodema/BestPractices2Body","repo_kind":"official","path":"src/utils/util.py","file_url":"https://github.com/edodema/BestPractices2Body/blob/HEAD/src/utils/util.py","link_basis":"first_harvest_node","language":"python","status":"unverified","verification_level":0,"contract_check":null,"metamorphic_tier":null,"behaviour_fingerprint":false,"licence":"MIT","inline_ok":true,"mcp_get_code":{"code_sha256":"ebbcbb831700b43b"}}]},"arxiv_metadata":null,"syntology_extracted_results":null}