手把手教你用UNet做医学图像分割系统_unet医学图像分割-程序员宅基地

技术标签: 语义分割  计算机视觉  深度学习  人工智能  大作业  UNet  

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

B站讲解视频:手把手教你用UNet做医学图像分割系统_哔哩哔哩_bilibili

程序员宅基地:手把手教你用Unet做自己的医学图像分割系统_dejahu的博客-程序员宅基地

代码地址:unet_42: 基于Unet的医学影像分割系统 (gitee.com)

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

更多相关的数据集:语义分割数据集清单-附赠Unet模型训练和使用教程_dejahu的博客-程序员宅基地

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

image-20220213204047803

考虑到同学们的论文需要,我这里还做了一些指标图,大家可以放在文章里增加篇幅

image-20220213204230631

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

算法原理介绍

论文地址:https://arxiv.org/pdf/1505.04597.pdf

算法解析:U-Net原理分析与代码解读 - 知乎 (zhihu.com)

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

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

image-20220213205356136

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

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

下载代码

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

image-20220213214337038

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

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

配置环境

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

如何在pycharm中配置anaconda的虚拟环境_dejahu的博客-程序员宅基地_如何在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的博客-程序员宅基地

需要注意以下几点:

  • 安装之前一定要先更新你的显卡驱动,去官网下载对应型号的驱动安装
  • 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是否

image-20210726172454406

安装unet程序所需的其他包

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

pip install -r requirements.txt

到这里我们的环境基本已经配置完成了,你已经成功了一大半了,下面只需要按照教程完成剩下的步骤即可。

数据处理

数据处理部分,医学影像这块我们一般使用公开的数据集,如果没有合适的数据集大家也可以选择自己进行标注,分割相对于检测而言标注起来比较麻烦,所以能找到公开的数据集最好使用公开的数据集,这里是本期我们要用到的数据集。

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

以下面的皮肤病数据集为例,其中左侧是原始图片,右侧是标注之后的标签,因为标签有两种像素值,背景为0,皮肤病区域为1,所以我们肉眼上看到的标签图片是全黑,但是实际上这些标签文件中的值是不一样的。

image-20220213210042488

记住这里数据集的位置,后面在训练和测试的时候在代码中替换为自己本地的数据集位置。

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

  • 1.LabelMe的安装

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

安装的过程非常简单,大家只需要在激活虚拟环境的前提下,执行下列之类即可

pip install labelme

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

  • 2.LabelMe的使用

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

图1 LableMe交互界面的示意图

  • 预览已标注图片

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

图2 已标注图片的示意图

  • 开始标注

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

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

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

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

图4 修改标注的示意图

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

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

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

Note:

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

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

  • 3.数据格式转换

最后用我们提供的数据转换脚本将上述标注工具产出的数据格式转换为模型训练时所需的数据格式。

  • 经过数据格式转换后的数据集目录结构如下:
my_dataset                 # 根目录
|-- annotations            # 数据集真值
|   |-- xxx.png            # 像素级别的真值信息
|   |...
|-- class_names.txt        # 数据集的类别名称
|-- xxx.jpg(png or other)  # 数据集原图
|-- ...
|-- xxx.json               # 标注json文件
|-- ...

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

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

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

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

python labelme2seg.py docs/annotation/labelme_demo/

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

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

模型训练

现在来到模型训练的环境,首先请大家把自己的图片和标签按照下面的文件夹命名放在对应的位置。

image-20220213211409394

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

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

image-20220213211656907

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

image-20220213211927161

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

image-20220213211807530

模型验证

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

img

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

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

image-20220213212247998

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

image-20220213212356003

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

image-20220213212506859

大家可以在论文中用自己的语言阐述这三个指标,然后放对应的图上去,这样你的毕设就显得有血有肉了。

image-20220213212557672

图形化界面

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

image-20220213212806125

运行的结果如下:

image-20220213213018281

找到我

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

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

B站:肆十二-

CSDN:肆十二

