DenseMatching
DenseMatching 是一个基于 PyTorch 构建的通用密集匹配开源库,旨在为计算机视觉中的图像对齐任务提供从模型训练、评估到部署的一站式解决方案。它主要解决了在不同场景下(如几何匹配、光流估计及语义匹配)难以高效获取精确像素级对应关系的难题,广泛应用于三维重建、视频分析和姿态估计等领域。
该工具特别适合计算机视觉研究人员和算法开发者使用。它不仅内置了 MegaDepth、KITTI、Sintel 等主流验证数据集的处理脚本,还提供了完整的数据采样、真值生成及性能分析框架,极大降低了复现前沿算法的门槛。DenseMatching 的核心亮点在于集成了多种官方实现的顶尖模型,包括 GLU-Net、PDC-Net 以及最新的 PWarpC 等,并直接提供预训练权重供调用。此外,库中创新性地引入了转置卷积的双线性插值初始化策略,显著提升了模型收敛速度与最终精度;其独特的概率一致性学习机制,还能有效处理真实场景中的遮挡与背景杂乱问题,让弱监督下的语义匹配更加鲁可靠。无论是进行学术研究还是工程落地,DenseMatching 都是值得信赖的基础设施。
使用场景
某自动驾驶感知团队正在开发一套视觉定位系统,需要精准计算连续帧图像中车辆与行人的像素级位移,以辅助高精地图构建。
没有 DenseMatching 时
- 数据准备繁琐:团队需手动编写大量脚本生成随机图像对及对应的真值光流,难以模拟真实场景中的遮挡和动态物体干扰。
- 模型复现困难:想要尝试业界领先的 PDC-Net 或 WarpC 等算法,必须从零搭建网络架构并调试训练超参数,耗时数周且容易出错。
- 评估标准不一:缺乏统一的验证数据集(如 KITTI、Sintel)和标准化评测脚本,导致不同模型间的性能对比缺乏说服力。
- 训练效率低下:由于缺少针对上采样卷积权重的优化初始化策略,模型收敛速度慢,难以在有限算力下快速迭代。
使用 DenseMatching 后
- 数据生成自动化:直接调用库内函数即可生成带有随机遮挡和动态物体修改的高质量训练数据对,大幅缩短数据预处理周期。
- 开箱即用主流模型:直接加载预训练的 GLU-Net、PDC-Net 等官方模型权重,无需重复造轮子,当天即可开展下游任务微调。
- 评测流程标准化:利用内置的 MegaDepth、HPatches 等几何匹配数据集及分析脚本,快速输出权威的性能指标,加速技术选型决策。
- 训练性能显著提升:得益于默认集成的双线性插值权重初始化策略,模型训练时间明显缩短,且在光流预测精度上获得更优表现。
DenseMatching 通过提供从数据构建、模型复现到标准化评估的一站式解决方案,将研发重心从底层基建回归到核心算法创新。
运行环境要求
- 未说明
需要 NVIDIA GPU (基于 PyTorch),具体型号和显存大小未说明
未说明

快速开始
密集匹配
基于 PyTorch 的通用密集匹配库。
如有任何问题、意见或建议,请联系 Prune:prune.truong@vision.ee.ethz.ch
如果您有兴趣无监督地训练一个概率对应网络(结合了 PDCNet 和 WarpC 的方法),请查看我们最近的工作 Refign,代码可在 GitHub 上找到。 它也已集成到本代码库中,名为 UAWarpC。
更新
2022年3月6日:我们发现,当使用双线性插值权重来初始化用于在不同金字塔层级之间上采样预测光流场的转置卷积层时,可以获得显著更好的性能并缩短训练时间。我们已将此初始化方式设为默认。未来可能会提供更新的预训练权重。此外,也可以直接使用双线性插值进行上采样,效果相似(甚至可能更好),现在这也作为一种可选方案提供。
亮点
用于实现、训练和评估密集匹配网络的库。其中包括:
常用的密集匹配 验证数据集,适用于 几何匹配(MegaDepth、RobotCar、ETH3D、HPatches)、光流(KITTI、Sintel)和 语义匹配(TSS、PF-Pascal、PF-Willow、Spair)。
用于 分析 网络性能并获得匹配和位姿估计标准性能指标的脚本。
通用构建模块,包括深度网络、优化、特征提取和实用工具。
用于训练密集匹配网络的 通用训练框架,包含:
- 常用的匹配网络训练数据集。
- 用于生成随机图像对及其对应的真值光流,并添加运动物体及相应修改光流的函数。
- 用于数据采样、处理等功能。
- 以及更多内容……
GLU-Net(CVPR 2020)、GLU-Net-GOCor(NeurIPS 2020)、PWC-Net-GOCor(NeurIPS 2020)、PDC-Net(CVPR 2021)、WarpC 模型(ICCV 2021)、PWarpC 模型(CVPR 2022)的 官方实现,包括训练好的模型和相应的结果。
密集匹配网络
该仓库包含了以下匹配模型的实现。我们为每个数据集和方法提供了预训练模型权重、数据准备、评估命令以及结果。如果您觉得这个库有用,请考虑引用相关的研究论文。
[6] PWarpC:用于弱监督语义对应关系的概率形变一致性。(CVPR 2022)
作者:Prune Truong、Martin Danelljan、Fisher Yu、Luc Van Gool

我们提出了概率形变一致性这一弱监督学习目标,用于语义匹配任务。我们的方法直接监督网络预测的密集匹配分数,这些分数被编码为条件概率分布。我们首先通过将一对展示同一类别不同实例的图像中的其中一张应用已知的形变,构建一个图像三元组。然后利用由此产生的图像三元组所形成的约束条件,推导出我们的概率学习目标。为了进一步考虑真实图像对中存在的遮挡和背景杂乱情况,我们将可学习的未匹配状态扩展到了我们的概率输出空间中。为此,我们设计了一个针对展示不同类别物体的图像对的目标函数来监督这一状态。我们通过将其应用于四种近期的语义匹配架构来验证了我们的方法。我们的弱监督方法在四个具有挑战性的语义匹配基准测试中达到了新的最先进水平。最后,我们还证明,当与关键点标注结合使用时,我们的目标函数在强监督模式下也能带来显著的提升。
[5] PDC-Net+:增强型概率密集对应网络。(TPAMI 2023)
作者:Prune Truong、Martin Danelljan、Radu Timofte、Luc Van Gool
[4] WarpC:用于无监督学习密集对应关系的形变一致性。(ICCV 2021 - 口头报告)
作者:Prune Truong、Martin Danelljan、Fisher Yu、Luc Van Gool
[论文] [网站] [海报] [幻灯片] [视频] [引用]
| 形变一致性图 | 结果 |
|---|---|
![]() |
![]() |
学习密集对应关系的关键挑战在于缺乏真实图像对的真值匹配。虽然光度一致性损失提供了一种无监督的替代方案,但它们难以应对外观变化较大的情况,而这种变化在几何和语义匹配任务中非常常见。此外,依赖于合成训练对的方法往往难以泛化到真实数据上。 我们提出了形变一致性这一无监督学习目标,用于密集对应关系回归任务。即使在外观和视角变化较大的情况下,我们的目标仍然有效。给定一对真实图像,我们首先通过将其中一个原始图像应用随机采样的形变,构建一个图像三元组。随后,我们推导并分析三元组之间产生的一切光流一致性约束条件。基于我们的观察和实验结果,我们设计了一个通用的无监督目标函数,该函数采用了其中两个推导出的约束条件。 我们通过训练三种近期的密集对应网络来验证形变一致性损失在几何和语义匹配任务中的有效性。我们的方法在多个具有挑战性的基准测试中达到了新的最先进水平,包括 MegaDepth、RobotCar 和 TSS。
[3] PDC-Net:学习准确的对应关系及何时信任它们。(CVPR 2021 - 口头报告)
作者:Prune Truong、Martin Danelljan、Luc Van Gool、Radu Timofte
[论文] [网站] [海报] [幻灯片] [视频] [引用]

