Python实现AI变脸

目录

业务需求

需求分析

代码设计

结果展示

思考总结

参考文献


业务需求

        大时代换脸技术已经应用很多年了,很多已经在手机上面实现换脸技术了。我们Python也不能落后这个技术案例。利用python的技术,将两张照片合成一张照片,将脸部的轮廓,眼睛,鼻子进行更换。

需求分析

        利用开源的网站提供的接口文档(这里参考Face⁺⁺开源地址进行注册,在个人应用的界面领取key,secret进行接口使用),调用图像识别功能,使用face接口参数,将照片进行识别。将图片的相框的像素全部识别出来,将数据调用到另外一个接口内进行合并。合并的接口继续有开源的公司提供,将开源公司的接口发挥最大化,利用request方法进行请求,将数据进行base64位进行加密解密。用Json数据进行数据的转化,在调用开源公司的接口进行合并处理。

代码设计

import json
import base64
import requests

# 算法
# 构建模型
# 训练模型  ---> 需要数据集

# 找到人脸数据
def find_face(imgpath):
    http_url = 'https://api-cn.faceplusplus.com/facepp/v3/detect'
    #参数
    data = {
        'api_key': 'HLczng31fOqL9d4CGSHR92q1erJpclEp',
        'api_secret': '_BPe6cvoxUUgJPdMcWst47nA_S-NI2Tq',
        'img_url':imgpath,
        'return_landmark':1
    }
    #文件以rb表示二进制的读取
    files = {'image_file':open(imgpath,'rb')}
    # 携带数据的请求我们通常使用post请求
    resp = requests.post(http_url,data=data,files=files)
    #req_con是个json格式的数据
    req_con = resp.text
    #类型转换
    this_dict = json.loads(req_con)
    faces = this_dict['faces']
    list0 = faces[0]
    #得到人脸框的数据
    rectangle = list0['face_rectangle']
    print("获得人脸数据:",rectangle)
    return rectangle
# 拟合,拼接人脸
def merge_face(img_url1,img_url2,img_url3,number):
    """
    :param img_url1: 第一张图像
    :param img_url2: 第二张图像
    :param img_url3: 合并后的效果图
    :param number:相似度
    :return:
    """
    #调用第一个函数,分别获取第一张图片和第二张图片的人脸数据
    ff1 = find_face(img_url1)
    ff2 = find_face(img_url2)
    #因为参数需要是字符串类型,而ff1和ff2都是字典,我们需要格式转换
    rectangle1 = str( str(ff1['top'])+","+str(ff1['left'])+","+str(ff1['width'])+","+str(ff1['height']) )
    rectangle2 = str( str(ff2['top'])+","+str(ff2['left'])+","+str(ff2['width'])+","+str(ff2['height']) )
    print("打印第一张图片的数据",rectangle1)
    print("打印第二张照片的数据",rectangle2)
    f1 = open(img_url1,'rb')
    f1_64 = base64.b64encode(f1.read()) #编码
    f1.close()
    f2 = open(img_url2, 'rb')
    f2_64 = base64.b64encode(f2.read())  # 编码
    f2.close()

    #合并,我们需要使用另一个接口
    url_add = 'https://api-cn.faceplusplus.com/imagepp/v1/mergeface'
    #调用参数
    data = {
        'api_key': 'HLczng31fOqL9d4CGSHR92q1erJpclEp',
        'api_secret': '_BPe6cvoxUUgJPdMcWst47nA_S-NI2Tq',
        'template_base64':f1_64,'template_rectangle':rectangle1,
        'merge_base64':f2_64,'merge_rectangle':rectangle2,
        'merge_rate':number
    }
    resp = requests.post(url_add,data=data)
    req_con = resp.text
    # 把json转化为字典,作用和上面那个一样,殊途同归
    req_dict = json.JSONDecoder().decode(req_con)
    # 类型转化
    result = req_dict['result']
    imgdata = base64.b64decode(result)
    # 用wb写入这张图像
    file = open(img_url3,'wb')
    file.write(imgdata)
    file.close()

if __name__=="__main__":
    img1 = r"E:\test\3.jpg"
    img2 = r"E:\test\4.jpg"
    img3 = r"E:\test\result.jpg"
    merge_face(img1,img2,img3,30)

结果展示

3.jgp图片

Python实现AI变脸_第1张图片

4.jpg图片

 Python实现AI变脸_第2张图片

合成效果图片result.jpg

Python实现AI变脸_第3张图片

思考总结

        合成照片,先将两个照片预处理,保持眼睛和鼻子、轮廓一致。调用现成用好的接口,直接配合参数使用。可以简单进行AI换脸,但是遇到模糊,或者照片不清楚情况,不能进行AI的合成。下次研究一下动态换脸技术,将摄像头拍成视频换成动态。谢谢支持。

 参考文献

python实现AI换脸_发光吖的博客-CSDN博客_python ai换脸

你可能感兴趣的:(人工智能,python,python开发,python,人工智能,开发语言)