基于Python的换脸应用

文章目录

  • 前言
  • 一、系统整体结构
  • 二、运行环境
    • 1.预训练模型下载
    • 2.提取面部标记
    • 3.混合图像
    • 5.校正颜色
    • 6.转换函数
  • 三、系统测试


前言

通过 Dlib 提供的机器学习、数值计算、图模型算法、图像处理等相关功能,采
用人脸识别预训练,实现两张照片的换脸功能。。


一、系统整体结构

1.采用dlib的预训练模型实现主体功能
2.设计交互界面
3.系统测试

二、运行环境

需要 Python 3.6 及以上配置,完成该项目所需要的库文件有 OpenCV、dlib、numpy、sys、PIL、thikter、matplotlib。

1.预训练模型下载

采用官方提供的预训练模型,帮助开发者节省时间,从 Dlib sourseforge 库下载:
http://sourceforge.net/projects/dclib/files/dlib/v18.10/shape_predictor_68_face_landmarks.dat.bz2
构建有 68 个特征点组成的人脸特征提取器。相关代码如下:

PREDICTOR_PATH = "./shape_predictor_68_face_landmarks.dat"
FACE_POINTS = list(range(17, 68))
MOUTH_POINTS = list(range(48, 61))
RIGHT_BROW_POINTS = list(range(17, 22))
LEFT_BROW_POINTS = list(range(22, 27))
RIGHT_EYE_POINTS = list(range(36, 42))
LEFT_EYE_POINTS = list(range(42, 48))
NOSE_POINTS = list(range(27, 35))
JAW_POINTS = list(range(0, 17))
#划分 68 个点的每个点意味着什么部位,如第 27~35 的点(xi,yi)就是鼻子
ALIGN_POINTS = (LEFT_BROW_POINTS + RIGHT_EYE_POINTS + LEFT_EYE_POINTS + 
RIGHT_BROW_POINTS + NOSE_POINTS + MOUTH_POINTS)
#对齐图片的点,即五官
OVERLAY_POINTS = [LEFT_EYE_POINTS + RIGHT_EYE_POINTS + LEFT_BROW_POINTS + 
RIGHT_BROW_POINTS,NOSE_POINTS + MOUTH_POINTS,]
detector = dlib.get_frontal_face_detector()
#人脸检测器
predictor = dlib.shape_predictor(PREDICTOR_PATH)
#特征提取器

2.提取面部标记

在预训练获取特征提取器后用户输入两个图像的人脸特征点,函数将一个图像转化成
numpy 数组,并返回 68*2 元素矩阵,输入图像一张脸有 68 个特征点,每个特征点对应每行
的 x、y 坐标
代码如下(示例):

class TooManyFaces(Exception):#设置检测到太多脸的类pass
class NoFaces(Exception):#设置没有检测到脸的类Pass
def get_landmarks(im):#获取人脸特征点,将图像转化成 numpy 数组,返回 68*2 元素矩阵
#输入图像的每个特征点对应每行的 x、y 坐标
rects = detector(im, 1)#每个矩形列表在图像中对应一个脸
#rects 表示人脸框的位置信息
if len(rects) > 1: #如果识别的人脸数大于一个,引发 TooManyFaces 异常
raise TooManyFaces
if len(rects) == 0:#如果图片没人脸,引发 NoFaces 异常
raise NoFaces
return numpy.matrix([[p.x, p.y] for p in predictor(im, 
rects[0]).parts()])
#为加快计算,把得到的特征点转换成 numpy 矩阵
def read_im_and_landmarks(fname):#从计算机中读取用户所选的图片并提取特征点
im = cv2.imread(fname, cv2.IMREAD_COLOR)#opencv 读取图片并显示
im = cv2.resize(im, (im.shape[1] * SCALE_FACTOR,im.shape[0] * SCALE_FACTOR))
s = get_landmarks(im)
return im, s

3.混合图像

使用掩模(mask)表示不同区域,属于人脸区域像素值为 1,不属于人脸区域像素值为 0。
在提取时直接将原图片乘以掩模,得到人脸,而其余区域像素值为 0;如果将原图片乘以
1−mask,即人脸区域是 0,保留其余区域。上面两个结果相加,实现初步换脸
代码如下:

