• 【计算机视觉40例】案例39:易容术(换脸术、合成人脸)


    导读】本文是专栏《计算机视觉40例简介》的第39个案例《易容术(换脸术、合成人脸)》。该专栏简要介绍李立宗主编《计算机视觉40例——从入门到深度学习(OpenCV-Python)》一书的40个案例。

    目前,该书已经在电子工业出版社出版,大家可以在京东、淘宝、当当等平台购买。

    大家可以在公众号“计算机视觉之光”回复关键字【案例39】获取本文案例的源代码及使用的测试图片等资料。

    针对本书40个案例的每一个案例,分别录制了介绍视频。如果嫌看文字版麻烦,可以关注公众号“计算机视觉之光”直接观看视频介绍版。

    本文简要介绍了本案例的一些基础知识,更详细的理论介绍、代码实现等内容请参考《计算机视觉40例简介》第28章《人脸识别应用案例》以获取更详细信息。

    Dlib是一个现代工具包,包含机器学习算法和工具,用于在程序中构造软件来解决复杂的现实世界问题。它被工业界和学术界广泛应用于机器人、嵌入式设备、移动电话和大型高性能计算环境等领域。Dlib的开源许可允许用户在任何应用程序中免费使用它。

    Dlib官网提供了非常翔实的资料,对它的函数有非常具体的使用说明。除此以外,Dlib官网还提供了大量的案例帮助我们快速掌握该工具的使用。

    本章中,我们使用Dlib实现几个跟人脸识别相关的具有代表性的案例,具体如下:

    1. 定位人脸
    2. 绘制关键点
    3. 勾勒五官轮廓
    4. 人脸对齐
    5. 调用CNN实现人脸检测

    本章中所使用的模型均可在Dlib官网下载。

    易容是指在保持一个人脸部发型、脸颊等基本特征不变的情况下,将其五官换成另外一个人的五官。如图1所示,最右侧的人脸是在保持左侧人脸外轮廓(发型、脸型)不变的基础上,将五官变为中间人五官的结果。

     

    1 易容术

    【说明】上述人脸是由以人工智能方式生成的虚拟脸,在现实中并不存在。生成人脸网址:https://thispersondoesnotexist.com/

    在易容的过程中需要使用仿射变换来解决两幅图像大小不一致,及其中人脸的大小不一致的问题。

    换脸算法的核心在于找到人脸在图像中的具体位置,然后通过仿射变换将一个人的五官换到另外一个人的脸上,具体流程如图2所示。

    图2  流程图

    图2中,将人脸a的外轮廓保留,其五官替换为人脸b的五官。其具体流程如下:

     

    Step1:获取人脸关键点

    通过Dlib,分别获取人脸a、人脸b的68个关键点。

    Step2:获取人脸对应的区域

    根据人脸的关键点获取人脸的凸包,通过绘制凸包的轮廓得到人脸所在区域(模板)。该步骤分别得到人脸a所构成模板amask,人脸b所构成的模板bmask。此时,由于图像大小、人脸脸型(瓜子脸、圆脸、方脸)、人脸位置(左上角、右下角、下侧等)、人脸在图像中方位(正脸、斜脸)等原因,必须要对人脸进行校正。具体来说,需要将其中一幅图像的五官(人脸b)大小、脸型等映射到目标图像(图像a)的五官上,与目标图像尽量保持一致。

    Step3:获取映射矩阵M

    根据图像内人脸关键点,基于奇异值分解(Singular Value Decomposition,SVD)技术构造两幅图像之间对应的映射矩阵M。

    Step4:校正人脸b的模板bmask

    为了更好地将人脸a和人脸b融合在在一起(换脸),需要让人脸a和人脸b在图像中的位置基本一致(对齐)。通过step3内获取的仿射矩阵M,将人脸b的轮廓(模板bmask)调整到与人脸a轮廓(模板amask)尽量匹配,得到bMaskWarp。

    当然,实际上,这里人脸b的轮廓(模板bmask)是根据人脸a轮廓(模板amask)的形状而变化的,如图中虚线所示。

    Step5:人脸a模板和校正后人脸b模板进行融合得到最终模板mask

    将人脸a的模板aMask、人脸b校正后的模板bMaskWarp融合,获取最终的使用的模板mask。实现上,将人脸a模板aMask和人脸b校正后的模板bMaskWarp中白色区域叠加在一起(通过取最大值、或加法等操作实现)即可。

    Step6:人脸b校正

    使用step3获取的映射矩阵M,通过映射运算,将人脸b校正到与人脸a一致大小、方向,得到bWarp。

    与step4类似,这里是根据人脸a,完成的针对人脸b的调整。

    Step7:校正颜色

    将step6中得到的bWarp图像进行色彩校正,让其与人脸a图像的颜色大体一致,得到最终参与运算的人脸bColor。

    实践中,有比较成熟的算法实现颜色校正。本例中,我们采用了比较简单的方式,主要步骤如下:

    1. 第1步:计算图像a的高斯变换aGauss、图像b的高斯变换bGauss。高斯变换是为了让图像中每个像素点的颜色尽可能地取周围像素点的均值。
    2. 第2步:计算aGauss/bGauss的值作为图像a和图像b的颜色比值ratio。
    3. 第3步:用图像b乘以ratio,获得图像b的颜色调整结果。处理后,图像b的颜色接近于图像a的颜色。

    Step8:换脸

    在新的人脸图像中,mask指定区域使用bColor构成,mask以外区域使用人脸a构成。

    根据上述过程编写程序,运行程序,程序运行结果如图3所示。

     

    3 运算结果(最右侧人脸是左侧两人脸所合成的)

    在《计算机视觉40例——从入门到深度学习(OpenCV-Python)》第28章《人脸识别应用案例》中详细介绍了人脸表情识别、驾驶员疲劳监测、易容术、识别性别与年龄等案例。

    《计算机视觉40例——从入门到深度学习(OpenCV-Python)》在介绍Python基础、OpenCV基础、计算机视觉理论基础、深度学习理论的基础上,介绍了计算机视觉领域内具有代表性的40个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。

     

  • 相关阅读:
    【HMS core】【FAQ】Account、IAP、Location Kit and HarmonyOS典型问题合集1
    C# 简单封装异步Socket Server
    菜鸟学Kubernetes(K8s)系列——(三)关于Service、Ingress
    【计算机网络系列】数据链路层③:使用广播信道的数据链路层(CSMA/CD协议和以太网的MAC帧)
    亲测有效,快速创建JMeter桌面快捷方式
    【路径规划-VRP问题】基于混合K-Means和蚁群算法求解带容量车辆路径规划CVRP问题附matlab代码
    golang常用库之olivere elastic包 | go操作elasticsearch
    使用c++视觉处理----canny 边缘检测、sobel边缘检测、scharr 滤波边缘检测
    Git的一些常用概念与操作方法分享
    深度学习基础知识 register_buffer 与 register_parameter用法分析
  • 原文地址:https://blog.csdn.net/superdont/article/details/126308662