本文主要介绍人脸融合API的调用使用攻略。这里只是调用测试,有的融合结果可能比较恐怖,希望不要拍砖。
一.平台接入
此步骤比较简单,不多阐述。可参照之前文档:
https://ai.baidu.com/forum/topic/show/943028
二.分析接口文档
1.接口API
https://ai.baidu.com/docs#/Face-Merge/6720b55c
(1)接口描述
图像融合:将检测到的两张人脸图片进行融合,输出一张融合后的人脸。
(2)请求说明
需要用到的信息有:
请求URL:https://aip.baidubce.com/rest/2.0/face/v1/merge
Header格式:Content-Type:application/json
图片要求:
模板图(template_image),要求被融合的人脸边缘需要与图片边缘保持一定距离,保证被融合的人脸的的核心区域完全在图片中。
目标图无严格限制, 建议选择正脸、清晰的图像。
(3)返回示例
返回渲染图片的Base64编码,需要进行解码还原成图片。
{
"error_code": 0,
"error_msg": "SUCCESS",
"log_id": 1234567890123,
"timestamp": 1533094576,
"cached": 0,
"result":
{ "merge_image": "iVBORw0KGgoAAAANSUhEUgAAAeoAAAHqCAYAAADLb..."
}
}
2.获取access_token
#client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id =【百度云应用的AK】
client_secret =【百度云应用的SK】
#获取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content.decode("utf-8"))
token_key = token_info['access_token']
return token_key
三.识别结果
模板图:
目标图:
融合图:
处理结果方面:可以看出,融合效果还是不错。
处理速度方面:处理时间1.64 s,可以接受。
四.源码共享
# -*- coding: utf-8 -*-
#!/usr/bin/env python
import urllib
import urllib.parse
import urllib.request
import json
import io
from PIL import Image
import base64
#client_id 为官网获取的AK, client_secret 为官网获取的SK
client_id = '*************************'
client_secret = '****************************'
#获取token
def get_token():
host = 'https://aip.baidubce.com/oauth/2.0/token?grant_type=client_credentials&client_id=' + client_id + '&client_secret=' + client_secret
request = urllib.request.Request(host)
request.add_header('Content-Type', 'application/json; charset=UTF-8')
response = urllib.request.urlopen(request)
token_content = response.read()
if token_content:
token_info = json.loads(token_content.decode("utf-8"))
token_key = token_info['access_token']
return token_key
#获取人脸融合结果
def face_detect_url(image_template_url,image_target_url):
request_url = "https://aip.baidubce.com/rest/2.0/face/v1/merge"
params = dict()
params['image_template'] = {"image": image_template_url,'image_type':'URL'}
params['image_target'] = {"image": image_target_url,'image_type':'URL'}
params['merge_degree']= 'HIGH'
params = json.dumps(params).encode('utf-8')
access_token=get_token()
request_url = request_url + "?access_token=" + access_token
request = urllib.request.Request(url=request_url, data=params)
request.add_header('Content-Type', 'application/json')
response = urllib.request.urlopen(request)
content = response.read()
if content:
receipts = json.loads(content.decode("utf-8"))
result = receipts['result']
img_b64encode = result['merge_image']
# print(img_b64encode)
img_b64decode = base64.b64decode(img_b64encode) # base64解码
image = io.BytesIO(img_b64decode)
img = Image.open(image)
img.show()
file=open('2.jpg','wb')
file.write(img_b64decode)
file.close()
print ('Success!')
return content
else:
return ''
mage_template_url='http://dingyue.nosdn.127.net/JaftnDIuIbHgg97vQ8fDvHRWoWYgV8h=LFgrZXxW25oSy1541668286416compressflag.jpeg'
image_target_url='http://tx.haiqq.com/uploads/allimg/170503/0S3051605-0.jpg'
face_detect_url(image_template_url,image_target_url)
五.意见建议
目前对正面照片融合效果较好,如果模板照片和目标照片人物角度不一致,如有一方为侧脸,则融合效果不好,建议做相应完善处理。