1 简介

将人物和背景在像素级别进行区分,是一个图像分割的经典任务,具有广泛的应用。

一般而言,该任务可以分为两类:针对半身人像的分割,简称肖像分割;针对全身和半身人像的分割,简称通用人像分割。

对于肖像分割和通用人像分割,PaddleSeg发布了PP-HumanSeg系列模型,具有分割精度高、推理速度快、通用型强的优点。

而且PP-HumanSeg系列模型可以开箱即用,零成本部署到产品中,也支持针对特定场景数据进行微调,实现更佳分割效果。

PP-HumanSeg最新信息,请参考官方发布页面

如下是演示示例(由于文件较大,加载会稍慢),此外大家可以在Paddle.js的网页体验人像扣图效果(链接)、视频背景替换及弹幕穿透效果(链接)。

2 PP-HumanSeg

2.1 肖像分割模型

针对手机视频通话、Web视频会议等实时半身人像的分割场景,PP-HumanSeg发布了自研的肖像分割模型。该系列模型可以开箱即用,零成本直接集成到产品中。

PP-HumanSegV1-Lite肖像分割模型,分割效果较好,模型体积非常小,模型结构见链接。

PP-HumanSegV2-Lite肖像分割模型,对比V1模型,推理速度提升45.5%、mIoU提升3.03%、可视化效果更佳,核心在于:

  • 更高的分割精度:使用PaddleSeg推出的超轻量级分割模型(链接),具体选择MobileNetV3作为骨干网络,设计多尺度特征融合模块(Multi-Scale Feature Aggregation Module)。
  • 更快的推理速度:减小模型最佳输入尺寸,既减少了推理耗时,又增大模型感受野。
  • 更好的通用性:使用迁移学习的思想,首先在大型通用人像分割数据集上预训练,然后在小型肖像分割数据集上微调。

模型名

最佳输入尺寸

精度mIou(%)

手机端推理耗时(ms)

模型体积(MB)

配置文件

下载连接

PP-HumanSegV1-Lite

398x224

93.60

29.68

2.3

cfg

Checkpoint | Inference Model (Argmax) | Inference Model (Softmax)

PP-HumanSegV2-Lite

256x144

96.63

15.86

5.4

cfg

Checkpoint | Inference Model (Argmax) | Inference Model (Softmax)

表格说明:

  • 测试肖像模型的精度mIoU:针对PP-HumanSeg-14k数据集,使用模型最佳输入尺寸进行测试,没有应用多尺度和flip等操作。
  • 测试肖像模型的推理耗时:基于PaddleLite预测库,小米9手机(骁龙855 CPU)、单线程、大核,使用模型最佳输入尺寸进行测试。
  • 最佳输入尺寸的宽高比例是16:9,和手机、电脑的摄像头拍摄尺寸比例相同。
  • Checkpoint是模型权重,结合模型配置文件,可以用于Finetuning场景。
  • Inference Model为预测模型,可以直接用于部署。
  • Inference Model (Argmax) 指模型最后使用Argmax算子,输出单通道预测结果(int64类型),人像区域为1,背景区域为0。
  • Inference Model (Softmax) 指模型最后使用Softmax算子,输出单通道预测结果(float32类型),每个像素数值表示是人像的概率。

使用说明:

  • 肖像分割模型专用性较强,可以开箱即用,建议使用最佳输入尺寸。
  • 在手机端部署肖像分割模型,存在横屏和竖屏两种情况。大家可以根据实际情况对图像进行旋转,保持人像始终是竖直,然后将图像(尺寸比如是256x144或144x256)输入模型,得到最佳分割效果。

PP-HumanSegV2-Lite模型结构如下图所示。

人像动漫化Python 人像动漫化图像分割_算法

2.2 通用人像分割模型

针对通用人像分割任务,我们首先构建的大规模人像数据集,然后使用PaddleSeg的SOTA模型,最终发布了多个PP-HumanSeg通用人像分割模型。

PP-HumanSegV2-Lite通用人像分割模型,使用PaddleSeg推出的超轻量级分割模型,相比V1模型精度mIoU提升6.5%,手机端推理耗时增加3ms。

