python影像组学_【影像组学预测模型-Radiomics】实操教学

影像组学(Radiomics)是一个新兴的概念,2012 年由荷兰学者 Philippe Lambin 首次提出,其定义是借助计算机软件,从医学影像图像中挖掘海量的定量影像特征,使用统计学和/或机器学习的方法, 筛选最有价值的影像组学特征,用以解析临床信息,用于疾病的定性、肿瘤分级分期、疗效评估和预后预测等.

流程概述

第一步:勾画ROI(三维ROI)

这一步很多软件都能做到 (工具见第二部分)。请留意使用的工具应能勾画三维的ROI,并且体素大小、层间距等几何信息能计算准确,否则跟形态/轮廓相关的特征会计算错误。

第二步:计算ROI内影像信号(也就是把ROI内的影像抠出来)的特征集。特征集包括:灰度特征:即常见的直方图信息譬如均值,均方偏差,偏度之类;

形状特征:根据ROI轮廓计算的,如体积、表面积、最大径之类的;

纹理特征:通过灰度共生矩阵计算出来的高阶特征。这些纹理特征其实往往都有显示意义,举例:SizeZone特征用于评估ROI内影像的块状程度,下列两个瓷砖图的Small     Area Emphasis / Large Area Emphasis就不同。

这一步需要特别留意的是:应该用信号真实值而不是灰度值进行计算。单纯把0~4095的灰度值放进去计算,难以把不同被试的图归一化。所以作者不推荐用通用的图像纹理计算软件。应使用专业的医学影像处理软件,准确读入DICOM信息得到真实值。

第三步:数据挖掘,预测模型建立与检验。

目前最常见的套路是利用Lasso回归筛选相关变量,然后绘制nomogram,对nomogram性能进行评价。如果再深入一点,那就是基于nomogram做亚组划分与分析。

重点:本文小编将此软件按照,ROIs 绘制,Lasso教程,再到nomogram建立,全流程手把手传授,并结合案例给大家分析讲解。

1. 软件要求和准备工作

1.1 软件安装

