LUNA16

LUNA16,全称Lung Nodule Analysis 16。该数据集来自另一个更大的数据集LIDC-IDRI,旨在推动更多计算机视觉领域的SOTA算法用于CAD领域。官方网站
比赛共分为两个部分

  1. 结节区域检测:确定每个疑似结节的区域,并给他们一个概率值
  2. 假阳性减少:对提取出的区域进行分类,类别为是或者不是一个真实结节

LUNA16数据集

数据集的由来

LUNA16由LIDC-IDRI数据集筛选而来,LIDC-IDRI它包括1018个低剂量的肺部CT影像。LUNA16排除了其中切片厚度大于2.5mm的影像,总共包含888张。其中结节区域由四个经验丰富的放射科医生标注得来,共有三个标记类别:非结节、结节<3 mm和结节>=3 mm。注释的参考标准为,至少包括3/4的放射科医生都标注了的且大于等于3mm的所有结节,经过筛选共剩下1186个待检测的结节区域。未包括在参考标准中的注释(非结节、结节<3 mm以及仅由1或2名放射科医生注释的结节)被称为不相关的发现。评估脚本(annotations\u excluded.csv)中提供了不相关结果的列表。

数据集的构成

  • subset0.zip~subset9.zip 包含所有CT图像的10个zip文件,每个病例的完整信息由两个文件组成,数据格式为“.mhd”,“.raw”。mhd文件存储ct的基本信息,raw文件为实际的ct影像图片
  • CSVFILES文件夹,包括5个文件:annotations.csv,candidates.csv,sampleSubmission.csv,annotations_excluded.csv,seriesuids.csv
  • annotations.csv:1186个肺结节信息,字段有seriesuid,coordX,coordY,coordZ,diameter_mm,用于’nodule detection’ track
  • candidates.csv:文件包含用于假阳性减少比赛所需的候选结节位置。一共551065条数据。其中,正例(class:1):1351条,其余都是负例(class:0)
  • sampleSubmission.csv:正确格式的提交文件示例,我们不提交,暂时没用。

完整的数据集由10个子集构成,可用于10fold交叉验证,格式为.rar文件,大小为50G左右。

LUNA16数据集

解压缩之后,有两种文件格式,每个病例的完整信息都由这两种文件存储。其中.mhd文件存储着ct的基本信息,.raw文件存储着实际的ct数据
mhd文件示例

ObjectType = Image
NDims = 3                                           # 三维切片
BinaryData = True                               #二进制数据
BinaryDataByteOrderMSB = False
CompressedData = False
TransformMatrix = 1 0 0 0 1 0 0 0 1                                # 100,010,001 分别代表x,y,z
Offset = -198.10000600000001 -195 -335.209991          # 原点坐标
CenterOfRotation = 0 0 0
AnatomicalOrientation = RAI
ElementSpacing = 0.7617189884185791 0.7617189884185791 2.5         # 像素间隔 x,y,z
DimSize = 512 512 121                                                                              # 数据的大小 x,y,z
ElementType = MET_SHORT
ElementDataFile = 1.3.6.1.4.1.14519.5.2.1.6279.6001.105756658031515062000744821260.raw         # 数据存储的文件名

mhd已经交代了图像数据的信息,接下来对图像数据进行读取并可视化,这里主要用的Python中的SimpleITK库来打开一个.mhd格式的文件

def load_itk_image(filename): itkimage = sitk.ReadImage(filename)           # 读取图像信息,一般读取格式为mhd文件与dicom文件numpyImage = sitk.GetArrayFromImage(itkimage) # 将读取出来的图像信息用像素值表示出来numpyOrigin = np.array(list(reversed(itkimage.GetOrigin())))   # 读取图像的原点信息,因为每张图像的不同,它的位置也与原点的距离不同numpySpacing = np.array(list(reversed(itkimage.GetSpacing())))  # 获取图像的尺度信息return numpyImage, numpyOrigin, numpySpacing
  • 可视化.mhd格式文件
def visual_mhd(np_image):# 查看第100张图像plt.figure()plt.imshow(np_image[100, :, :])# plt.imshow(np_image[100, :, :],cmap='gray') # 以灰度图显示plt.show()

  • 读取图片对应的annotation信息,从.csv文件中读取candidates。为了能够正确打开并读取candidates,我们需要用到pyhton中csv模块。输入为candidates.csv文件,返回为二维列表

seriesuid:表示每个病例图像对应的文件名

filename = '/home/nin/LUNA16/CSVFILES/candidates.csv'
def readCSV(filename):lines = []with open(filename, "r") as f:csvreader = csv.reader(f)for line in csvreader:lines.append(line)return lines
  • 坐标转换

