飞桨PaddleSeg新升级!带来187K超轻量级人像分割模型,视频级光流后处理方案

图像分割技术,现如今已经有非常广泛的应用,比如视频监控场景的车辆人体分析、无人驾驶场景的车道线分割等;还有一些专业领域的应用,比如医疗影像分析场景的肿瘤分割、遥感影像分析场景的地块分割、工业商业质检场景中的受损部位分析应用。

另外在现在非常火的短视频领域,对图像分割,尤其是人像分割技术,有着非常广泛的需求,比如可用于背景风格替换、影视特效等。将人像分割出来后和背景叠加产生新的效果,比如这个弹幕人像分离的应用。

在将人像分割技术应用到实际业务场景时,经常会面临一些挑战,很难达到理想的效果和商用级别的要求,比如下面这些问题:

  1. 由于拍摄情况复杂多样,图像数据组成往往很复杂,比如存在多尺度、图像叠加、多姿态等情况,这对训练模型前的数据处理环节带来很大的挑战。

  2. 人像分割技术在很多场景有实时分析需求,比如手机APP上的实时特效需求,这对模型大小和推理速度有更高的要求。

  3. 视频级人像分割场景下,还会遇到帧间过度不够稳定,边缘部分闪烁的问题,影响最终的分割效果。

针对上面这些应用问题,飞桨图像分割套件PaddleSeg再度重磅出击,随最新发布的飞桨开源框架1.8版本,推出了更强大的功能以支持人像分割技术的产业应用,让开发者更顺畅地完成人像分割任务,包括三大亮点特性:

  1. 全面提升对人像分割场景的全流程支持。针对人像分割场景提供了从数据增强处理、模型训练、在线离线量化、视频分割推理部署、替换背景等全流程配套工具。

  2. 最新发布HumanSeglite模型超轻量级人像分割模型,可支持移动端场景的实时分割,最小只有187K

  3. 发布基于光流算法的视频级别的分割后处理方案,针对移动端小模型分割效果不理想的问题,有显著效果。


全面提升对人像分割场景

的全流程支持

新版PaddleSeg提供针对人像分割场景从数据增强处理、模型训练、在线离线量化、视频分割推理部署、替换背景等全流程应用指南。

提供丰富的图像增强策略

针对目标图像多样性问题,提供了10+种数据增强策略,可结合实际业务场景进行定制组合,提升模型泛化能力和鲁棒性。

提供简洁的模型训练、量化和预测API

(1)通过train.py实现模型训练:

python train.py --model_type HumanSegMobile \
--save_dir output/ \
--data_dir data/mini_supervisely \
--train_list data/mini_supervisely/train.txt \
--val_list data/mini_supervisely/val.txt \
--pretrained_weights pretrained_weights/humanseg_mobile_ckpt \
--batch_size 8 \
--learning_rate 0.001 \
--num_epochs 10 \
--image_shape 192 192

其中参数含义如下:

  • --model_type: 模型类型,可选项为:HumanSegServer、HumanSegMobile和HumanSegLite

  • --save_dir: 模型保存路径

  • --data_dir: 数据集路径

  • --train_list: 训练集列表路径

  • --val_list: 验证集列表路径

  • --pretrained_weights: 预训练模型路径

  • --batch_size: 批大小

  • --learning_rate: 初始学习率

  • --num_epochs: 训练轮数

  • --image_shape: 网络输入图像大小(w, h)

(2)通过quant_offline.py实现离线量化(quant_online.py可实现在线量化):

python quant_offline.py --model_dir output/best_model \
--data_dir data/mini_supervisely \
--quant_list data/mini_supervisely/val.txt \
--save_dir output/quant_offline \
--image_shape 192 192

其中参数含义如下:

  • --model_dir: 待量化模型路径

  • --data_dir: 数据集路径

  • --quant_list: 量化数据集列表路径,一般直接选择训练集或验证集

  • --save_dir: 量化模型保存路径

  • --image_shape: 网络输入图像大小(w, h)

(3)通过export.py实现模型导出:

python export.py --model_dir output/best_model \
--save_dir output/export

其中参数含义如下:

  • --model_dir: 模型路径

  • --save_dir: 导出模型保存路径

(4)通过infer.py实现模型预测