Radiomics最主要就是靶区规划(ROIs),有很多软件都可以实现,市面上大部分软件都是基于python开发和运行的,需要安装照Python和设置环境。那么,有没有更省事一步到位的解决办法?答案是,有。这个一步到位的解决方法就是本文要介绍的3D Slicer。3D slicer (https://download.slicer.org/),支持MAC 和Window, 免费!免费!免费!重要的事情说三遍!

1.2 软件简介

假定大家已经从网站下载最新的4.8.1版本,完成了安装。软件启动后,将显示下面的界面:

注意到红色箭头指向的右上方按钮图标了吗?这不就是Python的代表性Logo吗?没错,只要安装好3D Slicer,内部就会直接准备好了Python 2.7的开发环境。点击这个按钮,就会在软件的下方启动Python的交互式开发环境。

1.3 操作示范:

大家可以参考下面这个网站(https://www.slicercn.com),网站里有很多教大家使用的中文视频,我就不重复讲了。

2. 演示如何使用3D Slicer 获取radiomics

2.1 绘制ROIs

这里推荐AI绘制(Nvidia Clara )

PS: 安装NvidiaAIAssistedAnnotation扩展(在“分割”类别中),等待安装完成,然后单击“重新启动”

以肝脏为例

CT对肝脏的基于边界点的分割:转到 示例数据 模块并加载“ CTACardio”数据集

转到 Segment Editor

创建一个新的细分

双击segment名称并输入“ liver”以指定细分内容

单击“ Nvidia AIAA”效果,“从边界点分割”部分

可选:单击“过滤器”图标以仅列出名称中包含“肝脏”的那些型号

选择“ annotation_ct_liver”(训练为在门静脉期CT图像中分割肝脏的模型)

单击“放置标记点”按钮,然后在切片视图中的所有6个侧面的肝脏边缘附近单击,然后单击“开始”

在大约30秒内,自动分割结果将出现在切片视图中。要以3D形式显示结果,请点击Segment Editor列表上方的“显示3D”按钮。

要在分割完成后调整先前放置的边界点,请单击“开始”按钮旁边的“编辑”图标。

在CT上对肝脏和肿瘤进行全自动分割:从http://medicaldecathlon.com/下载Task03_Liver \ imagesTr \ liver_102.nii.gz数据集并将其加载到3D Slicer中

转到 Segment Editor

点击“ Nvidia AIAA”效果

在“自动分割”部分中,选择“ segmentation_ct_liver_and_tumor”模型,然后单击“开始”

自动分割结果应在3-5分钟内显示

可选:转到 Segments 模块以编辑显示设置

label: liver / tumor

2.2 提取radiomics

主要使用pyradiomics组件,引用某大神一个完整的视频给大家介绍下提取,可以只参考视频的最后一部分就可以了,前面的规划,可以参考上述内容。

https://www.bilibili.com/video/BV15V411Z73o?from=search&seid=5989594993256922790

3. lasso回归,确定潜在变量

第一步呢,永远是读入数据和核查数据。

然后,进入到我们此次教程的一个关键环节,分割数据。我们这个数据集当中共有699例样本,我们需要将其随机分割为训练集和测试集,一般的样本比例是2:1,也就是2/3的病人用来做训练,训练出一个准确的模型,剩下1/3病人用来做测试,验证我们的这个模型是否可靠。分割数据的代码如下,整个过程都是随机的:# 分割数据set.seed(123)ind 

样本(也就是数据的行)分配好了之后呢,下一步就是把采集到的信息(也就是数据列)进行分配,在我们的这个测试数据中前面V1-V9是采集到的样本信息,最后一列是我们的诊断,也就是肿瘤的良恶性,下面我们把样本信息和样本诊断分割开来:# Convert data to generate input matrices and labels:# x相当于临床信息x 

首先,我们尝试做K-fold交叉验证。在glmnet包中使用cv.glmnet()估计λ值,glmnet默认使用10倍交叉验证。所谓K-fold交叉验证,就是将数据分成k个相同的子集(折叠子集),每次用k-1个子集拟合模型,然后将剩余的子集作为测试集,最后将k个结果合并(一般采用平均值)来确定最终的参数。在此方法中,每个子集仅用作测试集一次。在glmnet包中使用K-折交叉验证非常容易。结果包括每个相应的MSE值和相应的λ。在这里,我们将训练集k值定为5,做5-fold cross validation,这也是比较常用的。# 5-fold交叉验证,找出最佳lambda值fitCV 

上面的图叫做CV统计图,CV统计图与glmnet中的其他图表有很大的不同,它表示了λ的对数与均方差以及模型中变量数量之间的关系。图表中的两条垂直虚线表示最小均方误差的对数λ(左侧虚线)和最小距离的标准误差的对数λ(右侧虚线)。如果存在过拟合问题,那么从最小值到标准误差位置的距离是解决问题的一个很好的起点。可以看到,我们可以选择的lambda值有两个,具体lambda选值要根据自己实验设计而定。lambda.min是最佳值,lambda.1se则是一倍SE内的更简洁的模型。这也涉及到临床模型一个很重要的考量标准,到底是选择精度高但是复杂的模型,还是放弃部分精度,选择变量更少更有可能有应用价值的模型呢?本例中我们选择最佳lambda值。然后我们来看一下,随着lambda值的变化,每个观察值对应的系数的变化趋势。# check the coeffit 

此图显示,随着λ的减少,压缩参数减少,系数的绝对值增加。这个模型应该如何在文章中描述呢?我们来输出系数:# get the coefcoef.min = coef(fitCV, s = 'lambda.min')coef.min

然后就会生成每个变量所对应的系数,我们也可以通过这个系数来对模型进行描述。

……

4. nomogram建立和验证

你可能感兴趣的:(python影像组学)