论文题目:Automatic Portrait Segmentation for Image Stylization
论文链接:论文链接
代码链接:代码链接

目录

  • 一、人像分割基础知识
  • 1. 什么是人像分割?
  • 2. 人像分割与语义分割的联系和区别?
  • 3. 人像分割的应用场景有哪些?
  • 二、PortraitFCN人像分割算法框图详解
  • 三、PortraitFCN人像分割算法细节详解
  • 1. 归一化的X和Y通道是如何获得的?(位置通道)
  • 2. 形状通道是如何获得的?
  • 3. 整个算法的亮点?
  • 四、PortraitFCN人像分割算法效果展示
  • 五、算法总结
  • 参考文献
  • 注意事项

一、人像分割基础知识

1. 什么是人像分割?

简单来讲,所谓的人像分割就是将输入的包含人像的图片中属于人像的像素点分割出来,输入的是一张包含人像的彩色图片;输出是一张二值图片,属于人像的像素点用白色表示,不属于人像的像素点用黑色表示。具体的效果如图1所示:图1中的左图表示的是输入的包含人像的待分割图片,图1中的右图表示的是人像分割算法处理后的效果(二值图)。

2. 人像分割与语义分割的联系和区别?

联系:人像分割和语义分割都属于图像分割这个大领域, 人像分割属于语义分割的一个小分支;人像分割一般都是在语义分割的结果上进行精细分割获得的。
区别:人像分割是在语义分割的基础上面就人像的一些细节信息分割出来,具体包括头发丝等等,如图1所示,人像分割的结果可以明显的观察到人像的头发丝,而普通的语义分割算法是做不到这一点的;

3. 人像分割的应用场景有哪些?


图2展示了人像分割算法的一些应用场景。图2a表示的是原始的输入图片;图2b表示的是人像分割算法处理后的结果;图2c表示的是根据人像分割的结果2b从原始图像中获得人像图片后对其进行灰度化处理后的效果;图2d表示的是对原始图像中除人像之外的区域进行模糊后并叠加人像分割图像的结果,即所谓的背景模糊;图2e表示的是对原始图像中的人像更换背景的效果,人像分割在现实场景中具有很多应用,具体包括:背景虚化、人像风格化、更换背景、增加特效等等。

二、PortraitFCN人像分割算法框图详解


图3展示了PortraitFCN人像分割算法的整体框图,以下将围绕这个框图对该算法进行理解,具体的细节请看下一部分的讲解。

PortraitFCN人像分割算法实现步骤:

  1. 输入待分割的人像图像,对其做预处理操作;
  2. 将与除磷后的图像输入到预训练好的人脸检测器中,获得一张所谓的大头照,仅仅包含人体的上半身,即图3b所示;
  3. 根据候选的位置模板计算出一个平均模板和一个归一化的x和y坐标;
  4. 根据平均模板和归一化的坐标对大头照进行人像对齐操作;
  5. 将对齐后的人像大头照输入到PortraitFCN+网络中,需要注意的是输入是一个5通道的变量,包括RGB+Mean Mask+Normalized x and y,PortraitFCN+网络是一个基于FCN的改进网络,使用卷积+反卷积的结构,输出最终的人像分割结果。

三、PortraitFCN人像分割算法细节详解

1. 归一化的X和Y通道是如何获得的?(位置通道)

这个通道的目的是为了对与人脸相关的像素的位置进行编码。即找到算法需要进行优化的区域,因为对于大头照而言,对于人体的其它而言,比如胳膊、手等一般的语义分割算法就能处理的很好,人像分割算法更关注于如何对那些语义分割算法处理不好的细节进行很好的处理,因此找到待优化的区域变得至关重要。
为了获得归一化的X和Y通道,我们需要执行以下的步骤:1. 使用预训练好的人脸检测器检测出图像中的人脸;2. 使用预训练好的人脸关键点检测算法检测出人脸的关键点;3. 根据过滤的特征和候选的位姿计算出一个变换关系T,即通过对检测到的人脸的关键点和标准模板人脸的关键点计算出这个变换关系;4. T(X)和T(Y)则为我们的结果,表示的是该像素距离人脸中心之间的偏差值。

2. 形状通道是如何获得的?

