Code Monkey home page Code Monkey logo

epipolarpose's Introduction

PWC

Self-Supervised Learning of 3D Human Pose using Multi-view Geometry (CVPR2019) [project page]

Introduction

This is a pytorch implementation of Self-Supervised Learning of 3D Human Pose using Multi-view Geometry paper.

Self-Supervised Learning of 3D Human Pose using Multi-view Geometry,
Muhammed Kocabas*, Salih Karagoz*, Emre Akbas,
IEEE Computer Vision and Pattern Recognition, 2019 (*equal contribution)

In this work, we present EpipolarPose, a self-supervised learning method for 3D human pose estimation, which does not need any 3D ground-truth data or camera extrinsics.

During training, EpipolarPose estimates 2D poses from multi-view images, and then, utilizes epipolar geometry to obtain a 3D pose and camera geometry which are subsequently used to train a 3D pose estimator.

In the test time, it only takes an RGB image to produce a 3D pose result. Check out demo.ipynb to run a simple demo.

Here we show some sample outputs from our model on the Human3.6M dataset. For each set of results we first show the input image, followed by the ground truth, fully supervised model and self supervised model outputs.

Video Demo

Overview

  • scripts/: includes training and validation scripts.
  • lib/: contains data preparation, model definition, and some utility functions.
  • refiner/: includes the implementation of refinement unit explained in the paper Section 3.3.
  • experiments/: contains *.yaml configuration files to run experiments.
  • sample_images/: images from Human3.6M dataset to run demo notebook.

Requirements

The code is developed using python 3.7.1 on Ubuntu 16.04. NVIDIA GPUs ared needed to train and test. See requirements.txt or environment.yml for other dependencies.

Quick start

Installation

  1. Install pytorch >= v1.0.0 following official instructions. Note that if you use pytorch's version < v1.0.0, you should follow the instructions at https://github.com/Microsoft/human-pose-estimation.pytorch to disable cudnn's implementation of BatchNorm layer. We encourage you to use higher pytorch's version(>=v1.0.0)

  2. Clone this repo, and we will call the directory that you cloned as ${ROOT}

  3. Install dependencies using pip.

    pip install -r requirements.txt
    

    or create a new conda env:

    conda env create -f environment.yml
    
  4. Download annotation files from GoogleDrive (150 MB) as a zip file under ${ROOT} folder. Run below commands to unzip them.

    unzip data.zip
    rm data.zip
    
  5. Finally prepare your workspace by running:

    mkdir output
    mkdir models

    Optionally you can download pretrained weights using the links in the below table. You can put them under models directory. At the end, your directory tree should like this.

    ${ROOT}
    ├── data/
    ├── experiments/
    ├── lib/
    ├── models/
    ├── output/
    ├── refiner/
    ├── sample_images/
    ├── scripts/
    ├── demo.ipynb
    ├── README.md
    └── requirements.txt
    
  6. Yep, you are ready to run demo.ipynb.

Data preparation

You would need Human3.6M data to train or test our model. For Human3.6M data, please download from Human 3.6 M dataset. You would need to create an account to get download permission. After downloading video files, you can run our script to extract images. Then run ln -s <path_to_extracted_h36m_images> ${ROOT}/data/h36m/images to create a soft link to images folder. Currently you can use annotation files we provided in step 4, however we will release the annotation preparation script soon after cleaning and proper testing.

If you would like to pretrain an EpipolarPose model on MPII data, please download image files from MPII Human Pose Dataset (12.9 GB). Extract it under ${ROOT}/data/mpii directory. If you already have the MPII dataset, you can create a soft link to images: ln -s <path_to_mpii_images> ${ROOT}/data/mpii/images

During training, we make use of synthetic-occlusion. If you want to use it please download the Pascal VOC dataset as instructed in their repo and update the VOC parameter in configuration files.

After downloading the datasets your data directory tree should look like this:

${ROOT}
|── data/
├───├── mpii/
|   └───├── annot/
|       └── images/
|       
└───├── h36m/
    └───├── annot/
        └── images/
            ├── S1/
            └── S5/
            ...

Pretrained Models

Human3.6M

Download pretrained models using the given links, and put them under indicated paths.

