本次比赛的目标是识别乳腺癌。您将使用从定期筛查中获得的筛查性乳房 X 线照片来训练您的模型。
您在提高乳腺 X 线筛查检测自动化方面的工作可能使放射科医生更加准确和高效,从而提高患者护理的质量和安全性。它还可以帮助降低成本和不必要的医疗程序。
据世界卫生组织称,乳腺癌是全世界最常见的癌症。仅在 2020 年,就有 230 万新诊断乳腺癌和 685,000 例死亡。然而,自 1980 年代卫生当局对被认为有风险的年龄组实施定期乳房 X 光检查以来,高收入国家的乳腺癌死亡率下降了 40%。及早发现和治疗对于减少癌症死亡率至关重要,您的机器学习技能可以帮助简化放射科医生用来评估筛查性乳房 X 线照片的过程。
目前,乳腺癌的早期检测需要训练有素的人类观察员的专业知识,这使得乳房 X 光筛查计划的实施成本很高。几个国家即将出现的放射科医生短缺可能会使这个问题恶化。乳房 X 光检查筛查也会导致假阳性结果的高发生率。这可能会导致不必要的焦虑、不便的后续护理、额外的影像学检查,有时还需要进行组织取样(通常是穿刺活检)。
比赛主办方北美放射学会 (RSNA) 是一个非营利组织,代表了来自全球 145 个国家/地区的 31 个放射学亚专业。RSNA 通过教育、研究和技术创新促进卓越的患者护理和医疗保健服务。
您在本次比赛中的努力可能有助于将早期检测的好处扩大到更广泛的人群。更多的机会可以进一步降低全世界的乳腺癌死亡率
使用概率 F1 分数(pF1)评估提交。传统 F 分数的这种扩展接受概率而不是二元分类。您可以在此处找到 Python 实现。
提交格式
对于每个 prediction_id,您应该在相应的列中预测癌症的可能性 cancer。提交文件应具有以下格式:
2022 年 11 月 28 日 - 开始日期。
2023 年 2 月 20 日 - 报名截止日期。您必须在此日期之前接受比赛规则才能参加比赛。
2023 年 2 月 20 日 - 团队合并截止日期。这是参与者可以加入或合并团队的最后一天。
2023 年 2 月 27 日 - 最终提交截止日期。
2023 年 4 月 14 日 - 获奖者要求截止日期。这是获奖者向主持人/Kaggle 提交他们的训练代码、视频、方法说明的截止日期。
除非另有说明,否则所有截止日期均为相应日期 UTC 时间晚上 11:59。比赛组织者保留在认为必要时更新比赛时间表的权利。
第一名 - 10,000 美元
第二名 - 8,000 美元
第三名 - 7,000 美元
第四至第八名 - 5,000 美元
由于本次比赛是与北美放射学会 (RSNA®) 年会协调举办的,因此将邀请并强烈鼓励获奖者参加会议,并免除费用,具体取决于对解决方案的审查和获奖者义务的履行。
请注意,根据竞赛规则,除了标准的 Kaggle 获胜者义务(开源许可要求、解决方案打包/交付、向主持人展示)之外,主持人团队还要求您:
(i) 制作一个简短的视频来展示您的方法和解决方案,以及
(ii) 在竞赛论坛上发布指向您的开源代码的链接
(iii)(强烈建议)公开您模型的某些版本,仅用于更多动手测试目的。作为托管算法的示例,请参阅http://demos.md.ai/#/bone-age。
必须通过笔记本提交本次比赛的作品。为了在提交后激活“提交”按钮,必须满足以下条件:
CPU 笔记本 <= 9 小时运行时间
GPU Notebook <= 9 小时运行时间
互联网访问被禁用
允许免费和公开可用的外部数据,包括预训练模型
提交文件必须命名 submission.csv
有关如何提交的更多信息,请参阅代码竞赛常见问题解答。如果遇到提交错误,请查看代码调试文档。
注意:此挑战的数据集包含女性受试者的放射学乳房图像。
本次比赛的目的是从筛查检查的乳房 X 线照片中识别乳腺癌病例。出于显而易见的原因,识别癌症病例很重要,但假阳性对患者也有不利影响。每年有数百万女性接受乳房 X 光检查,一个有用的机器学习工具可以帮助很多人。
本次比赛采用隐藏式测试。当您提交的笔记本被评分时,实际测试数据(包括完整长度的示例提交)将提供给您的笔记本。
文件
[train/test]_images/[patient_id]/[image_id].dcm乳房 X 线照片,dicom 格式。隐藏测试集中大约有 8,000 名患者。每个患者通常有 4 张图像,但并非总是如此。请注意,许多图像使用 jpeg 2000 格式,您可能需要特殊的库才能加载。
sample_submission.csv有效的样本提交。只有前几行可供下载。
[train/test].csv每个患者和图像的元数据。只有测试集的前几行可供下载。
site_id- 来源医院的 ID 代码。
patient_id- 患者的 ID 代码。
image_id- 图像的 ID 代码。
laterality- 图像是左乳房还是右乳房。
view- 图像的方向。筛查检查的默认设置是为每个乳房捕获两个视图。
age- 患者的年龄(以年为单位)。
implant- 患者是否有乳房植入物。站点 1 仅提供患者级别的乳房植入信息,而不是乳房级别的信息。
density- 对乳房组织密度的评级,A 是密度最低的,D 是密度最高的。极其致密的组织会使诊断更加困难。仅提供训练。
machine_id- 成像设备的 ID 代码。
cancer- 乳房是否呈恶性癌症阳性。目标值。仅提供训练。
biopsy- 是否对乳房进行了后续活检。仅提供训练。
invasive- 如果乳房对癌症呈阳性,无论癌症是否被证明是侵入性的。仅提供训练。
BIRADS- 如果乳房需要随访,则为 0;如果乳房被评为癌症阴性,则为 1;如果乳房被评为正常,则为 2。仅提供火车。
prediction_id- 匹配提交行的 ID。多个图像将共享相同的预测 ID。仅测试。
difficult_negative_case- 如果案件异常困难,则为真。仅提供训练。
dcm文件是一种医学图像文件
包含影像数据(图像)
文件信息
将dcm文件格式转为jpg,即可对图像数据进行后续处理
需要用到的库:pydicom;
遇到报错信息:
The following handlers are available to decode the pixel data however they are missing required dependencies: GDCM (req. GDCM), pylibjpeg (req. )
处理方法,用SimpleITK替换pydicom处理dcm文件
pip install SimpleITK
data = SimpleITK.ReadImage(path) # path是dcm文件的路径
img_array = SimpleITK.GetArrayFromImage(data) # 返回numpy格式的图像数据
GetSize返回图像的大小(宽,高,深度)
numpy交换数组维度:swapaxes
我们得到的维度是(深度,高,宽)
要得到opencv的图片维度(高,宽,深度)
两次交换
x.swapaxes(0,2)-->(宽,高,深度)
x.swapaxes(0,1)-->(高,宽,深度)
cv2.imread读取图片格式为BGR(高,宽,通道),然后cv2.imshow("",img)
plt.imshow读取的图片格式为RGB,则需要可通过cv2.cvtColor(img,cv2.COLOR_BGR2RGB)或img[:,:,::-1]转化为RGB类型的图片
最好保存为png格式(无损压缩),因为jpg格式是有损压缩
import cv2
import numpy as np
uint16_img = cv2.imread(path, cv2.IMREAD_UNCHANGED)
uint8_img = np.uint8(uint16_img) # 直接转化为uint8
强制转换:第一种直接转换为uint8数据的方法会对数据造成一定的影响。np.uint8()会强制将大于255的数据转化为0-255之间,本来就在0-255之间的数据则如实保存。转换方法为减去256或256的倍数,得到一个在0-255范围内的结果。第二种方法由于先对数据进行了合理的缩放,因此不存在数据信息会被影响的问题
把图片等比例缩放到0-255之间再转换为uint8数据。
import cv2
import numpy as np
uint16_img = cv2.imread(path, cv2.IMREAD_UNCHANGED)
uint16_img -= uint16_img.min()
uint16_img = uint16_img / (uint16_img.max()-uint16_img.min())
uint16_img *= 255
uint8_img = np.uint8(uint16_img)
在jupyter里不想输出太多的信息,可以在代码前加入%%capture
Cache:使用缓存避免重新计算
Parallelization:并行化,充分利用CPU/GPU的所有核心
Dump and Load转存加载
Compression methods压缩
简单的压缩
使用Zlib压缩
使用lz4压缩
作用:
可以将joblib工具集成为ML管道
具体使用方法参考joblib
具体使用方法参考importlib
module动态导入
检查模块是否可以导入
a.py调用c.py的对象方法:importlib.import_module(name, package=None)
绝对导入,name为完整路径str,package为None
相对导入,package需指定对应包位置
具体原理参考DICOM医学图像显示算法
医学图像数据的编码需要经过Modality LUT-->VOI LUT-->Presentation三个转换过程才能显示图像
Modality LUT((Look Up Table):非线性变换算法,设备不同需要转化标准的度量空间
VOl(Value Of Interest)LUT:窗口大小(窗宽)和中心位置(窗位)
Presentation LUT:对图像像素要做的最后一个变换,它用于特定图像的显示
contrast limited adaptive histogram equalization:对比受限自适应直方图均衡
【Contrast Stretching】(对比度拉伸)
【HE】(直方图均衡)
【CLHE】对比度限制的HE、【AHE】(自适应直方图均衡化)。
图像直方图是反映图像像素分布的统计表,灰度直方图是图像灰度级的函数,用来描述每个灰度级在图像矩阵中的像素个数。
cv2. createCLAHE 是一种限制对比度自适应直方图均衡化方法(Contrast Limited Adaptive Hitogram Equalization),采用了限制直方图分布的方法和加速的插值方法。
HE 直方图增强,大家都不陌生,是一种比较古老的对比度增强算法,它有两种变体:AHE 和 CLAHE;两者都是自适应的增强算法,功能差不多,但是前者有一个很大的缺陷,就是有时候会过度放大图像中相同区域的噪声,为了解决这一问题,出现了 HE 的另一种改进算法,就是 CLAHE;CLAHE 是另外一种直方图均衡算法,CLAHE 和 AHE 的区别在于前者对区域对比度实行了限制,并且利用插值来加快计算。它能有效的增强或改善图像(局部)对比度,从而获取更多图像相关边缘信息有利于分割。还能够有效改善 AHE 中放大噪声的问题。另外,CLAHE 的有一个用途是被用来对图像去雾。
numpy.convolve(a, v, mode='full') [source]
返回两个一维序列的离散线性卷积
full,输出形状为(N+M-1,)
same:返回长度max(M,N)
valid返回长度max(M, N) - min(M, N) + 1
该方法返回所有匹配的文件路径 列表 (list)
glob是实用的文件名匹配库
类似于正则表达式,但是与正则表达式不完全相同
”*” :匹配 0 个或多个字符;
“?”:匹配单个字符;
“[]”:匹配指定范围内的字符,如:[0-9]匹配数字;
glob.iglob获取一个可编历对象,使用它可以逐个获取匹配的文件路径名,返回的是generator
os.mkdir是一级一级的创建目录,如果前面一级不存在则会报错
os.makedirs是一次创建多级目录,哪怕中间目录不存在也能正常的(替你)创建
前者较为安全后者较为省事
subplots 一次性创建并返回所有的子图和其 axe 对象
subplot则是分开多次添加子图。每次调用返回一个子图和对应的 ax 对象
fig, ax = plt.subplots()
fig-------即figure,画窗
ax-------即axex,画窗中创建的笛卡尔坐标区
assert 条件, ”接不满足条件声明时的提示描述“
ctype是Python的外部函数库。它提供了C兼容的数据类型,并允许在DLL或共享库中调用函数
ctype是Python封装的API函数库,可以调用所有c语言实现的函数库
截断a的元素,小于3的都为3,其他不变
用于图像增强的python库
github地址:https://github.com/albumentations-team/albumentations
数据增强最快
Pytorch图像模型
timm库实现了最新的几乎所有的具有影响力的视觉模型,它不仅提供了模型的权重,还提供了一个很棒的分布式训练和评估的代码框架
深度学习预处理工具,可加载gpu上运行,提高处理速度
所有图像的操作都在GPU上运行
可混合加载cpu与gpu的图像
由于是第一次参加kaggle竞赛,经验不足出现很多浪费时间以及错误的事情,需要警惕
提交失败:这个问题出现了很多次,甚至是这次比赛失败最主要的原因,导致没有额外的时间去训练模型,以及检查提交的结果是否正确
反思:笔记本提交最容易报错的是Notebook Threw Exception,如果在你先完全运行没有报错的情况下,是由于在隐藏测试集在运行某个程序遇到了错误,需要反复排查确定报错的地方(一般比较隐蔽),注意所有的提交都是无网络情况,那么必须完全运行时也一定要无网络运行可以成功。
其他:数据处理与数据分析,毫无疑问一个好的模型训练出的结果,必须在线下的电脑配置上才能运行,否则无法上榜(这是一定的,指望用别人的模型的pth调参是不现实的,除非本身就发布了很高的分数,只能参考数据处理),数据处理也会花费很多时间,比如会将处理后的数据进行下载需要一定的时间,严格处理后的数据进行下载至少一天。那么整个一块的数据处理可能在一周甚至半个月。
训练:将取得后的数据进行训练和调参抛出pth也会花费一定时间,也定为一周以上
最后是调试,以及优化,至少也是一周时间
所以总共花费时间可能至少要一个月。
另外需要注意的是调查笔记本在隐藏测试的时间不能超过的时间,一般比赛介绍时会说名,这也可能在提交时出现报错Time out
总的来说,可以通过论坛以及别人的代码学到一些很好的技巧以及新的知识,是一个很好锻炼代码能力和项目实战的地方。值得长期学习(如果有额外时间安排的话)
若参加比赛,一定严格制定计划表去做,最后可能会有好的结果,实际上本次比赛到后面一周才开始,不太可能做出好的结果。