python infer.py --model_dir output/best_model \
--data_dir data/mini_supervisely \
--test_list data/mini_supervisely/test.txt \
--image_shape 192 192

其中参数含义如下:

  • --model_dir: 模型路径

  • --data_dir: 数据集路径

  • --test_list: 测试集列表路径

  • --image_shape: 网络输入图像大小(w, h)


人像分割和背景替换快速体验

PaddleSeg可实现对图像、视频的人像分割和背景替换。这里以视频为例,代码已经内置在video_infer.py(视频分割),bg_replace.py(背景替换)中,简单两行命令即可快速体验人像分割和背景替换效果。

# 对人像视频进行分割处理
python video_infer.py --model_dir pretrained_weights/humanseg_lite_inference --video_path data/video_test.mp4

# 对人像视频进行背景替换处理, 可通过'--background_video_path'传入背景视频
python bg_replace.py --model_dir pretrained_weights/humanseg_lite_inference --video_path data/video_test.mp4 --background_image_path data/background.jpg

效果如下:

          视频                 背景        背景替换效果    

PaddleSeg新版本同步发布了人像分割教程,方便在线体验。

https://aistudio.baidu.com/aistudio/projectdetail/475345

超轻量级人像分割模型Human

-Seglite,最小只有187k!

PaddleSeg开源了在大规模人像数据上训练过的5个预训练模型,满足多种使用场景的需求,这些模型简单经过Fine-tune即可训练出自己的人像分割模型。

计算耗时运行环境:cpu:骁龙855, 内存:6GB, 图片大小:192*192。

从上表可以看到,PaddleSeg不仅推出了服务端应用的预训练模型,还提供了专门针对移动端实时分割场景的模型,例如手机自拍人像的实时处理。

该场景下由于移动设备算力、内存受限,所以需要更轻量级的模型,而且通常要求处理效率是30FPS,对应的预测时间需要在33ms以下。

本次PaddleSeg提供的HumanSegLite模型,采用更轻量的网络结构- 优化后的ShuffleNetV2,并采用飞桨模型压缩工具PaddleSlim的量化技术进一步压缩模型的体积,达到速度和精度的平衡,最终生成的预训练模型大小仅187K!预测时间11.8ms,为开发者实现移动端实时分割任务提供有利武器。

执行以下脚本即可下载HumanSeg预训练模型:

python pretrained_weights/download_pretrained_weights.py

视频光流后处理方案,视频

级别实时分割处理的利器!


针对移动端视频的图像分割效果往往不太理想的问题,可利用时序信息结合光流法,对分割结果进行优化,即视频光流后处理方案。

什么是光流后处理?

下面先简单看一下光流(optical flow)的概念:运动物体在观察成像平面上的像素运动的瞬时速度。包括稀疏光流和稠密光流。

稀疏光流: 计算部分像素的光流,速度快,效果差。

稠密光流:计算每个像素的光流,速度慢,效果好。