def draw_convex_hull(im, points, color):#绘制凸包
points = cv2.convexHull(points)
#寻找图像的凸包,points 就是输入的一组点
cv2.fillConvexPoly(im, points, color=color)
105
#cv2.fillConvexPoly()函数可以填充凸多边形,由凸包得到的轮廓点作为顶点
3.遮罩实现
def get_face_mask(im, landmarks):#为一张图像和一个标记矩阵生成一个遮罩
#画出了两个凸多边形:一个是眼睛周围的区域,一个是鼻子和嘴部周围的区域
im = numpy.zeros(im.shape[:2], dtype=numpy.float64)
#numpy.zeros 返回给定形状和类型的新数组,用 0 填充
#img.shape[:2] 取彩色图片的高、宽
for group in OVERLAY_POINTS:
#OVERLAY_POINTS 定义为[LEFT_EYE_POINTS + RIGHT_EYE_POINTS + 
LEFT_BROW_POINTS + RIGHT_BROW_POINTS , NOSE_POINTS + MOUTH_POINTS,]
#分为[眼睛周围、鼻子和嘴]两个区域,是第二张图片中要覆盖第一张图片的点
draw_convex_hull(im,landmarks[group],color=1)
#对图片中 68 特征点集里是 OVERLAY_POINTS 的点进行凸包绘制
im = numpy.array([im, im, im]).transpose((1, 2, 0))
im = (cv2.GaussianBlur(im, (FEATHER_AMOUNT, FEATHER_AMOUNT),0)>0)*1.0
#高斯滤波
im = cv2.GaussianBlur(im, (FEATHER_AMOUNT, FEATHER_AMOUNT), 0)
return im

5.校正颜色

def correct_colours(im1, im2, landmarks1):
106
#修正两幅图像之间不同肤色和光线造成的覆盖区域边缘不连续
blur_amount = COLOUR_CORRECT_BLUR_FRAC * numpy.linalg.norm(
numpy.mean(landmarks1[LEFT_EYE_POINTS], axis=0) -
numpy.mean(landmarks1[RIGHT_EYE_POINTS],axis=0))
#numpy.mean 求左右眼点集均值,其中 axis=0,压缩行,对各列求均值,返回 1*n 矩阵
#从左眼点集、右眼点集分别得到一个代表左眼和右眼的点,两者相减是左右眼横,纵相对距离
#用 numpy.linalg.norm 得到矩阵所有元素平方和开根号,勾股定理,得到了两眼之间的距离
#COLOUR_CORRECT_BLUR_FRAC*两眼距离作为高斯内核大小
#内核太小,第一个图像的面部特征将显示在第二个图像中
#内核过大,内核之外区域像素被覆盖并发生变色,COLOUR_CORRECT_BLUR_FRAC 设置为 0.6
blur_amount = int(blur_amount)
if blur_amount % 2 == 0:
blur_amount += 1 #高斯内核大小不能是偶数
im1_blur = cv2.GaussianBlur(im1, (blur_amount, blur_amount), 0)
#用模板扫描图像中的每一个像素,确定的邻域内像素的加权平均灰度值去替代模板中心像素点的值
#高斯矩阵的长与宽是高斯内核(blur_amount)的大小,标准差取 0,返回高斯滤波后的图像
im2_blur = cv2.GaussianBlur(im2, (blur_amount, blur_amount), 0)
im2_blur += (128 * (im2_blur <= 1.0)).astype(im2_blur.dtype)
#防止除零,将高斯滤波后 im2 元素的数据类型返回,强制类型转换成数据类型
return (im2.astype(numpy.float64) * im1_blur.astype(numpy.float64) /im2_blur.astype(numpy.float64))
#试图改变图像 2 的颜色来匹配图像 1,通过用 im2*im1/im2 的高斯模糊

6.转换函数

def main():
global image1,image2#将两张照片设置为全局变量,方便在各个函数中直接使用
im1, landmarks1 = read_im_and_landmarks(image1)#提取图片 1 的特征点
im2, landmarks2 = read_im_and_landmarks(image2)#提取图片 2 的特征点
M = transformation_from_points(landmarks1[ALIGN_POINTS],landmarks2[ALIGN_POINTS])
#普氏分析(Procrustes analysis)调整脸部,相同变换使两张照片面部特征的相对距离尽可能小
mask = get_face_mask(im2, landmarks2)#为一张图像和一个标记矩阵生成一个遮罩
warped_mask = warp_im(mask, M, im1.shape)
#把图像 2 遮罩通过仿射矩阵 M 映射到图像 1 上
combined_mask = numpy.max([get_face_mask(im1, landmarks1), 
warped_mask], axis=0)
warped_im2 = warp_im(im2, M, im1.shape)#把图像 2 映射到遮好的图像 1 上
warped_corrected_im2 = correct_colours(im1, warped_im2, landmarks1)#校
正颜色
output_im = im1 * (1.0 - combined_mask) + warped_corrected_im2 * 
combined_mask
cv2.imwrite('output.jpg', output_im) #输出换脸后的照片

