周报-240329

学习内容

1.FreeReg 代码分析

2.创新点探索


学习时间

2024.03.23 — 2024.03.28


学习笔记

多层次互选择

LCD

从 seq 文件夹中,先把所有的内容分别转换为矩阵,并过滤掉不合法的信息。

随机选取深度图像中的合法的一点,然后根据深度 depth 和相机参数 K,得到相机坐标,再生成一个包围这一点的正方体,代码中叫做 bounding box

与位姿矩阵进行矩阵乘法,再加上平移量,得到世界坐标的原点(注意,旋转量和平移量都是由位姿矩阵 .pose.txt 得到的)。

根据相机参数,将顶点坐标的正方体从相机坐标投影到图像坐标系,取 x,y 的范围。

根据 x,y 的范围,分别取得局部点云与图像块添加到集合中。

在 for loop 中提取一些点,先看看平移的距离跟第一个是否够远,太近会排除。

根据位姿的逆和世界坐标原点进行矩阵乘法,加上平移量得到该点相机坐标。

相机坐标投影得到图像坐标,然后观察深度是否变化过大,过大会重新选择。

然后的步骤与第一个点一样,根据相机参数,将顶点坐标的正方体从相机坐标投影到图像坐标系,取 x,y 的范围。

根据 x,y 的范围,分别取得局部点云与图像块添加到集合中

MATR

构建不同尺度的金字塔用于匹配,减小歧义。

远离相机的 3D patch在后期更喜欢小的 2D patch,反之亦然。

在这里插入图片描述

VP2P

2d 集合与 3d 集合进行 topk 互选择,通过自适应权重优化来建立匹配

在这里插入图片描述

结合以上三点,我们可以设计不同尺度的 2d 集合与 3d 集合,来让他们进行 top-k 互选择(他们的索引值相同,但是范围不同),更大的范围可能带来更优秀的感受野。

点云特征融合

VP2P

体素特征与几何特征在 cat 后会具有更加平滑均匀的表示,能与 2d 特征接近。

P2P 匹配学习到的潜在空间非常不规则,几个簇之间有很大的差距,一些空间只包含单一模态的特征。相比之下,VP2P 匹配导致结构化的跨模态潜在空间,其中特征均匀分布在空间中。

在这里插入图片描述

FreeReg

扩散特征在图像和点云上具有高度的语义一致性

在这里插入图片描述

将扩散特征、体素特征与几何特征 cat 一下,看能否获得更好的结果

run

load_data()

使用 open3d.io.read_point_cloud 读取点云

utils.utils.proj_pc2dpt

将点云投影到平面(通过相机内参投影实现,具体函数为 dpt_3d_comvert.proj_3to2),然后去除投影到平面范围外的点和深度有问题的点,接着遍历所有点,根据坐标绘制深度图

load_data() — densefunction

tools.dense.depth_map_utils.fill_in_fast 深度填充

用于进行快速、就地(in-place)深度填充的函数。主要步骤如下:

  1. 反转深度值(Inversion):将深度图中的有效像素值进行反转,即将原始深度值减去最大深度值,得到一种相对于最大深度值的深度。
  2. 膨胀(Dilation):使用自定义的膨胀核对深度图进行膨胀操作,以填充空洞并扩大深度边界。
  3. 孔洞填充(Hole Filling):通过闭运算(morphologyEx)操作填补深度图中的孔洞。
  4. 空洞填充(Empty Space Filling):将空洞处的像素值替换为经过膨胀处理后的值。
  5. 向上外推(Extrapolation):根据设定,将深度值最高的像素值向图像顶部外推,填充空白区域。
  6. 中值滤波(Median Filtering):对深度图进行中值滤波,以减少噪声影响。
  7. 双边或高斯模糊(Bilateral or Gaussian Blur):根据指定的模糊类型(‘bilateral’ 或 ‘gaussian’),对深度图进行模糊处理。双边滤波保留局部结构,而高斯滤波提供较低的均方根误差(RMSE)。
  8. 最后一次反转(Final Inversion):再次对深度图中的有效像素值进行反转,得到最终的深度填充结果。

该函数的参数包括原始深度图、最大深度值、自定义膨胀核、是否进行外推、模糊类型等,返回填充后的深度图。

此时 meta 含有两个字段,一个是 frames,用于装各种数据的地址,另一个是 pairs,装了啥目前还没看出来,以下为输出的格式:

meta:  {
	'frames': {
		'0': {
			'rgb_fn': './data/demo/source_rgb.png', 
			'zoe_fn': './data/demo/source_rgb.zoe.npy', 
			'to_fn': './tale_features/demo/feat/0.feat.pth', 
			'rgb_gtd': array([[2.305, 2.305, 2.305, ..., 1.646, 1.646, 1.646],
       				   [2.305, 2.305, 2.305, ..., 1.647, 1.647, 1.646],
       				   [2.305, 2.305, 2.305, ..., 1.647, 1.647, 1.647],
     					   ...,
       				   [0.709, 0.709, 0.709, ..., 1.436, 1.436, 1.436],
       				   [0.709, 0.71 , 0.71 , ..., 1.436, 1.436, 1.436],
       			 	   [0.   , 0.71 , 0.71 , ..., 1.436, 1.436, 1.436]])
  		     }, 
  		'1': {
  			'dpt_fn': './data/demo/target_dpt.densify.png', 
  			'proj_dpt_fn': './data/demo/target_dpt.proj.png', 
  			'to_fn': './tale_features/demo/feat/1.feat.pth', 
  			'dpt_gtd': array([[4.008, 4.008, 3.956, ..., 2.145, 2.145, 2.145], 
       				   [4.008, 4.008, 3.956, ..., 2.145, 2.145, 2.145],
      				 	   [4.008, 4.008, 3.956, ..., 2.145, 2.145, 2.13 ],
       				   ...,
       				   [0.   , 0.   , 0.   , ..., 1.865, 1.865, 1.865],
       				   [0.   , 0.   , 0.   , ..., 1.865, 1.865, 1.865],
       				   [0.   , 0.   , 0.   , ..., 1.853, 1.865, 1.865]])
    		     }
    		  }, 
    	'pairs': [{
    		'q_id': '0', 
    		'd_id': '1', 
    		'overlap': 0.5, 
    		'to_fn': './tale_features/demo/match/0-1.trans.npz', 
    		'gt': array([[ 0.97812651, -0.11337783,  0.174394  ,  0.0445012 ],
       		      [ 0.0802474 ,  0.97917275,  0.18649539, -0.15033864],
       		      [-0.19190741, -0.16842245,  0.96685345,  0.62023702],
       		      [ 0.        ,  0.        ,  0.        ,  1.        ]])
       	  }]
       }

preprocess()

会通过图像生成深度图,如果存在或需要更新的时候就会运行

判断对应的文件路径是否标识

tools.zoe.zoedepth.models.depth_model.infer_pil

定义了一个带有装饰器 @torch.no_grad() 的方法 infer_pil,用于推理 PIL 图像。

  • @torch.no_grad(): 这是一个 PyTorch 装饰器,用于标记函数或方法的上下文,在这个上下文中,PyTorch 将不会跟踪计算梯度,这样可以减少内存消耗并提高推理速度。
  • infer_pil(self, pil_img, pad_input: bool=True, with_flip_aug: bool=True, output_type: str="numpy", **kwargs) -> Union[np.ndarray, PIL.Image.Image, torch.Tensor]: 这是 infer_pil 方法的定义。它接受一个 PIL 图像作为输入,并返回推理结果,支持以下参数:
    • pil_img (PIL.Image.Image): 输入的 PIL 图像。
    • pad_input (bool, optional): 是否使用填充增强。默认为 True。
    • with_flip_aug (bool, optional): 是否使用水平翻转增强。默认为 True。
    • output_type (str, optional): 输出类型。支持的值有 ‘numpy’、‘pil’ 和 ‘tensor’。默认为 “numpy”。
    • **kwargs: 其他参数,用于传递给 infer 方法。
  • transforms.ToTensor()(pil_img).unsqueeze(0).to(self.device): 这行代码将 PIL 图像转换为 PyTorch 张量,并添加了一个维度,以便适应模型的输入格式。然后,将张量移动到指定的设备上。
  • out_tensor = self.infer(x, pad_input=pad_input, with_flip_aug=with_flip_aug, **kwargs): 这行代码调用了类中的 infer 方法,对输入的图像进行推理。推理过程中,可能会应用填充增强和水平翻转增强,根据参数进行选择。
  • 最后根据 output_type 参数的值,将推理结果转换为相应的类型:
    • 如果 output_type 为 “numpy”,则将结果转换为 NumPy 数组并返回。
    • 如果 output_type 为 “pil”,则将结果转换为 PIL 图像,并将深度图的像素值缩放为 16 位整数(uint16 类型)。
    • 如果 output_type 为 “tensor”,则直接返回 PyTorch 张量。
    • 如果 output_type 不是上述支持的值,则抛出 ValueError 异常。

返回。

  • 如果 output_type 为 “pil”,则将结果转换为 PIL 图像,并将深度图的像素值缩放为 16 位整数(uint16 类型)。
  • 如果 output_type 为 “tensor”,则直接返回 PyTorch 张量。
  • 如果 output_type 不是上述支持的值,则抛出 ValueError 异常。

  • 45
    点赞
  • 35
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值