如何实现图片AI换脸(详细)

  • 前言
  • 关于AI换脸
  • 常见的换脸API供应者
  • 获取换脸API
  • 代码实现
  • 导入相应库与API链接
  • 定义一个获取图片的人脸特征参数的函数
  • 定义一个换脸函数
  • 换脸实现--完整代码
  • 结果展示


前言

java AI变脸 ai人工智能变脸_API

关于AI换脸

关于AI(即Artificial Intelligence)如何实现人脸切换,改变五官。背后有其自身的特殊算法,将人脸的信息特征通过机器语言来传达至计算机。通过机器学习(machine learning)让计算机懂得识别人脸对应的分点,然后再在其他人脸上展现出来,达到换脸的目的。

java AI变脸 ai人工智能变脸_json_02

常见的换脸API供应者

java AI变脸 ai人工智能变脸_API_03


已经开发研究过AI的公司,有提供相应我们所需的api接口业务服务,我们可以借助这些公司提供的API进行人脸转换操作。此类有如:deepfake、face++等(这里以face++作为例子)

获取换脸API

java AI变脸 ai人工智能变脸_json_04


face++(点击即可进入) 首先需要进入face++官网,完成注册后,可在账户信息中申请创建得到API key,API secret。

java AI变脸 ai人工智能变脸_json_05


java AI变脸 ai人工智能变脸_API_06

代码实现

导入相应库与API链接

import requests
import base64
import warnings; warnings.simplefilter('ignore')

java AI变脸 ai人工智能变脸_json_05


导入所获取的API的key与secret

API_Key = ''    # JustForFun的API Key
API_Secret = ''   # JustForFun的API Secret

java AI变脸 ai人工智能变脸_API_08

定义一个获取图片的人脸特征参数的函数

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    # 返回图片的面部参数

java AI变脸 ai人工智能变脸_API_09

定义一个换脸函数

# 定义一个换脸函数,函数中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

java AI变脸 ai人工智能变脸_API_10


P2

java AI变脸 ai人工智能变脸_java AI变脸_11


P3

java AI变脸 ai人工智能变脸_java AI变脸_12


java AI变脸 ai人工智能变脸_API_13

换脸成功!