三、系统测试

第一步,单击进入浏览页面,自行浏览计算机内的文件;第二步,选择换脸的照片;第三步,右边个框,在图片 1 下方框内显示出自己刚选择的照片。同理,打开图片 2 功能和打开图片 1 一样;第四步,单击左边最下方的换脸按钮,进行换脸。待换脸界面如图 9-5 所示。单击换脸后,在当前文件目录下生成换脸后的图片

在这里插入图片描述
融合结果图片:在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/30710.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI换脸软件有哪些?这几个工具能轻松实现换脸

AI换脸是指利用人工智能技术将一张人脸的特征迁移到另一张人脸上&#xff0c;从而实现人脸转换的过程。这种技术已经被广泛应用于各个领域中&#xff0c;例如视频制作、视频修复、艺术创作和模拟仿真等。但是也有很多小伙伴感觉这个操作很有趣&#xff0c;想要将自己的照片进行…

换脸ai的方法分享!这几个换脸APP巨好用。​

换脸ai的方法分享&#xff01;换脸AI是一种基于人工智能技术的图像处理应用&#xff0c;它可以将一个人的面部特征和表情应用到另一张照片或视频中&#xff0c;实现快速、高效的人脸替换。这种技术利用机器学习模型分析和学习大量的人脸数据&#xff0c;训练出一种“生成对抗网…

基于Face++的AI换脸实现(详细)

如何实现图片AI换脸&#xff08;详细&#xff09; 前言关于AI换脸 常见的换脸API供应者获取换脸API 代码实现导入相应库与API链接定义一个获取图片的人脸特征参数的函数定义一个换脸函数换脸实现--完整代码 结果展示 前言 关于AI换脸 关于AI&#xff08;即Artificial Intellig…

【换脸详细教程】手把手教你进行AI换脸:换脸流程及源码详解

目录 1. 换脸基本原理2 人脸检测及可视化3. 人脸轮廓点检测及可视化4. 人脸图像变换--仿射变换5. 生成遮罩并直接替换人脸6. 人脸颜色校正 最近AI换脸貌似比较火爆&#xff0c;就稍微研究了一下相关了内容。AI换脸是一个娱乐性比较强的应用&#xff0c;这种错位感让人觉得非常有…

faceswap换脸程序安装及使用

faceswap简介 faceswap是一个开源的视频换脸软件&#xff0c;基本需要三个步骤&#xff0c;1.将视频切割成图片&#xff0c;并进行人脸提取 2.样本训练 3.换脸 faceswap安装&#xff08;windows环境&#xff09; 依赖安装 anaconda 需要先安装conda&#xff0c;用于python的…

分享几个我试过的AI工具,也可以在写论文时使用

现在AI工具越来越火了&#xff0c;特别是Chatgpt兴起以后。分享几个我平常会用的AI工具希望大家也有用到 1. Chatgpt与davinci Chatgpt相信大家比较熟悉了&#xff0c;但实际上OpenAI还有一个基于GPT-3的模型&#xff0c;这里我推荐一个可以代替chatgpt的工具, davinci-003。是…

国内企业怎么做好海外市场营销? 海外市场营销推广的全过程

如果您在中国不了解海外市场&#xff0c;但有国际推广需求&#xff0c;那么本文可以帮助您了解海外市场的营销理 念与方法&#xff0c;并帮助您实施全面的营销计划&#xff1a; 首先让我们从市场调查开始。 一、海外市场调研 如果你不熟悉当地的情况&#xff0c;开始贸易推…

【课件】Python调用OpenAI API实现ChatGPT多轮对话

Python调用openai API实现多轮对话 如何实现多轮对话&#xff1f; gpt-3.5-turbo 模型调用方法 openai.ChatCompletion.create 里传入的 message 是一个列表&#xff0c;列表里每个元素是字典&#xff0c;包含了角色和内容&#xff0c;我们只需将每轮对话都存储起来&#xff0c…

使用OpenAI创建对话式聊天机器人

引言 在当今的技术世界中&#xff0c;人工智能&#xff08;AI&#xff09;的发展迅猛&#xff0c;为我们带来了许多令人兴奋的创新。其中&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域的进展使得开发对话式聊天机器人成为可能。OpenAI是一家领先的人工智能研究实验…

人工智能数学基础--概率与统计8:一个很有意思的下棋输赢概率问题

