【分享帖】参加Kaggle的DataSciBowl2017学到的数据预处理经验
作者:Sober.JChen
原文发表于天池技术圈,点击阅读原文即可查看哦!
以下是正文:
先占个坑,慢慢更新,第一次玩天池,如果帖子不能重复编辑我会分阶段整理发布。(小编提示:其实是可以重复编辑的哟!)
已将部分脚本迁至我公开的项目
https://tianchi-gitlab.aliyun.com/jchen/TCM_AI.git
这两天在尝试改进U-net,没有断更哈O(∩_∩)O哈!
格式有点乱,一直在编辑。哪个哥们教教我富文本编辑公式,第一次玩这个
等我写好了一小部分再排版,别嫌弃哈,喜欢的还望帮忙点个赞~\(≧▽≦)/~
声明:本帖只用于分享本人参加Kaggle的DataSciBowl2017学习到的一些经验,以帮助没有相关数据预处理经验的跨界AI大神快速认识数据以及了解大家常用的方法(如有错误的地方还望大神们不吝赐教)。此帖凡是参考了别人的教程都会以链接形式注明来源以及分享者(包括他们的开源许可),若由于本人孤陋寡闻导致未能追溯到最初版本的发布者,请相关代码所有人联系我,以便添加尊姓大名或删除本帖侵权部分。
说是参加DataSciBowl2017,其实更多的是玩Luna16的数据。由于本次天池大赛数据格式和Luna16相似度大于DataSciBowl2017,所以本帖主要以Luna16的数据预处理为例为大家呈现我的预处理经验。
附上两个相关大赛的链接(希望不会被主办方认为是在打广告拉黑名单):
DataSciBowl2017(马上就结束了)
链接:
https://www.kaggle.com/c/data-science-bowl-2017
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. 进阶思路
1 赛题分析
此部分包括临床意义分析,具体等我整理好文档提交给之前咨询的医生确认无误并获取授权后再贴上来。
2 数据分析
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 数据预处理
3.1 数据读取
3.1.1 需要使用的包
mhd文件和raw文件的介绍
3.2 数据重采样
3.3 候选结节立方体提取
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的数据说明文档,才知道为啥没给出直径。