稀疏卷积

稀疏卷积 TLDR 💡 通过对输入输出不为空的数据建立位置哈希表和RuleBook,只对有效数据计算卷积,从而减少计算量! Rulebook 储了稀疏卷积过程中需要计算的位置和操作,但是这个过程是高度可并行化的,因此可以有效地利用GPU来加速。 普通卷积 卷积的实际流程 反卷积的实际流程 矩阵是如何存储的? 这个矩阵的作用是将原始输入张量中每个像素的特征向量投影到输出通道的特征向量上。可以把它想象成一个坐标变换的过程,将一个3维数据投影到128维空间。 矩阵是如何优化的? 对单个像素的优化: 一次卷积的完整流程 稀疏卷积 普通卷积的推广 $$ \mathrm{x_u=\sum W_{i}x_{i+u}}\:for\: u\in\mathbb{C}^{out} $$ 其中 i 属于 N,代表卷积核的像素位置相对于当前处理的像素 (u) 的偏移量。 具体来说,稀疏卷积使用一个被称为“Rulebook”的结构来安排所有原子操作(例如卷积核对应位置的计算)。这个 Rulebook 是一组规则,定义了输入特征的哪些位置需要和卷积核进行计算。 坐标散列(coordinate hashing) 要解决的问题 当稀疏3D点云在大部分空间中是空的,如何在下采样后恢复到原始分辨率是一个很具挑战性的任务。坐标散列将不同层次之间的坐标映射起来,以便在卷积和反卷积操作中有效地追溯和恢复这些点的位置。 原理 本质上是一种记录和查询机制,可以将高维空间中的稀疏数据映射到一个紧凑的、易于管理的格式中。通过这个机制,每个点的空间信息都能在不同的层次结构中进行高效的映射和还原,从而使得在下采样和上采样(反卷积)操作之后,数据能够准确恢复到它们原来的空间位置。 不同层的映射是分层链接的。 参考文献 How does sparse convolution work? Sparse Convolution explained with code

June 4, 2024 · 1 min · Huijie Liu

相机的外参和内参

相机的外参和内参 TLDR 💡 **外参矩阵:**将点从世界坐标系转换到相机坐标系。 **内参矩阵:**将点从相机坐标系转换到像素坐标系。 关键概念 相机是用于捕捉图像的传感器,它们将世界中的点投影到我们看到的2D平面上。 这种变换通常分为两个部分:外部参数和内部参数。相机的外部参数取决于其位置和方向。相机的内部参数则取决于它如何捕捉图像(焦距、光圈、视场、分辨率)。 坐标系 在成像过程中,主要使用三种坐标系: 世界坐标系(3D):这是一个固定的全局坐标系,用于描述场景中物体的绝对位置。 相机坐标系(3D):这是以相机为中心的坐标系,用于描述相对于相机的物体位置。 图像坐标系(2D):这是投影到2D图像平面上的坐标系,用于描述图像上像素的位置。 像素坐标系(2D):这是具体到图像像素的坐标系,通常以图像左上角为原点。 外部参数 外部参数包括旋转矩阵 $R$ 和平移向量 $t$ ,它们描述了世界坐标系到相机坐标系的变换。具体来说,给定一个世界坐标系中的点 $P_w$ ,通过外部参数变换可以得到相机坐标系中的点 $P_c$ : $P_c = R \cdot P_w + t$ 其中 $R$ $$ 是一个 $3 \times 3$ 的旋转矩阵, $t$ 是一个 $3 \times 1$ 的平移向量。 内部参数 内部参数描述了相机的成像特性,主要包括焦距 $f$ 、主点 $(c_x, c_y)$ 、像素尺寸等。内部参数矩阵 $K$ 可以表示为: $K = \begin{pmatrix} f_x & 0 & c_x \\ 0 & f_y & c_y \\ 0 & 0 & 1 \end{pmatrix}$...

June 3, 2024 · 1 min · Huijie Liu

3DGS Tutorial

3DGS 基本思想 3D高斯分布可以通过它们的各向异性协方差矩阵、位置和透明度等参数来有效地表示复杂场景。由于这些参数是通过机器学习方法进行训练的,渲染阶段无需进行大量处理。因此,它可以利用基于瓦片的光栅化器实现快速渲染,从而在性能上有显著的提升。 创新点 Point-Based Rendering:点基渲染直接将三维空间中的点渲染为图像。 Tiled Rasterization:分块光栅化的基本思想是将屏幕划分为多个小块(Tiles),然后在每个小块内进行相关计算和处理(可微分)。这种方法能够显著减少内存流量,从而提高渲染效率。 Spherical Harmonics:球谐函数是一种在球面上表示函数的方法,特别适用于描述球形表面的光照和阴影效果。 基本流程 收集数据 图像 视频->ffmpeg截取视频帧 ffmpeg -i <VIDEO_PATH> -qscale:v 1 -qmin 1 -vf fps=2 %04d.jpg 输出如下 📦 $FOLDER_PATH ┣ 📂 input ┃ ┣ 📜 000000.jpg ┃ ┣ 📜 000001.jpg ┃ ┣ 📜 ... 获取相机位姿 COLMAP:开源Structure-from-Motion (SfM) 软件,输入images,输出相机位姿 原论文使用的是自带的convert.py,自动调用COLMAP并转换成需要的格式 桌面软件:RealityCapture, Metashape 移动app:Polycam, Record3D(利用了雷达) 输出如下: 📦 $FOLDER_PATH ┣ 📂 (input) ┣ 📂 (distorted) ┣ 📂 images ┣ 📂 sparse ┃ ┣ 📂 0 ┃ ┃ ┣ 📜 points3D....