CT数据的坐标都是基于CT扫描仪的,坐标系单位为mm,每个病例的原点和体素间距都不一样;真实坐标系下,原点坐标统一为(0,0,0),体素(Voxel)间距为1。

结节的位置是CT扫坐标系(又称世界坐标系)下相对原点的mm值,需要将其转换到真实坐标轴位置。通过计算CT坐标系下结节位置在原点的相对位置,可以计算出真实坐标系下结节的位置,具体公式为:CT坐标系下的(结节位置-原点位置)/切片体素间距 = 真实坐标系下的(结节位置-(0,0,0))/1

def worldToVoxelCoord(worldCoord, origin, spacing):stretchedVoxelCoord = np.absolute(worldCoord - origin)voxelCoord = stretchedVoxelCoord / spacingreturn voxelCoord
# ------------------------------------------------------------
IN: cands[1]
>>> worldcoord = np.asarray([float(cand[3]),float(cand[2]),float(cand[1])])
>>> voxelCoord = worldToVoxelCoord(worldCoord, numpyOrigin, numpySpacing)
---------------------------------------------OUT---------------------------------------------
['1.3.6.1.4.1.14519.5.2.1.6279.6001.100225287222365663678666836860', '-56.08', '-67.85', '-311.92', '0']
array([-311.92,  -67.85,  -56.08])
array([  9.3159964 , 166.92507596, 186.44671875])
  • 提取candidates的patches并可视化
def show_nodules(ct_scan, nodules,Origin,Spacing,radius=20, pad=2, max_show_num=4):# radius是正方形边长一半,pad是边的宽度,max_show_num最大展示数show_index = []for idx in range(nodules.shape[0]): # lable是一个nx4维的数组,n是肺结节数目,4代表x,y,z,以及直径if idx < max_show_num:if abs(nodules[idx, 0]) + abs(nodules[idx, 1]) + abs(nodules[idx, 2]) + abs(nodules[idx, 3]) == 0:continuex, y, z = int((nodules[idx, 0]-Origin[0])/SP[0]), int((nodules[idx, 1]-Origin[1])/SP[1]), int((nodules[idx, 2]-Origin[2])/SP[2])   # 转换坐标print(x, y, z) #data = ct_scan[z]radius = int(nodules[idx, 3]/SP[0]/2)# pad = 2 * radius# 注意 y代表纵轴,x代表横轴data[max(0, y - radius):min(data.shape[0], y + radius),max(0, x - radius - pad):max(0, x - radius)] = 3000 # 竖线data[max(0, y - radius):min(data.shape[0], y + radius),min(data.shape[1], x + radius):min(data.shape[1], x + radius + pad)] = 3000 # 竖线data[max(0, y - radius - pad):max(0, y - radius),max(0, x - radius):min(data.shape[1], x + radius)] = 3000 # 横线data[min(data.shape[0], y + radius):min(data.shape[0], y + radius + pad),max(0, x - radius):min(data.shape[1], x + radius)] = 3000 # 横线if z in show_index: # 检查是否有结节在同一张切片,如果有,只显示一张continueshow_index.append(z)plt.figure(idx)plt.imshow(data, cmap='gray')plt.show()img_path = '/home/nin/LUNA16/subset0/1.3.6.1.4.1.14519.5.2.1.6279.6001.108197895896446896160048741492.mhd'
cand_path = '/home/nin/LUNA16/CSVFILES/annotations.csv'
cands = readCSV(cand_path)
cand = cands[24]
# show noudles
itkimage = sitk.ReadImage(img_path)  # 这部分给出了关于图像的信息,可以打印处理查看,这里就不在显示了
OR = itkimage.GetOrigin()
# print(OR)
SP = itkimage.GetSpacing()
# print(SP)
numpyImage = sitk.GetArrayFromImage(itkimage)  # 获取数据,自动从同名的.raw文件读取
b = np.array([[-100.5679445,67.26051683,-231.816619,6.440878725]])
show_nodules(numpyImage,b,OR,SP)

参考文章
https://blog.csdn.net/zyc2017/article/details/84030903
https://blog.csdn.net/zsddragon/article/details/97793978

