模型资源之二:各领域的开发套件

本文介绍了飞桨的PaddleSeg图像分割开发套件,它提供模块化设计和端到端支持,包括数据增强和模型部署能力。PaddleSeg覆盖多种主流分割模型,适合不同应用场景,支持深度调优,帮助开发者高效完成图像分割任务。通过实例展示了PaddleSeg的使用流程,包括环境准备、数据处理、模型训练、评估和部署。
摘要由CSDN通过智能技术生成

前言

如果说PaddleHub提供的是AI任务快速运行方案(POC),飞桨的开发套件则是比PaddleHub提供“更丰富的模型调节”和“领域相关的配套工具”,开发者基于这些开发套件可以实现当前应用场景中的最优方案(State of the Art)。

为什么这么说呢?经过前文我们已了解到,PaddleHub属于预训练模型应用工具,集成了最优秀的算法模型,开发者可以快速使用高质量的预训练模型结合Fine-tune API快速完成模型迁移到部署的全流程工作。但是在某些场景下,开发者不仅仅满足于快速运行,而是希望能在开源算法的基础上继续调优,实现最佳方案。如果将PaddleHub视为一个拿来即用的工具,飞桨的开发套件则是工具箱,工具箱中不仅包含多种多样的工具(深度学习算法模型),更包含了这些工具的制作方法(模型训练调优方案)。如果工具不合适,可以自行调整工具以便使用起来更顺手。

飞桨提供了一系列的开发套件,内容涵盖各个领域和方向:
计算机视觉领域:图像分割 PaddleSeg、目标检测 PaddleDetection、图像分类 PaddleClas、海量类别分类 PLSC,文字识别 PaddleOCR;
自然语言领域:语义理解 ERNIE;
语音领域:语音识别 DeepSpeech、语音合成 Parakeet;
推荐领域:弹性计算推荐 ElasticCTR;
其他领域:图学习框架 PGL、深度强化学习框架 PARL。

在这里插入图片描述
图1:飞桨开发套件

本节以PaddleSeg为例,介绍飞桨开发套件的使用方式。其余开发套件的使用模式相似,均包括快速运行的命令、丰富优化选项的配置文件和与该领域问题配套的专项工具。如果读者对其他领域有需求,可以查阅对应开发套件的使用文档。

PaddleSeg用于解决图像分割的问题

PaddleSeg是飞桨为工业界和学术界提供的一款工具箱般便捷实用的图像分割开发套件,帮助用户高效地完成图像分割任务。图像分割任务,即通过给出图像中每个像素点的标签,将图像分割成若干带类别标签的区块,可以看作对每个像素进行分类。图像分割是图像处理的重要组成部分,也是难点之一。随着人工智能的发展,图像分割技术已经在无人驾驶、视频监控、影视特效、医疗影像、遥感影像、工业质检巡检等多个领域获得了广泛的应用。

如果用户直接使用Python设计、编写图像分割模型并进行训练,则需要消耗较大的工作量。通过PaddleSeg来实现则只需要10行左右的代码和命令,就可以完成不同应用领域的图像分割功能,如 图2 所示。
在这里插入图片描述
图2:PaddleSeg的应用场景

PaddleSeg覆盖了DeepLabv3+、U-Net、ICNet、PSPNet、HRNet和Fast-SCNN几种主流的分割模型,并提供了多个损失函数和多种数据增强方法等高级功能,用户可以根据使用场景从PaddleSeg中选择出合适的图像分割方案,从而更快捷高效地完成从训练到部署的全流程图像分割应用。

这么多种类的模型都可以解决图像分割的问题,实际该怎么选用呢?回答这个问题之前,我们先看一下典型的图像分割模型的架构,如 图3 所示。
在这里插入图片描述
图3:图像分割模型的基本套路

观察以上网络结构,可以看到:

(1)网络的输入是H×W(H为高、W为宽)像素的图片,输出是N×H×W的概率图。前文提到,图像分割任务是对每个像素点进行分类,需要给出每个像素点是什么分类的概率,所以输出的概率图大小和输入一致(H×W),而这个N就是类别。

(2)中间的网络结构分为Encoder(编码)和Decoder(解码)两部分。Encoder部分是下采样的过程,这是为了增大网络感受野,类似于缩小地图,利于看到更大的区域范围找到区域边界;Decoder部分是上采样的过程,为了恢复像素级别的特征地图,以实现像素点的分类,类似于放大地图,标注图像分割边界时更精细。

目前多数图像分割模型都是采用这一套路,每个模型的详细介绍可以通过PaddleSeg 的文档了解。这里介绍一个比较通用的模型选择技巧:

如果是图像分割的初学者,则推荐使用U-Net或模型PSPNet。
如果希望以较快的速度完成训练和预测,则推荐使用DeepLabv3+(MobileNetv2)、ICNet或Fast-SCNN模型。
• 如果希望获得最佳的综合性能,则推荐使用HRNet 或 DeepLabv3+(Xception65)模型。

PaddleSeg是开发套件,不仅是模型库

