人像美妆简介与唇彩算法实现
1. 引言
无
2. 美妆算法简介
“人靠衣装,美靠靓妆”,美妆的通俗定义是指,通过使用化妆品和相应的工具(眼线笔、睫毛贴等),使人的五官变得精致、立体、美观,以达到美容的效果。这是传统意义上的美妆,而照片美妆则是指通过一定的图像算法来模拟真实化妆的过程,让我们的照片变得像画过妆、美过容一样。随着科技的发展,生活水平的提高,人们对生活质量的要求也越来越高,拍照分享几乎成了每个人的日常,而对这些照片的美妆处理需求,也是与日俱增,在这个渴望美的世界里,“美妆相机”“玩美彩妆”等一系列美妆App也孕育而生,并且深受女孩子的喜爱。
以厦门美图科技出品的“美妆相机”、虹软科技出品的 Perfect365、“玩美彩妆”和“天天P图”为代表的美妆应用,正在通过各种图像算法,来实现照片和视频的美妆效果,各种效果举例如图1所示。
图1 美妆特效举例
从图中可以看到,各大美妆应用所做的美妆特效无非包括如下几个部分。
· 修眉:给人像替换新的眉毛与眉形。
· 眼妆:眼影/睫毛/眼线/双眼皮/亮眼/美瞳。
· 腮红:给人像添加腮红效果。
· 唇彩:给人像增加不同的唇色。
· 粉底:给人像增加不同颜色的打底妆
在这里,我们以如下的开发流程来介绍所有美妆算法。
在早期的修图时代,几乎所有的修图操作都是在 Photoshop或者类似的 PC修图软件中完成的,那个时代,手机还没有这么智能,也运行不了现在这么丰富的 App,更没有什么“美图秀秀”,因为手机硬件性能的限制,我们只能在PC上修图。但是,随着科技的发展,智能手机的普及,美颜美妆类手机 App 开始萌发,而它们的诞生,无非就是使用最简单的方式把PC 中 Photoshop 等美颜美妆修图的操作用算法实现,并移植到手机上。这个方法一直沿用至今,它的具体流程如图 2所示。首先,将目标效果在 PS中实现;然后,将 PS中的步骤分解细化;接着,根据 PS中的步骤进行图像算法编程实现;最后,将算法合并,得到最终美颜美妆的功能库用以处理图像(当然,这里我们所说的是传统方法,深度学习的方法排除在外)。
图2 美妆效果算法开发流程图
整体算法开发流程介绍完了,需要注意的是,美妆功能对于人脸关键点信息是强依赖的,人脸关键点的准确与否,将直接影响妆容效果的好坏。后续我们将采取关键点检测模型检测人脸关键点,如图3所示。
图3 人脸关键点序号图
3. 唇妆
唇妆,是对唇部区域的美容化妆,是女性最常用的化妆手法。唇妆最大的作用在于凸显美人的气质,例如“淡雅的上班唇色”“妩媚的约会唇色”“出位的时尚唇色”“高贵的红艳唇色”等,不同的时间、不同的地点、不同的场景,不同的唇彩搭配,凸显不同的美人韵味。
3.1 常用唇彩效果算法实现
本节将实现一种常用的唇彩算法。
3.1.1 唇彩标准模板设计
这一步非常关键,实现唇彩的基本原理是对嘴唇区域的像素添加颜色,而嘴唇区域的获取,依赖嘴唇区域的mask。我们将通过算法,将制作好的嘴唇mask变换到任意一张用户人像照片中的嘴唇区域,然后根据mask中的黑白信息来判断嘴唇区域。
首先,制作一张模特的嘴唇mask,并对mask进行一定的裁切与缩放,如图4(a)所示。同时,我们以106关键点为基准,得到对应的点位信息(也可以手动标记点位数据),如图4(b)所示,点位标号即虹软105关键点标号。
其次,我们创建标准唇彩模板。将点位信息标号统一,如图4(c)所示,顺序不变,索引统一从 0开始。可以发现,嘴唇区域共有 20个关键点信息,在此基础上,再添加8个点,分别是矩形框所在的边界点,标号如图4(c)所示。这8个点用来限定嘴唇区域范围,至此,唇彩模板共有28个关键点信息。
最后,将嘴唇区域按照点位进行三角形剖分,并将三角形进行索引标号,如图 4(d)所示,共有42个三角形。记录下三角形的点位位置与索引,这样mask和对应的三角形索引以及28个点位信息就形成了一个标准唇彩模板。
图4 标准唇彩模板设计
3.1.2 标准唇彩模板的变换
对于任意一张用户人脸照片S,如何将标准唇彩模板 mask 对齐到嘴唇区域呢?算法如下所述。
①对于S进行人脸关键点检测,得到嘴唇区域的20个关键点信息,标号为75-94。
②计算 20个关键点的最小外接矩形框,并将矩形框外扩。按照图 4(d)所示的顺序,得到8个矩形框边界点。共计28个嘴唇关键点的数组,记作P1,矩形框所在的嘴唇区域图像记作S1。
③假设标准唇彩模板图为M,对应28个关键点的数组为P2。
④假设标准唇彩模板对应的42个三角形定点索引为T。
⑤按照T将S1进行三角剖分,得到三角形图像数组Ts。
⑥按照T将M进行三角剖分,得到三角形图像数组Tm。
⑦遍历Ts,对每个三角形内的所有像素做仿射变换,映射到Tm对应的三角形内,这样就将Tm对齐到了Ts,即得到一张和S1一模一样的唇彩模板 mask,这个 mask中记录的是黑白区域,白色表示S1内的嘴唇区域,黑色表示背景,如图5(b)所示。
图5 标准唇彩模板变换
该算法流程涉及两个算法:仿射变换以及判断点是否在三角形内部。
3.1.3 嘴唇上色
为了能够方便地添加各种颜色的唇彩,这里我们使用标准颜色映射表 512×512 LUT的方法来对嘴唇区域的图像进行颜色变换。变换之后得到了图像C,如图6所示。
图6 LUT颜色变换
3.1.4 alpha混合
按照S1将图S和图C进行alpha融合,得到最终效果,如图5.47所示。
图7 唇彩算法效果图
3.2 唇彩的其他算法实现
3.2.1 嘴唇检测法
唇检测法是指通过算法检测出嘴唇区域,然后对该区域的像素进行颜色变换,进而达到上唇彩的效果;这种方法不需要精确的人脸关键点信息,代价比较小,但缺点是传统的嘴唇检测算法精度较低。
常用的检测算法有两种,一种是基于颜色空间的传统检测算法,论文参考《基于肤色和唇色信息的人脸检测方法的研究》和《一种快速鲁棒的唇部检测方法》;另一种是基于深度学习的嘴唇分割。
论文《基于肤色和唇色信息的人脸检测方法的研究》中以 YIQ 颜色空间为基础,基于唇色像素值统计结果,对唇色进行检测,作者给出了唇色像素的分布范围,如表 1 所示。对于任意像素,按照如下公式进行YIQ颜色空间转换,Y、I、Q分量满足唇色分布范围要求,则该像素即为唇色像素。
表1 YIQ颜色空间的纯色范围表
RGB颜色空间到YIQ颜色空间的转换公式如下:
在论文《一种快速鲁棒的唇部检测方法》中,以 RGB 颜色空间为基础,提出了一个唇色判断公式,如下所示:
对于任何一个像素点P(R,G,B),若满足上述公式,则该像素属于唇色。这里的T是经验值,论文中并未给出具体数值。
这里给出两种传统算法的效果图,如图8所示。
图8 唇色检测算法效果图
基于深度学习的图像分割,我们留到后续章节中详细给大家讲解。现在可以告诉大家的是,基于深度学习的嘴唇分割算法以极高的分割准确率完胜传统算法,大家拭目以待吧。
无论是传统方法还是深度学习方法,分割出嘴唇区域之后,我们就可以使用 LUT 颜色变换的方法或者使用 HSV等颜色空间修改像素颜色的方法,来修改嘴唇的颜色,进而达到上唇彩的效果。
3.2.2 曲线拟合法
曲线拟合算法对比嘴唇检测算法而言,不是通过检测来获取嘴唇区域,而是基于人脸关键点,也就是嘴唇区域的特征点来进行曲线拟合,进而获得光滑的嘴唇曲线,以及光滑的嘴唇区域。常用的曲线拟合算法有最小二乘法,贝塞尔曲线拟合法等。
曲线拟合法也是很多开发唇彩特效应用的首选方法,以曲线拟合法为基础的唇彩算法,逻辑流程如图9所示。
图9 使用曲线拟合法唇彩的逻辑流程图
具体分解过程如下:
(1)对原始人像照片进行人脸关键点检测,获取嘴唇区域关键点,以虹软的 101 关键点为例,如图10(a)所示。
(2)对嘴唇关键点进行曲线拟合,以贝塞尔曲线拟合为例,如图10(b)所示。
(3)对曲线拟合得到的嘴唇区域进行黑白填充,嘴唇区域为黑色,其他区域为白色,如图10(c)所示,得到嘴唇区域Mask。
(4)对嘴唇区域Mask进行高斯模糊,然后反相,得到最终的嘴唇区域Map,如图10(d)所示。
(5)将原图进行LUT唇色转换,如图10(e)和图10(f)所示。
(6)将原图和唇色转换结果图以嘴唇区域Map为alpha通道进行alpha混合,得到结果图,如图10(g)和图10(h)所示。
图10 嘴唇区域贝塞尔曲线拟合
4. 总结
本文对美妆算法进行简单介绍,并以唇彩为典例,介绍了唇妆的详细思路与算法实现。
5. 参考
Android简单实现嘴唇贴纸功能_JabamiLight的博客-CSDN博客
人像美妆---妆容迁移算法研究(Makeup transfer)_Trent1985的博客-CSDN博客
CatCatDogDog2030: “有误” 也不直接指出哪里错误呀
2301_77888455: 大佬第三方库目录应该在项目目录的哪个位置
有头驴子: 怎么好几个遮住了嘴部还有嘴巴的特征点
啸195: 3.2.2 insightface开源106点 insightface安装:https://github.com/deepinsight/insightface/tree/master/python-package 官方Demo(106点): https://github.com/deepinsight/insightface/tree/master/alignment/coordinate_reg 评价: 当人脸检测缩放尺度设置为130x130时,人脸检测+ 耗时在30ms以内,准确度很高,点位存在较小的抖动,对侧脸抬头仰头等较为鲁棒。 ———————————————— 130*130是指的什么尺寸
2301_80842084: 还是报错WARNING: The requested image's platform (linux/arm64/v8) does not match the detected host platform (linux/amd64/v4) and no specific platform was requested