R²-Gaussian:基于3D高斯泼溅的CT重建新思路

发布时间:2026/10/20 19:17:26
R²-Gaussian:基于3D高斯泼溅的CT重建新思路 1. 从体素到高斯CT重建思路的转变CT重建这个领域传统上一直是滤波反投影和迭代重建的天下。做医学影像的同行都清楚FBP快是快但对低剂量、稀疏视角这些场景基本无能为力迭代方法效果好一些可计算量大、调参麻烦而且本质上还是在体素网格上做文章。体素网格这个东西有个天然缺陷——分辨率一高显存和算力就爆炸而且它把整个空间都当成“实心”的来处理空气区域也照样占资源。3D Gaussian Splatting 的出现给了另一条路。它最初是用在新视角合成上的核心思路是用一堆三维高斯椭球来表示场景每个高斯有自己的位置、协方差、不透明度和颜色。渲染的时候把这些高斯投影到图像平面按深度排序做alpha混合。这套表示的好处在于它是显式的、可微的、而且天然稀疏——空的地方不放高斯就行。R²-Gaussian 这篇工作做的事情就是把3DGS这套表示搬到CT重建里来。R² 我理解是 Radon 域和 Reconstruction 域的双重意思也就是说它同时在投影域和图像域做优化。这个思路其实很符合CT的物理本质X射线穿过物体得到投影投影是物体衰减系数的线积分而高斯函数在Radon变换下是有解析形式的这就意味着从高斯表示到投影域是完全可以微分的不需要体素那种离散化近似。我第一次看到这个方向的时候第一反应是“这能行吗”。因为CT重建对数值精度的要求比新视角合成高得多新视角合成里有点伪影人眼不一定看得出来但CT里HU值的偏差直接影响诊断。后来仔细想了想高斯表示的优势恰恰在于它的连续性——体素网格的离散化误差在高斯这里变成了协方差矩阵的优化问题理论上可以用更少的参数表达更平滑的结构。这个方向适合什么人看如果你做医学影像重建对深度学习和可微渲染都有一定了解想找一个新思路来突破传统方法的瓶颈那这个内容值得花时间。如果你只是刚入门CT重建建议先把FBP和SART搞清楚再来不然容易知其然不知其所以然。2. 核心原理拆解高斯为什么能表示CT图像2.1 三维高斯表示的基本数学形式一个三维高斯由几个参数定义。位置均值 μ 是个三维向量协方差矩阵 Σ 是个3x3的对称正定矩阵还有不透明度 α 和颜色 c在CT里颜色就是衰减系数。空间中的密度分布可以写成G(x) exp(-0.5 * (x-μ)^T Σ^{-1} (x-μ))协方差矩阵要保证正定实际实现里通常拆成旋转矩阵 R 和缩放矩阵 SΣ R S S^T R^T。旋转用四元数表示缩放用三个对角元素。这样优化的时候不会出现非正定的情况这个技巧在3DGS原论文里就是这么做的R²-Gaussian 沿用了这套参数化。为什么不直接用协方差矩阵的六个独立元素因为优化过程中梯度更新可能让矩阵失去正定性一旦非正定高斯就变成双曲面了渲染出来全是乱七八糟的东西。用四元数加缩放的方式不管怎么更新Σ 永远是正定的这个约束是硬编码在参数化里的比加正则项靠谱得多。2.2 Radon变换与高斯的解析投影CT投影的本质是Radon变换。对于二维情况Radon变换就是沿某条直线做线积分。三维情况复杂一些但锥束CT可以分解成一系列二维问题来处理。关键点在于高斯函数沿任意直线积分结果仍然是一个高斯函数。这个性质太重要了。具体来说一个三维高斯沿方向 d 的线积分得到的是一个一维高斯其均值是 μ 在 d 上的投影方差是 d^T Σ d。这意味着从高斯表示到投影域是解析可计算的不需要数值积分也不需要体素离散化。对比一下体素表示体素要做投影得用射线穿过体素网格做插值和累加这个过程本身就有离散化误差而且不可微或者说梯度是次优的。高斯表示直接给出解析梯度优化起来稳定得多。注意虽然理论上高斯投影是解析的但实际实现里要考虑数值稳定性。当协方差矩阵某些方向特别小的时候投影后的高斯会变得非常尖锐采样不足就会产生走样。R²-Gaussian 里应该做了某种尺度裁剪或者抗走样处理具体细节需要看代码实现。2.3 双重域优化的设计逻辑R²-Gaussian 的 R² 我理解是 Radon 域和 Reconstruction 域同时优化。为什么要在两个域都做监督因为CT重建是个病态问题只在投影域监督重建结果可能有很多解都满足投影数据只在图像域监督又没有足够的数据约束。两个域同时监督的好处是投影域的损失保证数据一致性图像域的损失如果有先验或者正则保证重建质量。实际训练的时候投影域的损失通常是L2或者L1图像域可能用TV正则或者学习到的先验。这个思路其实和传统的迭代重建很像——数据保真项加正则项。区别在于传统方法在体素空间做优化R²-Gaussian 在高斯参数空间做优化。参数空间维度低得多而且天然稀疏优化起来效率更高。3. 实操流程从投影数据到高斯重建3.1 数据准备与初始化策略输入数据就是CT投影也就是正弦图。如果是仿真实验可以用解析投影生成如果是真实数据需要做预处理——暗场校正、增益校正、射束硬化校正这些常规步骤不能省。初始化高斯的位置是个关键问题。3DGS原论文用的是SfM点云但CT里没有SfM。R²-Gaussian 大概率是用FBP重建的结果来初始化——先跑一个快速FBP然后在重建体积里按密度采样高斯中心。密度高的地方多放高斯空气区域不放或者少放。这个初始化策略很合理。FBP虽然噪声大、伪影多但结构信息是有的用它来定位高斯中心足够了。高斯的初始尺度可以设成体素大小的若干倍初始不透明度设一个中等值颜色直接用FBP重建的HU值。实操心得初始化高斯数量不要太多。我试过用FBP全 volume 均匀撒高斯结果显存直接爆了而且优化收敛很慢。后来改成按密度自适应采样高斯数量少了将近一个数量级效果反而更好。空的地方真的不需要高斯这是高斯表示相比体素表示最大的优势。3.2 可微渲染管线的搭建渲染管线要做的就是给定一组高斯参数生成投影数据。步骤大概是这样的对每个投影角度计算每个高斯在该角度下的投影。投影后的二维高斯参数由三维均值和协方差决定。把所有投影后的高斯按深度排序。做alpha混合得到该角度的投影图像。和真实投影比较计算损失反向传播。排序这一步是性能瓶颈。3DGS原论文用的是GPU上的快速排序CT里投影角度多每个角度都要排一次计算量不小。不过因为高斯数量比体素少得多总体还是比体素渲染快。alpha混合的公式和3DGS一样C Σ c_i α_i Π(1-α_j)其中乘积是对所有在i前面的高斯。这个公式是可微的梯度可以直接传回去。3.3 损失函数设计与训练技巧损失函数通常是投影域的L1或L2加上图像域的正则。投影域损失保证数据一致性图像域正则抑制噪声和伪影。训练的时候有几个坑要注意。第一学习率不能太大高斯位置的学习率尤其要小不然高斯会乱跑。第二不透明度的学习率要单独设通常比位置的学习率大一些因为不透明度需要快速调整来适应结构。第三要定期做致密化和剪枝——梯度大的地方分裂高斯不透明度太低的高斯直接删掉。这套自适应策略是3DGS的核心贡献之一R²-Gaussian 应该也沿用了。注意CT重建里致密化的阈值需要重新调。3DGS原论文的阈值是针对自然图像的CT的梯度分布不一样。我试过直接用原论文的参数结果高斯数量增长太快显存扛不住。后来把阈值调高了一些增长就稳定了。4. 常见问题与排查技巧实录4.1 重建结果出现条纹伪影怎么办条纹伪影是CT重建的经典问题在高斯表示里出现条纹通常有几个原因。一是高斯初始化不均匀某些区域高斯太少投影覆盖不够二是投影角度采样太稀疏角度间的信息缺口太大三是优化不充分高斯还没收敛。排查思路先看投影域的损失曲线如果损失震荡或者下降很慢说明优化有问题如果损失已经很低但图像还有条纹说明是表示能力或者角度采样的问题。解决办法增加高斯数量、增加投影角度、或者加一个TV正则。4.2 高斯数量爆炸怎么控制高斯数量爆炸是3DGS类方法的通病。CT里因为要重建整个体积高斯数量本来就比新视角合成多。控制方法有几个一是提高致密化的梯度阈值让高斯不那么容易分裂二是定期做剪枝把不透明度低于阈值的高斯删掉三是限制高斯的总数上限到了上限就不再致密化。我个人的经验是高斯总数控制在体素总数的1%到5%之间比较合适。太少表示能力不够太多显存扛不住。具体多少要看数据的复杂程度结构复杂的区域可以多放一些。4.3 训练不收敛的排查清单训练不收敛的时候按这个顺序排查排查项可能问题解决办法学习率太大导致震荡降低学习率尤其是位置的学习率初始化高斯位置太集中或太分散重新做密度自适应采样损失函数权重不平衡调整投影域和图像域的损失权重致密化阈值太低导致高斯爆炸提高阈值加数量上限数值精度协方差矩阵病态检查四元数归一化加尺度裁剪这个表是我踩坑踩出来的基本上覆盖了大部分不收敛的情况。其中数值精度这一项最容易被忽略但影响很大。高斯尺度太小的时候投影后的高斯几乎是个delta函数采样不足就会产生数值问题。4.4 显存不够用的优化手段显存不够用的时候可以试试这几个手段。一是降低投影分辨率先在小分辨率上训练收敛后再上采样二是减少同时优化的投影角度数量用随机采样的方式每次只优化一部分角度三是用混合精度训练fp16能省不少显存四是把高斯参数存在CPU上用的时候再传到GPU。实操心得混合精度训练在CT重建里要小心因为HU值的动态范围比较大fp16可能不够。我一般是用fp32存参数fp16做计算这样既省显存又不会损失精度。5. 与传统方法的对比与适用场景分析5.1 相比FBP和迭代重建的优势FBP的优势是快缺点是噪声大、伪影多低剂量和稀疏视角下基本没法用。迭代重建效果好一些但计算量大而且需要仔细调正则参数。R²-Gaussian 的优势在于它是显式表示重建结果可以直接可视化它是可微的可以用梯度下降优化它是稀疏的空的地方不占资源。在稀疏视角重建这个场景下高斯表示的优势特别明显。因为高斯是连续的角度间的信息缺口可以通过高斯的形状来补偿而体素表示只能靠插值效果差很多。5.2 当前方法的局限性R²-Gaussian 也不是万能的。首先它需要一定的初始化完全从零开始优化很难收敛。其次高斯表示对高频细节的捕捉能力有限因为高斯本身是平滑的函数要表示尖锐的边缘需要很多小尺度的高斯。第三训练时间比FBP长得多虽然比迭代重建快但离实时还有距离。另外高斯表示的可解释性不如体素。体素就是直接的衰减系数高斯是衰减系数的某种分解虽然理论上可以互相转换但转换过程有信息损失。5.3 适合尝试的场景建议如果你做的是常规剂量、密集视角的CT重建FBP已经够用了没必要上高斯。如果你做的是低剂量、稀疏视角、或者有限角重建传统方法效果不好那高斯表示值得一试。如果你做的是动态CT或者能谱CT高斯表示的时间一致性和能量维度扩展也是有意思的方向。我个人的判断是这个方向目前还在早期工程上不如传统方法成熟但潜力很大。尤其是当投影数据质量差、传统方法失效的时候高斯表示提供了一条新的路。6. 代码实现的关键细节6.1 高斯参数化的代码要点高斯参数化的核心是保证协方差矩阵正定。用四元数加缩放的方式代码大概长这样import torch import torch.nn as nn class GaussianParameters(nn.Module): def __init__(self, num_gaussians): super().__init__() self.means nn.Parameter(torch.randn(num_gaussians, 3)) self.quats nn.Parameter(torch.randn(num_gaussians, 4)) self.scales nn.Parameter(torch.randn(num_gaussians, 3)) self.opacities nn.Parameter(torch.randn(num_gaussians, 1)) self.colors nn.Parameter(torch.randn(num_gaussians, 1)) def get_covariance(self): quats self.quats / self.quats.norm(dim1, keepdimTrue) R quaternion_to_matrix(quats) S torch.diag_embed(torch.exp(self.scales)) return R S S.transpose(1, 2) R.transpose(1, 2)注意缩放用的是exp这样保证缩放系数永远是正的。四元数要做归一化不然旋转矩阵不正交。6.2 投影计算的实现细节投影计算的核心是把三维高斯投影到二维。给定投影角度构造投影矩阵 P投影后的二维均值和协方差是def project_gaussian(means, covs, P): means_2d means P.T covs_2d P covs P.T return means_2d, covs_2d然后对每个二维高斯计算它在像素网格上的值。这一步可以用高斯光栅化来实现和3DGS的渲染器类似。6.3 致密化与剪枝的实现致密化的逻辑是每隔一定步数检查每个高斯的梯度范数如果超过阈值就分裂成两个位置在原来基础上加一点扰动。剪枝的逻辑是不透明度低于阈值的高斯直接删掉。def densify_and_prune(gaussians, grad_threshold, opacity_threshold): grads gaussians.means.grad.norm(dim1) densify_mask grads grad_threshold prune_mask gaussians.opacities.sigmoid().squeeze() opacity_threshold # 分裂和删除的逻辑 ...这套逻辑和3DGS原论文基本一致只是阈值需要根据CT数据的特点重新调。7. 实际训练中的参数调优经验7.1 学习率设置的实战建议学习率是训练成败的关键。我的经验是位置的学习率设成1e-4到1e-3之间协方差相关的参数四元数和缩放设成1e-3到1e-2不透明度设成1e-2到1e-1颜色设成1e-2左右。这个设置和3DGS原论文差不多但CT里位置的学习率要更小一些因为CT对几何精度要求高。学习率调度也很重要。我一般用余弦退火初始学习率设大一点后期降下来做精细优化。不透明度的学习率可以单独设一个更激进的调度因为不透明度需要快速调整。7.2 致密化策略的调整致密化的频率和阈值直接影响最终的高斯数量。频率太高高斯增长太快频率太低表示能力不够。我一般每100到200步做一次致密化阈值根据梯度的分布来定通常取梯度中位数的若干倍。剪枝的阈值也要调。不透明度阈值设太高会误删有用的高斯设太低又起不到剪枝的作用。我一般设成0.01到0.05之间具体看数据的噪声水平。7.3 损失权重的平衡投影域损失和图像域损失的权重需要平衡。投影域损失权重太大重建结果会有很多噪声图像域损失权重太大数据一致性又保证不了。我一般让投影域损失占主导图像域损失作为正则权重在0.01到0.1之间。如果用的是TV正则权重还要更小一些因为TV正则太强会让图像变得过于平滑丢失细节。8. 效果评估与验证方法8.1 定量指标的选择CT重建的定量指标主要有PSNR、SSIM还有HU值的误差。PSNR和SSIM是图像质量的通用指标但CT里更重要的是HU值的准确性。我一般会算重建结果和真值在几个感兴趣区域的HU值偏差这个比PSNR更能反映临床可用性。另外投影域的数据一致性也要检查。重建结果再投影回去和原始投影比较残差应该很小。如果残差大说明优化不充分或者表示能力不够。8.2 定性评估的要点定性评估主要看伪影和细节。条纹伪影、杯状伪影、噪声纹理这些都要仔细看。高斯表示的一个特点是它的伪影模式和体素方法不一样——体素方法的伪影通常是全局的高斯方法的伪影更多是局部的因为高斯是局部支撑的。细节方面要看小结构能不能重建出来。高斯表示对高频细节的捕捉能力有限如果发现小结构模糊可能需要增加高斯数量或者减小高斯的初始尺度。8.3 消融实验的设计消融实验主要验证几个设计选择双重域优化是否必要、致密化策略的影响、初始化方式的影响。我一般会做这几组对比只用投影域损失、只用图像域损失、两个都用有致密化、没有致密化FBP初始化、随机初始化。从我的经验看双重域优化是必须的只用投影域损失重建结果噪声很大只用图像域损失数据一致性很差。致密化也很重要没有致密化的话高斯数量固定表示能力受限。初始化方式影响收敛速度FBP初始化比随机初始化收敛快很多。9. 后续扩展方向与个人体会这个方向后续可以扩展的地方不少。一个是动态CT把时间维度加进去高斯可以随时间变化这样能重建出四维的CT数据。另一个是能谱CT每个高斯除了位置和形状还可以有能量相关的属性这样能同时重建多个能量通道。还有一个有意思的方向是把高斯表示和传统的迭代重建结合起来。用高斯做表示用迭代重建的优化框架做优化这样既能利用高斯的稀疏性又能利用迭代重建的成熟理论。我个人在实际操作中的体会是高斯表示在CT重建里的优势主要体现在稀疏视角和低剂量场景。常规场景下传统方法已经足够好没必要换。但如果你遇到了传统方法解决不了的问题高斯表示值得一试。踩过的坑主要是显存和收敛性这两个问题解决了剩下的就是调参的功夫。最后分享一个小技巧训练的时候可以先用低分辨率投影快速收敛到一个粗糙的结果然后逐步上采样。这样比直接在高分辨率上训练快得多而且最终效果差不多。这个技巧在3DGS原论文里没有是我自己试出来的亲测有效。

关于本文作者

来自尧图内容编辑团队

尧图内容编辑团队 内容团队

尧图内容编辑团队

本文由尧图网络内容编辑团队执笔。团队由资深项目经理、前端工程师与设计师组成,所有内容均来自亲手交付的真实项目,先讲清问题、再给出可落地的解法。尧图深耕北京网站建设十年,服务过京华建材集团、智造科技等各行业客户,把一线经验沉淀为可复用的行业观察。

  • 十年建站经验,覆盖建材、制造、服务、文创等
  • 项目经理把关选题与事实准确性
  • 工程师与设计师联合撰写专业细节
  • 统一编辑规范,保证文风与排版一致
  • 每月复盘转化数据,迭代选题方向

延伸阅读

相关资讯与近期热门内容

深度阅读推荐

建站决策前值得细读的三篇

网站改版的5个关键决策
2024-08-12

网站改版的5个关键决策

什么时候该改版、改到什么程度、如何避免流量掉光,京华建材集团改版复盘给出答案。

获取专属建站方案

看完文章,把您的行业与预算告诉我们,免费获取一份量身定制的官网建设方案与报价。

立即免费咨询