天池医疗AI大赛[第一季] Rank5解决方案

一、赛题说明

数据格式

本次大赛数据集包含数千份高危患者的低剂量肺部CT影像(mhd格式)数据,每个影像包含一系列胸腔的多个轴向切片。每个影像包含的切片数量会随着扫描机器、扫描层厚和患者的不同而有差异。原始图像为三维图像。这个三维图像由不同数量的二维图像组成。其二维图像数量可以基于不同因素变化,比如扫描机器、患者。Mhd文件具有包含关于患者ID的必要信息的头部,以及诸如切片厚度的扫描参数。

数据由大赛合作医院授权提供,全部是肺部CT影像(mhd格式)数据。主办方为医院开发了专业的脱敏软件,所有CT影像数据严格按照国际通行的医疗信息脱敏标准,由医院进行脱敏处理,脱敏信息包括:医院信息、患者信息和标注医师信息,所有数据不可溯,切实保障数据安全。

训练集和验证集的所有数据全部都有结节,除了进行病理分析的结节外,其它结节都由三位医生进行标记确认。csv文件标注了结节的位置和大小,具体示例如下:

------------------------------------------------

Seriesuid,coordX,cordY,coordZ,diameter_mm

LKDS_00001,-100.56,67.26,-231.81,6.44

------------------------------------------------

参赛者提交一个CSV文件,第一行标记每一列的名称,一共五列,分别为图像ID号,坐标和概率。从第二行之后的每一行都标记一个检测到的结节,坐标为检测到的结节的中心坐标x, y, z的数值。例如:

------------------------------------------------

seriesuid,coordX,coordY,coordZ,probability

LKDS-00012,75.5,56.0,-194.254518072,6.5243e-05

LKDS-00022,-35.5999634723,78.000078755,-13.3814265714,0.00269234

LKDS-00049,80.2837837838,198.881575673,-572.700012,0.00186072

LKDS-00056,-98.8499883785,33.6429184312,-99.7736607907,0.00035473

LKDS-00057,98.0667072477,-46.4666486536,-141.421980179,0.000256219

------------------------------------------------

字段定义:

------------------------------------------------

列名                        类型            含义

seriesuid               string          患者ID

coordX                  float             X方向位置

coordY                  float             Y方向位置

coordZ                  float             Z方向位置

diameter_mm      float             结节大小

probability            float             预测为结节的概率

------------------------------------------------

二、赛题解读

这是一个目标检测(object detection)的问题,在3D的CT图像中找到结节的位置。

目前在目标检测做的最好的是Kaiming He团队提出的RCNN系列结构(2D)。我们进行了code编写,但是效果不理想。主要的原因在于:

1. Faster RCNN开销特别大,导致我们只能实现2D版本的,但2D版本丢失了3D的context信息,导致我们的模型得出的结果并不好。

2. 如果切换到3D版本,Faster RCNN由于需要先提proposal,再做detection,时间开销巨大。

放弃Faster RCNN之后,我们参考了以直接预测著称的SSD、YOLO系列,最后决定采用3D版本的YOLO。做出来以后,效果得到了飞速提升。

三、数据预处理—肺部区域提取

根据以往比赛的经验,肺结节检测需要先把肺部区域提取出来。我们的实战经验发现,这一点很重要。提取肺部区域的好处也很明显:主要体现在减少了无关区域对model的影响,使model在更小的区域规模进行预测。

由于之前有类似比赛,我们综合了前面比赛的一些经验,实现了我们的肺部区域提取代码。大致的流程如下:

  1. 根据图形学信息进行label标注,使相邻区域有相同的label。这一过程需要注意,由于实际影像没有严格的区域的划分,导致存在一些很小的区域,这些小区域包含在更大的区域里面,单从label层面讲,他们属于小区域,但它们真正的label其实是和大区域一致的。具体的实现就是参考周围区域的label,进行区域label扩散。可参考scipy.ndimage.binary_dilation函数

  2. 提取面积最大的两个label区域,这两个区域就是两个肺结节

  3. 由于不同影像的拍摄参数一样,导致影响的origin、spacing等信息也不一样。所以数据重采样是必须的,主要是通过插值把图像的分辨率统一起来。

  4. 进行相应的坐标变换,并进行元信息保存。坐标变换需要注意,除去根据origin、spacing进行世界坐标转换外,还需要根据肺部区域,从新更新ground truth的位置信息。

还有一些特殊的影像,依靠上面的步骤很难提取出肺部区域。此时,我们需要进行一些统计分析,总结出这类影像的分布规律,直接对原始影像进行处理。

这部分由于用到了很多图形学知识,很难进行详细说明。我们也是参考了很多前人的实现,所以,想了解更多的可以直接参考我们的实现。

四、模型构建

模型构建就是3D版本的yolo,大家可以去看看yolo相关的文章。Yolo v2获得 cvpr最佳论文提名。需要注意的是,我们的基础网络架构与原paper的有两点重要不同。