为什么强调PaddleSeg是开发套件,与模型库有什么区别?作为开发套件,PaddleSeg还提供了哪些附加功能呢?包括两点:一是提供了模块化的设计,支持模型的深度调优;二是提供了端到端的研发支持,包括数据处理和模型部署等环节,帮助用户更系统地完成图像分割任务的全流程工作。

PaddleSeg模块化设计

PaddleSeg支持六种主流分割网络,结合预训练模型和可调节的骨干网络,可以满足不同性能和精度的要求。
例如DeepLabv3+分割网络,选用Xception65作为骨干网络可以得到高精度的模型,选用MobileNetv2作为骨干网络可以获得推理速 度更快的模型,满足移动端场景需求。并且PaddleSeg提供了基于COCO、Cityscapes等数据集训练的预训练模型,基于此进行Fine- tune可以实现更好的效果。

提供了不同的损失函数,如Cross Entropy Loss、Dice Loss、BCE Loss等类型,通过选择合适的损失函数,可以强化小目标和不均衡样本场景下的分割精度。如 图4 所示。
在这里插入图片描述
图4:PaddleSeg模块化设计

PaddleSeg对图像分割任务的端到端支持能力

开发者设计好了模型,把模型应用到实际业务中还有很多工作要做,这其中就包括数据增强和模型部署环节。

PaddleSeg提供了丰富的数据增强能力,基于百度视觉技术部的实际业务经验,内置10+种数据增强策略,可结合实际业务场景进行定制组合,提升模型泛化能力和鲁棒性。
还提供了服务端和移动端的工业级部署能力,依托飞桨高性能推理引擎和高性能图像处理实现,开发者可以轻松完成高性能的分割模型部署和集成。通过飞桨轻量化推理引擎Paddle Lite,可以在移动设备或者嵌入式设备上完成轻量级、高性能的图像分割模型部署。

丰富的数据增强能力

为什么需要做数据增强?虽然我们已知的公开图像数据集数量很丰富,如ImageNet1k数据集包含128W张图片,即使不加其他策略训练,一般也能获得很高的精度。而在大部分实际业务场景中,需要使用自己的数据集进行训练,但是因为标注难度大且成本高,能获取的标注数据有限;另外线上应用中图像场景一般比较复杂,如可能存在图像遮挡、尺寸变化大等问题,这会导致训练和推理效果达不到预期。

这时,通过一些数据增强的方式去扩充训练样本,可以增加训练样本的丰富度,提升模型的泛化能力,并且可根据场景定制化数据增广。

PaddleSeg内置了图像Resize、图像翻转、图像裁剪、图像变换等10+种数据增强策略,如 图5 直观呈现了多种数据增强策略的效果。
在这里插入图片描述
图5:丰富的数据增强策略

我们以图像Resize策略为例,看一下具体是采用什么方式变换的。

图像Resize是指将输入图像按照某种规则,将图片重新缩放到某一个尺寸,包括三种方式:

Unpadding 将输入图像直接Resize到某一个固定大小。
Range-Scaling 将输入图像按照长边变化进行Resize,即图像长边对齐到某一长度,该长度在一定范围内随机变动,短边随同样的比例变化。
Step-Scaling 将输入图像按照某一个比例Resize,这个比例以某一个步长在一定范围内随机变动。
具体操作如 图6 所示。
在这里插入图片描述
图6:图像Resize的三种方式

PaddleSeg的模块化设计、数据增强策略,均可以通过配置文件方式自定义组合,帮助开发者更便捷地完成从训练到部署的全流程图像分割应用。

工业级模型部署能力

PaddleSeg依托飞桨高性能推理引擎提供了全场景的部署能力,无论是服务器端,还是移动端、嵌入式端、服务化部署都提供了便捷的实现方案,满足在不同硬件环境中部署的需求。在后面的工业部署章节将详细介绍这部分的实践方法。

下面以医学视盘分割为例,介绍PaddleSeg的使用方法,更详细的PaddleSeg介绍可参考Github链接

PaddleSeg实战

下面将分为准备环境、处理数据集、下载预训练模型、训练模型、可视化训练过程及评估效果几个步骤来介绍使用流程。

准备环境:使用PaddleSeg的软件环境,具体包括安装的Python和飞桨的版本号和如何下载PaddleSeg代码库等内容。
准备数据集:介绍眼底医疗分割数据集的概况。
下载预训练模型:下载飞桨PaddleSeg提供的预训练模型(U-Net模型)。
模型训练:训练配置和启动训练命令。
可视化训练过程:PaddleSeg提供了一系列展示训练过程的可视化工具。
模型评估:评估模型效果。
1. 准备环境
在使用PaddleSeg训练图像分割模型之前,用户需要完成如下任务:

安装Python3.5或更高版本
安装飞桨1.8或更高版本,具体安装方法请参见快速安装。由于图像分割模型计算开销大,推荐在GPU版本的PaddlePaddle下使用PaddleSeg。
下载PaddleSeg的代码库。