(图片来源:https://zhuanlan.zhihu.com/p/74460341)

如何平衡光流效果与速度?

可采用DIS光流算法(Dense Inverse Search-basedmethod),属于快速稠密光流,是一种在光流质量和计算时间中取得平衡的算法。优点是运算速度快的稠密光流,可达到实时要求。

DIS光流算法示意图(速度越慢,效果越精细)

如何用光流算法改善视频分割结果?

将分割的结果和DIS光流算法的预测结果融合,即可得到改善后的结果。

  • 具体方案:

  1. 根据时序图像,计算相邻两帧的DIS光流(对应像素的位置关系)

  2. 根据DIS光流找到前一帧融合结果Flast的运动预测结果P

  3. 根据光流大小判断融合权重W

  4. 融合结果  F = S*W + P*(1-W),其中S为当前帧分割结果,P为上一帧的运动预测结果


对比光流后处理的视频分割效果

光流后处理的代码已内置在video_infer.py中,可快速体验效果。

# 人像视频分割,自带光流后处理效果
python video_infer.py --model_dir pretrained_weights/humanseg_lite_inference --video_path data/video_test.mp4

左(原图)、中(无光流后处理的分割效果)、右(含光流后处理的分割效果)

对比上图可以看出,进行光流后处理后,消除了人像边缘闪烁的问题,在人物头顶处尤为明显,另外减轻了人像边缘的锯齿效应,使得边缘更平滑。

PaddleSeg更多升级动态

除了人像分割场景的升级支持以外,PaddleSeg本次还带来一项利器,针对图像分割任务中,经常出现类别分布不均匀的情况,例如:工业产品的瑕疵检测、道路提取及病变区域提取等,提供了损失函数Lovasz Loss的支持,解决类别不均衡问题。

lovasz loss损失函数简介

Lovasz loss基于子模损失(submodular losses)的凸Lovasz扩展,对神经网络的mean IoU损失进行优化。Lovasz loss根据分割目标的类别数量可分为两种:lovasz hinge loss和lovasz softmax loss. 其中lovasz hinge loss适用于二分类问题。在仅有两个像素预测的情形下,lovasz hinge loss的函数曲面图如下所示:

lovasz softmax loss适用于多分类问题。同样在仅有两个像素预测的情形下,lovasz softmax loss的函数曲面图如下所示:

该内容发表在CVPR 2018上,可参考如下文献了解具体原理。

http://openaccess.thecvf.com/content_cvpr_2018/html/Berman_The_LovaSz-Softmax_Loss_CVPR_2018_paper.html

一堆数学概念没看懂?没关系,不妨碍我们使用lovasz loss来解决类别不平衡问题,提升分割效果。

lovasz loss损失函数使用指南

接下来介绍如何在PaddleSeg中使用lovasz loss进行训练。需要注意的是,通常的直接训练方式并一定管用,我们推荐另外2种训练方式:

(1)与softmax loss或bce loss(binary cross-entropy loss)加权结合使用。

(2)先使用softmax loss或bec loss进行训练,再使用lovasz softmax loss或lovasz hinge loss进行finetuning.

配置lovasz loss仅需要设定2个参数:

首先通过cfg.SOLVER.LOSS参数选择训练时的损失函数, 例如cfg.SOLVER.LOSS=['lovasz_hinge_loss','bce_loss']将指定训练loss为lovasz hinge loss与bce loss的组合。cfg.SOLVER.LOSS=['lovasz_softmax_loss','softmax_loss']将指定训练loss为lovasz softmax loss与softmax loss的组合。

其次,也可以通过cfg.SOLVER.LOSS_WEIGHT参数对不同loss进行权重配比,从而灵活地进行训练调参(方便小伙伴们进行“炼丹”)。Lovasz hinge loss配置位于PaddleSeg/configs/lovasz_hinge_deeplabv3p_mobilenet_road.yaml,如下所示:

SOLVER:
LOSS: ["lovasz_hinge_loss","bce_loss"]
LOSS_WEIGHT:
LOVASZ_HINGE_LOSS: 0.5
BCE_LOSS: 0.5

Lovasz softmax loss配置位于PaddleSeg/configs/lovasz_softmax_deeplabv3p_mobilenet_pascal.yaml,如下所示:

SOLVER:
LOSS: ["lovasz_softmax_loss","softmax_loss"]
LOSS_WEIGHT:
LOVASZ_SOFTMAX_LOSS: 0.2
SOFTMAX_LOSS: 0.8

实际效果

来看看lovasz loss的实际效果。在道路提取任务中,道路在图片中所占比例往往很小,是典型的类别不均衡场景。

我们使用lovasz loss和softmax loss分别进行训练,分割效果如下:

可以看出,softmax loss训练的结果中道路并不连续,主干道部分缺失尤为严重。而lovasz loss训练的结果提升显著,主干道并无缺失,连小路也基本连续。

Lovasz loss具体使用教程请参见:

https://github.com/PaddlePaddle/PaddleSeg/blob/develop/docs/lovasz_loss.md

如在使用过程中有问题,可加入飞桨官方QQ群进行交流:703252161

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

更多PaddleSeg的应用方法,欢迎访问项目地址:

GitHub: 

https://github.com/PaddlePaddle/PaddleSeg

Gitee: 

https://gitee.com/paddlepaddle/PaddleSeg

官网地址:

https://www.paddlepaddle.org.cn

飞桨开源框架项目地址:

GitHub:

https://github.com/PaddlePaddle/Paddle

Gitee: 

https://gitee.com/paddlepaddle/Paddle

END

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章