学习内容
1.2d3dmatr 环境配置 + 代码
2.相关论文收集
学习时间
2023.11.02 — 2023.11.08
学习笔记
环境配置
目前遇到的 bug:
在安装作者第三方库的过程中,运行 python setup.py develop
后会遇到死机的现象,引起该问题的原因可能有两个:
- 版本对不上,这个几乎可以排除
- 系统不稳定,可能需要重装系统解决
除以上两个解决方案外,还有一个方法可以解决:在其它服务器上配置环境
此外,本篇的代码看了个大概,不过细节处仍需打磨,以下是关于代码的解读。
config.py
这段代码是一个Python配置文件(config.py),它定义了许多参数和配置选项,用于在项目中控制各种设置和超参数。这些参数可以通过导入该配置文件并访问 _C
对象来使用。让我解释一下其中一些主要部分:
_C.exp
:这个部分定义了有关实验(experiment)的配置,包括实验名称、工作目录、输出目录等。它还设置了一个随机种子(seed)。_C.data
:这个部分定义了与数据集相关的配置,如数据集目录、2D和3D匹配的半径等。_C.train
和_C.test
:这些部分定义了训练和测试数据的相关配置,如批处理大小、工作线程数等。_C.eval
:这个部分定义了评估相关的配置,包括接受度重叠(acceptance overlap)、接受半径(acceptance radius)、内点比例阈值等。_C.ransac
:这个部分定义了RANSAC算法的参数,如距离容忍度和迭代次数。_C.trainer
:这个部分定义了训练器(trainer)的配置,包括最大训练轮数和梯度累积步数。_C.optimizer
和_C.scheduler
:这些部分定义了优化器和学习率调度器的类型和参数。_C.model
:这个部分包含了有关模型的配置,如输入维度、输出维度以及各个组件(例如,图像骨干、点云骨干、粗匹配、Transformer等)的参数。_C.loss
:这个部分定义了损失函数的参数,包括粗匹配和细匹配级别的损失函数参数。make_cfg
函数:它返回配置_C
对象,允许其他部分的代码访问配置参数。parse_args
函数:这个函数用于解析命令行参数,特别是--link_output
参数。main
函数:它调用make_cfg
来创建配置对象,并根据命令行参数(如果有的话)创建一个符号链接。
此外,这个配置文件还包含一些目录的创建,以确保实验输出目录存在。
这个配置文件是一个常见的实验配置管理工具,允许你轻松地更改实验参数,而不必在代码中硬编码这些值。你可以在项目中导入这个配置文件,然后使用 _C
对象访问各种配置参数,以便进行实验、训练和测试。
dataset.py
这段代码是一个Python模块,用于处理数据集和数据加载。它包括了训练和测试数据加载器的配置以及一个运行测试的函数。
以下是对这段代码的主要解释:
- 导入模块:代码开始时导入了一些Python模块,包括与数据集处理、数据加载以及可视化相关的模块。
train_valid_data_loader
函数:这个函数用于创建训练和验证数据加载器。它首先创建一个训练数据集train_dataset
和一个验证数据集valid_dataset
,这些数据集基于配置文件中的设置,包括数据集目录、最大点数、2D和3D匹配半径等。然后,它使用数据集和其他参数创建数据加载器,包括批处理大小、工作线程数和其他参数。最后,函数返回训练加载器train_loader
和验证加载器valid_loader
以及一个neighbor_limits
对象。test_data_loader
函数:这个函数与train_valid_data_loader
类似,但它用于创建测试数据加载器。它使用测试数据集test_dataset
,并创建一个测试加载器test_loader
,然后返回加载器和neighbor_limits
。run_test
函数:这个函数是一个测试函数,它首先调用train_valid_data_loader
函数来获取数据加载器和neighbor_limits
,然后遍历训练加载器的数据。在每次迭代中,它处理加载的数据,包括深度图、内参矩阵、点云等。然后,它执行一些操作,可能包括应用变换、背投影、可视化等。这个函数似乎用于验证数据加载和处理的正确性。if __name__ == "__main__"
:这是Python的入口点,它会在直接运行这个脚本时执行run_test
函数,用于执行测试。
总的来说,这个模块主要用于配置数据加载器,提供训练和测试数据,并包含一个测试函数,用于验证数据加载和处理的正确性。
eval.py
这段代码是用于在给定的测试模型时执行评估的Python脚本。以下是代码的主要组成部分:
- 导入模块:代码一开始导入了需要的Python模块,包括从配置文件创建配置、数学操作、日志记录、解析参数和摘要等方面的模块。
make_parser
函数:这个函数创建了用于解析命令行参数的解析器,并定义了一些命令行参数,如test_epoch
(测试的时期)和num_corr
(用于注册的对应关系数量)。eval_one_epoch
函数:这个函数执行了一个测试时期的评估。它从配置文件中获取评估相关的参数,遍历每个场景的文件,加载数据并执行评估操作。评估的步骤如下:- 对于每个场景:
- 初始化用于记录粗匹配、精细匹配和注册结果的指标。
- 遍历场景中的文件,每个文件包含图像和点云之间的匹配数据。
- 对于每个文件,执行以下操作:
- 评估粗匹配,包括计算粗匹配的准确率以及匹配度大于阈值的数量。
- 评估精细匹配,包括计算内点比率、重叠度和距离等指标。
- 如果匹配数量大于等于4,则评估点云的注册,计算RMSE和是否达到阈值的注册召回率。
- 打印评估结果。
- 打印场景级别的评估结果(粗匹配、精细匹配和注册)。
- 对于每个场景:
main
函数:这个函数是脚本的主要入口点,它解析命令行参数,获取配置信息,设置日志记录,并调用eval_one_epoch
函数来执行评估。if __name__ == "__main__"
:这是Python脚本的入口点,用于在直接运行脚本时执行评估。它会调用main
函数来开始评估。
总之,这段代码用于在给定的测试模型上执行场景的评估,包括对应关系的评估和点云的注册评估。评估结果会被记录在日志文件中,以及总结在一个JSON文件中。
fusion_module.py
这段代码定义了一个名为CrossModalFusionModule
的PyTorch模块,它实现了跨模态特征融合功能。以下是该模块的主要组成部分和功能:
- 初始化方法
__init__
:img_input_dim
和pcd_input_dim
:图像和点云输入特征的维度。output_dim
:融合后输出特征的维度。hidden_dim
:中间隐藏层的维度。num_heads
:多头自注意力机制中的注意力头数。blocks
:一个包含字符串(“self” 或 “cross”)的列表,用于指定每个块的自注意力或交叉注意力。dropout
:可选的丢失率,用于正则化。activation_fn
:激活函数的名称,例如 “ReLU”。use_embedding
:一个布尔值,指示是否应该使用嵌入层。embedding_dim
:嵌入维度,当use_embedding
为True时使用。
create_2d_embedding
和create_3d_embedding
方法:这些方法用于为图像像素和点云创建嵌入特征。它们会分别对输入的像素坐标和点云坐标进行嵌入处理。forward
方法:- 输入参数包括图像特征
img_feats
、图像像素坐标img_pixels
、点云特征pcd_feats
、点云坐标pcd_points
,以及可选的图像和点云掩码。 - 首先,图像和点云特征经过线性投影层,然后进行嵌入(如果使用嵌入),并将嵌入特征与原始特征相加。
- 接下来,根据指定的注意力块类型(“self” 或 “cross”),应用多个自注意力块或交叉注意力块。
- 最后,通过线性投影将融合后的特征映射到指定的输出维度,分别返回融合后的图像特征和点云特征。
- 输入参数包括图像特征
这个模块允许将来自不同模态(例如图像和点云)的特征进行融合,以便在跨模态任务中使用,如多模态的目标检测、识别或配准等。它使用了Transformer网络结构来处理特征的融合,可通过调整不同的参数来适应不同的任务和数据集。
image_backbone.py
这段代码定义了一个卷积神经网络架构,用于图像处理的主干网络(backbone)。这个主干网络通常用于计算机视觉任务,如图像分割。让我解释一下代码的关键部分:
BasicBlock
:这是网络中用于卷积层的基本构建块。它包括两个卷积层和一个可选的身份连接,以处理不同的步幅。这个块用于提取特征。ImageBackbone
:这是图像处理主干网络的主要部分。它包括四个编码阶段和三个解码阶段。编码阶段降采样输入图像,而解码阶段上采样它。每个编码阶段由多个BasicBlock
单元组成,而每个解码阶段包括用于上采样的卷积层。ImageBackbone
处理输入图像并在多个尺度上提取特征。FeaturePyramid
:这个模块接收ImageBackbone
提取的特征,并进一步处理它们以创建特征金字塔。特征金字塔是不同尺度的特征图集合。这在各种计算机视觉任务中很有用,例如目标检测,其中需要检测不同大小的对象。run_test()
:这个函数初始化一个ImageBackbone
并打印模型的结构。通常用于测试模型。if __name__ == "__main__":
块确保在将此脚本作为主程序运行时执行run_test()
。
总之,这段代码定义了一个用于提取图像特征的卷积神经网络架构,这是许多计算机视觉任务的基本组成部分。网络采用编码和解码结构,以在多个尺度上捕获特征,并生成特征金字塔以供进一步处理。
loss.py
这是一个深度学习项目中的损失函数代码。该项目涉及图像和点云之间的匹配和注册问题,主要包括以下几个部分:
- CoarseMatchingLoss: 这是一个粗匹配损失,用于图像和点云之间的粗匹配。它使用了CircleLoss,该损失函数用于鼓励正样本之间的相似性高于负样本。损失的计算涉及到一些重叠度的计算,以确定哪些样本应被视为正样本和负样本。
- FineMatchingLoss: 这是一个细匹配损失,用于更精细的匹配。它也使用了CircleLoss,但在匹配的特征之间进行计算。该损失还涉及到距离的计算,以确定正样本和负样本。
- OverallLoss: 这是总的损失函数,结合了粗匹配和细匹配的损失。你可以设置它们的权重,以平衡两者的贡献。
- EvalFunction: 这是一个用于评估模型性能的功能。它包括几个评估指标,如精度(Precision)、均方根误差(RMSE)和召回率(Recall)。这些指标用于衡量匹配和注册的质量。
总之,这段代码定义了用于深度学习项目中的匹配和注册问题的损失函数和评估指标。这些损失函数用于训练模型,而评估指标用于评估模型的性能。
model.py
这段代码提供了一个用于2D-3D对应关系匹配的深度学习模型。该模型使用PyTorch实现,包括图像和点云的骨干网络、变换器和匹配模块等多个组件。该模型的设计目的是在2D图像像素和3D点云数据之间执行对应关系匹配。
以下是关键组件的简要概述:
- Image Backbone:模型使用图像骨干网络(CNN)从输入图像中提取特征。它从不同的层级提取特征。
- Point Backbone:点云骨干网络处理点云数据并提取特征。它似乎包括一个基于体素的处理步骤。
- Cross-Modal Fusion Transformer:这个组件接受来自图像和点云骨干网络的特征,并应用一个变换器网络来融合和处理它们。这允许2D和3D数据之间的跨模态交互。
- Feature Pyramid:它从变换器的输出中生成一个特征金字塔。
- SuperPoint Proposal Generator:它生成潜在的2D-3D对应关系的提案。这是粗匹配过程的一部分。
- SuperPoint Matching Mutual Topk:这个模块用于粗匹配。它基于特征相似性,识别图像中的点和3D点云中的点之间的潜在对应关系。
- Fine-Level Matching:这部分似乎是在推理模式下执行的。它使用top-k选择和相似性分数来细化对应关系。
代码还包括数据预处理,如数据解包和数据增强。模型的前向传递涉及特征提取、进行粗匹配和细匹配,以及生成预测。
代码中的main
函数演示了如何创建模型实例并打印其state_dict和架构。
如果您对代码的某些部分或其功能有具体问题或需要进一步解释,请随时提问。
point_backbone.py
这是一个名为point_backbone.py
的Python文件,其中定义了一个名为PointBackbone
的PyTorch模型类。该模型用于处理点云数据,并执行特征提取和处理。以下是关于该代码的中文摘要:
import torch
import torch.nn as nn
from vision3d.layers import KPConvBlock, KPResidualBlock, UnaryBlockPackMode
from vision3d.ops import knn_interpolate_pack_mode
class PointBackbone(nn.Module):
def __init__(self, input_dim, output_dim, init_dim, kernel_size, init_radius, init_sigma):
super().__init__()
# 网络层的构建,包括编码器和解码器的组件
# 这些组件被用于从点云数据中提取特征
def forward(self, feats, data_dict):
# 前向传播函数,接收输入特征和数据字典
# 具体代码的细节涉及了点云数据的编码和解码过程,以及不同分辨率层次的处理,包括子采样和上采样过程。
这个模型涉及了点云数据的处理和特征提取,主要由编码器和解码器组成,用于将输入点云数据转化为有用的特征表示。如果您对代码的特定部分有疑问或需要进一步的解释,请随时提出您的问题。
test.py
这是一个名为test.py
的Python文件,它用于执行模型的测试和评估。以下是有关该代码的中文摘要:
import os.path as osp
import time
import numpy as np
from config import make_cfg
from dataset import test_data_loader
from loss import EvalFunction
from model import create_model
from vision3d.engine import SingleTester
from vision3d.utils.io import ensure_dir
from vision3d.utils.misc import get_log_string
from vision3d.utils.parser import add_tester_args
from vision3d.utils.tensor import tensor_to_array
class Tester(SingleTester):
def __init__(self, cfg):
# 初始化测试器,包括数据加载、模型创建、评估器准备等
pass
def test_step(self, iteration, data_dict):
# 执行测试的每个步骤,返回输出字典
pass
def eval_step(self, iteration, data_dict, output_dict):
# 执行评估的每个步骤,返回结果字典
pass
def get_log_string(self, iteration, data_dict, output_dict, result_dict):
# 生成日志信息
pass
def after_test_step(self, iteration, data_dict, output_dict, result_dict):
# 在测试步骤之后执行操作,通常是保存结果
pass
def main():
# 主函数,用于配置测试参数、创建测试器并执行测试
pass
if __name__ == "__main__":
main()
这个脚本主要用于测试深度学习模型,包括加载数据、运行模型、评估模型的性能并保存结果。如果您需要了解特定部分的细节或有任何问题,请随时提问。
trainval.py
这是一个名为trainval.py
的Python文件,用于执行深度学习模型的训练和验证。以下是有关该代码的中文摘要:
import time
from config import make_cfg
from dataset import train_valid_data_loader
from loss import EvalFunction, OverallLoss
from model import create_model
from vision3d.engine import EpochBasedTrainer
from vision3d.utils.optimizer import build_optimizer, build_scheduler
class Trainer(EpochBasedTrainer):
def __init__(self, cfg):
# 初始化训练器,包括数据加载、模型创建、优化器和调度器准备,以及损失函数和评估器的初始化
pass
def train_step(self, epoch, iteration, data_dict):
# 执行训练的每个步骤,包括前向传播、损失计算
pass
def val_step(self, epoch, iteration, data_dict):
# 执行验证的每个步骤,也包括前向传播、损失计算以及性能评估
pass
def main():
# 主函数,用于配置训练参数、创建训练器并执行训练
pass
if __name__ == "__main__":
main()
这个脚本主要用于训练和验证深度学习模型,包括加载数据、运行模型、计算损失、优化模型参数以及评估模型的性能。如果您需要了解特定部分的细节或有任何问题,请随时提问。
utils.py
这是一个名为utils.py
的Python文件,其中包含了一些用于处理点云和图像数据的实用函数。以下是一些主要函数的中文摘要:
batchify(knn_inputs, block_h, block_w, stride)
: 该函数用于将KNN输入数据批处理,以便在模型中使用。它接受KNN输入、块高度、块宽度和步幅作为参数,并返回批处理后的KNN输入数据。patchify(img_points, img_pixels, img_masks, img_h_f, img_w_f, img_h_c, img_w_c, stride)
: 该函数用于将图像数据划分成图像块。它接受图像点云、像素、掩码以及其他参数,以便将图像分成块,并返回块的相关信息。get_2d3d_node_correspondences(...)
: 该函数用于生成2D-3D点云的节点对应关系。它计算具有相似性的图像块和点云块之间的对应关系,并返回对应的节点索引和相关信息。
这些函数用于处理点云和图像数据,以便进行深度学习模型的训练和验证。如果您需要了解特定部分的细节或有任何问题,请随时提问。
论文收集
用于与 matr2d3d 进行比较的网络有 3 个,分别是:
- FCGF
- P2-Net
- Predator
想根据这些论文找找灵感,完成 2d3d 特征的加强设计