1. 基本网络结构我们采用了类似Unet的形式,它的好处是使网络的receptive filed 变得很大,使网络可以同时融合深层网络的语义信息以及浅层网络的context信息。网络结构如下。

2. 我们把采样的数据在原始图形的位置信息利用起来,融入我们的网络。我们认为位置信息有助于肺结节检测。

我们的网络结构如图所示,整体来说先做4次卷积操作和pooling操作,然后做2次反卷积(deconvolution),最后得到的输出比原图要小。最后再做一次卷积,num_output为5*5,第一个5表示有5种结节anchor大小,第二个5代表对每一个bounding box预测5个数字,分别代表该bounding box的xyz方向的偏移量、直径大小偏移量、肺结节概率。卷积操作都用了2-3层的ResNet结构(图中没有展示细节),以及BatchNorm操作和ReLU激活函数,每一次反卷积都会先和前面卷积时候对应大小中间结果连接(concat),第二次连接还加入了Coord(大小为[3,32,32,32]),这表示对应每一个点在原图中的xyz坐标。

其他需要注意的有:

  1. Online data sample:由于每一个患者的图像大小都不同,每一次获取数据的时候会以结节位置为中心随机crop图像的一部分,大小为128*128*128,这样不仅能提高训练速度,也能增加数据多样性。此外,我们也对crop后的图像做augmetation的操作,随机地翻转、旋转、放大缩小图像。在sample的时候,会控制crop的图像位置,使得70%的crop图像都包含肺结节,剩下30%的图像可能没有肺结节。

  2. Hard mining:Kaiming研究组在最新的研究(Focal Loss for Dense Object Detection)中指出。影响物体检测的关键因素是负样本数量太大,占总的loss的大部分,而且多是容易分类的,因此使得模型的优化方向并不是我们所希望的那样。文中提出了focal loss解决这一问题。由于时间原因,我们没有采用focal loss,但是这篇论文揭示了hard mining的重要性。它告诉我们,网络应该关注于那些不容易分类的样本。

  3. 结节大小的影响。结节的大小也对网络的构建有很重要的参考意义。小结节(直径为5-10mm)的比例在初赛为50%,复赛为70%。大部分结节都是小结节,因此对预测结果影响极大。而小结节在神经网络中经过几次pooling之后可能就消失了,而大结节不存在这个问题,所以大结节能加速模型的训练。因此在训练过程中要有效地平衡大结节和小结节的数量。

  4. NMS(Non-Maximum Suppression):为了丰富肺结节检测的位置分布,我们采用了业界通用的NMS。

  5. 模型融合(model ensemble):由于肺结节大小分布的不均匀,导致很难用一个模型或者一个模型的一组参数照顾到所有的肺结节。所以,我们最终的结果集成了多个model/多组参数的结果。做法很简单,做nms的时候同时在多组预测上做。这一点是从google学来的,可参考paper :Speed/accuracy trade-offs for modern convolutional object detectors。

查看本文全部内容,欢迎访问天池技术圈官方地址:天池医疗AI大赛[第一季] Rank5解决方案_天池技术圈-阿里云天池

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/803941.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Win10系统下的EDGE浏览器启用IE模式

Win10系统下的EDGE浏览器目前已弃用IE内核,这样在访问某些较老的网站会有兼容性问题,本文记录了在EDGE浏览器中启用IE模式的操作方法。 一、启用EDGE浏览器的IE模式 要打开Internet Explorer模式,执行以下步骤: 1、在Microsoft Edge的地址栏…

TryHackMe - HTTP Request Smuggling

学完、打完后的复习 HTTP 1 这部分比较简单,直接略过 HTTP2请求走私 首先要了解HTTP2的结构,与HTTP1之间的一些差异 HTTP2中不再使用CRLF来作为字段的边界限定,而是在二进制中直接通过长度、名字、值长度、值,来确认边界 而这…

数据仓库的概念和作用?如何搭建数据仓库?

随着企业规模的扩大和数据量的爆炸性增长,有效管理和分析海量数据成为企业数字化转型的关键。而在互联网的普及过程中,信息技术已深入渗透各行业,逐渐融入企业的日常运营。然而,企业在信息化建设中面临了一系列困境和挑战&#xf…

https的配置和使用(以腾讯云为例)