实战:使用Faster R-CNN完成肺结节检测(LUNA16)(1)/LUNA16数据集初探相关推荐

  1. 实战:使用yolov3完成肺结节检测(Luna16数据集)及肺实质分割

    实战:使用yolov3完成肺结节检测(Luna16数据集) yolov3是一个比较常用的端到端的目标检测深度学习模型,这里加以应用,实现肺结节检测.由于Luna16数据集是三维的,需要对其进行切片操作 ...

  2. Faster R CNN

    Faster R CNN 3 FASTER R-CNN 我们的Faster R CNN 由两个模块组成,第一个模块是 proposes regions 的全卷积网络,第二个是使用 proposed r ...

  3. 肺结节目标检测_基于改进Faster R-CNN的肺结节检测

    基于改进 Faster R-CNN 的肺结节检测 肺癌在我国乃至全球范围内 , 都是发病率及死亡率最高的恶性肿瘤.其早期 的表现形式是直径不超过 30mm 的肺内圆形或不规则形结节. 肺癌的早期诊断与 ...

  4. 肺结节目标检测_一种基于CT图像的肺结节检测方法及系统与流程

    本发明属于医学图像分析和计算机辅助诊断等技术领域,更具体地,涉及一种基于CT图像的肺结节检测方法及系统. 背景技术: 肺癌是导致患癌死亡的最危险的疾病之一,其发病率占所有癌症的三分之二,且5年存活率为 ...

  5. 肺结节检测相关文章记录

    1.3DFPN-HS^2: 3D Feature Pyramid Network Based High Sensitivity and Specificity Pulmonary Noudle Det ...

  6. 肺结节检测(一):数据集介绍及处理

    一.LUNA16数据集介绍 1.简介 LUNA16数据集包括888低剂量肺部CT影像(mhd格式)数据,每个影像包含一系列胸腔的多个轴向切片.原始图像为三维图像.每个图像包含一系列胸腔的多个轴向切片. ...

  7. LSSANet:一种用于肺结节检测的长、短切片感知网络

    文章目录 LSSANet: A Long Short Slice-Aware Network for Pulmonary Nodule Detection 摘要 方法 Long Short Slice ...

  8. 肺结节检测的一些要点总结

    肺结节检测实际上就是目标检测,但是有一些地方要注意. 1:在二维平面图上检测不准,还需3D方式进行检测. 2: 一个患者的片子可能包括几百张切片,重构为3D后占用内存很大,需要采用补丁输入的方式,就是 ...

  9. 基于Faster RCNN的医学图像检测(肺结节检测)

    Faster-R-CNN算法由两大模块组成:1.PRN候选框提取模块 2.Fast R-CNN检测模块.其中,RPN是全卷积神经网络,用于提取候选框:Fast R-CNN基于RPN提取的proposa ...

最新文章

  1. Xamarin iOS教程之编辑界面编写代码
  2. Leetcode 905. 按奇偶排序数组
  3. 【Android 逆向】Android 逆向通用工具开发 ( Android 端远程命令工具 | Android 端可执行程序的 main 函数操作 | TCP 协议服务器建立 | 接收客户端数据 )
  4. 莫名的_locals属性
  5. 使用PuTTY、Xshell远程连接Linux,密钥认证连接
  6. 国科大prml15-目标检测
  7. 视觉SLAM笔记(19) 相似变换群与李代数
  8. 二叉树C++ | 链表递归实现二叉树(插入、搜索)_1
  9. TokenInsight:反映区块链行业整体表现的TI指数较昨日同期下跌1.33%
  10. 2020年春季入学学员计算机应用基础本,2020年春季考试《计算机应用基础》在线考核试题.doc(9页)-原创力文档...
  11. 第一张5G电话卡已发出,潘石屹成中国电信0001号尝鲜者
  12. 阶段3 1.Mybatis_05.使用Mybatis完成CRUD_4 Mybatis的CRUD-查询一个和模糊查询
  13. Java生成UUID方式
  14. 网易云音乐歌单的推荐算法
  15. 英国AI初创企业OKRA获416万美元A轮融资
  16. sau交流学习社区第三方登陆github--oauth来实现用户登录
  17. 分享一个音乐API接口地址
  18. Springboot一:多环境配置、热部署、单元测试 MockMvc
  19. 行星图(planet map)
  20. RS|高分1号影像预处理

热门文章

  1. STM8开发实例-时钟系统(CLK)
  2. 使用cocos2dx实现碎片炸裂 P2(凹多边形的三角切割算法)(修订1)
  3. 程序员技术开发委托合同模板 私活模板
  4. 隐私计算头条周刊(12.11-12.17)
  5. Java学习资料分享
  6. 深入理解什么是TCP 粘包?粘包警察是什么梗?
  7. Redis过期删除策略和内存淘汰策略
  8. 核算 央行 支付机构 备付金 对账10大文件等
  9. Hi3556v200配置RTL8189FS
  10. 教你如何用手机连接电脑上网