目录
业务需求
需求分析
代码设计
结果展示
思考总结
参考文献
业务需求
大时代换脸技术已经应用很多年了,很多已经在手机上面实现换脸技术了。我们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:test3.jpg"
img2 = r"E:test4.jpg"
img3 = r"E:testresult.jpg"
merge_face(img1,img2,img3,30)
结果展示
3.jgp图片
4.jpg图片
合成效果图片result.jpg
思考总结
合成照片,先将两个照片预处理,保持眼睛和鼻子、轮廓一致。调用现成用好的接口,直接配合参数使用。可以简单进行AI换脸,但是遇到模糊,或者照片不清楚情况,不能进行AI的合成。下次研究一下动态换脸技术,将摄像头拍成视频换成动态。谢谢支持。
参考文献
python实现AI换脸_发光吖的博客-CSDN博客_python ai换脸
最后
以上就是乐观皮卡丘最近收集整理的关于Python实现AI变脸的全部内容,更多相关Python实现AI变脸内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复