HorizonNet
这是我们CVPR'19论文“HorizonNet: 用1D表示和Pano Stretch数据增强学习房间布局”的实现(项目页面)。
更新
- 2021.11.04: 报告Zillow Indoor数据集上的结果。(参见ZInD上的报告 :clipboard:)。
- 2021.04.03: 查看我们在该任务及其他任务上的新项目HoHoNet!
- 2021.03.14: (1) 使用网格代替点云作为布局查看器。(2) 更新了lsd检测器的依赖。
- 2019.08.19: 报告Structured3D数据集上的结果。(参见ST3D上的报告 :clipboard:)。
- 2019.06.15: 修复一般布局的bug(
dataset.py
、inference.py
和misc/post_proc.py
)
特点
这个仓库是一个纯Python实现,您可以:
- 对您的图像进行推理,以获得立方体或一般形状的房间布局
- 3D布局查看器
- 校正旋转姿态以确保曼哈顿对齐
- Pano Stretch增强,可复制粘贴以应用于您的任务
- 定量评估立方体/一般形状的2D IoU、3D IoU、角点误差、像素误差
- 准备和训练您的数据集
方法概述
安装
Pytorch的安装依赖于机器,请为您的机器安装正确的版本。经过测试的版本是Pytorch 1.8.1和Python 3.7.6。
依赖项(点击展开)
- numpy
- scipy
- sklearn
- Pillow
- tqdm
- tensorboardX
- opencv-python>=3.1(用于预处理)
- pylsd-nova
- open3d>=0.7(用于3D布局查看器)
- shapely
下载
数据集
- PanoContext/Stanford2D3D数据集
- 下载预处理的pano/s2d3d,用于训练/验证/测试
- 将它们放在
data
目录下,因此您应该得到:HorizonNet/ ├──data/ | ├──layoutnet_dataset/ | | |--finetune_general/ | | |--test/ | | |--train/ | | |--valid/
test
、train
、valid
是从LayoutNet的立方体数据集中处理出来的。finetune_general
是我们从train
和valid
重新标注的。它包含65个一般形状的房间。
- 将它们放在
- 下载预处理的pano/s2d3d,用于训练/验证/测试
- Structured3D数据集
- 请参见教程,准备HorizonNet的训练/验证/测试数据集。
- Zillow Indoor数据集
- 请参见教程,准备HorizonNet的训练/验证/测试数据集。
预训练模型
请在这里下载预训练模型
resnet50_rnn__panos2d3d.pth
- 在PanoContext/Stanford2d3d的817张全景图像上训练。
- 训练了300个epoch
resnet50_rnn__st3d.pth
- 在Structured3D的18362张全景图像上训练。
- 数据设置:原始家具和照明。
- 训练了50个epoch。
resnet50_rnn__zind.pth
- 在Zillow Indoor的20077张全景图像上训练。
- 数据设置:
layout_visible
、is_primary
、is_inside
、is_ceiling_flat
。 - 训练了50个epoch。
在您的图像上推理
在下面的说明中,我将以assets/demo.png
为例。
- (从PanoContext数据集修改)
1. 预处理(对齐相机旋转姿态)
- 执行:通过以下命令预处理上面的
assets/demo.png
。python preprocess.py --img_glob assets/demo.png --output_dir assets/preprocessed/
--img_glob
指示360房间图像的路径。- 支持带引号的shell样式通配符(例如
"my_fasinated_img_dir/*png"
)。
- 支持带引号的shell样式通配符(例如
--output_dir
指示存储结果的目录路径。- 有关更详细的脚本使用帮助,请参见
python preprocess.py -h
。
- 输出:在给定的
--output_dir
下,您将获得如下结果,并以源图像的基本名称为前缀。- 对齐的RGB图像
[SOURCE BASENAME]_aligned_rgb.png
和线段图像[SOURCE BASENAME]_aligned_line.png
-
demo_aligned_rgb.png
demo_aligned_line.png
-
- 检测到的消失点
[SOURCE BASENAME]_VP.txt
(这里是demo_VP.txt
)-0.002278 -0.500449 0.865763 0.000895 0.865764 0.500452 0.999999 -0.001137 0.000178
- 对齐的RGB图像
2. 使用 HorizonNet 估算布局
- 执行:通过运行以下命令,从上面对齐的图像和线段中预测布局。
python inference.py --pth ckpt/resnet50_rnn__mp3d.pth --img_glob assets/preprocessed/demo_aligned_rgb.png --output_dir assets/inferenced --visualize
--pth
训练模型的路径。--img_glob
预处理图像的路径。--output_dir
用于存放结果的目录路径。--visualize
可选项,用于可视化模型的原始输出。--force_cuboid
如果想估算长方体布局(4面墙),添加此选项。
- 输出:你将获得如下结果,并以源图像的基本名为前缀。
- 文件名
[SOURCE BASENAME].raw.png
下可视化的1D表示。 - 提取出的布局角点
[SOURCE BASENAME].json
{"z0": 50.0, "z1": -59.03114700317383, "uv": [[0.029913906008005142, 0.2996523082256317], [0.029913906008005142, 0.7240479588508606], [0.015625, 0.3819984495639801], [0.015625, 0.6348703503608704], [0.056027885526418686, 0.3881891965866089], [0.056027885526418686, 0.6278984546661377], [0.4480381906032562, 0.3970482349395752], [0.4480381906032562, 0.6178648471832275], [0.5995567440986633, 0.41122356057167053], [0.5995567440986633, 0.601679801940918], [0.8094607591629028, 0.36505699157714844], [0.8094607591629028, 0.6537724137306213], [0.8815288543701172, 0.2661873996257782], [0.8815288543701172, 0.7582473754882812], [0.9189453125, 0.31678876280784607], [0.9189453125, 0.7060701847076416]]}
- 文件名
3. 3D 布局查看器
- 执行:使用点云可视化预测的3D布局。
python layout_viewer.py --img assets/preprocessed/demo_aligned_rgb.png --layout assets/inferenced/demo_aligned_rgb.json --ignore_ceiling
--img
预处理图像的路径--layout
来自inference.py
的 json 输出的路径--ignore_ceiling
不显示天花板- 见
python layout_viewer.py -h
获取使用帮助。
- 输出:在窗口中,你可以使用鼠标和滚轮改变视图角度
你的数据集
参见教程 README_PREPARE_DATASET.md 了解如何准备数据集。
训练
要在数据集上进行训练,详情请参见 python train.py -h
获取选项说明。
示例:
python train.py --id resnet50_rnn
- 重要参数:
--id
必需。实验ID,用于命名检查点和日志--ckpt
输出检查点的文件夹(默认:./ckpt)--logs
日志记录的文件夹(默认:./logs)--pth
若提供,则为微调模式。用于加载已保存的检查点的路径。--backbone
网络的主干(默认:resnet50)- 其他选项:
{resnet18,resnet34,resnet50,resnet101,resnet152,resnext50_32x4d,resnext101_32x8d,densenet121,densenet169,densenet161,densenet201}
- 其他选项:
--no_rnn
是否移除RNN(默认:False)--train_root_dir
训练数据集的根目录。(默认:data/layoutnet_dataset/train
)--valid_root_dir
验证数据集的根目录。(默认:data/layoutnet_dataset/valid/
)- 若提供,则将保存验证集上最佳3DIoU的纪元为
{ckpt}/{id}/best_valid.pth
- 若提供,则将保存验证集上最佳3DIoU的纪元为
--batch_size_train
训练小批量大小(默认:4)--epochs
训练的迭代次数(默认:300)--lr
学习率(默认:0.0001)--device
使用设备ID设置启用CUDA的设备(不在使用多GPU时使用)--multi_gpu
启用所有可用GPU的并行计算
定量评估 - 长方体布局
要在PanoContext/Stanford2d3d数据集上进行评估,首先运行长方体训练模型对所有测试图像进行推断:
python inference.py --pth ckpt/resnet50_rnn__panos2d3d.pth --img_glob "data/layoutnet_dataset/test/img/*" --output_dir output/panos2d3d/resnet50_rnn/ --force_cuboid
--img_glob
测试图像文件的shell样式通配符。--output_dir
结果存放目录的路径。--force_cuboid
强制输出长方体布局(4面墙),否则无法评估PE和CE。
获取定量结果:
python eval_cuboid.py --dt_glob "output/panos2d3d/resnet50_rnn/*json" --gt_glob "data/layoutnet_dataset/test/label_cor/*txt"
--dt_glob
为所有模型估计文件的shell样式通配符。--gt_glob
为所有真实数据文件的shell样式通配符。
如果你想:
- 仅评估PanoContext
python eval_cuboid.py --dt_glob "output/panos2d3d/resnet50_rnn/*json" --gt_glob "data/layoutnet_dataset/test/label_cor/pano*txt"
- 仅评估Stanford2d3d
python eval_cuboid.py --dt_glob "output/panos2d3d/resnet50_rnn/*json" --gt_glob "data/layoutnet_dataset/test/label_cor/camera*txt"
:clipboard: 公开发布的 resnet50_rnn__panos2d3d.pth
的定量结果如下:
测试数据集 | 3D IoU(%) | 角点误差(%) | 像素误差(%) |
---|---|---|---|
PanoContext | 83.39 | 0.76 | 2.13 |
Stanford2D3D | 84.09 | 0.63 | 2.06 |
All | 83.87 | 0.67 | 2.08 |
定量评估 - 通用布局
- 有关详细信息,请参见ST3D的报告 :clipboard: README_ST3D.md。
- 有关详细信息,请参见MP3D的报告 :clipboard: README_MP3D.md。
待办事项
- 更快的预处理脚本(顶部对齐)(可能采用cython实现或fernandez2018layouts)
致谢
- 该仓库的部分功劳归于ChiWeiHsiao。
- 感谢limchaos 关于修正Pytorch数据加载器非预期行为可能带来的性能提升的建议。(参见问题#4)
引用
@inproceedings{SunHSC19,
author = {Cheng Sun and
Chi{-}Wei Hsiao and
Min Sun and
Hwann{-}Tzong Chen},
title = {HorizonNet: 使用一维表示和全景拉伸数据增强学习房间布局},
booktitle = {{IEEE} 计算机视觉与模式识别会议, {CVPR}
2019, 美国加利福尼亚州长滩, 2019年6月16-20日},
pages = {1047--1056},
year = {2019},
}