Project Icon

Kaggle-PANDA-1st-place-solution

Kaggle冠军前列腺癌诊断AI模型准确率达94%

本项目展示Kaggle PANDA竞赛冠军解决方案,应用深度学习技术进行前列腺癌诊断和Gleason评分。模型利用图像分割和标签清洗等技术,在公开数据集上达到94%准确率,并在多项国际研究中得到验证。项目开源代码和模型,为医疗AI研究提供参考。

Kaggle-PANDA-1st名解决方案

这是PANDA竞赛的第一名解决方案,具体的写作说明在这里

代码和模型由PND团队的@yukkyo@kentaroy47创建。

我们的模型和代码根据CC-BY-NC 4.0许可开源。具体细节请参见LICENSE文件。

你可以跳过一些步骤(因为一些输出已经在input目录中)。

使用于

Nature Medicine: W.Bulten, 人工智能用于前列腺癌的诊断和Gleason分级:PANDA挑战

npj Precision Oncology: Y.Tolkach, 前列腺癌检测和Gleason分级算法的国际多机构验证研究

Cancers: 前列腺癌组织病理学图像自动癌症分级的标签分布学习

描述我们解决方案的幻灯片!

https://docs.google.com/presentation/d/1Ies4vnyVtW5U3XNDr_fom43ZJDIodu1SV6DSK8di6fs/

1. 环境

你可以选择是否使用docker。

1.1 不使用docker(未经测试..)

  • Ubuntu 18.04
  • Python 3.7.2
  • CUDA 10.2
  • 安装NVIDIA/apex == 1.0
# 主要依赖
$ pip install -r docker/requirements.txt
# arutema代码依赖
$ pip install git+https://github.com/ildoonet/pytorch-gradual-warmup-lr.git
$ pip install efficientnet_pytorch

1.2 使用docker(推荐)

# 构建
$ sh docker/build.sh

# 运行
$ sh docker/run.sh

# 执行
$ sh docker/exec.sh

2. 准备

2.1 获取数据

仅下载train_images和train_masks。

$ cd input
$ kaggle download ...
$ unzip ...

(跳过)2.2 根据图像哈希阈值对图像ID进行分组

(跳过)2.3 分割K折

$ cd src
$ python data_process/s00_make_k_fold.py
  • 使用固定种子保持一致
  • 输出:
    • input/train-5kfold.csv

2.4 为训练制作瓦片PNG

$ cd src
$ python data_process/s07_simple_tile.py --mode 0
$ python data_process/s07_simple_tile.py --mode 2
$ python data_process/a00_save_tiles.py
$ cd ../input
$ cd numtile-64-tilesize-192-res-1-mode-0
$ unzip train.zip -d train
$ cd ..
$ cd numtile-64-tilesize-192-res-1-mode-2
$ unzip train.zip -d train
$ cd ..

3. 训练基础模型以去除噪声(预期使用1块TitanRTX)

每个折叠需要约18小时。

$ cd src
$ python train.py --config configs/final_1.yaml --kfold 1
$ python train.py --config configs/final_1.yaml --kfold 2
$ python train.py --config configs/final_1.yaml --kfold 3
$ python train.py --config configs/final_1.yaml --kfold 4
$ python train.py --config configs/final_1.yaml --kfold 5
  • 输出:
    • output/model/final_1
      • 每个权重和训练日志

4. 对本地验证进行预测以去除噪声

每个折叠需要约1小时。

$ cd src
$ python kernel.py --kfold 1
$ python kernel.py --kfold 2
$ python kernel.py --kfold 3
$ python kernel.py --kfold 4
$ python kernel.py --kfold 5
  • 输出是保留训练数据的预测结果:
    • output/model/final_1/local_preds~~~.csv

5. 去除噪声

$ cd src
$ python data_process/s12_remove_noise_by_local_preds.py
  • 输出:
    • output/model/final_1
      • local_preds_final_1_efficientnet-b1.csv
        • 保留数据的拼接预测结果
        • 用于清理标签
      • local_preds_final_1_efficientnet-b1_removed_noise_thresh_16.csv
        • 用于训练模型1
        • 基础标签清理结果
      • local_preds_final_1_efficientnet-b1_removed_noise_thresh_rad_13_08_ka_15_10.csv
        • 用于训练模型2
        • 清理标签以移除20%的Radboud标签
  • 注意:我们在比赛最终提交时使用了这个csv文件:(当时未固定随机种子)
    • input/train-5kfold_remove_noisy_by_0622_rad_13_08_ka_15_10.csv

6. 用移除噪声后的数据重新训练5折模型

  • 你可以在配置中将output/train-5kfold_remove_noisy.csv替换为input/train-5kfold_remove_noisy_by_0622_rad_13_08_ka_15_10.csv

  • 最终推理只使用了第1、4、5折

  • 每折大约需要15小时。

    训练模型2(fam_taro模型):

$ cd src
# 只训练LB最佳的折
$ python train.py --config configs/final_2.yaml --kfold 1
$ python train.py --config configs/final_2.yaml --kfold 4
$ python train.py --config configs/final_2.yaml --kfold 5

