当前位置: 首页 > 编程日记 > 正文

医学图像分类_TauMed:医学诊断领域中的图像分类测试数据扩增

fe6f85fcce02cafd9a0995d1fed7a2aa.png

南京大学智能软件工程实验室

iselab.cn

摘要:

深度学习在医学分类方面取得了长足的进步。但是,在许多现实的环境中,用于训练和测试的数据不足且不平衡,深度学习模型将很容易过度拟合且泛化能力很差。并且由于医院和患者的状况并不总是适合于收集数据,并且具有相同疾病的患者数据也并非总是可用,因此在医学领域经常出现需要收集平衡且足够的数据的难题。此外,神经网络需要在大量准确而可靠的数据上进行训练,数据不正确或表示不正确可能会导致系统的性能变差。在这项研究中,我们通过对医学数据集执行传统和先进的增强技术,以生成足够且平衡的图像。同时,我们使用分类准确性和 DeepGini 得分作为度量标准,以评估扩增数据集的有效性。

其视频位于https://www.youtube.com/watch?v=P0aQXoE4g。

关键词:

数据扩增,图像分类,医疗图像

一、 绪论

近年来,深度学习在各个领域都取得了巨大的进步和成就。但是,与应用深度学习的其他区域不同,在医疗和自动驾驶等对安全至关重要的领域中,模型的安全性需求通常更高。深度学习模型的安全性在很大程度上取决于训练和测试模型中的数据质量。与 ImageNet 和与其类似的提供数百万个图像的自然图像域数据集不同,医学数据集中可用的训练图像要少得多。足够且平衡的数据成为影响模型质量的关键因素。但是,由于医院和患者的状况并不总是适合于收集数据,并且具有相同疾病的患者数据也并非总是可用,因此在医学领域经常出现收集平衡且足够数据的难题。对于给定的目标疾病,健康的患者要多于不健康的患者。对于给定的患者,通常有比不正常图像更多的正常图像。因此,如何获得足够的平衡图像数据已成为提高模型质量和性能的关键因素。

有多种数据增强方法可用于克服足够数据的问题。这些方法可以分为传统方法(改变旋转,对比度,亮度等)和高级方法(纹理和样式转换等)两类。高级方法包括不同的学习模型和耗时的方法,而传统方法则成本低廉且易于应用。

传统的数据增强通常用于解决数据不平衡问题。通过随机删除样本更多的类的数据来解决数据不平衡问题。但是,这种方法不会增加稀有类的学习能力。

另外,一种新的方法称为特征表示和相似度矩阵的统一学习,该方法使用单个深度卷积神经网络(CNN)对种子标记的数据集进行训练,以从大型未标记的数据集中为每个类别推荐最相似的图像,以供医学专家验证,并将其包含在种子标记的数据集中。它的真实数据增强功能大大减少了昂贵的手动标记时间。它很容易扩展到其他医学图像分类问题。但是,该方法的应用范围有限,算法过于复杂,推荐效率不如我们期望的高。

因此,在本文中,我们从传统扩增技术中选择了无损变换和非刚性变换,以及先进增强技术(如 GAN,SMOTE,AutoAugment)在数据集上生成足够且平衡的图像。同时,我们使用 DeepGini 得分和分类精度作为度量标准,评估扩增数据集的质量并与原始数据集进行比较。

与仅使用传统数据扩增技术的其他方法相比,我们将当前流行的数据扩增方法也加入系统。与单纯删除部分数据相比,我们的方法不仅解决了数据不平衡的问题,而且使数据更加丰富。我们的方法具有以下优点:

  • 与使用单一方法生成扩增图像的其他方法相比,我们的方法将多种常规图像数据扩增方法与先进图像扩增方法结合在一起。在此过程中成功生成图像数据的概率将增加。
  • 通过使用我们的图像数据扩增方法,不仅可以生成足够的医学图像数据,而且可以解决原始图像数据集中数据不平衡的问题。
  • 对于医学专家而言,手动梳理庞大的未标记数据集以获得稀有类别的足够代表性示例可能是不可行的。与人工标记的数据相比,我们的方法不需要大量的人力和资源来标记数据。
  • 我们的方法在获取医学图像数据的同时也保护了患者的隐私。

