Bootstrap

『paddle』paddleseg 学习笔记:人像分割 HumanSeg


本教程基于 PaddleSeg 提供高精度人像分割模型,从训练到部署的全流程应用指南,以及视频流人像分割、背景替换的实际效果体验。最新发布超轻量级人像分割模型,支持Web端、移动端场景的实时分割。代码链接

一、人像分割模型

HumanSeg 开放了在大规模人像数据上训练的三个人像模型,满足服务端、移动端、Web端多种使用场景的需求。

模型类型适用场景CheckpointInference Model
高精度模型适用于服务端GPU且背景复杂的人像场景, 模型结构为Deeplabv3+/ResNet50, 输入大小(512, 512)humanseg_server_ckpthumanseg_server_inference
轻量级模型适用于移动端或服务端CPU的前置摄像头场景,模型结构为HRNet_w18_samll_v1,输入大小(192, 192)humanseg_mobile_ckpthumanseg_mobile_inference
超轻量级模型适用于Web端或移动端实时分割场景,例如手机自拍、Web视频会议,模型结构为优化的ShuffleNetV2,输入大小(192, 192)humanseg_lite_ckpthumanseg_lite_inference

NOTE:

  • 其中 Checkpoint 为模型权重,用于 Fine-tuning 场景。

  • Inference Model 为预测部署模型,包含 model.pdmodel 计算图结构、model.pdiparams 模型参数和 deploy.yaml 基础的模型配置信息。

  • 其中 Inference Model 适用于服务端的 CPU 和 GPU 预测部署,适用于通过 Paddle Lite 进行移动端等端侧设备部署。更多 Paddle Lite 部署说明查看 Paddle Lite文档

1.1 计算复杂度和参数量

模型类型NetworkInput SizeFLOPSParameters
超轻量级模型ShuffleNetV2192x192121272192 (121M)137012 (137K)
轻量级模型HRNet w18 small v1192x192584182656 (584M)1543954 (1.54M)
高精度模型Deeplabv3+/ResNet50512x512114148802560 (114G)26789874 (26.8M)

二、安装

2.1 安装PaddlePaddle

版本要求

  • PaddlePaddle >= 2.0.2

  • Python >= 3.7+

由于图像分割模型计算开销大,推荐在 GPU 版本的 PaddlePaddle 下使用 PaddleSeg。推荐安装 10.0 以上的 CUDA 环境。安装教程请见 PaddlePaddle官网

2.2 安装 PaddleSeg 包

pip install paddleseg

2.3 下载 PaddleSeg 仓库

git clone https://github.com/PaddlePaddle/PaddleSeg

三、快速体验

以下所有命令均在 PaddleSeg/contrib/HumanSeg 目录下执行。

cd PaddleSeg/contrib/HumanSeg

3.1 下载 Inference Model

执行以下脚本快速下载所有 Inference Model

python export_model/download_export_model.py

3.2 下载测试数据

我们提供了 supervise.ly 发布人像分割数据集 Supervisely Persons, 从中随机抽取一小部分并转化成 PaddleSeg 可直接加载数据格式,同时提供了手机前置摄像头的人像测试视频 video_test.mp4。通过运行以下代码进行快速下载:

python data/download_data.py

3.3 视频流人像分割

结合 DIS(Dense Inverse Search-basedmethod)光流算法预测结果与分割结果,改善视频流人像分割。

# 通过电脑摄像头进行实时分割处理
python video_infer.py \
	--cfg export_model/shufflenetv2_humanseg_192x192_with_softmax/deploy.yaml

# 对人像视频进行分割处理
python video_infer.py \
	--cfg export_model/deeplabv3p_resnet50_os8_humanseg_512x512_100k_with_softmax/deploy.yaml \
	--video_path data/video_test.mp4

3.4 视频流背景替换

根据所选背景进行背景替换,背景可以是一张图片,也可以是一段视频。