知乎:肆十二

微博:肆十二-

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

image-20211212195912911

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ECHOSON/article/details/122914826

智能推荐

计算机发展的几个重要事件,15件在计算机发展史中具有里程碑意义的事件-程序员宅基地

文章浏览阅读3.2k次。共15张图片,发表于2010-01-28 09:52:05据《时代》报道从1946年第一台电子计算机问世到苹果即将发布万众期待的平板电脑,现代电子计算机技术获得了长足的发展,这些发展均离不开人类科技知识的积累,离不开众多热衷于此并呕心沥血。1946年,第一台电子计算机“埃尼阿克”问世。第一台电子计算机叫“埃尼阿克”(ENIAC),它于1946年2月15日在美国宾夕法尼亚大学宣告诞生。承担开发任务的..._我国计算机发展的重要事件

踏上架构之路(二)——系统技术架构的演变-程序员宅基地

文章浏览阅读289次。"Believe it or not, the bigger problem isn't scaling, it's getting to the point where you have to scale. Without the first problem you won't have the second."—— 《Getting Real -The smarter, faster..._后台技术架构演进

MITK通用插件(三)The Properties View_mitk插件-程序员宅基地

文章浏览阅读249次。概述使用该插件可以对选择的数据及其关联数据属性进行查看和修改。该插件只针对高级用户和开发者进行开放。它是对后端的完全公开。使用属性列表类型两种属性列表:数据节点属性列表 和 数据属性列表数据节点属性列表主要包含渲染设置。它们不是实际数据的本质部分,仅在保存MITK场景作为一个整体时才被保存。这类属性的典型例子是“可见”,它决定是呈现数据还是隐藏数据。通用数据节点属性列表应用于所有的渲染窗口,但也有特定于渲染窗口的数据节点属性列表。在公共列表和特定于渲染窗口的列表中找到的任何属性._mitk插件

SuperMap iObjects .NET之二维线转三维线_超图iobjact geometry转dataset-程序员宅基地

文章浏览阅读892次。在超图的桌面产品中,包含了多种功能,其中也包括数据的基本处理功能。但是在各位伙伴在SuperMap iObjects .NET的使用过程中,也有二维转三维的需求,以下笔者就以二维线转三维线为例,详解这个过程。实现原理:1、创建三维线数据集(DatasetVector)2、获取二维线和三维线记录集(Recordset)3、使用二维线数据集记录集获取对象的节点,在使用对应的高度与二维节点一起组成三维点组4、使用三维点构造三维线对象,将对象存入新建的三维线数据集中具体实现方式:创建_超图iobjact geometry转dataset

maya2020 redshift3.0.31demo版安装方法。_redshift2.6.48demo版本-程序员宅基地

文章浏览阅读3.6k次。redshift官方提供的demo版测试仅仅提供到2.6.53,但水印,但是可以支持maya2020,学习功能足够了。如果要商用建议可以购买正版3.0以上版本,支持最新的rtx显卡。安装时,到了最后配置maya.env文件时,报错提示:Modifying C:\Users\Administrator\Documents\maya\2020-x64\maya.env …Failed to write to C:\Users\Administrator.5X10AWXGBWXZEXG\Documents\_redshift2.6.48demo版本

Vue button 的 @click 方法无效 钩子函数没有执行_button @click-程序员宅基地

文章浏览阅读1.2w次。Vue项目中使用button绑定click事件,事件无法触发methods中的方法解决办法事故还原小胖做完公司的项目,老大看着小胖疲惫的脸庞,有点心疼小胖,就给小胖放了三天假,没有给小胖新的需求。小胖平常主要是写的后端,但是最近跟小顺子有点聊技术,小顺子经常把Vue挂在嘴边,小胖有点不服气,正好最近也有时间,打算利用这三天把Vue入个门,但是刚开始就把小胖给难住了,小胖写了一个button,并绑定了click点击事件,但是发现无法触发methods中的but方法,异常提示信息大致的意思是but_aja_button @click

