Convolutional Neural Network for 3D meshes in PyTorch

Overview




MeshCNN in PyTorch

SIGGRAPH 2019 [Paper] [Project Page]

MeshCNN is a general-purpose deep neural network for 3D triangular meshes, which can be used for tasks such as 3D shape classification or segmentation. This framework includes convolution, pooling and unpooling layers which are applied directly on the mesh edges.


The code was written by Rana Hanocka and Amir Hertz with support from Noa Fish.

Getting Started

Installation

  • Clone this repo:
git clone https://github.com/ranahanocka/MeshCNN.git
cd MeshCNN
  • Install dependencies: PyTorch version 1.2. Optional : tensorboardX for training plots.
    • Via new conda environment conda env create -f environment.yml (creates an environment called meshcnn)

3D Shape Classification on SHREC

Download the dataset

bash ./scripts/shrec/get_data.sh

Run training (if using conda env first activate env e.g. source activate meshcnn)

bash ./scripts/shrec/train.sh

To view the training loss plots, in another terminal run tensorboard --logdir runs and click http://localhost:6006.

Run test and export the intermediate pooled meshes:

bash ./scripts/shrec/test.sh

Visualize the network-learned edge collapses:

bash ./scripts/shrec/view.sh

An example of collapses for a mesh:

Note, you can also get pre-trained weights using bash ./scripts/shrec/get_pretrained.sh.

In order to use the pre-trained weights, run train.sh which will compute and save the mean / standard deviation of the training data.

3D Shape Segmentation on Humans

The same as above, to download the dataset / run train / get pretrained / run test / view

bash ./scripts/human_seg/get_data.sh
bash ./scripts/human_seg/train.sh
bash ./scripts/human_seg/get_pretrained.sh
bash ./scripts/human_seg/test.sh
bash ./scripts/human_seg/view.sh

Some segmentation result examples:

Additional Datasets

The same scripts also exist for COSEG segmentation in scripts/coseg_seg and cubes classification in scripts/cubes.

More Info

Check out the MeshCNN wiki for more details. Specifically, see info on segmentation and data processing.

Citation

If you find this code useful, please consider citing our paper

@article{hanocka2019meshcnn,
  title={MeshCNN: A Network with an Edge},
  author={Hanocka, Rana and Hertz, Amir and Fish, Noa and Giryes, Raja and Fleishman, Shachar and Cohen-Or, Daniel},
  journal={ACM Transactions on Graphics (TOG)},
  volume={38},
  number={4},
  pages = {90:1--90:12},
  year={2019},
  publisher={ACM}
}

Questions / Issues

If you have questions or issues running this code, please open an issue so we can know to fix it.

Acknowledgments

This code design was adopted from pytorch-CycleGAN-and-pix2pix.

