Title

FabSoften: Face Beautification via Dynamic Skin Smoothing, Guided Feathering, and Texture Restoration
代码:

Summary

这是一篇基于传统方法做的磨皮算法,利用精细皮肤MASK和小波变换实现了美颜和皮肤纹理保留。

Contribution(s)

用一个统一的框架实现美化的同时保留皮肤纹理

Problem Statement

很多滤波方法保留不了皮肤纹理

Method(s)

总体方法

  • 预处理:面部提取、大瑕疵去除
  • ADF模块:面部平滑
  • STR:面部纹理保留
  • GF模块:面部毛发保留

image.png

预处理

检测人脸,生成皮肤二值MASK,检测大瑕疵(文中定义其为Spots,小瑕疵定义为blemish),检测到大瑕疵后用复制周围无瑕疵像素值的方法重新生成这片区域

皮肤Mask生成

image.png
重点就是将proprocessing后的图片作为guide,使用Guided Filtering对初步MASK进行精细化修改。

皮肤瑕疵平滑

边缘保护的滤波方法在脸部毛发处无法保存精细特征。作者提出了ADF模块(attribute-aware dynamic guided filter),能够在皮肤平滑和精细特征保留间取得较好的平衡。
ADF模块主要是基于Guided Filter改的。(我看出来了,这个作者和我一样也是Guided Filter的狂热爱好者)Guided Filter有两个重要参数,r和ε。r越大,平滑的窗口越大。作者期望在脸颊和前额有较大的r,在面部特征如眼嘴鼻,更小的r甚至不用平滑。
r在像素i处的计算公式为:image.png
P_skin是皮肤置信度,一般嘴眼鼻周围的皮肤置信度会在0附近,这时r的值就接近β。
ε越大,平滑的力度越大。作者根据预处理中大瑕疵的数量固定住ε:image.png
用意是越多的大瑕疵,就使用越大的ε。

皮肤纹理恢复

皮肤平滑后会丢失纹理。为此作者提出了a wavelet-based STR模块。(小波变换一直没看,但这个应用挺广的)。
作者小波域图像分解,得到了低频信息和高频信息,瑕疵和肤色不均主要在低频信息里,细节纹理主要在高频信息里。基于这一实验结论,STR的细节如下:
输入图像I,首先使用ADF模块获得平滑后缺失纹理的图像S,接着对I和S都使用对应的小波变换(对应的小波变换用I_w和S_w表示),这样可以得到I和S的LL,HH,HL和HH四个方向的数值。最终输出图像的信息由这四者加权平均得到:
image.png
作者的实验证明HH分支拥有大量的皮肤纹理,HL和LH分支有部分皮肤纹理,也包含大小瑕疵。
α_LL = α_LH = α_HL = 0(这儿的数值是固定的,但未来可以考虑智能化计算,我也想做这部分工作), α_HH是纹理强度的线性变换结果。(作者想用纹理强度表征纹理皮肤纹理数理,使得最后的结果自然、不过度处理)
纹理强度公式:image.png,I_b是对I做bilateral filter的结果,它和输入图像的差值能表现纹理细节,x、y表示像素位置,得到纹理强度后计算α_HH的公式为:image.png,其中γ=0.5,β=1.
image.png
随着小波分解的层次越来越高,纹理特征会越来越粗糙,α_HH的值也会缩减。

Evaluation

quantitative comparison

image.png
FabSoften在移除小瑕疵、保留皮肤纹理上效果最好。

qualitative comparison

GLCM

Gray-Level Co-Occurrence Matrix(一个新接触过的评价指标)
image.png
FabSoften和输入图像有几乎一致的纹理分布

user study

image.png
rank1 - 5: 最好的美化效果 - 最差的美化效果

其它

优化后在Samsung Galaxy S10上测试1200W像素图像,运行时长为90ms

数据集

Helen dataset

Conclusion

作者的方法依赖人脸关键点,对于侧面人像,效果可能不如预期

Notes

小波变换的HH分支在肤质生成中有不错的效果,可以考虑应用一下