如何实现图片AI换脸(详细)
- 前言
- 关于AI换脸
- 常见的换脸API供应者
- 获取换脸API
- 代码实现
- 导入相应库与API链接
- 定义一个获取图片的人脸特征参数的函数
- 定义一个换脸函数
- 换脸实现--完整代码
- 结果展示
前言
关于AI换脸
关于AI(即Artificial Intelligence)如何实现人脸切换,改变五官。背后有其自身的特殊算法,将人脸的信息特征通过机器语言来传达至计算机。通过机器学习(machine learning)让计算机懂得识别人脸对应的分点,然后再在其他人脸上展现出来,达到换脸的目的。
常见的换脸API供应者
已经开发研究过AI的公司,有提供相应我们所需的api接口业务服务,我们可以借助这些公司提供的API进行人脸转换操作。此类有如:deepfake、face++等(这里以face++作为例子)
获取换脸API
face++(点击即可进入) 首先需要进入face++官网,完成注册后,可在账户信息中申请创建得到API key,API secret。
代码实现
导入相应库与API链接
import requests
import base64
import warnings; warnings.simplefilter('ignore')
导入所获取的API的key与secret
API_Key = '' # JustForFun的API Key
API_Secret = '' # JustForFun的API Secret
定义一个获取图片的人脸特征参数的函数
def find_face(imgpath):
url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
data = {'api_key': API_Key, 'api_secret': API_Secret, 'image_url': imgpath, 'return_landmark': 1}
files = {'image_file': open(imgpath, 'rb')}
response = requests.post(url, data=data, files=files)
res_json = response.json() # 转换为json
faces = res_json['faces'][0]['face_rectangle'] # 获取面部大小的四个值,分别为长宽高低
return faces # 返回图片的面部参数
定义一个换脸函数
# 定义一个换脸函数,函数中number表示两张脸的相似度为99%
def change_face(image_1, image_2, number=99):
url = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface"
find_p1 = find_face(image_1)
find_p2 = find_face(image_2)
rectangle1 = str(str(find_p1['top']) + ',' + str(find_p1['left']) + ',' + str(find_p1['width']) + ',' + str(find_p1['height']))
rectangle2 = str(str(find_p2['top']) + ',' + str(find_p2['left']) + ',' + str(find_p2['width']) + ',' + str(find_p2['height']))
page1 = open(image_1, 'rb')
page1_64 = base64.b64encode(page1.read())
page1.close()
page2 = open(image_2, 'rb')
page2_64 = base64.b64encode(page2.read())
page2.close()
data = {'api_key': API_Key, 'api_secret': API_Secret, 'template_base64': page1_64,
'template_rectangle': rectangle1, 'merge_base64': page2_64, 'merge_rectangele': rectangle2,
'merge_rate': number}
response = requests.post(url, data=data).json()
results = response['result']
image = base64.b64decode(results)
with open('所得到的图片.jpg', 'wb') as file: # 将信息写入到图片
file.write(image)
print("转换完成")
最后将需要换脸的图片导入,运行
if __name__ == '__main__':
change_face('D:地址\\所交换的图片1.jpg',
'D:地址\\所交换的图片2.jpg')
换脸实现–完整代码
import requests
import base64
import warnings; warnings.simplefilter('ignore')
API_Key = '' # JustForFun的API Key
API_Secret = '' # JustForFun的API Secret
def find_face(imgpath):
url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
data = {'api_key': API_Key, 'api_secret': API_Secret, 'image_url': imgpath, 'return_landmark': 1}
files = {'image_file': open(imgpath, 'rb')}
response = requests.post(url, data=data, files=files)
res_json = response.json() # 转换为json
faces = res_json['faces'][0]['face_rectangle'] # 获取面部大小的四个值,分别为长宽高低
return faces # 返回图片的面部参数
def change_face(image_1, image_2, number=99):
url = "https://api-cn.faceplusplus.com/imagepp/v1/mergeface" #
find_p1 = find_face(image_1)
find_p2 = find_face(image_2)
rectangle1 = str(str(find_p1['top']) + ',' + str(find_p1['left']) + ',' + str(find_p1['width']) + ',' + str(find_p1['height']))
rectangle2 = str(str(find_p2['top']) + ',' + str(find_p2['left']) + ',' + str(find_p2['width']) + ',' + str(find_p2['height']))
page1 = open(image_1, 'rb')
page1_64 = base64.b64encode(page1.read())
page1.close()
page2 = open(image_2, 'rb')
page2_64 = base64.b64encode(page2.read())
page2.close()
data = {'api_key': API_Key, 'api_secret': API_Secret, 'template_base64': page1_64,
'template_rectangle': rectangle1, 'merge_base64': page2_64, 'merge_rectangele': rectangle2,
'merge_rate': number}
response = requests.post(url, data=data).json()
results = response['result']
image = base64.b64decode(results)
with open('所得到的图片.jpg', 'wb') as f: # 将信息写入到图片
f.write(image)
print("转换完成")
if __name__ == '__main__':
change_face('D:路径\\所交换的图片1.jpg',
'D:路径\\所交换的图片2.jpg')
结果展示
P1
P2
P3
换脸成功!