May 23, 2024 · 10 min · Huijie Liu

Recent Advances in Vision Foundation Models

原文链接 Q1: how to learn image representations? Overview 改进 CLIP 数据层面:Data scaling up 模型层面:Model design image side FLIP(Scaling CLIP training via masking):是一种改进的训练方法,用于提高 CLIP模型的训练效率。FLIP 的核心思想是在训练过程中随机遮挡图像的部分区域,只对可见的区域进行编码。 Scaling language-image pre-training via masking, CVPR 2023 language side K-Lite: 将外部知识融入到对比学习预训练中,在 K-Lite 中,实体的维基百科定义(knowledge)可以与原始的图像替代文本(alt-text)一起自然地用于对比预训练。 K-lite: Learning transferable visual models with external knowledge, NeurIPS 2022 improved interpretability STAIR(Learning Sparse Text and Image Representation in Grounded Tokens): 将图像和文本映射到高维稀疏嵌入空间; 每个维度的值是一个非负标量,表示与该维度对应的词或标记的权重; 提供了更好的性能和更清晰地识别图像和文本之间的对应关系; STAIR: Learning Sparse Text and Image Representation in Grounded Tokens, 2023...

March 28, 2024 · 4 min · Huijie Liu

正向代理与反向代理

正向代理 正向代理是客户端和服务器中间的服务器,为了从原始服务器取得内容,客户端向代理服务器发送一个请求并指定目标(原始服务器), 然后代理服务器向原始服务器转发请求并将获得的内容返回给客户端。 举个例子,比如正常情况下我没法办上youtube,但是我有个aws的机器,它不受GFW的限制,能够访问youtube,我也能正常访问那个aws的机器, 那么我通过发送请求给aws的机器,让他转发我的请求给youtube,然后把youtube返回的数据给我,我就能通过aws的机器作为跳板访问GFW, 那个aws的机器也就是代理服务器的角色,并且这种方式就是正向代理。 总结一下,正向代理就是我想访问一台机器,但是被墙了访问不到,我需要一台机器作为跳板转发我的请求。 反向代理 于正向代理不同,反向代理更多的是为了保护原始服务器。 对于客户端而言,反向代理中的代理服务器就是原始服务器,客户端并不需要知道有这个代理的角色存在, 因此客户端也不需要一些额外的设置,比如正向代理中制定代理服务器是谁。 比如在原始服务器A上配置防火墙,使得只有服务器B能够访问A,并且通过B服务器转发A的数据实现于外界的通信。这样对于客户端,它只需要和B交互, 从而隐藏了服务器A,B服务器也就是反向代理服务器。由于有代理服务器的存在,对于后面的原始服务器来说,也就多了一层做负载均衡的服务器。 透明代理 还有一种代理方式叫做透明代理,比如公司的机器不能上qq,这个就是透明代理,它在内网和外网之间捕捉用户的请求,过滤一部分请求。 SSH端口转发 有一种很简单的方式就能做到代理功能,那就是SSH本身提供的端口转发功能。 要想理解清楚SSH端口转发,首先必须记住这样几个原则: SSH简单的理解就是2台机器之间安全的数据通道,它包括ssh的client和ssh的server2个角色,这样的一条通道也就是ssh隧道(ssh tunneling) SSH 端口转发自然需要 SSH 连接,而 SSH 连接是有方向的,从 SSH Client 到 SSH Server 我们的应用的请求也是有方向的,一般是客户端向服务器端发出请求 一旦这2个方向相同,我们称为ssh的本地转发(-L),不同则为远端转发(-R) 命令一般是跑在ssh client的机器上的 本地转发 ssh本地转发命令为: ssh -L <local port>:<remote host>:<remote port> <SSH hostname> 这条命令可以翻译成:从本地的端口发出请求,通过这台机器作为跳板转发请求到的端口。 是相对而言的,比如是127.0.0.1的话,就是本身。 所以一般如果是127.0.0.1的话,跳板机或者代理服务器就是目标服务器。 举个例子: A是一台在我家的机器macbook air,它可以访问taobao,也就是服务器C B是一台在公司的机器imac,由于在公司的内网,所以在家的A访问不到B C是taobao的服务器,公司不让上taobao,所以服务器B访问不了C 现在要想在让B服务器能访问C的80端口,由于防火墙这条路本身是走不通的,但是由于B能访问A,A能访问C,所以能把A作为代理服务器实现这一要求。 在服务器B和服务器A之间建立ssh隧道,在SSH端口转发中,由于服务器B能连接到服务器A,并且请求是从服务器B发出,所以B既是ssh的client,也是请求的客户端 所以此时应该在B上去运行ssh的本地转发命令: ssh -L 8080:HOST_C:80 HOST_A 远端转发 ssh远端转发的命令为: ssh -R <local port>:<remote host>:<remote port> <SSH hostname> 由于本身B是可以访问A的,但是A访问不到B,现在要想服务器A访问到B,也就是在家能连上公司的机器。...

March 27, 2024 · 1 min · Huijie Liu