Learning from Synthetic Humans, CVPR 2017

Overview

Learning from Synthetic Humans (SURREAL)

Gül Varol, Javier Romero, Xavier Martin, Naureen Mahmood, Michael J. Black, Ivan Laptev and Cordelia Schmid, Learning from Synthetic Humans, CVPR 2017.

[Project page] [arXiv]

Contents

1. Download SURREAL dataset

In order to download SURREAL dataset, you need to accept the license terms. The links to license terms and download procedure are available here:

https://www.di.ens.fr/willow/research/surreal/data/

Once you receive the credentials to download the dataset, you will have a personal username and password. Use these either to download the dataset excluding optical flow data from here: (SURREAL_v1.tar.gz, 86GB) or download individual files with the download/download_surreal.sh script as follows:

./download_surreal.sh /path/to/dataset yourusername yourpassword

You can check Storage info for how much disk space they require and can do partial download.

Find under datageneration/misc/3Dto2D scripts that explain the projective relations between joints2D and joints3D variables. And here, some issues about the joints are explained.

The structure of the folders is as follows:

SURREAL/data/
------------- cmu/  # using MoCap from CMU dataset
-------------------- train/
-------------------- val/ # small subset of test 
-------------------- test/
----------------------------  run0/ #50% overlap
----------------------------  run1/ #30% overlap
----------------------------  run2/ #70% overlap
------------------------------------  <sequenceName>/ #e.g. 01_01
--------------------------------------------------  <sequenceName>_c%04d.mp4        # RGB - 240x320 resolution video
--------------------------------------------------  <sequenceName>_c%04d_depth.mat  # Depth
#     depth_1,   depth_2, ...  depth_T [240x320 single] - in meters
--------------------------------------------------  <sequenceName>_c%04d_segm.mat   # Segmentation
#     segm_1,     segm_2, ...   segm_T [240x320 uint8]  - 0 for background and 1..24 for SMPL body parts
--------------------------------------------------  <sequenceName>_c%04d_gtflow.mat # Ground truth optical flow
#     gtflow_1, gtflow_2, ... gtflow_T [240x320x2 single]
--------------------------------------------------  <sequenceName>_c%04d_info.mat   # Remaining annotation
#     bg           [1xT cell]      - names of background image files
#     camDist      [1 single]      - camera distance
#     camLoc       [3x1 single]    - camera location
#     clipNo       [1 double]      - clip number of the full sequence (corresponds to the c%04d part of the file)
#     cloth        [1xT cell]      - names of texture image files
#     gender       [Tx1 uint8]     - gender (0: 'female', 1: 'male')
#     joints2D     [2x24xT single] - 2D coordinates of 24 SMPL body joints on the image pixels
#     joints3D     [3x24xT single] - 3D coordinates of 24 SMPL body joints in real world meters
#     light        [9x100 single]  - spherical harmonics lighting coefficients
#     pose         [72xT single]   - SMPL parameters (axis-angle)
#     sequence     [char]          - <sequenceName>_c%04d
#     shape        [10xT single]   - body shape parameters
#     source       [char]          - 'cmu'
#     stride       [1 uint8]       - percent overlap between clips, 30 or 50 or 70
#     zrot         [Tx1 single]    - rotation in Z (euler angle)

# *** T is the number of frames, mostly 100.

Note: There are some monster shapes in the dataset which were not cleaned before training. Some subjects spotted by visual inspection are 18, 19, 143_21.

2. Create your own synthetic data

Note June 2021: Check the surreact repository for code that works with more recent versions of libraries (e.g., Blender 2.92).

2.1. Preparation

2.1.1. SMPL data

a) You need to download SMPL for MAYA from http://smpl.is.tue.mpg.de in order to run the synthetic data generation code. Once you agree on SMPL license terms and have access to downloads, you will have the following two files:

basicModel_f_lbs_10_207_0_v1.0.2.fbx
basicModel_m_lbs_10_207_0_v1.0.2.fbx

Place these two files under datageneration/smpl_data folder.

b) With the same credentials as with the SURREAL dataset, you can download the remaining necessary SMPL data and place it in datageneration/smpl_data.

./download_smpl_data.sh /path/to/smpl_data yourusername yourpassword
smpl_data/
------------- textures/ # folder containing clothing images (also available at lsh.paris.inria.fr/SURREAL/smpl_data/textures.tar.gz)
------------- (fe)male_beta_stds.npy
------------- smpl_data.npz # 2.5GB
 # trans*           [T x 3]     - (T: number of frames in MoCap sequence)
 # pose*            [T x 72]    - SMPL pose parameters (T: number of frames in MoCap sequence)
 # maleshapes       [1700 x 10] - SMPL shape parameters for 1700 male scans
 # femaleshapes     [2103 x 10] - SMPL shape parameters for 2103 female scans 
 # regression_verts [232]
 # joint_regressor  [24 x 232]

Note: SMPL pose parameters are MoSh'ed from CMU MoCap data. Note that these are not the most recent MoSh results. For any questions regarding MoSh, please contact [email protected] instead. Here, we only provide the pose parameters for MoCap sequences, not their shape parameters (they are not used in this work, we randomly sample body shapes).

2.1.2. Background images

We only provide names of the background images we used. They are downloaded from LSUN dataset using this code. You can download images from this dataset or use any other images.

2.1.3. Blender

You need to download Blender and install scipy package to run the first part of the code. The provided code was tested with Blender2.78, which is shipped with its own python executable as well as distutils package. Therefore, it is sufficient to do the following:

# Install pip
/blenderpath/2.78/python/bin/python3.5m get-pip.py
# Install scipy
/blenderpath/2.78/python/bin/python3.5m pip install scipy

get-pip.py is downloaded from pip. Replace the blenderpath with your own and set BLENDER_PATH.

Known problem: Blender2.78a has problems with pip. You can try with new versions of Blender. Otherwise, you can install the dependencies such as scipy to a new python3.5 environment and add this environment's site-packages to PYTHONPATH before running Blender.

2.1.4. FFMPEG

If you want to save the rendered images as videos, you will need ffmpeg library. Build it and set the FFMPEG_PATH to the directory that contains lib/ and bin/ folders. Additionally, if you want to use H.264 codec as it is done in the current version of the code, you need to have the x264 libraries compiled. In that case, set X264_PATH to your build. If you use another codec, you don't need X264_PATH variable and you can remove -c:v h264 from main_part1.py.

This is how the ffmpeg was built:

# x264
./configure  --prefix=/home/gvarol/tools/ffmpeg/x264_build --enable-static --enable-shared --disable-asm
make 
make install

# ffmpeg
./configure --prefix=/home/gvarol/tools/ffmpeg/ffmpeg_build_sequoia_h264 --enable-avresample --enable-pic --disable-doc --disable-static --enable-shared --enable-gpl --enable-nonfree --enable-postproc --enable-libxcb --disable-yasm --enable-libx264 --extra-ldflags="-I/home/gvarol/tools/ffmpeg/x264_build/include -L/home/gvarol/tools/ffmpeg/x264_build/lib" --extra-cflags="-I/home/gvarol/tools/ffmpeg/x264_build/include"
make
make install

2.1.5. OpenEXR

The file type for some of the temporary outputs from Blender will be EXR images. In order to read these images, the code uses OpenEXR bindings for Python. These bindings are available for python 2, the second part of the code (main_part2.py) needs this library.

Note: OpenEXR now exists for python 3, therefore you can run pip install openexr and merge main_part1.py and main_part2.py to get rid of the python 2 requirements.

2.2. Running the code

Copy the config.copy into config and edit the bg_path, tmp_path, output_path and openexr_py2_path with your own paths.

  • bg_path contains background images and two files train_img.txt and test_img.txt. The ones used for SURREAL dataset can be found in datageneration/misc/LSUN. Note that the folder structure is flattened for each room type.

  • tmp_path stores temporary outputs and is deleted afterwards. You can use this for debugging.

  • output_path is the directory where we store all the final outputs of the rendering.

  • openexr_py2_path is the path to libraries for OpenEXR bindings for Python.

run.sh script is ran for each clip. You need to set FFMPEG_PATH, X264_PATH (optional), PYTHON2_PATH, and BLENDER_PATH variables. -t 1 option can be removed to run on multi cores, it runs faster.

# When you are ready, type:
./run.sh