#下载PaddleSeg的代码库,同时支持github源和gitee源,为了更快下载,此处使用gitee源。
#!git clone https://github.com/PaddlePaddle/PaddleSeg
!git clone https://gitee.com/paddlepaddle/PaddleSeg
Cloning into 'PaddleSeg'...
remote: Enumerating objects: 4223, done.
remote: Counting objects: 100% (4223/4223), done.
remote: Compressing objects: 100% (1874/1874), done.
remote: Total 4223 (delta 2547), reused 3718 (delta 2222), pack-reused 0
Receiving objects: 100% (4223/4223), 62.64 MiB | 5.78 MiB/s, done.
Resolving deltas: 100% (2547/2547), done.
Checking connectivity... done.

在命令行界面使用pip方式安装其他依赖文件。
注意: 除非特殊说明,以下所有命令应该在PaddleSeg目录下执行!

%cd ~/PaddleSeg/
/home/aistudio/PaddleSeg
!pip install -r requirements.txt
Looking in indexes: https://pypi.mirrors.ustc.edu.cn/simple/
Requirement already satisfied: pre-commit in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 1)) (1.21.0)
Requirement already satisfied: yapf==0.26.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 2)) (0.26.0)
Requirement already satisfied: flake8 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 3)) (3.7.9)
Requirement already satisfied: pyyaml>=5.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from -r requirements.txt (line 4)) (5.1.2)
Collecting visualdl==2.0.0b1 (from -r requirements.txt (line 5))
  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ad/29/cadee04980b10757df62f7eb19e92b6ec95e00c0bcba89a3d1454c492cba/visualdl-2.0.0b1-py3-none-any.whl (1.6MB)
     |████████████████████████████████| 1.6MB 114kB/s eta 0:00:01
Requirement already satisfied: nodeenv>=0.11.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->-r requirements.txt (line 1)) (1.3.4)
Requirement already satisfied: importlib-metadata; python_version < "3.8" in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->-r requirements.txt (line 1)) (0.23)
Requirement already satisfied: toml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->-r requirements.txt (line 1)) (0.10.0)
Requirement already satisfied: six in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->-r requirements.txt (line 1)) (1.14.0)
Requirement already satisfied: virtualenv>=15.2 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->-r requirements.txt (line 1)) (16.7.9)
Requirement already satisfied: cfgv>=2.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->-r requirements.txt (line 1)) (2.0.1)
Requirement already satisfied: aspy.yaml in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->-r requirements.txt (line 1)) (1.3.0)
Requirement already satisfied: identify>=1.0.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from pre-commit->-r requirements.txt (line 1)) (1.4.10)
Requirement already satisfied: pycodestyle<2.6.0,>=2.5.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8->-r requirements.txt (line 3)) (2.5.0)
Requirement already satisfied: pyflakes<2.2.0,>=2.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8->-r requirements.txt (line 3)) (2.1.1)
Requirement already satisfied: entrypoints<0.4.0,>=0.3.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8->-r requirements.txt (line 3)) (0.3)
Requirement already satisfied: mccabe<0.7.0,>=0.6.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flake8->-r requirements.txt (line 3)) (0.6.1)
Requirement already satisfied: flask>=1.1.1 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl==2.0.0b1->-r requirements.txt (line 5)) (1.1.1)
Requirement already satisfied: numpy in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl==2.0.0b1->-r requirements.txt (line 5)) (1.16.4)
Requirement already satisfied: opencv-python in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl==2.0.0b1->-r requirements.txt (line 5)) (4.1.1.26)
Collecting Pillow>=7.0.0 (from visualdl==2.0.0b1->-r requirements.txt (line 5))
  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/ab/f8/d3627cc230270a6a4eedee32974fbc8cb26c5fdb8710dd5ea70133640022/Pillow-7.1.2-cp37-cp37m-manylinux1_x86_64.whl (2.1MB)
     |████████████████████████████████| 2.1MB 161kB/s eta 0:00:01
Collecting Flask-Babel>=1.0.0 (from visualdl==2.0.0b1->-r requirements.txt (line 5))
  WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'ReadTimeoutError("HTTPSConnectionPool(host='mirrors.ustc.edu.cn', port=443): Read timed out. (read timeout=15)")': /pypi/web/simple/flask-babel/
  Downloading https://mirrors.tuna.tsinghua.edu.cn/pypi/web/packages/76/a4/0115c7c520125853037fc1d6b3da132a526949640e27a699a13e05ec7593/Flask_Babel-1.0.0-py3-none-any.whl
Requirement already satisfied: protobuf>=3.1.0 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl==2.0.0b1->-r requirements.txt (line 5)) (3.10.0)
Requirement already satisfied: requests in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from visualdl==2.0.0b1->-r requirements.txt (line 5)) (2.22.0)
Requirement already satisfied: zipp>=0.5 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from importlib-metadata; python_version < "3.8"->pre-commit->-r requirements.txt (line 1)) (0.6.0)
Requirement already satisfied: itsdangerous>=0.24 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.1->visualdl==2.0.0b1->-r requirements.txt (line 5)) (1.1.0)
Requirement already satisfied: Werkzeug>=0.15 in /opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages (from flask>=1.1.1->visualdl==2.0.0b1->-r requirements.txt (line
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值