/unicorn

(ECCV 2022) Official code of Share With Thy Neighbors: Single-View Reconstruction by Cross-Instance Consistency

Primary LanguagePythonMIT LicenseMIT

UNICORN ๐Ÿฆ„

Share With Thy Neighbors:
Single-View Reconstruction by Cross-Instance Consistency

Tom Monnierโ€ƒ Matthew Fisherโ€ƒ Alexei A. Efrosโ€ƒ Mathieu Aubry

teaser.gif

Official PyTorch implementation of Share With Thy Neighbors: Single-View Reconstruction by Cross-Instance Consistency (ECCV 2022). Check out our webpage for video results!

This repository contains:

  • scripts to download and load both datasets and pretrained models
  • demo to reconstruct cars from raw images (script or interactive notebook Open in Colab)
  • configs to train the models from scratch
  • evaluation pipelines to reproduce quantitative results
  • guidelines to train a model on a new dataset
If you find this code useful, don't forget to star the repo โญ and cite the paper ๐Ÿ‘‡
@inproceedings{monnier2022unicorn,
  title={{Share With Thy Neighbors: Single-View Reconstruction by Cross-Instance Consistency}},
  author={Monnier, Tom and Fisher, Matthew and Efros, Alexei A and Aubry, Mathieu},
  booktitle={{ECCV}},
  year={2022},
}
Major code updates ๐Ÿ“‹
  • 08/22: pytorch 1.10 instead of 1.5, big models, kp_eval.py, eval with gradient-based ICP with aniso scale, pascal3D car chamfer eval
  • 05/22: first code release

Installation ๐Ÿ‘ท

1. Create conda environment ๐Ÿ”ง

conda env create -f environment.yml
conda activate unicorn
Optional visualization ๐Ÿ“‰ Some monitoring routines are implemented, you can use them by specifying your visdom port in the config file. You will need to install visdom from source beforehand:
git clone https://github.com/facebookresearch/visdom
cd visdom && pip install -e .

2. Download datasets โฌ‡๏ธ

bash scripts/download_data.sh

This command will download one of the following datasets:

3. Download pretrained models โฌ‡๏ธ

bash scripts/download_model.sh

We provide a small (200Mo) and a big (600Mo) version for each pretrained model (see training section for details). The command will download one of the following models:

Important notes ๐Ÿ“ƒ
  1. โ—These small models correspond to an old version of the code, with in particular less training iterations. We release them for retrocompatibility and completeness, retrain from scratch for a thorough comparison.
  2. it may happen that gdown hangs, if so you can download them manually with the gdrive links and move them to the models folder.

How to use ๐Ÿš€

1. Demo - 3D reconstruction of car images ๐Ÿš˜

example_car.png example_rec.gif

You first need to download the car model (see above), then launch:

cuda=gpu_id model=car_big.pkl input=demo ./scripts/reconstruct.sh

where gpu_id is a target cuda device id, car_big.pkl corresponds to a pretrained model, demo is a folder containing the target images. Reconstruction results (.obj + gif) will be saved in a folder demo_rec.

We also provide an interactive demo Open in Colab to reconstruct cars from single images.

2. Train models from scratch ๐Ÿƒ

shapenet.gif

To launch a training from scratch, run:

cuda=gpu_id config=filename.yml tag=run_tag ./scripts/pipeline.sh

where gpu_id is a device id, filename.yml is a config in configs folder, run_tag is a tag for the experiment.

Results are saved at runs/${DATASET}/${DATE}_${run_tag} where DATASET is the dataset name specified in filename.yml and DATE is the current date in mmdd format.

Configs and guidelines ๐Ÿ”†

Available configs are:

  • sn/*.yml, sn_big/*.yml for each ShapeNet category
  • car.yml, car_big.yml for CompCars dataset
  • cub.yml, cub_big.yml for CUB-200 dataset
  • horse.yml, horse_big.yml for LSUN Horse dataset
  • moto.yml, horse_big.yml for LSUN Motorbike dataset
  • p3d_car.yml, p3d_car_big.yml for Pascal3D+ Car dataset

โ—NB: we advocate to always check the results after the first stage. In particular for cases like birds or horses, learning can fall into bad minima with bad prototypical shapes. If so, relaunch with a different seed.

Small vs big model ๐Ÿ’ช

We provide two configs to train a small and a big version of the model. Both versions give great results, the main benefit of the bigger model is slightly more detailed textures. The architecture differences are:

  • a shared backbone vs separate backbones
  • 32/128/128 vs 64/512/256 code sizes for shape/texture/background
  • 16 vs 64 minimal number of channels in the generators

For faster experiments and prototyping, we advocate the training of the small version.

Computational cost ๐Ÿ’ฐ

On a single GPU, the approximate training times are:

  • roughly 3 days for ShapeNet on a V100
  • roughly 10 days for real-image datasets on a 2080Ti

3. Reproduce our quantitative results ๐Ÿ“Š

A model is evaluated at the end of training. To evaluate a pretrained model (e.g. sn_big_airplane.pkl):

  1. move the model to a fake folder and rename it model.pkl (e.g. in runs/shapenet_nmr/airplane_big)
  2. point to the fake tag to resume from in the config (e.g. resume: airplane_big in airplane.yml)
  3. launch the training (and thus evaluation) with:
cuda=gpu_id config=sn_big/airplane.yml tag=airplane_big_eval ./scripts/pipeline.sh
Chamfer-L1 scores on ShapeNet ๐Ÿ“
airplane bench cabinet car chair display lamp phone rifle sofa speaker table vessel mean
0.110 0.159 0.137 0.168 0.253 0.220 0.523 0.127 0.097 0.192 0.224 0.243 0.155 0.201

For CUB, the built-in evaluation included in the training pipeline is Mask-IoU. To evaluate PCK, run:

cuda=gpu_id tag=run_tag ./scripts/kp_eval.sh

4. Train on a custom dataset ๐Ÿ”ฎ

If you want to learn a model for a custom object category, here are the key things you need to do:

  1. put your images in a custom_name folder inside the datasets folder
  2. edit the config file custom.yml (or custom_big.yml) in the configs folder: this includes changing the dataset name to custom_name and setting all training milestones
  3. launch training with:
cuda=gpu_id config=custom.yml tag=custom_run_tag ./scripts/pipeline.sh

Further information ๐Ÿ“š

If you like this project, check out related works from our group: