人工智能应用展示之图像识别: | 换脸

Posted python 青少年编程

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了人工智能应用展示之图像识别: | 换脸相关的知识,希望对你有一定的参考价值。


电影《face off》海报

“换脸”,这个词我最早听说是在1997年,那一年的我还在上高中,偶然间在录像厅看到了一部由美国派拉蒙影业公司出品的动作剧情片《Face off》(中文译后就是换脸)。该片由华裔导演吴宇森执导,尼古拉斯·凯奇、约翰·特拉沃塔、琼·艾伦等联袂出演。 故事讲述的是一名探员为了完成任务, 阴错阳差的与 追查的疑犯互换 脸皮,故而互换身份的故事。影片中,二人是通过“高科技”的换脸手术来实现, 然而这毕竟是科幻的电影情节。现实生活中, 这样的手术是不存在的。

转眼间,二十多年过去了,现在 手术台上虽然仍然 有这样的手术出现 ,但在火爆的AI技术中, 关于“换脸”技术 已经成了家常便饭。别紧张,当然不是真正意义上 的换脸,而是通过算法, 交换图像与视频中的人脸。一起来看一个例子。


以上视频中,经过换脸处理后,将电影《西虹市首富》中的一段视频中主演的脸换成了王公子,怎么样,一点违和感都没有吧。


AI换脸的原理


对图像中出现的人脸实现AI换脸的基本原理大致如下:

(1)、人脸侦测和识别。首先要让机器通过含有faceA的图片定位并识别到其中的人脸特征值,通过深度学习算法将faceA还原到正面、平行均匀光照、标准亮度的场景下。接下来对含faceB的图片也进行相同操作,将faceB也还原到正面、平行均匀光照、标准亮度的场景下。
(2)、确定变换矩阵:接下来我们对 含有faceA 图片的人脸信息进行定位与侦测,并进行特征提取(简称featureA),然后用featureA与faceA对比,找出faceA转换到featureA的所需扭曲、光照等变换的矩阵(transferA)。 
(3)、人脸替换:对faceB进行基于transferA的变换,也就是把faceB还原到原图片的拍摄角度及光源场景下,形成新的人脸信息featureB,使用featureB对featureA进行替换。

由于视频是由一帧一帧的图片构成,因此,对视频中出现的人脸实现AI换脸的基本原理与图像中AI换脸的基本原理基本一样。只需对于视频中的每一祯图片重复以上(1)、(2)、(3)次操作直至结束即可。


用Python实现AI换脸

人工智能应用展示之图像识别(三): | 换脸

用Python实现AI换脸有两种方法,一个是通过调用 深度学习框架(例如tensorflow或pytorch)中的算法来自己开发;另一个就是通过调用第三方的AI服务云平台(例如百度云、Face++等)实现快速开发。这里我们以第二种方法为例,来给大家简单介绍一下。
我们这里有两张图片分别为图片1与图片2,其中图片1为一个男人,图片2为一个女人。

人工智能应用展示之图像识别(三): | 换脸

图片1
 

人工智能应用展示之图像识别(三): | 换脸

图片2

接下来,我们想通过 调用第三方的AI云服务平台来实现两幅图中人脸的互换。这次我们调用的是face++(旷视)的AI开放平台。

人工智能应用展示之图像识别(三): | 换脸

旷视云平台


要调用该平台,我们首先要进行注册,注册后,在调用其API之前,首先需要先创建API key.


人工智能应用展示之图像识别(三): | 换脸

创建API key

接下来,您只需要参考一下开发者文档,查看python的调用方法,然后再辅以刚刚创建的API Key 即可实现对其API 的调用。

人工智能应用展示之图像识别(三): | 换脸

开发者文档


篇幅所限,这里大致说一下调用与实现“换脸”的大致过程。利用以上所提到的换脸原理,换之前,我们首先要先检测出两幅照片中出现的人脸。关键代码如下。其中的“data”变量是一个字典,其中的数据主要包含的是被检测的图片与刚刚申请到的API key。而变量“rectangle”则存储的是返回后检测到的人脸照片数据。需要注意的是,由于是两幅图片,所以我们需要检测两次。

response = requests.post(http_url, data=data, files=files)
req_con = response.content.decode('utf-8')
req_dict = json.JSONDecoder().decode(req_con)
this_json = simplejson.dumps(req_dict)
this_json2 = simplejson.loads(this_json)
print(this_json2)
faces = this_json2['faces']
list0 = faces[0]
rectangle = list0['face_rectangle']


接下来,将检测到的两幅人脸照片“ rectangle1”与“ rectangle2”,代入到编写好的合成函数“merge”中,通过调用API函数,实现对人脸的合成与替换。

def merge_face(image_url_1, image_url_2, image_url, number):
    ff1 = find_face(image_url_1)
    ff2 = find_face(image_url_2)
    rectangle1 = str(str(ff1['top']) + "," + str(ff1['left']) + "," + str(ff1['width']) + "," + str(ff1['height']))
    rectangle2 = str(ff2['top']) + "," + str(ff2['left']) + "," + str(ff2['width']) + "," + str(ff2['height'])
    url_add = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface"
    f1 = open(image_url_1, 'rb')
    f1_64 = base64.b64encode(f1.read())
    f1.close()
    f2 = open(image_url_2, 'rb')
    f2_64 = base64.b64encode(f2.read())
    f2.close()
    data = {"api_key"'lmetDHQhoMOgmRVoq9prCuh'"api_secret"'ntYNNskOl_U7VwhCXLUaj',
            "template_base64": f1_64, "template_rectangle": rectangle1,
            "merge_base64": f2_64, "merge_rectangle": rectangle2, "merge_rate": number}
    response = requests.post(url_add, data=data)
    req_con = response.content.decode('utf-8')
    req_dict = json.JSONDecoder().decode(req_con)
    result = req_dict['result']
    imgdata = base64.b64decode(result)
    file = open(image_url, 'wb')
    file.write(imgdata)
    file.close()


最终调用以上“merge”函数,实现“换脸”效果如下。

人工智能应用展示之图像识别(三): | 换脸


人工智能应用展示之图像识别(三): | 换脸


当然,这里只是对图片中人脸的互换,您也可以通过利用OpenCV,一帧一帧的互换视频中的图像,实现对视频中人脸的互换。怎么样,您也来试一试吧!

索取程序代码,畅谈合作与Python技术交流咨询“在线课程”,请扫描以下二维码


人工智能应用展示之图像识别(三): | 换脸


最后打个广告。 我们 "Python青少年编程班" 计划五一假期结束以后新开一期在线课程,从零基础讲起,基础部分预计40次课授完,课程采用直播授课的方式。费用优惠,若您有意参加,请扫描以上二维码与我们联系。




-end-



人工智能应用展示系列:








Python机器学习系列:









编程班学生作品展示系列:








以上是关于人工智能应用展示之图像识别: | 换脸的主要内容,如果未能解决你的问题,请参考以下文章

web技术分享| 前端秘籍之“易容”术

怎么将本地视频ai换脸

怎么在手机将视频ai换脸

人工智能园 | 图像识别技术介绍

CV之Face Change:基于人工智能实现国内众多一线美女明星换脸(基于Face++输出4*106个特征点定位+融合代码deepfake技术)

CV之Face Change:基于人工智能实现国内众多一线美女明星换脸(基于Face++输出4*106个特征点定位+融合代码deepfake技术)