PyTorch implementation and pre-trained weights for the paper PolyLayout: Multi-room Manhattan Layout Estimation (ECCV 2026).
PolyLayout is a multi-view multi-room layout estimation method. Given posed perspective images it jointly estimates the layout of multiple rooms.
Project page: https://ghanning.github.io/PolyLayout/
PolyLayout is built upon the excellent PixLoc code base. The PixLoc master branch is available in this repository under the name pixloc.
Install PolyLayout in editable mode as follows:
git clone https://github.com/ghanning/PolyLayout.git
cd PolyLayout/
virtualenv venv
source venv/bin/activate
pip install -e .Running the demo notebook requires some extra dependencies that can be installed with:
pip install -e .[extra]Download the Aria Synthetic Environments, ScanNet++ and 2D-3D-Semantics datasets from their respective web sites and unpack into a subdirectory named "datasets". The expected directory structure is shown below.
.
└── datasets
├── 2d3ds
│ ├── area_1
│ ├── area_2
│ ├── area_3
│ ├── area_4
│ ├── area_5a
│ ├── area_5b
│ └── area_6
├── ase
│ ├── 10698
│ ├── 11336
│ ├── 12462
. .
└── scannetpp
├── data
├── metadata
└── splits
Note: Only ScanNet++ is used to train PolyLayout, but we provide code to run the room layout estimation also on Aria Synthetic Environments and 2D-3D-Semantics.
The PolyLayout code currently supports only pinhole cameras. Follow the steps below to undistort the images in each dataset.
Undistort the fisheye images as explained here.
Use the ScanNet++ Toolbox to undistort the DSLR fisheye images by following the instructions here.
Note: As of April 30, 2025, undistorted DSLR images are included in the ScanNet++ dataset and this step can thus be skipped.
Split the panorama images into perspective views as detailed here.
Render depth maps for the undistorted DSLR images using the render-undistorted branch in my fork of the ScanNet++ Toolbox as described here, but set render_undistorted to True.
Run our preprocessing script to find the 2D-3D point correspondences used in training:
python -m pixloc.pixlib.preprocess_scannetppWhile line segments are not required to train PolyLayout they improve its performance at inference time. To extract line segments with DeepLSD first install it with
pip install -e .[deeplsd]then download the pre-trained weights
mkdir weights
wget https://cvg-data.inf.ethz.ch/DeepLSD/deeplsd_md.tar -O weights/deeplsd_md.tarand run the extraction for Aria Synthetic Environments, ScanNet++ and 2D-3D-Semantics:
./scripts/line_segments_ase.sh
./scripts/line_segments_scannetpp.sh
./scripts/line_segments_2d3ds.shAlternatively, you can download the extracted line segments for ASE (27 MiB), ScanNet++ (777 MiB) and 2D-3D-Semantics (8 MiB) and unpack them with the command
unzip line_segments_ase.zip -d datasets/ase
unzip line_segments_scannetpp.zip -d datasets/scannetpp
unzip line_segments_2d3ds.zip -d datasets/2d3dsTraining is done in three stages. First the edge detector is pre-trained by running:
python -m pixloc.pixlib.train --conf pixloc/pixlib/configs/pretrain_polylayout_scannetpp.yaml polylayout_scannetpp_pretrainNext the full network is trained, with weights initialized from the previous stage:
python -m pixloc.pixlib.train --conf pixloc/pixlib/configs/train_polylayout_scannetpp.yaml polylayout_scannetpp train.load_experiment=polylayout_scannetpp_pretrainFinally we fine tune the model with a lower learning rate:
python -m pixloc.pixlib.train --conf pixloc/pixlib/configs/train_polylayout_scannetpp.yaml polylayout_scannetpp_fine_tuned train.load_experiment=polylayout_scannetpp train.lr=0.66e-07 train.epochs=5Tip: Pass the --wandb_project <PROJECT> argument to the training script to log the results to Weights & Biases.
We supply a script to run PolyLayout and output the room layout predictions to a JSON file.
python -m pixloc.run_PolyLayout --experiment polylayout_scannetpp_fine_tuned --conf pixloc/pixlib/configs/eval_polylayout_ase.yaml --split {val,test} --output OUTPUTpython -m pixloc.run_PolyLayout --experiment polylayout_scannetpp_fine_tuned --conf pixloc/pixlib/configs/eval_polylayout_scannetpp.yaml --split multi_room --output OUTPUTpython -m pixloc.run_PolyLayout --experiment polylayout_scannetpp_fine_tuned --conf pixloc/pixlib/configs/eval_polylayout_2d3ds.yaml --split test --output OUTPUTThe resulting predictions can be evaluated using the code in the MultiViewRoomLayout repository.
Pre-trained weights for a model trained on ScanNet++ as outlined above can be found here (298 MiB). Extract the checkpoint with
mkdir -p outputs/training && unzip polylayout_scannetpp_fine_tuned.zip -d outputs/trainingTry out PolyLayout on Aria Synthetic Environments and ScanNet++ with the Jupyter notebook demo_PolyLayout.ipynb.
Use the BibTeX reference below to cite our work.
@inproceedings{hanning2026polylayout,
title={{PolyLayout: Multi-room Manhattan Layout Estimation}},
author={Hanning, Gustav and Liu, Shaohui and Pautrat, Rémi and Pollefeys, Marc and Åström, Kalle and Larsson, Viktor},
booktitle={European Conference on Computer Vision},
year={2026},
}
In addition, please consider citing the PixLoc paper:
@inproceedings{sarlin21pixloc,
title={{Back to the Feature: Learning Robust Camera Localization from Pixels to Pose}},
author={Paul-Edouard Sarlin and Ajaykumar Unagar and Måns Larsson and Hugo Germain and Carl Toft and Viktor Larsson and Marc Pollefeys and Vincent Lepetit and Lars Hammarstrand and Fredrik Kahl and Torsten Sattler},
booktitle={CVPR},
year={2021},
}