二、相关工作

在相关工作中,我们主要介绍 GAN 在传统领域中数据增强中的应用。在 DOPING 中,作者将注意力集中在无监督的异常检测上,并提出了针对此任务进行了优化的新型生成数据增强框架。为了应对这一挑战,他们建议使用称为对抗自动编码器(AAE)的 GAN 变体,将高维多峰数据分布转换为具有明确尾部概率的低维单峰潜势分布。在 DADA 中,作者提出了一种深层对抗数据增强(DADA)技术来解决该问题,在该技术中,他们精心地将数据增强公式化为训练类条件和监督型生成对抗网络(GAN)的问题。具体而言,提出了一种新的鉴别器损失,以适应数据扩充的目标,通过该损失,实数样本和扩充样本都将被强制执行,从而有助于并一致地找到决策边界。

三、 方法

该系统包括扩增模块和质量评估模块。首先,将医学图像数据集输入到系统中,然后扩增模块使用不同扩增方法来扩展原始数据集。最后,将该数据集输入到质量评估模块,并使用 DeeiGini 得分和神经网络的分类精度作为度量来评估扩增数据集。

70ed7432e5ae22382206231439d121a6.png

图 1 系统工作流

  1. 扩增模块

对于具有很多重要信息的图片(例如医学图像),最好执行不会增加或丢失图片信息的图像增强变换。因此,我们选择使用无损变换、非刚性变换和先进扩增技术来完成医学图像扩增。

4504a6a7680135248af0f06222e76e32.png

图 2 扩增模块

1) 无损变换

无损变换是通过 albumentations 实现的,具体方法说明如下:

水平翻转。在水平翻转中,翻转后图像的每个像素的横坐标相对于图像的垂直中心线对称于翻转前相应像素的横坐标。

aa198c73a7149a951009447e736c76ea.png

垂直翻转。与水平翻转类似,翻转后图像的每个像素的横坐标相对于垂直翻转中图像的水平中心线对称于翻转前相应像素的横坐标。

8c393614b8f57a3ace76355fd238e128.png

我们在此模块中同时执行水平翻转和垂直翻转。尽管在常规图像扩展中未使用垂直翻转(如颠倒的狗可能不会对模型训练产生影响),但由于医学图像的特殊性,这种方式可能仍然有意义。

随机旋转。通过变换矩阵实现旋转:

692b2bc28b30193be4f9ac6bbc9589cc.png

首先,将坐标的原点从左上角变换到图像的中心。然后,以旋转中心为原点,将图像旋转角度

b589758ede6572c95cf11582fbabd31c.png

。旋转完成后,坐标原点恢复到旋转图像的左上角。

在我们的项目中,我们将输入图像随机旋转 90 度零次或多次,即 0、90、180 和 270 度。

转置。转置转换是交换行和列。

efa7ef4a00c61bdbc21f00a34479e5ef.png
74ea2330f1d8d63b14b4e6bbfd838bab.png

图 3 无损变换

2) 非刚性变换

非刚性变换描述了更改大小但不改变形状的图像的任何变换。拉伸或扩张是非刚性类型的转换的示例。在医学图像问题中,非刚性变换有助于增强数据。

弹性变换。弹性变换是为像素的每个维度生成一个随机的标准偏差(-1,1)间隔,然后使用高斯滤波(0,sigma)过滤每个维度的偏差矩阵,最后控制偏差范围放大系数 alpha。最后,从 A(x,y)获得 A'(x + deltaX,y + deltaY)。A'的值替代原始 A 位置的值。一般而言,alpha 越小,sigma 越大,偏差就越小,并且离原始图像越近。

网格失真。失真是一种场像差,它会在全局范围内影响图像的外观,而与影响细节的模糊相反。畸变可以定义为整个像场中放大率的变化。失真的主要且最广为人知的效果是,原始图像中的直线在变换后的图像中将变得弯曲。

