From 57eef5f0c414e96a047a6b8995dff81b89cf60a9 Mon Sep 17 00:00:00 2001 From: davidpagnon Date: Mon, 8 Jan 2024 13:01:39 +0100 Subject: [PATCH] undistort to false by default --- Pose2Sim/Demo/S00_Demo_Session/Config.toml | 9 +- .../S00_P00_Participant/Config.toml | 9 +- .../S00_P00_T00_StaticTrial/Config.toml | 9 +- .../S00_P00_T01_BalancingTrial/Config.toml | 9 +- Pose2Sim/Demo/S01_Empty_Session/Config.toml | 21 ++- .../S01_P00_Participant0/Config.toml | 9 +- .../S01_P00_T00_StaticTrial/Config.toml | 9 +- .../S01_P00_T01_MotionTrial1/Config.toml | 9 +- .../S01_P00_T02_MotionTrial2/Config.toml | 9 +- .../S01_P01_Participant1/Config.toml | 9 +- .../S01_P01_T00_StaticTrial/Config.toml | 9 +- .../S01_P01_T01_MotionTrial1/Config.toml | 9 +- .../S01_P01_T02_MotionTrial2/Config.toml | 9 +- Pose2Sim/Utilities/json_display_with_img.py | 2 +- Pose2Sim/Utilities/reproj_from_trc_calib.py | 175 ++++++++++-------- README.md | 5 +- setup.cfg | 2 +- 17 files changed, 203 insertions(+), 110 deletions(-) diff --git a/Pose2Sim/Demo/S00_Demo_Session/Config.toml b/Pose2Sim/Demo/S00_Demo_Session/Config.toml index f6fcc65..0daed56 100644 --- a/Pose2Sim/Demo/S00_Demo_Session/Config.toml +++ b/Pose2Sim/Demo/S00_Demo_Session/Config.toml @@ -135,8 +135,8 @@ interpolation = 'cubic' #linear, slinear, quadratic, cubic, or none interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -make_c3d = false # save triangulated data in c3d format in addition to trc +undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! [filtering] @@ -172,10 +172,15 @@ opensim_bin_path = 'C:\OpenSim 4.4\bin' # CUSTOM skeleton, if you trained your own DeepLabCut model for example. # Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +# # If you want to perform inverse kinematics, you will also need to create an OpenSim model # and add to its markerset the location where you expect the triangulated keypoints to be detected. +# # In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). # You can create as many custom skeletons as you want, just add them further down and rename them. +# +# Check your model hierarchy with: for pre, _, node in RenderTree(model): +# print(f'{pre}{node.name} id={node.id}') [pose.CUSTOM] name = "CHip" id = "None" diff --git a/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/Config.toml b/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/Config.toml index 050c177..d8559fd 100644 --- a/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/Config.toml +++ b/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/Config.toml @@ -136,8 +136,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! # [filtering] @@ -172,10 +172,15 @@ ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/S00_P00_T00_StaticTrial/Config.toml b/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/S00_P00_T00_StaticTrial/Config.toml index 5ea411a..b13ff23 100644 --- a/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/S00_P00_T00_StaticTrial/Config.toml +++ b/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/S00_P00_T00_StaticTrial/Config.toml @@ -136,8 +136,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! # [filtering] @@ -172,10 +172,15 @@ ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/S00_P00_T01_BalancingTrial/Config.toml b/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/S00_P00_T01_BalancingTrial/Config.toml index 41b0fb5..dec204d 100644 --- a/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/S00_P00_T01_BalancingTrial/Config.toml +++ b/Pose2Sim/Demo/S00_Demo_Session/S00_P00_Participant/S00_P00_T01_BalancingTrial/Config.toml @@ -136,8 +136,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! [filtering] @@ -172,10 +172,15 @@ display_figures = true # true or false (lowercase) ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/Config.toml index f8e0677..9122d67 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/Config.toml @@ -135,8 +135,8 @@ interpolation = 'cubic' #linear, slinear, quadratic, cubic, or none interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! [filtering] @@ -170,12 +170,17 @@ opensim_bin_path = 'C:\OpenSim 4.4\bin' -# CUSTOM skeleton, if you trained your own DeepLabCut model for example. -# Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. -# If you want to perform inverse kinematics, you will also need to create an OpenSim model -# and add to its markerset the location where you expect the triangulated keypoints to be detected. -# In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). -# You can create as many custom skeletons as you want, just add them further down and rename them. +## CUSTOM skeleton, if you trained your own DeepLabCut model for example. +## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## +## If you want to perform inverse kinematics, you will also need to create an OpenSim model +## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## +## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). +## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') [pose.CUSTOM] name = "CHip" id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/Config.toml index 815eb18..bc749c9 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/Config.toml @@ -136,8 +136,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! # [filtering] @@ -172,10 +172,15 @@ ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T00_StaticTrial/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T00_StaticTrial/Config.toml index 04aa26c..aa05f70 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T00_StaticTrial/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T00_StaticTrial/Config.toml @@ -135,8 +135,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! # [filtering] @@ -171,10 +171,15 @@ ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T01_MotionTrial1/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T01_MotionTrial1/Config.toml index 9ac62fd..c9fb7f3 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T01_MotionTrial1/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T01_MotionTrial1/Config.toml @@ -135,8 +135,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! [filtering] @@ -171,10 +171,15 @@ display_figures = true # true or false (lowercase) ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T02_MotionTrial2/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T02_MotionTrial2/Config.toml index 48e3c93..3ef6246 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T02_MotionTrial2/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/S01_P00_Participant0/S01_P00_T02_MotionTrial2/Config.toml @@ -135,8 +135,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! [filtering] @@ -171,10 +171,15 @@ display_figures = true # true or false (lowercase) ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/Config.toml index 7b4ddd4..8a4e312 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/Config.toml @@ -136,8 +136,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! # [filtering] @@ -172,10 +172,15 @@ ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T00_StaticTrial/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T00_StaticTrial/Config.toml index 7b4ddd4..8a4e312 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T00_StaticTrial/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T00_StaticTrial/Config.toml @@ -136,8 +136,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! # [filtering] @@ -172,10 +172,15 @@ ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T01_MotionTrial1/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T01_MotionTrial1/Config.toml index cdf365a..392b5e1 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T01_MotionTrial1/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T01_MotionTrial1/Config.toml @@ -136,8 +136,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! [filtering] @@ -172,10 +172,15 @@ display_figures = true # true or false (lowercase) ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T02_MotionTrial2/Config.toml b/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T02_MotionTrial2/Config.toml index cdf365a..392b5e1 100644 --- a/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T02_MotionTrial2/Config.toml +++ b/Pose2Sim/Demo/S01_Empty_Session/S01_P01_Participant1/S01_P01_T02_MotionTrial2/Config.toml @@ -136,8 +136,8 @@ # interp_if_gap_smaller_than = 10 # do not interpolate bigger gaps # show_interp_indices = true # true or false (lowercase). For each keypoint, return the frames that need to be interpolated # handle_LR_swap = true # Better if few cameras (eg less than 4) with risk of limb swapping (eg camera facing sagittal plane), otherwise slightly less accurate and slower -# undistort_points = true # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low -# make_c3d = false # save triangulated data in c3d format in addition to trc +# undistort_points = false # Better if distorted image (parallel lines curvy on the edge or at least one param > 10^-2), but unnecessary (and slightly slower) if distortions are low +# make_c3d = false # save triangulated data in c3d format in addition to trc # Coming soon! [filtering] @@ -172,10 +172,15 @@ display_figures = true # true or false (lowercase) ## CUSTOM skeleton, if you trained your own DeepLabCut model for example. ## Make sure the node ids correspond to the column numbers of the 2D pose file, starting from zero. +## ## If you want to perform inverse kinematics, you will also need to create an OpenSim model ## and add to its markerset the location where you expect the triangulated keypoints to be detected. +## ## In this example, CUSTOM reproduces the BODY_25B skeleton (default skeletons are stored in skeletons.py). ## You can create as many custom skeletons as you want, just add them further down and rename them. +## +## Check your model hierarchy with: for pre, _, node in RenderTree(model): +## print(f'{pre}{node.name} id={node.id}') # [pose.CUSTOM] # name = "CHip" # id = "None" diff --git a/Pose2Sim/Utilities/json_display_with_img.py b/Pose2Sim/Utilities/json_display_with_img.py index 26fd81d..8552efc 100644 --- a/Pose2Sim/Utilities/json_display_with_img.py +++ b/Pose2Sim/Utilities/json_display_with_img.py @@ -91,7 +91,7 @@ def json_display_with_img_func(**args): # Display if display == True or display == 'True' or display =='1': cv2.imshow('', img) - cv2.waitKey(10) + cv2.waitKey(0) # Save if save == True or save == 'True' or save == '1': diff --git a/Pose2Sim/Utilities/reproj_from_trc_calib.py b/Pose2Sim/Utilities/reproj_from_trc_calib.py index 69fb178..e640d35 100644 --- a/Pose2Sim/Utilities/reproj_from_trc_calib.py +++ b/Pose2Sim/Utilities/reproj_from_trc_calib.py @@ -19,7 +19,7 @@ Usage: from Pose2Sim.Utilities import reproj_from_trc_calib; reproj_from_trc_calib.reproj_from_trc_calib_func(r'', r'', '', r'') python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file - python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file -f 'openpose' + python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file -f 'openpose' -u python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file -f 'deeplabcut' -o output_file_root ''' @@ -51,44 +51,64 @@ __status__ = "Development" '''BODY_25B (full-body without hands, experimental, from OpenPose) https://github.com/CMU-Perceptual-Computing-Lab/openpose_train/blob/master/experimental_models/README.md Adjust it if your want to reproject in OpenPose format with a different model''' -nb_joints = 25 -BODY_25B = Node("CHip", id=None, children=[ - Node("RHip", id=12, children=[ - Node("RKnee", id=14, children=[ - Node("RAnkle", id=16, children=[ - Node("RBigToe", id=22, children=[ - Node("RSmallToe", id=23), - ]), - Node("RHeel", id=24), - ]), - ]), - ]), - Node("LHip", id=11, children=[ - Node("LKnee", id=13, children=[ - Node("LAnkle", id=15, children=[ - Node("LBigToe", id=19, children=[ - Node("LSmallToe", id=20), - ]), - Node("LHeel", id=21), - ]), - ]), - ]), - Node("Neck", id=17, children=[ - Node("Head", id=18, children=[ - Node("Nose", id=0), - ]), - Node("RShoulder", id=6, children=[ - Node("RElbow", id=8, children=[ - Node("RWrist", id=10), - ]), - ]), - Node("LShoulder", id=5, children=[ - Node("LElbow", id=7, children=[ - Node("LWrist", id=9), - ]), - ]), - ]), -]) +# nb_joints = 25 +# BODY_25B = Node("CHip", id=None, children=[ +# Node("RHip", id=12, children=[ +# Node("RKnee", id=14, children=[ +# Node("RAnkle", id=16, children=[ +# Node("RBigToe", id=22, children=[ +# Node("RSmallToe", id=23), +# ]), +# Node("RHeel", id=24), +# ]), +# ]), +# ]), +# Node("LHip", id=11, children=[ +# Node("LKnee", id=13, children=[ +# Node("LAnkle", id=15, children=[ +# Node("LBigToe", id=19, children=[ +# Node("LSmallToe", id=20), +# ]), +# Node("LHeel", id=21), +# ]), +# ]), +# ]), +# Node("Neck", id=17, children=[ +# Node("Head", id=18, children=[ +# Node("Nose", id=0), +# ]), +# Node("RShoulder", id=6, children=[ +# Node("RElbow", id=8, children=[ +# Node("RWrist", id=10), +# ]), +# ]), +# Node("LShoulder", id=5, children=[ +# Node("LElbow", id=7, children=[ +# Node("LWrist", id=9), +# ]), +# ]), +# ]), +# ]) +nb_joints = 17 +BODY_25B = Node("None", id=None, children=[ + Node("Origin", id=0), + Node("Board1", id=1), + Node("Board2", id=2), + Node("Board3", id=3), + Node("Board4", id=4), + Node("Furniture5", id=5), + Node("Furniture6", id=6), + Node("Furniture7", id=7), + Node("Screen8", id=8), + Node("Screen9", id=9), + Node("Furniture10", id=10), + Node("Furniture11", id=11), + Node("Furniture12", id=12), + Node("Furniture13", id=13), + Node("Furniture14", id=14), + Node("Furniture15", id=15), + Node("Table16", id=16)]) + ## FUNCTIONS @@ -221,7 +241,7 @@ def yup2zup(Q): return Q -def reproj_from_trc_calib_func(*args): +def reproj_from_trc_calib_func(**args): ''' Reproject 3D points from a trc file to the camera planes determined by a toml calibration file. @@ -233,34 +253,20 @@ def reproj_from_trc_calib_func(*args): format with a different model. Usage: - from Pose2Sim.Utilities import reproj_from_trc_calib; reproj_from_trc_calib.reproj_from_trc_calib_func(r'', r'', '', r'') + from Pose2Sim.Utilities import reproj_from_trc_calib; reproj_from_trc_calib.reproj_from_trc_calib_func(input_trc_file = r'', input_calib_file = r'', openpose_output=True, deeplabcut_output=True, undistort_points=True, output_file_root = r'') python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file - python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file -f 'openpose' - python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file -f 'deeplabcut' -o output_file_root + python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file --openpose_output --deeplabcut_output --undistort_points --output_file_root output_file_root + python -m reproj_from_trc_calib -t input_trc_file -c input_calib_file -o -O output_file_root ''' - try: - input_trc_file = args[0]['input_trc_file'] # invoked with argparse - input_calib_file = args[0]['input_calib_file'] - if args[0]['output_format'] == None: - output_format = 'deeplabcut' - else: - output_format = args[0]['output_format'] - if args[0]['output_file_root'] == None: - output_file_root = input_trc_file.replace('.trc', '_reproj') - else: - output_file_root = args[0]['output_file_root'] - except: - input_trc_file = args[0] # invoked as a function - input_calib_file = args[1] - try: - output_format = args[2] - except: - output_format = 'deeplabcut' - try: - output_file_root = args[3] - except: - output_file_root = input_trc_file.replace('.trc', '_reproj') + input_trc_file = os.path.realpath(args.get('input_trc_file')) # invoked with argparse + input_calib_file = os.path.realpath(args.get('input_calib_file')) + openpose_output = args.get('openpose_output') + deeplabcut_output = args.get('deeplabcut_output') + undistort_points = args.get('undistort_points') + output_file_root = args.get('output_file_root') + if output_file_root == None: + output_file_root = input_trc_file.replace('.trc', '_reproj') # Extract data from trc file header_trc, data_trc = df_from_trc(input_trc_file) @@ -270,7 +276,13 @@ def reproj_from_trc_calib_func(*args): filename = os.path.splitext(os.path.basename(input_trc_file))[0] # Extract data from calibration file - P_all = computeP(input_calib_file, undistort_points=True) + P_all = computeP(input_calib_file, undistort=undistort_points) + if undistort_points: + calib_params = retrieve_calib_params(input_calib_file) + calib_params_R_filt = [calib_params['R'][i] for i in range(len(P_all))] + calib_params_T_filt = [calib_params['T'][i] for i in range(len(P_all))] + calib_params_K_filt = [calib_params['K'][i] for i in range(len(P_all))] + calib_params_dist_filt = [calib_params['dist'][i] for i in range(len(P_all))] # Create camera folders reproj_dir = os.path.realpath(output_file_root) @@ -295,13 +307,18 @@ def reproj_from_trc_calib_func(*args): coords = [[] for cam in range(len(P_all))] for keypoint in range(num_bodyparts): q = np.append(Q.iloc[row,3*keypoint:3*keypoint+3], 1) - x_all, y_all = reprojection(P_all, q) + if undistort_points: + coords_2D_all = [cv2.projectPoints(np.array(q[:-1]), calib_params_R_filt[i], calib_params_T_filt[i], calib_params_K_filt[i], calib_params_dist_filt[i])[0] for i in range(len(P_all))] + x_all = [coords_2D_all[i][0,0,0] for i in range(len(P_all))] + y_all = [coords_2D_all[i][0,0,1] for i in range(len(P_all))] + else: + x_all, y_all = reprojection(P_all, q) [coords[cam].extend([x_all[cam], y_all[cam]]) for cam in range(len(P_all))] for cam in range(len(P_all)): data_proj[cam].iloc[row,:] = coords[cam] # Save as h5 and csv if DeepLabCut format - if output_format == 'deeplabcut': + if deeplabcut_output: # to h5 h5_files = [os.path.join(cam_dir,f'{filename}_cam_{i+1:02d}.h5') for i,cam_dir in enumerate(cam_dirs)] [data_proj[i].to_hdf(h5_files[i], index=True, key='reprojected_points') for i in range(len(P_all))] @@ -311,9 +328,13 @@ def reproj_from_trc_calib_func(*args): [data_proj[i].to_csv(csv_files[i], sep=',', index=True, lineterminator='\n') for i in range(len(P_all))] # Save as json if OpenPose format - elif output_format == 'openpose': + if openpose_output: # read body_25b tree - bodyparts_ids = [[node.id for _, _, node in RenderTree(BODY_25B) if node.name==b][0] for b in bodyparts] + model = BODY_25B + print('Keypoint hierarchy:') + for pre, _, node in RenderTree(model): + print(f'{pre}{node.name} id={node.id}') + bodyparts_ids = [[node.id for _, _, node in RenderTree(model) if node.name==b][0] for b in bodyparts] #prepare json files json_dict = {'version':1.3, 'people':[]} json_dict['people'] = [{'person_id':[-1], @@ -327,11 +348,13 @@ def reproj_from_trc_calib_func(*args): 'hand_right_keypoints_3d':[]}] # write one json file per camera and per frame for cam, cam_dir in enumerate(cam_dirs): + print('\n', cam) for frame in range(len(Q)): json_dict_copy = deepcopy(json_dict) data_proj_frame = data_proj[cam].iloc[row]['DavidPagnon']['person0'] # store 2D keypoints and respect body_25b keypoint order for (i,b) in zip(bodyparts_ids, bodyparts): + print(repr(data_proj_frame[b].values)) json_dict_copy['people'][0]['pose_keypoints_2d'][[i*3,i*3+1,i*3+2]] = np.append(data_proj_frame[b].values, 1) json_dict_copy['people'][0]['pose_keypoints_2d'] = json_dict_copy['people'][0]['pose_keypoints_2d'].tolist() # write json file @@ -346,10 +369,12 @@ def reproj_from_trc_calib_func(*args): if __name__ == '__main__': parser = argparse.ArgumentParser() - parser.add_argument('-t', '--input_trc_file', required = True, help='trc 3D coordinates input file') - parser.add_argument('-c', '--input_calib_file', required = True, help='toml calibration input file') - parser.add_argument('-f', '--output_format', required=False, help='deeplabcut or openpose output format') - parser.add_argument('-o', '--output_file_root', required=False, help='output file root, without extension') + parser.add_argument('-t', '--input_trc_file', required = True, help='trc 3D coordinates input file path') + parser.add_argument('-c', '--input_calib_file', required = True, help='toml calibration input file path') + parser.add_argument('-o', '--openpose_output', required=False, action='store_true', help='output format in the openpose json format') + parser.add_argument('-d', '--deeplabcut_output', required=False, action='store_true', help='output format in the deeplabcut csv and json formats') + parser.add_argument('-u', '--undistort_points', required=False, action='store_true', help='takes distortion into account if True') + parser.add_argument('-O', '--output_file_root', required=False, help='output file root path, without extension') args = vars(parser.parse_args()) - reproj_from_trc_calib_func(args) \ No newline at end of file + reproj_from_trc_calib_func(**args) \ No newline at end of file diff --git a/README.md b/README.md index 4f4ff94..60db32a 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ # Pose2Sim -## Please set undistort_points to false for now since reprojection error is currently inaccurate. Should be fixed this weekend (6-7 Jan 2024) +## Please set undistort_points to false for now since reprojection error is currently inaccurate. I'll try to fix it soon. > **_News_: Version 0.5 released:** \ > **Deep change in the folder structure to allow for automatic batch processing!**\ @@ -555,6 +555,9 @@ Build a trc file from a .mot motion file and a .osim model file. [bodykin_from_mot_osim.py](https://github.com/perfanalytics/pose2sim/blob/main/Pose2Sim/Utilities/bodykin_from_mot_osim.py) Converts a mot file to a .csv file with rotation and orientation of all segments. +[reproj_from_trc_calib.py](https://github.com/perfanalytics/pose2sim/blob/main/Pose2Sim/Utilities/reproj_from_trc_calib.py) +Reprojects 3D coordinates of a trc file to the image planes defined by a calibration file. Output in OpenPose or DeepLabCut format. + diff --git a/setup.cfg b/setup.cfg index 43a1235..cf0dcca 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = pose2sim -version = 0.5.4 +version = 0.5.5 author = David Pagnon author_email = contact@david-pagnon.com description = Perform a markerless kinematic analysis from multiple calibrated views as a unified workflow from an OpenPose input to an OpenSim result.