深度学习入门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
训练结果:
最佳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。
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模型详解