Skip to content

Commit

Permalink
push code
Browse files Browse the repository at this point in the history
  • Loading branch information
bguillard committed Oct 7, 2021
1 parent f3c8539 commit 750d5f7
Show file tree
Hide file tree
Showing 17 changed files with 1,910 additions and 0 deletions.
6 changes: 6 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
output/*
__pycache__*
.vscode*
.DS_Store*
dataset/Meshes*
dataset/Sketches*
90 changes: 90 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
# Sketch2Mesh: Reconstructing and Editing 3D Shapes from Sketches

![](figs/car.gif) ![](figs/chair.gif)

This is the PyTorch implementation of the ICCV 2021 paper [Sketch2Mesh](https://arxiv.org/abs/2104.00482). We provide pre-trained networks and code for demonstrating our global differentiable refinement procedure of 3D shapes from 2D sketches.

The below instructions describe how to:
1. [setup the python environment](#setup-environment)
2. [download data](#Download-the-test-set)
3. [download pre-trained networks](#Download-pre-trained-networks)
4. [launch refinement](#Launch-reconstruction-and-optimization)
5. [read metrics](#Parallelization)

## Setup environment
Set up a conda environment with the right packages using:
```
conda env create -f conda_env.yml
conda activate sketch2mesh
```

## Download the test set

We provide our test set in the form of an archive containing
[sketches](https://drive.google.com/file/d/1Zwp5MdvHY13zjF5KndueBpSBsqW_9Ip1/view?usp=sharing) (~8MB) and the associated
[meshes](https://drive.google.com/file/d/1iAr12e3cqribB7jDGogLToxtzRNZP82M/view?usp=sharing) (~530MB). The latter is a subset of [ShapeNet](https://shapenet.org/) meshes that were pre-processed by [DISN](https://github.com/laughtervv/DISN) authors.

To download both sketches and meshes directly at the right location using [gdown](https://github.com/wkentaro/gdown) (already installed if you followed the above setup with conda), from the root folder of the cloned repo use:

```
cd dataset
gdown https://drive.google.com/uc?id=1Zwp5MdvHY13zjF5KndueBpSBsqW_9Ip1
gdown https://drive.google.com/uc?id=1iAr12e3cqribB7jDGogLToxtzRNZP82M
unzip Sketches.zip
unzip Meshes.zip
rm Sketches.zip
rm Meshes.zip
cd ..
```

## Download pre-trained networks
Pre-trained encoder-decoder networks for sketches of [cars](https://drive.google.com/file/d/1C09_0RMiG2on8rvEqo3z79GzDoGvI3I2/view?usp=sharing) and [chairs](https://drive.google.com/file/d/1MEf4p-MaSVzL9v3i1GTMzJogM_0ciz6y/view?usp=sharing) (~35MB each) should be downloaded to the `output` directory using:
```
mkdir output
cd output
gdown https://drive.google.com/uc?id=1C09_0RMiG2on8rvEqo3z79GzDoGvI3I2
gdown https://drive.google.com/uc?id=1MEf4p-MaSVzL9v3i1GTMzJogM_0ciz6y
unzip cars.zip
unzip chairs.zip
rm cars.zip
rm chairs.zip
cd ..
```

These networks were trained on the Suggestive sketching style (see main paper).

## Launch reconstruction and optimization

Reconstruction and refinement from a collection of input sketches is done in `reconstruct_sketch2mesh.py`, with the following options:

* `--experiment` : relative path to either the chairs (`output/chairs`) or cars (`output/cars`) pre-trained network directory,
* `--out_dir` : output sub-directory where optimized meshes will be stored,
* `--sketch_style` : style of the input sketches, from `[fd | suggestive | handdrawn (for cars only)]`. See the main paper (Sec. 4.1) for more explanations.

For example, to launch reconstruction + refinement on hand drawn cars:
```
python reconstruct_sketch2mesh.py --experiment output/cars --out_dir sugg_to_hand --sketch_style handdrawn
```

### Parallelization

We provide a very simplistic parallelized implementation, using additional options `--n` and `--N`. The list of test shapes is divided into `N` equal chunks, and the `n`-th launched process handles the `n`-th chunk. For example, launching 6 reconstruction threads in parallel for the above reconstruction is done with

```
(python reconstruct_sketch2mesh.py --experiment output/cars --out_dir sugg_to_hand --sketch_style handdrawn --N 6 --n 1 &
python reconstruct_sketch2mesh.py --experiment output/cars --out_dir sugg_to_hand --sketch_style handdrawn --N 6 --n 2 &
python reconstruct_sketch2mesh.py --experiment output/cars --out_dir sugg_to_hand --sketch_style handdrawn --N 6 --n 3 &
python reconstruct_sketch2mesh.py --experiment output/cars --out_dir sugg_to_hand --sketch_style handdrawn --N 6 --n 4 &
python reconstruct_sketch2mesh.py --experiment output/cars --out_dir sugg_to_hand --sketch_style handdrawn --N 6 --n 5 &
python reconstruct_sketch2mesh.py --experiment output/cars --out_dir sugg_to_hand --sketch_style handdrawn --N 6 --n 6)
```

## Read metrics
Once the above has been performed, provide `read_metrics.py` with the path to reconstructed shapes to get 3D metrics before/after refinement. For example:
```
python read_metrics.py -d output/cars/Optimizations/latest/sugg_to_hand/ShapeNetV2/02958343/
> Across 113 shapes:
> - Average initial 3D Chamfer: 6.835395413599249
> - After refinement: 3.7756478764215666
```

212 changes: 212 additions & 0 deletions conda_env.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,212 @@
name: sketch2mesh
channels:
- pytorch3d
- pytorch
- bottler
- iopath
- fvcore
- conda-forge
- defaults
dependencies:
- _libgcc_mutex=0.1=conda_forge
- _openmp_mutex=4.5=1_llvm
- _pytorch_select=0.1=cpu_0
- alsa-lib=1.2.3=h516909a_0
- blas=1.0=mkl
- brotlipy=0.7.0=py38h497a2fe_1001
- bzip2=1.0.8=h7f98852_4
- ca-certificates=2021.5.30=ha878542_0
- cached-property=1.5.2=py_0
- cairo=1.16.0=h6cf1ce9_1008
- certifi=2021.5.30=py38h578d9bd_0
- cffi=1.14.6=py38ha65f79e_0
- chardet=4.0.0=py38h578d9bd_1
- colorama=0.4.4=pyh9f0ad1d_0
- cryptography=3.4.7=py38ha5dfef3_0
- cudatoolkit=10.2.89=hfd86e86_1
- dbus=1.13.6=h48d8840_2
- easydict=1.9=py_0
- expat=2.4.1=h9c3ff4c_0
- ffmpeg=4.3.2=hca11adc_0
- filelock=3.1.0=pyhd8ed1ab_0
- fontconfig=2.13.1=hba837de_1005
- freetype=2.10.4=h5ab3b9f_0
- fvcore=0.1.5.post20210915=py38
- gdown=3.13.1=pyhd8ed1ab_0
- gettext=0.19.8.1=h0b5b191_1005
- glib=2.68.4=h9c3ff4c_0
- glib-tools=2.68.4=h9c3ff4c_0
- gmp=6.2.1=h58526e2_0
- gnutls=3.6.13=h85f3911_1
- graphite2=1.3.13=h58526e2_1001
- gst-plugins-base=1.18.5=hf529b03_0
- gstreamer=1.18.5=h76c114f_0
- h5py=3.2.1=py38h6c542dc_0
- harfbuzz=2.9.1=h83ec7ef_0
- hdf5=1.10.6=hb1b8bf9_0
- icu=68.1=h58526e2_0
- intel-openmp=2021.3.0=h06a4308_3350
- iopath=0.1.9=py38
- jasper=1.900.1=h07fcdf6_1006
- jbig=2.1=h7f98852_2003
- jpeg=9d=h36c2ea0_0
- krb5=1.19.2=hcc1bbae_0
- lame=3.100=h7f98852_1001
- lcms2=2.12=h3be6417_0
- ld_impl_linux-64=2.35.1=h7274673_9
- lerc=2.2.1=h9c3ff4c_0
- libblas=3.9.0=11_linux64_mkl
- libcblas=3.9.0=11_linux64_mkl
- libclang=11.1.0=default_ha53f305_1
- libdeflate=1.7=h7f98852_5
- libedit=3.1.20191231=he28a2e2_2
- libevent=2.1.10=hcdb4288_3
- libffi=3.3=he6710b0_2
- libgcc-ng=11.2.0=h1d223b6_8
- libgfortran-ng=7.5.0=ha8ba4b0_17
- libgfortran4=7.5.0=ha8ba4b0_17
- libglib=2.68.4=h3e27bee_0
- libiconv=1.16=h516909a_0
- liblapack=3.9.0=11_linux64_mkl
- liblapacke=3.9.0=11_linux64_mkl
- libllvm11=11.1.0=hf817b99_2
- libogg=1.3.4=h7f98852_1
- libopencv=4.5.3=py38h5627943_1
- libopus=1.3.1=h7f98852_1
- libpng=1.6.37=hbc83047_0
- libpq=13.3=hd57d9b9_0
- libprotobuf=3.16.0=h780b84a_0
- libstdcxx-ng=11.2.0=he4da1e4_8
- libtiff=4.3.0=hf544144_1
- libuuid=2.32.1=h7f98852_1000
- libuv=1.40.0=h7b6447c_0
- libvorbis=1.3.7=h9c3ff4c_0
- libwebp-base=1.2.1=h7f98852_0
- libxcb=1.13=h7f98852_1003
- libxkbcommon=1.0.3=he3ba5ed_0
- libxml2=2.9.12=h72842e0_0
- llvm-openmp=12.0.1=h4bd325d_1
- lz4-c=1.9.3=h295c915_1
- mkl=2021.3.0=h06a4308_520
- mkl-service=2.4.0=py38h7f8727e_0
- mkl_fft=1.3.0=py38h42c9631_2
- mkl_random=1.2.2=py38h51133e4_0
- mysql-common=8.0.25=ha770c72_2
- mysql-libs=8.0.25=hfa10184_2
- ncurses=6.2=he6710b0_1
- nettle=3.6=he412f7d_0
- ninja=1.10.2=hff7bd54_1
- nspr=4.30=h9c3ff4c_0
- nss=3.69=hb5efdd6_0
- numpy=1.20.3=py38hf144106_0
- numpy-base=1.20.3=py38h74d4b33_0
- nvidiacub=1.10.0=0
- olefile=0.46=pyhd3eb1b0_0
- opencv=4.5.3=py38h578d9bd_1
- openh264=2.1.1=h780b84a_0
- openjpeg=2.4.0=h3ad879b_0
- openssl=1.1.1l=h7f98852_0
- pcre=8.45=h9c3ff4c_0
- pillow=8.3.1=py38h2c7a002_0
- pixman=0.40.0=h36c2ea0_0
- portalocker=2.3.2=py38h578d9bd_0
- pthread-stubs=0.4=h36c2ea0_1001
- py-opencv=4.5.3=py38he5a9106_1
- pycparser=2.20=pyh9f0ad1d_2
- pyopenssl=20.0.1=pyhd8ed1ab_0
- pysocks=1.7.1=py38h578d9bd_3
- python=3.8.11=h12debd9_0_cpython
- python_abi=3.8=2_cp38
- pytorch=1.7.1=py3.8_cuda10.2.89_cudnn7.6.5_0
- pytorch3d=0.5.0=py38_cu102_pyt171
- pyyaml=5.4.1=py38h497a2fe_0
- qt=5.12.9=hda022c4_4
- readline=8.1=h27cfd23_0
- requests=2.26.0=pyhd8ed1ab_0
- setuptools=58.0.4=py38h06a4308_0
- six=1.16.0=pyhd3eb1b0_0
- sqlite=3.36.0=hc218d9a_0
- tabulate=0.8.9=pyhd8ed1ab_0
- termcolor=1.1.0=py_2
- tk=8.6.10=hbc83047_0
- torchvision=0.8.2=cpu_py38ha229d99_0
- tqdm=4.62.3=pyhd8ed1ab_0
- typing_extensions=3.10.0.2=pyh06a4308_0
- urllib3=1.26.7=pyhd8ed1ab_0
- wheel=0.37.0=pyhd3eb1b0_1
- x264=1!161.3030=h7f98852_1
- xorg-kbproto=1.0.7=h7f98852_1002
- xorg-libice=1.0.10=h7f98852_0
- xorg-libsm=1.2.3=hd9c2040_1000
- xorg-libx11=1.7.2=h7f98852_0
- xorg-libxau=1.0.9=h7f98852_0
- xorg-libxdmcp=1.1.3=h7f98852_0
- xorg-libxext=1.3.4=h7f98852_1
- xorg-libxrender=0.9.10=h7f98852_1003
- xorg-renderproto=0.11.1=h7f98852_1002
- xorg-xextproto=7.3.0=h7f98852_1002
- xorg-xproto=7.0.31=h7f98852_1007
- xz=5.2.5=h7b6447c_0
- yacs=0.1.6=py_0
- yaml=0.2.5=h516909a_0
- zlib=1.2.11=h7b6447c_3
- zstd=1.5.0=ha95c52a_0
- pip:
- attrs==21.2.0
- black==21.9b0
- charset-normalizer==2.0.6
- click==8.0.1
- configparser==5.0.2
- cycler==0.10.0
- docker-pycreds==0.4.0
- flake8==3.9.2
- flake8-bugbear==21.9.1
- flake8-comprehensions==3.6.1
- gitdb==4.0.7
- gitpython==3.1.24
- idna==3.2
- imageio==2.9.0
- isort==5.9.3
- jsonpatch==1.32
- jsonpointer==2.1
- kiwisolver==1.3.2
- matplotlib==3.4.3
- mccabe==0.6.1
- mypy-extensions==0.4.3
- networkx==2.6.3
- pandas==1.3.3
- pathspec==0.9.0
- pathtools==0.1.2
- pip==21.2.4
- platformdirs==2.3.0
- plotly==5.3.1
- plyfile==0.7.4
- promise==2.3
- protobuf==3.18.0
- psutil==5.8.0
- pycodestyle==2.7.0
- pyflakes==2.3.1
- pyparsing==2.4.7
- python-dateutil==2.8.2
- pytz==2021.1
- pywavelets==1.1.1
- pyzmq==22.3.0
- regex==2021.8.28
- scikit-image==0.18.3
- scipy==1.7.1
- sentry-sdk==1.4.1
- shortuuid==1.0.1
- smmap==4.0.0
- subprocess32==3.5.4
- tenacity==8.0.1
- tifffile==2021.8.30
- tomli==1.2.1
- torchdiffeq==0.2.2
- torchfile==0.1.0
- tornado==6.1
- trimesh==3.9.31
- visdom==0.1.8.9
- wandb==0.12.2
- websocket-client==1.2.1
- yaspin==2.1.0
prefix: /miniconda/envs/pytorch3d
2 changes: 2 additions & 0 deletions dataset/cars_test.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
{"ShapeNetV2": {"02958343": ["d0cd9b6ca511c6b9920355ae987b66f1", "90ba6416acd424e06d8db5f653b07b4b", "6710c87e34056a29aa69dfdc5532bb13", "641a0da53609ee3028920f0e0293b366", "30045ee0751d6ee88b3ab49d2e0e41ab", "cadd53fdbf69727721f6e2b0f75cf9c4", "768ea3241699f663f1cb19f636b1c2bd", "26c2c91d8eb660ecbeaa545f7f633287", "1f5a6d3c74f32053b6163196882ac0ca", "1836f75baa094cd9372ca62e6806c5c3", "a476444d87bc7aeb1699b1ed8dbb7ad7", "67c229c70e64a25e69c2e0a91b39f742", "6c39e401487c95e9ee897525d11b0599", "a5b7cc1a5ab2828b28b0b7b876595fb8", "e7e94f8dbbe8c1e9784da3853aae78cd", "e7f94161bd90444f8cf4cf458d5ff7b", "29c0b746704727593030e8e3910d2b3b", "4ebf1a8cbbd4a05228044fe9244db50a", "151bebc457224c2733d7c9e122eec9b6", "ae852f7f30bfdbcdf9d73bbb584eaa42", "86c8a3137a716d70e742b0b5e87bec54", "c23a65ae787245248580e2c19c4f9aaf", "b659b096b9cd0de093532d4a06abe81", "4ef6af15bcc78650bedced414fad522f", "a8f7a7271a02fd56afe1d4530f4c6e24", "2b800f158324986ab6f657757c95f74e", "ffbb51fcc3955d01b67c620b30c63392", "2a1523ee15233761d9f8911ce020a037", "3d81e36e5252c8f0becf71e2e014ff6f", "77d9a23f45c888e595551e0d9e50cb0d", "c5f77a00c9cae334cfd826dd468a5497", "ae1c1141ce4bfde9d66a73de5847ea37", "c6a7b37a33b5eef728af9bd424dcd6fa", "df72f352c7fedcfad9951d9ecda74409", "e84eb770bb6cedf3bda733a39f84326d", "32e6ee437b8fa3fb5e52943dcb52313c", "e7add7a018da8056bda733a39f84326d", "1f416598fe329a88b1bb46d2556ba67d", "74b4d0c4ba72eba8473f10e6caaeca56", "dd0b595b15a7203e185ce5d54f27f6b9", "9698be0fd3516f01fbeda5389ab05f5f", "b1ad30609c2fa8a2d63b3823877bfa70", "3b41ffcb4bec60cc21a66e8dfcce514a", "1b94aad142e6c2b8af9f38a1ee687286", "6ddb807414fa23e0d9f8911ce020a037", "616279642d73621812f039db97ce1ef", "83c31a4085063873dc2afbe43bc71afa", "f9cad36ae25540a0bb20fd1bc4860856",
"c6ca5b48d1e5f5ab89442e34f9143192", "29b714c4aee36c9d6108f064aff2426d", "12d7c4013415ea147f5b0cb87a91de52", "a55f4932b0f8a212402257734064a917", "158a95b4da25aa1fa37f3fc191551700", "d838c8cb52c92df3b112e5ac235c21b7", "c4744d66623e04b7518f93fcf50bd8df", "aff67f837a958d2329984c4afd2e98a4", "1c5a350ea0f55f793fbce9ec40e1f047", "206e39a5f67f4a4a81d0c86cc18e6647", "614d683fa574cd817fea5423f91210c9", "89c7e63c3d3d14aa17b597d473206848", "ac85727971fe63dd2c67ef33d7521ade", "2e37a9a6abbdf6cf25d175f53644eac1", "bbaef5a610b0b4d5368f3995546e59c8", "a077e24f8983d3d3476c231adfa21265", "c6762641f741acc2a19bced881c9e641", "83c21f0f383524e9bdd7ac383509f04c", "2f503625718536ad5d9d397842621b7", "ceb561c72a407ddfdc50a691c68014fd", "3a735f1a5fe8906cab0fd77f2e9aa584", "37e781aa8ae8933a61c6c61410fc904b", "5881807902ace2dc7d26edf2a8ffb68", "3a5ce33bac316d8f6379c5e421c1d27", "2fe4a878e34bd3bab8013668e30e23b0", "e0b9bb886c578be86e9dcc2d1ea2784d", "ab2759c8e0cf3b8da9d243597c4c2c2e", "2e27309be42276bebecf71e2e014ff6f", "6c1568ee8807fb73aa69dfdc5532bb13", "f7362613dfd3772faa69dfdc5532bb13", "e3dff7195a2026dba4db43fa521d5c03", "fa1b3bcdbda309a439cc19d48e3f4f5", "4a6dea7ffa04531cf63ee8a34069b7c5", "bf0e8d944ba4843e94e7e8e27399daf7", "ad45b2d40c7801ef2074a73831d8a3a2", "5c542cd5371a631d6436916a86a90ed7", "884014d60de73249af551becaeca18e5", "eadebe4328e2c7d7c10520be41d00de2", "2236a1b9cde71eff13d31c5a107f3c4", "8fe901ed95e115ed70a5d1d8432b5405", "58569e7feac27d3e5da8146fec888d45", "97831a753d80d66dfd24692312e9de8c", "ab8b6d39057d2f6cc86779a6788ad464", "eeac3253fc4c0b429092ea6b09901598", "34211d29d94cbd52b7c4f0665aafbacd", "7121e0332f0c2e0551a95aaa6caba1d3", "9171272d0e357c40435b5ce06ecf3e86", "56478692749392a19dfd5136ef0f2af", "d164a37bffeb5a83f04c8b6c3407554", "b866d7e1b0336aff7c719d2d87c850d8", "5dde5594b4e9e86ce60ff101126e254", "86d5ba5d14672ae7becf71e2e014ff6f", "180d1e3463c29355bda72093f9b5aa73", "6eba2ec65e8e44ed5545896d1a9ff5d3", "f21bd46dced01bd835da01f298003d56", "12410830e8a5067c69576518bd9bfe48", "c6eebcd03aaa9060e7a6de039856f1eb", "a3881c3f4e8c807f2a9eb0f146e94477", "49a93fdbcaa0302ae434963ea517a487", "b30efada80553a1d202258c0423dde73", "f84ba2039d0a4ec5afe717997470b28d", "a6fe523f0ef082a2715e04edb8af9c53", "50e3333f66829c8fbe40bb45ea25a041", "a532b61524432d454ed192f2298faac", "29fc55965346a53733d7c9e122eec9b6"]}}
1 change: 1 addition & 0 deletions dataset/chairs_test.json
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
{"ShapeNetV2": {"03001627": ["ed751e0c20f48b3226fc87e2982c8a2b", "d72f27e4240bd7d0283b00891f680579", "5fa533f71e7e041efebad4f49b26ec52", "8bb332c5afe67f8d917b96045c9b6dea", "9a82269e56737217e16571f1d370cad9", "d9159a24fb0259b7febad4f49b26ec52", "e642ac79a2517d0054f92a30b31f64e", "caa330f85a6d6db7a17ae19fa77775ff", "4171071eb30dcb412dd4967de4160123", "1d9dbebcbb82682bf27a705edb2f9ba6", "df51cb83f0e55b81d85934de5898f0b", "7fe08cd7a9b76c1dcbde89e0c48a01bf", "33c4f94e97c3fefd19fb4103277a6b93", "764866604b035caacd0362ae35d1beb4", "6bd633162adccd29c3bd24f986301745", "ed7b1be61b8e78ac5d8eba92952b9366", "4719c75b8ce30de84b3c42e318f3affc", "6b32d3a9198f8b03d1dcc55e36186e4e", "ed953e5d1ce7a4bee7697d561711bd2b", "eb04d1bffae6038c4c7384dbb75cab0d", "64f6991a3688f8a0e49fc3668cb02f74", "5ee976518fc4f5c8664b3b9b23ddfcbc", "72da95dd6a486a4d4056b9c3d62d1efd", "18bf93e893e4069e4b3c42e318f3affc", "92e6546c4aca4ed14b96b665a8ac321", "c520bc9dde7c0a19d2afe8d5254a0d04", "875925d42780159ffebad4f49b26ec52", "953a6c4d742f1e44d1dcc55e36186e4e", "64ef0e07129b6bc4c3bd24f986301745", "b3a9c49a1924f99815f855bb1d7c4f07", "73b7d6df845221fa9a2041f674671d05", "6a00357a35d0574b8d7d306df70cbb46", "ff8921eb06e95b9cfebad4f49b26ec52", "9b902b5c6570acb314b96b665a8ac321", "8176364215748b23490ad276cd2af3a4", "6dfb7b5b4bd0d5f9febad4f49b26ec52", "b9d60d124e24849d37b2bb75885cfc44", "cf24fc2d10f8da31283b00891f680579", "c709aa613431c0538a653a9f65a410f6", "5141e8716b98a16d632786b910371d31", "4a329240c6a9d2547b11ae648ea92233", "25196058a95b4fc3359e362142e70c8d", "6d78523e939aedd482e23b5f9fd46e1e", "60c0c32187f4e2ddf51f77a6d7299806", "7facccfa81369078a8930422448288ea", "55eeb952519ceb87c3bd24f986301745", "2499541ace317cbb8cb5d9909aeb1309", "9979c8433d92fd80d1dcc55e36186e4e", "b72342e210414024e3e472a115551ec9", "8a5d60067de905336c183a120a388982", "776c1d1857a4ea3d853c3fc864dd58b7", "bc76dfa9e0a91e131e06124bec25a766", "a094ba480568333819fb4103277a6b93", "d621bfa4a44a98e3829e1f3c4926c485", "97da84d5d78d84cc2360e5e238139587", "a1e6226c3a23ec808a653a9f65a410f6", "1e53d84e48bb7d25febad4f49b26ec52", "106a0dbaead5066519fb4103277a6b93", "22ada577361ed0374b3c42e318f3affc", "a4d7c8b97066cb74f63e8e405d49b8ce", "5623d0ec9efedbc9d4da89766e80607a", "a2824df0ddb58c0617b431cae0dd70ed", "9b4d530487df4aa94b3c42e318f3affc", "8f0deb6b599006a22cc460e9d064e57d", "2718b1d46ca52df052bfb1d5ec273240", "2403b6769a03c8a466ab323d8f805a57", "a345ea2820d2f4af7ff6ace05b36a5", "1f501c5ed6423e259c89c86daa5af59d", "e440059fcf6f36496ebf11292bdb9130", "b1add8182311f2a9f71e06115e9c3b3e", "e4a890f2330ebd7e4a11872aa986426d", "9d0b25421c13008e35836c728d324152", "7661a325724ae00acd0362ae35d1beb4", "f551bf7431e0fd7cf937a9747c26991f", "7727d0eef3eeb3ba73b2b620da30da86", "5607b02869c1f8a019fb4103277a6b93", "6dddf2b95ca09bf5febad4f49b26ec52", "77e7660d71c6f3befebad4f49b26ec52", "8affc6302970a589febad4f49b26ec52", "47cd848a5584867b1e8791c225564ae0", "7f2f8dd929421cd130e6a28391d443c5", "97326604c5fdff1febad4f49b26ec52", "8ec79ed07c19aa5cfebad4f49b26ec52", "c0c823f094d972c94b3c42e318f3affc", "780aec25d416fa07ca9b40e76e725878", "317a2cc9f3b54a48283b00891f680579", "77fbfd2f194ed73975aa7f24a9b6003a", "4246c8c293c56ea34b3c42e318f3affc", "9b12d223347d4bdd4a11872aa986426d", "cc3d9160369d09845e61ef8e2af97499", "e69e032ca0bd60a4febad4f49b26ec52", "9dac39c51680daa2f71e06115e9c3b3e", "31a3884f500d9fa2025d98fb9de28cb", "19ce953da9aa8065d747a43c11e738e9", "fdef0425d385c1cadef295ef48e5307c", "d48dac046436a29ec3bd24f986301745", "c65cd2f7588764872b70eac6546e93fd", "1e6f06d182094d4ffebad4f49b26ec52", "695a02a5620aae6e78eec18a8a3356a2", "bd0918d75e22cbf9febad4f49b26ec52", "cfb40e7b9990da99c2f927df125f5ce4", "cc5b5e367ad8eaf19fb4103277a6b93", "d0894aed032460fafebad4f49b26ec52", "650d540bac31f56ffebad4f49b26ec52", "88bdfdfb2a8b94ca1b17743c18fb63dc", "fb794b0b3260794bfebad4f49b26ec52", "c1e8b1bd34874c83febad4f49b26ec52", "fd8c375d0a267d20283b00891f680579", "8c0a0360a7353ec26dd3cca80cedd415", "1e68489b0dc2bfc3327289c00b6dc9ca", "689f7ad63ed9a7baa75d03186a0409e2", "46d7e85d80411f50a094848ea4d06501", "ea5c19a6ea9b13719fb4103277a6b93", "325bf2aee84a1fcdfebad4f49b26ec52", "59fd3d1409c0ee2e47bc3701b998a7d5", "8707cf0c311ba8f34b3c42e318f3affc", "c9dc5d85ea3bf4d8a1088e4f586b1246", "b1c221e3ec7fe34782b50ea5cffa80bd", "e4a93adf5399b23419fb4103277a6b93", "453a678dec4e9d40f36ea1eb6542fe7e", "9a91a491a9e74ab132c074e5313866f2", "d04d854533d618fbfebad4f49b26ec52", "a5df9c511f51228f19fb4103277a6b93", "6af8d7bfa508b8d23759750e8db40476", "ce474d7c415941acfebad4f49b26ec52", "46c8f742ae31294cb4a4ddb21cda79e5", "de3e082195346ca419fb4103277a6b93"]}}
Binary file added figs/car.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Binary file added figs/chair.gif
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
2 changes: 2 additions & 0 deletions lib/__init__.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
from lib.data import *
from lib.mesh import *
Loading

0 comments on commit 750d5f7

Please sign in to comment.