深度学习入门stage1

图像分割入门:Unet

我没有从Unet论文里给的链接找到代码,去github搜索star高的项目,都是一大坨一大坨的,看不下去。连我非常期待的wz老师写的Unet代码也过于复杂,真的看不懂q_q。所以花了很久的时间在网上找资料。

学Unet看这篇博客:UNet 网络做图像分割DRIVE数据集

简单记录一下我的学习过程:

  • 这篇博客的DRIVE数据集可能是经过处理的,后缀均为.png。之前找到的DRIVE数据集,图片后缀是.gif。相对来说,.png更好处理些。而且DRIVE数据集比较小,不需要很久就能跑完。
  • 该DRIVE数据集的标签图是1通道的二值图像,像素点灰度值只有0和1。所以Unet模型最后输出的channel维度也是1。第一是便于算loss(算loss时,label和predict的特征图形状应保持一致);第二,这是一个二分类,只有前景和背景,二分类的分割模型最后输出channel维为1是很正常的。
  • DRIVE的每一张图片形状为[1, 584, 565],即[C, H, W]。
  • 该Unet代码最后没有归一化的过程,softmax或者sigmoid都没有。
  • 我设置的一些参数如下:
batch_size = 8
in_channels = 1
num_classes = 1
optimizer = optim.RMSprop(net.parameters(), lr=0.00001,weight_decay=1e-8, momentum=0.9)  
loss = nn.BCEWithLogitsLoss()
  • 训练过程:梯度清零->前向传播->损失计算->反向传播->梯度下降计算参数。
  • 对数据集处理时,label变为2值图像。计算loss时,拿label和Unet网络的输出pred直接算。计算准确率acc时,将pred也转化为二值图像再计算。
  • predict.py时,保存结果图片前要先转到cpu。

一个小疑问:
当数据集是多分类时,模型的输出通道数=num_classes吗?label的形状是怎样的呢?此时该如何计算loss和Dice?

分割学习

关于pytorch语义分割二分类问题的两种做法
【深度学习技巧】语义分割中的多分类与二分类使用dice系数

数据集读取

数据集读取的方式也太多了qwq
每次阅读一个新的项目,就看到一种新的数据读取方法。

我下载的数据集格式为.nii.gz,尝试了2种数据集读取方法:

  • 直接读取.nii.gz格式的文件,使用nibabel库,这是专门读取该格式文件的库。
  • .nii.gz格式的图片转换成.npy格式的文件重新存储,train.py中直接读取.npy的文件,代码运行时间相对短很多。使用SimpleITK库。

目前使用下来,觉得第二种方法更方便。

MICCAI公开数据集划分train/val/test

我下载的MICCAI公开数据集存在2个问题:

  • 只分成 train 和 test,没有val。
  • test集合下只有Image,没有Mask。

对于这种情况,解决方案是:
仅使用公开数据集中 train 的部分,并将 train 按照8:2分成 train set 和 test set。由于所有图片都在train一个文件夹下,因此这里又涉及到2种代码编写思路:

  • 使用一个单独的代码文件,将文件夹下的所有图片移动到2个文件夹 train 和 test 下,用 csv 文件存储对应集合中图片的所有路径。训练时,直接读取 csv 文件,即可获得所有图片的路径。
  • 读取 train 文件夹下的所有图片文件,并且按照比例分别将图片的路径放入存储训练集路径、测试集路径的列表中,此时同样可以获得所有图片的路径。

下载脑卒中数据集

isles2022、isles2017、isles2018、isles2016、atlasv2

语义分割评价指标

医学图像分割最常用的指标是Dice和HD95,主要是需要知道如何使用。
这篇博客讲的比较清晰:
关于何时需要sigmoid和softmax?output和target的shape是怎样的?train和test计算Loss和DSC的差异是什么?
关于pytorch语义分割二分类问题的两种做法

该博客介绍了PA、CPA、MPA、IoU、MIoU 5个指标,写的比较通俗易懂:
【语义分割】评价指标:PA、CPA、MPA、IoU、MIoU详细总结和代码实现(零基础从入门到精通系列!)

这篇博客涉及Dice系数, Hausdorff距离,体积相关误差:
【理论+实践】史上最全-论文中常用的图像分割评价指标-附完整代码
我主要看了理论和公式,还没有看代码。

图像分割评估指标——表面距离计算库
3DSAM-Adapter使用该库计算NSD。

跑Unet3d+Atlas v2

数据集划分:最后133张做valid set,比例为8:2。

超参数:

image_depth=128, image_height=176, image_width=128
image_channel=1, numclass=1
loss_name='BinaryDiceLoss'
epochs=200, lr = 1e-3

训练结果:

训练Loss变化
请添加图片描述
最佳DSC约0.57。
一个小疑惑:
虽然此时 train loss 还没有收敛,但是当我将学习率修改为5e-3时,loss反而下降更慢。

nnUnet学习

在Windows上实现nnU-Net v2的环境配置
nnUNet保姆级使用教程!从环境配置到训练与推理(新手必看)

Transformer学习

【DL】图解 Transformer – 李宏毅
只看了Transformer的Encoder部分。

详解Transformer中Self-Attention以及Multi-Head Attention
重点解释了Self-Attention和MSA。

Vision Transformer详解

LayerNorm和BatchNorm:
Layer Normalization解析
Batch Normalization详解以及pytorch实验

Dropout和DropPath:
深度学习中Dropout原理解析
只看了下工作流程。
nn.Dropout、DropPath的理解与pytorch代码
有Dropout的源码,但是原理比较复杂。其中解释了:问题:dropout中为什么要除以 keep_prob?

pytorch | softmax(x,dim=-1)参数dim的理解
关于dim的解释,强。

Swin-Transformer网络结构详解
谁懂,SAM怎么还用了Shifted Window Attention,要吐血了。

SAM学习

【图像分割】【深度学习】SAM官方Pytorch代码-Prompt encoder模块ProEnco网络解析
sam模型中的mask decoder
SAM模型详解

  • 25
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值