温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,汇文网负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
网站客服:3074922707
2023
胡杨
检测
第三章 GPU加速和深度学习辅助诊断
3.1 GPU加速
在本文中,我们共有两处涉及到GPU加速,图像分割和三维渲染,由于我们采用VTK来进行三维数据可视化,并且VTK中有封装的vtkGPUVolumeRayCastMapper类,可以方便地进行GPU的加速。我们遇到的问题在于图像分割局部。通常来讲,图像分割就是将图像分为不重叠的区域,每一个区域具有一些相同的特性,如亮度或纹理【22】。如果将图像的整个空域定义为 ,那么分割的目的就是要决定 ,全集为。因此,分割的所有像素集必须满足,
此处 且 ,并且每一个 都是相连的。在医学图像的分割中,理想情况下,这些子集会对应到不同的解剖区域或感兴趣区上。
目前常见的分割方法类型有阈值法、区域生长法、聚类法、马尔科夫场模型、可形变模型、人工神经网络分割等等。在这些方法中,区域生长法是常用来分割单一或简单的结构【23,24】。在我们的实验中,采用了一种区域生长方法:置信连接算法。在ITK中,由itk::ConfidenceConnectedImageFilter类提供这个算法的一个CPU版本。这个算法对于三维图像的分割非常缓慢,所以我们使用了加速处理。GPU 适合于处理能够表示为数据并行计算( 同一程序在多个数据上并行执行) 的算术计算密度( 算术操作和存储器操作的比例) 非常高的问题。本文算法局部地属于这一类问题,所以我们使用GPU进行了加速。
概念定义
区域生长算法都要解决三个问题:第一,选择假设干个种子点,种子点代表了需要分割的区域;第二,像素的合并判据,即生长过程;第三,确定生长过程停止规那么【25】。置信连接算法是区域生长法的一种,其原理是基于区域统计,也就是使用全局信息来作为判据进行像素合并。
首先使用表示目标区域的像素集合,使用表示区域外像素集合。然后,用来表示第种子点,这样,种子点就描述为,表示种子点的个数。对于种子点的邻域,我们使用表示,所以邻域像素描述为,表示邻域个数,在二维数据中一般,三维数据中一般。
在迭代过程中,我们需要一个中转的需要检查的像素的队列,我们记为。表示这个队列的长度,它会随着目标区域的扩大而逐渐变大或变小。
该算法计算目标区域中包含的所有像素的强度值的平均值和标准差(初始化时为种子点的邻域)。此外,需要一个用户设置的倍率因子来乘以标准差,并以此定义一个在以均值为中心的取值范围。其公式表述如公式??,
其中m和分别是区域内像素的均值和标准差,是用户指定的倍率因子,为图像,X为特定邻域的坐标位置。
3.1.2算法描述
第一步,选定种子点,设置倍率因子,设置迭代次数。
第二步,将放入,将放入。
第三步,计算的m和,如果,那么使用其邻域计算m和。并以此得到范围。
第三步,迭代中的所有邻域像素,共需要次迭代。
第四步,判断的邻域,如果邻域像素的值在中, 那么将放入队列尾部,表示下一次需要再检查是否外部还有区域内的像素。将移出,将参加。
第五步,重复第四步,直到中没有像素,表示在当前的判据内已经不存在区域外像素,完成一次迭代。
第六步,如果迭代次数小于,那么返回第三步。否那么完成迭代,输出结果。
从算法中,我们可以看到,这个过程会随着点数的扩大而迭代对应的次数,算法时间复杂度为,这是没有计入计算均值和标准差时间的。当我们使用三维数据时,由于点数的剧增,使得算法速度下降。例如,我们在实验中使用的一个344层的像素的CT整个数据的点到达90177536。这对于任何普通CPU来说都是一个巨大的数值。如果要实际应用,就必须对算法进行加速。
3.1.3 GPU算法设计
OpenCL的计算是通过将设备看作是相同的一种结构,如图??所示。它是由一个控制设备(Host)和一组计算设备(Computer Device)组成的。其中控制设备通常由一个CPU担任,而通常计算设备由一些其他GPU、CPU担任。计算设备会切分成很多处理元素(Processing Element),很多个处理元素可以组成组为一个计算单元(Computer Unit),一个计算单元内的元素之间可以方便的共享一块内存,只有一个计算单元内的元素之间可以进行同步操作。现代的GPU 的硬件体系架构被设计成为大规模并行的,可编程的,具有多级存储的阵列处理器结构。而OpenCL为所有的设备设计了一套统一的内存识别结构如图??所示。OpenCL对于计算设备的内存分为三层:计算设备层面的global,计算单元层面的local,处理元素层面的private。而在软件接口上,OpenCL是通过给一个设备(Device)或一组设备建立一个上下文环境(Context)来进行管理,建立上下文之后,一个Context中的所有设备视为一个设备。然后通过命令队列(Command Queue)的方式为Context提供需要执行的程序(Program)和参数,并返回结果。OpenCL将处理元素称为WorkItem,将计算单元称为WorkGroup。另外,OpenCL中的程序并不是一个整体,而是包含假设干个内核函数(Kernel),内核函数是运行在WorkItem上。一个程序中可以同时包含几个内核,在执行时可以选择让Context运行哪个Kernel函数。于是我们可以直接对底层的WorkItem进行操作,也就可以通过对WorkItem、WorkGroup的精细操作来最大化并行的效果。
图?? OpenCL的内存逻辑结构
经过分析,有两个局部可以使用GPU来进行加速处理,一个是均值和标准差的计算,另一个是像素的生长过程。所以我们需要对这两个局部给出GPU内核上的算法过程。传入设备的像素可以分为假设干组,OpenCL规定每一组的WorkItem数量必须相同。我们将组数记为。
均值计算和标准差计算。而标准差计算,相当于计算方差,根据公式??相当于计算平方和。我们希望将每一个像素作为并行单元,并且最终加和的结果也在GPU上完成。
其中表示均值,表示方差,表示样本个数。我们设计的算法1需要几个参数,输入图像,输出图像,结果向量,计数位,图像尺寸。其中长度为,长度为1,过程如下:
第一步,开辟WorkGourp中的数据变量localResult,大小为WorkItem的个数。并对每一个位点置0。
第二步,对于第一个点,计算是否在区域内,如果在,那么将放入localResult[0][0][0]。对于所有的WorkItem进行同样操作。
第三步,使用barrier函数进行组内同步,直到WorkGourp中所有WorkItem都进行完第二步。对localResult中的结果进行加和并置入的对应位置。同时使用atom_inc函数对自加1,表示一组加和得出结果。
第四步,直到等于。说明所有的组已经加和完成。使用任意一个WorkItem,对中的结果加和,并除以,得到全部区域内像素的均值,放入,结束。
以上是求均值的方法,求平方和和此过程类似,记为算法2,只是在第二步中,置入localResult的是,最后对赋值不需要除以。
生长过程。生长过程记为算法3,需要几个参数,输入图像,输出图像,判断图,判断位,判断范围,,图像尺寸。其中长度为1。的尺寸和输入图像、输出图像相同,的取值意义如表??,其作用和CPU算法中的相似。
值
意义
0
未判断的像素
1
需要判断其邻域
2
正在判断
3
判断过
表?? 判断图值的意义
算法描述如下:
第一步,对于第一个点,如果,那么计算,并将置为区域内像素,否那么结束。
第二步,将置为2,迭代判断邻域,当邻域所在位置的取值为0时才判断。如果邻域像素位于范围内,那么将其置为1,表示下一轮需要再次检查,并且将置为1;否那么置为3,表示已经检查完毕,这个像素不需要再次检查。对于所有的WorkItem进行同样操作,得到一个按照判断完毕的以及是否需要下一轮计算的标记,结束。
整个算法过程可以描述为图??。CPU局部算法描述如下:
第一步,选定种子点,设置倍率因子,设置迭代次数。
第二步,将放入。
第三步,使用GPU算法1计算均值,得到结果m,使用GPU算法2计算平方和得到结果。在CPU上,使用公式??,开方得到。然后计算出。
第四步,使用GPU算法3进行判断,得到一次生长的结果和是否需要继续判断的标记。如果为1,那么重复第四步,直到,完成一轮迭代。
第五步,迭代完成之后,得到了一个新的,如果迭代次数小于,那么进入第三步;否那么结束,输出结果。
图??
3.1.4 实验结果及分析
我们在实验中,使用了多幅图像对算法进行测试,其中,我们使用一副的图像进行了比照测试。硬件环境为:Intel Core i7-4720HQ 2.60GHz ,nvidia Gforce GTX 960M,软件环境为:Visual Studio 2023,ITK 4.12.2,VTK 8.0.0,OpenCL 。
倍率因子均为2.5,种子点一个坐标为430,329,329,灰度值-791。通过改变迭代轮次得到如表??所示的比照结果。图??是在i=10时CPU和GPU分割三维体绘制的效果。
迭代次数
模式
时间(s)
点数
模式
时间(s)
点数
加速比
i=1
CPU
3830535
GPU
3800619
i=2
CPU
5753867
GPU
5719534
4.42
i=5
CPU
249.785;
12123935
GPU
11722482
i=7
CPU
459.052;
29442886
GPU
29049143
i=9
CPU
966.722;
30398025
GPU
30320684
i=10
CPU
1148.54;
30538974
GPU
30515701
i=12
CPU
1629.48;
30672445
GPU
30684807
表?? 迭代比照
图? 左图为GPU效果,30538974点,右图为CPU效果,30515701点
从结果中我们可以看到,随着轮次的增加,点数的增多,GPU的加速比会越来越明显,在到达10轮和12轮根本分割整个肺之后,加速比可以到达30以上。
根据前人研究总结的医学图像分割中GPU加速的评价指标【Medical-image-segmentation-on-GPUs---A-comprehensiv_2023_Medical-Image-Analy】,在数据并行度方面,随着运算轮次增加,点数的增多,并行度不断提高;在线程数方面,随着点数的增多,item与item之间,group与group之间的同步性不断提高;在分支数方面,原子操作仅在group与group的合并中用到,我们使用的三维图像,每一组数量在256,远远小于10%,属于低分支数;在内存占用方面,相比CPU版本,我们仅在和方面产生内存差距,内存占用属于中等;在同步性方面,随着点数的增多,item与item之间,group与group之间的同步性不断提高;最后,在加速比方面,当分割出整个肺时,加速比可以到达30以上,这是一个较大的加速比。
3.2 深度学习识别图像
随着大数据时代的到来,深度学习技术已经成为当前人工智能领域的一个研究热点,其已在图像识别、语音识别、自然语言处理、搜索推荐等领域展现出了巨大的优势,并且仍在继续开展变化【26】。最近几年,深度学习(Deep learning)理论在图像识别领域取得了令人振奋的性能提升,并迅速成为了学术界和产业界的研究热点。
图像分类是指根据图像信息中所反映的不同特征,把不同类别的特征区分开来的图像处理过程。图像分类方法主要分为线性分类和深度神经网络方法【20】。
本文的系统平台设计中,我们实现了一种优化过的卷积神经网络来识别皮肤黑色素瘤的良恶性,并将此集成到系统平台。
算法描