手把手教你用UNet做医学图像分割系统

兄弟们好呀,这里是肆十二,这转眼间寒假就要过完了,相信大家的毕设也要准备动手了吧,作为一名大作业区的UP主,也该蹭波热度了,之前关于图像分类和目标检测我们都出了相应的教程,所以这期内容我们搞波新的,我们用Unet来做医学图像分割。我们将会以皮肤病的数据作为示范,训练一个皮肤病分割的模型出来,用户输入图像,模型可以自动分割去皮肤病的区域和正常的区域。

B站讲解视频:手把手教你用UNet做医学图像分割系统_哔哩哔哩_bilibili
CSDN博客:手把手教你用Unet做自己的医学图像分割系统_dejahu的博客-CSDN博客
代码地址:unet_42: 基于Unet的医学影像分割系统 (gitee.com)
处理好的数据集和训练好的模型:皮肤病语义分割数据集+代码+模型2000张标注好的数据+教学视频-深度学习文档类资源-CSDN文库
更多相关的数据集:语义分割数据集清单-附赠Unet模型训练和使用教程_dejahu的博客-CSDN博客

废话不多说,先上效果,左侧展示是原始图片,右侧是分割结果。

手把手教你用UNet做医学图像分割系统

考虑到学生论文的需要,我还在这里做了一些指示图,可以放在文章中增加篇幅。

[En]

Taking into account the needs of the students’ papers, I have also made some indicator charts here, which you can put in the article to increase the length.

手把手教你用UNet做医学图像分割系统

需要远程调试的小伙伴直接加我好友(qq: 3045834499)即可,没有三连的小伙伴99元,三连的小伙伴只需66元,你就可以获取环境配置、标注好的数据集、训练好的模型以及远程在线答疑全套服务。

; 算法原理介绍

论文地址:https://arxiv.org/pdf/1505.04597.pdf
算法解析:U-Net原理分析与代码解读 – 知乎 (zhihu.com)

Unet 发表于 2015 年,属于 FCN 的一种变体。Unet 的初衷是为了解决生物医学图像方面的问题,由于效果确实很好后来也被广泛的应用在语义分割的各个方向,比如卫星图像分割,工业瑕疵检测等。

Unet 跟 FCN 都是 Encoder-Decoder 结构,结构简单但很有效。Encoder 负责特征提取,你可以将自己熟悉的各种特征提取网络放在这个位置。由于在医学方面,样本收集较为困难,作者为了解决这个问题,应用了图像增强的方法,在数据集有限的情况下获得了不错的精度。

手把手教你用UNet做医学图像分割系统

如上图,Unet 网络结构是对称的,形似英文字母 U 所以被称为 Unet,在一些类别较少的数据集上,一般使用unet来做语义分割,尤其是在一些二分类的任务上,不仅仅模型比较小,而且在精度上也比较高。

更加详细的原理介绍大家可以参考原文以及大佬们在知乎和csdn上的解答,我在这里就不多做赘述了。

; 下载代码

老规矩,代码放在码云上,地址是:unet_42: 基于Unet的医学影像分割系统 (gitee.com)

手把手教你用UNet做医学图像分割系统

大家下载之后放在本地就行

注:请大家使用chrome浏览器或者windows本地自带的edge浏览器下载,否则可能会出现压缩包损坏的bug,而且解压强烈安利大家使用bandzip。

; 配置环境

不熟悉pycharm的anaconda的小伙伴请先看这篇csdn博客,了解pycharm和anaconda的基本操作

如何在pycharm中配置anaconda的虚拟环境_dejahu的博客-CSDN博客_如何在pycharm中配置anaconda

anaconda安装完成之后请切换到国内的源来提高下载速度 ,命令如下:

conda config --remove-key channels
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/main/
conda config --add channels https://mirrors.ustc.edu.cn/anaconda/pkgs/free/
conda config --add channels https://mirrors.bfsu.edu.cn/anaconda/cloud/pytorch/
conda config --set show_channel_urls yes
pip config set global.index-url https://mirrors.ustc.edu.cn/pypi/web/simple

首先创建python3.8的虚拟环境,请在命令行中执行下列操作:

conda create -n unet python==3.8.5
conda activate unet

pytorch安装(gpu版本和cpu版本的安装)

实际测试情况是unet在CPU和GPU的情况下均可使用,不过在CPU的条件下训练那个速度会令人发指,所以有条件的小伙伴一定要安装GPU版本的Pytorch,没有条件的小伙伴最好是租服务器来使用。

GPU版本安装的具体步骤可以参考这篇文章:2021年Windows下安装GPU版本的Tensorflow和Pytorch_dejahu的博客-CSDN博客

需要注意以下几点:

  • 安装前务必更新显卡驱动,并到官网下载相应的驱动安装。
    [En]

    be sure to update your graphics card driver before installation, and go to the official website to download the corresponding driver installation.*

  • 30系显卡只能使用cuda11的版本
  • 一定要创建虚拟环境,这样的话各个深度学习框架之间不发生冲突

我这里创建的是python3.8的环境,安装的Pytorch的版本是1.8.0,命令如下:

conda install pytorch==1.8.0 torchvision torchaudio cudatoolkit=10.2 # 注意这条命令指定Pytorch的版本和cuda的版本
conda install pytorch==1.8.0 torchvision==0.9.0 torchaudio==0.8.0 cpuonly # CPU的小伙伴直接执行这条命令即可

安装完毕之后,我们来测试一下GPU是否

手把手教你用UNet做医学图像分割系统

安装unet程序所需的其他包

程序其他所需要的包我写在了 requirements.txt文件中,大家只需要在项目目录下打开cmd,然后执行下列命令安装即可, 安装之前请确保你已经激活了虚拟环境

pip install -r requirements.txt

至此,我们的环境已经基本配置完成,您已经成功了一半以上,现在您只需要按照教程完成剩下的步骤。

[En]

At this point, our environment has basically been configured, you have been more than half successful, now you just need to follow the tutorial to complete the rest of the steps.

数据处理

在数据处理部分,我们一般使用公开的医学图像数据集。如果我们没有合适的数据集,我们也可以选择给自己贴上标签。标记分段比测试更麻烦。因此,最好使用公共数据集来查找公共数据集。以下是我们将在本期中使用的数据集。

[En]

In the part of data processing, we generally use public data sets for medical images. If we do not have a suitable data set, we can also choose to label ourselves. It is more troublesome to label segmentation than testing. Therefore, it is best to use public data sets to find public data sets. Here are the data sets we will use in this issue.

处理好的数据集和训练好的模型:皮肤病语义分割数据集+代码+模型2000张标注好的数据+教学视频-深度学习文档类资源-CSDN文库

以下面的皮肤病数据集为例,左侧为原始图片,右侧为标签标签。因为标签有两个像素值,背景为0,皮肤病面积为1,所以我们用肉眼看到的标签图像都是黑色的,但这些标签文件中的值实际上是不同的。

[En]

Take the following dermatosis data set as an example, where the left side is the original picture, and the right side is the tagged label. Because the tag has two pixel values, the background is 0, and the dermatosis area is 1, so the tag image we see with the naked eye is all black, but the values in these tag files are actually different.

手把手教你用UNet做医学图像分割系统

记住此处数据集的位置,稍后在培训和测试期间在代码中将其替换为您自己的本地数据集位置。

[En]

Remember the location of the dataset here, and later replace it with your own local dataset location in the code during training and testing.

注:下面的内容是关于数据集的标注,如果大家已经找到合适的数据集,请自行跳过这部分的内容

  • 1.LabelMe的安装

用户在采集完用于训练、评估和预测的图片之后,需使用数据标注工具LabelMe完成数据标注。LabelMe支持在Windows/macOS/Linux三个系统上使用,且三个系统下的标注格式是一样。

安装过程非常简单,您只需在激活虚拟环境的前提下执行以下操作

[En]

The installation process is very simple, you only need to perform the following under the premise of activating the virtual environment

pip install labelme

安装完成之后,直接在命令行中输入 labelme即可启动

  • 2.LabelMe的使用

打开终端输入 labelme会出现LableMe的交互界面,可以先预览 LabelMe给出的已标注好的图片,再开始标注自定义数据集。

手把手教你用UNet做医学图像分割系统

图1 LableMe交互界面的示意图

  • 预览已标注图片

终端输入 labelme会出现LableMe的交互界面,点击 OpenDir打开 <path to labelme>/examples/semantic_segmentation/data_annotated</path>,其中 <path to labelme></path>为克隆下来的 labelme的路径,打开后示意的是语义分割的真值标注。

手把手教你用UNet做医学图像分割系统

图2 已标注图片的示意图

  • 开始标注

请按照下述步骤标注数据集:

​ (1) 点击 OpenDir打开待标注图片所在目录,点击 Create Polygons,沿着目标的边缘画多边形,完成后输入目标的类别。在标注过程中,如果某个点画错了,可以按撤销快捷键可撤销该点。Mac下的撤销快捷键为 command+Z

手把手教你用UNet做医学图像分割系统

图3 标注单个目标的示意图

​ (2) 右击选择 Edit Polygons可以整体移动多边形的位置,也可以移动某个点的位置;右击选择 Edit Label可以修改每个目标的类别。请根据自己的需要执行这一步骤,若不需要修改,可跳过。

手把手教你用UNet做医学图像分割系统

图4 修改标注的示意图

​ (3) 图片中所有目标的标注都完成后,点击 Save保存json文件, 请将json文件和图片放在同一个文件夹里,点击 Next Image标注下一张图片。

LableMe产出的真值文件可参考我们给出的文件夹

手把手教你用UNet做医学图像分割系统

图5 LableMe产出的真值文件的示意图

Note:

对于中间有空洞的目标的标注方法:在标注完目标轮廓后,再沿空洞区域边缘画多边形,并将其指定为其他类别,如果是背景则指定为 _background_。如下:

手把手教你用UNet做医学图像分割系统

图6 带空洞目标的标注示意图

  • 3.数据格式转换

