TIGRE: a MATLAB-GPU toolbox for CBCT image reconstruction

2023-12-13 17:13:31

TIGRE: 用于CBCT图像重建的MATLAB-GPU工具箱

在这里插入图片描述

论文链接:https://iopscience.iop.org/article/10.1088/2057-1976/2/5/055010

项目链接:https://github.com/CERN/TIGRE

Abstract

本文介绍了基于层析迭代GPU的重建(TIGRE)工具箱,这是一个用于快速准确重建3D X射线图像的MATLAB/ CUDA工具箱。其中一个关键特征是实现了各种各样的迭代算法和FDK,包括SART族中的一系列算法,Krylov子空间族和使用全变分正则化的一系列方法。此外,该工具箱具有GPU加速投影和使用最新技术的反投影,并且它具有模块化设计,便于新算法的实现。我们概述了创建工具箱时使用的结构和技术,并提供了两个使用示例。TIGRE工具箱是在开源许可下发布的,鼓励人们做出贡献。

1. Introduction

在广泛使用的X射线计算机断层扫描(CT)技术中,锥束几何技术越来越受到人们的关注,从医学成像到材料科学。使用降低的X射线辐射剂量重建完整三维图像的可能性是CBCT在医学领域发展的一个重要特征,它导致了微ct高质量的三维重建[1]。应用包括颌面成像[2]、肿瘤学放射治疗指导[3]、昆虫成像[4]和材料科学[5]。

在CBCT的所有应用中,其工作原理都是相同的: 从不同角度获取“样本”的二维X射线图像,并使用层析重建算法从数据中创建图像。事实上,在环形锥束CT(circular CBCT)中,原始图像在数学上是不可能获得的[6,7],以及其他因素,如问题的高维数或光子不同物理效应造成的不一致性,使得图像重建问题被数学家定义为病态问题。需要高等数学才能得出解决方案。这导致了对图像重建算法的扩展研究,各种已发表的方法给出了不同的结果。这仍然是一个热门话题。

虽然CBCT的应用越来越广泛,覆盖了不同的成像领域,重建算法的研究也不断有新方法发表,但无论是在医学和微层析成像领域,图像的最终用户主要使用最简单的重建算法FDK[8]。这是令人担忧的,因为虽然FDK可以产生令人满意的高质量、全投影、无噪声的图像,但它在不太理想的情况下表现不佳。反复证明迭代算法[9]优于FDK[10-14]。

有几个因素影响数学和用法之间缺乏联系。主要是计算时间。大多数(如果不是全部的话)替代算法都是迭代的。它们需要重复地重新计算操作,这些操作非常占用内存和计算成本,而FDK需要的时间比一次这样的迭代要少。这一点很重要,特别是在医疗应用中,因为医疗决策是根据可以从图像中读取的内容做出的,因此需要快速地获取图像。对于最复杂的算法和更大的数据,迭代算法在现代计算机CPU上运行的时间尺度是几小时、几天甚至几周。另一个因素是缺乏易于使用和自由分布的迭代算法。虽然一些最新的工具箱(稍后介绍)确实包含了一些迭代算法,但这些算法中的绝大多数都被开源和商业图像重建软件完全忽略了。这种缺乏,再加上重建算法的研究需要对线性代数和逆问题等数学领域有深入的了解,使得迭代算法对重建图像的最终用户来说有些遥不可及。

为了减少算法研究和最终使用之间的差距,我们开发了基于层析迭代GPU的重建(TIGRE)工具箱,这是一个MATLAB/GPU工具箱,具有广泛的迭代算法。它使用MATLAB的高级抽象和CUDA的较低(特定于硬件)性能,以使其快速和易于使用。为了将不同的领域结合在一起,我们使用最新的GPU计算技术,通过大规模并行化和内存管理效率来解决计算时间问题。只有主要的计算昂贵的块被并行化,采用模块化设计,允许算法研究人员轻松地将新方法与提供的GPU块结合在一起。此外,这些算法可以作为单线函数使用,给那些只对结果图像感兴趣的研究人员提供了完全的抽象,而不是算法开发。