Model Backbone MPJPE on Human3.6M (mm) Link Directory
Fully Supervised resnet18 63.0 model models/h36m/fully_supervised_resnet18.pth.tar
Fully Supervised resnet34 59.6 model models/h36m/fully_supervised_resnet34.pth.tar
Fully Supervised resnet50 51.8 model models/h36m/fully_supervised.pth.tar
Self Supervised R/t resnet50 76.6 model models/h36m/self_supervised_with_rt.pth.tar
Self Supervised without R/t resnet50 78.8 (NMPJPE) model models/h36m/self_supervised_wo_rt.pth.tar
Self Supervised (2D GT) resnet50 55.0 model models/h36m/self_supervised_2d_gt.pth.tar
Self Supervised (Subject 1) resnet50 65.3 model models/h36m/self_supervised_s1.pth.tar
Self Supervised + refinement MLP-baseline 60.5 model models/h36m/refiner.pth.tar
  • Fully Supervised: trained using ground truth data.
  • Self Supervised R/t: trained using only camera extrinsic parameters.
  • Self Supervised without R/t: trained without any ground truth data or camera parameters.
  • Self Supervised (2D GT): trained with triangulations from ground truth 2D keypoints provided by the dataset.
  • Self Supervised (Subject 1): trained with only ground truth data of Subject #1.
  • Self Supervised + refinement: trained with a refinement module. For details of this setting please refer to refiner/README.md

Check out the paper for more details about training strategies of each model.

MPII

To train an EpipolarPose model from scratch, you would need the model pretrained on MPII dataset.

Model Backbone Mean PCK (%) Link Directory
MPII Integral resnet18 84.7 model models/mpii/mpii_integral_r18.pth.tar
MPII Integral resnet34 86.3 model models/mpii/mpii_integral_r34.pth.tar
MPII Integral resnet50 88.3 model models/mpii/mpii_integral.pth.tar
MPII heatmap resnet50 88.5 model models/mpii/mpii_heatmap.pth.tar

Validation on H36M using pretrained models

In order to run validation script with a self supervised model, update the MODEL.RESUME field of experiments/h36m/valid-ss.yaml with the path to the pretrained weight and run:

python scripts/valid.py --cfg experiments/h36m/valid-ss.yaml

To run a fully supervised model on validation set, update the MODEL.RESUME field of experiments/h36m/valid.yaml with the path to the pretrained weight and run:

python scripts/valid.py --cfg experiments/h36m/valid.yaml

Training on H36M

To train a self supervised model, try:

python scripts/train.py --cfg experiments/h36m/train-ss.yaml

Fully supervised model:

python scripts/train.py --cfg experiments/h36m/train.yaml

Citation

If this work is useful for your research, please cite our paper:

@inproceedings{kocabas2019epipolar,
    author = {Kocabas, Muhammed and Karagoz, Salih and Akbas, Emre},
    title = {Self-Supervised Learning of 3D Human Pose using Multi-view Geometry},
    booktitle = {The IEEE Conference on Computer Vision and Pattern Recognition (CVPR)},
    month = {June},
    year = {2019}
}

References

We thank to the authors for releasing their codes. Please also consider citing their works.

License

This code is freely available for free non-commercial use, and may be redistributed under these conditions. Please, see the LICENSE for further details. Third-party datasets and softwares are subject to their respective licenses.

epipolarpose's People

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  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

epipolarpose's Issues

human3.6 annotation

hi,
Thanks for your work.

could your share the process of transfering 'joints_3d_cam' coordinates to 'joints_3d' coordinates in your annotation files?

How to estimate camera parameters when they are not available?

Hi,

Thanks for your great work. Your paper mentioned that when camera parameters are not available, the body joints can be used as calibration targets. I'm interesting about this, but I didn't find related code in your repo. Can you release the code or explaine more details about it? If I have some synchronized multi-view videos without 3D pose ground-truth, can I use your method to estimate camera parameters?

Looking forward to your reply, thank you!

pretrained models incorrect size

Sadly the pretrained models aren't the right size except refiner.pth.tar which appears to be an untrained model now

