所谓人脸融合就是将两张人脸的特征进行融合生成同一张人脸。对于不会人脸识别的我们来说,可能会比较困难。重复造轮子显然也不是程序员的风格。
网上就有很多类似的API供我们直接使用,不管是人脸融合或者人脸检测、人脸对比等等都可以找到免费的API。
今天演示的例子,用到了百度的AI开放平台。如果要使用平台的API,需要先创建一个自己的应用,然后拿到系统生成的ApI Key和 Secret Key。
进入百度的AI开放平台(http://ai.baidu.com/) 按照下图提示进入人脸融合,

在应用列表中进行创建应用,创建成功之后系统会为我们提供Api Key、Secret Key等参数

这就用到了我们创建应用提供的api key与secret key这俩参数。
通过get请求 https://aip.baidubce.com/oauth/2.0/token。
获取到token,为下一步提供参数
def get_token(self):
url = 'https://aip.baidubce.com/oauth/2.0/token'
params = {
'grant_type': 'client_credentials',
'client_id': self.app_id,
'client_secret': self.secret_key
}
response = requests.get(url, params=params)
resp_json = response.json()
self.access_token = resp_json['access_token']
获取到access_token 就可以开始我们的融合工作了。
通过POST请求访问
https://aip.baidubce.com/rest/2.0/face/v1/merge?access_token=你的token。然后在body体中传入图片地址或者base64信息即可,最终融合的图片也是以base64格式进行返回。
def merge(self, face1, face2):
url = f'https://aip.baidubce.com/rest/2.0/face/v1/merge?access_token={self.access_token}'
data = {
'image_template': {
'image': base64_tool(face1),
'image_type': 'BASE64'
},
'image_target': {
'image': base64_tool(face2),
'image_type': "BASE64"
}
}
response = requests.post(url, data=json.dumps(data))
resp_json = response.json()
完整代码如下:
import requests, base64, json
class MergeFace:
def __init__(self, app_id, secret_key):
self.app_id = app_id
self.secret_key = secret_key
self.access_token = ''
def get_token(self):
url = 'https://aip.baidubce.com/oauth/2.0/token'
params = {
'grant_type': 'client_credentials',
'client_id': self.app_id,
'client_secret': self.secret_key
}
response = requests.get(url, params=params)
resp_json = response.json()
self.access_token = resp_json['access_token']
def merge(self, face1, face2):
url = f'https://aip.baidubce.com/rest/2.0/face/v1/merge?access_token={self.access_token}'
data = {
# 目标图
'image_template': {
'image': base64_tool(face1),
'image_type': 'BASE64'
},
'image_target': {
'image': base64_tool(face2),
'image_type': "BASE64"
}
}
response = requests.post(url, data=json.dumps(data))
resp_json = response.json()
if resp_json['error_code'] == 0:
merge_image = resp_json['result']['merge_image']
img_data = base64.b64decode(merge_image)
with open('face_merge.jpg', 'wb') as fp:
fp.write(img_data)
else:
print(resp_json['error_msg'])
def base64_tool(image):
with open(image, 'rb') as f:
b = base64.b64encode(f.read())
return b.decode()
if __name__ == '__main__':
face = MergeFace(app_id='mmNGOyk0MzP3eh8。。。', secret_key='2Qv。。。3WqRA54b')
try:
face.get_token()
except Exception as e:
print('获取access_token异常...', e)
face.merge(face1='face1.jpg', face2='face2.jpg')
最终融合效果图如下:
有没有感觉很喜感,哈哈哈
以上,便是今天的分享,希望大家喜欢,觉得内容不错的,欢迎点击「在看」支持,谢谢各位。

感谢您的阅读