1 背景
在DR的拍摄中,根据肺部和脊肋骨两种组织,在不同能量X射线的照射下,衰减的系数不同的特点,可以通过两次不同剂量的曝光后,通过算法,得到一张骨骼的图像和一张肺部图像。
通过一些机构的统计,双能剪影的后的肺部影像对结节,特别是小结节的检出率有不同程度的提高。统计表明,对3mm一下的结节的检出率,在双能剪影的肺部检出率有47%,而一张普通的胸片的检出率仅仅为22%。但是,双能剪影也有明显的缺点,第一是患者受到两次X光照剂量;第二,双能剪影在拍摄的时候,一般需要病人憋气更长时间,导致拍片失败。
这个时候,骨抑制算法,就是替代两次曝光的一个很好的方案;另外,在现在DR行业如此内卷的时期,骨抑制算法也能算作智能DR设备的亮点功能之一。
2. AI骨抑制算法(Bone Suppress)
整个算法大概分为以下3个步骤,可以给大家一点参考
2.1 对图像中的肺部区域进行裁剪
对DICOM的胸片图像,使用Unet网络,来分割肺部区域蒙板。对分割后的肺部蒙板中,区域较小的区域进行去除。得到如下的图像
2.2 对图像的肋骨进行Unet分割
注意这里分割出脊肋的mask,不是阈值后,然后再将mask二值化的图像,而是阈值后,保留mask的0到1的值,做为第三步中的其中一路初始输入图像,如下图所示:
2.3 将2步中标记的mask作为噪声在原图上进行抑制
将原始图像和第二步中的输出,两个通道,作为输入,目标图作为输出;将脊肋骨视为图像中的噪声信息,使用图像去噪的方法来完成肋骨抑制的任务,采用深度卷积网络作为基础模型,分析并尝试多种策略来提升模型性能,最终,使用Unet网络结构,并且,通过跳跃连接以及残差策略增强网络细节表现能力。 为了在计算中减少对图像的细节纹理的损失,模型采用在原图大小直接计算, 但是,考虑到显存压力,使用1024*1024滑动窗口计算,并采用Overlap-tile策略减少计算边缘信息损失。 这些策略有效的保证了输出结果的准确性,精确性。 模型可以在保留肺部纹理细节清晰同时也能有效的抑制骨影。最终得到的结果如下
3 最后算法可以通过onnx进行工程化,供DR Console工作站调用
为了能提供给设备采集软件进行调用,需要将算法修改为动态库的形式,另外,也可以提高效率。以下是头文件定义,可以输入和输出的接口是很容易集成的。
#ifndef _BONE_SUPRESS_API
#define _BONE_SUPRESS_API
#ifndef DLLAPI_FILTER
#define BONE_SUPRESS_DLLAPI extern "C" __declspec(dllimport)
#endif
enum BoneSupressResult
{BoneSupressResultOK = 0,BoneSupressResultImgErr,BoneSupressResultIniErr,
};
BONE_SUPRESS_DLLAPI bool IntializeInstance(bool beGpu);
BONE_SUPRESS_DLLAPI BoneSupressResult ChestBoneSupress(unsigned short* imageData, int imgW, int imgH,unsigned short* resultData, int resultDataLen);
BONE_SUPRESS_DLLAPI bool ReleaseInstance();#endif
最后运算一张4000 * 4000 ,2个字节的输入图像后,在1050Ti的显卡上,计算共需13s的时间,3060Ti上,计算花费8s中,实际应用中,可以满足设备的需求。