model.load_state_dict(checkpoint, strict = False) File "C:\Python37\lib\site-packages\torch\nn\modules\module.py", line 1407, in load_state_dict self.__class__.__name__, "\n\t".join(error_msgs))) RuntimeError: Error(s) in loading state_dict for DataParallel: size mismatch for module.layer1.0.conv1.weight: copying a param with shape torch.Size([64, 64, 3, 3]) from checkpoint, the shape in current model is torch.Size([64, 64, 1, 1]). size mismatch for module.layer1.1.conv1.weight: copying a param with shape torch.Size([64, 64, 3, 3]) from checkpoint, the shape in current model is torch.Size([64, 256, 1, 1]). size mismatch for module.layer1.2.conv1.weight: copying a param with shape torch.Size([64, 64, 3, 3]) from checkpoint, the shape in current model is torch.Size([64, 256, 1, 1]). size mismatch for module.layer2.0.conv1.weight: copying a param with shape torch.Size([128, 64, 3, 3]) from checkpoint, the shape in current model is torch.Size([128, 256, 1, 1]). size mismatch for module.layer2.0.downsample.0.weight: copying a param with shape torch.Size([128, 64, 1, 1]) from checkpoint, the shape in current model is torch.Size([512, 256, 1, 1]). size mismatch for module.layer2.0.downsample.1.weight: copying a param with shape torch.Size([128]) from checkpoint, the shape in current model is torch.Size([512]). size mismatch for module.layer2.0.downsample.1.bias: copying a param with shape torch.Size([128]) from checkpoint, the shape in current model is torch.Size([512]). size mismatch for module.layer2.0.downsample.1.running_mean: copying a param with shape torch.Size([128]) from checkpoint, the shape in current model is torch.Size([512]). size mismatch for module.layer2.0.downsample.1.running_var: copying a param with shape torch.Size([128]) from checkpoint, the shape in current model is torch.Size([512]). size mismatch for module.layer2.1.conv1.weight: copying a param with shape torch.Size([128, 128, 3, 3]) from checkpoint, the shape in current model is torch.Size([128, 512, 1, 1]). size mismatch for module.layer2.2.conv1.weight: copying a param with shape torch.Size([128, 128, 3, 3]) from checkpoint, the shape in current model is torch.Size([128, 512, 1, 1]). size mismatch for module.layer2.3.conv1.weight: copying a param with shape torch.Size([128, 128, 3, 3]) from checkpoint, the shape in current model is torch.Size([128, 512, 1, 1]). size mismatch for module.layer3.0.conv1.weight: copying a param with shape torch.Size([256, 128, 3, 3]) from checkpoint, the shape in current model is torch.Size([256, 512, 1, 1]). size mismatch for module.layer3.0.downsample.0.weight: copying a param with shape torch.Size([256, 128, 1, 1]) from checkpoint, the shape in current model is torch.Size([1024, 512, 1, 1]). size mismatch for module.layer3.0.downsample.1.weight: copying a param with shape torch.Size([256]) from checkpoint, the shape in current model is torch.Size([1024]). size mismatch for module.layer3.0.downsample.1.bias: copying a param with shape torch.Size([256]) from checkpoint, the shape in current model is torch.Size([1024]). size mismatch for module.layer3.0.downsample.1.running_mean: copying a param with shape torch.Size([256]) from checkpoint, the shape in current model is torch.Size([1024]). size mismatch for module.layer3.0.downsample.1.running_var: copying a param with shape torch.Size([256]) from checkpoint, the shape in current model is torch.Size([1024]). size mismatch for module.layer3.1.conv1.weight: copying a param with shape torch.Size([256, 256, 3, 3]) from checkpoint, the shape in current model is torch.Size([256, 1024, 1, 1]). size mismatch for module.layer3.2.conv1.weight: copying a param with shape torch.Size([256, 256, 3, 3]) from checkpoint, the shape in current model is torch.Size([256, 1024, 1, 1]). size mismatch for module.layer3.3.conv1.weight: copying a param with shape torch.Size([256, 256, 3, 3]) from checkpoint, the shape in current model is torch.Size([256, 1024, 1, 1]). size mismatch for module.layer3.4.conv1.weight: copying a param with shape torch.Size([256, 256, 3, 3]) from checkpoint, the shape in current model is torch.Size([256, 1024, 1, 1]). size mismatch for module.layer3.5.conv1.weight: copying a param with shape torch.Size([256, 256, 3, 3]) from checkpoint, the shape in current model is torch.Size([256, 1024, 1, 1]). size mismatch for module.layer4.0.conv1.weight: copying a param with shape torch.Size([512, 256, 3, 3]) from checkpoint, the shape in current model is torch.Size([512, 1024, 1, 1]). size mismatch for module.layer4.0.downsample.0.weight: copying a param with shape torch.Size([512, 256, 1, 1]) from checkpoint, the shape in current model is torch.Size([2048, 1024, 1, 1]). size mismatch for module.layer4.0.downsample.1.weight: copying a param with shape torch.Size([512]) from checkpoint, the shape in current model is torch.Size([2048]). size mismatch for module.layer4.0.downsample.1.bias: copying a param with shape torch.Size([512]) from checkpoint, the shape in current model is torch.Size([2048]). size mismatch for module.layer4.0.downsample.1.running_mean: copying a param with shape torch.Size([512]) from checkpoint, the shape in current model is torch.Size([2048]). size mismatch for module.layer4.0.downsample.1.running_var: copying a param with shape torch.Size([512]) from checkpoint, the shape in current model is torch.Size([2048]). size mismatch for module.layer4.1.conv1.weight: copying a param with shape torch.Size([512, 512, 3, 3]) from checkpoint, the shape in current model is torch.Size([512, 2048, 1, 1]). size mismatch for module.layer4.2.conv1.weight: copying a param with shape torch.Size([512, 512, 3, 3]) from checkpoint, the shape in current model is torch.Size([512, 2048, 1, 1]). size mismatch for module.deconv_layers.0.weight: copying a param with shape torch.Size([512, 256, 4, 4]) from checkpoint, the shape in current model is torch.Size([2048, 256, 4, 4]).