PP-HumanSegV2-Mobile通用分割模型,使用PaddleSeg自研的PP-LiteSeg模型,相比V1模型精度mIoU提升1.49%,服务器端推理耗时减少5.7%。

模型名

最佳输入尺寸

精度mIou(%)

手机端推理耗时(ms)

服务器端推理耗时(ms)

配置文件

下载链接

PP-HumanSegV1-Lite

192x192

86.02

12.3

-

cfg

Checkpoint | Inference Model (Argmax) | Inference Model (Softmax)

PP-HumanSegV2-Lite

192x192

92.52

15.3

-

cfg

Checkpoint | Inference Model (Argmax) | Inference Model (Softmax)

PP-HumanSegV1-Mobile

192x192

91.64

-

2.83

cfg

Checkpoint | Inference Model (Argmax) | Inference Model (Softmax)

PP-HumanSegV2-Mobile

192x192

93.13

-

2.67

cfg

Checkpoint | Inference Model (Argmax) | Inference Model (Softmax)

PP-HumanSegV1-Server

512x512

96.47

-

24.9

cfg

Checkpoint | Inference Model (Argmax) | Inference Model (Softmax)

表格说明:

  • 测试通用人像模型的精度mIoU:通用分割模型在大规模人像数据集上训练完后,在小规模Supervisely Person 数据集(下载链接)上进行测试。
  • 测试手机端推理耗时:基于PaddleLite预测库,小米9手机(骁龙855 CPU)、单线程、大核,使用模型最佳输入尺寸进行测试。
  • 测试服务器端推理耗时:基于PaddleInference预测裤,V100 GPU、开启TRT,使用模型最佳输入尺寸进行测试。
  • Checkpoint是模型权重,结合模型配置文件,可以用于Finetune场景。
  • Inference Model为预测模型,可以直接用于部署。
  • Inference Model (Argmax) 指模型最后使用Argmax算子,输出单通道预测结果(int64类型),人像区域为1,背景区域为0。
  • Inference Model (Softmax) 指模型最后使用Softmax算子,输出单通道预测结果(float32类型),每个像素数值表示是人像的概率。

使用说明:

  • 由于通用人像分割任务的场景变化很大,大家需要根据实际场景评估PP-HumanSeg通用人像分割模型的精度。
  • 如果满足业务要求,可以直接应用到产品中。
  • 如果不满足业务要求,大家可以收集、标注数据,基于开源通用人像分割模型进行Finetune。

3 快速体验

3.1 环境准备

安装PaddlePaddle,要求如下。由于图像分割模型计算开销大,推荐在GPU版本的PaddlePaddle下使用。

  • PaddlePaddle >= 2.2.0
  • Python >= 3.7+

在AIStudio中,大家选择可以直接选择安装好PaddlePaddle的环境。 如果需要执行安装PaddlePaddle,请参考PaddlePaddle官网。

本教程在PaddlePaddle 2.3.2版本下进行了验证。

执行如下命令,准备PaddleSeg。

#!git clone https://github.com/PaddlePaddle/PaddleSeg
#!cd PaddleSeg
#!git checkout -b release/2.6 origin/release/2.6
#!pip install -r requirements.txt

