Press "Enter" to skip to content

Pytorch深度学习实战教程(一):语义分割基础与环境搭建

摘要

 

许久没有更新技术博文了,给自己挖一个新坑:语义分割系列文章,先从最简单的语义分割基础与开发环境搭建开始讲解。

 

 

一、前言

 

许久没有更新技术博文了,给自己挖一个新坑:语义分割系列文章。

 

该系列文章的内容有:

Pytorch 的基本使用
语义分割算法讲解

先从最简单的语义分割基础与开发环境搭建开始讲解。

 

二、语义分割

 

语义分割是什幺?

 

语义分割(semantic segmentation) : 就是按照 “语义” 给图像上目标类别中的每一点打一个标签,使得不同种类的东西在图像上被区分开来。可以理解成像素级别的分类任务,直白点,就是对每个像素点进行分类。

 

简而言之,我们的目标是给定一幅 RGB 彩色图像(高 x 宽 x3)或一幅灰度图像(高 x 宽 x1),输出一个分割图谱,其中包括每个像素的类别标注(高 x 宽 x1)。具体如下图所示:

 

 

注意:为了视觉上清晰,上面的预测图是一个低分辨率的图。在实际应用中,分割标注的分辨率需要与原始图像的分辨率相同。

 

这里对图片分为 五类 :Person(人)、Purse(包)、Plants/Grass(植物 / 草)、Sidewalk(人行道)、Building/Structures(建筑物)。

 

与标准分类值(standard categorical values)的做法相似,这里也是创建一个 one-hot 编码 的目标类别标注——本质上即为 每个类别创建一个输出通道 。因为上图有 5 个类别,所以网络输出的通道数也为 5,如下图所示:

 

 

如上图所示,预测的结果可以通过对每个像素在深度上求 argmax 的方式 被整合到一张分割图中。进而,我们可以轻松地通过重叠的方式观察到每个目标。

 

argmax 的方式也很好理解。如上图所示,每个通道只有 0 或 1,以 Person 的通道为例, 红色的 1 表示为 Person 的像素,其他像素均为 0。其他通道也是如此,并且不存在同一个像素点在两个以上的通道均为 1 的情况。因此,通过 argmax 就找到每个像素点的最大索引通道值。最终得到结果为:

 

 

当只有一层通道被重叠至原始图像时,我们称之为 mask,即只指示某一特定类别所存在的区域。

 

高分辨率的结果如下图所示,不同的颜色代表不同的类别:

 

 

三、数据集

 

常见的语义分割算法属于有监督学习,因此标注好的数据集必不可少。

 

公开的语义分割数据集有很多,目前学术界主要有三个 benchmark(数据集)用于模型训练和测试。

 

第一个常用的数据集是 Pascal VOC 系列。这个系列中目前较流行的是 VOC2012,Pascal Context 等类似的数据集也有用到。

 

第二个常用的数据集是 Microsoft COCO。COCO 一共有 80 个类别,虽然有很详细的像素级别的标注,但是官方没有专门对语义分割的评测。这个数据集主要用于实例级别的分割以及图片描述。所以 COCO 数据集往往被当成是额外的训练数据集用于模型的训练。

 

第三个数据集是辅助驾驶(自动驾驶)环境的 Cityscapes,使用比较常见的 19 个类别用于评测。

 

可以用于语义分割训练的数据集有很多:

Pascal Voc 2012:比较常见的物体分类,共 21 个类别;
MS COCO:由微软赞助,几乎成为了图像语义理解算法性能评价的 “标准” 数据集,共 80 个类别;
Cityscapes:包含 50 个欧洲城市不同场景、不同背景、不同季节的街景的 33 类标注物体;
Pascal-Context:对于 PASCAL-VOC 2010 识别竞赛的扩展,共 59 个类别;
KITTI:用于移动机器人及自动驾驶研究的最受欢迎的数据集之一,共 11 个类别;
NYUDv2:2.5 维数据集,它包含 1449 张由微软 Kinect 设备捕获的室内的 RGB-D 图像;
SUN-RGBD:由四个 RGB-D 传感器得来,包含 10000 张 RGB-D 图像,尺寸与 PASCAL VOC 一致;
ADE20K_MIT:一个场景理解的新的数据集,这个数据集是可以免费下载的,共 151 个类别。

