人脸美颜技术

人脸美颜技术(2019.10.8)

一、美颜技术发展现状和应用场景

  美颜美颜”,顾名思义,对图片里的人脸进行美化。在图片类、短视频类和直播类的APP中,都存在“美颜”的影子:图片类的APP中,最具代表性的是美图秀秀,美图的人像美容,便用到了“美颜”技术;短视频类的APP中,突出的是抖音和快手,这类APP在录制短视频的时候,有美颜、美妆等选项;直播类的APP中,像映客、YY等都在主播进行直播时加入了“美颜”技术。         

  

二、美颜技术步骤

  “美颜”是一个深度学习+图像处理+图形学的技术。“美颜”牵涉到这些技术包括:人脸检测、人脸关键点定位、瘦脸、磨皮、美白等。其中,人脸检测、人脸关键点定位是用深度学习技术来做的;而瘦脸、磨皮和美白就牵涉到计算机图形学里的技术,使用OpenGL,Metal来对检测到的人脸进行渲染。

 

三、详细算法讲解

1.人脸检测

  人脸检测技术指的是对图片中的人脸进行检测,并定位到图片中人脸的位置。人脸检测主要的技术难点在于,人脸在一张图片中可能存在人脸区域光照条件,人脸姿态变化、人脸表情变化、遮挡等问题。准确的检测出人脸相对来说是一件困难的事情。

       人脸检测也可分为两个时期:一个是深度学习之前的时期,另一个是深度学习时期。在深度学习之前,人们做人脸检测,主要使用人工设计好的特征,根据人工特征来训练检测器检测人脸。当深度学习在计算机视觉领域占据绝对主导地位之后,人们开始尝试用深度神经网络来做人脸检测,目前,主流的人脸检测方法大概有这么两种:一种是使用通用的目标检测网络来训练人脸检测模型,如faster-rcnn(一种目标检测网),ssd (Single Shot MultiBox Detector),yolo (You Only Look Once) 等等;另一种是使用专门的人脸检测网络,如cascadeCNN(Convolutional Neural Network Cascade for FaceDetection,级联结构的卷积神经网络,一种目标检测网络),MTCNN(Multi-task Cascaded Convolutional Neural Network,多任务级联卷积神经网络)等等。             

2.人脸关键点

  人脸关键点定位技术是对人脸中眉毛、眼睛、鼻子、嘴巴以及脸部的轮廓进行定位,人脸关键点定位是紧接在人脸检测后:首先在一张图片中检测到人脸,然后才对检测到的人脸做关键点定位。   

      人脸关键点定位技术同人脸检测技术一样,在实际应用中,也存在人脸的尺度、光照、表情、姿态、遮挡等问题。要对绝大多数图片获得准确的人脸关键点,也是一个比较难的任务。   

      人脸关键点定位技术也可分为深度学习前的时期和深度学习时期:传统的人脸关键点技术,有ASM(Active Shape Model),AAM (Active Appearance Model),CPR(Cascaded Pose Regression)等等;深度学习时期,2013年,香港中文大学首次将卷积神经网络应用到人脸关键点定位上来,2017年的DAN(Deep Alignment Network),LAB(Look at Boundary),2018年的SAN(Style Aggregated Network for Facial Landmark Detection)等等。目前,落地到产品上的人脸关键点定位,基本都是基于深度学习技术。  

       下图展示了人脸检测技术和人脸关键点定位技术的应用。

  有了关键点以后,便可以对图片中人脸区域做瘦脸、磨皮、美白等“美颜”操作。这些算法一般应用在移动设备上:在Android上可以使用OpenGL ES(OpenGL for Embedded Systems,嵌入式系统的OpenGL),在iOS上可以使用Metal根据人脸关键点的位置,对人脸进行瘦脸、磨皮、美白之类的渲染。

