原文标题:【分享帖】参加Kaggle的DataSciBowl2017学到的数据预处理经验 以下是正文:
https://tianchi-gitlab.aliyun.com/jchen/TCM_AI.git 这两天在尝试改进U-net,没有断更哈O(∩_∩)O哈! 格式有点乱,一直在编辑。哪个哥们教教我富文本编辑公式,第一次玩这个 等我写好了一小部分再排版,别嫌弃哈,喜欢的还望帮忙点个赞~\()/~ 声明:本帖只用于分享本人参加Kaggle的DataSciBowl2017学习到的一些经验,以帮助没有相关数据预处理经验的跨界AI大神快速认识数据以及了解大家常用的方法(如有错误的地方还望大神们不吝赐教)。此帖凡是参考了别人的教程都会以链接形式注明来源以及分享者(包括他们的开源许可),若由于本人孤陋寡闻导致未能追溯到最初版本的发布者,请相关代码所有人联系我,以便添加尊姓大名或删除本帖侵权部分。 说是参加DataSciBowl2017,其实更多的是玩Luna16的数据。由于本次天池大赛数据格式和Luna16相似度大于DataSciBowl2017,所以本帖主要以Luna16的数据预处理为例为大家呈现我的预处理经验。 附上两个相关大赛的链接(希望不会被主办方认为是在打广告拉黑名单): DataSciBowl2017(马上就结束了) Luna16(早就结束了) 链接: https://luna16.grand-challenge.org/ 拟目录(搞不好会变的喔...): 1. 赛题分析 2. 数据分析 2.1 数据说明 2.1.1 LIDC注释文件说明 2.1.2 Luna16文件说明 2.2 数据分析 2.2.1 annotations.csv文件长这样 2.2.2 candidates.csv文件长这样 3. 数据预处理(包括不限于Luna16中55万个候选结节立方体提取以及对预测集候选结节分割后立方体提取的Python脚本) 3.1 读取数据 3.2 数据重采样 3.3 候选结节立方体提取 3.4 训练2D_U-net的数据准备 4. 进阶思路
此部分包括临床意义分析,具体等我整理好文档提交给之前咨询的医生确认无误并获取授权后再贴上来。
2.1 数据说明 Luna16数据来源:LIDC 2.1.1 LIDC注释文件说明 原文:LIDC_XML_Documentation_1_Jan_2009.doc 译文:传送门,如果有误还望批评指正。 2.1.2 Luna16文件说明 ① 病人CT文件,每个病人有一份.mhd和一份.raw,里面包含单个病人的体素值和一些病人相关信息,比如说体素坐标原点、层距等(可用SimpleITK包读取数据); ②一份annotations.csv,内含病人ID、结节三维质心世界坐标、损伤最大程度的截面中的结节最长直径; ③一份candidates.csv,内含病人ID、结节三维质心世界坐标、是否假阳性的flag。 2.2 数据分析 2.2.1 annotations.csv文件长这样 Luna16数据患者总数:888份 有3mm~30mm结节的病人数量:601 具体数量分布见下图:Luna16患者结节数目统计 2.2.2 candidates.csv文件长这样
3.1 数据读取 3.1.1 需要使用的包 mhd文件和raw文件的介绍 3.2 数据重采样
3.3.1 关于坐标转换 csv文件中的坐标称之为世界坐标,mhd文件中使用GetOrigin获取的是体素空间定义的原点,使用GetSpacing获取的是“世界空间”中相邻单位体素的间距 这是提取的脚本,改改路径放好文件就能跑起来,我参考了这几个教程: ① Roden Luo哥们在kaggle论坛上分享的这个Crop, Save and View Nodules in 3D帖子,大部分是参考他的。内部的生成mhd文件的代码是PJackson最先发布的(代码里有他们网址); ② 重采样我从这里学来的,DataSciBowl2017论坛最高票答案,Guido Zuidhof分享的:https://www.kaggle.com/gzuidhof/data-science-bowl-2017/full-preprocessing-tutorial。 ③ 坐标转换我是从这里学来的,https://github.com/booz-allen-hamilton/DSB3Tutorial. 立方体结节提取脚本已经迁至https://tianchi-gitlab.aliyun.com/jchen/TCM_AI.git 提取出来的45*45*45结节立方体。。。 其中一个就长这个样子 使用的可视化工具是Fiji,他家住这里。 生成mhd文件的Python脚本我会在接下来整理好的代码中贴出 这里就有个问题了,结节直径只有这么点,你立方体棱长搞这么大干嘛? 我是这么考虑的:GroundTruth给的是一个结节的直径,而这个直径是这么来的,看下面(引自LIDC数据说明文档) 原文:Please note that object size is determined by electronic calipers to estimate lesion’s longest diameter in the section demonstrating greatest extent of lesion. The lesion’s axial extent was not considered in lesion sizing. (译文:肺结节尺寸由电子测径器确定,以估计损伤最大程度的截面中的病灶最长直径,在损伤尺寸中不考虑损伤的轴向范围。)
那么有一个问题来了,这样子瞎搞不会切到别的东西嘛?而且为什么是45*45*45,可不可以是别的尺寸呢? 答案是会的,当你切到别的东西后,就会是这个样子。。。 这是一个比较尴尬的事情,因为切得区域明显大于结节的大小,导致切到了一部分大气管(我是瞎猜的,还望批评指正),可能会欺骗网络(当然具体会不会影响,我也不知道,做了实验才知道)。 基于这个,我后面提取的结节立方体都是根据直径来的,之后再用0填充。 至于为什么是45,因为我当时灵机一动,就45了...~\()/~ 具体尺寸如下,我是估摸着定的,毕竟众“结”难调。。。 结节直径来自于annotations.csv文件 除了这个带有结节的文件,还有一份candidates.csv文件,顾名思义这份大小为54m的文件是候选结节的列表。 不同于annotations.csv文件的是,她里面长这样: 这不是坑爹么。。。连直径都没有,还有class是啥?后来我去翻阅LIDC的数据说明文档,才知道为啥没给出直径。
(译文:算了,我直接划重点吧。仔细考虑之后分这三类。1. 既符合基于对象大小又满足LIDC结节入选标准的那些对象(有直径);2. 不符合结节标准但可能与结节混淆的对象;3. 明确标记不代表潜在癌症的对象。) 也就是说:有直径的都是阳性的,没有直径的class为1的都是阳性结节( |
|
声明:文章版权归原作者所有 部分文章转自互联网 如有侵权请联系
[邮箱地址] 删除
|