最后,我们使用我们提供的数据转换脚本将上述标记工具生成的数据格式转换为模型训练所需的数据格式。

[En]

Finally, we use the data conversion script we provide to convert the data format produced by the above labeling tools into the data format needed for model training.

  • 经过数据格式转换后的数据集目录结构如下:
my_dataset                 # &#x6839;&#x76EE;&#x5F55;
|-- annotations            # &#x6570;&#x636E;&#x96C6;&#x771F;&#x503C;
|   |-- xxx.png            # &#x50CF;&#x7D20;&#x7EA7;&#x522B;&#x7684;&#x771F;&#x503C;&#x4FE1;&#x606F;
|   |...

|-- class_names.txt        # &#x6570;&#x636E;&#x96C6;&#x7684;&#x7C7B;&#x522B;&#x540D;&#x79F0;
|-- xxx.jpg(png or other)  # &#x6570;&#x636E;&#x96C6;&#x539F;&#x56FE;
|-- ...

|-- xxx.json               # &#x6807;&#x6CE8;json&#x6587;&#x4EF6;
|-- ...

手把手教你用UNet做医学图像分割系统

图7 格式转换后的数据集目录的结构示意图

  • 4.运行以下代码,将标注后的数据转换成满足以上格式的数据集:
  python labelme2seg.py <PATH/TO/LABEL_JSON_FILE>

其中, <path to label_json_file></path>为图片以及LabelMe产出的json文件所在文件夹的目录,同时也是转换后的标注集所在文件夹的目录。

我们已内置了一个标注的示例,可运行以下代码进行体验:

python labelme2seg.py docs/annotation/labelme_demo/

转换得到的数据集可参考我们给出的文件夹。其中,文件 class_names.txt是数据集中所有标注类别的名称,包含背景类;文件夹 annotations保存的是各图片的像素级别的真值信息,背景类 _background_对应为0,其它目标类别从1开始递增,至多为255。

手把手教你用UNet做医学图像分割系统

图8 格式转换后的数据集各目录的内容示意图

; 模型训练

现在来到模特培训环境,首先,请将您的图片和标签按照下面的文件夹放在相应的位置。

[En]

Now come to the model training environment, first of all, please put your pictures and tags in the corresponding location according to the folder below.

手把手教你用UNet做医学图像分割系统

比如我这里的数据集位置在 F:/xxxxxxxxxx/xianyu/data/skin

然后大家找到项目的train目录,修改数据集的位置即可

手把手教你用UNet做医学图像分割系统

修改之后,直接右键 run运行 train.py即可,训练过程中将会有个进度条来显示你训练的速度,如果是GPU的话速度会很快

手把手教你用UNet做医学图像分割系统

模型将会保存在本地目录下:

手把手教你用UNet做医学图像分割系统

模型验证

模型训练结束之后,我们可以使用一些指标来测试模型的性能,语义分割常用的测试指标是miou,定义如下:

手把手教你用UNet做医学图像分割系统

这部分代码在 test.py文件中,和刚才的 train.py一样,大家只需要更改模型和数据集的位置即可

首先需要大家在22行修改需要测试的图片路径,测试结果保存的路径,和测试标签的路径

手把手教你用UNet做医学图像分割系统

然后再代码的第59行修改为对应的模型名称即可。

手把手教你用UNet做医学图像分割系统

修改完成之后直接右键run开始运行,运行的结果将会保存在项目目录的results文件夹下:

手把手教你用UNet做医学图像分割系统

你可以在纸上用自己的语言解释这三个指标,然后把它们放在相应的图片上,这样你的设计就会看起来有血有肉。

[En]

You can explain these three indicators in your own language in the paper, and then put them on the corresponding picture, so that your design will look like flesh and blood.

手把手教你用UNet做医学图像分割系统

; 图形化界面

最后就是我们这个语义分割的系统了,系统本身很复杂,但是只是毕设,所以这里的系统简单理解就是用Pyqt5给我们的代码加个壳子这样,系统的代码在ui.py,大家只需要在代码的第46行修改为自己的模型文件即可。

手把手教你用UNet做医学图像分割系统

运行的结果如下:

手把手教你用UNet做医学图像分割系统

找到我

需要远程的调试的小伙伴直接扫码加我好友(qq: 3045834499)即可,没有三连的小伙伴99元,三连的小伙伴只需66元,你就可以获取环境配置、标注好的数据集、训练好的模型以及远程在线答疑全套服务。

你可以通过这些方式来寻找我。

B站:肆十二-

CSDN:肆十二

知乎:肆十二

微博:肆十二-

现在关注以后就是老朋友喽!

手把手教你用UNet做医学图像分割系统

Original: https://blog.csdn.net/ECHOSON/article/details/122914826
Author: 肆十二
Title: 手把手教你用UNet做医学图像分割系统

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/10435/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

免费咨询
免费咨询
扫码关注
扫码关注
联系站长

站长Johngo!

大数据和算法重度研究者!

持续产出大数据、算法、LeetCode干货,以及业界好资源!

2022012703491714

微信来撩,免费咨询:xiaozhu_tec

分享本页
返回顶部