HybridPose: 6D Object Pose Estimation under Hybrid Representation (CVPR 2020)

HybridPose: 6D Object Pose Estimation under Hybrid Representations

This repository contains authors' implementation of HybridPose: 6D Object Pose Estimation under Hybrid Representations. Our implementation is based on PVNet. We warmly welcome any discussions related to our implementation and our paper. Please feel free to open an issue.

News (October 16, 2020): We have updated our experiments using the conventional data split on Linemod/Occlusion Linemod. Following baseline works, we use around 15% of Linemod examples for training. The rest of Linemod examples, as well as the entire Occlusion Linemod dataset, are used for testing. Both this GitHub repository and the arXiv paper are updated. HybridPose achieves an ADD(-S) score of 0.9125577238 on Linemod, and 0.4754330537 on Occlusion Linemod. We sincerely appreciate the readers who pointed out this issue to us, including but not limited to Shun Iwase and hiyyg.

Introduction

HybridPose consists of intermediate representation prediction networks and a pose regression module. The prediction networks take an image as input, and output predicted keypoints, edge vectors, and symmetry correspondences. The pose regression module consists of a initialization sub-module and a refinement sub-module. The initialization sub-module solves a linear system with predicted intermediate representations to obtain an initial pose. The refinement sub-module utilizes GM robust norm to obtain the final pose prediction. Approach overview

Download

git clone --recurse-submodules [email protected]:chensong1995/HybridPose.git

Environment set-up

Please install Anaconda first and execute the following commands:

conda create -y --name hybridpose python==3.7.4
conda install -y -q --name hybridpose -c pytorch -c anaconda -c conda-forge -c pypi --file requirements.txt
conda activate hybridpose

Compile the Ransac Voting Layer

The Ransac Voting Layer is used to generate keypoint coordinates from vector fields. Please execute the following commands (copied from PVNet):

cd lib/ransac_voting_gpu_layer
python setup.py build_ext --inplace

Compile the pose regressor

The pose regressor is written in C++ and has a Python wrapper. Please execute the following commands:

cd lib/regressor
make

Dataset set-up

We experimented HybridPose on Linemod and Occlusion Linemod. Let us first download the original datasets using the following commands:

python data/download_linemod.py
python data/download_occlusion.py

Let us then download our augumented labels to these two datasets. Our augumented labels include:

  • Keypoints: both 2D and 3D coordinates. These labels are generated using FSP.
  • Symmetry: Symmetry correspondences in 2D and the normal of symmetry plane in 3D. These labels are generated using SymSeg.
  • Segmentation masks: On Linemod, we create segmentation masks by projecting 3D models.

They are uploaded here:

The following commands unzip these labels to the correct directory:

unzip data/temp/linemod_labels.zip -d data/linemod
unzip data/temp/occlusion_labels.zip -d data/occlusion_linemod

We also use the synthetic data from PVNet. Please generate blender rendering and fuse data using their code. After data generation, please place blender data in data/blender_linemod, and fuse data in data/fuse_linemod. The directory structure should look like this:

data
  |-- blender_linemod
  |         |---------- ape
  |         |---------- benchviseblue
  |         |---------- cam
  |         |---------- ... (other objects)
  |-- fuse_linemod
  |         |---------- fuse
  |         |            |---------- 0_info.pkl
  |         |            |---------- 0_mask.png
  |         |            |---------- 0_rgb.jpg
  |         |            |---------- 1_info.pkl
  |         |            |---------- 1_mask.png
  |         |            |---------- 1_rgb.jpg
  |         |            |---------- ... (other examples)

After that, please use data/label.py and data/label_fuse.py to create intermediate representation labels blender and fuse data, respectively.

mv data/label.py data/blender_linemod/label.py
cd data/blender_linemod
python label.py
mv data/label_fuse.py data/fuse_linemod/label_fuse.py
cd data/fuse_linemod
python label_fuse.py

One of the arguments taken by the labeling scripts is --pvnet_linemod_path. This is the data directory used by PVNet render. The structure of this directory looks like this:

pvnet_lindmod
 |-- ape
 |    |--- amodal_mask
 |    |--- contours
 |    |--- JPEGImages
 |    |--- labels
 |    |--- labels_occlusion
 |    |--- mask
 |    |--- nosiy_contours
 |    |--- pose
 |    |--- ape.ply
 |    |--- ... (several other .txt and .pkl files)
 |-- benchviseblue
 |    |--- ...
 |-- cam
 |    |--- ...
 |-- ... (other objects)

