医学图像分割在临床诊断中发挥着重要作用,也是其他医学图像处理方法的基础。
而在传统的医学影像领域,放射肿瘤学家必须在
我们将
通过该命令可以安装本项目所依赖的各种库。
pip install -r requirements.txt
运行
各个
本项目中数据集的来源为 [kaggle 网站中肠胃道图像分割比赛](UW-Madison GI Tract Image Segmentation | Kaggle),肠胃道图像来自
在训练前,我们对数据进行了一些数据增强操作,包括:
- 以一定概率对图片进行水平翻转;
- 以一定概率对图片进行平移、缩放、旋转操作;
- 以一定概率对图片进行网格畸变或弹性畸变操作;
- 以一定概率对原图进行部分遮挡。
我们利用
训练过程中里利用了自动混合精度训练策略、梯度累加等技巧加速了模型训练、提升了模型进行语义分割的效果;
关于优化器,我们选取了
关于学习率,我们设置了初始学习率为
关于损失函数,我们结合了
除了
可以看出,$Resnet50$ 作为编码器时,在原测试集上和新测试集上分割效果均不是最优的,但综合两个测试集的表现考虑,$Resnet50$ 相对要更优一些。这也是我们最终选取
项目的参数配置相关。
- 类
$CFG$ :统一保存了本项目中使用的一些参数; - 函数
$set_seed$ :设置各个随机种子的值,保证了程序每次运行的结果均相同;
与数据集的读取相关。
- 类
$BuildDataset$ :自定义一个$torch$ 的$Dataset$ 类,重写了$__len__$ 方法和$__getiem__$ 方法,用于实现对数据的读取; - 类
$DataLoader$ :根据设定的一些参数读取不同的数据; - 变量
$df$ :一个已经去除脏数据的表格,有五列,分别为$id$ 、$image_path$、$mask_path$ 、$empty$ 和$fold$ ,其中$image_path$ 表明了图像在文件中的存储路径,$mask_path$ 指示了相应的掩码的存储路径,$fold$ 是指将数据集划分为$n_fold$ 折后,该图片属于哪一折。
实现了一些方便的函数。
-
函数
$load_img$ :根据输入文件路径读取图片; -
函数
$load_msk$ :根据输入文件路径读取掩码; -
函数
$png2tensor$ :根据输入文件路径读取对应的图片、掩码并转化为张量; -
函数
$show_img$ :展示图像(和掩码); -
函数
$plot_batch$ :展示一个批次的图像(和掩码); -
函数
$zipDir$ :将指定路径的文件打包成一个$zip$ 压缩包; -
变量
$data_transforms$ :实现数据增强操作;
与模型的构建相关。
- 函数
$build_model$ :根据$CFG$ 中的$backbone$ 参数构建相应的模型; - 函数
$load_model$ :根据目标路径和$backbone$ 类型加载模型;
与模型的训练相关。
- 函数
$dice_coef$ 与$iou_coef$ :计算语义分割中常用的两种指标$dice$ 与$iou$ ; - 函数
$criterion$ :损失函数的实现; - 函数
$train_one_epoch$ :每一轮训练过程的具体实现; - 函数
$valid_one_epoch$ :验证过程的实现; - 函数
$run_training$ :全部训练过程的实现; - 函数
$fetch_scheduler$ :为学习率选取调度器;
编写了一些对比不同模型性能的函数。
- 函数
$Predict$ :输入模型集合、图像、掩码,输出图像、掩码、不同模型预测的结果对比图; - 函数
$GetPartImageAndMask$ :输入图像、掩码,截取原图像、掩码的一小部分; - 函数
$RandomSave$ :随机选取若干张图片保存在当前路径下; - 函数
$PredictWithLabel$ :只选取有掩码的图像进行测试对比; - 函数
$PredictWithNoLabel$ :只选取无掩码的图像进行测试对比; - 函数
$PredictWithPart$ :随即截取若干张图像的局部图像,并进行单个模型的测试; - 函数
$PredictionCompare$ :随即截取若干张图像的局部图像,并进行多个模型的测试与对比;
编写了实现GUI各类功能的函数。
-
$btnInput_Clicked$ :输入单张图片; -
$btnmultiInput_Clicked$ :输入多张图片; -
$btnTest_Pressed$ :实现单图或多图分割; -
$btnonlyLargeBowel_Clicked$ :实现单独分割大肠; -
$btnonlySmallBowel_Clicked$ :实现单独分割小肠; -
$btnonlyStomach_Clicked$ :实现单独分割; -
$Repaint$ :实现在滑鼠滑动或左键拖动时重绘分割图; -
$wheelEvent$ :实现滑鼠滑动使图像缩放的功能; -
$mouseMoveEvent$ :实现左键拖动使图像平移的功能;