导读】本文是专栏《计算机视觉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个典型案例。这些案例中,既有传统的案例(数字识别、答题卡识别、物体计数、缺陷检测、手势识别、隐身术、以图搜图、车牌识别、图像加密、指纹识别等),也有深度学习案例(图像分类、风格迁移、姿势识别、实例分割等),还有人脸识别方面的案例(表情识别、驾驶员疲劳监测、识别性别与年龄等)。

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

  1. 【计算机视觉40例】案例38:驾驶员疲劳监测

    <计算机视觉40例--从入门到深度学习(OpenCV-Python)>在介绍Python基础.OpenCV基础.计算机视觉理论基础.深度学习理论入门的基础上,介绍了计算机视觉领域内具有代表 ...

  2. 【计算机视觉40例】案例40:识别性别与年龄

    [导读]本文是专栏<计算机视觉40例简介>的第40个案例<识别性别与年龄>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)& ...

  3. 【计算机视觉40例】案例37:人脸表情识别

    [导读]本文是专栏<计算机视觉40例简介>的第37个案例<人脸表情识别>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)&g ...

  4. 【计算机视觉40例】案例36:调用CNN实现人脸检测

    [导读]本文是专栏<计算机视觉40例简介>的第36个案例<调用CNN实现人脸检测>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Pyth ...

  5. 【计算机视觉40例】案例07:数字手势识别

    [导读]本文是专栏<计算机视觉40例简介>的第7个案例<手势识别>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)>一 ...

  6. 【计算机视觉40例】案例05:物体计数

    [导读]本文是专栏<计算机视觉40例简介>的第5个案例<物体计数>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)>一 ...

  7. 【计算机视觉40例】案例30:EigenFaces人脸识别

    [导读]本文是专栏<计算机视觉40例简介>的第30个案例<EigenFaces人脸识别>的简介,该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenC ...

  8. 【计算机视觉40例】案例08:石头剪刀布手势识别

    [导读]本文是专栏<计算机视觉40例简介>的第8个案例<石头剪刀布手势识别>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python) ...

  9. 【计算机视觉40例】案例26:姿势识别

    [导读]本文是专栏<计算机视觉40例简介>的第26个案例<姿势识别>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)> ...

  10. 【计算机视觉40例】案例03:数字水印

    [导读]本文是专栏<计算机视觉40例简介>的第3个案例<数字水印>.该专栏简要介绍李立宗主编<计算机视觉40例--从入门到深度学习(OpenCV-Python)>一 ...

最新文章

  1. 软件测试--利用组合覆盖法设计测试用例
  2. 静态代码分析——字符串
  3. 【Java 并发编程】指令重排序规范 ( happens-before 先行发生原则 )
  4. 穷举法--百钱买百鸡
  5. 密码学-hash散列表
  6. 拓展阅读 —— G6 坐标系深度解析
  7. LDAP之三:利用开源框架LDAPTemplate和JLDAP访问LDAP
  8. macos ntfs插件_Mac下NTFS读写插件NTFS for Mac介绍
  9. React Native实现NbaApp
  10. 就linux学习的一点感受,学习linux的体会
  11. Web前端笔记-通过Thymeleaf把数组传输给echarts并显示曲线图
  12. c语言-命令行选项_EWSTM8系列教程06_工程节点选项配置(一)
  13. linux的shell键盘输入,linux shell获取键盘输入
  14. 操作系统数据结构知识点总结2
  15. php多次登录失败,PHPCMS登录后台失败次数过多解决办法
  16. mysql界面导出数据库有乱码_导出的MYSQL数据库是乱码还可以变回中文吗
  17. 普元EOS更新license
  18. 暗通道理论详解及的Python实现
  19. 智慧医疗整体解决方案
  20. android跳转到应用市场并进入指定包名的应用详情

热门文章

  1. 音频算法工程师面试内容
  2. NXP恩智浦单片机Keil5环境下编程
  3. 微信小程序java后端_微信小程序访问后端服务器-微信小程序后端-微信小程序后端JAVA...
  4. python实战-网站扫码登录流程全解析
  5. Java扫码登录原理
  6. PHP实现用户扫描二维码后提示扫码成功的操作
  7. 如何去掉高CAD选择集对话框(高版本才有)
  8. Windows10查看便签
  9. 法向量变换矩阵的推导
  10. 设施规划选址——重心法