在大位移或同质区域的情况下,稠密光流估计通常不够准确。对于大多数应用和下游任务,例如姿态估计、图像操作或三维重建,关键在于知道何时以及在哪里可以信任估计出的匹配结果。 在本工作中,我们旨在估计两幅图像之间的稠密光流场,并同时生成一个鲁棒的像素级置信度图,以指示预测的可靠性和准确性。我们开发了一种灵活的概率方法,联合学习光流预测及其不确定性。特别地,我们将预测分布参数化为一种受约束的混合模型,从而更好地建模准确的光流预测和异常值。此外,我们还设计了一种针对自监督训练场景下鲁棒且可泛化的不确定性预测的架构和训练策略。
[2] GOCor:将全局优化的对应体积引入你的神经网络。(NeurIPS 2020)
作者:Prune Truong *、Martin Danelljan *、Luc Van Gool、Radu Timofte
特征相关层是许多涉及图像对之间稠密对应关系的计算机视觉问题中的关键神经网络模块。它通过计算两幅图像中成对位置提取的特征向量之间的密集标量积来预测对应体积。然而,在需要区分图像中多个相似区域时,这种点对点的特征比较是不够的,会严重降低最终任务的性能。 本工作提出了GOCor,一个完全可微分的稠密匹配模块,可直接替代特征相关层。 我们的模块生成的对应体积是内部优化过程的结果,该过程明确考虑了场景中的相似区域。此外,我们的方法能够有效地学习空间匹配先验,以进一步解决匹配歧义。

[1] GLU-Net:用于稠密光流和对应关系的全局-局部通用网络(CVPR 2020 - 口头报告)。
作者:Prune Truong、Martin Danelljan 和 Radu Timofte
[论文]
[网站]
[海报]
[口头报告视频]
[预告片视频]
[引用]

预训练权重
预训练模型可以在模型库中找到。
目录
1. 安装
推理运行要求PyTorch版本 >= 1.0
- 创建并激活一个Python 3.x的conda环境
conda create -n dense_matching_env python=3.7
conda activate dense_matching_env
- 运行以下命令安装所有依赖项(除cupy外,见下文):
pip install numpy opencv-python torch torchvision matplotlib imageio jpeg4py scipy pandas tqdm gdown pycocotools timm
注意:运行代码需要CUDA。事实上,相关层是使用CuPy在CUDA中实现的,因此CuPy是必需的依赖项。可以通过pip install cupy安装,也可以使用CuPy仓库中提供的二进制包之一。代码是在Python 3.7、PyTorch 1.0和CUDA 9.0环境下开发的,所以我安装了适用于cuda90的cupy。如果使用其他版本的CUDA,请相应调整。
pip install cupy-cuda90 --no-cache-dir
- 本仓库包含GOCor作为git子模块。你需要拉取子模块:
git submodule update --init --recursive
git submodule update --recursive --remote
- 运行以下命令创建
admin/local.py文件,并更新数据集路径。我们提供了一个示例admin/local_example.py,其中所有数据集都存储在data/目录下。
python -c "from admin.environment import create_default_local_file; create_default_local_file()"
- 使用命令
bash assets/download_pre_trained_models.sh下载预训练模型权重。更多信息请参阅模型库。
2. 在您自己的图像对上进行测试!
可能的模型选择包括:
- SFNet、PWarpCSFNet_WS、PWarpCSFNet_SS、NCNet、PWarpCNCNet_WS、PWarpCNCNet_SS、CATs、PWarpCCATs_SS、CATs_ft_features、 PWarpCCATs_ft_features_SS、
- UAWarpC(无预训练模型可用)、
- WarpCGLUNet、GLUNet_star、WarpCSemanticGLUNet、
- PDCNet_plus、PDCNet、GLUNet_GOCor_star、
- SemanticGLUNet、GLUNet、GLUNet_GOCor、PWCNet、PWCNet_GOCor
可能的预训练模型选择包括:static、dynamic、chairs_things、chairs_things_ft_sintel、megadepth、 megadepth_stage1、pfpascal、spair
PDCNet 和 PDC-Net+ 推理选项说明
PDC-Net 和 PDC-Net+ 具有多种推理替代选项。 如果模型是 PDC-Net,则需添加以下选项:
- --confidence_map_R,用于计算置信度图 p_r,默认值为 1.0
- --multi_stage_type 可选:
- 'D'(或 'direct')
- 'H'(或 'homography_from_quarter_resolution_uncertainty')
- 'MS'(或 'multiscale_homo_from_quarter_resolution_uncertainty')
- --ransac_thresh,用于单应性和多尺度多阶段类型,默认值为 1.0
- --mask_type,用于对估计的置信度图进行阈值处理,并使用置信匹配点进行内部单应性估计,适用于单应性和多尺度多阶段类型,默认值为 proba_interval_1_above_5
- --homography_visibility_mask,默认值为 True
- --scaling_factors,用于多尺度方法,默认值为 [0.5, 0.6, 0.88, 1, 1.33, 1.66, 2]
当图像对仅表现出有限的视角变化时(例如视频中的连续帧,类似于光流任务),请使用直接方式 ('D')。对于较大的视角变化,请使用单应性 ('H') 或多尺度 ('MS')。
例如,要以单应性方式运行 PDC-Net 或 PDC-Net+,可在命令末尾添加:
PDCNet --multi_stage_type H --mask_type proba_interval_1_above_10
在特定图像对上进行测试
您可以使用 test_models.py 和提供的已训练模型权重,在一对图像上测试这些网络。首先需要选择要使用的模型和预训练权重。输入是查询图像和参考图像的路径。随后图像会被传递到网络中,网络会输出参考图像与查询图像之间的对应光流场。然后根据估计的光流对查询图像进行变形,并保存生成的图像。
对于这对 MegaDepth 图像(用于检查代码是否正常工作)并使用在 megadepth 数据集上训练的 PDCNet (MS),输出如下:
python test_models.py --model PDCNet --pre_trained_model megadepth --path_query_image images/piazza_san_marco_0.jpg --path_reference_image images/piazza_san_marco_1.jpg --save_dir evaluation/ PDCNet --multi_stage_type MS --mask_type proba_interval_1_above_10
其他可选参数:--path_to_pre_trained_models(默认值为 pre_trained_models/)

使用在 dynamic 数据集上训练的 GLU-Net-GOCor,针对这组 eth3d 图像的输出如下:
python test_models.py --model GLUNet_GOCor --pre_trained_model dynamic --path_query_image images/eth3d_query.png --path_reference_image images/eth3d_reference.png --save_dir evaluation/

而对于基线 GLU-Net,输出则为:
python test_models.py --model GLUNet --pre_trained_model dynamic --path_query_image images/eth3d_query.png --path_reference_image images/eth3d_reference.png --save_dir evaluation/

对于 PWC-Net-GOCor 和基线 PWC-Net:
python test_models.py --model PWCNet_GOCor --pre_trained_model chairs_things --path_query_image images/kitti2015_query.png --path_reference_image images/kitti2015_reference.png --save_dir evaluation/

python test_models.py --model PWCNet --pre_trained_model chairs_things --path_query_image images/kitti2015_query.png --path_reference_image images/kitti2015_reference.png --save_dir evaluation/

视频演示
demos/demo_single_pair.ipynb:尝试使用我们的模型处理不同的图像对,计算图像对之间的光流场,并可视化变形后的图像以及置信匹配点。
demos/demo_pose_estimation_and_reconstruction.ipynb:尝试使用我们的模型处理不同图像对(已知相机内参),计算光流场和置信度图,进而推算相对位姿。
运行 在线摄像头或视频演示,重现上方 GIF 中的效果。我们计算目标图像(中间)与源图像(左)之间的光流场,并绘制出前 1000 个最置信的匹配点。右侧显示的是变形后的源图像(应与中间图像相似)。只有那些被预测为高置信度的区域才会显示出来。

我们修改了 SuperGlue 的工具代码,因此在使用时需遵守其许可协议。然后运行:
bash demo/run_demo_confident_matches.sh
- 从一段视频中,将视频的每一帧(左侧)变形到中间帧,如下方 GIF 所示。右侧显示的是变形后的帧(应与中间帧相似)。只有那些被预测为高置信度的区域才会显示出来。