数据集有很多,本系列教程不局限于具体数据集,可能也会用到 Kaggle 比赛之类的数据集,具体每个数据集怎幺处理,数据集的格式是什幺样的,后续文章用到什幺数据集会具体讲解。

 

四、GPU 机器

 

对于语义分割任务,有个带有 高端 GPU 显卡 的机器还是非常有必要的,如果没有,训练收敛会很慢。

 

最佳的开发环境为 Linux ,因为在公司的日常工作,基本都是使用 Linux 云服务器进行模型开发的工作,提前适应 Linux 操作系统还是有好处的。

 

对于学生党,如果实验室是做 深度学习 方向研究的,并且资源完备,那幺 GPU 服务器应该还是能有的,对于 GPU 服务器的问题不用愁。

 

但可能由于条件限制,实验室没有配备 GPU 服务器,还想学习深度学习相关的知识,有三种方法:

 

1、免费云服务器 Google Colab

 

勉强可以一用的是 Google Colab,它是一个 Google 提供的 免费 GPU 服务器 ,提供的 GPU 算力还算可以,但是它的主要问题在于 需要翻墙 和 存储空间小 ,Google Colab 的存储空间是通过挂载 Google Drive 得到的,Google Drive 只提供 15G 的免费存储空间,想要扩展空间,还是需要花钱的。

 

想使用免费云服务器 Google Colab 的,可以自行百度教程。

 

2、阿里云付费 GPU 云服务器

 

阿里云提供 GPU 云服务器资源,有两种付费模式:包月和按流量付费。有 P4 服务器,甚至吊炸天的 V100 服务器。性能强劲,价格也很感人,两个字形容就是 很贵 ,个人使用者并不推荐购买。除了阿里云提供 GPU 云服务,腾讯、百度、华为都有相应的服务,但是都很贵。

 

3、配置一台电脑主机

 

可以自己配置一台台式主机,也算是对自己的一种投资。配置一台 不错的 ,可以用于深度学习训练的主机需要 6000 元 左右。

 

深度学习的训练 很依赖显卡 的性能,因此需要配置一个较好的 N 卡,也就是 NVIDIA 的显卡,选显卡的技巧就是看下显卡天梯图( 点击查看 ):

 

 

这个显卡天梯图主要包括的是 市面常用 的显卡排名,不包括类似 V100 这样的价格上 10 万的显卡。

 

天梯图,越靠上,显卡的性能越高, 不要选择右侧的 AMD 显卡 ,虽然性能好,但 A 卡是不支持 CUDA 的。

 

根据自己的预算,选择显卡,显卡的显存尽量选择 8G 以上 的,深度学习模型训练很吃显存资源。

 

本人买了微星的 RTX 2060 Super ,买时的价格是 3399 元 ,显卡很不保值,价格会随时间越来越低。

 

配置电脑其实能写很多,比如 CPU、电脑主板、电源、内存、散热器的选择等,这里就不扩展了。没有精力自己组装台式机的,可以直接买配备相应显卡的台式机,但价格相对自己组装的台式机,价格会贵一些。

 

五、开发环境搭建

 

有条件的,推荐使用 Ubuntu 系统配置开发环境,Ubuntu 是 Linux 的一个发行版之一,适合新手,界面友好,操作简单。

 

由于本人购买的电脑主板,不支持 Linux 架构的系统安装,因此后续会以 Windows 作为开发环境,但这并不影响算法原理与代码的讲解。

 

本人的台式机配置情况:

 

CPU:Intel i7 9700k

 

显卡:RTX 2060 Super

 

系统:Windows 10

 

安装好 Windows 系统和必要的驱动后,需要安装的工具有:CUDA、Anaconda3、cuDNN、Pytorch-gpu、Fluent Terminal(可选)。

 

1、CUDA

 

CUDA,是显卡厂商 NVIDIA 推出的运算平台。我们需要根据自己显卡的型号选择支持的 CUDA 版本,例如 RTX 2060 Super 支持 CUDA 10,下载地址: 点击查看

 

 

傻瓜式安装,很简单。

 

安装好后,需要再配置下系统的环境变量,电脑 -> 鼠标右键 -> 属性 -> 高级系统设置 -> 环境变量 ->Path:

 

 

