基于Face++的AI换脸实现(详细)

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

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

前言

基于Face++的AI换脸实现(详细)_第1张图片

关于AI换脸

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

基于Face++的AI换脸实现(详细)_第2张图片

常见的换脸API供应者

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

获取换脸API

基于Face++的AI换脸实现(详细)_第4张图片
face++(点击即可进入)
首先需要进入face++官网,完成注册后,可在账户信息中申请创建得到API key,API secret。

基于Face++的AI换脸实现(详细)_第5张图片
基于Face++的AI换脸实现(详细)_第6张图片

代码实现

导入相应库与API链接

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

基于Face++的AI换脸实现(详细)_第7张图片
导入所获取的API的key与secret

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

基于Face++的AI换脸实现(详细)_第8张图片

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


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

基于Face++的AI换脸实现(详细)_第9张图片

定义一个换脸函数

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

换脸成功!照片就不放出来了。。

写在最后

如果你觉得文章对你有帮助,求一个小小的赞
作为一个初来乍到的新人博主
求关注~(悄咪咪)

注:本篇文章仅供学习,请勿用于商业活动或侵权行为。

你可能感兴趣的:(Python,AI,机器学习,python)