Training

Please set the arguments in src/train_core.py execute the following command (note that we need to set LD_LIBRARY_PATH for the pose regressor):

# on bash shell
LD_LIBRARY_PATH=lib/regressor:$LD_LIBRARY_PATH python src/train_core.py
# on fish shell
env LD_LIBRARY_PATH="lib/regressor:$LD_LIBRARY_PATH" python src/train_core.py

If you use a different shell other than bash and fish, prepend "lib/regressor" to LD_LIBRARY_PATH and run python src/train_core.py.

Pre-trained weights

You can download our pre-trained weights below. We use train one set of weights on Linemod, and test on both Linemod and Occlusion Linemod:

We have configured random seeds in src/train_core.py and expect you to re-produce identical weights by running our training script. It turns out that completely reproducible results are not guaranteed across PyTorch releases, individual commits or different platforms. Furthermore, results need not be reproducible between CPU and GPU executions, even when using identical seeds. Also, the randomness in the PVNet synthetic data generation will create some difference in training outcome. Our training uses two graphics cards with a batch size of 10.

After you download the pre-trained weights, unzip them somewhere and configure --load_dir in src/train_core.py to the unzipped weights (e.g. saved_weights/linemod/ape/checkpoints/0.001/199).

Running src/train_core.py now will save both ground truth and predicted poses to a directory called output.

Evaluation

To evaluate ADD(-S) accuracy of predicted poses, please set the arguments in src/evaluate.py and run

python src/evaluate.py

Citation

If you find our work useful in your research, please kindly make a citation using:

@misc{song2020hybridpose,
    title={HybridPose: 6D Object Pose Estimation under Hybrid Representations},
    author={Chen Song and Jiaru Song and Qixing Huang},
    year={2020},
    eprint={2001.01869},
    archivePrefix={arXiv},
    primaryClass={cs.CV}
}
Owner
SONG, Chen
Ph.D. Student at the University of Texas at Austin.
SONG, Chen
Comments
  • Question: Difficulties when creating the symmetries using SymSeg

    Question: Difficulties when creating the symmetries using SymSeg

    Hello,

    First of all, thank you for your great work. We are writing to you and not the original author of SymSeg since you have recently used the library successfully.

    We are trying to generate ground truth labels for synthetic data but have run into some issues when using SymSeg to generate the symmetry correspondences. In particular, objects which are clearly symmetric across some planes do not have any symmetries detected, perhaps due to the downsampling of the cloud?

    Did you have to modify or tweak any of the code/config parameters before computing the symmetries to make it work?

    Furthermore, we also get segmentation faults (bad alloc) when trying to run any of the actual symmetry segmentation scripts (only symmetry detection works). Do you recall which versions of the dependencies of SymSeg you used?

    Thank you

  • ValueError: Caught ValueError in DataLoader worker process 0.

    ValueError: Caught ValueError in DataLoader worker process 0.

    你好; 我在运行train_core.py时报错; /home/jzy/anaconda3/envs/HybridPose-master/bin/python /home/jzy/桌面/jzy/HybridPose-master/src/train_core.py number of model parameters: 12959563 Traceback (most recent call last): File "/home/jzy/桌面/jzy/HybridPose-master/src/train_core.py", line 125, in trainer.train(epoch) File "/home/jzy/桌面/jzy/HybridPose-master/trainers/coretrainer.py", line 37, in train for i_batch, batch in enumerate(self.train_loader): File "/home/jzy/anaconda3/envs/HybridPose-master/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 819, in next return self._process_data(data) File "/home/jzy/anaconda3/envs/HybridPose-master/lib/python3.7/site-packages/torch/utils/data/dataloader.py", line 846, in _process_data data.reraise() File "/home/jzy/anaconda3/envs/HybridPose-master/lib/python3.7/site-packages/torch/_utils.py", line 369, in reraise raise self.exc_type(msg) ValueError: Caught ValueError in DataLoader worker process 0. 请问;是需要将parser.add_argument('--load_dir', type=str, default=None)中的‘None’换成自己的路径么,如果是的话,要换成的是什么呢?

  • Loading Pre - trained model without CUDA enabled?

    Loading Pre - trained model without CUDA enabled?

    Hey, I am the very last step at src/train_core.py but I am running into the error below:

    -> print('Could not restore session properly, check the load_dir') (Pdb)

    Traceback (most recent call last): File "/home/ubuntu/HybridPose/lib/utils.py", line 25, in load_session model.load_state_dict(torch.load(os.path.join(args.load_dir, 'model.pth')))

    File "/home/ubuntu/anaconda3/envs/hybridpose/lib/python3.7/site-packages/torch/serialization.py", line 79, in validate_cuda_device raise RuntimeError('Attempting to deserialize object on a CUDA ' RuntimeError: Attempting to deserialize object on a CUDA device but torch.cuda.is_available() is False. If you are running on a CPU-only machine, please use torch.load with map_location=torch.device('cpu') to map your storages to the CPU.

    Can I load the model without CUDA being enabled? I am running it on an Ubuntu machine, deep learning instance, from aws currently where I have not set up CUDA.

  • About linemod model and occlusion linemod model

    About linemod model and occlusion linemod model

    Hello

    I'm going to use the "label.py' code you provided, you used the cat/005.xyz model for the occlusion linemod dataset. Can you tell me which model you used for linemod dataset? Did you run the symseg code using [linemod/original/dataset/cat/cat.ply] model?

    Also, I would appreciate it if you could share the "label.py" code written by linemod dataset.

  • Experiments on the Truncation LineMOD

    Experiments on the Truncation LineMOD

    Hi, I try to test your provided pre-trained models on the Truncation LineMOD which is introduced in the PVNet. But the evaluation result is always 0.0. I hope your explaination sincerely! The size of the input image is 256*256 which is cropped from the LineMOD dataset, so I only change the camera intrinsic parameter in generate_data function.

  • OS.Error

    OS.Error

    HI, I am very interested in your work and trying to play with the code. However, I encounter an error when I was trying to run the train_core.py. Would you like to take a look?

    Traceback (most recent call last):
      File "src/train_core.py", line 105, in <module>
        trainer.generate_data()
      File "/home/robot/HybridPose/trainers/coretrainer.py", line 558, in generate_data
        regressor = load_wrapper()
      File "/home/robot/HybridPose/lib/regressor/regressor.py", line 13, in load_wrapper
        regressor = CDLL('wrapper.so')
      File "/home/robot/anaconda3/envs/hybridpose/lib/python3.7/ctypes/__init__.py", line 364, in __init__
        self._handle = _dlopen(self._name, mode)
    OSError: wrapper.so: cannot open shared object file: No such file or directory
    
    
  • About code for creating dataset format

    About code for creating dataset format

    Thank you for sharing your research. I want to use T-less datasets. http://cmp.felk.cvut.cz/t-less/

    I have some difficulties trying to fit your data-format.

    Q1. How do you create a "cor{}.npy" file in "correspondences" folder? Is it created by running the project? (https://github.com/aecins/symseg) https://github.com/chensong1995/HybridPose/blob/master/lib/datasets/linemod.py#L211

    Q2. What do the point and normal values of the "symmetries.txt" file in the "symmetries" folder mean and how do you create it? https://github.com/chensong1995/HybridPose/blob/master/lib/datasets/linemod.py#L212

    Q3. Are pts2d and pts3d the same as FPS_2d and FPS_3d provided by pvnet? https://github.com/chensong1995/HybridPose/blob/master/lib/datasets/linemod.py#L206

    pvnet fps_3d and fps_2d: https://github.com/zju3dv/clean-pvnet/blob/master/lib/datasets/linemod/linemod_to_coco.py#L270

    Q4. Is the unit of translation in meters?

    Thank you in advance for your reply.

    If you have a code that makes datasets-format, please share it with us.

    Regards

    David

  • Questions about the training and evaluation procedure.

    Questions about the training and evaluation procedure.

    Hi Chen, thanks for sharing the work. I have some questions while reading your code:

    1. I download the augmented labels and see the valid poses you provided. The number of the valid poses is a lot less than the number of gt poses (1214) provided by the original Occlusion LineMOD. I wonder how you got these valid poses and why you use these valid poses for evaluation instead of the gt poses provided by the original Occlusion LineMOD?

    2. In setup_loaders(), I see you randomly select 80% of data in Occlusion LineMOD as the training set and the other 20% as the test set. In generate_data() you search for parameters with the first 20 samples of the test set and evaluate with the remaining samples in the test set. Am I right? Please correct me if my understanding is wrong.

    I will be looking forward to your reply.

  • Problem with python src/train_core.py

    Problem with python src/train_core.py

    Hello, When I run with python src/train_core.py I got the error below.

    number of model parameters: 12959563 data/blender_linemod/ape/787.jpg data/blender_linemod/ape/7168.jpg data/blender_linemod/ape/8605.jpg data/blender_linemod/ape/8994.jpg data/blender_linemod/ape/5662.jpg data/blender_linemod/ape/6565.jpg data/blender_linemod/ape/9001.jpg data/blender_linemod/ape/9097.jpg data/blender_linemod/ape/2749.jpg data/blender_linemod/ape/8949.jpg data/blender_linemod/ape/6457.jpg data/blender_linemod/ape/1797.jpg data/blender_linemod/ape/6732.jpg data/blender_linemod/ape/955.jpg data/blender_linemod/ape/3238.jpg data/blender_linemod/ape/2563.jpg data/blender_linemod/ape/997.jpg data/blender_linemod/ape/41.jpg data/blender_linemod/ape/6435.jpg data/blender_linemod/ape/5518.jpg data/blender_linemod/ape/1298.jpg data/blender_linemod/ape/9021.jpg data/blender_linemod/ape/3292.jpg data/blender_linemod/ape/353.jpg data/blender_linemod/ape/839.jpg data/blender_linemod/ape/3755.jpg data/blender_linemod/ape/2756.jpg data/blender_linemod/ape/8147.jpg data/blender_linemod/ape/985.jpg data/blender_linemod/ape/9282.jpg data/blender_linemod/ape/6085.jpg data/blender_linemod/ape/9571.jpg data/blender_linemod/ape/6201.jpg data/blender_linemod/ape/3131.jpg data/blender_linemod/ape/454.jpg data/blender_linemod/ape/6672.jpg data/blender_linemod/ape/974.jpg data/blender_linemod/ape/8552.jpg data/blender_linemod/ape/4162.jpg data/blender_linemod/ape/7323.jpg data/blender_linemod/ape/8106.jpg data/blender_linemod/ape/1371.jpg data/blender_linemod/ape/2015.jpg data/blender_linemod/ape/1836.jpg data/blender_linemod/ape/1304.jpg data/blender_linemod/ape/4561.jpg data/blender_linemod/ape/8710.jpg data/blender_linemod/ape/8001.jpg data/blender_linemod/ape/3660.jpg data/blender_linemod/ape/848.jpg data/blender_linemod/ape/2591.jpg data/blender_linemod/ape/9352.jpg data/blender_linemod/ape/2967.jpg data/blender_linemod/ape/8960.jpg data/blender_linemod/ape/1250.jpg data/blender_linemod/ape/7439.jpg data/blender_linemod/ape/7096.jpg data/blender_linemod/ape/4884.jpg data/blender_linemod/ape/9769.jpg data/blender_linemod/ape/6265.jpg data/blender_linemod/ape/3907.jpg data/blender_linemod/ape/9357.jpg data/blender_linemod/ape/5254.jpg data/blender_linemod/ape/5369.jpg data/blender_linemod/ape/657.jpg data/blender_linemod/ape/3719.jpg data/blender_linemod/ape/9614.jpg data/blender_linemod/ape/7295.jpg data/blender_linemod/ape/4136.jpg data/blender_linemod/ape/3505.jpg data/blender_linemod/ape/4203.jpg data/blender_linemod/ape/8658.jpg data/blender_linemod/ape/6839.jpg data/blender_linemod/ape/9246.jpg data/blender_linemod/ape/4042.jpg data/blender_linemod/ape/8570.jpg data/blender_linemod/ape/3492.jpg data/blender_linemod/ape/8141.jpg data/blender_linemod/ape/4222.jpg data/blender_linemod/ape/473.jpg data/blender_linemod/ape/9366.jpg Traceback (most recent call last): File "src/train_core.py", line 106, in trainer.train(epoch) File "./trainers/coretrainer.py", line 45, in train self.model(batch['image'], batch['sym_cor'], batch['mask'], batch['pts2d_map'], batch['graph']) File "/home/asd/anaconda3/envs/hybridpose1/lib/python3.7/site-packages/torch/nn/modules/module.py", line 547, in call result = self.forward(*input, **kwargs) File "/home/asd/anaconda3/envs/hybridpose1/lib/python3.7/site-packages/torch/nn/parallel/data_parallel.py", line 150, in forward return self.module(*inputs[0], **kwargs[0]) File "/home/asd/anaconda3/envs/hybridpose1/lib/python3.7/site-packages/torch/nn/modules/module.py", line 547, in call result = self.forward(*input, **kwargs) File "/home/asd/4Tdata/HybridPose/lib/model_repository.py", line 80, in forward x2s, x4s, x8s, x16s, x32s, xfc = self.resnet18_8s(image) File "/home/asd/anaconda3/envs/hybridpose1/lib/python3.7/site-packages/torch/nn/modules/module.py", line 547, in call result = self.forward(*input, **kwargs) File "/home/asd/4Tdata/HybridPose/lib/resnet.py", line 201, in forward x = self.bn1(x) File "/home/asd/anaconda3/envs/hybridpose1/lib/python3.7/site-packages/torch/nn/modules/module.py", line 547, in call result = self.forward(*input, **kwargs) File "/home/asd/anaconda3/envs/hybridpose1/lib/python3.7/site-packages/torch/nn/modules/batchnorm.py", line 81, in forward exponential_average_factor, self.eps) File "/home/asd/anaconda3/envs/hybridpose1/lib/python3.7/site-packages/torch/nn/functional.py", line 1656, in batch_norm training, momentum, eps, torch.backends.cudnn.enabled RuntimeError: cuDNN error: CUDNN_STATUS_EXECUTION_FAILED

    Do you have any idea with it?

  • Possible to run on a Smartphone?

    Possible to run on a Smartphone?

    Hi, I was wondering if it might be possible to run your 6D Pose Estimator even on the limited hardware of a smartphone. Before diving too deep into it, I wanted to get the opinion of more experienced people in the field.

    If you think it is possible, is a rough estimation for fps possible (Lets assume it would run on an Adreno 650 mobile GPU)?

    If you think it is not possible could you briefly elaborate on the reasons.

    Any insights are appreciated. Thank you very much!

  • Need Clarification - Generating symmetries.txt With symseg

    Need Clarification - Generating symmetries.txt With symseg

    According to Dataset set-up section in README.md, symmetry labels were generated using symseg. It is not clearly stated in README.md (😭), but specifically what needs to be done is the generation of symmetries.txt.

    If you follow the setup procedure in README.md, these symmetries.txt files are downloaded automatically when you execute:

    python data/download_linemod.py
    

    and can be found at data/linemod/symmetries/*/symmetries.txt.

    Since I'm making my own dataset with my own classes, I need to generate data/linemod/keypoints/*/keypoints_3d.npy and data/linemod/symmetries/*/symmetries.txt for each of my classes. I was able to generate keypoints_3d.npy using the method shown below:

    Show keypoints_3d.npy generation method

    Execute the following script in clean-pvnet's root directory:

    from argparse import ArgumentParser
    from lib.csrc.fps.fps_utils import farthest_point_sampling
    from lib.utils.linemod.opengl_renderer import OpenGLRenderer
    import numpy as np
    
    def parse_args():
        parser = ArgumentParser()
        # training
        parser.add_argument('--ply_path', type=str, required=True)
        parser.add_argument('--save_path', type=str, default='model_kpts3d.npy')
        parser.add_argument('--num_keypoints', type=int, default=8)
        args = parser.parse_args()
        return args
    
    args = parse_args()
    renderer = OpenGLRenderer(args.ply_path)
    sampled_kpts3d = farthest_point_sampling(pts=renderer.model['pts']/1000, sn=args.num_keypoints, init_center=True)
    np.save(args.save_path, sampled_kpts3d)
    

    Next I need to generate symmetries.txt, so I setup symseg and confirmed that the example provided is working correctly. However, I have no idea what to do from here. I was expecting to see some sort of API with options for creating a symmetries.txt dump file, but I can't seem to find that anywhere. (Is there even an API for this tool at all?)

    I need some clarification on how specifically the symmetries.txt files were created using symseg. Also, if no symmetries are found, does that mean it is impossible to correctly create labels for training the HybridPose model?

  • there is a problem here

    there is a problem here

    CUDA path has problems . (hybridpose) [email protected]:~/siw-demo/HybridPose/lib/ransac_voting_gpu_layer$ python setup.py build_ext --inplace running build_ext error: [Errno 2] No such file or directory: ':/usr/local/cuda-11.7/bin/nvcc': ':/usr/local/cuda-11.7/bin/nvcc'

  • wrong predicted symmetry and graph

    wrong predicted symmetry and graph

    Greetings,

    I runned recently the test part of the coretrainer.py with your pre-trained weights and I got wrong outputs for symmetry and graph compared to the outputs provided by you, as you can see in the attached files.

    Any idea why this is happening?

    your_output.zip network_output.zip

  • lib/datasets/blender_linemod.py Some question

    lib/datasets/blender_linemod.py Some question

    class BlenderLinemodDataset(Dataset): def init(self, base_dir='data/blender_linemod', linemod_base_dir='data/linemod', object_name='ape', size=10000, augment=True, occlude=True, split='train'): self.base_dir = base_dir self.object_name = object_name linemod_objects = ['ape', 'benchviseblue', 'cam', 'can', 'cat', 'driller', 'duck', 'eggbox', 'glue', 'holepuncher', 'iron', 'lamp', 'phone'] self.other_object_names = [] for object_name in linemod_objects: if object_name == self.object_name: continue self.other_object_names.append(object_name) # compute length data_dir = os.path.join(base_dir, self.object_name) self.length = len(list(filter(lambda x: x.endswith('jpg'), os.listdir(data_dir)))) self.size = size # pre-load data into memory label_dir = os.path.join(base_dir, '{}_labels'.format(self.object_name)) self.pts2d = np.float32(np.load(os.path.join(label_dir, 'keypoints_2d.npy'))) self.img_transform = transforms.Normalize(mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225]) self.augment = augment if augment: self.rot_ang_min = -30 self.rot_ang_max = 30 self.occlude = occlude self.split = split pts3d_name = os.path.join(linemod_base_dir, 'keypoints', object_name, 'keypoints_3d.npy') self.pts3d = np.float32(np.load(pts3d_name)) normal_name = os.path.join(linemod_base_dir, 'symmetries', object_name, 'symmetries.txt') self.normal = self.read_normal(normal_name) Hello, I want to confirm that this bold variable is right?

  • 关于PoseRegression::InitializePose

    关于PoseRegression::InitializePose

    你好,请教一下PoseRegression::InitializePose方面的问题。在pose_regression_init.cpp的GenerateDataMatrix函数中把kp.point2D_pred的反对称矩阵分别与x_3d, y_3d, z_3d相乘,这样做的意义是什么?我看论文里面也没找到相关的推到公式,希望能解答,感谢分享。

  • About the bop fomat dataset

    About the bop fomat dataset

    Hello Now I have synthesized my own BOP format dataset. You mentioned in your paper that you have trained datasets in BOP format, but the code does not seem to show it. So I would like to ask how to train and test the BOP format dataset.

    Looking forward to your reply. Thank you!

Pose-tensorflow - Human Pose estimation with TensorFlow framework
Pose-tensorflow -  Human Pose estimation with TensorFlow framework

Human Pose Estimation with TensorFlow Here you can find the implementation of the Human Body Pose Estimation algorithm, presented in the DeeperCut and

Dec 29, 2022
The official implementation of our CVPR 2021 paper - Hybrid Rotation Averaging: A Fast and Robust Rotation Averaging Approach

Graph Optimizer This repo contains the official implementation of our CVPR 2021 paper - Hybrid Rotation Averaging: A Fast and Robust Rotation Averagin

Dec 23, 2022
Official PyTorch Code of GrooMeD-NMS: Grouped Mathematically Differentiable NMS for Monocular 3D Object Detection (CVPR 2021)
Official PyTorch Code of GrooMeD-NMS: Grouped Mathematically Differentiable NMS for Monocular 3D Object Detection (CVPR 2021)

GrooMeD-NMS: Grouped Mathematically Differentiable NMS for Monocular 3D Object Detection GrooMeD-NMS: Grouped Mathematically Differentiable NMS for Mo

Jan 2, 2023
Fast and robust certifiable relative pose estimation

Fast and Robust Relative Pose Estimation for Calibrated Cameras This repository contains the code for the relative pose estimation between two central

Dec 6, 2022
Android hand detect and pose estimation by ncnn
Android hand detect and pose estimation by ncnn

ncnn_nanodet_hand 1.hand detect:用nanode-m训练了个hand detect模型, 2.hand pose:用CMU的数据集训练了个ghostnet作为backbone模仿pfld的handpose模型 3.推理:handpose.cpp单独检测pose,nano

Jan 3, 2023
Android MoveNet pose estimation by ncnn
Android MoveNet pose estimation by ncnn

ncnn_Android_MoveNet Android MoveNet single human pose estimation by ncnn this project is a ncnn Android demo for MoveNet, it depends on ncnn library

Dec 31, 2022
CUDA-accelerated Apriltag detection and pose estimation.
CUDA-accelerated Apriltag detection and pose estimation.

Isaac ROS Apriltag Overview This ROS2 node uses the NVIDIA GPU-accelerated AprilTags library to detect AprilTags in images and publishes their poses,

Dec 26, 2022
Real-Time Neural 3D Hand Pose Estimation from an Event Stream [ICCV 2021]

EventHands: Real-Time Neural 3D Hand Pose Estimation from an Event Stream Project Page Index TRAIN.md -- how to train the model from scratch EVAL_REAL

Nov 7, 2022
Reviatalizing Optimization for 3D Human Pose and Shape Estimation: A Sparse Constrained Formulation
Reviatalizing Optimization for 3D Human Pose and Shape Estimation: A Sparse Constrained Formulation

Reviatalizing Optimization for 3D Human Pose and Shape Estimation: A Sparse Constrained Formulation This is the implementation of the approach describ

Nov 15, 2022
ManipNet: Neural Manipulation Synthesis with a Hand-Object Spatial Representation - SIGGRAPH 2021
ManipNet: Neural Manipulation Synthesis with a Hand-Object Spatial Representation - SIGGRAPH 2021

ManipNet: Neural Manipulation Synthesis with a Hand-Object Spatial Representation - SIGGRAPH 2021 Dataset Code Demos Authors: He Zhang, Yuting Ye, Tak

Jan 5, 2023
Port of the 2020 support library to Raspberry Pi for the VL53L3CX Time-of-Flight ranging sensor with advanced multi-object detection

Port of ST VL53L3CX (2020) driver library to Raspberry Pi This is a port of the support library to Raspberry Pi for the VL53L3CX Time-of-Flight rangin

Jul 27, 2022
Object Based Generic Perception Object Model
 Object Based Generic Perception Object Model

This model is a highly parameterizable generic perception sensor and tracking model. It can be parameterized as a Lidar or a Radar. The model is based on object lists and all modeling is performed on object level.

Jun 11, 2022
Code and Data for our CVPR 2021 paper "Structured Scene Memory for Vision-Language Navigation"

SSM-VLN Code and Data for our CVPR 2021 paper "Structured Scene Memory for Vision-Language Navigation". Environment Installation Download Room-to-Room

Dec 3, 2022
[CVPR 2021] NormalFusion: Real-Time Acquisition of Surface Normals for High-Resolution RGB-D Scanning

NormalFusion: Real-Time Acquisition of Surface Normals for High-Resolution RGB-D Scanning Project Page | Paper | Supplemental material #1 | Supplement

Jan 2, 2023
DeepI2P - Image-to-Point Cloud Registration via Deep Classification. CVPR 2021
DeepI2P - Image-to-Point Cloud Registration via Deep Classification. CVPR 2021

#DeepI2P: Image-to-Point Cloud Registration via Deep Classification Summary Video PyTorch implementation for our CVPR 2021 paper DeepI2P. DeepI2P solv

Jan 8, 2023
The repository contains our dataset and C++ implementation of the CVPR 2022 paper, Geometric Structure Preserving Warp for Natural Image Stitching.
The repository contains our dataset and C++ implementation of the CVPR 2022 paper, Geometric Structure Preserving Warp for Natural Image Stitching.

Geometric Structure Preserving Warp for Natural Image Stitching This repository contains our dataset and C++ implementation of the CVPR 2022 paper, Ge

Dec 22, 2022
A framework for generic hybrid two-party computation and private inference with neural networks

MOTION2NX -- A Framework for Generic Hybrid Two-Party Computation and Private Inference with Neural Networks This software is an extension of the MOTI

Nov 29, 2022
NeeDrop: Self-supervised Shape Representation from Sparse Point Clouds using Needle Dropping
NeeDrop: Self-supervised Shape Representation from Sparse Point Clouds using Needle Dropping

NeeDrop: Self-supervised Shape Representation from Sparse Point Clouds using Needle Dropping by: Alexandre Boulch, Pierre-Alain Langlois, Gilles Puy a

Sep 6, 2022
Multi-Scale Representation Learning on Proteins

Multi-Scale Representation Learning on Proteins (Under Construction and Subject to Change) Pending: Update links for dataset. This is the official PyT

Dec 12, 2022