所谓的形状通道指的是Mean Mask通道,该通道可以大致指示出目标所在的区域,可以提供一个较好的初始化,便于获得最优解。
为了获得形状通道,我们需要执行以下的步骤:1. 在整个训练集中计算出一个对齐的平均掩模;2. 对于每一个训练人像掩模对{Pi, Mi},其中Pi表示当前人脸图像的关键点,Mi是通过变换关系T(Pi)得到的,最终的平均掩码M的表达式如下所示:M=∑iwi∘τi(Mi)∑iwiM=\frac{\sum i w_{i} \circ \tau _{i}(M_{i})}{\sum i w_{i}}M=∑iwi​∑iwi​∘τi​(Mi​)​其中wi是一个矩阵,表示的是经过变换后的Mi是否在图像的范围内,如果在图像的范围内为1表示,反之则用0表示。

3. 整个算法的亮点?

仔细观察整个人像分割算法的过程,我们会发现该算法基本上和FCN的思路类似,最大的贡献就是提出了添加位置通道和形状通道到输入图像中,从而构成一个5通道的输入,让网络更加关注于人脸周围的区域,从而获得更好的人像分割效果。

四、PortraitFCN人像分割算法效果展示

图4展示了PortraitFCN人像分割算法在测试图片上面的效果展示,图4中的第1列表示的是原始的输入图片,图4中的第2列表示的是人像分割的GT,图4中的第3列表示的是传统的FCN-8s算法分割后的效果,图4中的第4列表示的是Graph-cut算法的分割效果(传统算法中的state-of-art),图4中的第5列表示的是PortraitFCN算法的分割效果。相比于FCN和Graph-cut算法而言,PortraitFCN能够获得更好的分割效果,该算法分割出来的效果基本上和GT十分接近,而FCN和Graph-cut算法分割后的结果中会出现严重的人像缺失和背景干扰等问题。因此,PortraitFCN算法极大的提升了人像分割算法的性能,也是第一个使用神经网络获得最好的分割效果的算法,因此值得一读。

为了证明该算法的有效性,作者将该算法应用在人像抠图中,即利用PortraitFCN算法生成人像二值mask之后,将该mask边界附近的10像素看做unknown区域,用灰色的粗线表示出来,即形成所谓的trimap图片;然后将原始图片和相应的trimap图片一起输入到KNN Matting算法中获得最终的人像抠图结果。图中展示的效果还可以,但是我们可以观察到图5a中左边区域的一些头发丝并没有被抠出来。


图6展示了PortraitFCN算法在不同图片上面的一些具体应用,整体来看,该算法的分割效果还不错,基本达到了可以在现实场景中应用的程度。通过图6大家也许能够理解一些图像处理软件中的魔法了吧,哈哈哈。

五、算法总结

看完了这篇文章的细节,你也许会感慨这篇文章的思路也就那样,很简单,也没有大多的心意,本文最大的创新点在于:首先,提出了位置通道和形状通道,并将其和原始的RGB一起输入到网络中获取特征;然后,本文作者发布了一个比较的人像分割数据集,人像分割任务一直不能取得很大的进步的原因其实也和数据集有关,对于人像分割的数据集需要精细到发丝,因此会耗费大量的人力和物力,这个数据集为后续的人像分割领域也做出了很大的贡献;最后,作者在FCN算法的基础上都能获得这么好的效果,如果使用当前较好的语义分割算法可能能够获得更好的效果,纵观后续的人像分割算法的思路,基本上都是在这篇论文的思路的基础之上进行改进和优化,使用传统的语义分割算法获得基本的分割结果后使用一个浅层的reefine网络来进一步对这个结果进行细化。因此,我认为这是一篇很值得去读的文章,可谓是人像分割的开山之作。

参考文献

[1] 原始论文

注意事项

[1] 该博客是本人原创博客,如果您对该博客感兴趣,想要转载该博客,请与我联系(qq邮箱:1575262785@qq.com),我会在第一时间回复大家,谢谢大家的关注。
[2] 由于个人能力有限,该博客可能存在很多的问题,希望大家能够提出改进意见。
[3] 如果您在阅读本博客时遇到不理解的地方,希望您可以联系我,我会及时的回复您,和您交流想法和意见,谢谢。
[4] 本人业余时间承接各种本科毕设设计和各种小项目,包括图像处理(数据挖掘、机器学习、深度学习等)、matlab仿真、python算法及仿真等,有需要的请加QQ:1575262785详聊!!!

