GithubHelp home page GithubHelp logo

davrempe / contact-human-dynamics Goto Github PK

View Code? Open in Web Editor NEW
264.0 7.0 40.0 9.66 MB

Code for ECCV 2020 paper "Contacts and Human Dynamics from Monocular Video".

License: Other

Shell 0.08% Python 76.16% CMake 0.58% C++ 23.18%

contact-human-dynamics's Introduction

Contact and Human Dynamics from Monocular Video

This is the official implementation for the ECCV 2020 spotlight paper by Davis Rempe, Leonidas J. Guibas, Aaron Hertzmann, Bryan Russell, Ruben Villegas, and Jimei Yang. For more information, see the project webpage.

Teaser

News

Environment Setup

Note: the code in this repo has only been tested on Ubuntu 16.04.

First create and activate a virtual environment to install dependencies for the code in this repo. For example with conda:

  • conda create -n contact_dynamics_env python=3.6
  • conda activate contact_dynamics_env
  • pip install -r requirements.txt

Note the package versions in the requirements file are the exact ones tested on, but may need to be modified for your system. The code also uses ffmpeg.

This codebase requires the installation of a number of external dependencies that have their own installation instructions/environments, e.g., you will likely want to create a different environment just to run Monocular Total Capture below. The following external dependencies are only necessary to run the full pipeline (both contact detection and physical optimization). If you're only interested in detecting foot contacts, it is only necessary to install OpenPose.

To get started, from the root of this repo mkdir external.

Monocular Total Capture (MTC)

The full pipeline runs on the output from Monocular Total Capture (MTC). To run MTC, you must clone this fork which contains a number of important modifications:

  • cd external
  • git clone https://github.com/davrempe/MonocularTotalCapture.git
  • Follow installation instructions in that repo to set up the MTC environment.

TOWR

The physics-based optimization takes advantage of the TOWR library. Specifically, this fork must be used:

  • cd external
  • git clone https://github.com/davrempe/towr.git
  • Follow the intallation instructions to build and install the library using cmake.

Building Physics-Based Optimization

Important Note: if you did not use the HSL routines when building IPopt as suggested, in towr_phys_optim/phys_optim.cpp you will need to change the line solver->SetOption("linear_solver", "MA57"); to solver->SetOption("linear_solver", "mumps"); before building our physics-based optimization. This uses the slower MUMPS solver and should be avoided if possible.

After building and installing TOWR, we must build the physics-based optimization part of the pipeline. To do this from the repo root:

cd towr_phys_optim
mkdir build && cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make

Downloads

Synthetic Dataset

The synthetic dataset used to train our foot contact detection network contains motion sequences on various Mixamo characters. For each sequence, the dataset contains rendered videos from 2 different camera viewpoints, camera parameters, annotated foot contacts, detected 2D pose (with OpenPose), and the 3D motion as a bvh file. Note, this dataset is only needed if you want to retrain the contact detection network.

To download the dataset:

  • cd data
  • bash download_full.sh to download the full (52 GB) dataset or bash download_sample.sh for a sample version (715 MB) with limited motions from 2 characters.

Pretrained Weights

To download pretrained weights for the foot contact detection network, run:

  • cd pretrained_weights
  • bash download.sh

Running the Pipeline on Real Videos

Next we'll walk through running each part of the pipeline on a set of real-world videos. A small example dataset with 2 videos is provided in data/example_data. Data should always be structured as shown in example_data where each video is placed in its own directory named the same as the video file to be processed - inputs and outputs for parts of the pipeline will be saved in these directories. There is a helper script to create this structure from a directory of videos.

The first two steps in the pipeline are running MTC/OpenPose on the video to get 3D/2D pose inputs, followed by foot contact detection using the 2D poses.

Running MTC

The first step is to run MTC and OpenPose. This will create the necessary data (2D and 3D poses) to run both foot contact detection and physical optimization.

The scripts/run_totalcap.py is used to run MTC. It is invoked on a directory containg any number of videos, each in their own directory, and will run MTC on all contained videos. The script runs MTC, post-processes the results to be used in the rest of the pipeline, and saves videos visualizing the final output. The script copies all the needed outputs (in particular tracked_results.json and the OpenPose detection openpose_results directly to the given data directory). To run MTC for the example data, first cd scripts then:

python run_totalcap.py --data ../data/example_data --out ../output/mtc_viz_out --totalcap ../external/MonocularTotalCapture