# 为快速体验,此处我们已下载PaddleSeg代码,解压到work目录下,然后可直接执行后续代码
%cd /home/aistudio
%rm -rf ./work/*

!unzip -q -d ./work PaddleSeg-release-2.6.zip
%cd ./work/PaddleSeg-release-2.6
!pip install -r requirements.txt

3.2 准备模型和数据

进入./work/PaddleSeg-release-2.6/contrib/PP-HumanSeg目录,后面所有命令在该目录下执行,数据和结果也保存在该目录下。

执行以下命令下载Inference Model,保存在inference_models目录。

%cd /home/aistudio/work/PaddleSeg-release-2.6/contrib/PP-HumanSeg
!python src/download_inference_models.py

执行以下命令下载测试数据,保存在data目录,下载数据包括:

  • portrait_heng.jpg和portrait_shu.jpg分别是手机摄像头在横屏和竖屏下,拍摄的肖像测试图片。
  • video_heng.mp4和video_shu.mp4分别是手机摄像头在横屏和竖屏下,拍摄的肖像测试视频。
  • mini_supervisely数据集从人像分割数据集 Supervise.ly Person 中随机抽取一小部分并转化成PaddleSeg可直接加载数据格式。
!python src/download_data.py

3.3 肖像分割示例

使用src/seg_demo.py脚本实现肖像分割、背景替换等功能的演示。

src/seg_demo.py脚本的输入数据可以是图片、视频或者摄像头,主要参数说明如下。

参数

说明

类型

是否必选项

默认值

config

预测模型中deploy.yaml文件的路径

str


-

img_path

待分割图片的路径

str


-

video_path

待分割视频的路径

str


-

bg_img_path

背景图片的路径,用于替换图片或视频的背景

str


-

bg_video_path

背景视频的路径,用于替换视频的背景

str


-

save_dir

保存输出图片或者视频的路径

str


./output

vertical_screen

表明输入图片和视频是竖屏

store_true


False

use_post_process

设置对输出logit进行后处理,滤除背景干扰

store_true


False

use_optic_flow

设置使用光流处理

store_true


False

参数说明:

  • 如果设置了img_path,则对图像进行分割;如果设置了video_path,则对视频进行分割。
  • 如果img_path和video_path都没有设置,则使用摄像头拍摄视频,进行分割。
  • 默认输入图像和视频是横屏模式,即是宽大于高,如果输入图像和视频是竖屏模式,需要设置--vertical_screen参数。
  • 使用光流处理可以缓解视频分割的抖动,要求opencv-python版本大于4.0。

1)输入图片进行测试

使用背景图片,得到替换背景的图片,结果保存在data/images_result/目录。大家可以进入该目录下,右键单击图片,选择打开进行查看(如下)。

!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --img_path data/images/portrait_heng.jpg \
  --bg_img_path data/images/bg_2.jpg \
  --save_dir data/images_result/portrait_heng_v2_withbg.jpg

!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --img_path data/images/portrait_shu.jpg \
  --bg_img_path data/images/bg_1.jpg \
  --save_dir data/images_result/portrait_shu_v2_withbg.jpg \
  --vertical_screen

加载data/images/portrait_heng.jpg横屏图像,使用PP-HumanSeg肖像分割模型进行预测。

# Use PP-HumanSegV2-Lite
!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --img_path data/images/portrait_heng.jpg \
  --save_dir data/images_result/portrait_heng_v2.jpg

# Use PP-HumanSegV1-Lite
!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv1_lite_398x224_inference_model_with_softmax/deploy.yaml \
  --img_path data/images/portrait_heng.jpg \
  --save_dir data/images_result/portrait_heng_v1.jpg

加载data/images/portrait_shu.jpg竖屏图像,使用PP-HumanSeg肖像分割模型进行预测。

!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --img_path data/images/portrait_shu.jpg \
  --save_dir data/images_result/portrait_shu_v2.jpg \
  --vertical_screen

2)输入视频进行分割

加载data/videos/video_heng.mp4横屏视频,使用PP-HumanSeg肖像分割模型进行预测,结果保存在data/videos_result/目录。

# Use PP-HumanSegV2-Lite
!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --video_path data/videos/video_heng.mp4 \
  --save_dir data/videos_result/video_heng_v2.avi

!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --video_path data/videos/video_heng.mp4 \
  --use_post_process \
  --save_dir data/videos_result/video_heng_v2_use_post_process.avi

# Use PP-HumanSegV1-Lite
!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv1_lite_398x224_inference_model_with_softmax/deploy.yaml \
  --video_path data/videos/video_heng.mp4 \
  --save_dir data/videos_result/video_heng_v1.avi

加载data/videos/video_shu.mp4竖屏视频,使用PP-HumanSeg肖像分割模型进行预测。

!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --video_path data/videos/video_shu.mp4 \
  --save_dir data/videos_result/video_shu_v2.avi \
  --vertical_screen

使用背景图片,得到替换背景的视频。

!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --video_path data/videos/video_heng.mp4 \
  --bg_img_path data/images/bg_2.jpg \
  --use_post_process \
  --save_dir data/videos_result/video_heng_v2_withbg_usepostprocess.avi

此外可以使用 DIS(Dense Inverse Search-basedmethod)光流后处理算法 (要求opencv-python版本大于4.0),减少视频预测前后帧闪烁的问题。

!python src/seg_demo.py \
  --config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
  --video_path data/videos/video_shu.mp4 \
  --save_dir data/videos_result/video_shu_v2_use_optic_flow.avi \
  --vertical_screen \
  --use_optic_flow

4 训练微调

由于分割任务的场景变化很大,大家需要根据实际场景评估PP-HumanSeg系列模型的精度。 如果开源模型满足业务要求,可以直接应用到产品中。

如果不满足业务要求,大家可以收集、标注数据,基于开源模型进行Finetune。

我们以PP-HumanSeg通用人像分割模型为例,介绍训练、评估、导出的方法。

4.1 准备

参考前文"快速体验 - 准备环境",安装Paddle和PaddleSeg。

执行如下命令,下载mini_supervisely数据集,具体参考前文"快速体验 - 准备模型和数据"。

执行如下命令,下载预训练权重。

%cd /home/aistudio/work/PaddleSeg-release-2.6/contrib/PP-HumanSeg
!python src/download_data.py
!python src/download_pretrained_models.py

4.2 训练

配置文件保存在./configs目录下,如下。配置文件中,已经通过pretrained设置好预训练权重的路径。

configs
├── human_pp_humansegv1_lite.yml
├── human_pp_humansegv2_lite.yml
├── human_pp_humansegv1_mobile.yml
├── human_pp_humansegv2_mobile.yml
├── human_pp_humansegv1_server.yml

执行如下命令,进行模型微调。模型训练的详细文档,请参考链接。

!export CUDA_VISIBLE_DEVICES=0 # Linux下设置1张可用的卡
# set CUDA_VISIBLE_DEVICES=0  # Windows下设置1张可用的卡
!python ../../train.py \
  --config configs/human_pp_humansegv2_lite.yml \
  --save_dir output/human_pp_humansegv2_lite \
  --save_interval 100 --do_eval --use_vdl

4.3 评估

执行如下命令,加载模型和训练好的权重(此处使用预训练权重),进行模型评估,输出验证集上的评估精度。模型评估的详细文档,请参考链接。

!python ../../val.py \
  --config configs/human_pp_humansegv2_lite.yml \
  --model_path pretrained_models/human_pp_humansegv2_lite_192x192_pretrained/model.pdparams

4.4 预测

执行如下命令,加载模型和训练好的权重,对单张图像进行预测,预测结果保存在./data/images_result目录下的added_prediction和pseudo_color_prediction文件夹中。

!python ../../predict.py \
  --config configs/human_pp_humansegv2_lite.yml \
  --model_path pretrained_models/human_pp_humansegv2_lite_192x192_pretrained/model.pdparams \
  --image_path data/images/human.jpg \
  --save_dir ./data/images_result

4.5 导出

执行如下命令,加载模型和训练好的权重,导出预测模型。模型导出的详细文档,请参考链接。

注意,使用--without_argmax --with_softmax参数,则模型导出的时候,模型最后面不会添加Argmax算子,而是添加Softmax算子。 所以,输出是浮点数类型,表示前景的概率,使得图像融合的边缘更为平滑。

结果文件如下。

output
  ├── deploy.yaml            # 部署相关的配置文件
  ├── model.pdiparams        # 静态图模型参数
  ├── model.pdiparams.info   # 参数额外信息,一般无需关注
  └── model.pdmodel          # 静态图模型文件
!python ../../export.py \
  --config configs/human_pp_humansegv2_lite.yml \
  --model_path pretrained_models/human_pp_humansegv2_lite_192x192_pretrained/model.pdparams \
  --save_dir output/human_pp_humansegv2_lite/infer_model \
  --without_argmax \
  --with_softmax

5 部署

导出PP-HumanSeg人像分割模型后,可以和其他分割模型类似,使用预测引擎进行部署。