【飞桨AI实战】人像分割:手把手带你入门PaddleSeg,从模型训练、推理部署到应用开发
前言
本次分享将带领大家从0到1完成一个语义分割任务,覆盖数据准备、模型训练评估和推理部署的全流程,项目将采用以PaddleSeg为核心的飞浆深度学习框架进行开发,并总结开发过程中踩过的一些坑,希望能为有类似项目需求的同学提供一点帮助。
项目背景和目标
背景:
- 语义分割是计算机视觉的一个基础任务。本次选用的案例来自现实生活场景,通过人像分割,实现背景替换。项目最后,将实现一个AI证件照的应用,并将应用部署到 AI Studio 平台,由于场景对实时性有更高要求,本次采用百度自研的 PP-LiteSeg 进行模型训练和部署。
目标:
- 基于paddlepaddle深度学习框架完成一个语义分割任务;
- 完成模型的训练、评估、预测和部署等深度学习任务全过程。
百度AI Studio平台
本次实验将采用AI Studio实训平台中的免费GPU资源,在平台注册账号后,点击创建项目-选择NoteBook任务,然后添加数据集,如下图所示,完成项目创建。启动环境可以自行选择CPU资源 or GPU资源,创建任务每天有8点免费算力,推荐大家使用GPU资源进行模型训练,这样会大幅减少模型训练时长。
飞浆深度学习开发框架介绍
PaddlePaddle百度提供的开源深度学习框架,其中文名是“飞桨”,致力于为开发者和企业提供最好的深度学习研发体验,国产框架中绝对的榜一大哥!其核心优势是生态完善,目前集成了各种开发套件,覆盖了数据处理、模型训练、模型验证、模型部署等各个阶段的工具。下面简要介绍一下本项目用到的几个核心组件:
- PaddleSeg:一个语义分割任务的工具集,集成了丰富的主流分割算法和百度自研的最新模型,提供覆盖分割任务全流程的API。
- PaddleServing:将模型部署成一个在线预测服务的库,支持服务端和客户端之间的高并发和高效通信。
- PaddleLite:将模型转换成可以端侧推理的库,比如将模型部署到手机端进行推理。
- Fastdeploy:一款全场景、易用灵活、极致高效的AI推理部署工具,支持云边端等各种部署方式。
从零开始实战
1 PaddleSeg完成模型训练
1.1 安装PaddleSeg
在项目中打开终端,然后运行如下命令:
# (可选)conda安装虚拟环境,环境会持久保存在项目中 conda create -p envs/py38 python=3.8 source activate envs/py38 # 安装paddlepaddle,根据云端环境选择cpu版本和gpu版本 pip install --upgrade paddlepaddle -i https://mirror.baidu.com/pypi/simple pip install --upgrade paddlepaddle-gpu -i https://mirror.baidu.com/pypi/simple # 下载PaddleSeg代码 注意要安装2.9版本,gitee上是2.8 # 如果国内下载太慢,加上镜像https://mirror.ghproxy.com/ git clone https://github.com/PaddlePaddle/PaddleSeg.git # 安装 cd PaddleSeg pip install -r requirements.txt pip install -v -e . # 测试是否安装成功 sh tests/install/check_predict.sh
1.2 数据准备
数据集介绍
本次实验使用的数据集来自开源的人像语义分割数据集,数据集总共有 7082 张图片,手动划分为训练集、验证集和测试集,其中训练集 5666 张,验证集 1416 张。只包含两种标签类型:背景和人物。大家也可以选择其他开源的人像语义分割数据集。
我们需要制作符合PaddleSeg框架要求的数据集格式:参考准备自定义数据集。
step1: 解压数据集
# 打开终端 cd ~/data/ # -d 指定解压缩的路径,会在data0文件夹下生成koto数据集,持久保存在云端环境种 unzip data59640/koto.zip -d ../data0
step2: 制作标签文件
python generate_dataset.py # 其中generate_dataset.py中的代码如下: ''' import os import cv2 import numpy as np from tqdm import tqdm # modify the data txt file dataset_dir = '/home/aistudio/data0/koto' for txt in ['train_list.txt', 'valid_list.txt']: output = [] with open(dataset_dir + '/' + txt, 'r') as f: lines = f.readlines() for line in lines: image, label = line.strip().split(' ') image = image.replace('/mnt/d/data/koto/', '') label = label.replace('/mnt/d/data/koto/', '') output.append(image + ' ' + label) with open(dataset_dir + '/new_' + txt, 'w') as f: f.writelines(f'{line}'+'\n' for line in output) # 将Label图像转换为标签,0:背景,1:人像 anno_dir = '/home/aistudio/data0/koto/annos' annos = os.listdir(anno_dir) for anno in tqdm(annos): anno_file = os.path.join(anno_dir, anno) label = cv2.imread(anno_file, 0) new_label = np.zeros(label.shape, dtype=np.uint8) if label[0, 0] 128] = 1 else: new_label[label
文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。