我们同样修改了 SuperGlue 的工具代码,因此在使用时需遵守其许可协议。然后运行:
bash demo/run_demo_warping_videos.sh
- 更多内容即将推出!
3. 概述
该框架由以下子模块组成。
- training:
- actors: 包含用于不同训练的演员类。演员类负责将输入数据通过网络传递并计算损失。 这里还包括预处理类,用于将批量张量输入处理为训练网络所需的理想输入。
- trainers: 执行训练的主要类。
- losses: 包含损失函数类。
- train_settings: 包含设置文件,用于指定网络的训练参数。
- admin: 包含加载网络、TensorBoard等功能,同时也包含环境设置。
- datasets: 集成了多个数据集。此外,还包含生成合成图像对及其对应的真实流场标签,以及添加独立移动物体并相应修改流场的模块。
- utils_data: 包含用于数据处理的函数,例如加载图像、数据增强、采样帧等。
- utils_flow: 包含用于处理流场的函数,例如转换为映射、根据流场扭曲数组,以及可视化工具。
- third_party: 训练所需的外部库,以子模块形式添加。
- models: 包含不同的层和网络定义。
- validation: 包含用于评估和分析网络在预测流场及不确定性方面性能的函数。
4. 基准测试与结果
所有数据集的路径都必须在 admin/local.py 文件中提供。 我们提供了一个示例 admin/local_example.py,其中所有数据集都存储在 data/ 目录下。 在运行评估之前,您需要更新 admin/local.py 中的路径。
PDCNet 和 PDCNet+ 推理选项说明
PDC-Net 和 PDC-Net+ 具有多种推理替代选项。 如果模型是 PDC-Net,则需添加以下选项:
- --confidence_map_R,用于计算置信度图 p_r,默认值为 1.0
- --multi_stage_type,可选:
- 'D'(或 'direct')
- 'H'(或 'homography_from_quarter_resolution_uncertainty')
- 'MS'(或 'multiscale_homo_from_quarter_resolution_uncertainty')
- --ransac_thresh,用于单应性和多尺度多阶段类型,默认值为 1.0
- --mask_type,用于对估计的置信度图进行阈值化,并使用置信匹配进行内部单应性估计,适用于单应性和多尺度多阶段类型,默认值为 proba_interval_1_above_5
- --homography_visibility_mask,默认值为 True
- --scaling_factors,用于多尺度情况,默认值为 [0.5, 0.6, 0.88, 1, 1.33, 1.66, 2]
例如,要使用单应性运行 PDC-Net 或 PDC-Net+,可在命令末尾添加:
PDCNet --multi_stage_type H --mask_type proba_interval_1_above_10
关于结果可重复性的说明
使用 PDC-Net 的多阶段(homography_from_quarter_resolution_uncertainty,H)或多尺度(multiscale_homo_from_quarter_resolution_uncertainty,MS)时,内部会采用 RANSAC 方法。因此,结果可能会略有差异,但应在 1-2% 以内。 对于姿态估计,我们也使用 RANSAC 计算姿态,这会导致结果存在一定变异性。
4.1. 对应关系评估
指标的计算命令如下:
python -u eval_matching.py --dataset 数据集名称 --model 模型名称 --pre_trained_models 预训练模型名称 --optim_iter 优化步数 --local_optim_iter 局部优化步数 --save_dir 保存目录路径
可选参数: --path_to_pre_trained_models:
- 默认值为 pre_trained_models/
- 如果是一个目录路径:则为包含模型权重的目录路径,模型权重的路径将是 path_to_pre_trained_models + 模型名称 + '_' + 预训练模型名称
- 如果直接指向一个检查点路径,则该路径将被用作模型权重的直接路径,而 pre_trained_model_name 仅作为保存指标的名称使用。
MegaDepth
数据准备: 我们使用 RANSAC-Flow 提供的测试集。 该测试集由 1600 对图像组成,并附带一个 CSV 文件('test1600Pairs.csv'),其中包含待评估的图像对名称及相应的地面真实对应关系。 可通过以下命令下载所有内容:
bash assets/download_megadepth_test.sh
最终的文件结构如下:
megadepth_test_set/
└── MegaDepth/
└── Test/
└── test1600Pairs/
└── test1600Pairs.csv
评估: 在 admin/local.py 中更新 'megadepth' 和 'megadepth_csv' 的路径后,即可通过以下命令进行评估:
python eval_matching.py --dataset megadepth --model PDCNet --pre_trained_models megadepth --optim_iter 3 --local_optim_iter 7 --save_dir 保存目录路径 PDCNet --multi_stage_type MS
预计可获得类似的结果:
| 模型 | 预训练模型类型 | PCK-1 (%) | PCK-3 (%) | PCK-5 (%) |
|---|---|---|---|---|
| GLU-Net (本仓库) | 静态 (CityScape-DPED-ADE) | 29.51 | 50.67 | 56.12 |
| GLU-Net (本仓库) | 动态 | 21.59 | 52.27 | 61.91 |
| GLU-Net (论文) | 动态 | 21.58 | 52.18 | 61.78 |
| GLU-Net-GOCor (本仓库) | 静态 (CitySCape-DPED-ADE) | 32.24 | 52.51 | 58.90 |
| GLU-Net-GOCor (本仓库) | 动态 | 37.23 | 61.25 | 68.17 |
| GLU-Net-GOCor (论文) | 动态 | 37.28 | 61.18 | 68.08 |
| ---------------- | ----------------------------- | ------- | ------- | ------- |
| GLU-Net-GOCor* (论文) | megadepth | 57.77 | 78.61 | 82.24 |
| PDC-Net (D) (本仓库) | megadepth | 68.97 | 84.03 | 85.68 |
| PDC-Net (H) (论文) | megadepth | 70.75 | 86.51 | 88.00 |
| PDC-Net (MS) (论文) | megadepth | 71.81 | 89.36 | 91.18 |
| PDC-Net+ (D) (论文) | megadepth | 72.41 | 86.70 | 88.13 |
| PDC-Net+ (H) (论文) | megadepth | 73.92 | 89.21 | 90.48 |
| PDC-Net+ (MS) (论文) | megadepth | 74.51 | 90.69 | 92.10 |
| ---------------- | ----------------------------- | ------- | ------- | ------- |
| GLU-Net* (论文) | megadepth | 38.50 | 54.66 | 59.60 |
| GLU-Net* (本仓库) | megadepth | 38.62 | 54.70 | 59.76 |
| WarpC-GLU-Net (论文) | megadepth | 50.61 | 73.80 | 78.61 |
| WarpC-GLU-Net (本仓库) | megadepth | 50.77 | 73.91 | 78.73 |
RobotCar
数据准备: 图像可以从
视觉定位挑战赛 下载(位于网站底部),更准确地说是从 这里 获取。
包含真实标注对应关系的 CSV 文件可从 这里 下载。
文件结构应如下所示:
RobotCar
├── img/
└── test6511.csv
评估: 在 admin/local.py 中更新 'robotcar' 和 'robotcar_csv' 的路径后,使用以下命令运行评估:
python eval_matching.py --dataset robotcar --model PDCNet --pre_trained_models megadepth --optim_iter 3 --local_optim_iter 7 --save_dir path_to_save_dir PDCNet --multi_stage_type MS
应得到类似的结果:
| 模型 | 预训练模型类型 | PCK-1 (%) | PCK-3 (%) | PCK-5 (%) |
|---|---|---|---|---|
| GLU-Net (论文) | 静态(CityScape-DPED-ADE) | 2.30 | 17.15 | 33.87 |
| GLU-Net-GOCor (论文) | 静态 | 2.31 | 17.62 | 35.18 |
| GLU-Net-GOCor (论文) | 动态 | 2.10 | 16.07 | 31.66 |
| ---------------- | ----------------------------- | ------- | ------- | ------- |
| GLU-Net-GOCor* (论文) | megadepth | 2.33 | 17.21 | 33.67 |
| PDC-Net (H) (论文) | megadepth | 2.54 | 18.97 | 36.37 |
| PDC-Net (MS) (论文) | megadepth | 2.58 | 18.87 | 36.19 |
| PDC-Net+ (D) (论文) | megadepth | 2.57 | 19.12 | 36.71 |
| PDC-Net+ (H) (论文) | megadepth | 2.56 | 19.00 | 36.56 |
| PDC-Net+ (MS) (论文) | megadepth | 2.63 | 19.01 | 36.57 |
| ---------------- | ----------------------------- | ------- | ------- | ------- |
| GLU-Net* (论文) | megadepth | 2.36 | 17.18 | 33.28 |
| WarpC-GLU-Net (论文) | megadepth | 2.51 | 18.59 | 35.92 |
ETH3D
数据准备: 在我们的 GLU-Net 仓库 中执行 'bash assets/download_ETH3D.sh'。
该脚本会完成以下操作:
- 创建根目录 ETH3D/,并在其中创建两个子目录 multiview_testing/ 和 multiview_training/。
- 从 这里 下载“低分辨率多视角、训练数据、所有畸变图像”,并将其解压到 multiview_training/ 目录中。
- 从 这里 下载“低分辨率多视角、测试数据、所有未畸变图像”,并将其解压到 multiview_testing/ 目录中。
- 我们直接提供了以不同间隔拍摄的图像对之间的对应关系。每个数据集和每种间隔速率都有一份打包文件,例如 “lakeside_every_5_rate_of_3”。
这意味着我们每隔 5 张源图像采样一次,而目标图像则是在每张源图像的基础上按特定速率选取的。所有这些文件均可从 这里 下载并解压。
作为示例,您的 ETH3D 根目录应按如下方式组织:
/ETH3D/
multiview_testing/
lakeside/
sand_box/
storage_room/
storage_room_2/
tunnel/
multiview_training/
delivery_area/
electro/
forest/
playground/
terrains/
info_ETH3D_files/
目录的组织非常重要,因为打包文件中包含了相对于 ETH3D 根目录的图像相对路径。
评估: 对于每种间隔速率(3、5、7、9、11、13、15),我们都会计算各个子数据集(如 lakeside、delivery area 等)的指标。最终的指标是各速率下所有数据集的平均值。
在 admin/local.py 中更新 'eth3d' 的路径后,使用以下命令运行评估:
python eval_matching.py --dataset robotcar --model PDCNet --pre_trained_models megadepth --optim_iter 3 --local_optim_iter 7 --save_dir path_to_save_dir PDCNet --multi_stage_type D
图像对之间不同间隔速率下的 AEPE:
| 方法 | 预训练模型类型 | rate=3 | rate=5 | rate=7 | rate=9 | rate=11 | rate=13 | rate=15 |
|---|---|---|---|---|---|---|---|---|
| LiteFlowNet | chairs-things | 1.66 | 2.58 | 6.05 | 12.95 | 29.67 | 52.41 | 74.96 |
| PWC-Net | chairs-things | 1.75 | 2.10 | 3.21 | 5.59 | 14.35 | 27.49 | 43.41 |
| PWC-Net-GOCor | chairs-things | 1.70 | 1.98 | 2.58 | 4.22 | 10.32 | 21.07 | 38.12 |
| --------------- | ------------------------ | -------- | -------- | -------- | -------- | --------- | --------- | --------- |
| DGC-Net | 2.49 | 3.28 | 4.18 | 5.35 | 6.78 | 9.02 | 12.23 | |
| GLU-Net | static | 1.98 | 2.54 | 3.49 | 4.24 | 5.61 | 7.55 | 10.78 |
| GLU-Net | dynamic | 2.01 | 2.46 | 2.98 | 3.51 | 4.30 | 6.11 | 9.08 |
| GLU-Net-GOCor | dynamic | 1.93 | 2.28 | 2.64 | 3.01 | 3.62 | 4.79 | 7.80 |
| --------------- | ------------------------ | -------- | -------- | -------- | -------- | --------- | --------- | --------- |
| GLU-Net-GOCor* | megadepth | 1.68 | 1.92 | 2.18 | 2.43 | 2.89 | 3.31 | 4.27 |
| PDC-Net (D) (论文) | megadepth | 1.60 | 1.79 | 2.03 | 2.26 | 2.58 | 2.92 | 3.69 |
| PDC-Net (H) | megadepth | 1.58 | 1.77 | 1.98 | 2.24 | 2.56 | 2.91 | 3.73 |
| PDC-Net (MS) | megadepth | 1.60 | 1.79 | 2.00 | 2.26 | 2.57 | 2.90 | 3.56 |
| PDC-Net+ (H) (论文) | megadepth | 1.56 | 1.74 | 1.96 | 2.18 | 2.48 | 2.73 | 3.24 |
| PDC-Net+ (MS) (论文) | megadepth | 1.58 | 1.76 | 1.96 | 2.16 | 2.49 | 2.73 | 3.24 |
图像对之间不同间隔速率下的 PCK-1:
请注意,PCK 是 逐图像 计算的,然后按序列取平均值。最终的指标是所有序列的平均值。这对应于输出的指标文件中的 '_per_image' 结果。
需要注意的是,这与 PDC-Net 论文 中使用的指标不同,在那篇论文中,PCK 是 按序列 计算的,采用的是 PDC-Net 的直接方法(对应于输出指标文件中的 '-per-rate' 结果)。
| 方法 | 预训练模型类型 | rate=3 | rate=5 | rate=7 | rate=9 | rate=11 | rate=13 | rate=15 |
|---|---|---|---|---|---|---|---|---|
| LiteFlowNet | chairs-things | 61.63 | 56.55 | 49.83 | 42.00 | 33.14 | 26.46 | 21.22 |
| PWC-Net | chairs-things | 58.50 | 52.02 | 44.86 | 37.41 | 30.36 | 24.75 | 19.89 |
| PWC-Net-GOCor | chairs-things | 58.93 | 53.10 | 46.91 | 40.93 | 34.58 | 29.25 | 24.59 |
| --------------- | ------------------------ | -------- | -------- | -------- | -------- | --------- | --------- | --------- |
| DGC-Net | ||||||||
| GLU-Net | static | 50.55 | 43.08 | 36.98 | 32.45 | 28.45 | 25.06 | 21.89 |
| GLU-Net | dynamic | 46.27 | 39.28 | 34.05 | 30.11 | 26.69 | 23.73 | 20.85 |
| GLU-Net-GOCor | dynamic | 47.97 | 41.79 | 36.81 | 33.03 | 29.80 | 26.93 | 23.99 |
| --------------- | ------------------------ | -------- | -------- | -------- | -------- | --------- | --------- | --------- |
| GLU-Net-GOCor* | megadepth | 59.40 | 55.15 | 51.18 | 47.86 | 44.46 | 41.78 | 38.91 |
| PDC-Net (D) | megadepth | 61.82 | 58.41 | 55.02 | 52.40 | 49.61 | 47.43 | 45.01 |
| PDC-Net (H) | megadepth | 62.63 | 59.29 | 56.09 | 53.31 | 50.69 | 48.46 | 46.17 |
| PDC-Net (MS) | megadepth | 62.29 | 59.14 | 55.87 | 53.23 | 50.59 | 48.45 | 46.17 |
| PDC-Net+ (H) | megadepth | 63.12 | 59.93 | 56.81 | 54.12 | 51.59 | 49.55 | 47.32 |
| PDC-Net+ (MS) | megadepth | 62.95 | 59.76 | 56.64 | 54.02 | 51.50 | 49.38 | 47.24 |
PCK-5 对于不同图像对间隔率的情况:
| 方法 | 预训练模型类型 | rate=3 | rate=5 | rate=7 | rate=9 | rate=11 | rate=13 | rate=15 |
|---|---|---|---|---|---|---|---|---|
| LiteFlowNet | chairs-things | 92.79 | 90.70 | 86.29 | 78.50 | 66.07 | 55.05 | 46.29 |
| PWC-Net | chairs-things | 92.64 | 90.82 | 87.32 | 81.80 | 72.95 | 64.07 | 55.47 |
| PWC-Net-GOCor | chairs-things | 92.81 | 91.45 | 88.96 | 85.53 | 79.44 | 72.06 | 64.92 |
| --------------- | ------------------------ | -------- | -------- | -------- | -------- | --------- | --------- | --------- |
| DGC-Net | 88.50 | 83.25 | 78.32 | 73.74 | 69.23 | 64.28 | 58.66 | |
| GLU-Net | static | 91.22 | 87.91 | 84.23 | 80.74 | 76.84 | 72.35 | 67.77 |
| GLU-Net | dynamic | 91.45 | 88.57 | 85.64 | 83.10 | 80.12 | 76.66 | 73.02 |
| GLU-Net-GOCor | dynamic | 92.08 | 89.87 | 87.77 | 85.88 | 83.69 | 81.12 | 77.90 |
| --------------- | ------------------------ | -------- | -------- | -------- | -------- | --------- | --------- | --------- |
| GLU-Net-GOCor* | megadepth | 93.03 | 92.13 | 91.04 | 90.19 | 88.98 | 87.81 | 85.93 |
| PDC-Net (D) (paper) | megadepth | 93.47 | 92.72 | 91.84 | 91.15 | 90.23 | 89.45 | 88.10 |
| PDC-Net (H) | megadepth | 93.50 | 92.71 | 91.93 | 91.16 | 90.35 | 89.52 | 88.32 |
| PDC-Net (MS) | megadepth | 93.47 | 92.69 | 91.85 | 91.15 | 90.33 | 89.55 | 88.43 |
| PDC-Net+ (H) | megadepth | 93.54 | 92.78 | 92.04 | 91.30 | 90.60 | 89.9 | 89.03 |
| PDC-Net+ (MS) | megadepth | 93.50 | 92.79 | 92.04 | 91.35 | 90.60 | 89.97 | 88.97 |
HPatches
数据准备: 使用以下命令下载数据:
bash assets/download_hpatches.sh
每个视点ID对应的CSV文件,其中包含图像路径和对应图像对之间的单应性参数,列在assets/目录中。
评估: 在admin/local.py中更新'hp'的路径后,使用以下命令进行评估:
python eval_matching.py --dataset hp --model GLUNet_GOCor --pre_trained_models static --optim_iter 3 --local_optim_iter 7 --save_dir path_to_save_dir
应得到类似的结果:
| 预训练模型类型 | AEPE | PCK-1 (%) | PCK-3 (%) | PCK-5 (%) | |
|---|---|---|---|---|---|
| DGC-Net [Melekhov2019] | 33.26 | 12.00 | 58.06 | ||
| GLU-Net (本仓库) | static | 25.05 | 39.57 | 71.45 | 78.60 |
| GLU-Net (论文) | static | 25.05 | 39.55 | - | 78.54 |
| GLU-Net-GOCor (本仓库) | static | 20.16 | 41.49 | 74.12 | 81.46 |
| GLU-Net-GOCor (论文) | static | 20.16 | 41.55 | - | 81.43 |
| --------------- | ------------------------ | -------- | -------- | -------- | -------- |
| PDCNet (D) (本仓库) | megadepth | 19.40 | 43.94 | 78.51 | 85.81 |
| PDCNet (H) (本仓库) | megadepth | 17.51 | 48.69 | 82.71 | 89.44 |
KITTI
数据准备: KITTI-2012和2015数据集均可在此处获取 http://www.cvlibs.net/datasets/kitti/eval_flow.php
评估: 在admin/local.py中更新'kitti2012'和'kitti2015'的路径后,使用以下命令进行评估:
python eval_matching.py --dataset kitti2015 --model PDCNet --pre_trained_models megadepth --optim_iter 3 --local_optim_iter 7 PDCNet --multi_stage_type direct
应得到类似的结果:
| KITTI-2012 | KITTI-2015 | ||||
|---|---|---|---|---|---|
| Models | Pre-trained model type | AEPE | F1 (%) | AEPE | F1 (%) |
| PWC-Net-GOCor (this repo) | chairs-things | 4.12 | 19.58 | 10.33 | 31.23 |
| PWC-Net-GOCor (paper) | chairs-things | 4.12 | 19.31 | 10.33 | 30.53 |
| PWC-Net-GOCor (this repo) | chairs-things ft sintel | 2.60 | 9.69 | 7.64 | 21.36 |
| PWC-Net-GOCor (paper) | chairs-things ft sintel | 2.60 | 9.67 | 7.64 | 20.93 |
| ---------------- | ------------------------- | ------------ | ------------- | ------------ | ----------- |
| GLU-Net (this repo) | static | 3.33 | 18.91 | 9.79 | 37.77 |
| GLU-Net (this repo) | dynamic | 3.12 | 19.73 | 7.59 | 33.92 |
| GLU-Net (paper) | dynamic | 3.14 | 19.76 | 7.49 | 33.83 |
| GLU-Net-GOCor (this repo) | dynamic | 2.62 | 15.17 | 6.63 | 27.58 |
| GLU-Net-GOCor (paper) | dynamic | 2.68 | 15.43 | 6.68 | 27.57 |
| ---------------- | ------------------------- | ------------ | ------------- | ------------ | ----------- |
| GLU-Net-GOCor* (paper) | megadepth | 2.26 | 9.89 | 5.53 | 18.27 |
| PDC-Net (D) (paper and this repo) | megadepth | 2.08 | 7.98 | 5.22 | 15.13 |
| PDC-Net (H) (this repo) | megadepth | 2.16 | 8.19 | 5.31 | 15.23 |
| PDC-Net (MS) (this repo) | megadepth | 2.16 | 8.13 | 5.40 | 15.33 |
| PDC-Net+ (D) (paper) | megadepth | 1.76 | 6.60 | 4.53 | 12.62 |
Sintel
数据准备: 使用以下命令下载数据
bash assets/download_sintel.sh
评估: 在 admin/local.py 中更新 'sintel' 的路径后,使用以下命令进行评估:
python eval_matching.py --dataset sintel --model PDCNet --pre_trained_models megadepth --optim_iter 3 --local_optim_iter 7 --save_dir path_to_save_dir PDCNet --multi_stage_type direct
应得到类似的结果:
| Pre-trained model type | AEPE | PCK-1 / dataset (%) | PCK-5 / dataset (%) | AEPE | PCK-1 / dataset (%) | PCK-5 / dataset (%) | |
|---|---|---|---|---|---|---|---|
| PWC-Net-GOCor (this repo) | chairs-things | 2.38 | 82.18 | 94.14 | 3.70 | 77.36 | 91.20 |
| PWC-Net-GOCor (paper) | chairs-things | 2.38 | 82.17 | 94.13 | 3.70 | 77.34 | 91.20 |
| PWC-Net-GOCor (paper) | chairs-things ft sintel | (1.74) | (87.93) | (95.54) | (2.28) | (84.15) | (93.71) |
| --------------- | -------------------- | -------- | ------------- | -------------- | -------- | ------------- | -------------- |
| GLU-Net (this repo) | dynamic | 4.24 | 62.21 | 88.47 | 5.49 | 58.10 | 85.16 |
| GLU-Net (paper) | dynamic | 4.25 | 62.08 | 88.40 | 5.50 | 57.85 | 85.10 |
| GLU-Net-GOCor (this repo) | dynamic | 3.77 | 67.11 | 90.47 | 4.85 | 63.36 | 87.76 |
| GLU-Net-GOCor (paper) | dynamic | 3.80 | 67.12 | 90.41 | 4.90 | 63.38 | 87.69 |
| --------------- | ----------------- | -------- | ------------- | -------------- | -------- | ------------- | -------------- |
| GLU-Net-GOCor* (paper) | megadepth | 3.12 | 80.00 | 92.68 | 4.46 | 73.10 | 88.94 |
| PDC-Net (D) (this repo) | megadepth | 3.30 | 85.06 | 93.38 | 4.48 | 78.07 | 90.07 |
| PDC-Net (H) (this repo) | megadepth | 3.38 | 84.95 | 93.35 | 4.50 | 77.62 | 90.07 |
| PDC-Net (MS) (this repo) | megadepth | 3.40 | 84.85 | 93.33 | 4.54 | 77.41 | 90.06 |
TSS
数据准备: 要下载图像,请运行:
bash assets/download_tss.sh
评估: 在 admin/local.py 中更新 'tss' 的路径后,使用以下命令进行评估:
python eval_matching.py --dataset TSS --model GLUNet_GOCor --pre_trained_models static --optim_iter 3 --local_optim_iter 7 --flipping_condition True --save_dir path_to_save_dir
应得到类似的结果:
| Model | Pre-trained model type | FGD3Car | JODS | PASCAL | All |
|---|---|---|---|---|---|
| Semantic-GLU-Net [1] | Static | 94.4 | 75.5 | 78.3 | 82.8 |
| GLU-Net (our repo) | Static | 93.2 | 73.69 | 71.1 | 79.33 |
| GLU-Net (paper) | Static | 93.2 | 73.3 | 71.1 | 79.2 |
| GLU-Net-GOCor (our repo, GOCor iter=3, 3) | Static | 94.6 | 77.9 | 77.7 | 83.4 |
| GLU-Net-GOCor (our repo, GOCor iter=3, 7) | Static | 94.6 | 77.6 | 77.1 | 83.1 |
| GLU-Net-GOCor (paper) | Static | 94.6 | 77.9 | 77.7 | 83.4 |
| Semantic-GLU-Net [4] | pfpascal | 95.3 | 82.2 | 78.2 | |
| WarpC-SemanticGLU-Net | pfpascal | 97.1 | 84.7 | 79.7 | 87.2 |
数据准备: 要下载图像,请运行:
bash assets/download_pf_pascal.sh
评估: 在 admin/local.py 中更新 'PFPascal' 的路径后,使用以下命令进行评估:
python eval_matching.py --dataset PFPascal --model WarpCSemanticGLUNet --pre_trained_models pfpascal --flipping_condition False --save_dir path_to_save_dir
应得到类似的结果:
| Model | Pre-trained model type | alpha=0.05 | alpha=0.1 |
|---|---|---|---|
| Semantic-GLU-Net [1] | static (paper) | 46.0 | 70.6 |
| Semantic-GLU-Net [1] | static (this repo) | 45.3 | 70.3 |
| Semantic-GLU-Net [4] (this repo) | pfpascal | 48.4 | 72.4 |
| WarpC-SemanticGLU-Net [4] (paper) | pfpascal | 62.1 | 81.7 |
| WarpC-SemanticGLU-Net [4] (this repo) | pfpascal | 62.7 | 81.7 |
PF-Willow
数据准备: 要下载图像,请运行:
bash assets/download_pf_willow.sh
评估:在 admin/local.py 中更新 'PFWillow' 的路径后,使用以下命令运行评估:
python eval_matching.py --dataset PFWillow --model WarpCSemanticGLUNet --pre_trained_models pfpascal --flipping_condition False --save_dir path_to_save_dir
应得到类似的结果:
| 模型 | 预训练模型类型 | alpha=0.05 | alpha=0.1 |
|---|---|---|---|
| Semantic-GLU-Net [1] (论文) | static | 36.4 | 63.8 |
| Semantic-GLU-Net [1] (本仓库) | static | 36.2 | 63.7 |
| Semantic-GLU-Net [4] | pfpascal | 39.7 | 67.6 |
| WarpC-SemanticGLU-Net [4] (论文) | pfpascal | 49.0 | 75.1 |
| WarpC-SemanticGLU-Net [4] (本仓库) | pfpascal | 48.9 | 75.2 |
Spair-71k
数据准备:要下载图像,运行:
bash assets/download_spair.sh
评估:在 admin/local.py 中更新 'spair' 的路径后,使用以下命令运行评估:
python eval_matching.py --dataset spair --model WarpCSemanticGLUNet --pre_trained_models pfpascal --flipping_condition False --save_dir path_to_save_dir
应得到类似的结果:
| 模型 | 预训练模型类型 | alpha=0.1 |
|---|---|---|
| Semantic-GLU-Net [1] | static | 15.1 |
| Semantic-GLU-Net [4] | pfpascal | 16.5 |
| WarpC-SemanticGLU-Net | spair | 23.5 |
| WarpC-SemanticGLU-Net [4] | pfpascal | 23.8 |
Caltech-101
数据准备:要下载图像,运行:
bash assets/download_caltech.sh
评估:在 admin/local.py 中更新 'spair' 的路径后,使用以下命令运行评估:
python eval_matching.py --dataset caltech --model WarpCSemanticGLUNet --pre_trained_models pfpascal --flipping_condition False --save_dir path_to_save_dir
4.2 姿态估计
指标通过以下命令计算:
python -u eval_pose_estimation.py --dataset dataset_name --model model_name --pre_trained_models pre_trained_model_name --optim_iter optim_step --local_optim_iter local_optim_iter --estimate_at_quarter_reso True --mask_type_for_pose_estimation proba_interval_1_above_10 --save_dir path_to_save_dir
YFCC100M
数据准备:YFCC 的真值标注文件为 assets/yfcc_test_pairs_with_gt_original.txt(来自 SuperGlue 仓库)。 图像可以从 OANet 仓库 下载,并移动到所需位置:
bash assets/download_yfcc.sh
文件结构应为:
YFCC
└── images/
├── buckingham_palace/
├── notre_dame_front_facade/
├── reichstag/
└── sacre_coeur/
评估:在 admin/local.py 中更新 'yfcc' 的路径后,使用 PDC-Net 单应矩阵 (H) 在 YFCC100M 上计算指标,命令如下:
python -u eval_pose_estimation.py --dataset YFCC --model PDCNet --pre_trained_models megadepth --optim_iter 3 --local_optim_iter 7 --estimate_at_quarter_reso True --mask_type_for_pose_estimation proba_interval_1_above_10 --save_dir path_to_save_dir PDCNet --multi_stage_type H --mask_type proba_interval_1_above_10
您应该会得到类似的指标(由于 RANSAC 的影响,可能不会完全相同):
| mAP @5 | mAP @10 | mAP @20 | 运行时间 (s) | |
|---|---|---|---|---|
| PDC-Net (D) | 60.52 | 70.91 | 80.30 | 0. |
| PDC-Net (H) | 63.90 | 73.00 | 81.22 | 0.74 |
| PDC-Net (MS) | 65.18 | 74.21 | 82.42 | 2.55 |
| PDC-Net+ (D) | 63.93 | 73.81 | 82.74 | |
| PDC-Net+ (H) | 67.35 | 76.56 | 84.56 | 0.74 |
ScanNet
数据准备:ScanNet 测试集的图像(100 场景,scene0707_00 至 scene0806_00)在此处提供: 这里。 这些图像提取自 ScanNet GitHub 仓库,并经过处理。 我们使用 SuperGlue 仓库 提供的真值标注文件 assets/scannet_test_pairs_with_gt.txt。
评估:在 admin/local.py 中更新 'scannet_test' 的路径后,使用 PDC-Net 单应矩阵 (H) 在 ScanNet 上计算指标,命令如下:
python -u eval_pose_estimation.py --dataset scannet --model PDCNet --pre_trained_models megadepth --optim_iter 3 --local_optim_iter 7 --estimate_at_quarter_reso True --mask_type_for_pose_estimation proba_interval_1_above_10 --save_dir path_to_save_dir PDCNet --multi_stage_type H --mask_type proba_interval_1_above_10
您应该会得到类似的指标(由于 RANSAC 的影响,可能不会完全相同):
| mAP @5 | mAP @10 | mAP @20 | |
|---|---|---|---|
| PDC-Net (D) | 39.93 | 50.17 | 60.87 |
| PDC-Net (H) | 42.87 | 53.07 | 63.25 |
| PDC-Net (MS) | 42.40 | 52.83 | 63.13 |
| PDC-Net+ (D) | 42.93 | 53.13 | 63.95 |
| PDC-Net+ (H) | 45.66 | 56.67 | 67.07 |
4.3 HPatches 上的稀疏评估
我们在此处提供了 HPatches 稀疏评估结果的缓存链接: 这里。 更多详情请参阅 [PDC-Net+](https://arxiv.org/abs/2109.13912)。
5. 训练
快速入门
安装过程中应已生成本地配置文件 "admin/local.py"。
如果未生成该文件,请运行以下命令以创建:
python -c "from admin.environment import create_default_local_file; create_default_local_file()"。
接下来,设置训练工作区的路径,即保存模型权重和检查点的目录。
同时设置您想要使用的数据集的路径(这些数据集需要提前下载,详见下文)。
如果所有依赖项都已正确安装,您可以在正确的 conda 环境中使用 run_training.py 脚本训练网络。
conda activate dense_matching_env
python run_training.py train_module train_name
其中,train_module 是 train_settings 内的子模块,train_name 是要使用的训练设置文件名。
例如,您可以使用附带的默认 train_PDCNet_stage1 设置进行训练,运行以下命令:
python run_training.py PDCNet train_PDCNet_stage1
训练数据集下载
DPED-CityScape-ADE
这是与 GLU-Net 仓库 中使用的相同图像对。 在训练过程中,我们结合使用了 DPED、CityScapes 和 ADE-20K 数据集。 DPED 训练数据集仅由四台不同相机拍摄的约 5000 组图像组成。 我们使用其中两台相机的图像,最终得到大约 10,000 张图像。 CityScapes 额外增加了约 23,000 张图像。 我们再从 ADE-20K 中随机抽取一些最低分辨率为 750x750 的图像作为补充。 这样总共得到了 40,000 张原始图像,通过对其施加几何变换来生成训练用的图像对。 原始图像的路径以及几何变换参数均记录在 CSV 文件中: 'assets/csv_files/homo_aff_tps_train_DPED_CityScape_ADE.csv' 和 'assets/csv_files/homo_aff_tps_test_DPED_CityScape_ADE.csv'。
- 下载原始图像
下载 DPED 数据集 (54 GB) ==> 图像将被存放在 original_images/ 目录下
-
- 下载 'leftImg8bit_trainvaltest.zip' (11GB,包含训练、验证和测试集的左视图8位图像,共5000张) ==> 图像将被存放在 CityScape/ 目录下
- 下载 leftImg8bit_trainextra.zip (44GB,包含额外训练集的左视图8位图像,共19998张) ==> 图像将被存放在 CityScape_extra/ 目录下
下载 ADE-20K 数据集 (3.8 GB,20,210 张图像) ==> 图像将被存放在 ADE20K_2016_07_26/ 目录下
请将所有数据集放置在同一目录下。示例性的根训练目录结构如下:
training_datasets/
├── original_images/
├── CityScape/
├── CityScape_extra/
└── ADE20K_2016_07_26/
- 将合成图像对及光流保存至磁盘
在训练过程中,可以从这些原始图像中每轮迭代动态生成合成图像对。 然而,这种数据集的生成需要一定时间,且由于每轮迭代不会进行数据增强,因此也可以预先生成数据集并将其保存到磁盘上。 在训练时,只需从磁盘加载构成训练数据集的图像对,然后再送入网络处理,这样会快得多。 要生成训练数据集并将其保存到磁盘:
python assets/save_training_dataset_to_disk.py --image_data_path /directory/to/original/training_datasets/
--csv_path assets/homo_aff_tps_train_DPED_CityScape_ADE.csv --save_dir /path/to/save_dir --plot True
这将会在 save_dir/images 和 save_dir/flow 分别生成图像对及其对应的光流场。
- 在 admin/local.py 中添加路径,分别命名为 'training_cad_520' 和 'validation_cad_520'
COCO
这对于添加运动物体非常有用。 请从 这里 下载图像及其标注文件。根文件夹应按以下方式组织:
coco_root
└── annotations
└── instances_train2014.json
└──images
└── train2014
然后在 admin/local.py 中将路径添加为 'coco'。
MegaDepth
我们使用 D2-Net 仓库 提供的重建结果。 您可以直接从 这里 - Google Drive 下载去畸变后的重建结果及聚合的场景信息文件夹。
文件结构应如下所示:
MegaDepth
├── Undistorted_Sfm
└── scene_info
然后在 admin/local.py 中将路径添加为 'megadepth_training'。
训练脚本
目前该框架包含了以下匹配网络的训练代码。 设置文件可用于训练网络,或了解确切的训练细节。
UAWarpC
这是基于我们最近的工作 Refign,其代码可在 GitHub 上找到。 它允许无监督地训练概率对应网络(结合了 PDCNet 和 WarpC)。 该网络使用简化的 PDCNet 版本,去除了 GOCor 模块,并且在每个像素点预测单模态高斯概率分布,而非拉普拉斯混合模型。
UAWarpC.train_UAWarpC_PDCNet_stage1: 默认设置用于第一阶段网络训练,不使用可见性掩码。 我们在 MegaDepth 数据集的真实图像对上进行训练。
UAWarpC.train_UAWarpC_PDCNet_stage2: 我们进一步微调第一阶段训练得到的网络,加入了我们的可见性掩码。
概率性形变一致性 (PWarpC)
PWarpC.train_weakly_supervised_PWarpC_SFNet_pfpascal: 默认设置用于在 PF-Pascal 数据集上训练弱监督的 PWarpC-SF-Net。
PWarpC.train_weakly_supervised_PWarpC_SFNet_spair_from_pfpascal: 默认设置用于在 SPair 数据集上训练弱监督的 PWarpC-SF-Net。 具体来说,先在 PF-Pascal 数据集上训练(如上所述),然后再在 SPair-71K 数据集上进行微调。
PWarpC.train_strongly_supervised_PWarpC_SFNet_pfpascal: 默认设置用于在 PF-Pascal 数据集上训练强监督的 PWarpC-SF-Net。
PWarpC.train_strongly_supervised_PWarpC_SFNet_spair_from_pfpascal: 默认设置用于在 SPair-71K 数据集上训练强监督的 PWarpC-SF-Net。
其余部分待续
形变一致性 (WarpC)
WarpC.train_WarpC_GLUNet_stage1: 默认设置用于第一阶段网络训练,不使用可见性掩码。 我们在 MegaDepth 数据集的真实图像对上进行训练。
WarpC.train_WarpC_GLUNet_stage2: 我们进一步微调第一阶段训练得到的网络,加入了我们的可见性掩码。 该网络即为最终的 WarpC-GLU-Net(参见 WarpC 论文)。
WarpC.train_ft_WarpCSemanticGLUNet: 默认设置用于训练最终的 WarpC-语义GLU-Net(参见 WarpC 论文)。 我们将原本在静态/CAD 合成数据上训练的语义GLU-Net,利用形变一致性技术在 PF-Pascal 数据集上进行了微调。
PDC-Net 和 PDC-Net+
PDCNet.train_PDCNet_plus_stage1: 用于第一阶段网络训练的默认设置,其中骨干网络权重固定。 我们首先在DPED、CityScape和ADE数据集上使用预先计算并保存的合成图像对进行训练, 并在这些图像对上添加多个独立移动的对象及扰动。此外,我们还应用了对象重投影掩码。
PDCNet.train_PDCNet_plus_stage2: 用于训练最终PDC-Net+模型的默认设置(参见PDC-Net+论文)。 该设置会对使用PDCNet_stage1训练得到的模型中的所有层进行微调,包括特征骨干网络。训练数据集由第一阶段使用的相同数据集,以及来自MegaDepth数据集的图像对及其稀疏的地面真值对应关系数据组成。同时,我们也应用了重投影掩码。
PDCNet.train_PDCNet_stage1: 用于第一阶段网络训练的默认设置,其中骨干网络权重固定。 我们使用预训练的ImageNet权重初始化骨干网络VGG-16。首先在DPED、CityScape和ADE数据集上使用预先计算并保存的合成图像对进行训练, 并在这些图像对上添加独立移动的对象及扰动。
PDCNet.train_PDCNet_stage2: 用于训练最终PDC-Net模型的默认设置(参见PDC-Net论文)。 该设置会对使用PDCNet_stage1训练得到的模型中的所有层进行微调,包括特征骨干网络。训练数据集由第一阶段使用的相同数据集,以及来自MegaDepth数据集的图像对及其稀疏的地面真值对应关系数据组成。
PDCNet.train_GLUNet_GOCor_star_stage1: 设置与PDCNet_stage1相同,但使用不同的模型(非概率基线)。损失函数相应地改为L1损失,而非负对数似然损失。
PDCNet.train_GLUNet_GOCor_star_stage2: 用于训练最终GLU-Net-GOCor*的默认设置(参见PDCNet论文)。
使用随机生成数据的训练示例
- GLUNet.train_GLUNet_with_synthetically_generated_data: 这是一个简单的示例,说明如何实时生成随机变换,并将其应用于原始图像,以创建训练图像对及其对应的地面真值光流。此处,随机变换被应用于MegaDepth图像。在生成的图像对和地面真值光流基础上,我们进一步添加了一个随机移动的对象。
GLU-Net
GLUNet.train_GLUNet_static: 用于训练最终GLU-Net的默认设置(出自论文GLU-Net)。 我们固定骨干网络权重,并使用预训练的ImageNet权重初始化骨干网络VGG-16。 训练数据为DPED、CityScape和ADE数据集上的合成图像对(预先计算并保存),这些数据后来在GOCor论文中被称为“静态”数据集。
GLUNet.train_GLUNet_dynamic: 用于训练最终GLU-Net的默认设置,该模型基于动态数据集进行训练(出自论文GOCor)。 我们同样固定骨干网络权重,并使用预训练的ImageNet权重初始化骨干网络VGG-16。 训练数据为DPED、CityScape和ADE数据集上的合成图像对(预先计算并保存),并在这些图像对上添加一个独立移动的对象。 该数据集在GOCor论文中被称为“动态”数据集。
GLUNet.train_GLUNet_GOCor_static: 用于训练最终GLU-Net-GOCor的默认设置(出自论文GOCor)。 我们固定骨干网络权重,并使用预训练的ImageNet权重初始化骨干网络VGG-16。 训练数据为DPED、CityScape和ADE数据集上的合成图像对(预先计算并保存),这些数据后来在GOCor论文中被称为“静态”数据集。
GLUNet.train_GLUNet_GOCor_dynamic: 用于训练最终GLU-Net-GOCor的默认设置,该模型基于动态数据集进行训练(出自论文GOCor)。 我们固定骨干网络权重,并使用预训练的ImageNet权重初始化骨干网络VGG-16。 训练数据为DPED、CityScape和ADE数据集上的合成图像对(预先计算并保存),并在这些图像对上添加一个独立移动的对象。 该数据集在GOCor论文中被称为“动态”数据集。
训练您自己的网络
要使用该工具包训练自定义网络,需要在训练设置中指定以下组件。 参考示例:train_GLUNet_static.py。
- 数据集:用于训练的数据集。datasets模块中已提供若干标准匹配数据集。数据集类可以传入一个处理函数,该函数应在将数据分批之前执行必要的处理操作,例如数据增强和转换为张量。
- 数据加载器:决定如何采样批次。可使用特定的采样器。
- 网络:待训练的网络模块。
- 批次预处理模块:负责接收批次并将其转换为网络训练所需的输入。具体实现取决于不同的网络和训练策略。
- 目标函数:训练目标。
- 演员:训练师将训练批次传递给演员,由演员负责正确地将数据通过网络,并计算训练损失。批次预处理也在演员类中完成。
- 优化器:所使用的优化器,例如Adam。
- 调度器:所使用的调度器。
- 训练师:运行训练轮次并保存检查点的主要类。
6. 致谢
我们借鉴了多个公开项目的代码,例如pytracking、GLU-Net、 DGC-Net、PWC-Net、 NC-Net、Flow-Net-Pytorch、 RAFT、CATs...
7. 变更日志
- 2021年6月21日:添加了评估代码
- 2021年7月21日:添加了训练代码及更多评估选项
- 2021年8月21日:修复了混合数据集中的内存泄漏问题,并为Megadepth数据集增加了其他采样方式
- 2021年10月21日:添加了WarpC的预训练模型
- 2021年12月21日:添加了WarpC和PDC-Net+的训练代码,以及随机生成的数据、Caltech数据集的评估代码、PDC-Net+的预训练模型和笔记本演示
- 2022年2月22日:进行了小幅修改
- 2022年3月22日:进行了大规模重构,新增了视频演示、PWarpC的代码,并将反卷积层的默认初始化设置为双线性插值权重。
常见问题
相似工具推荐
openclaw
OpenClaw 是一款专为个人打造的本地化 AI 助手,旨在让你在自己的设备上拥有完全可控的智能伙伴。它打破了传统 AI 助手局限于特定网页或应用的束缚,能够直接接入你日常使用的各类通讯渠道,包括微信、WhatsApp、Telegram、Discord、iMessage 等数十种平台。无论你在哪个聊天软件中发送消息,OpenClaw 都能即时响应,甚至支持在 macOS、iOS 和 Android 设备上进行语音交互,并提供实时的画布渲染功能供你操控。 这款工具主要解决了用户对数据隐私、响应速度以及“始终在线”体验的需求。通过将 AI 部署在本地,用户无需依赖云端服务即可享受快速、私密的智能辅助,真正实现了“你的数据,你做主”。其独特的技术亮点在于强大的网关架构,将控制平面与核心助手分离,确保跨平台通信的流畅性与扩展性。 OpenClaw 非常适合希望构建个性化工作流的技术爱好者、开发者,以及注重隐私保护且不愿被单一生态绑定的普通用户。只要具备基础的终端操作能力(支持 macOS、Linux 及 Windows WSL2),即可通过简单的命令行引导完成部署。如果你渴望拥有一个懂你
stable-diffusion-webui
stable-diffusion-webui 是一个基于 Gradio 构建的网页版操作界面,旨在让用户能够轻松地在本地运行和使用强大的 Stable Diffusion 图像生成模型。它解决了原始模型依赖命令行、操作门槛高且功能分散的痛点,将复杂的 AI 绘图流程整合进一个直观易用的图形化平台。 无论是希望快速上手的普通创作者、需要精细控制画面细节的设计师,还是想要深入探索模型潜力的开发者与研究人员,都能从中获益。其核心亮点在于极高的功能丰富度:不仅支持文生图、图生图、局部重绘(Inpainting)和外绘(Outpainting)等基础模式,还独创了注意力机制调整、提示词矩阵、负向提示词以及“高清修复”等高级功能。此外,它内置了 GFPGAN 和 CodeFormer 等人脸修复工具,支持多种神经网络放大算法,并允许用户通过插件系统无限扩展能力。即使是显存有限的设备,stable-diffusion-webui 也提供了相应的优化选项,让高质量的 AI 艺术创作变得触手可及。
everything-claude-code
everything-claude-code 是一套专为 AI 编程助手(如 Claude Code、Codex、Cursor 等)打造的高性能优化系统。它不仅仅是一组配置文件,而是一个经过长期实战打磨的完整框架,旨在解决 AI 代理在实际开发中面临的效率低下、记忆丢失、安全隐患及缺乏持续学习能力等核心痛点。 通过引入技能模块化、直觉增强、记忆持久化机制以及内置的安全扫描功能,everything-claude-code 能显著提升 AI 在复杂任务中的表现,帮助开发者构建更稳定、更智能的生产级 AI 代理。其独特的“研究优先”开发理念和针对 Token 消耗的优化策略,使得模型响应更快、成本更低,同时有效防御潜在的攻击向量。 这套工具特别适合软件开发者、AI 研究人员以及希望深度定制 AI 工作流的技术团队使用。无论您是在构建大型代码库,还是需要 AI 协助进行安全审计与自动化测试,everything-claude-code 都能提供强大的底层支持。作为一个曾荣获 Anthropic 黑客大奖的开源项目,它融合了多语言支持与丰富的实战钩子(hooks),让 AI 真正成长为懂上
ComfyUI
ComfyUI 是一款功能强大且高度模块化的视觉 AI 引擎,专为设计和执行复杂的 Stable Diffusion 图像生成流程而打造。它摒弃了传统的代码编写模式,采用直观的节点式流程图界面,让用户通过连接不同的功能模块即可构建个性化的生成管线。 这一设计巧妙解决了高级 AI 绘图工作流配置复杂、灵活性不足的痛点。用户无需具备编程背景,也能自由组合模型、调整参数并实时预览效果,轻松实现从基础文生图到多步骤高清修复等各类复杂任务。ComfyUI 拥有极佳的兼容性,不仅支持 Windows、macOS 和 Linux 全平台,还广泛适配 NVIDIA、AMD、Intel 及苹果 Silicon 等多种硬件架构,并率先支持 SDXL、Flux、SD3 等前沿模型。 无论是希望深入探索算法潜力的研究人员和开发者,还是追求极致创作自由度的设计师与资深 AI 绘画爱好者,ComfyUI 都能提供强大的支持。其独特的模块化架构允许社区不断扩展新功能,使其成为当前最灵活、生态最丰富的开源扩散模型工具之一,帮助用户将创意高效转化为现实。
markitdown
MarkItDown 是一款由微软 AutoGen 团队打造的轻量级 Python 工具,专为将各类文件高效转换为 Markdown 格式而设计。它支持 PDF、Word、Excel、PPT、图片(含 OCR)、音频(含语音转录)、HTML 乃至 YouTube 链接等多种格式的解析,能够精准提取文档中的标题、列表、表格和链接等关键结构信息。 在人工智能应用日益普及的今天,大语言模型(LLM)虽擅长处理文本,却难以直接读取复杂的二进制办公文档。MarkItDown 恰好解决了这一痛点,它将非结构化或半结构化的文件转化为模型“原生理解”且 Token 效率极高的 Markdown 格式,成为连接本地文件与 AI 分析 pipeline 的理想桥梁。此外,它还提供了 MCP(模型上下文协议)服务器,可无缝集成到 Claude Desktop 等 LLM 应用中。 这款工具特别适合开发者、数据科学家及 AI 研究人员使用,尤其是那些需要构建文档检索增强生成(RAG)系统、进行批量文本分析或希望让 AI 助手直接“阅读”本地文件的用户。虽然生成的内容也具备一定可读性,但其核心优势在于为机器
LLMs-from-scratch
LLMs-from-scratch 是一个基于 PyTorch 的开源教育项目,旨在引导用户从零开始一步步构建一个类似 ChatGPT 的大型语言模型(LLM)。它不仅是同名技术著作的官方代码库,更提供了一套完整的实践方案,涵盖模型开发、预训练及微调的全过程。 该项目主要解决了大模型领域“黑盒化”的学习痛点。许多开发者虽能调用现成模型,却难以深入理解其内部架构与训练机制。通过亲手编写每一行核心代码,用户能够透彻掌握 Transformer 架构、注意力机制等关键原理,从而真正理解大模型是如何“思考”的。此外,项目还包含了加载大型预训练权重进行微调的代码,帮助用户将理论知识延伸至实际应用。 LLMs-from-scratch 特别适合希望深入底层原理的 AI 开发者、研究人员以及计算机专业的学生。对于不满足于仅使用 API,而是渴望探究模型构建细节的技术人员而言,这是极佳的学习资源。其独特的技术亮点在于“循序渐进”的教学设计:将复杂的系统工程拆解为清晰的步骤,配合详细的图表与示例,让构建一个虽小但功能完备的大模型变得触手可及。无论你是想夯实理论基础,还是为未来研发更大规模的模型做准备