Did you compute the PCK by centering the human structure to the root ?

Hi,

I have a few things to be confirmed after reading your code.
1 Did you compute the PCK by centering the human structure to the root joint (the hip) ?
2 It seems that you transform the 3d pose in camera coordiante system to the world coordinate system, is the world coordinate system actually one of the cameras' coordiante system or the world coordiante system accroding to the extrinsic matrix given by the dataset ?

Thank you

Test my own picture

Thanks for your work!
I have tried your demo.ipynb file. It works well when I use pictures from H36M. Speed and accuracy are both perfect. However, I get wrong result if I use my own picture. I think the picture needs some modification before testing. Can you tell me the requirement of the picture? My wrong result as follow.
404

A question about self-supervision

Maybe just run python file train.py(python scripts/train.py --cfg experiments/h36m/train-ss.yaml) is wrong, because I did not find the dataloader use the function self_supervision in img_utils.py.
So how to fix it? Thank you!

About camera parameters

Hi mkocabas,

Camera intrinsic and extrinsic are saved in train-xx.pkl files, but could you tell me how do you get those parameters from human3.6m dataset? Thanks:)

About the triangulation algorithm

Hi, @mkocabas Thanks for sharing your wonderful project! I have a question about triangulation. To my knowledge, both the camera rotation and translation parameters are needed to use the polynomial triangulation algorithm. But it seems your paper did not tell how to derive the camera translation parameters, and your codes do not show how to call the function polynomial_triangulation. Can you share some experience or supplement some demo of calling polynomial_triangulation? Thx a lot!

can not get the right world coor

image
I used cameras.py to convert coordinations.
I convert a 2dpoint to camera coordination in camera 0 and 1, and the result camera coordinations are right as annotation describe.But when I convert them to world coordination, those two coordinations are not the same. Have I did something wrong?

Fail to read data

Some pictures can't read.
OSError:Fail to read data/h36m/images/S9/Directions_1.54138969/000065.jpg
And I don't have the picturest that numbered 65.
the numbers of the picture is 1,6,11,16,21,26...

Question about live cameras

Hi, thanks for such a great work. I've a question. In your code is it possible that we can use more than one live cameras to estimate human pose? You used H36M dataset which is also based on mutli-views so I'm thinking about it.

Which file showing the trangulation from 2D skeletion points?

Thanks for opening source codes. However, in the self-supervise setting, I could not find the codes using the model to predict 2D pose and subsequently triangulating 3D joints as the label, so I wonder if you perform the triangulations offline?

And what the parameter cfg.DATASET.TRI means, dose it means using triangulation or not? if so, why it is set false in 'train-ss.yml'?

Looking forward to your reply, thanks.

Ubuntu 18

Does it work on ubuntu 18? I have a problem with ubuntu 16 on my laptop.

PSS code release

Thanks for your excellent work! Can you release the PSS code?

human3.6 annotation

hi,
Thanks for your works!

Could you be kind to tell me what's the difference of train-fs.pkl and train-ss.pkl ?

error on human3.6m annotation files