3. Training models

Here, we provide code to train models on the synthetic data to predict body segmentation or depth. You can also find the models pre-trained on synthetic data.

3.1. Preparation

3.1.1. Requirements

Tested on Linux with cuda v8 and cudNN v5.1. Let me know if there are other major dependencies that I forgot to include.

3.1.2. Setup paths

Place the data under ~/datasets/SURREAL or change the opt.dataRoot in opts.lua. The outputs will be written to ~/cnn_saves/<datasetname>/<experiment>, you can change the opt.logRoot to change the cnn_saves location.

3.2. Running the code

3.2.1. Train

There are sample scripts under training/exp/train directory that are self-explanatory. Those are used for the 'Synth' experiments in the paper. Check opts.lua script to see what options are available.

3.2.2. Visualize

A few display functionalities are implemented to debug and visualize results. Example usage:

./training/exp/vis.sh 1 30 cmu eval val

3.2.3. Evaluate

To obtain the final results, you can run ./training/exp/eval.sh 1 30 cmu test, by setting the experiment number, model number, dataset and evaluation set. You can save the outputs to a text file by removing -saveScores option.

3.2.4. Use pre-trained models

We provide 4 pre-trained models for segmentation and depth, either trained using lossless renderings (png) or using the compressed videos (mp4).

./download_models.sh /path/to/models yourusername yourpassword
# model_segm_png.t7
# model_segm_mp4.t7
# model_depth_png.t7
# model_depth_mp4.t7

Use the demo script to apply these models on sample images.

qlua demo/demo.lua

You can also use demo/demo.m Matlab script to produce the visualizations in the paper.

4. Storage info

You might want to do a partial download depending on your needs.

Dataset *_info.mat *.mp4 *_segm.mat *_depth.mat *_gtflow.mat Total
SURREAL (cmu) 3.8G 3.3G 6.0G 82.5G 179G 275G

Citation

If you use this code, please cite the following:

@INPROCEEDINGS{varol17_surreal,  
  title     = {Learning from Synthetic Humans},  
  author    = {Varol, G{\"u}l and Romero, Javier and Martin, Xavier and Mahmood, Naureen and Black, Michael J. and Laptev, Ivan and Schmid, Cordelia},  
  booktitle = {CVPR},  
  year      = {2017}  
}

License

Please check the license terms before downloading and/or using the code, the models and the data. http://www.di.ens.fr/willow/research/surreal/data/license.html

Acknowledgements

The data generation code is built by Javier Romero, Gul Varol and Xavier Martin.

The training code is written by Gul Varol and is largely built on the ImageNet training example https://github.com/soumith/imagenet-multiGPU.torch by Soumith Chintala, and Stacked Hourglass Networks by Alejandro Newell.

Comments
  • 3D Joint positions from SMPL Model (ref: [19])

    3D Joint positions from SMPL Model (ref: [19])

    Hi,

    I am trying to acquire mesh vertices and 3D joint positions by providing pose and shape parameters (provided as ground truth in SURREAL) to the SMPL model given in ref. [19]. However, the 24 3D joint positions which I get from SMPL model, are different from what is provided as the ground truth 3D joint positions in SURREAL.

    Could you please guide me so that I could acquire same 3D joint positions from SMPL model as provided by SURREAL in the ground truth ?

    -- Thanks

    opened by J-M-pixel 20
  • Using Surreal for Human Action Recognition

    Using Surreal for Human Action Recognition

    Hi @gulvarol

    Thank you for a great dataset.

    Actually I want to use Surreal dataset for human action recognition task. In this regard, I have following two questions.

    1. From where do I obtain the information about specific action type in the videos? Do you store that information in any of the mat files?

    2. Also if I want to generate videos for custom actions according to my own requirement then how can I achieve that?

    Thank you

    opened by rayush7 7
  • Segmentation Creation or Visualization is Broken

    Segmentation Creation or Visualization is Broken

    01_01_c0001_segm

    Hi,

    This image represents the segmentation I got from generating the synthetic data. I've followed sctrictly the procedure explained for data creation except , I needed to use blender 2.9 in order to install pip (ssl certificate issue otherwise).

    There is an empty part in the visualized upper body in this image. Similar results are obtained when downloading directly the data instead of creating them.

    Any help that can explained this observation ?

    Thanks in advance

    opened by zazizou 6
  • [Question] Regarding depth in main_part1.py

    [Question] Regarding depth in main_part1.py

    Hello Gul Varol,

    First of all, I really appreciate your great work. I can see great potential of SURREAL in various fields of applications. As an example, I am attempting to use your code to create construction context synthetic images and ground truth (mainly for 3D pose estimation of construction workers).

    I am not computer science guy so am a bit struggling at implementing your code. I followed all the steps you mentioned and believe all the dependencies are now installed correctly. Thanks for your kind explanation.

    One problem is that I get an error message regarding depth in main_part1.py: Traceback (most recent call last): File "/home/daeho/PycharmProjects/SURREAL-P2.7/datageneration/main_part1.py", line 827, in main() File "/home/daeho/PycharmProjects/SURREAL-P2.7/datageneration/main_part1.py", line 555, in main res_paths = create_composite_nodes(scene.node_tree, params, img=bg_img, idx=idx) File "/home/daeho/PycharmProjects/SURREAL-P2.7/datageneration/main_part1.py", line 156, in create_composite_nodes tree.links.new(layers.outputs['Z'], depth_out.inputs[0]) # save depth KeyError: 'bpy_prop_collection[key]: key "Z" not found'

    Would you please help me to address this issue? I think the depth information is important in estimating the ground truth of 3D joint locations. So, I don't want to skip the depth information (though I can run the code when I mute this line).

    Any advice or comments will be greatly appreciated.

    FYI #1) I am using Blender 2.79b (since I can't address the pip issue with 2.78 or 2.78a). FYI #2) I am trying with my own background images (just two construction images at this time), I changed the train and test text files for that. FYI #3) When I run the code while muting the problematic line, I can see the synthetic image created with my background image. But, it won't allow me to run main_part2.py as it does not save the depth information.

    Thanks, Daeho

    Civil & Environmental Engineering, University of Michigan

    opened by daehoumich 5
  • Human pose is outside of rendered frame

    Human pose is outside of rendered frame

    Hi,

    I have generated some data, 100 frames are produced for each run. But some of the images, especially later frames, present only background image : the human model is rendered outside of the image window.

    Is this expected, or should I set some parameters to fix this issue ?

    Regards

    opened by zazizou 4
  • Reproducing the numbers on the synthetic test set

    Reproducing the numbers on the synthetic test set

    Hi, I am trying to reproduce the segmentation results on the synthetic test set as said in page 5 of the paper (69.13% IoU, 80.61% accuracy). However, I couldn't match those numbers using either the pre-trained model nor a model trained from scratch, and they are 2~3% lower for both metrics. The only thing I changed from the out-of-the-shelf code is the dataRoot parameters. Could you shed some light on reproducing those numbers?

    opened by mtli 4
  • Reproducing the depth estimation results on the synthetic test set

    Reproducing the depth estimation results on the synthetic test set

    Hi, I am reproducing the depth estimation results on the synthetic test set. But the results I got are quite different from the results reported in the paper. As the paper suggested 'To interpret the error in real world coordinates, we multiply it by the quantization constant (45mm).' I can only get 4.39 * 45mm = 197.8mm (RMSE). That number is far bigger than the number reported in the paper. It would be very appreciated if you could run your released model on the depth estimation baseline too.

    Originally posted by @Dominoer in https://github.com/gulvarol/surreal/issues/9#issuecomment-718753229

    opened by Dominoer 3
  • How generate own synthetic data

    How generate own synthetic data

    I am trying to generate my own synthetic data, using different background images, different camera focal length and mean distance. I followed the instructions on the README, however I don’t fully understand how to generate a large set of video clips. By running run.sh only one clip is generated. How can I generate many clips as in your dataset? Thanks

    opened by GianMassimiani 3
  • Non-overlapping data

    Non-overlapping data

    Is the pose parameters for the sequences with no overlapping frames available?

    I tried to work around this by making my own algorithm to detect overlaps and then cut and splice the clips into non-overlapping sequences. Running that on run1 of the test and training data I found 2666 non-overlapping sequences (703 in test, 1963 train), does that seem about right?

    opened by sebftw 3
  • What does

    What does "ung_" mean?

    Many of the clips have the prefix "ung_" in their sequence name. I wonder what this means and if these sequences should be treated different.

    opened by andreaskoelsch 3
  • about joints2D and joints3D

    about joints2D and joints3D

    Hi! I have a question about the joints parameter reading from _info.mat file Because I read a joints3d from mat file, But it's location is weird. For example, the first coordinate is [-0.3, -0.9, 1.1]. joints2D is okay. What do I do?

    opened by chacha95 3
  • Low res textures

    Low res textures

    Why are textures provided so low res, are there higher-res ones also available, something near 2k like in the Seizer dataset. Is there a way to convert this res to higher res?

    opened by kashyappiyush1998 2
  • download_smpl_data.sh not working

    download_smpl_data.sh not working

    Hello Dear Author,

    I am having a problem with executing the abovementioned script. I have all the log in credentials and executing it as said. Is there another way to download it. Thank you.

    opened by sard0r 5
  • wrong ground-truth

    wrong ground-truth

    Hi @gulvarol, I have worries on the data using code here https://github.com/gulvarol/surreal/blob/master/datageneration/misc/smpl_relations/smpl_relations.py. It seems the head is twisted 180 degree in the ground-truth(second one), image

    Here is the original data file: cmu/train/run0/01_01/01_01_c0001_info.mat frame 0

    opened by xiaofanglegoc 0
  • Incorrect global rotation

    Incorrect global rotation

    Hello, thank you for your excellent work! I use surreal dataset to train the model,When reading smpl parameter data,I have done the preprocessing according to your methodpose[0:3] = rotateBody(RzBody, pose[0:3]),However, during the training process, I found that the global rotation of the model was still biased (not too large) But in the test program of dataset,Model rendering is correct (but left and right seem to be opposite), Different from the following program, I used orthogonal projection in my training program. Is there any error here? proj_smpl_vertices = project_vertices(smpl_vertices, intrinsic, extrinsic)

    Thank you!

    opened by moondabaojian 1
Owner
Gul Varol
Computer Vision Researcher
Gul Varol
Commonality in Natural Images Rescues GANs: Pretraining GANs with Generic and Privacy-free Synthetic Data - Official PyTorch Implementation (CVPR 2022)

Commonality in Natural Images Rescues GANs: Pretraining GANs with Generic and Privacy-free Synthetic Data (CVPR 2022) Potentials of primitive shapes f

null 31 Sep 27, 2022
SCALE: Modeling Clothed Humans with a Surface Codec of Articulated Local Elements (CVPR 2021)

SCALE: Modeling Clothed Humans with a Surface Codec of Articulated Local Elements (CVPR 2021) This repository contains the official PyTorch implementa

Qianli Ma 133 Jan 5, 2023
Code for "Reconstructing 3D Human Pose by Watching Humans in the Mirror", CVPR 2021 oral

Reconstructing 3D Human Pose by Watching Humans in the Mirror Qi Fang*, Qing Shuai*, Junting Dong, Hujun Bao, Xiaowei Zhou CVPR 2021 Oral The videos a

ZJU3DV 178 Dec 13, 2022
ICON: Implicit Clothed humans Obtained from Normals (CVPR 2022)

ICON: Implicit Clothed humans Obtained from Normals Yuliang Xiu · Jinlong Yang · Dimitrios Tzionas · Michael J. Black CVPR 2022 News ?? [2022/04/26] H

Yuliang Xiu 1.1k Jan 4, 2023
A PyTorch implementation of the paper "Semantic Image Synthesis via Adversarial Learning" in ICCV 2017

Semantic Image Synthesis via Adversarial Learning This is a PyTorch implementation of the paper Semantic Image Synthesis via Adversarial Learning. Req

Seonghyeon Nam 146 Nov 25, 2022
meProp: Sparsified Back Propagation for Accelerated Deep Learning (ICML 2017)

meProp The codes were used for the paper meProp: Sparsified Back Propagation for Accelerated Deep Learning with Reduced Overfitting (ICML 2017) [pdf]

LancoPKU 107 Nov 18, 2022
Official PyTorch implementation of "Proxy Synthesis: Learning with Synthetic Classes for Deep Metric Learning" (AAAI 2021)

Proxy Synthesis: Learning with Synthetic Classes for Deep Metric Learning Official PyTorch implementation of "Proxy Synthesis: Learning with Synthetic

NAVER/LINE Vision 30 Dec 6, 2022
The PyTorch improved version of TPAMI 2017 paper: Face Alignment in Full Pose Range: A 3D Total Solution.

Face Alignment in Full Pose Range: A 3D Total Solution By Jianzhu Guo. [Updates] 2020.8.30: The pre-trained model and code of ECCV-20 are made public

Jianzhu Guo 3.4k Jan 2, 2023
An efficient PyTorch implementation of the winning entry of the 2017 VQA Challenge.

Bottom-Up and Top-Down Attention for Visual Question Answering An efficient PyTorch implementation of the winning entry of the 2017 VQA Challenge. The

Hengyuan Hu 731 Jan 3, 2023
Fader Networks: Manipulating Images by Sliding Attributes - NIPS 2017

FaderNetworks PyTorch implementation of Fader Networks (NIPS 2017). Fader Networks can generate different realistic versions of images by modifying at

Facebook Research 753 Dec 23, 2022
PyTorch implementation of NIPS 2017 paper Dynamic Routing Between Capsules

Dynamic Routing Between Capsules - PyTorch implementation PyTorch implementation of NIPS 2017 paper Dynamic Routing Between Capsules from Sara Sabour,

Adam Bielski 475 Dec 24, 2022
Implementation of EMNLP 2017 Paper "Natural Language Does Not Emerge 'Naturally' in Multi-Agent Dialog" using PyTorch and ParlAI

Language Emergence in Multi Agent Dialog Code for the Paper Natural Language Does Not Emerge 'Naturally' in Multi-Agent Dialog Satwik Kottur, José M.

Karan Desai 105 Nov 25, 2022
PyTorch version of the paper 'Enhanced Deep Residual Networks for Single Image Super-Resolution' (CVPRW 2017)

About PyTorch 1.2.0 Now the master branch supports PyTorch 1.2.0 by default. Due to the serious version problem (especially torch.utils.data.dataloade

Sanghyun Son 2.1k Jan 1, 2023
Implementation supporting the ICCV 2017 paper "GANs for Biological Image Synthesis"

GANs for Biological Image Synthesis This codes implements the ICCV-2017 paper "GANs for Biological Image Synthesis". The paper and its supplementary m

Anton Osokin 95 Nov 25, 2022
Improving Convolutional Networks via Attention Transfer (ICLR 2017)

Attention Transfer PyTorch code for "Paying More Attention to Attention: Improving the Performance of Convolutional Neural Networks via Attention Tran

Sergey Zagoruyko 1.4k Dec 23, 2022
Code for the USENIX 2017 paper: kAFL: Hardware-Assisted Feedback Fuzzing for OS Kernels

kAFL: Hardware-Assisted Feedback Fuzzing for OS Kernels Blazing fast x86-64 VM kernel fuzzing framework with performant VM reloads for Linux, MacOS an

Chair for Sys­tems Se­cu­ri­ty 541 Nov 27, 2022
Implementation of EMNLP 2017 Paper "Natural Language Does Not Emerge 'Naturally' in Multi-Agent Dialog" using PyTorch and ParlAI

Language Emergence in Multi Agent Dialog Code for the Paper Natural Language Does Not Emerge 'Naturally' in Multi-Agent Dialog Satwik Kottur, José M.

Karan Desai 105 Nov 25, 2022
Learning from Synthetic Shadows for Shadow Detection and Removal [Inoue+, IEEE TCSVT 2020].

Learning from Synthetic Shadows for Shadow Detection and Removal (IEEE TCSVT 2020) Overview This repo is for the paper "Learning from Synthetic Shadow

Naoto Inoue 67 Dec 28, 2022
IntraQ: Learning Synthetic Images with Intra-Class Heterogeneity for Zero-Shot Network Quantization

IntraQ: Learning Synthetic Images with Intra-Class Heterogeneity for Zero-Shot Network Quantization paper Requirements Python >= 3.7.10 Pytorch == 1.7

null 1 Nov 19, 2021