添加自己的 NVSMI 路径到环境变量中,我采用的是默认安装地址:

 

 

配置好后,就可以在 cmd 中使用 nvidia-smi 指令查看显卡了。

 

2、Anaconda3

 

Anaconda 是 Python 的包管理器和环境管理器,可以方便我们安装 Python 的第三方库。

 

下载地址: 点击查看

 

 

选择 Python 3.7 的版本,安装也很简单,傻瓜式下一步即可。

 

安装好后,需要添加系统环境变量,方法与安装 CUDA 时一样:

 

| |

 

D:\Anaconda

 

D:\Anaconda\Scripts

 

|

 

路径改为自己安装的 Anaconda 路径即可。

 

配置好后,在 cmd 中运行 conda -V 没有报错,有版本信息输出,说明配置成功。

 

3、cuDNN 和 Pytorch 安装

 

cuDNN 是用于深度神经网络的 GPU 加速库。它强调性能、易用性和低内存开销。

 

安装好 Anaconda 之后,可以使用 conda 安装 cuDNN 和 Pytorch。

 

打开 Anaconda Prompt,这是 Anaconda 自带的命令行工具,先一定要用这个工具创建环境,直接用系统自带的 cmd,可能遇到一些奇怪的问题,例如 CondaHTTPError 的错误。在 Anaconda Prompt 中输入:

 

| |

 

conda create -n your_name jupyter notebook

 

|

 

这句话的意思是创建一个名字为 your_name 的虚拟环境,并且这个虚拟环境额外安装 jupyter notebook 第三方库。可以将 your_name 改为你自己喜欢的名字,这个名字是你的虚拟环境的名字,自己随便取,比如 jack。

 

随后,输入 y 进行安装:

 

 

安装好后,可以通过指令 conda info -e 查看已有环境情况。

 

 

从上图可以看到,有两个环境,一个是 base,自带的基础环境,另一个是我们新创建的名为 jack 的环境。新建环境的原因是,我们可以分开管理我们配置的环境。

 

安装好环境后,我们就可以激活 jack 环境,并安装 cuDNN 和 GPU 版的 Pytorch 了。激活名为 jack 的环境:

 

 

可以看到,我们的环境由 base 变成了 jack。在 jack 环境中安装 cuDNN:

 

安装 cuDNN 好后,安装 Pytorch,打开 Pytorch 官网: 点击查看

 

 

根据自己的环境选择,选择好后,网页会自动给出需要运行的指令。这里可能需要区分下 Python 的版本和 CUDA 的版本。

 

Python 版本查看方法:直接在命令行中输入 python,会看到 Python 的版本。

 

 

CUDA 版本查看方法,在命令行中输入 nvidia-smi:

 

 

确定好版本后,就可以通过 Pytorch 官网提供的指令安装 GPU 版本的 Pytorch 了。

 

至此,基础的环境搭建已经完成,恭喜。

 

4、Fluent Terminal

 

基础环境配好了,正常使用已经够了。

 

但是追求颜值的人,可能会觉得,Windows 自带的命令行工具和 Anaconda 提供的命令行工具都太丑了。

 

有没有好看,又好用的 Terminal?答案是有的,不过需要自己配置,并且还有一些坑需要慢慢踩。

 

例如 Fluent Terminal,它是现代的、也是我比较推荐的终端工具。它是专属于 Windows 平台,并利用 UWP 技术打造的颜值超高的终端模拟器。先看下颜值:

 

 

喜欢折腾的,可以看看这几篇文章:

 

告别 Windows 终端的难看难用,从改造 PowerShell 的外观开始

 

像 MAC 一样使用 win10 的 Terminal

 

这种美化的工具有很多,需要自行探索,由于本文不是专门针对 Terminal 的美化文章,就不用过多篇幅介绍这些美化工具了。喜欢折腾的,可以根据自己的需求自行百度。

 

六、小结

 

本文介绍了语义分割的基础知识与开发环境的搭建,该系列的下一篇文章会具体讲解 UNet 的算法原理以及训练代码。

 

参考资料

 

1、https://blog.csdn.net/mou_it/article/details/82225505

 

2、https://blog.csdn.net/ShuqiaoS/article/details/87360693

Be First to Comment

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注