# 通过电脑摄像头进行实时背景替换处理, 也可通过'--background_video_path'传入背景视频
python bg_replace.py \
	--cfg export_model/shufflenetv2_humanseg_192x192_with_softmax/deploy.yaml \
	--background_image_path data/background.jpg

# 对人像视频进行背景替换处理, 也可通过'--background_video_path'传入背景视频
python bg_replace.py \
	--cfg export_model/deeplabv3p_resnet50_os8_humanseg_512x512_100k_with_softmax/deploy.yaml \
	--background_image_path data/background.jpg \
	--video_path data/video_test.mp4

# 对单张图像进行背景替换
python bg_replace.py \
	--cfg export_model/deeplabv3p_resnet50_os8_humanseg_512x512_100k_with_softmax/deploy.yaml \
	--background_image_path data/background.jpg \
	--image_path data/human_image.jpg

NOTE:

视频分割处理时间需要几分钟,请耐心等待。

提供的模型适用于手机摄像头竖屏拍摄场景,宽屏效果会略差一些。

四、训练评估预测

4.1 下载预训练模型

执行以下脚本快速下载所有 Checkpoint 作为预训练模型

python pretrained_model/download_pretrained_model.py

4.2 训练

基于上述大规模数据预训练的模型,在抽取的部分 supervise.ly 数据集上进行 Fine-tuning,以 HRNet w18 small v1 为例,训练命令如下:

export CUDA_VISIBLE_DEVICES=0 	# 设置1张可用的卡
# set CUDA_VISIBLE_DEVICES=0	# windows下请执行此命令
python train.py \
	--config configs/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely.yml \
	--save_dir saved_model/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely \
	--save_interval 100 --do_eval --use_vdl

更多命令行帮助可运行下述命令进行查看:

python train.py --help

4.3 评估

使用下述命令进行评估

python val.py \
	--config configs/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely.yml \
	--model_path saved_model/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely/best_model/model.pdparams

4.4 预测

使用下述命令进行预测, 预测结果默认保存在 ./output/result/ 文件夹中。

python predict.py \
	--config configs/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely.yml \
	--model_path saved_model/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely/best_model/model.pdparams \
	--image_path data/human_image.jpg

五、模型导出

5.1 将模型导出为静态图模型

请确保位于 PaddleSeg 目录下,执行以下脚本:

export CUDA_VISIBLE_DEVICES=0 	# 设置1张可用的卡
# set CUDA_VISIBLE_DEVICES=0	# windows下请执行此命令
python ../../export.py \
	--config configs/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely.yml \
	--model_path saved_model/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely/best_model/model.pdparams \
	--save_dir export_model/fcn_hrnetw18_small_v1_humanseg_192x192_mini_supervisely_with_softmax \
	--without_argmax --with_softmax

5.2 导出脚本参数解释

参数名用途是否必选项默认值
config配置文件-
save_dir模型和 visualdl 日志文件的保存根路径output
model_path预训练模型参数的路径配置文件中指定值
with_softmax在网络末端添加softmax算子。由于PaddleSeg组网默认返回logits,如果想要部署模型获取概率值,可以置为TrueFalse
without_argmax是否不在网络末端添加argmax算子。由于PaddleSeg组网默认返回logits,为部署模型可以直接获取预测结果,我们默认在网络末端添加argmax算子False

5.3 结果文件

output
  ├── deploy.yaml            # 部署相关的配置文件
  ├── model.pdiparams        # 静态图模型参数
  ├── model.pdiparams.info   # 参数额外信息,一般无需关注
  └── model.pdmodel          # 静态图模型文件

六、Web端部署

image

七、移动端部署

悦读

道可道,非常道;名可名,非常名。 无名,天地之始,有名,万物之母。 故常无欲,以观其妙,常有欲,以观其徼。 此两者,同出而异名,同谓之玄,玄之又玄,众妙之门。

;