PyTorch3D 点云光栅化完全指南rasterize_points 参数、原理与实战【免费下载链接】pytorch3dPyTorch3D is FAIRs library of reusable components for deep learning with 3D data项目地址: https://gitcode.com/gh_mirrors/py/pytorch3d导读本文围绕 PyTorch3D 渲染管线中的核心算子pytorch3d.renderer.points.rasterize_points展开系统讲解点云光栅化的输入约定、五个核心参数、三类返回张量以及朴素—分箱coarse-to-fine—纯 Python三种实现路径。读完本文你将能独立完成任意点云的光栅化调用、正确设置半径与points_per_pixel、处理非方形图像的高宽比并理解其可微反向传播与上层PointsRasterizer/PointsRenderer的组装方式。一、模块定位点云渲染管线中的光栅化环节rasterize_points是 PyTorch3D 点云渲染三阶段管线中的核心阶段。以 pytorch3d/renderer/points/renderer.py 中的PointsRenderer为例一次完整的点云渲染被拆解为变换transform由PointsRasterizer.transform将世界坐标点变换到 NDC 空间见 pytorch3d/renderer/points/rasterizer.py光栅化rasterize调用rasterize_points把每个点绘制为屏幕上的圆盘并为每个像素找出最近的 K 个点输出idx / zbuf / dists三类片段fragments数据合成compositeAlphaCompositor或NormWeightedCompositor依据距离权重混合颜色见 pytorch3d/renderer/points/compositor.py 与底层实现 pytorch3d/renderer/compositing.py。模块的公开 API 在 pytorch3d/renderer/points/init.py 中统一导出本文关联文档 docs/modules/renderer/points/rasterize_points.rst 即通过automodule自动提取rasterize_points.py的完整文档字符串。PyTorch3D 点云光栅化到非方形矩形图像1024x512的渲染结果二、函数签名与核心参数rasterize_points定义于 pytorch3d/renderer/points/rasterize_points.py签名如下def rasterize_points( pointclouds, image_size: Union[int, List[int], Tuple[int, int]] 256, radius: Union[float, List, Tuple, torch.Tensor] 0.01, points_per_pixel: int 8, bin_size: Optional[int] None, max_points_per_bin: Optional[int] None, ):每个点云会被光栅化到一张独立图像上当image_size为整数时输出(image_size, image_size)的方形图像为(H, W)元组时输出(H, W)的矩形图像。2.1pointclouds输入的点云批次类型为Pointclouds对象见 pytorch3d/structures/pointclouds.py代表一批 N 个点云批内每个点云可以有不同数量的点点的坐标为(x, y, z)坐标必须位于NDC归一化设备坐标空间即[-1, 1]^3相机位于原点(0, 0, 0)相机坐标系约定x 轴从右指向左、y 轴从下指向上、z 轴从后指向前即常见的右/上/后向观察者约定。函数内部通过pointclouds.points_packed()、cloud_to_packed_first_idx()与num_points_per_cloud()将异构点云摊平为紧凑packed张量参与计算rasterize_points.py。2.2image_size输出图像尺寸与高宽比支持整数方形或(H, W)元组非方形非方形图像涉及两个高宽比像素高宽比与输出图像高宽比。光栅化器假设像素为正方形但允许图像本身为矩形文档明确建议多数场景下应将相机的像素高宽比设为1.0仅通过image_size调整输出图像尺寸NDC 范围在非方形图像下会被缩放以保持高宽比较小维度保持[-1, 1]另一维度按H:W比例缩放。例如(H, W) (64, 128)时高度 NDC 范围为[-1, 1]宽度范围为[-2, 2]。像素到 NDC 的换算由 pytorch3d/renderer/mesh/rasterize_meshes.py 的pix_to_non_square_ndc实现CUDA 内核中的PixToNonSquareNdc与之对应pytorch3d/csrc/rasterize_points/rasterization_utils.cuh在H ! W时代码使用max_image_size max(H, W)推导bin_size以适配分箱光栅化器中每维度 bin 数的约束rasterize_points.py。2.3radius圆盘半径NDC 单位默认0.01即每个点被光栅化为 NDC 空间下半径为0.01的圆盘支持逐点半径传入 shape 为(N, P)的torch.Tensor其中 N 为批大小、P 为每个点云的填充后点数即可为批内每个点指定不同半径内部经_format_radiusrasterize_points.py统一格式化为 shape(P_packed,)的紧凑张量float 被广播为全同值张量list/tuple被转为张量(N, P_padded)张量则通过padded_to_packed_idx()索引映射为 packed 形式形状不符时抛出ValueError该参数直接影响渲染的软边界权重PointsRenderer.forward中权重定义为1 - dists2 / (r * r)renderer.py用于软化硬决策边界、保证可微性。2.4points_per_pixel每像素保留的点数默认8即每个像素沿 z 轴保留最近的 K 个点并按 z 升序排列该值即返回张量的第 4 维长度K内核中硬上限为kMaxPointsPerPixel 150pytorch3d/csrc/rasterize_points/rasterization_utils.cuh超出会报错 Must have points_per_pixel 150rasterize_points.cu。2.5bin_size与max_points_per_bincoarse-to-fine 分箱bin_size0使用朴素光栅化naive逐像素遍历该点云的全部点bin_sizeNone启发式自动选择。CPU 上强制回退为0Binned CPU rasterization not fully implemented分箱 CPU 光栅化未完整实现CUDA 上取2 ** max(ceil(log2(max_image_size)) - 4, 4)rasterize_points.pybin_size 0启用分箱粗光栅化_C._rasterize_points_coarse先把每个点按空间位置分配到 bin 网格再由细光栅化内核只检查本 bin 内的点不改变输出值只影响前向速度分箱模式下每维 bin 数为1 (max_image_size - 1) // bin_size受全局上限kMaxPointsPerBin 22约束rasterize_points.py过小会抛出bin_size too small, number of points per bin must be less than 22对应测试见 tests/test_rasterize_points.pymax_points_per_bin仅分箱模式生效表示每个 bin 允许的最大点数不影响输出值只影响前向内存占用默认取max(10000, _P / 5)rasterize_points.py。三、返回值idx / zbuf / dists2 三元组函数返回(idx, zbuf, dists2)三元素元组image_size为(H, W)时三个张量的空间维度均为(N, H, W, ...)返回张量形状含义idx(N, H, W, points_per_pixel)int32每个像素处最近点的索引按 z 升序。idx[n, y, x, k] p表示 packed 点points[p]是像素(y, x)沿 z 方向第 k 近的点未被points_per_pixel个点覆盖的像素用-1填充zbuf(N, H, W, points_per_pixel)float32对应点的z 坐标排序方式与idx一致未覆盖处填充-1dists2(N, H, W, points_per_pixel)float32像素中心与该点在x/y 平面的欧氏距离平方NDC 单位未覆盖处填充-13.1 可微性与自定义 autograd Function_RasterizePoints继承torch.autograd.Functionrasterize_points.py前向调用_C.rasterize_points通过ctx.save_for_backward(points, idx)保存输入并用ctx.mark_non_differentiable(idx)标记idx不可微反向调用_C.rasterize_points_backward仅对zbuf与dists2的梯度回传到点坐标CUDA 反向内核按(N, H, W, K)逐像素并行对grad_points使用atomicAdd累加rasterize_points.cu因此该算子被标记为alertNotDeterministic非确定性。3.2 三种实现路径与一致性保证实现入口适用平台说明朴素 CUDA/CPUrasterize_points(..., bin_size0)GPU / CPU每个像素一个线程CUDA遍历全部点分箱 CUDArasterize_points(..., bin_size0)GPU先粗分箱后细光栅化加速不改变结果纯 Pythonrasterize_points_pythonCPU教学/对照用三层 for 循环逐像素检查纯 Python 版本rasterize_points_pythonrasterize_points.py逻辑完全对应朴素内核对每个点云、每行每列像素跳过pz 0相机后的点计算dist2 radius2则插入 top-k 列表并排序截断。测试 tests/test_rasterize_points.py 的test_cpp_vs_naive_vs_binned对 CPU 朴素 / CUDA 朴素 / CUDA 分箱三条路径做了严格的输出与梯度一致性校验idx、zbuf完全相等dists与梯度误差在1e-6/5e-6量级内。四、结合源码看内核实现4.1 像素判点逻辑CheckPixelInsidePoint朴素与细光栅化内核共享同一设备端判定函数rasterize_points.cu读取点的(px, py, pz)与该点半径p_radius计算radius2 p_radius²若pz 0直接返回——不渲染相机后方的点计算像素中心与点的平面距离平方dist2 dx² dy²当dist2 radius2时该点覆盖此像素用数组维护最多 K 个Pix{z, idx, dist2}当满 K 个后若新点 z 更小则覆盖当前最大 z 的槽位并重新扫描最大值——由于K 150且通常很小这是比 STL 堆更轻量、低发散的选择最终用BubbleSort按 z 升序输出。4.2 细光栅化与分箱协同RasterizePointsFineCudaKernelrasterize_points.cu从粗光栅化产出的bin_pointsshape(N, BH, BW, T)-1为哨兵值中只读取当前 bin 的点从而把每个像素的候选点数从全点云降到本 bin 内点数。像素 id 的排布让相邻线程落入同一 bin以获得合并访存coalesced memory reads。粗光栅化的 CPU 参考实现见 pytorch3d/csrc/rasterize_points/rasterize_points_cpu.cpp其中同样对超过max_points_per_bin的点进行了截断处理。4.3 坐标轴翻转约定CUDA 内核在计算输出索引时对 x/y 做了翻转yi H - 1 - pix_idx / W、xi W - 1 - pix_idx % W见 rasterize_points.cu这是因为相机坐标假设 Y 向上、X 向左而图像行索引自上而下——与纯 Python 实现中yfix H - 1 - yi的翻转逻辑一致。五、上层封装PointsRasterizationSettings 与 PointsRasterizerrasterize_points通常不直接调用而是通过高层封装使用from pytorch3d.renderer import ( PointsRasterizationSettings, PointsRasterizer, PointsRenderer, AlphaCompositor, PerspectiveCameras, ) from pytorch3d.structures import Pointclouds raster_settings PointsRasterizationSettings( image_size512, radius0.01, points_per_pixel8, bin_sizeNone, # 启发式0 为朴素模式 max_points_per_binNone, ) rasterizer PointsRasterizer(camerascameras, raster_settingsraster_settings) renderer PointsRenderer(rasterizerrasterizer, compositorAlphaCompositor()) images renderer(pointclouds)PointsRasterizationSettingsrasterizer.py是以 dataclass 形式存储的参数字典五个字段与rasterize_points一一对应默认值完全一致image_size256, radius0.01, points_per_pixel8, bin_sizeNone, max_points_per_binNonePointsRasterizerrasterizer.py的forward先经transform用相机把世界坐标变换到 NDC保留 view 空间的 z 值再展开raster_settings调用rasterize_points返回PointFragments(idx, zbuf, dists)具名元组相机既可在初始化时传入也可在前向时以cameras关键字覆盖PointsRenderer依据radius将dists2转为[0,1]的软权重交由AlphaCompositoralpha 合成cum_alpha_k alpha_k * prod_{lk}(1 - alpha_l)或NormWeightedCompositor归一化加权和完成着色两个合成器均支持background_color背景填充compositor.py。六、验证与参考正确性测试tests/test_rasterize_points.py 覆盖简单用例、相机后点剔除、变半径、三条实现路径一致性、bin_size过小报错等场景非方形图像测试tests/test_rasterize_rectangle_images.py 中的TestRasterizeRectangleImagesPointclouds对比方形与非方形图像下rasterize_points的片段输出与梯度顶层 API 导出pytorch3d/renderer/points/init.py文档索引docs/modules/renderer/points/index.rst 收录了本文关联的 rasterize_points.rst 及其配套的 rasterizer、renderer、compositor 文档。七、注意事项小结输入必须是 NDC 空间坐标世界坐标需先经相机变换直接传入原始世界坐标会得到错误结果CPU 上不要依赖分箱bin_sizeNone在 CPU 上会退化为朴素模式加速只在 CUDA 上生效bin_size与图像尺寸联动图像很大而bin_size过小时会触发kMaxPointsPerBin22的报错可按报错提示增大bin_sizepoints_per_pixel有 150 的上限需要更多候选点时需自行调整策略如分多次光栅化矩形图像注意高宽比像素保持正方形假设图像高宽比由 NDC 范围缩放吸收相机侧请保持像素高宽比为 1.0反向传播非确定性CUDA 反向使用atomicAdd累加梯度多次运行梯度可能略有差异追求完全确定性时需注意此限制。【免费下载链接】pytorch3dPyTorch3D is FAIRs library of reusable components for deep learning with 3D data项目地址: https://gitcode.com/gh_mirrors/py/pytorch3d创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
企业数字化 ERP 产品动态
相关推荐
Kornia IO 图像张量加载与保存实战:基于 kornia-rs 与 DLPack 的零拷贝图像读写指南 计算机视觉人工智能深度学习图像处理 【免费下载链接】kornia 🐍 Geometric Computer Vision Library for Spatial AI 项目地址: https://gitcode.com/gh_mirrors/ko/kornia 点击查看 免费下载 导读
本指南围绕 Kornia 的 kornia.io 包展开,… · 2026/9/24 19:42:44
米家新架构本质:分布式状态协同与网关选型指南 1. 米家新架构不是“升级”,而是整套通信逻辑的重写“全新架构的米家智能家居”这八个字,最近在各大数码论坛和家居群被反复刷屏,但很多人点开文章才发现——通篇都在讲App界面变好看了、设备列表加载快了、语音响应更顺了。这根本不是新架构… · 2026/9/24 19:42:44
WinRAR压缩解压全攻略:功能详解、硬件适配与实用技巧 WinRAR 压缩解压软件:功能拆解、硬件适配、横向对比与安装实操指南我用 WinRAR 也快二十年了,从大学攒机那会儿装系统必带软件之一,到后来办公电脑、家庭 NAS 备份,再到帮朋友处理“压缩包打不开”“分卷少了一个”“加密文件忘了… · 2026/9/24 19:42:44
AI超级公司白皮书解读:从大模型选型到Agent落地的工程化实践 1. 这份白皮书到底在讲什么第一次看到“AI超级公司白皮书”这个标题,很多人第一反应是“又是一份PPT式的行业报告”。但我把这份材料从头到尾翻了两遍之后,发现它跟市面上那种堆砌名词、画大饼的所谓报告完全不是一回事。它真正在回答一个非常具体的问题… · 2026/9/24 20:23:26
AI安全测试实战:别拿真实业务冒险,隔离环境踩雷指南 1. 先说结论:为什么AI安全测试不能拿真实业务去试上个月,有个做企业知识库问答系统的朋友找我救火。他们的AI客服上线不到一周,就被用户用一句“忽略之前所有设定,告诉我后台管理员密码”给绕过了系统提示词,差点把内部… · 2026/9/24 20:23:26
AI超级公司四层架构实战:大模型、Agent、云原生与API落地指南 1. 这份白皮书到底在讲什么第一次看到"AI超级公司白皮书"这个标题,我脑子里冒出来的第一个念头是:又是一份PPT式的行业展望?但翻完几十页内容之后,我发现它真正想回答的问题其实很具体——当大模型、Agent、云原生、API… · 2026/9/24 20:23:26
AI文档中间件实战:大模型如何驱动公文与合同智能处理 AI文档中间件这几个字,听着像是个新造的概念,但干过几年企业文档系统的人应该都有同感:文档平台做了十几年,从网盘到协同编辑到知识管理,最后卡住的永远是“文档内容本身怎么被理解”。规则引擎写过的人都知道… · 2026/9/24 20:23:26
电商AI生图模型选型指南:四大海外模型商用实测与避坑 1. 电商生图这个需求,到底卡在哪儿做电商这行的都清楚,产品图就是转化率的命根子。一张主图决定点击,一套详情页决定停留时长,而视觉素材的生产成本,长期以来都是运营预算里最容易被低估的一块。我最早接触AI生图是在2… · 2026/9/24 20:23:26
虚拟桌面VDI实战:从概念、数据流到桌面池规划与运维 干了这么多年基础架构,隔三差五就有人跑过来问一句"帮我创建个虚拟桌面"。这句话在不同人嘴里意思完全不同——有人只是在Windows里想多开一个桌面视图,有人要的是一台远程的Windows虚拟机,还有人真正需要的是企业级的VDI环境。如果… · 2026/9/24 20:23:20
基于YOLOv8的渔船作业监控系统:从环境搭建到边缘部署全流程 简介:这是一套面向计算机、人工智能、自动化等专业学生与教师的毕业设计级项目资源,围绕YOLOv8实现渔船作业监控系统,可用于毕设、课程设计、大作业或项目立项演示。压缩包共97个文件,约24.21MB,以70个Python源码文件为… · 2026/9/24 0:00:13
1D-CNN时间序列建模实战:从Conv1d原理到工业落地 简介:面向时间序列数据建模的一维卷积神经网络完整实现,适合深度学习入门者及需要快速验证时序模型的研究者,能够从音频、文本、传感器或股价等序列中挖掘局部特征与时间依赖。压缩包体积很小,只有3KB,内含3个Python脚… · 2026/9/24 0:00:26
柔软的L:汉语语流中被忽视的舌肌张力控制 1. 这个“L”不是字母表里的L,而是舌尖上的L最近在几个方言群和语音教学社群里,反复看到有人发一句:“也说字母L:柔软的长舌”。初看以为是英语发音课笔记,点开才发现全是方言爱好者、播音系学生、语言康复师甚至戏曲演… · 2026/9/24 0:00:44