PortraitFCN算法详解相关推荐

  1. Matlab人脸检测算法详解

    这是一个Matlab人脸检测算法详解 前言 人脸检测结果 算法详解 源代码解析 所调用函数解析 bwlabel(BW,n) regionprops rectangle 总结 前言 目前主流的人脸检测与 ...

  2. 图论-最短路Dijkstra算法详解超详 有图解

    整体来看dij就是从起点开始扩散致整个图的过程,为什么说他稳定呢,是因为他每次迭代,都能得到至少一个结点的最短路.(不像SPFA,玄学复杂度) 但是他的缺点就是不能处理带负权值的边,和代码量稍稍复杂. ...

  3. C++中的STL算法详解

    1.STL算法详解 STL提供能在各种容器中通用的算法(大约有70种),如插入.删除.查找.排序等.算法就是函数模板,算法通过迭代器来操纵容器中的元素.许多算法操作的是容器上的一个区间(也可以是整个容 ...

  4. 粒子群(pso)算法详解matlab代码,粒子群(pso)算法详解matlab代码

    粒子群(pso)算法详解matlab代码 (1)---- 一.粒子群算法的历史 粒子群算法源于复杂适应系统(Complex Adaptive System,CAS).CAS理论于1994年正式提出,C ...

  5. 基础排序算法详解与优化

    文章图片存储在GitHub,网速不佳的朋友,请看<基础排序算法详解与优化> 或者 来我的技术小站 godbmw.com 1. 谈谈基础排序 常见的基础排序有选择排序.冒泡排序和插入排序.众 ...

  6. 目标检测 RCNN算法详解

    原文:http://blog.csdn.net/shenxiaolu1984/article/details/51066975 [目标检测]RCNN算法详解 Girshick, Ross, et al ...

  7. Twitter-Snowflake,64位自增ID算法详解

    Twitter-Snowflake,64位自增ID算法详解 from: http://www.lanindex.com/twitter-snowflake%EF%BC%8C64%E4%BD%8D%E8 ...

  8. 数据结构与算法详解目录

    数据结构与算法详解是一本以实例和实践为主的图书,主要是经典的数据结构与常见算法案例,来自历年考研.软考等考题,有算法思路和完整的代码,最后提供了C语言调试技术的方法. 后续配套微课视频. 第0章  基 ...

  9. [搜索]波特词干(Porter Streamming)提取算法详解(2)

     接[搜索]波特词干(Porter Streamming)提取算法详解(1), http://blog.csdn.net/zhanghaiyang9999/article/details/4162 ...

最新文章

  1. Hadoop 伪分布式 配置文件详情
  2. Docker 创建1个自己的Tomcat 镜像
  3. Thrift中实现Java与Python的RPC互相调用
  4. 测试用例 集成测试增删改查_20年高级测试人员的进阶汇总
  5. java(6)——+号和++号--号
  6. eval 函数 代替函数_eval()函数以及JavaScript中的示例
  7. 上周并发题的解题思路以及介绍Go语言调度器
  8. Netty 实现长连接服务的难点和优化点
  9. 黑马微服务项目乐优商城全套
  10. MT6573芯片资料集锦MT6575入门手册 V0.2
  11. 【图像处理】镜头去污渍(未完全实现):python + OpenCV
  12. 微信小程序豆瓣电影(上)
  13. 第一章 道法,基础剑诀
  14. 执行retn、call、leave指令的时候,esp和eip的变化情况
  15. Amazon Shield Advanced 更新 – 自动应用程序层 DDoS 防御
  16. 写给Java 工程师们一封信
  17. 串口通讯协议和RS-232的介绍以及USB/TTL转232模块的工作原理
  18. 谷歌浏览器关闭后未清除cookie
  19. C# SQL Server笔记
  20. 干游戏还是大屏爽!送一台27寸高清显示器!直接包邮到家!

热门文章

  1. 英语阅读计算机病毒是指,2016年职称计算机考试真题及答案
  2. android 自定义loading,android_自定义Loading框
  3. java 重载 不可_深入深刻深到不能再深的理解java中的重载和重写
  4. java jframe全屏_Java-将JFrame设置为全屏时,屏幕变黑
  5. IE兼容问题 动态生成的节点IE浏览器无法触发
  6. 【Linux】Linux服务器(centos7)环境搭建java/python3/nginx
  7. CentOS7 安装 webgoat 7.1 简介
  8. Linux中ifcfg-eth0配置参数解释
  9. 织梦生成栏目找不到模板怎么知道是哪个栏目和模板
  10. asp.net MVC提高开发速度(创建项目模板)