本次分享将带领大家从0到1完成一个语义分割任务,覆盖数据准备、模型训练评估和推理部署的全流程,项目将采用以PaddleSeg为核心的飞浆深度学习框架进行开发,并总结开发过程中踩过的一些坑,希望能为有类似项目需求的同学提供一点帮助。
背景:
- 语义分割是计算机视觉的一个基础任务。本次选用的案例来自现实生活场景,通过人像分割,实现背景替换。项目最后,将实现一个AI证件照的应用,并将应用部署到 AI Studio 平台,由于场景对实时性有更高要求,本次采用百度自研的 PP-LiteSeg 进行模型训练和部署。
目标:
- 基于paddlepaddle深度学习框架完成一个语义分割任务;
- 完成模型的训练、评估、预测和部署等深度学习任务全过程。
本次实验将采用AI Studio实训平台中的免费GPU资源,在平台注册账号后,点击创建项目-选择NoteBook任务,然后添加数据集,如下图所示,完成项目创建。启动环境可以自行选择CPU资源 or GPU资源,创建任务每天有8点免费算力,推荐大家使用GPU资源进行模型训练,这样会大幅减少模型训练时长。
PaddlePaddle百度提供的开源深度学习框架,其中文名是“飞桨”,致力于为开发者和企业提供最好的深度学习研发体验,国产框架中绝对的榜一大哥!其核心优势是生态完善,目前集成了各种开发套件,覆盖了数据处理、模型训练、模型验证、模型部署等各个阶段的工具。下面简要介绍一下本项目用到的几个核心组件:
- PaddleSeg:一个语义分割任务的工具集,集成了丰富的主流分割算法和百度自研的最新模型,提供覆盖分割任务全流程的API。
- PaddleServing:将模型部署成一个在线预测服务的库,支持服务端和客户端之间的高并发和高效通信。
- PaddleLite:将模型转换成可以端侧推理的库,比如将模型部署到手机端进行推理。
- Fastdeploy:一款全场景、易用灵活、极致高效的AI推理部署工具,支持云边端等各种部署方式。
1.1 安装PaddleSeg
在项目中打开终端,然后运行如下命令:
1.2 数据准备
数据集介绍
本次实验使用的数据集来自开源的人像语义分割数据集,数据集总共有 7082 张图片,手动划分为训练集、验证集和测试集,其中训练集 5666 张,验证集 1416 张。只包含两种标签类型:背景和人物。大家也可以选择其他开源的人像语义分割数据集。
我们需要制作符合PaddleSeg框架要求的数据集格式:参考准备自定义数据集。
step1: 解压数据集
step2: 制作标签文件
如上,我们便完成了数据的准备工作,接下来将完成模型在该数据集上的训练。
1.3 模型训练:
这里我们以选用PaddleSeg自带的pp_liteseg为例,有关该模型的介绍可参考官方文档。
- 准备训练配置文件-以pp_liteseg为例:
- 开启训练
- 如果选用 UNet 模型
训练成功后,可以在终端查看训练过程,loss下降说明没问题:
大概20分钟左右就完成了1000次迭代,结果如下:
1.4 模型评估和测试
默认训练生成的模型保存在文件夹下:
找一张图像预测看看:
会在 文件夹下看到生成结果:
找张自己的头像照片试下呢?
1.5 模型导出
目的:将训练得到的最好模型转成部署需要的模型。
- 方式一:导出为模型
导出成功后,会在output/liteseg/inference_model文件夹下生成如下文件:
- 方式二:导出为模型
模型训练完成并导出后,就可以将模型部署上线,为推理做好准备。通常情况下,导出模型有如下的部署场景,在 Paddle 框架下,对应需要使用的库如下:
Paddle 框架下,对应的库及其使用场景如下图所示:
下面将对我们训练得到的模型,通过不同方式进行部署。
2.1 Paddle Inference部署(Python)
直接调用PaddleSeg中的推理接口:
执行成功后会在 output 文件夹下生成同名的预测图片
2.2 PaddleServing服务端部署
这个部分的目的是将我们的模型部署成一个服务,客户端就可以通过http或rpc进行,飞浆已对上述需求所需要的功能实现进行了封装,需要调用PaddleServing库。
step 1: 安装PaddleServing包
注意:这里会出现版本依赖的问题,比如报错 ,通常意味着需要较低的 paddlepaddle 版本,需要降低版本到 2.4 。所以需要重新建立一个 python 环境来安装PaddleServing包。
step 2: 导出PaddleServing格式的模型
成功后会在当前文件夹生成和两个文件夹,分别保存模型的服务端和客户端配置。
step 3: 启动服务
注意,如果使用gpu,这里可能出现报错:。
- 原因分析:这是因为没有安装tensorrt。
- 怎么解决:可参考这篇博文:报错解决importError: libnvinfer.so.7
服务端启动成功后,会出现如下信息:
step4: 测试服务-客户端调用
- 原因分析:这是因为ssl版本的问题
- 怎么解决:可参考这篇博文:报错解决importError: libcrypto.so.10
还可能出现报错:
- 原因分析:中的 fetch_var 对应的 name: “save_infer_model/scale_0.tmp_0”
- 怎么解决: 第42和44行的"save_infer_model/scale_0.tmp_1"都要改为"save_infer_model/scale_0.tmp_0"
再重新测试,客户端调用成功后:会在当前目录下生成 , 也即预测结果。
2.3 PaddleLite移动端部署
这个部分的目的是将我们的模型部署到移动端(比如手机),这样就不用依赖云端服务器来进行推理了,飞浆已对上述需求所需要的功能实现进行了封装,主要体现在PaddleLite这个组件上。
端侧部署相对稍微复杂一些,主要可以分为以下几个步骤进行:
2.3.1 模型优化
考虑到端侧对推理耗时要求比较高,故需要采用paddlelite对inference模型做进一步优化,并转换成Paddle-Lite支持的文件格式,也即以.nb名称结尾的单个文件。
2.3.2 本地电脑和手机准备
第一步:windows 安装 Android Studio
- 谷歌的安卓平台下载 Android Studio 进行安装:官网
第二步:手机连接电脑(华为Mate30手机为例)
- 开启开发者模式:设置-关于手机-点击“版本号”多次直到提示“您已进入开发者模式”
- 打开USB调试:设置-系统与更新-开发人员选项-USB调试-选择USB配置(多媒体传输)
2.3.3 APP 快速体验
打开Android Studio,点击File -> New -> New Project,在弹出的路径选择窗口中进入"PaddleSeg/deploy/lite/humanseg_android_demo/"目录,然后点击右下角的"Open"按钮即可导入工程。
- 原因分析:项目各种依赖的问题
- 怎么解决:可参考这篇博文逐一尝试:Gradle问题解决
手机连接成功后,点击 app 右侧的 Run ,开始构建工程。build 过程中会自动下载demo需要的模型和Lite预测库。如果出现编译错误,需要更新 gradle 到最新版本,再重新 Run 就可以成功了。在手机端,可以看到新安装了一个 APP。手机上随便找一张图像测试一下,界面如下:
2.3.4 二次开发
为了让手机端能够加载我们训练得到的模型,首先将 2.3.1 节得到的 下载到电脑端,放在目录下,然后在重新 build ,目前尝试最终失败,欢迎尝试成功的读者评论区留言。
注:最终在采用 Fastdeploy 部署工具后成功,感兴趣的读者可以接着往下看。
2.4 Web 端/前端部署
这里主要介绍使用前端推理引擎 Paddle.js 对分割模型进行部署,使用一个新模型完成部署流程,需要如下步骤: 环境准备、模型转换、模型预测。
step1: 环境准备
什么是node.js : Node.js是一个 Javascript 运行时环境,而npm是Node.js的包管理工具,帮助开发者更方便地管理Node.js项目中的依赖项。
step2: 模型转换
上述代码会生成描述文件和12个分片参数文件,至此你已经有了Paddle.js推理所需的模型。
step3: demo 体验
注:这里官方 example 能跑通,但自己的模型依然无法成功部署,欢迎尝试成功的读者评论区留言。
2.5 FastDeploy 部署套件
一款全场景、易用灵活、极致高效的AI推理部署工具,支持云边端部署,详情可参考官方文档。
下面介绍几种常见的部署方式。
2.5.1 服务器端 Python 部署
2.5.2 手机端部署
在2.3 PaddleLite移动端部署我们已经跑通了手机端部署的流程,按照同样的方式,我们将官方示例的工程构建成功后,接下来只需要替换我们自己训练的模型即可,替换PaddleSeg模型的步骤如下:
- 将模型放在 app/src/main/assets/models 目录下,比如我的文件夹是 inference_model;
- 修改 app/src/main/res/values/strings.xml 中模型路径的默认值,如:models/inference_model
重新 Run 后,手机端部署成功,这个应用还可以调用手机后置摄像头,在右上角的设置中可以发现:替换的模型已经加载进来了,手机端测试如下图所示:
2.5.3 服务端部署
FastDeploy 的服务端部署分两种方式:
- simple_serving:适用于只需要通过http等调用AI推理任务,没有高并发需求的场景。基于Flask框架具有简单高效的特点,可以快速验证线上部署模型的可行性
- fastdeploy_serving:适用于高并发、高吞吐量请求的场景。基于Triton Inference Server框架,是一套可用于实际生产的完备且性能卓越的服务化部署框架
由于官方文档基于拉取的镜像进行构建,自行编译在ai studio云环境中无法进行,暂且搁置
2.5.4 web 端/前端部署
这一部分主要介绍了这个contrib,更多信息在介绍文档,可以训练后再通过 paddle.js 部署。
在第 2 部分我们介绍了各种模型部署方式,那么如何基于本篇训练得到的模型,快速搭建一个应用并上线展示呢?
这里推荐采用 AI Studio 的高代码应用开发,支持 Streamlit 和 Gradio 两种前端展现方式, 目前还可以免费利用百度免费的 CPU 资源。
3.1 快速搭建 跑通流程
我们可以先基于AI Studio 的高代码应用开发的官方文档,采用前后端分离的开发思路,先将应用快速搭建起来,跑通整个流程。
基本思路:
- 后端:Fastdeploy 的 simple_serving 方式,开启一个后端服务,供前端调用。
- 前端:采用 Gradio 搭建前端界面,并调用后端服务进行图片推理。
基本步骤:
- step1: 模型和数据准备
- step2: 开启后端服务
- step3: 实现前端界面
- step4: 界面测试
回到 CodeLab 界面,打开 demo.gradio.py ,右侧会自动渲染 Gradio 界面。
- step5: 应用上线
在项目 CodeLab 界面右上角点击“部署”,选择“Gradio应用”,注意我们的部署目录是 /demo,如下图,确认好之后,点击部署。如果部署失败,可以在 CodeLab 界面右下角查看日志。
部署成功后,可以在 CodeLab 界面右下角点击查看,或者也可以在自己的控制台-我的-应用中找到,如下图所示,进去后,用自带的图测试一下,搞定!
3.2 功能优化 界面美化
流程跑通后,接下来让我们把功能做的更完善一些,界面设计的更美观一些吧!
需求分析:
- 用户需要指定照片生成尺寸;
- 用户需要指定照片背景颜色
功能实现:
新建 来实现第二版的功能和前端界面。
界面优化:
参考其他项目的界面设计,发现 AI抠图|一键制作证件照 这个项目的界面设计和逻辑和我们的需求非常类似。
修改 main.gradio.py 中的前端接口:
最后再按照 3.1 节step5: 应用上线的流程部署上线就 OK 拉,测试结果如下图所示。
目前版本的模型分割效果还不是太好,感兴趣的小伙伴还可以尝试:
- 训练迭代更多的次数
- 更多针对证件照场景的数据集
- 其他性能更佳的模型
本文通过一个计算机视觉领域中最基础的任务之语义分割,带领大家熟悉百度PaddleSeg深度学习框架中的各种组件,覆盖了数据准备、模型训练评估、推理部署的全流程,最后通过应用开发实现了一个简单的前后端分离项目,感兴趣的小伙伴还可以选择其他部署方式。案例选自现实生活场景-人像分割和证件照制作,有现实应用需求。