Alternatively, if you only want to do foot contact detection (and don't care about the physical optimization), you can instead run OpenPose by itself without MTC. There is a helper script to do this in scripts:

python run_openpose.py --data ../data/example_data --out ../data/example_data --openpose ../external/openpose --hands --face --save-video

This runs OpenPose and saves the outputs directly to the same data directory for later use in contact detection.

Foot Contact Detection

The next step is using the learned neural network to detect foot contacts from the 2D pose sequence.

To run this, first download the pretrained network weights as detailed above. Then to run on the example data cd scripts and then:

python run_detect_contacts.py --data ../data/example_data --weights ../pretrained_weights/contact_detection_weights.pth

This will detect and save foot contacts for each video in the data directory to a file called foot_contacts.npy. This is simply an Fx4 array where F is the number of frames; for each frame there is a binary contact label for the left heel, left toe, right heel, and right toe, in that order.

You may also optionally add the --viz flag to additionally save a video with overlaid detections (currently requires a lot of memory for videos more than a few seconds long).

Trajectory Optimization

Finally, we are able to run the kinematic optimization, retargeting, and physics-based optimization steps.

There is a single script to run all these - simply make sure you are in the scripts directory, then run:

python run_phys_mocap.py --data ../data/example_data --character ybot

This command will do the optimization directly on the YBot Mixamo character (ty and skeletonzombie are also availble). To perform the optimization on the skeleton estimated from video (i.e., to not use the retargeting step), give the argument --character combined.

Each of the steps in this pipeline can be run individually if desired, see how to do this in run_phys_mocap.py.

Visualize Results with Blender

We can visualize results on a character using Blender. Before doing this, ensure Blender v2.79b is installed.

You will first need to download the Blender scene we use for rendering. From the repo root cd data then bash download_viz.sh will place viz_scene.blend in the data directory. Additionally, you need to download the character T-pose FBX file from the Mixamo website; in this example we are using the YBot character.

To visualize the result for a sequence, make sure you are in the src directory and use something like:

blender -b -P viz/viz_blender.py -- --results ../data/example_data/dance1 --fbx ../data/fbx/ybot.fbx --scene ../data/viz_scene.blend --character ybot --out ../output/rendered_res --fps 24 --draw-com --draw-forces

Note that there are many options to customize this rendering - please see the script for all these. Also the side view is set up heuristically, you may need to manually tune setup_camera depending on your video.

Training and Testing Contact Detection Network on Synthetic Data

To re-train the contact detection network on the synthetic dataset and run inference on the test set use the following:

>> cd src
# Train the contact detection network
>> python contact_learning/train.py --data ../data/synthetic_dataset --out ../output/contact_learning_results
# Run detection on the test set
>> python contact_learning/test.py --data ../data/synthetic_dataset --out ../output/contact_learning_results --weights-path ../output/contact_learning_results/op_only_weights_BEST.pth --full-video

Citation

If you found this code or paper useful, please consider citing:

@inproceedings{RempeContactDynamics2020,
    author={Rempe, Davis and Guibas, Leonidas J. and Hertzmann, Aaron and Russell, Bryan and Villegas, Ruben and Yang, Jimei},
    title={Contact and Human Dynamics from Monocular Video},
    booktitle={Proceedings of the European Conference on Computer Vision (ECCV)},
    year={2020}
}

Questions?

If you run into any problems or have questions, please create an issue or contact Davis ([email protected]).

contact-human-dynamics's People

Contributors

davrempe avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar

contact-human-dynamics's Issues

How to run this technique with VIBE?

Hi, i have 3d poses predicted from VIBE, how do I apply this technique to my model? I don't know how to using the contact information to reduce skate problem. Can u give me a hand?

Needing "tracked_results. JSON" file!!!!!

Hello, I am running your code scripts/run_totalcap.py of “contact-human-dynamics”,
but ,because my cuda version does not match opencv, I did not receive the 3D data generated in the first step, such as "tracked_results. JSON" file, and so on. But I got an "openpose_ Results" and "net_out" file.

I would like to check the operation and results of the last two steps, so I would like to request that you send me a data file generated in the first step of "example_dance 1 and 2", which contains all the data generated in the first step, so that I can run the last two steps.

I urgently need this data file, thank you very much!!!!

(example_dance1 and 2 are the videos you provided in the initial project)
Hello, I am running your code

Thanks!!!

About the cam parameters in foot contact data.

Hi,
Thanks for the wonderful work. I downloaded the foot contact data and tried to project the 3D keypoints obtained from bvh file onto the image plane, which failed to align with the pose. I used the "K" and "RT" in the view*_camera_params.npz for perspective projection but got the wrong results. What is the "P" in the npz file used for? Or could you please provide a script for projection? Thank you very much!

some question about root postion

Hi, since based on your scripts, when run totalcap, the run_fitting.cpp will save the predicted parameters in txt for tracked or untracked results, and I tried to read the root postion from these txt(the first row in these txt), but when to use these root position on my own T pose model, the result seems not normal.
I cannot figure out why since the default rendered results are all normal, hope you can help, thanks~

Monocular problem (site down)

Hello.
I was eager to test this solution, but right from the beggning I had problems with another repository.
I know its not your fault, but I think it would be nice to let you know, because anybody else will be able to build those other tools to test this solution, sadly.

Here is a issue I'm opened, just to other people, in case the have the same problem.

CMU-Perceptual-Computing-Lab/MonocularTotalCapture#59

Files missing in data folder

Hello,
It seems that some files in "data" folder are missing.

import data.openpose_dataset as openpose_datasetfrom data.openpose_dataset import OpenPoseDatasetfrom data.real_video_dataset import RealVideoDataset, TRAIN_DIMfrom data.contact_data_utils import get_frame_paths

Can I use my own bvh and 3dpos?

hi there, i've been trying to integrate your code with my human pose estimation code. I have a bvh and 3dpos with different hierarchy than yours as input, then I do the 2D-3D projection on the common parts of my bvh and your original bvh. Now I can get the "optimize_trajectory" part running, but the result turned out to be very bad. Could you point where I did wrong? Thank you for your help.
test.zip

Results of example_data/dance1 were not correct, did I make somthing wrong?

Amazing work! Thank you for sharing the code.
But I run the demo of example_data/dance1(73 frames), the .log in phys_optim_out_ybot folder gave out the result "dynamics 0
durations 0", which means Optimization did not converge.
The dance_compare_all_skel.mp4 in phys_optim_out_ybot folder showed the strange results:
https://user-images.githubusercontent.com/30141934/119248285-be8ea100-bbc2-11eb-959a-2b34972fbee9.mp4

So, I want to ask was there anything wrong with what I did during the process? Thank you again.

Dockerfile or Docker image Requirement

Thanks for your great work!
I find it difficult to configure the environment, would it be possible for you to release a dockerfile or docker image? Thanks!!

Error building physics-based optimization part

Hello, Thanks for the great work.
when I try to build the physics-based optimization I get the following error:

contact-human-dynamics/towr_phys_optim/src/variables/nodes_variables_dynamic_phase_based.cpp:51:3: error: 

std::vector<towr::NodesVariablesPhaseBased::PolyInfo> towr::NodesVariablesPhaseBased::polynomial_info_’

is private within this context.

Could you please help me to solve this error?

Speed of kinematic optimizer

Hi, thanks for the great work! I tried to run the physical mocap part (kinematic optimization + retargeting + physics based optimization), in paper you mentioned "for a 2 second (60 frame) video clip, the physical optimization usually takes from 30 minutes to 1 hour" and I found kinematic optimization is slow too, should it be very fast? I'm not sure if this is normal or not, looking forward to your response, thanks!!

Problems on optimization with my own bvh file

Hi @davrempe , I'm running the towr optimization code on my bvh file. I have removed T-pose at the first frame, changed the joints index and the body segment mapping dict. Spline fitting in stage1.1 can converge at 1822 steps, however it can not converge from stage1.2. I don't know why, could you please give me some advice.

use viz flag on my own video (only a few seconds)

I turned on the viz flag and set it to true, but I still can't save the video, I get the error
"FileNotFoundError: [Errno 2] No such file or directory: '/tmp/tmpbibs1kw9/full_video_results/sample_pos.mp4'"

apply foot contact on my own video

I got some video in the wild, however, there might be some problem with the rendering image. I can't get the result.
image
this cost more than one hour, and I still can't get the result.

Files missing in “data” folder

Hello,
It seems that some python files in "data" folder are missing.

In "src/contact_learning/test.py", the following files are imported, but I can't find them in the repo.
import data.openpose_dataset as openpose_dataset
from data.openpose_dataset import OpenPoseDataset
from data.real_video_dataset import RealVideoDataset, TRAIN_DIM
from data.contact_data_utils import get_frame_paths

Could you please provide the missing files? Thanks

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.