光学失真。失真是指光学系统在物体上形成的图像相对于物体本身的失真程度。光学畸变是指通过光学理论计算出的畸变程度。

ad53f7267ab944f2c04288fdd84c8a27.png

图 4 非刚性变换

3) 先进扩展技术

GAN。生成对抗网络(GAN)的原理是:网络中有两个角色,并且这两个角色相互博弈。在神经网络的训练过程中,两个网络相互配合以提高网络的性能。GAN 具有两个主要组件,生成器神经网络和鉴别器神经网络。生成网络使用随机输入,尝试输出数据样本,并将生成的数据发送到鉴别器网络 D(x)。鉴别器网络的任务是预测输入是真实的还是生成的。

在训练中,它分两个阶段进行。第一阶段是学习鉴别器。此时,生成器的权重不变,并且仅鉴别器的权重被更新。在训练过程中,分别从噪声分布和真实分布中选择 m 个噪声输入样本和 m 个真实信号样本,并通过最大化损失函数来更新鉴别器的权重。第二阶段是训练 Generator。此时,损失被最小化以更新生成器的权重。

3431b5a40ca1b2692cc801198e99db12.png

图 5 通过 GAN 生成的扩增图像

SMOTE。SMOTE 是一种用于处理样本类别不平衡的数据集的算法。它的全名是 Synthetic Minority Over-sampled TEchnique。它可以为小样本类别合成新样本。首先,定义特征空间,并确定采样倍率 N。然后为几个类采样点(x,y)找到 K 个最近的邻居样本,随机选择一个最近的邻居

81aea913cdb0d67da943052c0e6a2982.png

和新的样本点满足

60931e5e5eb415590fde1ec4d9c13ca7.png

在两点线上。

Fast AutoAugment。AutoAugment 是 Google 对自动选择最佳数据增强程序的研究,这是无监督数据增强的重要研究方向。其基本思想是利用强化学习从数据本身中找到最佳的图像转换策略,并针对不同任务学习不同的强化方法。与 AutoAugment 相比,Fast AutoAugment 使用更有效的基于密度匹配的搜索策略来学习增强策略,因此它可以在保持可比性能的同时将搜索时间提高几个数量级。

  1. 质量评估模块

我们使用深度学习神经网络对原始图像数据集和扩增图像数据集进行测试,以获取分类结果和准确率。同时,我们将使用 DeepGini 处理分类结果以获得相应数据集的 DeepGini 得分。然后,我们将两个指标结合起来以比较测试集的质量。最后,输出最高质量的数据集。

DeepGini 得分。给定一个测试 t 和一个输出的 DNN,并且 n 是类数,则将 t 的错误分类概率定义为:

7464e055aab2c081b1387c49ab9f9e40.png

对于整个数据集

59be1535f8a68ab931fb57e6f394e929.png

,其中 n 是样本数,我们将 DeepGini 得分定义为:

74981a45f8325976debb2ac019c292a5.png

四、 用法

为了详细说明整个系统的用法和操作过程,我们选择 GON 数据集作为原始数据集,并使用 resnet-50 作为深度神经网络模型进行图像分类。由于我们找不到用于 GON 数据集的任何预训练 DNN 模型,因此我们使用自己训练的 resnet-50 模型。

数据集。医学数据集的类型非常广泛。在本项目中,我们仅以 GON 数据集为例来说明系统。 GON 是来自非青光眼受试者(占 90%)和青光眼患者的大量眼底照片数据集,其中青光眼是目前世界上不可逆失明的主要原因。该数据集中总共提供了 800 张彩色眼底照片,并将其按 1:1 比例分为 2 个子集进行训练和测试,分层后具有相等的青光眼存在百分比。将提供总共 400 张彩色眼底图像的训练集以及相应的青光眼状态和统一的手动像素级注释。