Comments
  • how to run   on  cpu   enviroment

    how to run on cpu enviroment

    bash ./scripts/shrec/train.sh THCudaCheck FAIL file=/opt/conda/conda-bld/pytorch_1549630534704/work/torch/csrc/cuda/Module.cpp line=34 error=35 : CUDA driver version is insufficient for CUDA runtime version Traceback (most recent call last): File "train.py", line 9, in opt = TrainOptions().parse() File "/home/peichen/python_test/MeshCNN/options/base_options.py", line 54, in parse torch.cuda.set_device(self.opt.gpu_ids[0]) File "/home/peichen/anaconda3/envs/meshcnn/lib/python3.6/site-packages/torch/cuda/init.py", line 264, in set_device torch._C._cuda_setDevice(device) RuntimeError: cuda runtime error (35) : CUDA driver version is insufficient for CUDA runtime version at /opt/conda/conda-bld/pytorch_1549630534704/work/torch/csrc/cuda/Module.cpp:34

    question 
    opened by peichenzhong 12
  • Regarding augmented data for the classification task

    Regarding augmented data for the classification task

    Hi Rana.

    Does the training data include the augmented data generated for the classification task?I have a pretty small dataset to work on, and augmentated data would be really helpful.

    I see that .npz files stored in ./train/cache folder. Are these files ever used?

    Thanks.

    question 
    opened by amanjain1397 7
  • Changing Mesh Pooling functions

    Changing Mesh Pooling functions

    Hi, I want to change how MeshCNN collapses the edges in order to train it to reduce a mesh based on its normals. The smaller the difference between the input Triangle Normal and the Output, the more likely it is that the edge gets collapsed. The overall goal of me is to write a neural network that reduces the polygon count of any input mesh based on a set of criteria.

    Where exactly can i find the code that decides whether or not a neuron should collapse an edge or not? i would guess that its in models/layers/mesh_pool.py and there somewhere in the "__build_queue" function. But since the code is not very well documented, i dont quite understand what its doing there. Any idea where i should try to implement that feature?

    question 
    opened by wofsauge 7
  • More efficient pooling

    More efficient pooling

    First of all thank you for your work done in this project, it has been a huge help!

    The current implementation calls MeshUnion.union a lot of times during each pooling step, which takes a lot of time. By storing all the source and target rows, we can vectorize the union operation, and achieve a ~2x speed-up in the training time.

    Output from training human_seg before this change takes around 314 s per epoch:

    saving the latest model (epoch 1, total_steps 8)
    (epoch: 1, iters: 40, time: 0.840, data: 3.949) loss: 2.140 
    (epoch: 1, iters: 80, time: 0.822, data: 0.011) loss: 1.898 
    (epoch: 1, iters: 120, time: 0.833, data: 0.012) loss: 1.771 
    (epoch: 1, iters: 160, time: 0.788, data: 0.012) loss: 1.831 
    (epoch: 1, iters: 200, time: 0.786, data: 0.015) loss: 1.598 
    (epoch: 1, iters: 240, time: 0.784, data: 0.012) loss: 1.485 
    (epoch: 1, iters: 280, time: 0.771, data: 0.016) loss: 1.578 
    (epoch: 1, iters: 320, time: 0.779, data: 0.011) loss: 1.392 
    (epoch: 1, iters: 360, time: 0.775, data: 0.013) loss: 1.240 
    saving the model at the end of epoch 1, iters 384
    End of epoch 1 / 2100 	 Time Taken: 314 sec
    learning rate = 0.0010000
    Running Test
    loaded mean / std from cache
    loading the model from ./checkpoints\human_seg\latest_net.pth
    epoch: 1, TEST ACC: [56.706 %]
    

    After this change it takes around 149 s per epoch:

    saving the latest model (epoch 1, total_steps 8)
    (epoch: 1, iters: 40, time: 0.353, data: 3.925) loss: 2.087 
    (epoch: 1, iters: 80, time: 0.412, data: 0.010) loss: 1.932 
    (epoch: 1, iters: 120, time: 0.402, data: 0.022) loss: 1.822 
    (epoch: 1, iters: 160, time: 0.369, data: 0.012) loss: 1.755 
    (epoch: 1, iters: 200, time: 0.364, data: 0.012) loss: 1.702 
    (epoch: 1, iters: 240, time: 0.358, data: 0.027) loss: 1.624 
    (epoch: 1, iters: 280, time: 0.358, data: 0.014) loss: 1.503 
    (epoch: 1, iters: 320, time: 0.359, data: 0.012) loss: 1.546 
    (epoch: 1, iters: 360, time: 0.375, data: 0.010) loss: 1.364 
    saving the model at the end of epoch 1, iters 384
    End of epoch 1 / 2100 	 Time Taken: 149 sec
    learning rate = 0.0010000
    Running Test
    loaded mean / std from cache
    loading the model from ./checkpoints\human_seg\latest_net.pth
    epoch: 1, TEST ACC: [66.507 %]
    
    opened by ThomasOerkild 6
  • meaning about the

    meaning about the "sides" in the mesh structure

    Hi ranahanocka,

    Cheers for the creativity. I am sorry if here is not the right place to ask the questions. I am looking at the code:

    1. in the implementation, inside the build_gemm function, what does the "sides" list here mean? Why do we need this information?
    2. After unpooling of the mesh, are the mesh exactly the same as the original mesh, i mean the vertex position as well as the mesh connectivity? Will they be different? How can i export the reconstructed mesh?

    Thanks & Regards, zg

    question 
    opened by chengzg 6
  • ValueError: index can't contain negative values

    ValueError: index can't contain negative values

    I used classification pretrained parameters, the test works well for edges 750, but then I subdivide the mesh to 3000 edges(apply 1 loop, still manifold), and set --pool_res 2500 2000 1500 1000, error occurs below, do I have to use the fixed edges(like 750) as input? How to deal with dense meshes, do we need to retrain it?

    Running Test 
    loaded mean / std from cache  
    loading the model from ./checkpoints\mytest\latest_net.pth  
    Traceback (most recent call last):  
      File "test.py", line 25, in <module>  
        run_test()  
      File "test.py", line 16, in run_test  
        for i, data in enumerate(dataset):  
      File "E:\Github\MeshCNN\data\__init__.py", line 33, in __iter__
        for i, data in enumerate(self.dataloader):
      File "D:\DevTool\anaconda3\lib\site-packages\torch\utils\data\dataloader.py", line 582, in __next__
        return self._process_next_batch(batch)
      File "D:\DevTool\anaconda3\lib\site-packages\torch\utils\data\dataloader.py", line 608, in _process_next_batch
        raise batch.exc_type(batch.exc_msg)
    ValueError: Traceback (most recent call last):
      File "D:\DevTool\anaconda3\lib\site-packages\torch\utils\data\_utils\worker.py", line 99, in _worker_loop
        samples = collate_fn([dataset[i] for i in batch_indices])
      File "D:\DevTool\anaconda3\lib\site-packages\torch\utils\data\_utils\worker.py", line 99, in <listcomp>
        samples = collate_fn([dataset[i] for i in batch_indices])
      File "E:\Github\MeshCNN\data\classification_data.py", line 31, in __getitem__
        edge_features = pad(edge_features, self.opt.ninput_edges)
      File "E:\Github\MeshCNN\util\util.py", line 22, in pad
        return np.pad(input_arr, pad_width=npad, mode='constant', constant_values=val)
      File "D:\DevTool\anaconda3\lib\site-packages\numpy\lib\arraypad.py", line 1172, in pad
        pad_width = _as_pairs(pad_width, narray.ndim, as_index=True)
      File "D:\DevTool\anaconda3\lib\site-packages\numpy\lib\arraypad.py", line 949, in _as_pairs
        raise ValueError("index can't contain negative values")
    ValueError: index can't contain negative values
    
    opened by sutongkui 6
  • Where is the function to convert .eseg files in seseg files?

    Where is the function to convert .eseg files in seseg files?

    Hi @ranahanocka! I want to create new ground truth data for the human data set with slightly varying vertices to check whether your trained model will be able to segment those. I managed to create the ground truth eseg file with the matlab code that you provided. Unfortunately, the seseg-files are not created and I can't find a different function that I have to run. Is there a different way to create the seseg files?

    opened by LSnyd 5
  • Problem in understanding the dataset

    Problem in understanding the dataset

    i was working with your cube dataset to benchmark my dataset later. Each and every mesh had the same number of triangles and vertices which somehow won't be the case for me. Will it be possible to work on training data with varied number of triangles and vertices ?

    question 
    opened by ankitpatnala 5
  • Regression

    Regression

    Hi,

    I was wondering how hard it would be to adapt the code to work with regression (reconstructing input meshes, with e.g. an Autoencoder framework).

    Have you tried this before?

    I didn't delve too deep before being certain this could be done, but I suppose the main thing to alter would be the optimization error. Any hints on how I could tackle this? Should I start from a "segmentation" type dataset and compute .eseg files as the edge features instead of using a per vertex L2 error?

    Thanks a lot

    question 
    opened by aykroyd-id 5
  • ValueError: Object arrays cannot be loaded when allow_pickle=False

    ValueError: Object arrays cannot be loaded when allow_pickle=False

    Hi, Rana,

    Thank you for your excellent work. I found an error when running

    bash ./scripts/shrec/train.sh
    

    Below is the program output:

    ------------ Options -------------
    arch: mconvnet
    batch_size: 16
    beta1: 0.9
    checkpoints_dir: ./checkpoints
    continue_train: False
    dataroot: datasets/shrec_16
    dataset_mode: classification
    epoch_count: 1
    export_folder: 
    fc_n: 100
    flip_edges: 0.2
    gpu_ids: [0]
    init_gain: 0.02
    init_type: normal
    is_train: True
    lr: 0.0002
    lr_decay_iters: 50
    lr_policy: lambda
    name: shrec16
    ncf: [64, 128, 256, 256]
    ninput_edges: 750
    niter: 100
    niter_decay: 100
    no_vis: False
    norm: group
    num_aug: 20
    num_groups: 16
    num_threads: 3
    phase: train
    pool_res: [600, 450, 300, 180]
    print_freq: 10
    resblocks: 1
    run_test_freq: 1
    save_epoch_freq: 1
    save_latest_freq: 250
    scale_verts: False
    seed: None
    serial_batches: False
    slide_verts: 0.2
    verbose_plot: False
    which_epoch: latest
    -------------- End ----------------
    loaded mean / std from cache
    #training meshes = 480
    ---------- Network initialized -------------
    [Network] Total number of parameters : 1.323 M
    -----------------------------------------------
    Traceback (most recent call last):
      File "train.py", line 23, in <module>
        for i, data in enumerate(dataset):
      File "/home/maiqi/yalong/project/more-personal/deep-3d/MeshCNN/data/__init__.py", line 33, in __iter__
        for i, data in enumerate(self.dataloader):
      File "/home/maiqi/yalong/software/anaconda3/envs/meshcnn/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 637, in __next__
        return self._process_next_batch(batch)
      File "/home/maiqi/yalong/software/anaconda3/envs/meshcnn/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 658, in _process_next_batch
        raise batch.exc_type(batch.exc_msg)
    ValueError: Traceback (most recent call last):
      File "/home/maiqi/yalong/software/anaconda3/envs/meshcnn/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 138, in _worker_loop
        samples = collate_fn([dataset[i] for i in batch_indices])
      File "/home/maiqi/yalong/software/anaconda3/envs/meshcnn/lib/python3.6/site-packages/torch/utils/data/dataloader.py", line 138, in <listcomp>
        samples = collate_fn([dataset[i] for i in batch_indices])
      File "/home/maiqi/yalong/project/more-personal/deep-3d/MeshCNN/data/classification_data.py", line 27, in __getitem__
        mesh = Mesh(file=path, opt=self.opt, hold_history=False, export_folder=self.opt.export_folder)
      File "/home/maiqi/yalong/project/more-personal/deep-3d/MeshCNN/models/layers/mesh.py", line 16, in __init__
        fill_mesh(self, file, opt)
      File "/home/maiqi/yalong/project/more-personal/deep-3d/MeshCNN/models/layers/mesh_prepare.py", line 21, in fill_mesh
        mesh2fill.ve = mesh_data['ve']
      File "/home/maiqi/yalong/software/anaconda3/envs/meshcnn/lib/python3.6/site-packages/numpy/lib/npyio.py", line 262, in __getitem__
        pickle_kwargs=self.pickle_kwargs)
      File "/home/maiqi/yalong/software/anaconda3/envs/meshcnn/lib/python3.6/site-packages/numpy/lib/format.py", line 692, in read_array
        raise ValueError("Object arrays cannot be loaded when "
    ValueError: Object arrays cannot be loaded when allow_pickle=False
    
    

    Machine OS: ubuntu 16.04 conda environments:

    #
    # Name                    Version                   Build  Channel
    astroid                   2.2.5                    py36_0  
    blas                      1.0                         mkl  
    ca-certificates           2019.1.23                     0  
    certifi                   2019.3.9                 py36_0  
    cffi                      1.12.3           py36h2e261b9_0  
    cudatoolkit               9.2                           0  
    cudnn                     7.3.1                 cuda9.2_0  
    cycler                    0.10.0                   py36_0  
    cython                    0.29.7           py36he6710b0_0  
    dbus                      1.13.6               h746ee38_0  
    expat                     2.2.6                he6710b0_0  
    fontconfig                2.13.0               h9420a91_0  
    freetype                  2.9.1                h8a8886c_1  
    glib                      2.56.2               hd408876_0  
    gst-plugins-base          1.14.0               hbbd80ab_1  
    gstreamer                 1.14.0               hb453b48_1  
    icu                       58.2                 h9c2bf20_1  
    intel-openmp              2019.3                      199  
    isort                     4.3.17                   py36_0  
    jpeg                      9b                   h024ee3a_2  
    kiwisolver                1.1.0            py36he6710b0_0  
    lazy-object-proxy         1.3.1            py36h14c3975_2  
    libedit                   3.1.20181209         hc058e9b_0  
    libffi                    3.2.1                hd88cf55_4  
    libgcc-ng                 8.2.0                hdf63c60_1  
    libgfortran-ng            7.3.0                hdf63c60_0  
    libpng                    1.6.37               hbc83047_0  
    libstdcxx-ng              8.2.0                hdf63c60_1  
    libtiff                   4.0.10               h2733197_2  
    libuuid                   1.0.3                h1bed415_2  
    libxcb                    1.13                 h1bed415_1  
    libxml2                   2.9.9                he19cac6_0  
    matplotlib                3.0.3            py36h5429711_0  
    mccabe                    0.6.1                    py36_1  
    mkl                       2019.3                      199  
    mkl_fft                   1.0.12           py36ha843d7b_0  
    mkl_random                1.0.2            py36hd81dba3_0  
    ncurses                   6.1                  he6710b0_1  
    ninja                     1.9.0            py36hfd86e86_0  
    numpy                     1.16.3           py36h7e9f1db_0  
    numpy-base                1.16.3           py36hde5b4d6_0  
    olefile                   0.46                     py36_0  
    openssl                   1.1.1b               h7b6447c_1  
    pcre                      8.43                 he6710b0_0  
    pillow                    6.0.0            py36h34e0f95_0  
    pip                       19.1                     py36_0  
    protobuf                  3.7.1                    pypi_0    pypi
    pycparser                 2.19                     py36_0  
    pylint                    2.3.1                    py36_0  
    pyparsing                 2.4.0                      py_0  
    pyqt                      5.9.2            py36h05f1152_2  
    python                    3.6.8                h0371630_0  
    python-dateutil           2.8.0                    py36_0  
    pytorch                   1.0.1           cuda92py36h65efead_0  
    pytz                      2019.1                     py_0  
    qt                        5.9.7                h5867ecd_1  
    readline                  7.0                  h7b6447c_5  
    setuptools                41.0.1                   py36_0  
    sip                       4.19.8           py36hf484d3e_0  
    six                       1.12.0                   py36_0  
    sqlite                    3.28.0               h7b6447c_0  
    tensorboardx              1.6                      pypi_0    pypi
    tk                        8.6.8                hbc83047_0  
    torchvision               0.2.2                      py_3    pytorch
    tornado                   6.0.2            py36h7b6447c_0  
    typed-ast                 1.3.4            py36h7b6447c_0  
    wheel                     0.33.1                   py36_0  
    wrapt                     1.11.1           py36h7b6447c_0  
    xz                        5.2.4                h14c3975_4  
    zlib                      1.2.11               h7b6447c_3  
    zstd                      1.3.7                h0b5b093_0 
    

    Any advice? thanks.

    good first issue 
    opened by dragonbook 5
  •  Edge features

    Edge features

    Will edge features(the 5-dimensional vector for every edge: the dihedral angle, two inner angles and two edge-length ratios for each face.) be recalculated due to shape update after each pooling?Thank you and look forward to your answer~~

    question 
    opened by tt-study 4
  • Error at merge_prepare.py

    Error at merge_prepare.py

    Hi, i got an error with this file when i want to use train.sh

    ------------ Options ------------- arch: meshunet batch_size: 2 beta1: 0.9 checkpoints_dir: ./checkpoints continue_train: False dataroot: datasets/human_seg dataset_mode: segmentation epoch_count: 1 export_folder: fc_n: 100 flip_edges: 0 gpu_ids: [] init_gain: 0.02 init_type: normal is_train: True lr: 0.001 lr_decay_iters: 50 lr_policy: lambda max_dataset_size: inf name: human_seg ncf: [32, 64, 128, 256] ninput_edges: 3000 niter: 100 niter_decay: 500 no_vis: False norm: batch num_aug: 20 num_groups: 16 num_threads: 0 phase: train pool_res: [2000, 1000, 500] print_freq: 10 resblocks: 1 run_test_freq: 1 save_epoch_freq: 1 save_latest_freq: 250 scale_verts: False seed: None serial_batches: False slide_verts: 0.2 verbose_plot: True weighted_loss: [0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125, 0.125] which_epoch: latest -------------- End ---------------- computing mean std from train data... Traceback (most recent call last): File "C:\Users\seanb\OneDrive\Documents\GitHub\MedMeshCNN\train.py", line 11, in dataset = DataLoader(opt) File "C:\Users\seanb\OneDrive\Documents\GitHub\MedMeshCNN\data_init_.py", line 21, in init self.dataset = CreateDataset(opt) File "C:\Users\seanb\OneDrive\Documents\GitHub\MedMeshCNN\data_init_.py", line 9, in CreateDataset dataset = SegmentationData(opt) File "C:\Users\seanb\OneDrive\Documents\GitHub\MedMeshCNN\data\segmentation_data.py", line 22, in init self.get_mean_std() File "C:\Users\seanb\OneDrive\Documents\GitHub\MedMeshCNN\data\base_dataset.py", line 32, in get_mean_std for i, data in enumerate(self): File "C:\Users\seanb\OneDrive\Documents\GitHub\MedMeshCNN\data\segmentation_data.py", line 29, in getitem mesh = Mesh(file=path, opt=self.opt, hold_history=True, export_folder=self.opt.export_folder) File "C:\Users\seanb\OneDrive\Documents\GitHub\MedMeshCNN\models\layers\mesh.py", line 16, in init fill_mesh(self, file, opt) File "C:\Users\seanb\OneDrive\Documents\GitHub\MedMeshCNN\models\layers\mesh_prepare.py", line 21, in fill_mesh mesh2fill.ve = mesh_data['ve'] File "C:\Users\seanb\anaconda3\lib\site-packages\numpy\lib\npyio.py", line 260, in getitem raise KeyError("%s is not a file in the archive" % key) KeyError: 've is not a file in the archive'

    opened by Noxx23 0
  • Does the class

    Does the class "Mesh" have an attribute about face?

    Hi, I am wondering if theclass "Mesh" has an attribute about the face? I noticed that face is used when preparing the data, but seems to not be contained in the final class object?

    opened by XinYu-Andy 0
  • assert no zero face area

    assert no zero face area

    Hi, Thanks for your great work! I noticed that this function is used to detect zero face area. If it is just used for detecting for further processing, I am confused about why do you write an "assert" line?

    opened by XinYu-Andy 0
  • Segmentation of objects with different characteristic

    Segmentation of objects with different characteristic

    Hello Everyone, First, I wanted to thank @ranahanocka for such an amazing effort and idea for 3D object segmentation.

    I have a question about the features you would propose to segment objects with completely different characteristics. I mean objects with sharp edges and a high number of connections. slab example

    I tried to add features such as the normal edge adjacent faces, the central point of edges, different angles between edges etc. However, still accuracy of the algorithm is quite low... I'll be glad for any ideas and suggestions.

    opened by wojciechteclaw 0
  • What is the relationship between your meshes and original coseg meshes?

    What is the relationship between your meshes and original coseg meshes?

    I find the serial numbers does not match the serial number of original coseg meshes? Can you provide the corresponding relationship by xml or json? Thank you very much!

    opened by lidan233 0
  • AssertionError

    AssertionError

    Traceback (most recent call last): File "train.py", line 30, in model.optimize_parameters() File "/home/ch/MeshCNN-master/models/mesh_classifier.py", line 66, in optimize_parameters out = self.forward() File "/home/ch/MeshCNN-master/models/mesh_classifier.py", line 57, in forward out = self.net(self.edge_features, self.mesh) File "/usr/local/Anaconda3/envs/torch/lib/python3.6/site-packages/torch/nn/modules/module.py", line 1102, in _call_impl return forward_call(*input, **kwargs) File "/usr/local/Anaconda3/envs/torch/lib/python3.6/site-packages/torch/nn/parallel/data_parallel.py", line 166, in forward return self.module(*inputs[0], **kwargs[0]) File "/usr/local/Anaconda3/envs/torch/lib/python3.6/site-packages/torch/nn/modules/module.py", line 1102, in _call_impl return forward_call(*input, **kwargs) File "/home/ch/MeshCNN-master/models/networks.py", line 150, in forward x = getattr(self, 'pool{}'.format(i))(x, mesh) File "/home/ch/MeshCNN-master/models/layers/mesh_pool.py", line 21, in call return self.forward(fe, meshes) File "/home/ch/MeshCNN-master/models/layers/mesh_pool.py", line 34, in forward self.__pool_main(mesh_index) File "/home/ch/MeshCNN-master/models/layers/mesh_pool.py", line 53, in __pool_main self.__pool_edge(mesh, edge_id, mask, edge_groups) File "/home/ch/MeshCNN-master/models/layers/mesh_pool.py", line 61, in __pool_edge elif self.__clean_side(mesh, edge_id, mask, edge_groups, 0)
    File "/home/ch/MeshCNN-master/models/layers/mesh_pool.py", line 79, in __clean_side self.__remove_triplete(mesh, mask, edge_groups, invalid_edges) File "/home/ch/MeshCNN-master/models/layers/mesh_pool.py", line 181, in __remove_triplete assert(len(vertex) == 1) AssertionError

    opened by changhui666 0
Owner
Rana Hanocka
Research in Deep Learning and Computer Graphics
Rana Hanocka
Blender Add-On for slicing meshes with planes

MeshSlicer Blender Add-On for slicing meshes with multiple overlapping planes at once. This is a simple Blender addon to slice a silmple mesh with mul

null 52 Dec 12, 2022
Picasso: A CUDA-based Library for Deep Learning over 3D Meshes

The Picasso Library is intended for complex real-world applications with large-scale surfaces, while it also performs impressively on the small-scale applications over synthetic shape manifolds. We have upgraded the point cloud modules of SPH3D-GCN from homogeneous to heterogeneous representations, and included the upgraded modules into this latest work as well. We are happy to announce that the work is accepted to IEEE CVPR2021.

null 97 Dec 1, 2022
DeepMetaHandles: Learning Deformation Meta-Handles of 3D Meshes with Biharmonic Coordinates

DeepMetaHandles (CVPR2021 Oral) [paper] [animations] DeepMetaHandles is a shape deformation technique. It learns a set of meta-handles for each given

Liu Minghua 73 Dec 15, 2022
Code for HodgeNet: Learning Spectral Geometry on Triangle Meshes, in SIGGRAPH 2021.

HodgeNet | Webpage | Paper | Video HodgeNet: Learning Spectral Geometry on Triangle Meshes Dmitriy Smirnov, Justin Solomon SIGGRAPH 2021 Set-up To ins

Dima Smirnov 61 Nov 27, 2022
Learning Generative Models of Textured 3D Meshes from Real-World Images, ICCV 2021

Learning Generative Models of Textured 3D Meshes from Real-World Images This is the reference implementation of "Learning Generative Models of Texture

Dario Pavllo 115 Jan 7, 2023
The all new way to turn your boring vector meshes into the new fad in town; Voxels!

Voxelator The all new way to turn your boring vector meshes into the new fad in town; Voxels! Notes: I have not tested this on a rotated mesh. With fu

null 6 Feb 3, 2022
Pytorch implementation of Cut-Thumbnail in the paper Cut-Thumbnail:A Novel Data Augmentation for Convolutional Neural Network.

Cut-Thumbnail (Accepted at ACM MULTIMEDIA 2021) Tianshu Xie, Xuan Cheng, Xiaomin Wang, Minghui Liu, Jiali Deng, Tao Zhou, Ming Liu This is the officia

null 3 Apr 12, 2022
This repository implements and evaluates convolutional networks on the Möbius strip as toy model instantiations of Coordinate Independent Convolutional Networks.

Orientation independent Möbius CNNs This repository implements and evaluates convolutional networks on the Möbius strip as toy model instantiations of

Maurice Weiler 59 Dec 9, 2022
EPSANet:An Efficient Pyramid Split Attention Block on Convolutional Neural Network

EPSANet:An Efficient Pyramid Split Attention Block on Convolutional Neural Network This repo contains the official Pytorch implementaion code and conf

Hu Zhang 175 Jan 7, 2023
Implementation of character based convolutional neural network

Character Based CNN This repo contains a PyTorch implementation of a character-level convolutional neural network for text classification. The model a

Ahmed BESBES 248 Nov 21, 2022
An implementation of the research paper "Retina Blood Vessel Segmentation Using A U-Net Based Convolutional Neural Network"

Retina Blood Vessels Segmentation This is an implementation of the research paper "Retina Blood Vessel Segmentation Using A U-Net Based Convolutional

Srijarko Roy 23 Aug 20, 2022
Scripts for training an AI to play the endless runner Subway Surfers using a supervised machine learning approach by imitation and a convolutional neural network (CNN) for image classification

About subwAI subwAI - a project for training an AI to play the endless runner Subway Surfers using a supervised machine learning approach by imitation

null 82 Jan 1, 2023
Speech Separation Using an Asynchronous Fully Recurrent Convolutional Neural Network

Speech Separation Using an Asynchronous Fully Recurrent Convolutional Neural Network This repository is the official implementation of Speech Separati

Kai Li (李凯) 116 Nov 9, 2022
Meta graph convolutional neural network-assisted resilient swarm communications

Resilient UAV Swarm Communications with Graph Convolutional Neural Network This repository contains the source codes of Resilient UAV Swarm Communicat

null 62 Dec 6, 2022
Convolutional neural network web app trained to track our infant’s sleep schedule using our Google Nest camera.

Machine Learning Sleep Schedule Tracker What is it? Convolutional neural network web app trained to track our infant’s sleep schedule using our Google

g-parki 7 Jul 15, 2022
Code repo for "RBSRICNN: Raw Burst Super-Resolution through Iterative Convolutional Neural Network" (Machine Learning and the Physical Sciences workshop in NeurIPS 2021).

RBSRICNN: Raw Burst Super-Resolution through Iterative Convolutional Neural Network An official PyTorch implementation of the RBSRICNN network as desc

Rao Muhammad Umer 6 Nov 14, 2022
Some code of the implements of Geological Modeling Using 3D Pixel-Adaptive and Deformable Convolutional Neural Network

3D-GMPDCNN Geological Modeling Using 3D Pixel-Adaptive and Deformable Convolutional Neural Network PyTorch implementation of "Geological Modeling Usin

null 5 Nov 21, 2022
An implementation of quantum convolutional neural network with MindQuantum. Huawei, classifying MNIST dataset

关于实现的一点说明 山东大学 2020级 苏博南 www.subonan.com 文件说明 tools.py 这里面主要有两个函数: resize(a, lenb) 这其实是我找同学写的一个小算法hhh。给出一个$28\times 28$的方阵a,返回一个$lenb\times lenb$的方阵。因

ぼっけなす 2 Aug 29, 2022
CasualHealthcare's Pneumonia detection with Artificial Intelligence (Convolutional Neural Network)

CasualHealthcare's Pneumonia detection with Artificial Intelligence (Convolutional Neural Network) This is PneumoniaDiagnose, an artificially intellig

Azhaan 2 Jan 3, 2022