一、问题 甲、乙二人下象棋&#xff0c;每局甲胜的概率为a&#xff0c;乙胜的概率为b。为简化问题&#xff0c;设没有和局的情况&#xff0c;这意味着ab1。设想甲的棋艺高于乙&#xff0c;即a>b。考虑到这个情况&#xff0c;他们商定最终胜负的规则如下&#xff1a; 到什么…

2018年数学与计算机大事件:18岁少年大放异彩!ABC猜想证明被推翻?

【导读】2018年数学和计算机科学领域发生了哪些重大事件&#xff1f;量子霸权并未实现&#xff0c;年轻的菲尔兹奖得主质疑日本数学家望月新一对ABC猜想的证明。还有18岁的少年、苦读8年不毕业的女研究生&#xff0c;以及退休软件工程师和抗衰老组织联合创始人&#xff0c;都在…

里程碑式的数学证明,攻破著名Erdős猜想中关键障碍

大数据文摘出品 来源&#xff1a;wired 编译&#xff1a;Canary、Andy 最近&#xff0c;两名数学家解决了一个关于整数相加性质最著名猜想中的第一部分。该猜想由匈牙利传奇数学家Paul Erdős于60多年前提出&#xff0c;一个无限整数序列在何时一定会包含至少有三个等差数的模式…

6174猜想的证明 Python

什么是6174猜想 1955年&#xff0c;卡普耶卡(D.R.Kaprekar)研究了对四位数的一种变换&#xff1a;任给出四位数k0,用它的四个数字由大到小重新排列成一个四位数m,再减去它的反序数rev(m),得出数k1m-rev(m),然后&#xff0c;继续对k1重复上述变换&#xff0c;得数k2.如此进行下去…

程序员的数学课04 万物可数学,经典公式是如何在生活中应用的?

在我们的生活和工作中&#xff0c;有大量的数学应用场景&#xff0c;一些简单的经典公式会在我们的生活中被反复验证、体现。对于经典公式的理解&#xff0c;能增强你的数据 sense&#xff0c;更能帮助你在遇到问题时&#xff0c;迅速找到解决思路。 这一课时我将列举四个脑洞…

评审8年终获发表,数学天才望月新一证明abc猜想,全球只有十几个数学家读懂但争议未消...

晓查 发自 凹非寺 量子位 报道 | 公众号 QbitAI abc猜想&#xff0c;数学界悬而未决的重要猜想&#xff0c;它的证明过程经过8年的同行评审&#xff0c;终于要在期刊上发表了。 论文作者是日本的天才数学家望月新一&#xff0c;他33岁起就在京都大学担任数学教授。 这一次望月新…

C++角谷猜想

题目描述&#xff1a; 请编写一个程序&#xff0c;验证角谷猜想。所谓角谷猜想是&#xff1a;“对于任意大于1的自然数n&#xff0c;若n为奇数&#xff0c;则将n变为3*n1&#xff0c;否则将n变为n的一半。”经过若干次这样的变化&#xff0c;一定会使n变为1。 输入格式&#…

某安网别逆向,一不小心就......

​ 大家好&#xff0c;我是TheWeiJun&#xff0c;欢迎来到我的公众号。在现代互联网中&#xff0c;cookie成为了网站管理的重要工具。某些网站会对cookie进行加密&#xff0c;以加强数据的安全性和保密性。然而&#xff0c;逆向加密算法并不是一件简单的事情。本文将探讨如何逆…

群晖docker实现IPV6访问

概述&#xff1a; 群晖docker默认没有没有开启ipv6&#xff0c;需要修改docker的配置文件。 修改过程&#xff1a; 一、首先确认自己的网络已经支持IPV6&#xff08;需要光猫及路由器支持ipv6&#xff09; 1.登陆www.test-ipv6.com查看是否已经接入IPV6 2.登陆自己的群晖查…

群晖传文件到服务器,文件上传到群晖服务器

文件上传到群晖服务器 内容精选 换一换 监控数据上报功能可以将系统中采集到的监控数据写入到文本文件&#xff0c;并以FTP或SFTP的形式上传到指定的服务器中。使用该功能前&#xff0c;管理员需要在FusionInsight Manager页面进行相关配置。“监控数据上传”默认为不启用&…

群晖硬盘警告修复

群晖硬盘警告修复 为了更好的浏览体验&#xff0c;欢迎光顾勤奋的凯尔森同学个人博客http://www.huerpu.cc:7000 我的群晖每次被我拿出来的时候&#xff0c;由于震动等原因&#xff0c;会时不时出现硬盘警告的提示&#xff0c;从而导致无法使用&#xff0c;现在我们来屏蔽一下…