1、注册域名 2、获取证书 3、下载证书 下载下来的证书所有格式 4、在服务器上下载nginx并配置 nginx的配置文件 如下 server {listen 80;listen 443 ssl;server_name delegate.letspiu.net.cn;ssl on; #开启ssl#指定证书位置ssl_certificate /etc/ss…

JRT判断数据是否存在优化

有一种业务情况类似下图,质控能做的项目是仪器关联的项目。这时候维护质控物时候开通项目时候要求加载仪器项目里面的项目(没有开通的子业务数据的部分)。对右边已经开通的部分要求加载仪器项目里面的项目(有开通业务子数据的部分…

Python从0到100(十二):函数的定义及模块

前言: 零基础学Python:Python从0到100最新最全教程。 想做这件事情很久了,这次我更新了自己所写过的所有博客,汇集成了Python从0到100,共一百节课,帮助大家一个月时间里从零基础到学习Python基础语法、Pyth…

SQL注入sqli_libs靶场第一题

第一题 联合查询 1)思路: 有回显值 1.判断有无注入点 2.猜解列名数量 3.判断回显点 4.利用注入点进行信息收集 爆用户权限,爆库,爆版本号 爆表,爆列,爆账号密码 2)解题过程&#xff1…

GitHub 仓库 (repository) Pulse - Contributors - Network

GitHub 仓库 [repository] Pulse - Contributors - Network 1. Pulse2. Contributors3. NetworkReferences 1. Pulse 显示该仓库最近的活动信息。该仓库中的软件是无人问津,还是在火热地开发之中,从这里可以一目了然。 2. Contributors 显示对该仓库进…

easyExcel - 动态复杂表头的编写

目录 前言一、情景介绍二、问题分析三、代码实现方式一:head 设置方式二:模板导出方式三:自定义工具类 前言 Java-easyExcel入门教程:https://blog.csdn.net/xhmico/article/details/134714025 之前有介绍过如何使用 easyExcel&…

Jmeter02-2:参数化组件其他方式

0、Jmeter组件:参数化概述 0.1 是什么? 参数化是动态的获取并设置数据 0.2 为什么? 比如执行批量操作时,批量插入或批量删除,之前数据都是手写的,每执行完都要修改一次,效率太低 而参数化就是…

Python代码识别minist手写数字【附pdf】

一、概述 对于人类而言,要识别图片中的数字是一件很容易的事情,但是,如何让机器学会理解图片上的数字,这似乎并不容易。那么,能否找出一个函数(模型),通过输入相关的信息&#xff0…

网络基础三——IP协议补充和Mac帧协议

全球网络及网段划分的理解 ​ 根据国家组织地区人口综合评估进行IP地址范围的划分; ​ 假设前8位用来区分不同的国家,国际路由器负责全球数据传输,子网掩码为IP/8;次6位区分不同的省份,国内路由器负责全国数据的传输…

jvm调优案例分析-window通过jstack查找死锁的进程

我们经常会遇到java程序遇死锁的问题,也会经常遇到。 案例 以下是案例代码: package com.dzend.mall.order;public class JstackLockDemo {public static final int initData 666;public static User user new User();public int compute(){int a1;i…

Window安装PostgresSQL

PostgreSQL 安装参考:Windows下安装PostgreSQL_window 安装postgresql-CSDN博客 安装好后打开pgAdmin4 配置Navicat连接PostgresSQL 找到安装目录文件 pg_hba.conf 修改配置增加: 修改前: # TYPE DATABASE USER ADDRES…

登录压力测试

目录 一、准备测试数据 1.1数据库存储过程添加数据 1.2导出为csv作为测试数据(账号、密码) 二、使用fiddler抓包查看接口 2.1.抓到相关接口信息 2.2添加线程组和http请求 2.3将前面接口需要的参数去json格式化 ​2.4填写相关信息 ​ 2.5添加http…

vue canvas绘制信令图,动态显示标题、宽度、高度

需求: 1、 根据后端返回的数据,动态绘制出信令图 2、根据 dataStatus 返回值: 0 和 1, 判断 文字内容的颜色,0:#000,1:red 3.、根据 lineType 返回值: 0 和 1, 判断 箭…

20240309web前端_第三周作业_教务系统页面

作业&#xff1a;教务系统页面 成果展示&#xff1a; 完整代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1…

Verilog实现手表计时

实现手表的计时功能&#xff1a; 1.具有start启动信号、pause暂停信号&#xff0c;可以自定义其触发机制。 2.具有时间更改接口&#xff0c;可以更改时、分、秒。 3.输出时、分、秒。 Verilog设计 模块端口定义&#xff1a; module watch1(input wire clk …

STC89C52学习笔记(七)

STC89C52学习笔记&#xff08;七&#xff09; 综述&#xff1a;本文介绍了串口以及讲述了串口相关寄存器如何配置并给予相关代码。 一、修改代码注意事项 在修改代码时不要一次性加入一堆代码&#xff0c;不利于定位错误。可以先注释一些代码&#xff0c;待解决完毕问题后再…

Angular 使用DomSanitizer

跨站脚本Cross-site scripting 简称XSS&#xff0c;是代码注入的一种&#xff0c;是一种网站应用程序的安全漏洞攻击。它允许恶意用户将代码注入到网页上&#xff0c;其他用户在使用网页时就会收到影响&#xff0c;这类攻击通常包含了HTML和用户端脚本语言&#xff08;JS&…