简体中文 | English
目录
将人物和背景在像素级别进行区分,是一个图像分割的经典任务,具有广泛的应用。 一般而言,该任务可以分为两类:针对半身人像的分割,简称肖像分割;针对全身和半身人像的分割,简称通用人像分割。
对于肖像分割和通用人像分割,PaddleSeg发布了PP-HumanSeg系列模型,具有分割精度高、推理速度快、通用型强的优点。而且PP-HumanSeg系列模型可以开箱即用,零成本部署到产品中,也支持针对特定场景数据进行微调,实现更佳分割效果。
如下是演示视频(由于视频较大,加载会稍慢),此外大家可以在Paddle.js的网页体验人像扣图效果(链接)、视频背景替换及弹幕穿透效果(链接)。
针对手机视频通话、Web视频会议等实时半身人像的分割场景,PP-HumanSeg发布了自研的肖像分割模型。该系列模型可以开箱即用,零成本直接集成到产品中。
PP-HumanSegV1-Lite肖像分割模型,分割效果较好,模型体积非常小,模型结构见链接。
PP-HumanSegV2-Lite肖像分割模型,对比V1模型,推理速度提升45.5%、mIoU提升3.03%、可视化效果更佳,核心在于:
模型名 | 最佳输入尺寸 | 精度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) |
针对通用人像分割任务,我们首先构建的大规模人像数据集,然后使用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) |
安装PaddlePaddle,要求:
由于图像分割模型计算开销大,推荐在GPU版本的PaddlePaddle下使用PaddleSeg,详细安装教程请见PaddlePaddle官网。
执行如下命令,下载PaddleSeg,安装必要库。
git clone https://github.com/PaddlePaddle/PaddleSeg
cd PaddleSeg
pip install -r requirements.txt
以下所有命令均在PaddleSeg/contrib/PP-HumanSeg
目录下执行。
cd PaddleSeg/contrib/PP-HumanSeg
执行以下命令下载Inference Model,保存在当前inference_models
目录。
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
使用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 |
--vertical_screen
参数。1)输入图片进行测试
加载data/images/portrait_heng.jpg
横屏图像,使用PP-HumanSeg肖像分割模型进行预测,结果保存在data/images_result/
目录。
# 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
使用背景图片,得到替换背景的图片。
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
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
3)摄像头输入进行分割
开启电脑摄像头(横屏),进行实时肖像分割。
python src/seg_demo.py \
--config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml
开启电脑摄像头(横屏),添加背景图像,进行实时肖像分割。
python src/seg_demo.py \
--config inference_models/portrait_pp_humansegv2_lite_256x144_inference_model_with_softmax/deploy.yaml \
--bg_img_path data/images/bg_2.jpg
视频分割结果如下:
背景替换结果如下:
基于PP-HumanSeg V1版本的AI Studio在线运行教程。
基于PP-HumanSeg V2版本的AI Studio在线运行教程。
由于分割任务的场景变化很大,大家需要根据实际场景评估PP-HumanSeg系列模型的精度。 如果开源模型满足业务要求,可以直接应用到产品中。如果不满足业务要求,大家可以收集、标注数据,基于开源模型进行Finetune。
我们以PP-HumanSeg通用人像分割模型为例,介绍训练、评估、导出的方法。
参考前文"快速体验 - 准备环境",安装Paddle和PaddleSeg。
执行如下命令,下载mini_supervisely
数据集,具体参考前文"快速体验 - 准备模型和数据"。
python src/download_data.py
执行如下命令,下载预训练权重。
python src/download_pretrained_models.py
配置文件保存在./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 ../../tools/train.py \
--config configs/human_pp_humansegv2_lite.yml \
--save_dir output/human_pp_humansegv2_lite \
--save_interval 100 --do_eval --use_vdl
执行如下命令,加载模型和训练好的权重,进行模型评估,输出验证集上的评估精度。模型评估的详细文档,请参考链接。
python ../../tools/val.py \
--config configs/human_pp_humansegv2_lite.yml \
--model_path pretrained_models/human_pp_humansegv2_lite_192x192_pretrained/model.pdparams
执行如下命令,加载模型和训练好的权重,对单张图像进行预测,预测结果保存在./data/images_result
目录下的added_prediction
和pseudo_color_prediction
文件夹中。
python ../../tools/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
执行如下命令,加载模型和训练好的权重,导出预测模型。模型导出的详细文档,请参考链接。
python ../../tools/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 \
--without_argmax \
--with_softmax
注意,使用--without_argmax --with_softmax
参数,则模型导出的时候,模型最后面不会添加Argmax算子,而是添加Softmax算子。
所以,输出是浮点数类型,表示前景的概率,使得图像融合的边缘更为平滑。
导出PP-HumanSeg人像分割模型后,可以和其他分割模型类似,使用预测引擎进行部署,实现更快的推理速度。
服务器端Python部署,请参考教程。
服务器端C++部署,请参考教程。
移动端部署教程,请参见教程。
Web端部署教程,请参见教程。
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。