一文入门深度学习(以医学图像分割为例)
目录
- 文章简介
- 深度学习基础概念
- 什么是深度学习?为什么它有用?
- 特征提取
- 卷积层
- 神经网络
- 医学图像分割实践
- 图像分割
- 任务介绍
- ISBI2012数据集
- UNet
- 模型架构
- 模型训练
- 环境安装
- ISBI2012数据集下载
- 训练
- 验证
- 总结
文章简介
从前端转到学习人工智能,走了不少弯路,甚至可以说是一直在走弯路就没有直过,所以为了让广大想学习深度学习的人能够真真切切有个整体的概念,我这里以实践出发来介绍深度学习的训练流程和基础知识。
本文参考的项目是:pytorch-unet-isbi2012。使用该项目进行实践的原因是unet模型很小,isbi数据集也很小,用cpu和gpu都可以训练,让广大没有gpu的同学也可以进行训练。那么我们开始学习深度学习把。
深度学习基础概念
什么是深度学习?为什么它有用?
深度学习其实说白了就是让模型去自适应数据集的一种方法。而让其有用的方法就是其强大的自动特征提取功能,通过获取的特征就可以很好地区分数据集不同的类别。这个前提就是获取的特征要提取的有区分度,那如何让它有区分度,这就是深度学习涉及的内容了。
特征提取
本文以图像分割为例,在图像分割中获取特征的方法就是使用卷积层。
卷积层
这里不讲很多数学的东西,我只给大家一个概念,那就是卷积层就是一个过滤器。它用来过滤掉图像的无用信息,比如你想识别一个人,可以通过眼睛的轮廓,嘴巴的形状等等。那计算机想获取这些特征,那必须过滤掉无用的信息,因此卷积被提出来了。通过卷积这个过滤器,计算机就可以得到图像的特征图,这个特征图包含眼睛的轮廓、嘴巴的形状等信息。
神经网络
那了解了卷积层是什么,那么我们就可以往下了解什么是神经网络,神经网络其实就是卷积层的叠加。上一个卷积层的输出是下一个卷积层的输入。也就是说上一个卷积层的特征图需要被进一步提取特征,变成更加高维的特征,这种更高维的特征往往更具有区分度。所以我们经常可以看到神经网络的层有很多。
医学图像分割实践
其实学习了这些你就可以开始训练模型了,其他的细节,我认为应该在实践中慢慢学习摸索。
图像分割
任务介绍
在这个项目中,图像分割的意义是给定一个细胞的图片,需要模型能够分割出一个个细胞(如下图所示,第一张为细胞原始图片;第二张为输出图,其中黑色表示背景,白色表示细胞)。在计算机中就是输入一个图片,输出一个0和1的二值图,0代表背景,1代表细胞膜。
ISBI2012数据集
ISBI2012细胞膜分割数据集主要包括了两部分:一部分是训练集,另一部分是测试集。训练集和测试集中都包含了30张原始图片(如上图第一张所示)和30张对应的标注图片(如上图第二张所示)。每张图片的分辨率为512*512。
UNet
好的我们先来学习一种神经网络,前面我们提到这个神经网络很小,其实也就只有26个卷积层,算是很小了。
Unet源于一篇论文,U-Net:Convolutional Networks for Biomedical Image Segmentation,它专门用于解决医学图像分割的问题,因此发展到现在已经有很多变体,这里我们就只复现最原始的论文。
模型架构
UNet主要由编码器和解码器构成。编码器其实就是左半部分下降的区域,它的作用其实就是进行特征提取;解码器是右半部分上升区域,用于将特征图还原到原始图像大小,并输出二值图。
解码器部分每一行的每一个小箭头都代表了一个卷积核,然后把输出作为下一层的输入。
模型训练
具体模型的细节,我这里不再介绍,感兴趣的同学可以去查阅其他博主的文章,他们对模型的介绍十分详细。这里主要是帮助大家能够完整地训练一个模型,形成一个感性认知。
直接把pytorch-unet-isbi2012下载下来,并且解压到你自己的文件夹。
环境安装
1、先创建一个conda环境,这样所有的安装包都会安装到这下面,不会影响其他环境。
conda create -n unet_precision python=3.12.4
conda activate unet_precision
2、安装依赖包
pip3 install torch==2.4.0 torchvision==0.19.0 --index-url https://download.pytorch.org/whl/cu118
pip install numpy==1.26.4 matplotlib==3.7.5 Pillow==10.0.0
这几个是必备的包,所以一定要提前安装
ISBI2012数据集下载
数据集可以在kaggle上下载,只需要按要求把文件夹换成下面格式
project/
├── isbi2012/ # Dataset directory (binary cell segmentation)
│ ├── train/
│ │ ├── imgs/ # Original training set images (PNG format)
│ │ └── labels/ # Training set segmentation labels (PNG format)
│ └── test/
│ ├── imgs/ # Original test set images (PNG format)
│ └── labels/ # Test set segmentation labels (PNG format)
训练
直接运行下面的命令,我们看到下面的输出,就说明开始训练了。
python ./train.py \
--data_root ./ \
--batch_size 2 \
--save_val_results \
--total_epoch 1501 \
--model unet \
--dataset isbi2012 \
--lr 2e-3 \
--loss_type binary_cross_entropy \
--lr_policy CosineAnnealingLR
验证
接下来运行下面命令行,直接获得结果,得到下面的输出,就说明你成功验证了这个模型。
python ./predict.py
总结
成功运行一个项目真的对学习深度学习很重要,接下来,在成功运行的基础上,我将会带大家一步步解读每一块的源码和相关内容。