3.瘦脸

  在OpenGL或Metal环境下,在shader(纹理)中通过对像素位置进行偏移来实现对脸部区域的放大缩小:由变形前坐标,根据变形映射关系,得到变形后坐标。这其中变形映射关系是最关键的,不同的映射关系,将得到不同的变形效果。平移、缩放、旋转,对应的是不同的映射关系,即不同的变换公式。当然实际在计算过程中,用的是逆变换,即由变形后坐标,根据逆变换公式反算变形前坐标,然后插值得到该坐标RGB像素值,将该RGB值作为变形后坐标对应的像素值。这样才能保证变形后的图像是连续、完整的。             

4.磨皮

  所谓“磨皮”,是使皮肤变得更加光滑,其技术原理是:在图片的人脸框部分再进行一次肤色检测。只对人脸区域做磨皮,磨皮一般使用图像处理的一些滤波算法。  

       肤色检测可分两大类,一类是用颜色空间统计信息,来计算出皮肤所在的区域,另一类是基于机器学习的方法。传统方法是基于YCrCb颜色空间Cr,Cb范围筛选法。深度学习方法有CNN、FCN、UNet、DenseNet,文献中用的较多的就是UNet(Convolutional Networks for Biomedical Image Segmentation)。   滤波算法一般可以使用高斯滤波或者双边滤波等。   

 

5.美白

  图片的美白,是操作这个图片上的所有像素点,获得像素点的R、G、B、A的值然后获取到的值进行一定数目的增量。在图像处理领域中,一张图片会使用三原色 red、green、blue来保存图片的颜色信息,三个值的取值范围是0-255:越靠近0,图像就越黑,等于0的时候就是纯黑色;越靠近255,图像就越白,等于255的时候就是白色。图片的美白就是利用的这个原理。   

四、目前成果

  根据搜集的资料,可以发现除了部分需求较高的app,例如美图秀秀等,需要完成以上整个流程,其余要求较低的app只是简单的进行磨皮和美白,特点是美颜耗时短,且效果尚可。   

       如下是我使用YCrCb颜色空间Cr范围筛选法方法进行肤色检测,一次双线性插值进行磨皮,调整像素值进行美白后得到的美颜后的图片,cpu耗时33ms。

    import cv2
    import time

    st = time.time()
    image = cv2.imread('D:/Download/res/5.png')

    img_ycrcb = cv2.cvtColor(image, cv2.COLOR_BGR2YCrCb)
    channels = cv2.split(img_ycrcb)
    img_cr = channels[1]
    # 对cr通道分量进行高斯滤波
    img_cr = cv2.GaussianBlur(img_cr, (5, 5), 0)
    # 肤色检测
    _, skin = cv2.threshold(img_cr, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)
    # 美白
    image[np.where(skin)] = np.clip((whi * image[np.where(skin)] + 10), 0, 255)

    #双线性滤波  磨皮
    image = cv2.bilateralFilter(image, 20, 50, 50)  
    white = np.uint8(image)

    print(time.time()-st)

    cv2.imshow('bai',white)
    cv2.waitKey(0)

 

五、展望和难点

  真正要做好美颜算法,需要用到深度学习里面的人脸检测、人脸关键点定位(最少68个关键点)、人脸肤色检测(Unet等,传统的肤色检测算法不够细腻)这三个模型,目前已有人脸检测模型(mtcnn)。人脸关键点定位用于瘦脸、大眼等操作。肤色检测用于磨皮和美白阶段,防止对非皮肤进行模糊。   

       研究者们不局限于美颜,研究美妆算法,增强用户体验。代表性的研究有PSGAN(Pose-Robust Spatial-Aware GAN for Customizable Makeup Transfer),LADN(Local Adversarial Disentangling Network for Facial Makeup and De-Makeup)等。亲测可用的美妆代码https://github.com/zllrunning/face-makeup.PyTorch,具体效果如下图。           

六、引用

         博客:https://blog.csdn.net/princexiexiaofeng/article/details/89298776

                   https://blog.csdn.net/cnbloger/article/details/77949949

        github:https://github.com/zllrunning/face-makeup.PyTorch

  • 4
    点赞
  • 67
    收藏
    觉得还不错? 一键收藏
  • 7
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值