这是一个两周的小学期中老师布置的一个项目,运用了Python和tensorflow平台。
建议大家先大概了解一下unet算法(GitHub上有很多例子),之后做起来会比较容易。
一.项目背景
如今,父母对待自己胎儿的发育检查非常重视,会通过各种检查方法检查胎儿是否畸胎,器官功能发育异常,遗传因素稳定等。而这其中通过超声图像中胎儿头围是评估胎儿发育的重要指标之一,胎儿头围在临床上一般由医生手动进行椭圆拟合,费时费力,且存在较高的用户差异,导致胎儿发育诊断的偏差,特别是会导致分娩方式决定的错误,如今AI发展迅速,我们用科技手段去测量胎儿头围,这样对临床的诊断会减小难度,同时测量也会十分精准,便于我们对胎儿的健康指标进行评估。
二.项目目的
孕妇怀孕期间医生通过检查测量胎儿头围,主要目的是观察胎儿的发育状况。通过评估胎儿头部的大小,从而预测胎儿的发育状况,而在孕妇分娩时也可以帮助选择最佳分娩方式。
三.实现方法(步骤)
第一步,基于U-net(Keras版本)算法,通过已有图例端对端的进行训练。训练完成后,读入测试原始图像,使用模型预测,输出结果。
第二步,对输出结果图像分辨率进行修改。
第三步,对输出结果图像椭圆进行拟合,并计算出椭圆周长(即胎儿头围长度)。
四.实验结果
-
示例:
-
示例:
-
示例:
-
示例:
-
示例:
五.结果分析
对于预测得到的图像,还不是特别清晰,原因我分析是训练量和次数不够多,对于tensorflow我安装的GPU版本,没有安装英伟达显卡版本,运算速度较慢,训练400份1次的话需要1个小时41分钟,两次的话需要3个多小时。预测的话我每次都测试20张查看结果,起初第一个学习率赋值我用1e-4,得到的loss率很高,都在0.5以上,得到的预测图片就是全黑的。而换用1e-5之后,loss率才降下来,loss率在0.1305的时候得到的预测图片 有光圈出现,没有大致轮廓。Loss率到0.0400就有了图像,但是也较为模糊,就是示例中的图。附上我在用不同学习率,训练量和次数时的loss率,loss率越低,应该说明结果更准确。另外我观察到是大的训练量是可以大幅度降低loss率的,而训练次数可以在loss率很低的情况下,再进行降低,比如训练400张训练第二次的时候每张会降低0.0001。得到预测结果之后进行椭圆拟合,然后得到周长。
附上我不同条件下的loss率
六.总结
这个项目确实花了挺长时间,首先的环境的安装出现的问题就很多。尽管Unet很多范例,代码有现成的,但是运行起来bug也很多,所以代码的调试花费了很长时间。之后的拟合和周长的计算是可以同时实现多张的,但我是一张一张去实现的,因为我本身想去预测的结果不多,一张一张的运行也比较容易比对结果。
七.还遗留的问题
(1)Unet算法能否自带拟合出图形。
(2)输出图像带大小不匹配,图象输入时的尺寸被resize成128128,结果输出是256256,我所需要的是800*540,得到结果我需要resize到正确的尺寸,这样是比较麻烦的。我尝试修改了Unet中的代码,但是结果报错。
(3)当我用1e-4的学习率处理400张训练2次,到了200张的时候loss率到0.2就是极限了,不能再低了,预测结果是全黑图象。
(4)用1e-5时候效果很好,但是到0.0400左右就是极限了,增加训练量也没有效果了,反而训练400张比200张的loss率还高了一点。
(5)周长的单位是像素。