明天带来的是飞桨开发者技术专家冯嘉骏利用飞桨3D医疗影像宰割计划MedicalSeg自主诊断脂肪肝的案例分享,欢送大家关注~
我的项目背景当初人们的日常生活形式和饮食结构产生了微小的变动,大略就是吃好了,动少了。体内的适量的甘油三酯无奈代谢,最终汇集在肝细胞内,导致人体中失常肝脏逐渐变成脂肪肝。长期患有脂肪肝可能会导致肝硬化,并最终减少患慢性肝病的危险。医学影像学畛域能够通过CT或者B超技术来判断患者是否患有脂肪肝,其中CT的脂肪肝检出比例高于B超,其用于诊断脂肪肝时准确率更高、特异性更强。
在CT查看中,次要是通过计算肝脏与脾脏的CT值的比值来确定患者是否患有脂肪肝以及重大水平。依据中华医学会肝病学分会制订的规范,肝、脾CT比值大于1为失常肝脏,CT比值在[0.7,1.0]之间为轻度脂肪肝,[0.5,0.7]之间为中度脂肪肝,小于0.5为重度脂肪肝。在日常工作中,喷射医师须要手工抉择肝脏和脾脏的最大层面,在肯定范畴内进行 ROI 的选取,之后计算 ROI 范畴内肝脏和脾脏的CT总值以及计算两者 ROI 范畴内CT总值的比值,从而确定患者是否患有脂肪肝。这个过程须要投入较多的工作量。
目前,深度学习技术中的语义宰割正被广泛应用于医学畛域。该技术能够通过训练模型来预测出影像中的不同组织类型的准确边界、地位和区域,在腹部CT上主动取得肝脏和脾脏的宰割后果,对肝脏和脾脏屡次随机取出肯定体积的立方体来计算CT总值的比值,从而评估被检测者是否有脂肪肝以及脂肪肝的重大水平。这种形式加重医生的工作强度,也防止人为的主观性带来的偏差。如下图展现人工测量和基于语义宰割主动测量之间的优劣。关注 AI Studio 我的项目和我一起探讨️
我的项目链接https://aistudio.baidu.com/aistudio/projectdetail/5574909
医学临床上进行诊断时会人为抉择CT平扫肝、脾显示最大层面,各选取边长为1.0cm以上的正方形 ROI 对肝、脾取CT值。本我的项目为了升高随机选取 ROI 时可能纳入肝内血管和伪影局部,影响计算肝脾比值后果的真实性,提出如下解决办法:1.减少随机取出立方体 ROI 的个数;2.两两配对,减少肝脾比值的样本。
主动宰割与评估脂肪肝操作步骤环境版本要求
数据集介绍
用医疗软件 itk-snap 软件读取原始数据和对应宰割标签,展现成果如下图: VNet 模型和医疗宰割套件 MedicalSeg绝对于二维语义宰割,三维语义宰割利用体素的三维构造信息来宰割医学影像,具备更强的抓取空间信息的能力。因为三维宰割利用了四周邻近切片及沿着z轴的轴向信息,具备更好的上下文信息,进一步提高了模型的泛化能力。此外,三维语义宰割相较二维语义宰割也有利于打消噪声和伪影的影响。以后应用的医疗影像数据具备较高的空间分辨率且为三维影像数据,因而应用三维语义宰割模型进行宰割通常是更适宜的解决形式。这次应用的三维语义宰割模型 VNet 采纳了一种自下而上的办法,并且应用了 U 形连贯搭建网络结构,以捕捉到影像数据的不同尺度的细节信息。因为相邻的体素往往具备亲密的相关性,因而 VNet 引入了 3D 卷积、转置卷积操作以及残差 U 形连贯来捕捉和利用交融上下文信息,从而进步模型的精度和泛化能力。宰割医疗影像数据时,因为病变区域可能会占整个影像的很小一部分,导致标注数据的散布不平衡,VNet 提出 Dice 损失函数,来缩小不均衡散布对模型训练的影响,使模型更加稳固。VNet 整体构造如下。
MedicalSeg 是一个繁难、弱小、全流程的3D医学图像宰割工具,作为 PaddleSeg 宰割套件中的宰割工具,继承了 PaddleSeg 配置化训练的模式,一行代码实现对医疗数据的解决和模型的训练,本我的项目就是基于 MedicalSeg 宰割套件实现在腹部CT上对肝脏和脾脏的3D宰割。
模型训练和推理数据处理
因为医疗数据较为非凡,须要进行预处理操作,例如重采样、像素裁剪,再转换成 NumPy 格局。须要自定义数据预处理脚本 prepare_SpleenAndLiver.py 。脚本次要设置数据的门路和像素裁剪等参数设置。设置如下:
1. self.preprocess = {2. "images": [3. wrapped_partial(4. HUnorm, HU_min=-100, HU_max=300),#设置窗宽窗位的裁剪范畴5. wrapped_partial(6. resample, new_shape=[128,128,128], order=1)#设置输出网络的数据形态,程序是[z,y,x]7. ],8. "labels": [9. wrapped_partial(10. resample, new_shape=[128,128,128], order=0),11. ],12. "images_test":[13. wrapped_partial(14. HUnorm, HU_min=-100, HU_max=300),15. wrapped_partial(16. resample, new_shape=[128, 128, 128], order=1)17. ]18. }而后通过一行代码转换数据,并按肯定比例宰割训练集和验证集。
1.#运行预处理文件,把SimpleITK文件转换成numpy文件,生成对应的train.txt和val.txt,和数据参数无关的json文件2.!python tools/prepare_SpleenAndLiver.py模型训练
MedicalSeg 采纳配置化训练,须要新建一个配置化 Yaml 文件,而后再以代码进行训练。配置文件次要设置数据的门路、数据加强形式、优化器、学习率和宰割模型等主要参数。不过个别状况下次要设置数据的门路,其它设置只须要放弃默认即可。当训练成果不好的时候,能够依据教训对数据加强、学习率等参数进行批改。Yaml 配置如下:
1.data_root: /home/aistudio/work/2.batch_size: 2 #32GB显存,shape=256x128x128,batchsize能够设置23.iters: 10000 #训练轮次4.train_dataset:5. type: MedicalDataset 6. dataset_root: /home/aistudio/work/SpleenAndLiver_Np #转换后的Numpy文件门路7. result_dir: /home/aistudio/result 8.#设置数据加强9. transforms:10. - type: RandomRotation3D #3d抉择11. degrees: 9012. - type: RandomFlip3D #程度翻转13. mode: train14. num_classes: 3 #宰割类别数15.val_dataset:16. type: MedicalDataset17. dataset_root: /home/aistudio/work/SpleenAndLiver_Np18. result_dir: /home/aistudio/result19. num_classes: 320. transforms: []21. mode: val22. dataset_json_path: "/home/aistudio/work/dataset.json"23.#设置优化器24.optimizer:25. type: sgd26. momentum: 0.927. weight_decay: 1.0e-428.#设置学习率29.lr_scheduler:30. type: PolynomialDecay31. decay_steps: 1000032. learning_rate: 0.0533. end_lr: 034. power: 0.935.#设置损失函数36.loss:37. types:38. - type: MixedLoss39. losses:40. - type: CrossEntropyLoss41. - type: DiceLoss42. coef: [0.3, 0.7]43. coef: [1]44.#设置VNet模型参数45.model:46. type: VNet47. elu: False48. in_channels: 149. num_classes: 350. pretrained: null51. kernel_size: [[2,2,4], [2,2,2], [2,2,2], [2,2,2]]52. stride_size: [[2,2,1], [2,2,1], [2,2,2], [2,2,2]]配置好 Yaml 文件之后,就能够实现一行代码进行训练。
...