目录
背景
项目总体思路与框架
技术难题及解决思路
Data模块
Modeling模块
Deployment模块
可优化方向
标注流程
基于GAN的眼底图像生成模型
隐私计算,联邦学习
即时标注平台+自动化机器学习
随着新生儿眼底筛查的普及,儿童眼科疾病可以得到及时的发现和治疗,帮助越来越多的儿童免受失明的困扰。然而,由于人口的增加以及各地区医疗资源的差异,全面眼底筛查面临着诸多的挑战,包括专业儿童眼科医生数量稀少、诊断主观差异、偏远地区医疗资源匮乏,导致全面眼底筛查并不能完全的普及。
本项目旨在构建早产儿视网膜病变只能诊断系统,并应用于实际医学中。该智能诊断系统可以对眼底图像进行实时检测,功能包括图像质量筛选、病变分类、左右眼分类、黄斑视盘检测、血管分割。该系统可以辅助眼科医生更高效的做出科学的诊断,同时在偏远地区还能实现一定程度的远程医疗自动预诊断,帮助。
本项目采用如下机器学习项目架构,分为4个部分:
Scoping: 挖掘用户需求,制定合理的目标。本项目主要用户为眼科医生,为了更好的辅助眼科医生进行疾病诊断工作,我们调研了相关眼科医生的看诊习惯,并依此确定了系统的功能,包括图像质量筛选、左右眼分类,黄斑视盘检测,血管分割,在CV领域可分为图像分类、目标检测及图像分割任务。
Data:针对项目具体的目标进行数据收集及标注的工作,设立标注标准,保证数据质量。本项目共收集了来自不同医院的50000张早产儿眼底图片作为数据集,并由一名专业眼科医生耗时三个月进行标注工作。标注工具选用了labelme软件并加以优化,使得标注过程更符合医生习惯,提高医生的标注效率。
Modeling:使用数据集进行不同任务模型的训练,并选取最优模型。此处共有6个具体模型,涵盖了图像分类、目标检测及图像分割任务。
Deployment:模型部署及实时监测。在得到6个最优模型后,采用docker + TF serving + Flask的方式部署到目标服务器上,并提供API接口。
本项目技术难点主要集中在Data,Modeling和Deployment模块
此阶段遇到的技术难题主要可分为数据方面和标注方面。
数据:数据量少,样本不平衡。众所周知,在医学领域,出于隐私安全以及专业医生数量稀少的原因,能获得的样本数量往往非常稀少和珍贵,而打好标签的样本更是少之又少。在此项目中虽然有50000张眼底图像,但用于各个任务的有效样本数量却是大相径庭的,下图为总体数据架构图:
可以看到一共有50593张图片用于图像质量分类任务,但仅有29464张图片用于左右眼分类以及病变分类任务;对于目标检测及图像分割任务,数据集数量更是下降到了15970、500、50。同时,样本不平衡的问题也体现在病变识别模型上,正常和有病样本比达到了2.5:1,这个现象在医学领域其实非常常见,有病样本往往数量稀少且更难获取。
标注:标注过程漫长,数据标注错误。图像的标注同时也是该项目需要考虑的技术难点。由于儿童眼部结构和成年人并不相同,需要专业的儿童眼科医生来进行标注工作。专业眼科医生本身就数量稀少,专业儿童眼科医生更是少之又少。因此,提高医生的标注效率,使得标注又快又准成为了需要思考的问题。同时,由于只有一个专业医生,标注错误不可避免,及时检验标注错误并和标注方沟通纠正也成为该项目工作的重点。
针对上述技术难题,我的解决思路如下:
迁移学习通过迁移某个领域或任务上学习到的知识并应用于相关领域或问题上,很好的解决了数据不足的问题,被广泛应用于小数据集训练上。在本项目中,由于医学图像的稀缺性,迁移学习是最佳解决方案。我们采用了多个预训练模型权重迁移的方法来进行训练,包括分类任务迁移ImageNet权重,目标检测任务迁移CoCo数据集权重,均取得了不错的效果。
值得注意的是,迁移学习的应用依然取决于任务的难易程度。在模型训练中我们发现对于简单任务(左右眼,图像质量),从头训练反而能得到和迁移学习一样的模型性能,同时减轻过拟合。我们通过Grad-CAM方法打印出了两个模型对图片的重点关注区域,发现并不相同。因此我推测使用迁移学习在一定程度上限制了模型发展方向,模型开始提取既定方向上的特征,而错过了任务本身所需提取的特征,导致在简单任务上更容易引发过拟合现象。
结合外部数据集的也为一种可取的解决思路,但是考虑到摄像机型号及图像分辨率的不同可能对原数据分布造成影响,并没有在本项目中加入外部数据集。
数据增强通过对原始图像进行翻转、平移、裁剪等操作来实现扩展数据集的作用。在训练时通过增加负样本权重使得模型更加关注负样本的分类结果。结合这两种方法很好的改善了病变模型样本不平衡的问题,模型准确率达到了97%,病变召回率92%。
本项目使用的是LabelMe标注软件,通过修改原始Labelme开源代码,增加快捷键等操作,使得单张眼底图像标注时间由5分钟缩短至30秒,极大提高了医生标注的效率。
先让医生标注30000张图片,并进行训练。之后标注与训练工作同步进行,一定数量样本完成标注后,使用该批样本对模型进行评估及优化,这种方式类似于增量学习,一定程度上加快了项目的进展。
训练结束后对数据集进行错分样本分析,发现错误样本有很多是标注错误的。对该批样本进行重新标注在放入模型训练中。其实如果数据集足够大,少量标注错误样本并不会影响模型表现,相反模型还能帮你筛选出这些标注错误的样本。举一个例子,在一些图像质量不是很高的图片中,模型识别黄斑的位置比医生标注的位置更准确,我们当时拿图片给医生看,他的反应是:嗯,好像机器标的是对的。
此阶段遇到的技术难题主要为评价指标以及模型结构的选择,过拟合问题,超参数调节。我在项目中总结出来的解决思路如下:
评价指标种类繁多,能否选择合适的评价指标很大程度上决定了模型表现的好坏。在实际中,我们是根据任务目标及数据集分布来确定评价指标的。比如分类任务,我们首先考虑的就是accuracy,然后是recall,precision,在目标检测中,应该考虑Iou,mAP等指标。同样的,数据分布也会影响指标的选择,比如病变模型中,由于有病样本数量较少,而要求模型能尽可能多的识别出病变,这时候病变recall将成为需要重点关注的指标。
对于难度较高的任务,选择较为复杂的模型结构,而对于难度较低的任务,尽量选择复杂度低的模型结构。这样做的好处是既能节省训练及部署时所需要的硬件资源,加快推理速度,同时防止复杂模型可能造成的过拟合问题。如左右眼分类模型中,采用AlexNet训练与ResNet训练的模型离线测试集都达到了100%准确度,但上线测试后发觉ResNet出现明显错分的情况而AlexNet没有,可以推断ResNet可能提取了更高维度特征,过分拟合了本地数据集,而AlexNet并没有提取太高维度的特征,因此泛化能力较好。结合Data迁移学习部分所述,有时候先验知识的加入如果在正确的track上确实能加速训练,提高准确率,但如果优化方向不同或是错过任务所需的局部最优时,模型性能将会下降。
这些都是处理过拟合时的常用技巧。值得注意的是数据增强需要根据特定任务进行选择,比如左右眼分类不可水平翻转。
模型部署是最有挑战性的一个模块,因为它将模型直接服务于用户,我为此做了许多的调研与学习。模型部署主要考虑三个方面的指标:Latency,Throughout,Cost。
Latency指的是在线推理的传输延迟,Throughout指的是在一定时间内可以成功请求的流量,Cost指的是为此部署所做的花费。我们理想目标是降低Latency,提高Throughout,但同时Cost也会上升,因此需要寻找Cost与Latency,Throughout之间的平衡。
Deployment模块主要的技术难题为部署方式选择,传输效率,异常处理,模型性能下降。
由于本项目共有6个模型,其中分类模型使用tensorflow进行训练,目标检测与图像分割模型使用pytorch进行训练,因此需要找到一种方法将2个框架下的模型融合。模型部署上线后,需考虑传输效率,需处理异常传入数据(如传入非图像数据如何处理),同时也要实时监测模型性能,当模型性能下降时及时得知并优化模型。
对此,我的解决思路如下:
本项目只有一名医生进行标注工作,可在未来考虑通过标注平台让多个医生同时进行标注,提升标注效率及准确度。
医学图像稀缺,能否通过GAN自动生成类似的医学图像以增大数据集体量,这是一个值得深入研究的问题。
医学领域数据大部分涉及个人隐私,这也是医学数据难获取的主要原因。可通过隐私计算对数据进行加密,保证数据不可见,并通过联邦学习这种分布式机器学习技术结合各大医院数据实现模型的构建,既保证了数据不泄露,又可以解决训练数据不足的问题。如下图变为医院场景下联邦学习的架构:
从时间维度考虑,患者数据在不断增加,而医生在下诊断结论时其实已经对图像进行了标注,我们可以将标注平台集成到医生的日常诊断工作中,实现数据的高效搜集。在对数据进行加密后,利用新进来的图像数据+自动机器学习技术对模型进行实时的更新,构造端到端机器学习流水线。模型可以辅助医生进行更高效诊断工作,而医生的及时反馈及数据的更新又可以推进模型的进化,这是一个良性循环,也必将是未来智慧医疗发展的一个大趋势。