Hello, Thanks for your great work.
I am trying to train human3.6m dataset with your code. I have downloaded the human 3.6m dataset from the website and use your provided script to extract images.But when I train the model, I find the image path in the annotation file(both train-fs.pkl and train-ss.pkl) doesn't match my image path.
For example:
the image path in the annotation file is: 'h36m/images/S1/Photo_1.58860488/000781.jpg'
However, I can only find the path 'h36m/images/S1/TakingPhoto_1.58860488/000781.jpg' ,which is the most similar one to the given path.
I wonder whether you make some changes to the image path when generating annotation files, or can you provide the annotation preparation script?
Thank you very much!

want to change the architecture to actual integral pose repos

Hello, I want to load the weights trained by integral human pose repository, on the repository you based your work on . but i will have to change the network configuration to do that. can you guide me how to change your configuration to that of the original repository?

Result of pretrained models on MPII

Hi,

Thank you for providing such a great code! I have some questions in the pretrained models on MPII.

I just did a simple verification of the accuracy of pretrained models on MPII (i.e. mpii_integral.pth.tar), and the mAP is 67.3 which is far worse than the claimed 88.5 mAP. I attached the validation config I used for testing the model (I changed the postfix to .txt so that I can upload it to github; the content is the same as a .yaml file)
valid.txt

Can you help me figuring out where I did wrong? I am using python3.7+pytorch1.0+Ubuntu18, so I don't think it's a cudnn issue.

thank you very much!

error login

dear @mkocabas,
can you send me the result of below?
" You would need Human3.6M data to train or test our model. For Human3.6M data, please download from Human 3.6 M dataset. You would need to create an account to get download permission. After downloading video files, you can run our script to extract images. Then run ln -s <path_to_extracted_h36m_images> ${ROOT}/data/h36m/images to create a soft link to images folder. Currently you can use annotation files we provided in step 4, however we will release the annotation preparation script soon after cleaning and proper testing."

error

code-
model = models.pose3d_resnet.get_pose_net(config, is_train=False)
gpus = [int(i) for i in config.GPUS.split(',')]
model = torch.nn.DataParallel(model, device_ids=gpus).cuda()
print('Created model...')

checkpoint = torch.load(config.MODEL.RESUME)
model.load_state_dict(checkpoint)
model.eval()
print('Loaded pretrained weights...')

error-
checkpoint = torch.load(config.MODEL.RESUME)
FileNotFoundError: [Errno 2] No such file or directory: 'models/h36m/fully_supervised.pth.tar'

what should i do plz help me.

training time

In order to confirm whether the hardware conditions of my laboratory are sufficient, I would like to ask how long does it take to complete the training of the network, how many gpus have been used, and what is the configuration of the GPU.

unable to understand the structure of project

Hi, mkocabas!
I can't understand the structure of project. I mean i am not getting that which folder contains which codes? . Like...which folder contains code of 3D pose estimator(integral pose)?,which folder contains code of 2D pose estimator(integral pose)?,and in which folder you are using their output to compute loss...likewise.
Over all, Can you please give brief ideas about which file(.py) is performing what?
That would be very much helpful..
Thank you very much !!.

Human3.6M data,

dear,
I can not take that data. Can you send me that data?

Error CUDA out of memory

dear,
When I run python scripts/train.py --cfg experiments/mpii/train.yaml, I met the error like below:

RuntimeError: CUDA out of memory. Tried to allocate 512.00 MiB (GPU 0; 7.93 GiB total capacity; 6.19 GiB already allocated; 340.00 MiB free; 551.04 MiB cached)

Note:
my PC is Hp Z440: Xeon E51650v3, 32G ddr4, GTX1070

test picture after training

dear,
I mean that testing my picture after training but demo.ipynb is run before training.
thank you so much.

whether to use camera information in fully-supervise training

Can you use camera information like intrinsic parameters in fully supervised training, it seems that you do not use any camera information.

However, you say you use GT intrinsinc camera paremeters in fc-train, i do not found any camera parameters can be used in either training process or valid process.

Btw, i found there is no different between integral loss and fc-train in this paper. Am i right?

Training data for 2D pose estimation

Hi Muhammad,

Do you fine-tune your 2D pose estimation model on Human3.6M? Or just use a model pre-trained on MPII and keep it fixed?

Thanks,
Umar

something wrong in h36m_extract_frames_from_videos.py