训练模型1(arutema模型):

请在Jupyter notebook上运行train_famdata-kfolds.ipynb

# 进入主目录
$ python train_famdata-kfolds.py

我尚未测试.py文件,所以请尝试使用.ipynb文件操作。

最终模型保存在models中。

每折大约需要4小时。

训练好的模型

复现第一名得分的模型保存在./final_models

7. 在Kaggle Notebook上提交

### 模型2
# 第[7]行
class Config:
    def __init__(self, on_kernel=True, kfold=1, debug=False):
        ...
        ...
        ...

        # 你可以更改权重名称。但在本README中不需要
        self.weight_name = "final_2_efficientnet-b1_kfold_{}_latest.pt"
        self.weight_name = self.weight_name.format(kfold)

        ...
        ...
        ...

    def get_weight_path(self):
        if self.on_kernel:
            # 你应该将此路径更改为你的Kaggle数据集路径
            return os.path.join("../input/030-weight", self.weight_name)
        else:
            dir_name = self.weight_name.split("_")[0]
            return os.path.join("../output/model", dir_name, self.weight_name)
       
### 模型1
# 第[13]行
def load_models(model_files):
    models = []
    for model_f in model_files:
        ## 你应该将此路径更改为你的Kaggle数据集路径
        model_f = os.path.join("../input/latesubspanda", model_f)
        ...

model_files = [
    'efficientnet-b0famlabelsmodelsub_avgpool_tile36_imsize256_mixup_final_epoch20_fold0.pth',
]

model_files2 = [
    'efficientnet-b0famlabelsmodelsub_avgpool_tile36_imsize256_mixup_final_epoch20_fold0.pth',
    "efficientnet-b0famlabelsmodelsub_avgpool_tile36_imsize256_mixup_final_epoch20_fold1.pth",
    "efficientnet-b0famlabelsmodelsub_avgpool_tile36_imsize256_mixup_final_epoch20_fold2.pth",
    "efficientnet-b0famlabelsmodelsub_avgpool_tile36_imsize256_mixup_final_epoch20_fold3.pth",
    "efficientnet-b0famlabelsmodelsub_avgpool_tile36_imsize256_mixup_final_epoch20_fold4.pth"
]
        
项目侧边栏1项目侧边栏2
推荐项目
Project Cover

豆包MarsCode

豆包 MarsCode 是一款革命性的编程助手,通过AI技术提供代码补全、单测生成、代码解释和智能问答等功能,支持100+编程语言,与主流编辑器无缝集成,显著提升开发效率和代码质量。

Project Cover

AI写歌

Suno AI是一个革命性的AI音乐创作平台,能在短短30秒内帮助用户创作出一首完整的歌曲。无论是寻找创作灵感还是需要快速制作音乐,Suno AI都是音乐爱好者和专业人士的理想选择。

Project Cover

有言AI

有言平台提供一站式AIGC视频创作解决方案,通过智能技术简化视频制作流程。无论是企业宣传还是个人分享,有言都能帮助用户快速、轻松地制作出专业级别的视频内容。

Project Cover

Kimi

Kimi AI助手提供多语言对话支持,能够阅读和理解用户上传的文件内容,解析网页信息,并结合搜索结果为用户提供详尽的答案。无论是日常咨询还是专业问题,Kimi都能以友好、专业的方式提供帮助。

Project Cover

阿里绘蛙

绘蛙是阿里巴巴集团推出的革命性AI电商营销平台。利用尖端人工智能技术,为商家提供一键生成商品图和营销文案的服务,显著提升内容创作效率和营销效果。适用于淘宝、天猫等电商平台,让商品第一时间被种草。

Project Cover

吐司

探索Tensor.Art平台的独特AI模型,免费访问各种图像生成与AI训练工具,从Stable Diffusion等基础模型开始,轻松实现创新图像生成。体验前沿的AI技术,推动个人和企业的创新发展。

Project Cover

SubCat字幕猫

SubCat字幕猫APP是一款创新的视频播放器,它将改变您观看视频的方式!SubCat结合了先进的人工智能技术,为您提供即时视频字幕翻译,无论是本地视频还是网络流媒体,让您轻松享受各种语言的内容。

Project Cover

美间AI

美间AI创意设计平台,利用前沿AI技术,为设计师和营销人员提供一站式设计解决方案。从智能海报到3D效果图,再到文案生成,美间让创意设计更简单、更高效。

Project Cover

AIWritePaper论文写作

AIWritePaper论文写作是一站式AI论文写作辅助工具,简化了选题、文献检索至论文撰写的整个过程。通过简单设定,平台可快速生成高质量论文大纲和全文,配合图表、参考文献等一应俱全,同时提供开题报告和答辩PPT等增值服务,保障数据安全,有效提升写作效率和论文质量。

投诉举报邮箱: service@vectorlightyear.com
@2024 懂AI·鲁ICP备2024100362号-6·鲁公网安备37021002001498号