随便推点

CDH激活分发parcel时因为意外错误卡住不能修改问题解决方案_cdh parcel激活一直卡住-程序员宅基地

文章浏览阅读2.7k次。问题背景:今天因为业务需求需要在CDH集群上安装StreamSets,结果因为权限的原因,之前我把这个parcel文件的权限变更为cloudera-scm,结果后面遇到这个问题了,问了之前部署CDH的人才知道他那时候用的权限是Root用户,所以现在卡在这里,也没有地方可以直接暂停:然后我点进去看详细的信息:可以看到cluster2-1这个结点因为权限的问题,导致不能激活。解决方案:Cloudera并没有在控制台开发Cancel或者回滚的入口,此时服务状态就是卡住页面无法操作。通过_cdh parcel激活一直卡住

TinyRayTracer 用256行C++代码构建一个可理解的光线追踪器(1)_understandable raytracing in 256 lines of bare c++-程序员宅基地

文章浏览阅读1.6k次,点赞7次,收藏13次。网上有大量的光线追踪相关的文章,然而问题在于几乎所有的这些文章都在展示那些成熟的非常难以理解程序。举个例子,非常著名的 明信片光线追踪器 挑战。这段简洁的程序令人印象深刻,但却很难让人理解它是怎么工作的。我想详细地教你怎样实现,而不是向你展示我能完成图像渲染。_understandable raytracing in 256 lines of bare c++

C#实现多个子窗体切换效果_c#多窗体管理-程序员宅基地

文章浏览阅读3.1w次,点赞142次,收藏472次。Hello,大家好!我是灰小猿!今天来和大家分享一下在C#的winform开发中如何实现借助一个主窗体来实现内部多个子窗体的切换效果。多窗体切换首先来看一下主窗体中多个小窗体切换的效果:多窗体切换的原理:多窗体切换的原理其实是借助一个panel容器,在该容器中显示相同大小的窗口,接下来大灰狼和大家分享一下建立多窗口切换的步骤:1、新建一个主窗体并在其中放置适当的控件,包括进行切换的按钮和显示窗体的panel容器,在这里要注意:将要显示的子窗体就是在该panel容器中显..._c#多窗体管理

【Pycharm学习】Pycharm中输出问题,Pycharm运行程序时在Python console窗口中输出_在pycharm 软件内,输出歌曲信息在控制台打印-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏7次。问题描述pycharm是一款很好用的IDE,但是有一些细节问题需要我们注意。作者就层遇到很多坑最近遇到的一个问题就是输出问题,虽然不影响输出结果但就是看起来不顺眼,现在我将问题,描述如下这就是遇到的问题输出不在正常的run中,直接输出到控制台了也不知道怎么搞的,查阅相关资料后下面说一下解决方案直接上图:1、点击框出来的这里进去页面2、最后一步把这个框起来的对号去掉就好了。..._在pycharm 软件内,输出歌曲信息在控制台打印

php配置vscode插件及环境_phpvcode-程序员宅基地

文章浏览阅读4.1k次,点赞3次,收藏13次。Visual Studio Code(VS code)你们都在用吗?看了这篇博文或许对你有用。。。1、vscode 特点:开源,免费;自定义配置集成git智能提示强大支持各种文件格式(html/jade/css/less/sass/xml)调试功能强大各种方便的快捷键强大的插件扩展2、官网Visual Studio Code(VScode )官网 :https://..._phpvcode

碰撞检测:判断2个多边形相交_多边形碰撞交点-程序员宅基地

文章浏览阅读1.3w次,点赞3次,收藏54次。演示demo:需要判断2个条件边相交。2个多边形的边是否相交。点在内部。2个多边形的顶点是否在另一个多边形的内部。关于这2个条件的判断:《碰撞检测:判断点是否在多边形内部》https://blog.csdn.net/StevenKyleLee/article/details/88044589《碰撞检测:判断线段相交》https://blog.csdn.net/StevenKy..._多边形碰撞交点