h36m_extract_frames_from_videos.py failed to extract images.
The error is: Could not open file : /data/dataset/h36m_extract/Images/S1/Smoking.55011271/000001.jpg
av_interleaved_write_frame(): Input/output error

mpii_heatmap.pth.tar model problem

Hi,

I use your pretrained model mpii_heatmap.pth.tar for testing on MPII dataset.
I obtain a very low ap of 5.7 rather than 88.5 as your report.

What's the meaning of " R of the first camera is identity"?

Hi, mkocabas!
I read your paper recently, and I have some questions that why "We assume the first camera as the center of the coordinate system, which means R of the first camera is identity." I have some doubts about this word "identity", does it means "constant"? If not, can you explain it?
Thank you very much!

annotation file has problems

I used pickle to load the '.pkl' file,but occurred a problem called ''ModuleNotFoundError: No module named 'lib''. If I create a '.pkl' file, I could load this file successfully.So I think the annotation file downloaded has some problems.

Training on H36M

Thanks for your work and the data preparation. Very thanks.

Now, I am re-training your Fully Supervised + resnet50 on H36M, with pre-trained weight (MPII Integral | resnet50 | 88.5 ), using the following codes:
python scripts/train.py --cfg experiments/h36m/train.yaml

Here, I have some questions.
The first one is what is the meaning of 'OCCLUSION' in train.yaml. The original one is 'True'. But I can not train successfully. Thus, I change it to 'false', owing to the lack of related files. Could you tell its effect and whether use it in your provided model? In addition, would you update the related files?

The second one is the poor evaluation result on the validation set. At the first epoch, the value of Validation-hm36_17j is 77.43, 83.9 89.3 (I trained this model three times). At the fifth epoch, the value of that increases to 392.8, 349.4, 287.1. I want to know whether it is normal? Maybe I should wait a long time. Or there is something wrong about it? Just like the turn-off of OCCLUSION?

Thanks very much! :)

what is 'data/VOC2012/Annotations'?

i can see this error FileNotFoundError: [Errno 2] No such file or directory: 'data/VOC2012/Annotations'
and i know experiments/h36m/train-ss.yaml have Dataset: Voc : 'data/VOC2012'
then what should i need in data/VOC2012 folder?

Can not get 51.8mm MPJPE when retrain a model on Human3.6M in fully supersived setting

Hi, thank you for sharing the codes!
I retrained the model in fully supervised setting and got 54.6, 54.9, 55.3, 56.2(hm36_17j). And I valid the best model you provided and got 52.9 which should be 51.8.
Could you help me find out where the problem is? Here is my configuration:
Python 3.7.1
Pytorch 1.3.1
Cuda 10.0.130

Besides, I found some annotation error in S9_SittingDown_15011271, S9_SittingDown_158860488, S9_SittingDown_160457274, 75 images in all. I do not go over all the images, so I do not know if there are other wrong annotations. I think that maybe a reason for the lower performance.

[ Evaluation: PSS Score and Clustering]

Hi,

Wonderful work and thanks for sharing the code.

I'm wondering if you have released the implementation of Pose Structure Score PSS and the evaluation script used to calculate scores for different values of K (clustering), because I did not find it in the repo.

It will be very nice if you can share it with us.

Thanks !

Scale of the person

Great work Muhammed!!
I just wanted to know about the kind of ground-truth information that is being used during inference. I can see that the ground-truth depth of the root keypoint is used during back-projection, but what about the scale? In the paper, you have mentioned that the "model uses normalized poses as ground truth" for training, how do you recover the scale during inference?
Thanks!

joints-alignment between MPII and H36M (thorax)

Hi mkocabas,

I found you pre-processing code not aligning the same way as in integral pose https://github.com/mks0601/Integral-Human-Pose-Regression-for-3D-Human-Pose-Estimation/blob/master/data/Human36M/Human36M.py#L54

They are trying to get the thorax from left shoulder and right shoulder.
However, in your case, https://github.com/mkocabas/EpipolarPose/blob/master/lib/dataset/JointIntegralDataset.py, you directly have thorax in your H36M set.

May I ask you preprocess in advance or just treat the thorax as Spine1(which is most near thorax) in H36M? Otherwise have you notice any big difference using different thorax handle strategy?

Best,
Zhe

how to run using CPU not GPUs