选择扩增技术。用户将原始数据集输入系统中,然后选择系统提供的任何扩增方法来扩增原始数据集。然后,系统将使用用户选择的方法来扩增数据集,并将扩增后的数据集传递给 DNN 模型。

训练模型。使用原始数据集训练 DNN 模型。

数据集评估。系统使用扩增的数据集测试模型以获得准确性和分类结果。然后系统根据分类结果计算每个图像的误分类概率,并从数据集中删除小于 0.05 的图片。同时,系统会计算整个数据集的 DeepGini 得分,并将其用作数据集质量的度量。最后,将模型的分类准确性和数据集的 DeepGini 分数用作评估数据集准确性和多样性的标准。如果评估结果良好,则系统将输出扩展的数据集。但如果评估结果不够好,系统将提示用户选择一种新的增强方法。

44943b7d687efd9bf17ed0501f3b74fe.png

五、 结论

在本文中,我们开发了用于医学数据集的图像扩增集成系统。通过使用我们的系统,用户可以自由选择他们想要实现医疗数据集扩增的方式。此外,由于医学图像的精确性和信息丰富性,我们选择了无损变换、非刚性变换和先进的增强技术,这些技术不会在很大范围内改变图像内容以增强原始数据集。

致谢

本文由南京大学软件学院 2019 级硕士王黛薇翻译转述。

感谢国家自然科学基金(61932012,61802171,61772014)支持!

相关文章:

仲兆鹏 160809329 第5次

---恢复内容开始--- 第一题 #include<stdio.h>//输入三个数有小到大排序 int main() {int a;int b;int c;printf("输入三个整数:");scanf("%d %d %d",&a,&b,&c);if(a>c) { ta; ac; ct; } if(b>c) { tb…

promise实现多个请求并行串行执行

早上查资料&#xff0c;偶然发现这个话题&#xff0c;发现自己并不会&#xff0c;于是乎&#xff0c;下来研究了一下。 想想之前我们用jquery写请求的时候&#xff0c;要实现请求的串行执行&#xff0c;我们可能是这么做的。 $.ajax({url: ,data: ,success: function (data) {$…

人工智能和区块链的融合

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 AI与区块链结合&#xff0c;可能性有多大&#xff1f; 人工智能和区块链是促进各行业创新和转型的主要技术&#xff0c;对这一点各行业已达成共识。…

AngularJS学习笔记(3)——通过Ajax获取JSON数据

通过Ajax获取JSON数据 以我之前写的与用户交互的动态清单列表为例&#xff0c;使用JSON前todo.html代码如下&#xff1a; <!DOCTYPE html> <html ng-app"todoApp"> <head> <meta charset"UTF-8"> <title>TO DO List</tit…

python爬取哔哩哔哩视频_荐爬取哔哩哔哩中的cosplay小视频

爬取哔哩哔哩小视频前言&#xff1a;想必大家都对小视频感兴趣吧&#xff0c;今天的爬虫的内容为将哔哩哔哩中的视频下载到本地&#xff0c;今天爬取的网站为URL : https://vc.bilibili.com/p/eden/all#/?tab%E5%BE%A1%E5%AE%85%E6%96%87%E5%8C%96&tagCOSPLAY1. 分析站点a…

区块链双语术语大全

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 这是一个简单而又全面的Blockchain词汇表&#xff0c;用于令人印象深刻的blockchain语言世界。 51% Attack&#xff08;51%攻击&#xff09; 当一…

SQL SERVER的锁机制(三)——概述(锁与事务隔离级别)

五、锁与事务隔离级别 事务隔离级别简单的说&#xff0c;就是当激活事务时&#xff0c;控制事务内因SQL语句产生的锁定需要保留多入&#xff0c;影响范围多大&#xff0c;以防止多人访问时&#xff0c;在事务内发生数据查询的错误。设置事务隔离级别将影响整条连接。 SQL Serve…

开源造轮子:一个简洁,高效,轻量级,酷炫的不要不要的canvas粒子运动插件库...