在解释TIGRE工具箱的细节之前,有必要提一下其他一些可用的工具箱。有几个商业和免费的FDK重建软件包,包括(但不完全)CoBRA[15]、Ultrafast CBCT重建[16]、OSCaR[17]、Accelerating ConebeamCT[18]。此外,还有一些更高级的工具箱,包括一种或两种迭代重建算法(SIRT和/或CGLS),如ASTRA[19]、RTK[20]和3D CB CT MATLAB[21]。其中,ASTRA和RTK是最完整的工具箱,但是它们在低级编程语言中的基础结构使它们在开发新算法时不太适合使用。

本文简要介绍了CBCT图像的重建问题,以及解决该问题的一些方法。然后,我们概述了TIGRE工具箱的结构,并展示了一些性能结果和一些重建图像。最后,我们讨论了工具箱的未来愿景。

2. Methods

2.1. CBCT几何

CBCT的几何结构如图1所示。

在这里插入图片描述

X射线源S位于距离直角坐标系原点O的旋转中心DSO处。X射线源照射一个包含图像体积 I \mathbb{I} I的锥形区域,探测器 D \mathbb{D} D测量撞击到该区域的光子强度,这些光子根据比尔-兰伯定律被衰减。图像的中心位置为 O ′ O^{'} O',从坐标系原点偏移了 V o r i g → \overrightarrow{V_{\mathrm{orig}}} Vorig? ?。探测器位于距离源DSD处,以 D ′ D^{'} D'为中心,距D的偏移量为 V det ? → \overrightarrow{V_{\det}} Vdet? ?, D是位于X平面上距离原点DSD-DSO处的点。投影坐标系uv以探测器的左下角为中心定义。在测量采集过程中,光源和探测器从初始位置绕z轴以 α α α角旋转。

TIGRE工具箱中使用上面描述的几何变量来执行图像重建所需的操作,如代码片段1所示。值得一提的是, V det ? → \overrightarrow{V_{\det}} Vdet? ? V o r i g → \overrightarrow{V_{\mathrm{orig}}} Vorig? ?都是定义每个投影的单个偏移量的向量。

在这里插入图片描述

2.2. 图像重建问题

对于给定的几何图形,图像重建可以用两种不同的方法来描述。第一种方法是通过求解Radon逆变换,这是一种描述函数在直线上的积分的数学工具。Radon逆变换的解在层析成像中是众所周知的,Feldkamp, Davis和Kress将其修改为CB几何。其解决方法被称为FDK算法[22]。虽然FDK算法在理想情况下可以产生高质量的图像,但它在处理常见的未考虑的误差源时表现不佳,例如线束硬化或光子散射[23]。

或者,图像重建问题被描述为最小化问题,如公式(1)所示,其中 b b b是投影数据, x x x是图像, A A A是描述图像中X射线和体素相交的矩阵。在这个方程中, G ( x ) G(x) G(x)是描述正则化泛函 G ( ? ) G(·) G(?)的可选项。这个函数可以用来给图像重建算法引入额外的约束。
x ^ = a r g m i n x ∥ b ? A x ∥ 2 + G ( x ) . (1) \hat{x}=\mathrm{argmin}_x\|b-Ax\|^2+G(x). \tag{1} x^=argminx?b?Ax2+G(x).(1)
虽然最小化公式允许使用先进的线性代数技术,但有一个重要的复杂性:矩阵 A A A的大小。这一点尤其重要,因为大多数(如果不是全部的话)求解公式(1)的迭代技术使用一个 A x Ax Ax和一个 A T b A^T b ATb矩阵向量乘法。例如,代码段1中描述的360投影的几何矩阵 A A A有94 371840 × 134 217 728个元素,稀疏度指数为0.0017%。即使使用优化的稀疏内存方法,这也需要320 Gb的内存。

为了处理这种规模的问题,最常见的方法是用运算符 A ( x ) A (x) A(x) A T ( b ) A^T (b) AT(b)替换矩阵向量乘法 A x Ax Ax A T b A^Tb ATb,必要时重新计算相关的矩阵值。虽然执行运算非常昂贵,但运算符有一个优点:值彼此完全独立,使它们适合并行计算。在TIGRE工具箱中,这两个运算符已经在能够同时计算超过60K浮点运算的GPU中使用CUDA实现。与基于矩阵的方法相比,这导致了高达1400倍的加速。

2.3. 工具箱结构

在本节中,给出了工具箱结构的概述(见图2)。如前一节所述,任何迭代算法的主要构建块是所谓的投影( A ( x ) A(x) A(x))和反投影( A T ( b ) A^T(b) AT(b))算子。在TIGRE工具箱中,这两个模块已经针对使用CUDA的GPU计算进行了优化。它们位于工具箱设计的最底层,并且经常被其他层使用。算法本身位于最顶层,全部用MATLAB编码,这提供了高级语言的功能和灵活性。为了能够在低级的、面向硬件的CUDA和高级的、面向设计的MATLAB之间进行通信,需要一组所谓的MEX函数。工具箱的设计不包含任何特定的数据类型或类。相反,它只包含基本的MATLAB类型,如矩阵和结构。

在这里插入图片描述

2.3.1. 投影和反投影

如前所述,工具箱的主要构建块是投影和反投影运算符的CUDA/ C++实现。从概念上讲,矩阵 A A A是描述在给定域上测量的X射线衰减的模型的线性化,并且可以在文献中找到几种不同的计算方法。类似地,反投影是在域上施加加权的一种“模糊”过程。不详细解释所有可用的方法,我们简要描述工具箱中使用的方法。

对于投影,实现了两种方法:体素-射线相交法和插值法。第一种方法使用了优化操作的Siddon射线追踪算法[24] [25]。该算法计算给定体素与无限小窄X射线束之间的距离,并将其乘以体素强度。这种方法是计算投影仪的最快方法。然而,众所周知,由于体素的大小有限,引入离散化方块伪影,体素越大,伪影变得越重要。为了避免这个问题,实现了一种三线性插值方法,其中每固定 Δ l \Delta l Δl计算路径积分,并使用高级纹理记忆对图像值进行插值。为了实现这一点,在问题的几何定义中添加了一个额外的变量: g e o . a c c u r a c y = 0.5 geo.accuracy=0.5 geo.accuracy=0.5,,它将 Δ l \Delta l Δl定义为体素大小的一小部分。如Jia等[26]所示,该分数最好选择0.5或更低。

对于反投影,使用了基于相同概念的两种不同方法。最初,射线从源位置链接到所需的体素,并扩展到检测器。在那里,使用双线性插值,读取一个值并将其添加到具有权重的体素中。两个后投影的区别在于这个权重。其中一个实现了FDK权重。然而,这使得反投影不匹配,也就是说,它使得反投影算子不等于投影的转置。虽然对大多数算法并不重要,但这对Krylov子空间方法至关重要。为了改变这种情况,我们使用了Jia等[27]描述的匹配权值。虽然不完全匹配,但他们声称它与矩阵 A A A的转置相似度超过99%。两个反投影的性能相似。

2.4. 算法

我们希望在TIGRE工具箱中引入的关键特性之一是算法的多样性。在图像重建领域,使用不同的求解器和正则化技术,出现了多种求解公式(1)的方法。目前工具箱的实现中有四个主要的重建算法族:滤波反投影族、SART型族、Krylov子空间方法族和总变分(TV)正则化族。下面是对每个算法子组的简要描述,以及工具箱中包含的算法。

滤波反投影族是一组基于求解Radon逆变换的算法。该算法的不同变体已在文献中提出,但工具箱仅包含标准的FDK实现和少量的滤波核选择。

SART类型族[28]是一组最初源自Kaczmarz方法的算法,适用于逐投影而不是逐行工作。这类算法遵循一个公式:
x k + 1 = x k + λ k V A T W ( b ? A x k ) , (2) x^{k+1}=x^k+\lambda^kVA^TW(b-Ax^k), \tag{2} xk+1=xk+λkVATW(b?Axk),(2)
其中 V V V W W W是基于射线长度的权重矩阵。这类算法的主要区别在于同时使用的投影数量。在TIGRE工具箱中,实现了SIRT、OS-SART[29]和SART,其中分别使用所有投影、投影子集或逐个投影更新图像。此外,工具箱还提供了用于调优算法的不同选项。例如,实现了不同的初始化技术,例如FDK、multi-grid或user-specified的图像。这类算法性能的主要区别在于收敛与速度。在一次更新中使用的数据越多,每次迭代算法的速度就越快,但收敛速度(迭代次数)就越慢。为了获得更精确的解,建议使用SART,而使用SIRT获得更快的结果,而OSSART介于两者之间。

Krylov子空间方法是求解线性方程的一组快速算法。它们通过Krylov子空间进行迭代,以降序最小化残差的特征向量,因此相对于SART系列而言具有更高的收敛速度。从这个家族中,共轭梯度最小二乘(CGLS)[30]被添加到TIGRE工具箱中。与SIRT等算法相比,这类算法只需要大约十分之一的迭代就能得到类似的结果,而每次迭代的计算成本几乎相同。这些方法依赖于所谓的“Krylov子空间”的迭代,它是由作用于 b b b A A A k k k次幂的线性组合产生的:
K r ( A , b ) = s p a n { b , A b , A 2 b , … , A k ? 1 b } . (3) K_{r}(A,b)=\mathrm{span}\{b,Ab,A^{2}b,\ldots,A^{k-1}b\}. \tag{3} Kr?(A,b)=span{b,Ab,A2b,,Ak?1b}.(3)
最后,纳入总变分(TV)正则化族。总变差范数是图像去噪中常用的约束条件,它约束图像的分段平滑性。随着ASD-POCS算法的出现,它被引入到CT中[31]。当数据非常嘈杂或投影数量减少时,这组算法特别好,因为分段平滑约束迫使图像进入最小噪声状态。在这个家族中,实现了ASD-POCS(或POCS-TV)、OSC-TV[32]、B-POCS-TV-β[33]和SART-TV[34] (最小化Rudin-Osher-Fatemi模型)。总变化(TV)最小化已经部分GPU加速。这类算法的局限性之一是,它们需要比其他类型的算法调整更多的参数,通常需要多次测试,直到找到最优行为。这类算法的特殊之处在于问题的双重优化。他们首先最小化数据,使用前面提到的一些算法,然后最小化“总变化(TV)”,本质上是图像中的噪声。它们之间的主要区别在于每个最小化步骤中使用的工具。ASD-POCS、OSC-TV和B-POCS-TV-β通常在数据量有限的情况下表现较好,而SART-TV在从噪声投影中重建数据方面具有重要作用。最小化问题可以用数学形式表示为:
x ^ = a r g m i n x ∥ b ? A x ∥ 2 + ∥ x ∥ T V . (4) \hat{x}=\mathrm{argmin}_{x}\|b-Ax\|^{2}+\|x\|_{\mathrm{TV}}. \tag{4} x^=argminx?b?Ax2+xTV?.(4)
除了图像重建算法外,TIGRE还包括一些基本的图像去噪、绘图、加载数据和质量测量工具。这些工具包括投影和图像绘图工具,图像去噪功能,CBCT裁剪工具和投影噪声模拟器等。该工具箱包含演示,用于说明所有算法的使用,并对它们可能需要的每个参数进行了广泛的解释。对于所包含的每个函数也有帮助页面。

3. Results

在本节中,我们将通过提供一些性能数据和一些图像重建示例来演示工具箱的工作原理。在得到结果之前,值得一提的是开发和测试工具箱的计算机的规格。该计算机是64位Windows 7,具有Intel?CoreTM i7-4930K 3.40 GHz CPU和32 Gb RAM,在NVIDIA Tesla K40 GPU上运行MATLAB?(R2014b, The Mathworks, Cambridge, UK)。

3.1. 性能

GPU加速投影和反投影的性能分别如图3和图4所示。在所有这些测试中,都忽略了内存分配时间。

在这里插入图片描述

在这里插入图片描述

该代码已经运行了一个单一的投影与不同的图像和检测器大小投影类型,插值和射线体素相交。对于10243图像尺寸和10242探测器尺寸(比标准医疗设备大得多),每次投影所需的时间高达1秒。插值测试每半体素取一个样本,在此采样率下,射线-体素相交算法比插值算法快4倍左右。对于代码片段1中的几何图形(取自医疗设备),射线体素相交算法每10毫秒计算一次投影。

一个单一的反投影测试显示为两个反投影执行相似。还需要注意的是,正如预期的那样,反投影性能与检测器的大小无关。

3.2. 示例代码

为了说明工具箱的使用和功能,我们提出了两个例子,一个是phantom数据,另一个是从英国曼彻斯特克里斯蒂医院的RANDO头部phantom获得的数据。

3.2.1. RANDO头部重建

我们将首先演示使用代码片段1中定义的几何形状的三种不同算法重建RANDO头部phantom。该数据集包含360个等距投影。一旦使用代码片段2中的代码加载了数据,就可以在不需要任何其他代码的情况下获得图5的结果。显示了总计算时间和每次迭代计算时间的信息。代码片段中只显示了一些可能的选项,但是可以进行更多的自定义。我们建议读者参考已发布的文档,了解高级选项和它们的数值范围。

在这里插入图片描述

在这里插入图片描述

3.2.2. few投影的重建

第二个测试使用3D Shepp-Loganphantom来演示在投影较少的情况下,不同算法产生的图像质量的差异。仅使用20个投影,使用FDK, OS-SART和ASD-POCS重建图像。代码片段3演示了如何加载数据、设置参数和重建有限数量的投影数据。

在这里插入图片描述

结果如图6所示,并强调了这些算法在某些场景中的不同行为。

在这里插入图片描述

3.3. 使用TIGRE实现一个算法

为了演示任何人都可以使用TIGRE工具箱开发新算法的功能,我们在本节中使用GPU加速功能对算法定义及其TIGRE等效代码进行并排比较。为简洁起见,本文选择了CGLS算法。

表1显示了CGLS迭代的定义和TIGRE中的实现。从代码片段中,我们希望强调与库相关的函数的有限使用,因为从开发人员的角度来看,TIGRE的优势之一是易于使用的应用程序编程接口。代码与完全标准的MATLAB脚本的唯一区别是使用了函数A(x)和AT(b),这是工具箱的主要构建块,如第2.3节所述。这允许任何人用MATLAB代码来解决图像重建,只需通过TIGRE GPU函数更改矩阵向量操作即可轻松修改代码。

在这里插入图片描述

请注意,TIGRE中的函数通常比这里显示的代码更多,因为使用了几个选项和性能增强的MATLAB工具。

4. Discussion

在本文中,我们提出了一个MATLAB/CUDA工具箱,用于快速三维x射线图像重建。虽然工具箱具有相当好的性能——使用复杂的迭代算法将图像重建减少到几分钟——并且有各种各样的工具,但改进是可能的。

投影和反投影运算符已经在GPU中完全实现,但是算法完全在CPU中,因此存在内存管理开销,因为每次迭代需要从GPU中引入和提取两次数据。提出本设计的目的是为了有在高级语言中的算法,因为算法在C++等低级语言中的实现周期比在MATLAB中要长得多。我们估计,如果算法直接用C++/CUDA编写,在某些情况下可以实现高达50%的计算时间改进。然而,这将增加向工具箱中添加新算法的难度。我们认为,对于新算法来说,高级编程语言的优势比速度翻倍可能带来的好处要好,这已经相当不错了。与ASTRA工具箱相比,TIGRE的正向和反投影速度要慢2.4倍。这很容易用两个因素来解释。首先,与ASTRA相比,TIGRE中CBCT的几何选项更加灵活,因此需要更多的浮点运算。其次,ASTRA实现了先进的射线分裂,增加了GPU的内存延迟,并利用了不同角度的X射线路径之间的重叠[35]。然而,由于使用了不计算相邻角的算法(如SART或OS-SART),这样的漏洞没有在TIGRE中使用,增加了GPU的内存读取时间。同样的道理也适用于反投影。加上所有讨论过的会降低时间性能的影响,所有算法在TIGRE中的运行速度都比在ASTRA中慢5倍,这是目前的技术水平。数值上,ASTRA与TIGRE之间的差异为10?3量级的绝对值,相对差异约为0.01%。这种差异可以归因于GPU代码中不同数值方法所导致的累积浮点误差。

为了进一步加快投影和反投影运算,还可以采用多GPU方法[36]。目前,TIGRE不支持多GPU架构。工具箱的另一个缺点是用于数据加载和后处理的函数很少。然而,我们正在发布第一个版本,并将继续工作,希望在不久的将来填补这一空白。TIGRE的另一个限制来自当前GPU技术的限制。目前,12GB是GPU板上的最大内存,因此限制了可以重建的图像的可能大小。尽管如此,大多数算法重建10243图像没有问题,所以最大图像大小仍然很大。

TIGRE工具箱的设计目标是减少图像重建研究与层析成像最终用户之间的差距。虽然重建研究每年都会产生新的算法,但最终用户只能访问FDK实现。考虑到这两组,工具箱:

  • 具有易于使用的“黑匣子”算法,使其非常直接的研究人员谁只对图像的质量感兴趣的测试不同的算法,而不需要知道算法是如何工作的;
  • 具有易于使用的构建块(投影和反投影运算符),允许算法开发人员使用高级编程语言测试新方法,但具有最低级别GPU语言的性能。

代码以开源形式发布,任何人都可以下载、测试、修改和改进它。我们热情地鼓励提交改进、bug修复、演示、数据和任何其他可能对社区有帮助的东西。同样,我们鼓励算法开发人员将他们的新算法提交到工具箱中,使其可见。最后,我们想鼓励X射线图像最终用户包括他们可能遇到的具体挑战的数据或描述,允许对话,并希望导致更好的方法来创建增强层析图像。

虽然工具箱最初是为CBCT图像重建而设计的,但也包括3D平行束CT重建选项,允许更多几何形状,例如同步加速器数据。进一步调整工具箱的几何结构,还可以重建二维扇形和平行光束。运行工具箱的最低要求很大程度上取决于所需的图像大小,因为内存是CPU和GPU端最强的限制因素。一般来说,任何计算能力高于3.5的NVIDIA GPU都足以重建任意大的图像。我们建议在GPU内存中至少有3倍所需的图像大小,在计算机中有8倍的RAM。例如,对于5123映像,建议的最小配置是2GB的GPU内存和6GB的计算机RAM。计算能力(GPU的处理器数量和CPU的处理器性能)对图像重建的速度有很大的影响。因此,我们建议使用最先进的CPU和面向计算的GPU,例如特斯拉家族的GPU。

5. Conclusions

一个三维层析成像重建工具箱已经开发与快速GPU为基础的算法和各种各样的工具和图像重建算法。虽然TIGRE是为CBCT成像而创建的,但它可以用于任何几何形状,特别是3D几何形状。有了这个工具箱,我们希望让研究人员更容易使用先进的算法,并提供一个应用数学家和图像用户可以工作和协作的平台。因此,它将有助于将这种先进的算法与更常用的算法进行比较,从而表明有可能以更少的投影和更少的剂量实现相同的图像质量。未来的发展将包括可能的性能优化、更多算法、对文件格式和后处理算法的额外支持。通过TIGRE工具箱,我们希望在成像社区之间建立一座桥梁,并提供一个平台,让他们可以通过软件进行交互。

文章来源:https://blog.csdn.net/weixin_43790925/article/details/134973162
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。