I followed the readme to config the environment. When I tried to run the demo.ipynb, I encounted the following errors. It seems that the demo runs using GPUs only. However, I have no access to GPU right now. How can I run the demo using CPU instead of GPUs.

`---------------------------------------------------------------------------
AssertionError Traceback (most recent call last)
in
1 model = models.pose3d_resnet.get_pose_net(config, is_train=False)
2 gpus = [int(i) for i in config.GPUS.split(',')]
----> 3 model = torch.nn.DataParallel(model, device_ids=gpus).cuda()
4 print('Created model...')
5

~/.local/lib/python3.5/site-packages/torch/nn/modules/module.py in cuda(self, device)
263 Module: self
264 """
--> 265 return self._apply(lambda t: t.cuda(device))
266
267 def cpu(self):

~/.local/lib/python3.5/site-packages/torch/nn/modules/module.py in _apply(self, fn)
191 def _apply(self, fn):
192 for module in self.children():
--> 193 module._apply(fn)
194
195 for param in self._parameters.values():

~/.local/lib/python3.5/site-packages/torch/nn/modules/module.py in _apply(self, fn)
191 def _apply(self, fn):
192 for module in self.children():
--> 193 module._apply(fn)
194
195 for param in self._parameters.values():

~/.local/lib/python3.5/site-packages/torch/nn/modules/module.py in _apply(self, fn)
197 # Tensors stored in modules are graph leaves, and we don't
198 # want to create copy nodes, so we have to unpack the data.
--> 199 param.data = fn(param.data)
200 if param._grad is not None:
201 param._grad.data = fn(param._grad.data)

~/.local/lib/python3.5/site-packages/torch/nn/modules/module.py in (t)
263 Module: self
264 """
--> 265 return self._apply(lambda t: t.cuda(device))
266
267 def cpu(self):

~/.local/lib/python3.5/site-packages/torch/cuda/init.py in _lazy_init()
160 raise RuntimeError(
161 "Cannot re-initialize CUDA in forked subprocess. " + msg)
--> 162 _check_driver()
163 torch._C._cuda_init()
164 _cudart = _load_cudart()

~/.local/lib/python3.5/site-packages/torch/cuda/init.py in _check_driver()
80 Found no NVIDIA driver on your system. Please check that you
81 have an NVIDIA GPU and installed a driver from
---> 82 http://www.nvidia.com/Download/index.aspx""")
83 else:
84 # TODO: directly link to the alternative bin that needs install

AssertionError:
Found no NVIDIA driver on your system. Please check that you
have an NVIDIA GPU and installed a driver from
http://www.nvidia.com/Download/index.aspx`

demo.py error

When I run demo.py , the error happened.

Traceback (most recent call last):
File "C:/Users/123/Desktop/EpipolarPose-master/EpipolarPose-master/demo.py", line 62, in
ax = fig.add_subplot('122', projection='3d', aspect=1)
File "F:\ana\lib\site-packages\matplotlib\figure.py", line 1414, in add_subplot
a = subplot_class_factory(projection_class)(self, *args, **kwargs)
File "F:\ana\lib\site-packages\matplotlib\axes_subplots.py", line 69, in init
self._axes_class.init(self, fig, self.figbox, **kwargs)
File "F:\ana\lib\site-packages\mpl_toolkits\mplot3d\axes3d.py", line 101, in init
super().init(fig, rect, frameon=True, *args, **kwargs)
File "F:\ana\lib\site-packages\matplotlib\axes_base.py", line 509, in init
self.update(kwargs)
File "F:\ana\lib\site-packages\matplotlib\artist.py", line 974, in update
ret = [_update_property(self, k, v) for k, v in props.items()]
File "F:\ana\lib\site-packages\matplotlib\artist.py", line 974, in
ret = [_update_property(self, k, v) for k, v in props.items()]
File "F:\ana\lib\site-packages\matplotlib\artist.py", line 971, in _update_property
return func(v)
File "F:\ana\lib\site-packages\matplotlib\axes_base.py", line 1281, in set_aspect
'It is not currently possible to manually set the aspect '
NotImplementedError: It is not currently possible to manually set the aspect on 3D axes

multi gpu imbalance

When i use four gpu to train this model, one the first gpu, Memory Usage is about 10761MB/12196M, while the other GPU all 3651M/12196M, which waste too much memory usage. Why do not you use GPU balance function (like DataParallelModel in Integral LOSS)? or can you account for the same situation?

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.