一&#xff1a;开篇 哈哈哈&#xff0c;感谢标题党的莅临~ 虽然标题有点夸张的感觉&#xff0c;但实际上&#xff0c;插件库确实是简洁&#xff0c;高效&#xff0c;轻量级&#xff0c;酷炫酷炫的咯。废话不多说&#xff0c;先来看个标配例子吧&#xff1a; &#xff08;codepe…

python启动appium服务_python下appium服务的自启动和关闭

最近想把前不久写的webUi框架改写成mobile_Ui,也就是 用于手机端的UI自动化框架&#xff0c;目前已经完成该框架的改写&#xff0c;记录其中一些问题&#xff0c;框架后续会单独写篇幅介绍遇到的第一个问题就是1、python怎么能够自动启动和自动关闭appium服务&#xff0c;这样每…

以太坊源码分析

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 前言&#xff1a;人类正在步入数据时代。如今&#xff0c;全球每天就产生超过500亿GB的数据&#xff0c;据IDC预测&#xff0c;到2025年这一数据将超…

yapi-docker

yapi-docker 转载于:https://www.cnblogs.com/vickey-wu/p/9026153.html

灵活性是原则性基础上的灵活

灵活性是原则性基础上的灵活&#xff0c;没有原则性的灵活是耍流氓。 原则性是质&#xff0c;灵活性是量&#xff0c;灵活性有度的要求&#xff0c;就是不能改变质。转载于:https://www.cnblogs.com/jcode/p/5961867.html

办公室自动化系统_信息化管理建设 公司办公室用自动盖章机贵吗?

办公室自动盖章机的应用我们首先要考虑到底有没有用&#xff0c;之后在考虑贵不贵的问题。自动盖章机也称智能印章&#xff0c;是企业单位建设信息化印章管理方式的一种&#xff0c;过去由于人工盖章和管章效率低&#xff0c;且风险较大&#xff0c;为了避免因印章管理不当引起…

加密货币银行是什么?它又将如何运作?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 比特币曾经承诺&#xff0c;将帮助每个人拥有“属于自己的 银行 ”。但这里需要强调一点&#xff0c;在了解到银行实际提供的众多服务之后&#xff…

【Python】实现将testlink上的用例指定格式保存至Excel,用于修改上传

背景 前一篇博客记录的可以上传用例到testlink指定用例集的脚本&#xff0c;内部分享给了之后&#xff0c;同事希望能将testlink上原有的用例下载下来&#xff0c;用于下次修改上传&#xff0c;所有有了本文脚本。 具体实现 获取用例信息 def download_testcase():""…

Java随机字符串:随机数字字符串,工具类

Java中生成随机数&#xff0c;字符串的工具类 1. 调用方法需要传入生成字符串的长度和需要的类型 生成随机数字 生成随机字母字符串 生成随机字符串数字等 ......... 2. 总共8种类型&#xff0c;具体看工具类中的注释。 1 import java.util.Date;2 import java.util.Random;3 i…

python怎么查看代码错误_python中的错误如何查看

python常见的错误有1.NameError变量名错误2.IndentationError代码缩进错误3.AttributeError对象属性错误4.TypeError类型错误5.IOError输入输出错误6.KeyError字典键值错误具体介绍1.NameError变量名错误报错&#xff1a;>>> print aTraceback (most recent call last…

Facebook的加密货币即将到来会对整个加密货币领域意味着什么

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 Facebook的加密货币即将到来&#xff0c;它对整个加密货币领域意味着什么&#xff1f;这里不仅涉及到用户采用、节点参与&#xff0c;还涉及到合规、…

threadlocal使用场景_深入剖析ThreadLocal

点击上方 IT牧场 &#xff0c;选择 置顶或者星标技术干货每日送达朋友们在遇到线程安全问题的时候&#xff0c;大多数情况下可能会使用synchronized关键字&#xff0c;每次只允许一个线程进入锁定的方法或代码块&#xff0c;这样就可以保证操作的原子性&#xff0c;保证对公共资…

zabbix 监控tomcat实例

