发明名称 基于深度卷积神经网络自动识别甲状腺结节良恶性的方法
摘要 本发明涉及辅助医学诊断,旨在提供基于深度卷积神经网络自动识别甲状腺结节良恶性的方法。该基于深度卷积神经网络自动识别甲状腺结节良恶性的方法包括:读取甲状腺结节的B超数据;对甲状腺结节图像进行预处理;选取图像分割出结节部分与非结节部分;将提取出来的ROI平均分成p组,利用CNN提取这些ROI的特征,并进行归一化;选出p-1组数据做训练集,剩余一组做测试,训练出识别模型进行测试;重复做p次交叉检验,得到识别模型的最佳参数。本发明不仅借助深度卷积神经网络可以自动的分割出甲状腺结节,弥补了基于活动轮廓等不能解决弱边界问题的不足,而且可以自动学出提取出有价值的特征组合,避免了人工选取特征的复杂。
申请公布号 CN106056595A 申请公布日期 2016.10.26
申请号 CN201610362069.8 申请日期 2016.05.26
申请人 浙江德尚韵兴图像科技有限公司 发明人 孔德兴;吴法;马金连
分类号 G06T7/00(2006.01)I;G06F19/00(2011.01)I 主分类号 G06T7/00(2006.01)I
代理机构 杭州中成专利事务所有限公司 33212 代理人 周世骏
主权项 基于深度卷积神经网络自动识别甲状腺结节良恶性的方法,其特征在于,包括下述过程:一、读取甲状腺结节的B超数据;二、对甲状腺结节图像进行预处理;三、选取图像利用卷积神经网络,即CNN,自动学习分割出结节部分与非结节部分,结节部分就是感兴趣区域,即ROI,并对结节形状进行细化;四、将步骤三提取出来的ROI,平均分成p组,利用CNN提取这些ROI的特征,并进行归一化;五、选出步骤四中p‑1组数据做训练集,剩余一组做测试,通过CNN训练出识别模型进行测试;六、重复步骤五,做p次交叉检验,得到识别模型的最佳参数,最终确定基于深度卷积神经网络自动识别甲状腺结节良恶性的辅助诊断系统;所述过程一具体为:读取甲状腺结节图像,包括至少5000张良性结节的图像和至少5000张恶性结节的图像;所述过程二具体为:将过程一读取的甲状腺结节图像,先进行图像灰度化,并利用周围像素点的灰度值去掉超声图像中医生为测量结节相关量做的标记,再利用高斯滤波去噪,最后利用灰度直方图均衡化增强对比度,得到预处理后的增强图像;所述过程三具体为:第1步:选取经过程二预处理后的增强图像10000张,包括良恶性结节各5000张;第2步:对每一张图片,首先手动截取出结节部分与非结节部分,然后通过CNN训练出自动分割的模型;所述CNN是由13层卷积层、2层下采样层组成的网络结构;卷积层的卷积核的大小分别为:第一层为13x13,第二层与第三层为5x5,其余各层为3x3;卷积层的步长分别是:前两个卷积层是2,其余的都是1;下采样层的大小都是3x3,步长都是2;通过CNN训练出自动分割的模型的具体方法为:(1)通过CNN的卷积层与下采样层自动学习特征,并提取出特征,具体步骤为:步骤A:在一个卷积层,上一层的特征maps被一个能够学习的卷积核进行卷积,然后通过一个激活函数,就能得到输出特征map;每一个输出是卷积核卷积一个输入或者组合多个卷积输入的值:<maths num="0001"><math><![CDATA[<mrow><msubsup><mi>x</mi><mi>j</mi><mi>l</mi></msubsup><mo>=</mo><mi>f</mi><mrow><mo>(</mo><msub><mi>&Sigma;</mi><mrow><mi>i</mi><mo>&Element;</mo><msub><mi>M</mi><mi>j</mi></msub></mrow></msub><msubsup><mi>x</mi><mi>i</mi><mrow><mi>l</mi><mo>-</mo><mn>1</mn></mrow></msubsup><mo>*</mo><msubsup><mi>k</mi><mrow><mi>i</mi><mi>j</mi></mrow><mi>l</mi></msubsup><mo>+</mo><msubsup><mi>b</mi><mi>j</mi><mi>l</mi></msubsup><mo>)</mo></mrow></mrow>]]></math><img file="FDA0001001229820000011.GIF" wi="854" he="162" /></maths>其中,符号*表示卷积运算符;所述l表示层数;所述i表示l‑1层的第i个神经元节点;所述j表示l层的第j个神经元节点;所述M<sub>j</sub>表示选择的输入maps的集合;所述<img file="FDA0001001229820000021.GIF" wi="70" he="64" />是指l‑1层的输出,作为l层的输入;所述f是激活函数,这里取sigmoid函数<img file="FDA0001001229820000022.GIF" wi="259" he="127" />作为激活函数,e表示欧拉数2.718281828,e<sup>x</sup>就是指数函数;所述k是卷积算子;所述b是偏置;每一个输出map会给一个额外的偏置b,但是对于一个特定的输出map,卷积每个输入maps的卷积核都是不一样的;这一步还需要进行梯度计算,以更新灵敏度,灵敏度用于表示b变化多少,误差会变化多少:<img file="FDA0001001229820000023.GIF" wi="728" he="115" />其中,所述l表示层数;所述j表示l层的第j个神经元节点;所述o表示每个元素相乘;所述δ表示输出神经元的灵敏度,即偏置b的变化率;所述s<sup>l</sup>=W<sup>l</sup>x<sup>l‑1</sup>+b<sup>l</sup>,x<sup>l‑1</sup>是指l‑1层的输出,W为权重,b为偏置;所述f是激活函数,这里取sigmoid函数<img file="FDA0001001229820000024.GIF" wi="259" he="124" />作为激活函数,e表示欧拉数2.718281828,e<sup>x</sup>就是指数函数;f′(x)是f(x)的导函数;所述<img file="FDA0001001229820000025.GIF" wi="96" he="89" />表示各层共享的权值;所述up(.)表示一个上采样操作;然后对l层中的灵敏度map中的所有节点进行求和,快速计算偏置b的梯度:<maths num="0002"><math><![CDATA[<mrow><mfrac><mrow><mo>&part;</mo><mi>E</mi></mrow><mrow><mo>&part;</mo><msubsup><mi>b</mi><mi>j</mi><mi>l</mi></msubsup></mrow></mfrac><mo>=</mo><msub><mi>&Sigma;</mi><mrow><mi>u</mi><mo>,</mo><mi>v</mi></mrow></msub><msub><mrow><mo>(</mo><msubsup><mi>&delta;</mi><mi>j</mi><mi>l</mi></msubsup><mo>)</mo></mrow><mrow><mi>u</mi><mo>,</mo><mi>v</mi></mrow></msub></mrow>]]></math><img file="FDA0001001229820000026.GIF" wi="487" he="179" /></maths>其中,所述l表示层数;所述j表示l层的第j个神经元节点;所述b表示偏置;所述δ表示输出神经元的灵敏度,即偏置b的变化率;所述u,v表示输出maps的(u,v)位置;所述E是误差函数,这里<img file="FDA0001001229820000027.GIF" wi="400" he="128" />所述C表示标签的维数,如果是两分类的问题,则标签就可以记为y<sub>h</sub>∈{0,1},此时C=1,也可以记为y<sub>h</sub>∈{(0,1),(1,0)},此时C=2;所述<img file="FDA0001001229820000028.GIF" wi="41" he="59" />表示第n个样本对应标签的第h维;所述<img file="FDA0001001229820000029.GIF" wi="50" he="58" />表示第n个样本对应的网络输出的第h个输出;最后利用BP算法,计算卷积核的权值:<maths num="0003"><math><![CDATA[<mrow><msup><mi>&Delta;W</mi><mi>l</mi></msup><mo>=</mo><mo>-</mo><mi>&eta;</mi><mfrac><mrow><mo>&part;</mo><mi>E</mi></mrow><mrow><mo>&part;</mo><msup><mi>W</mi><mi>l</mi></msup></mrow></mfrac></mrow>]]></math><img file="FDA00010012298200000210.GIF" wi="313" he="115" /></maths>其中,所述W是权重参数;所述E是误差函数,且<img file="FDA0001001229820000031.GIF" wi="403" he="129" />所述C表示标签的维数,如果是两分类的问题,则标签就可以记为y<sub>h</sub>∈{0,1},此时C=1,也可以记为y<sub>h</sub>∈{(0,1),(1,0)},此时C=2;所述<img file="FDA0001001229820000032.GIF" wi="43" he="60" />表示第n个样本对应标签的第h维;所述<img file="FDA0001001229820000033.GIF" wi="51" he="58" />表示第n个样本对应的网络输出的第h个输出;所述η是学习率,即步长;由于很多连接的权值是共享的,因此对于一个给定的权值,需要对所有与该权值有联系的连接对该点求梯度,然后对这些梯度进行求和:<maths num="0004"><math><![CDATA[<mrow><mfrac><mrow><mo>&part;</mo><mi>E</mi></mrow><mrow><mo>&part;</mo><msubsup><mi>k</mi><mrow><mi>i</mi><mi>j</mi></mrow><mi>l</mi></msubsup></mrow></mfrac><mo>=</mo><msub><mi>&Sigma;</mi><mrow><mi>u</mi><mo>,</mo><mi>v</mi></mrow></msub><msub><mrow><mo>(</mo><msubsup><mi>&delta;</mi><mi>j</mi><mi>l</mi></msubsup><mo>)</mo></mrow><mrow><mi>u</mi><mo>,</mo><mi>v</mi></mrow></msub><msub><mrow><mo>(</mo><msubsup><mi>p</mi><mi>i</mi><mrow><mi>l</mi><mo>-</mo><mn>1</mn></mrow></msubsup><mo>)</mo></mrow><mrow><mi>u</mi><mo>,</mo><mi>v</mi></mrow></msub></mrow>]]></math><img file="FDA0001001229820000034.GIF" wi="616" he="159" /></maths>其中,所述l表示层数;所述i表示l层的第i个神经元节点;所述j表示l层的第j个神经元节点;b表示偏置,所述δ表示输出神经元的灵敏度,即偏置b的变化率;所述u,v表示输出maps的(u,v)位置;所述E是误差函数,这里<img file="FDA0001001229820000035.GIF" wi="400" he="128" />所述C表示标签的维数,如果是两分类的问题,则标签就可以记为y<sub>h</sub>∈{0,1},此时C=1,也可以记为y<sub>h</sub>∈{(0,1),(1,0)},此时C=2;所述<img file="FDA0001001229820000036.GIF" wi="39" he="59" />表示第n个样本对应标签的第h维;所述<img file="FDA0001001229820000037.GIF" wi="50" he="57" />表示第n个样本对应的网络输出的第h个输出;所述<img file="FDA0001001229820000038.GIF" wi="48" he="72" />是卷积核;所述<img file="FDA0001001229820000039.GIF" wi="161" he="88" />是<img file="FDA00010012298200000310.GIF" wi="71" he="66" />中的元素在卷积的时候与<img file="FDA00010012298200000311.GIF" wi="54" he="70" />逐元素相乘的patch,即所有与卷积核大小相同的图片中所有的区域块,输出卷积map的(u,v)位置的值是由上一层的(u,v)位置的patch与卷积核<img file="FDA00010012298200000312.GIF" wi="53" he="70" />逐元素相乘的结果;步骤B:下采样层有N个输入maps,就有N个输出maps,只是每个输出map都变小了,则有:<maths num="0005"><math><![CDATA[<mrow><msubsup><mi>x</mi><mi>j</mi><mi>l</mi></msubsup><mo>=</mo><mi>f</mi><mrow><mo>(</mo><msubsup><mi>&beta;</mi><mi>j</mi><mi>l</mi></msubsup><mi>d</mi><mi>o</mi><mi>w</mi><mi>n</mi><mo>(</mo><msubsup><mi>x</mi><mi>j</mi><mrow><mi>l</mi><mo>-</mo><mn>1</mn></mrow></msubsup><mo>)</mo><mo>+</mo><msubsup><mi>b</mi><mi>j</mi><mi>l</mi></msubsup><mo>)</mo></mrow></mrow>]]></math><img file="FDA00010012298200000313.GIF" wi="668" he="107" /></maths>其中,所述f是激活函数,这里取sigmoid函数<img file="FDA00010012298200000314.GIF" wi="261" he="128" />作为激活函数,e表示欧拉数2.718281828,e<sup>x</sup>就是指数函数;所述<img file="FDA00010012298200000315.GIF" wi="51" he="73" />表示各层共享的权值;所述down(.)表示一个下采样函数;对输入图像的不同nxn的块的所有像素进行求和,这样输出图像在两个维度上都缩小了n倍;每个输出map都对应一个属于自己的权重参数β和一个加性偏置b;通过梯度下降方法来更新参数β和b:<img file="FDA0001001229820000041.GIF" wi="876" he="108" /><maths num="0006"><math><![CDATA[<mrow><mfrac><mrow><mo>&part;</mo><mi>E</mi></mrow><mrow><mo>&part;</mo><msub><mi>b</mi><mi>j</mi></msub></mrow></mfrac><mo>=</mo><msub><mi>&Sigma;</mi><mrow><mi>u</mi><mo>,</mo><mi>v</mi></mrow></msub><msub><mrow><mo>(</mo><msubsup><mi>&delta;</mi><mi>j</mi><mi>l</mi></msubsup><mo>)</mo></mrow><mrow><mi>u</mi><mo>,</mo><mi>v</mi></mrow></msub></mrow>]]></math><img file="FDA0001001229820000042.GIF" wi="399" he="153" /></maths><img file="FDA0001001229820000043.GIF" wi="769" he="166" />其中,所述conv2是二维卷积算子;所述rot180是旋转180度;所述’full’是指进行完全卷积;所述l表示层数;所述i表示l层的第i个神经元节点;所述j表示l层的第j个神经元节点;所述b表示偏置;所述δ表示输出神经元的灵敏度,即偏置b的变化率;所述u,v表示输出maps的(u,v)位置;所述E是误差函数,表达式同上,即<img file="FDA0001001229820000044.GIF" wi="401" he="131" />所述C表示标签的维数,如果是两分类的问题,则标签就可以记为y<sub>h</sub>∈{0,1},此时C=1,也可以记为y<sub>h</sub>∈{(0,1),(1,0)},此时C=2;所述<img file="FDA0001001229820000045.GIF" wi="39" he="57" />表示第n个样本对应标签的第h维;所述<img file="FDA0001001229820000046.GIF" wi="51" he="59" />表示第n个样本对应的网络输出的第h个输出;所述β是权重参数;所述down(.)表示一个下采样函数;所述<img file="FDA0001001229820000047.GIF" wi="72" he="72" />是第l+1层的卷积核;所述<img file="FDA0001001229820000048.GIF" wi="71" he="72" />是的l‑1层的输出的第j个神经元节点;所述s<sup>l</sup>=W<sup>l</sup>x<sup>l‑1</sup>+b<sup>l</sup>,其中W是权重参数,b是偏置,<img file="FDA0001001229820000049.GIF" wi="38" he="75" />是s<sup>l</sup>的第j个分量;步骤C:CNN自动学习特征map的组合,则第j个特征map组合为:<maths num="0007"><math><![CDATA[<mrow><msubsup><mi>x</mi><mi>j</mi><mi>l</mi></msubsup><mo>=</mo><mi>f</mi><mrow><mo>(</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><msub><mi>N</mi><mrow><mi>i</mi><mi>n</mi></mrow></msub></munderover><msub><mi>&alpha;</mi><mrow><mi>i</mi><mi>j</mi></mrow></msub><mo>(</mo><mrow><msubsup><mi>x</mi><mi>i</mi><mrow><mi>l</mi><mo>-</mo><mn>1</mn></mrow></msubsup><mo>*</mo><msubsup><mi>k</mi><mi>i</mi><mi>l</mi></msubsup></mrow><mo>)</mo><mo>+</mo><msubsup><mi>b</mi><mi>j</mi><mi>l</mi></msubsup><mo>)</mo></mrow></mrow>]]></math><img file="FDA00010012298200000410.GIF" wi="822" he="202" /></maths>s.t.∑<sub>i</sub>α<sub>ij</sub>=1,and 0≤α<sub>ij</sub>≤1.其中,符号*表示卷积运算符;所述l表示层数;所述i表示l层的第i个神经元节点;所述j表示l层的第j个神经元节点;所述f是激活函数,这里取sigmoid函数<img file="FDA00010012298200000411.GIF" wi="259" he="125" />作为激活函数,e表示欧拉数2.718281828,e<sup>x</sup>就是指数函数;所述<img file="FDA00010012298200000412.GIF" wi="74" he="67" />是第l‑1层输出的第i个分量;所述N<sub>in</sub>表示输入的map数;所述<img file="FDA00010012298200000413.GIF" wi="43" he="67" />是卷积核;所述<img file="FDA00010012298200000414.GIF" wi="48" he="73" />是偏置;所述α<sub>ij</sub>表示l‑1层的输出map作为l层的的输入时,l‑1层得到第j个输出map的其中第i个输入map的权值或者贡献;(2)利用(1)中提取的特征结合Softmax自动识别出结节,确定好自动分割的模型;具体Softmax识别过程就是给定一个样本,就输出一个概率值,该概率值表示的是这个样本属于类别几的概率,损失函数为:<maths num="0008"><math><![CDATA[<mrow><mi>J</mi><mrow><mo>(</mo><mi>&theta;</mi><mo>)</mo></mrow><mo>=</mo><mo>-</mo><mfrac><mn>1</mn><mi>m</mi></mfrac><mo>&lsqb;</mo><munderover><mo>&Sigma;</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><munderover><mo>&Sigma;</mo><mrow><mi>j</mi><mo>=</mo><mn>1</mn></mrow><mi>c</mi></munderover><mn>1</mn><mo>{</mo><msup><mi>y</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></msup><mo>=</mo><mi>j</mi><mo>}</mo><mi>l</mi><mi>o</mi><mi>g</mi><mfrac><msup><mi>e</mi><mrow><msubsup><mi>&theta;</mi><mi>j</mi><mi>T</mi></msubsup><msup><mi>x</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></msup></mrow></msup><mrow><msubsup><mi>&Sigma;</mi><mrow><mi>l</mi><mo>=</mo><mn>1</mn></mrow><mi>c</mi></msubsup><msup><mi>e</mi><mrow><msubsup><mi>&theta;</mi><mi>l</mi><mi>T</mi></msubsup><mi>x</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></mrow></msup></mrow></mfrac><mo>&rsqb;</mo><mo>+</mo><mfrac><mi>&lambda;</mi><mn>2</mn></mfrac><munderover><mo>&Sigma;</mo><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>c</mi></munderover><munderover><mo>&Sigma;</mo><mrow><mi>j</mi><mo>=</mo><mn>0</mn></mrow><mi>n</mi></munderover><msubsup><mi>&theta;</mi><mrow><mi>i</mi><mi>j</mi></mrow><mn>2</mn></msubsup></mrow>]]></math><img file="FDA0001001229820000051.GIF" wi="1629" he="251" /></maths>其中,所述m表示共有m个样本;所述c表示这些样本总共可分为c类;所述<img file="FDA0001001229820000052.GIF" wi="168" he="449" />是一个矩阵,每一行是一个类别所对应的参数,即权重与偏置;所述1{.}是一个指示性函数,即当大括号中的值为真时,该函数的结果为1,否则其结果为0;所述λ是平衡保真项与正则项的参数,这里λ取正数;所述J(θ)是指系统的损失函数;所述e表示欧拉数2.718281828,e<sup>x</sup>就是指数函数;所述T是表示矩阵计算中的转置运算符;log表示自然对数,即以欧拉数为底的对数;n表示权重与偏置参数的维度;x<sup>(i)</sup>是输入向量的第i维;y<sup>(i)</sup>是每个样本标签的第i维;然后利用梯度求解:<maths num="0009"><math><![CDATA[<mrow><msub><mo>&dtri;</mo><msub><mi>&theta;</mi><mi>j</mi></msub></msub><mi>J</mi><mrow><mo>(</mo><mi>&theta;</mi><mo>)</mo></mrow><mo>=</mo><mo>-</mo><mfrac><mn>1</mn><mi>m</mi></mfrac><mo>&lsqb;</mo><munderover><mi>&Sigma;</mi><mrow><mi>i</mi><mo>=</mo><mn>1</mn></mrow><mi>m</mi></munderover><msup><mi>x</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></msup><mrow><mo>(</mo><mn>1</mn><mo>{</mo><msup><mi>y</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></msup><mo>=</mo><mi>j</mi><mo>}</mo><mo>-</mo><mi>p</mi><mo>(</mo><mrow><msup><mi>y</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></msup><mo>=</mo><mi>j</mi><mo>|</mo><msup><mi>x</mi><mrow><mo>(</mo><mi>i</mi><mo>)</mo></mrow></msup><mo>;</mo><mi>&theta;</mi></mrow><mo>)</mo><mo>)</mo></mrow><mo>&rsqb;</mo><mo>+</mo><msub><mi>&lambda;&theta;</mi><mi>j</mi></msub></mrow>]]></math><img file="FDA0001001229820000053.GIF" wi="1738" he="200" /></maths>其中,<img file="FDA0001001229820000054.GIF" wi="912" he="238" />所述m表示共有m个样本;所述<img file="FDA0001001229820000055.GIF" wi="167" he="449" />是一个矩阵,每一行是一个类别所对应的参数,即权重与偏置;所述1{.}是一个指示性函数,即当大括号中的值为真时,该函数的结果为1,否则其结果为0;所述λ是平衡保真项与正则项的参数,这里λ取正数;所述J(θ)是指系统的损失函数;<img file="FDA0001001229820000061.GIF" wi="173" he="78" />是J(θ)导函数;所述e表示欧拉数2.718281828,e<sup>x</sup>就是指数函数;所述T是表示矩阵计算中的转置运算符;log表示自然对数,即以欧拉数为底的对数;x<sup>(i)</sup>是输入向量的第i维;y<sup>(i)</sup>是每个样本标签的第i维;(3)利用CNN自动分割所有甲状腺的结节,即区分出结节区域与非结节区域,找到结节区域的边界,并对分割出的结节形状进行细化,即通过腐蚀、膨胀形态学算子进行填洞以及去掉与非结节区域的连接;第3步:利用第2步得到的模型对所有的甲状腺结节图片进行自动分割,得到ROI,即所有的良恶性结节;所述过程四具体为:将过程三自动分割出的ROI平均分成p组,对数据进行归一化,即自动分割出结节之后,提取出结节的特征,对这些特征进行线性变换,使结果值映射到[0,1];所述过程五具体为:利用CNN训练识别模型,对所有ROI提取特征;然后利用一种新的Softmax分类,即只有两分类的Softmax分类器,求解一个损失函数的最优值,即优化J(θ),Softmax分类器的类别数c等于2;通过梯度下降方法就能得到属于良性结节还是恶性结节的概率,具体过程与过程三中自动分割过程的方法是一样;所述过程六具体为:重复过程五,即对于p组数据,每次选出p‑1组数据训练,余下的做测试,最终得到识别模型的最佳参数,从而就得到基于深度卷积神经网络自动识别甲状腺结节良恶性的辅助诊断系统;将需要识别的甲状腺结节图像输入到这个辅助诊断系统,即可获得该结节的良恶性诊断。
地址 310012 浙江省杭州市文三路90号东部软件园6号楼科技大厦8层东801/802室