zabbix 监控tomcat实例环境:CentOS 7.2zabbix-3.0.5 LTSnginx-1.10.1php-7.0.11mariadb-10.1.18tomcat-9请参看zabbix-3.0.x LTS源码安装配置Tomcat7/8/9安装配置tomcat启用jmxhttp://tomcat.apache.org/tomcat-9.0-doc/monitoring.htmlhttp://docs.oracle.com/javase/6/docs/t…

什么是USDT以及如何使用它?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 什么是USDT&#xff1f; 如果您使用Poloniex或Bittrex交易所交易&#xff0c;那么您可能已经多次见过UDST市场了&#xff0c;您甚至经常使用它。 …

BZOJ3930: [CQOI2015]选数

BZOJ3930: [CQOI2015]选数 Description 我们知道&#xff0c;从区间[L,H]&#xff08;L和H为整数&#xff09;中选取N个整数&#xff0c;总共有(H-L1)^N种方案。 小z很好奇这样选出的数的最大公约数的规律&#xff0c;他决定对每种方案选出的N个整数都求一次最大公约数&#xf…

the job was canceled什么意思_这些英语短语,因为相差一个“the”导致意思大不相同!...

今天有小伙伴在我文章下面留言&#xff0c;说到了两个短语&#xff0c;同样是因为两者之间相差一个“the”而造成了意义完全不同。分别是“out of question”和“out of the question”&#xff0c;第一个没有“the”意思是“毫无疑问、无疑的”意思。第二个则是“不可能的”。…

php中类和对象的操作

在类中用$this指代对象本身。 用self::指代类本身。 $p1 new Person(michael);//向Person类的构造函数__construct中传名字 echo($p1->name);//获取对象p1的public实例属性name(注意没有$) $p1->speak();//调用对象p1的实例方法speak echo(Person::$sex);//获取类变量(s…

关于区块链的知识

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 1 是什么导致了区块链的出现&#xff1f; 互联网的信任缺失导致了区块链技术的出现 在互联网上最缺乏的就是信任了&#xff0c;1993年《纽约客》…

JavaScript 表单与表单验证

JavaScript 表单 JavaScript 表单验证 HTML 表单验证可以通过 JavaScript 来完成。 以下实例代码用于判断表单字段(fname)值是否存在&#xff0c;如果存在&#xff0c;则弹出信息&#xff0c;否则阻止表单提交&#xff1a; JavaScript 实例 function validateForm() { var x d…

iOS项目的本地化处理(多国语言)

项目的本地化就是&#xff1a;iOS系统在不同语言环境下自动切换语言&#xff0c;从而实现一个app发布到全世界各个国家的AppStore上。 我们不仅仅需要在iOS项目中做本地化处理&#xff0c;在上架iOS APP的时候&#xff0c;也需要做对应的本地化设置哦。 iOS项目中需要处理的本地…

synchronized底层原理_你用过synchronized吗?它的底层原理是什么?Java经典面试题来了...

并发编程已经成为程序员必备技能作为Java程序员&#xff0c;不懂得并发编程显然已经不能满足市场需求了&#xff0c;尤其是在面试过程中将处于被动地位&#xff0c;也有可能面试将就此终结。那么作为Java开发者的你&#xff0c;日常虽然可以基于Java的并发工具包实现并发编程&a…

一个比特币要挖多久?

链客&#xff0c;专为开发者而生&#xff0c;有问必答&#xff01; 此文章来自区块链技术社区&#xff0c;未经允许拒绝转载。 一个比特币要挖多久 比特币怎么挖能赚钱吗比特币要用专门的挖矿机来挖。平均一个挖到的时间几周到几个月不等。要看你的机器的规模了。 一台普通笔…

[UE4]死亡后调整视角

AddLocalOffset&#xff1a;本地坐标偏移。 脱离控制器操作 会影响“OnDie”方法里面的相机移动操作&#xff0c;而函数里面又不允许使用“Delay”方法&#xff0c;但可以使用“Set Timer By Function Name”方法。 转载于:https://www.cnblogs.com/timy/p/9036267.html